diff --git a/AUTHORS b/AUTHORS
index cd136fe06c..9fda76daee 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -100,11 +100,14 @@ answer newbie questions, and generally made Django that much better:
Marc Fargas By %s:
\n"
-"\n"
-msgstr ""
-"
%s:
\n"
-"\n"
-
-#: contrib/admin/filterspecs.py:70
-#: contrib/admin/filterspecs.py:88
-#: contrib/admin/filterspecs.py:143
-#: contrib/admin/filterspecs.py:169
-msgid "All"
-msgstr "Vše"
-
-#: contrib/admin/filterspecs.py:109
-msgid "Any date"
-msgstr "Libovolné datum"
-
-#: contrib/admin/filterspecs.py:110
-msgid "Today"
-msgstr "Dnes"
-
-#: contrib/admin/filterspecs.py:113
-msgid "Past 7 days"
-msgstr "Posledních 7 dní"
-
-#: contrib/admin/filterspecs.py:115
-msgid "This month"
-msgstr "Tento měsíc"
-
-#: contrib/admin/filterspecs.py:117
-msgid "This year"
-msgstr "Tento rok"
-
-#: contrib/admin/filterspecs.py:143
-msgid "Yes"
-msgstr "Ano"
-
-#: contrib/admin/filterspecs.py:143
-msgid "No"
-msgstr "Ne"
-
-#: contrib/admin/filterspecs.py:150
-msgid "Unknown"
-msgstr "Neznámé"
+msgstr "Formulář komentáře neobsahoval buď \"preview\" nebo \"post\""
#: contrib/admin/models.py:16
msgid "action time"
@@ -420,294 +1220,138 @@ msgstr "log záznam"
msgid "log entries"
msgstr "log záznamy"
-#: contrib/admin/templatetags/admin_list.py:230
-msgid "All dates"
-msgstr "Všechna data"
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"
By %s:
\n"
+"\n"
+msgstr ""
+"
%s:
\n"
+"\n"
-#: contrib/admin/views/decorators.py:10
-#: contrib/auth/forms.py:59
-msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
-msgstr "Prosíme, vložte správné uživatelské jméno a heslo. Poznámka - u obou položek se rozlišuje velikost písmen."
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
+msgid "All"
+msgstr "Vše"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Libovolné datum"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Dnes"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Posledních 7 dní"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Tento měsíc"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Tento rok"
+
+#: contrib/admin/filterspecs.py:143 oldforms/__init__.py:581
+#: newforms/widgets.py:182
+msgid "Yes"
+msgstr "Ano"
+
+#: contrib/admin/filterspecs.py:143 oldforms/__init__.py:581
+#: newforms/widgets.py:182
+msgid "No"
+msgstr "Ne"
+
+#: contrib/admin/filterspecs.py:150 oldforms/__init__.py:581
+#: newforms/widgets.py:182
+msgid "Unknown"
+msgstr "Neznámé"
-#: contrib/admin/views/decorators.py:24
#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:24
msgid "Log in"
msgstr "Přihlášení"
-#: contrib/admin/views/decorators.py:62
-msgid "Please log in again, because your session has expired. Don't worry: Your submission has been saved."
-msgstr "Prosíme, znovu se přihlašte, Vaše sezení vypršelo. Nemusíte se obávat, Vaše podání je uloženo."
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Domů"
-#: contrib/admin/views/decorators.py:69
-msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again."
-msgstr "Vypadá to, že Váš prohlížeč není nastaven, aby akceptoval cookies. Prosíme, zapněte cookies, obnovte tuto stránku a zkuste znovu."
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Chyba serveru"
-#: contrib/admin/views/decorators.py:83
-msgid "Usernames cannot contain the '@' character."
-msgstr "Uživatelská jména nemohou obsahovat znak '@'."
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Chyba serveru (500)"
-#: contrib/admin/views/decorators.py:85
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error (500)"
+msgstr "Chyba 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 ""
+"Nastala chyba. Byla oznámena administrátorovi serveru pomocí e-mailu a měla "
+"by být brzy odstraněna. Děkujeme za trpělivost."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Zobrazit všechny"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Provést"
+
+#: contrib/admin/templates/admin/search_form.html:10
#, python-format
-msgid "Your e-mail address is not your username. Try '%s' instead."
-msgstr "Vaše e-mailová adresa není Vaše uživatelské jméno. Zkuste místo toho '%s'."
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 výsledek"
+msgstr[1] "%(counter)s výsledky"
+msgstr[2] "%(counter)s výsledků"
-#: contrib/admin/views/main.py:223
-msgid "Site administration"
-msgstr "Django správa"
-
-#: contrib/admin/views/main.py:257
-#: contrib/admin/views/auth.py:17
+#: contrib/admin/templates/admin/search_form.html:10
#, python-format
-msgid "The %(name)s \"%(obj)s\" was added successfully."
-msgstr "Záznam %(name)s \"%(obj)s\" byl úspěšně přidán."
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s celkem"
-#: contrib/admin/views/main.py:261
-#: contrib/admin/views/main.py:347
-#: contrib/admin/views/auth.py:22
-msgid "You may edit it again below."
-msgstr "Můžete to opět upravit níže."
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filtr"
-#: contrib/admin/views/main.py:271
-#: contrib/admin/views/main.py:356
-#, python-format
-msgid "You may add another %s below."
-msgstr "Můžete přidat další %s níže."
-
-#: contrib/admin/views/main.py:289
-#, python-format
-msgid "Add %s"
-msgstr "%s: přidat"
-
-#: contrib/admin/views/main.py:335
-#, python-format
-msgid "Added %s."
-msgstr "Záznam %s byl přidán."
-
-#: contrib/admin/views/main.py:335
-#: contrib/admin/views/main.py:337
-#: contrib/admin/views/main.py:339
-msgid "and"
-msgstr "a"
-
-#: contrib/admin/views/main.py:337
-#, python-format
-msgid "Changed %s."
-msgstr "%s: změněno"
-
-#: contrib/admin/views/main.py:339
-#, python-format
-msgid "Deleted %s."
-msgstr "Záznam %s byl smazán."
-
-#: contrib/admin/views/main.py:342
-msgid "No fields changed."
-msgstr "Nebyly změněny žádné pole."
-
-#: contrib/admin/views/main.py:345
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was changed successfully."
-msgstr "%(name)s \"%(obj)s\" byl úspěšně změněn."
-
-#: contrib/admin/views/main.py:353
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
-msgstr "The %(name)s \"%(obj)s\" byl úspěšně přidán. Můžete to opět upravit níže."
-
-#: contrib/admin/views/main.py:391
-#, python-format
-msgid "Change %s"
-msgstr "%s: změnit"
-
-#: contrib/admin/views/main.py:473
-#, python-format
-msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
-msgstr "Jedno nebo více %(fieldname)s z %(name)s: %(obj)s"
-
-#: contrib/admin/views/main.py:478
-#, python-format
-msgid "One or more %(fieldname)s in %(name)s:"
-msgstr "Jedno nebo více %(fieldname)s z %(name)s:"
-
-#: contrib/admin/views/main.py:511
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was deleted successfully."
-msgstr "Záznam %(name)s \"%(obj)s\" byl úspěšně smazán."
-
-#: contrib/admin/views/main.py:514
-msgid "Are you sure?"
-msgstr "Jste si jist(á)?"
-
-#: contrib/admin/views/main.py:536
-#, python-format
-msgid "Change history: %s"
-msgstr "Historie změn: %s"
-
-#: contrib/admin/views/main.py:570
-#, python-format
-msgid "Select %s"
-msgstr "Vybrat %s"
-
-#: contrib/admin/views/main.py:570
-#, python-format
-msgid "Select %s to change"
-msgstr "Vyberte %s pro změnu"
-
-#: contrib/admin/views/main.py:758
-msgid "Database error"
-msgstr "Databázová chyba"
-
-#: contrib/admin/views/doc.py:46
-#: contrib/admin/views/doc.py:48
-#: contrib/admin/views/doc.py:50
-msgid "tag:"
-msgstr "tag:"
-
-#: contrib/admin/views/doc.py:77
-#: contrib/admin/views/doc.py:79
-#: contrib/admin/views/doc.py:81
-msgid "filter:"
-msgstr "filtr:"
-
-#: contrib/admin/views/doc.py:135
-#: contrib/admin/views/doc.py:137
-#: contrib/admin/views/doc.py:139
-msgid "view:"
-msgstr "pohled (view):"
-
-#: contrib/admin/views/doc.py:164
-#, python-format
-msgid "App %r not found"
-msgstr "Aplikace %r nenalezena"
-
-#: contrib/admin/views/doc.py:171
-#, python-format
-msgid "Model %r not found in app %r"
-msgstr "Model %r v aplikaci %r nenalezen"
-
-#: contrib/admin/views/doc.py:183
-#, python-format
-msgid "the related `%s.%s` object"
-msgstr "související objekt `%s.%s`"
-
-#: contrib/admin/views/doc.py:183
-#: contrib/admin/views/doc.py:205
-#: contrib/admin/views/doc.py:219
-#: contrib/admin/views/doc.py:224
-msgid "model:"
-msgstr "model:"
-
-#: contrib/admin/views/doc.py:214
-#, python-format
-msgid "related `%s.%s` objects"
-msgstr "související objekty `%s.%s`"
-
-#: contrib/admin/views/doc.py:219
-#, python-format
-msgid "all %s"
-msgstr "%s: vše"
-
-#: contrib/admin/views/doc.py:224
-#, python-format
-msgid "number of %s"
-msgstr "%s: počet"
-
-#: contrib/admin/views/doc.py:229
-#, python-format
-msgid "Fields on %s objects"
-msgstr "Pole na objektech %s"
-
-#: contrib/admin/views/doc.py:291
-#: contrib/admin/views/doc.py:301
-#: contrib/admin/views/doc.py:303
-#: contrib/admin/views/doc.py:309
-#: contrib/admin/views/doc.py:310
-#: contrib/admin/views/doc.py:312
-msgid "Integer"
-msgstr "Celé číslo"
-
-#: contrib/admin/views/doc.py:292
-msgid "Boolean (Either True or False)"
-msgstr "Boolean (buď Ano (True), nebo Ne (False))"
-
-#: contrib/admin/views/doc.py:293
-#: contrib/admin/views/doc.py:311
-#, python-format
-msgid "String (up to %(maxlength)s)"
-msgstr "Text (maximálně %(maxlength)s znaků)"
-
-#: contrib/admin/views/doc.py:294
-msgid "Comma-separated integers"
-msgstr "Celá čísla oddělená čárkou"
-
-#: contrib/admin/views/doc.py:295
-msgid "Date (without time)"
-msgstr "Datum (bez času)"
-
-#: contrib/admin/views/doc.py:296
-msgid "Date (with time)"
-msgstr "Datum (s časem)"
-
-#: contrib/admin/views/doc.py:297
-msgid "E-mail address"
-msgstr "E-mailová adresa"
-
-#: contrib/admin/views/doc.py:298
-#: contrib/admin/views/doc.py:299
-#: contrib/admin/views/doc.py:302
-msgid "File path"
-msgstr "Cesta k souboru"
-
-#: contrib/admin/views/doc.py:300
-msgid "Decimal number"
-msgstr "Desetiné číslo"
-
-#: contrib/admin/views/doc.py:306
-msgid "Boolean (Either True, False or None)"
-msgstr "Boolean (buď Ano (True), Ne (False), nebo Nic (None))"
-
-#: contrib/admin/views/doc.py:307
-msgid "Relation to parent model"
-msgstr "V relaci k rodičovskému modelu"
-
-#: contrib/admin/views/doc.py:308
-msgid "Phone number"
-msgstr "Telefonní číslo"
-
-#: contrib/admin/views/doc.py:313
-msgid "Text"
-msgstr "Text"
-
-#: contrib/admin/views/doc.py:314
-msgid "Time"
-msgstr "Čas"
-
-#: contrib/admin/views/doc.py:315
-#: contrib/flatpages/models.py:7
-msgid "URL"
-msgstr "URL"
-
-#: contrib/admin/views/doc.py:316
-msgid "U.S. state (two uppercase letters)"
-msgstr "Stát US (2 velké znaky)"
-
-#: contrib/admin/views/doc.py:317
-msgid "XML text"
-msgstr "text XML"
-
-#: contrib/admin/views/doc.py:343
-#, python-format
-msgid "%s does not appear to be a urlpattern object"
-msgstr "%s pravděpodobně není objekt urlpattern"
-
-#: contrib/admin/views/auth.py:28
-msgid "Add user"
-msgstr "Přidat uživatele"
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Něco není v pořádku s Vaší instalací databáze. Ujistěte se, že byly "
+"vytvořeny odpovídající tabulky databáze a že databáze je přístupná pro čtení "
+"daným databázovým uživatelem."
#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
@@ -715,43 +1359,30 @@ msgid "Documentation"
msgstr "Dokumentace"
#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
-#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
-#: contrib/admin/templates/admin_doc/missing_docutils.html:4
-#: contrib/admin/templates/admin_doc/view_index.html:5
-#: contrib/admin/templates/admin_doc/model_detail.html:3
-#: contrib/admin/templates/admin_doc/index.html:4
#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
msgid "Change password"
msgstr "Změnit heslo"
#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/500.html:4
-#: contrib/admin/templates/admin/change_list.html:6
-#: contrib/admin/templates/admin/base.html:30
-#: contrib/admin/templates/admin/delete_confirmation.html:6
-#: contrib/admin/templates/admin/change_form.html:13
-#: contrib/admin/templates/admin/invalid_setup.html:4
-#: contrib/admin/templates/registration/password_change_done.html:4
-#: contrib/admin/templates/registration/password_reset_form.html:4
-#: contrib/admin/templates/registration/logged_out.html:4
-#: contrib/admin/templates/registration/password_reset_done.html:4
-#: contrib/admin/templates/registration/password_change_form.html:4
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-msgid "Home"
-msgstr "Domů"
-
-#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/change_form.html:21
msgid "History"
msgstr "Historie"
@@ -772,32 +1403,21 @@ msgid "DATE_WITH_TIME_FULL"
msgstr "j. N Y, H:i"
#: contrib/admin/templates/admin/object_history.html:36
-msgid "This object doesn't have a change history. It probably wasn't added via this admin site."
-msgstr "Tento objekt nemá historii změn. Pravděpodobně nebyl přidán přes administrátorské rozhraní."
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Tento objekt nemá historii změn. Pravděpodobně nebyl přidán přes "
+"administrátorské rozhraní."
-#: contrib/admin/templates/admin/base_site.html:4
-msgid "Django site admin"
-msgstr "Django správa webu"
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Vítejte, uživateli"
-#: contrib/admin/templates/admin/base_site.html:7
-msgid "Django administration"
-msgstr "Django správa"
-
-#: contrib/admin/templates/admin/500.html:4
-msgid "Server error"
-msgstr "Chyba serveru"
-
-#: contrib/admin/templates/admin/500.html:6
-msgid "Server error (500)"
-msgstr "Chyba serveru (500)"
-
-#: contrib/admin/templates/admin/500.html:9
-msgid "Server Error (500)"
-msgstr "Chyba 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 "Nastala chyba. Ta byla oznámena administrátorovi serveru pomocí e-mailu a měla by být brzy odstraněna. Děkujeme za trpělivost."
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s: přidat"
#: contrib/admin/templates/admin/404.html:4
#: contrib/admin/templates/admin/404.html:8
@@ -808,6 +1428,32 @@ msgstr "Stránka nenalezena"
msgid "We're sorry, but the requested page could not be found."
msgstr "Je nám líto, ale vyžádaná stránka nebyla nalezena."
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Dle: %(filter_title)s "
+
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+msgid "Delete"
+msgstr "Smazat"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Uložit jako nový záznam"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Uložit a přidat další záznam"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Uložit a pokračovat v úpravách"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Uložit"
+
#: contrib/admin/templates/admin/index.html:17
#, python-format
msgid "Models available in the %(name)s application."
@@ -843,127 +1489,126 @@ msgstr "Mé akce"
msgid "None available"
msgstr "Nic"
-#: contrib/admin/templates/admin/change_list.html:11
-#, python-format
-msgid "Add %(name)s"
-msgstr "%(name)s: přidat"
-
-#: contrib/admin/templates/admin/login.html:22
-msgid "Have you forgotten your password?"
-msgstr "Zapomněl(a) jste své heslo?"
-
-#: contrib/admin/templates/admin/base.html:25
-msgid "Welcome,"
-msgstr "Vítejte,"
-
-#: contrib/admin/templates/admin/delete_confirmation.html:9
-#: contrib/admin/templates/admin/submit_line.html:3
-msgid "Delete"
-msgstr "Smazat"
-
#: contrib/admin/templates/admin/delete_confirmation.html:14
#, python-format
-msgid "Deleting the %(object_name)s '%(escaped_object)s' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:"
-msgstr "Mazání %(object_name)s '%(escaped_object)s' by vyústilo ve vymazání souvisejících objektů, ale Váš účet nemá oprávnění pro mazání následujících typů objektů:"
+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 ""
+"Smazání záznamu \"%(escaped_object)s\" typu \"%(object_name)s\" by vyústilo "
+"ve vymazání souvisejících objektů, ale Váš účet nemá oprávnění pro mazání "
+"následujících typů objektů:"
#: contrib/admin/templates/admin/delete_confirmation.html:21
#, python-format
-msgid "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? All of the following related items will be deleted:"
-msgstr "Jste si jist(á), že chcete smazat %(object_name)s \"%(escaped_object)s\"? Všechny následující související položky budou smazány:"
+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 ""
+"Jste si jist(á), že chcete smazat záznam \"%(escaped_object)s\" typu \"%"
+"(object_name)s\"? Všechny následující související položky budou smazány:"
#: contrib/admin/templates/admin/delete_confirmation.html:26
msgid "Yes, I'm sure"
-msgstr "Ano, jsem si jist"
+msgstr "Ano, jsem si jist(á)"
-#: contrib/admin/templates/admin/filter.html:2
-#, python-format
-msgid " By %(filter_title)s "
-msgstr " Dle %(filter_title)s "
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django správa webu"
-#: contrib/admin/templates/admin/search_form.html:8
-msgid "Go"
-msgstr "Provést"
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django správa"
-#: contrib/admin/templates/admin/search_form.html:10
-#, python-format
-msgid "1 result"
-msgid_plural "%(counter)s results"
-msgstr[0] "1 výsledek"
-msgstr[1] "%(counter)s výsledky"
-msgstr[2] "%(counter)s výsledků"
-
-#: contrib/admin/templates/admin/search_form.html:10
-#, python-format
-msgid "%(full_result_count)s total"
-msgstr "celkem %(full_result_count)s"
-
-#: contrib/admin/templates/admin/pagination.html:10
-msgid "Show all"
-msgstr "Zobrazit všechny"
-
-#: contrib/admin/templates/admin/filters.html:4
-msgid "Filter"
-msgstr "Filtr"
-
-#: contrib/admin/templates/admin/change_form.html:21
+#: contrib/admin/templates/admin/change_form.html:22
msgid "View on site"
msgstr "Pohled na stránku"
-#: contrib/admin/templates/admin/change_form.html:30
+#: contrib/admin/templates/admin/change_form.html:32
+#: contrib/admin/templates/admin/auth/user/change_password.html:24
msgid "Please correct the error below."
msgid_plural "Please correct the errors below."
msgstr[0] "Prosíme, odstraňte chybu uvedenou níže."
msgstr[1] "Prosíme, odstraňte chyby uvedené níže."
msgstr[2] "Prosíme, odstraňte chyby uvedené níže."
-#: contrib/admin/templates/admin/change_form.html:48
+#: contrib/admin/templates/admin/change_form.html:50
msgid "Ordering"
-msgstr "Objednávání"
+msgstr "Seřazeno"
-#: contrib/admin/templates/admin/change_form.html:51
+#: contrib/admin/templates/admin/change_form.html:53
msgid "Order:"
-msgstr "Objednávka:"
-
-#: contrib/admin/templates/admin/submit_line.html:4
-msgid "Save as new"
-msgstr "Uložit jako nové"
-
-#: contrib/admin/templates/admin/submit_line.html:5
-msgid "Save and add another"
-msgstr "Uložit a přidat další"
-
-#: contrib/admin/templates/admin/submit_line.html:6
-msgid "Save and continue editing"
-msgstr "Uložit a pokračovat v úpravách"
-
-#: contrib/admin/templates/admin/submit_line.html:7
-msgid "Save"
-msgstr "Uložit"
-
-#: contrib/admin/templates/admin/invalid_setup.html:8
-msgid "Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user."
-msgstr "Něco není v pořádku s Vaší instalací databáze. Ujistěte se, že byly vytvořeny odpovídající tabulky databáze a že databáze je přístupná pro čtení daným databázovým uživatelem."
+msgstr "Pořadí:"
#: 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 "Nejdříve vložte uživatelské jméno a heslo. Poté budete moci upravovat více uživatelských možností."
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Nejdříve vložte uživatelské jméno a heslo. Poté budete moci upravovat více "
+"uživatelských možností."
#: contrib/admin/templates/admin/auth/user/add_form.html:12
msgid "Username"
msgstr "Uživatelské jméno"
#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
msgid "Password"
msgstr "Heslo"
#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
msgid "Password (again)"
-msgstr "Heslo (znova)"
+msgstr "Heslo (znovu)"
#: contrib/admin/templates/admin/auth/user/add_form.html:24
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
msgid "Enter the same password as above, for verification."
msgstr "Pro ověření vložte stejné heslo znovu."
+#: contrib/admin/templates/admin/auth/user/change_password.html:28
+#, python-format
+msgid "Enter a new password for the user %(username)s."
+msgstr "Vložte nové heslo pro uživatele %(username)s."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Obnovení hesla"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Zapomněl(a) jste heslo? Vložte níže Vaši e-mailovou adresu a my Vaše heslo "
+"obnovíme a zašleme Vám e-mailem nové."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mailová adresa:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Obnovit heslo"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Obnovení hesla bylo úspěšné"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Poslali jsme Vám e-mailem nové heslo na adresu, kterou jste zadal(a). Měl(a) "
+"byste ji dostat během okamžiku."
+
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_change_form.html:4
#: contrib/admin/templates/registration/password_change_form.html:6
@@ -980,45 +1625,13 @@ msgstr "Změna hesla byla úspěšná"
msgid "Your password was changed."
msgstr "Vaše heslo bylo změněno."
-#: contrib/admin/templates/registration/password_reset_form.html:4
-#: contrib/admin/templates/registration/password_reset_form.html:6
-#: contrib/admin/templates/registration/password_reset_form.html:10
-#: contrib/admin/templates/registration/password_reset_done.html:4
-msgid "Password reset"
-msgstr "Obnovení hesla"
-
-#: contrib/admin/templates/registration/password_reset_form.html:12
-msgid "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you."
-msgstr "Zapomněl(a) jste heslo? Vložte níže Vaši e-mailovou adresu a my Vaše heslo obnovíme a zašleme Vám e-mailem nové."
-
-#: contrib/admin/templates/registration/password_reset_form.html:16
-msgid "E-mail address:"
-msgstr "E-mailová adresa:"
-
-#: contrib/admin/templates/registration/password_reset_form.html:16
-msgid "Reset my password"
-msgstr "Obnovit mé heslo"
-
-#: contrib/admin/templates/registration/logged_out.html:8
-msgid "Thanks for spending some quality time with the Web site today."
-msgstr "Děkujeme Vám za Váš strávený čas na našich webových stránkách."
-
-#: contrib/admin/templates/registration/logged_out.html:10
-msgid "Log in again"
-msgstr "Přihlašte se znova"
-
-#: contrib/admin/templates/registration/password_reset_done.html:6
-#: contrib/admin/templates/registration/password_reset_done.html:10
-msgid "Password reset successful"
-msgstr "Obnovení hesla bylo úspěšné"
-
-#: contrib/admin/templates/registration/password_reset_done.html:12
-msgid "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly."
-msgstr "Poslali jsme Vám e-mailem nové heslo na adresu, kterou jste zadal(a). Měl(a) byste ji dostat během okamžiku."
-
#: contrib/admin/templates/registration/password_change_form.html:12
-msgid "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly."
-msgstr "Vložte svoje staré heslo a poté vložte dvakrát nové heslo. Tak můžeme ověřit, že jste ho napsal(a) správně."
+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 ""
+"Vložte svoje staré heslo a poté vložte dvakrát nové heslo. Tak můžeme "
+"ověřit, že jste ho napsal(a) správně."
#: contrib/admin/templates/registration/password_change_form.html:17
msgid "Old password:"
@@ -1034,7 +1647,7 @@ msgstr "Potvrdit heslo:"
#: contrib/admin/templates/registration/password_change_form.html:23
msgid "Change my password"
-msgstr "Změnit mé heslo"
+msgstr "Změnit heslo"
#: contrib/admin/templates/registration/password_reset_email.html:2
msgid "You're receiving this e-mail because you requested a password reset"
@@ -1067,6 +1680,30 @@ msgstr "Děkujeme za používání našeho webu!"
msgid "The %(site_name)s team"
msgstr "Tým %(site_name)s"
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Děkujeme Vám za Váš strávený čas na našich webových stránkách."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Přihlašte se znovu"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Momentálně:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Změna:"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Datum:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Čas:"
+
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
msgid "Bookmarklets"
msgstr "Bookmarklety"
@@ -1086,11 +1723,15 @@ msgid ""
"your computer is \"internal\").
Pro nainstalování bookmarkletů, přetáhněte odkaz na Vaše záložky (oblíbené),\n" -"nebo klikněte pravým tlačítkem na odkaz a přidejte ho k Vašim záložkám (oblíbeným). Nyní můžete\n" +"
Pro nainstalování bookmarkletů, přetáhněte odkaz na Vaše " +"záložky (oblíbené),\n" +"nebo klikněte pravým tlačítkem na odkaz a přidejte ho k Vašim záložkám " +"(oblíbeným). Nyní můžete\n" "zvolit bookmarklet z libovolné stránky. Poznámka: Některé tyto\n" -"bookmarklety vyžadují, abyste prohlížel(a) stránky z počítače, který je nastaven jako\n" -"\"interní\" (promluvte si s Vaším administrátorem, jestli si nejste jisti,\n" +"bookmarklety vyžadují, abyste prohlížel(a) stránky z počítače, který je " +"nastaven jako\n" +"\"\"interní\" (promluvte si s Vaším administrátorem, jestli si nejste " +"jisti,\n" "zda je Váš počítač \"interní\").
\n" #: contrib/admin/templates/admin_doc/bookmarklets.html:19 @@ -1098,16 +1739,24 @@ msgid "Documentation for this page" msgstr "Dokumentace pro tuto stránku" #: contrib/admin/templates/admin_doc/bookmarklets.html:20 -msgid "Jumps you from any page to the documentation for the view that generates that page." -msgstr "Z libovolné stránky otevře dokumentaci pro pohled, který vygeneroval tuto stránku." +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Z libovolné stránky otevře dokumentaci pro pohled, který vygeneroval tuto " +"stránku." #: contrib/admin/templates/admin_doc/bookmarklets.html:22 msgid "Show object ID" msgstr "Ukázat id objektu" #: contrib/admin/templates/admin_doc/bookmarklets.html:23 -msgid "Shows the content-type and unique ID for pages that represent a single object." -msgstr "Ukáže content-type a unikátní ID pro stránky, které reprezentují jeden objekt." +msgid "" +"Shows the content-type and unique ID for pages that represent a single " +"object." +msgstr "" +"Ukáže content-type a unikátní ID pro stránky, které reprezentují jeden " +"objekt." #: contrib/admin/templates/admin_doc/bookmarklets.html:25 msgid "Edit this object (current window)" @@ -1125,349 +1774,1168 @@ msgstr "Upravit tento objekt (ve novém okně)" msgid "As above, but opens the admin page in a new window." msgstr "Jako výše, ale otevře admin stránky v novém okně." -#: contrib/admin/templates/widget/date_time.html:3 -msgid "Date:" -msgstr "Datum:" +#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48 +#: contrib/admin/views/doc.py:50 +msgid "tag:" +msgstr "tag:" -#: contrib/admin/templates/widget/date_time.html:4 -msgid "Time:" -msgstr "Čas:" +#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79 +#: contrib/admin/views/doc.py:81 +msgid "filter:" +msgstr "filtr:" -#: contrib/admin/templates/widget/file.html:2 -msgid "Currently:" -msgstr "Momentálně:" +#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137 +#: contrib/admin/views/doc.py:139 +msgid "view:" +msgstr "pohled (view):" -#: contrib/admin/templates/widget/file.html:3 -msgid "Change:" -msgstr "Změna:" +#: contrib/admin/views/doc.py:164 +#, python-format +msgid "App %r not found" +msgstr "Aplikace %r nenalezena" -#: contrib/redirects/models.py:7 -msgid "redirect from" -msgstr "přesměrovat z" +#: contrib/admin/views/doc.py:171 +#, python-format +msgid "Model %(name)r not found in app %(label)r" +msgstr "Model %(name)r v aplikaci %(label)r nenalezen" -#: contrib/redirects/models.py:8 -msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'." -msgstr "Toto by měla být absolutní cesta, bez domény. Např. '/udalosti/hledat/'." +#: contrib/admin/views/doc.py:183 +#, python-format +msgid "the related `%(label)s.%(type)s` object" +msgstr "související objekt `%(label)s.%(type)s`" -#: contrib/redirects/models.py:9 -msgid "redirect to" -msgstr "přesměrovat na" +#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205 +#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224 +msgid "model:" +msgstr "model:" -#: contrib/redirects/models.py:10 -msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'." -msgstr "Toto může být buď absolutní cesta (jako nahoře) nebo plné URL začínající na 'http://'." +#: contrib/admin/views/doc.py:214 +#, python-format +msgid "related `%(label)s.%(name)s` objects" +msgstr "související objekty `%(label)s.%(name)s`" -#: contrib/redirects/models.py:13 -msgid "redirect" -msgstr "přesměrovat" +#: contrib/admin/views/doc.py:219 +#, python-format +msgid "all %s" +msgstr "Vše: %s" -#: contrib/redirects/models.py:14 -msgid "redirects" -msgstr "přesměrování" +#: contrib/admin/views/doc.py:224 +#, python-format +msgid "number of %s" +msgstr "Počet: %s" -#: contrib/flatpages/models.py:8 -msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "Příklad: '/o/kontakt/'. Ujistěte se, že máte počáteční a konečná lomítka." +#: contrib/admin/views/doc.py:229 +#, python-format +msgid "Fields on %s objects" +msgstr "Pole na objektech %s" -#: contrib/flatpages/models.py:9 -msgid "title" -msgstr "titulek" +#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:302 +#: contrib/admin/views/doc.py:304 contrib/admin/views/doc.py:310 +#: contrib/admin/views/doc.py:311 contrib/admin/views/doc.py:313 +msgid "Integer" +msgstr "Celé číslo" -#: contrib/flatpages/models.py:10 -msgid "content" -msgstr "obsah" +#: contrib/admin/views/doc.py:292 +msgid "Boolean (Either True or False)" +msgstr "Boolean (buď Ano (True), nebo Ne (False))" -#: contrib/flatpages/models.py:11 -msgid "enable comments" -msgstr "povolit komentáře" +#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:312 +#, python-format +msgid "String (up to %(maxlength)s)" +msgstr "Text (maximálně %(maxlength)s znaků)" -#: contrib/flatpages/models.py:12 -msgid "template name" -msgstr "jméno šablony" +#: contrib/admin/views/doc.py:294 +msgid "Comma-separated integers" +msgstr "Celá čísla oddělená čárkou" -#: contrib/flatpages/models.py:13 -msgid "Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'." -msgstr "Například: 'flatpages/kontaktni_stranka.html'. Pokud toto není zadáno, systém použije 'flatpages/default.html'." +#: contrib/admin/views/doc.py:295 +msgid "Date (without time)" +msgstr "Datum (bez času)" -#: contrib/flatpages/models.py:14 -msgid "registration required" -msgstr "nutná registrace" +#: contrib/admin/views/doc.py:296 +msgid "Date (with time)" +msgstr "Datum (s časem)" -#: contrib/flatpages/models.py:14 -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "Pokud je zaškrtnuto, pouze přihlášení uživatelé budou moci prohlížet tuto stránku." +#: contrib/admin/views/doc.py:297 +msgid "Decimal number" +msgstr "Desetinné číslo" -#: contrib/flatpages/models.py:18 -msgid "flat page" -msgstr "statická stránka" +#: contrib/admin/views/doc.py:298 +msgid "E-mail address" +msgstr "E-mailová adresa" -#: contrib/flatpages/models.py:19 -msgid "flat pages" -msgstr "statické stránky" +#: contrib/admin/views/doc.py:299 contrib/admin/views/doc.py:300 +#: contrib/admin/views/doc.py:303 +msgid "File path" +msgstr "Cesta k souboru" -#: contrib/auth/views.py:39 -msgid "Logged out" -msgstr "Odhlášeno" +#: contrib/admin/views/doc.py:301 +msgid "Floating point number" +msgstr "Celé číslo" -#: contrib/auth/models.py:38 -#: contrib/auth/models.py:57 -msgid "name" -msgstr "jméno" +#: contrib/admin/views/doc.py:307 +msgid "Boolean (Either True, False or None)" +msgstr "Boolean (buď Ano (True), Ne (False), nebo Nic (None))" -#: contrib/auth/models.py:40 -msgid "codename" -msgstr "codename" +#: contrib/admin/views/doc.py:308 +msgid "Relation to parent model" +msgstr "V relaci k rodičovskému modelu" -#: contrib/auth/models.py:42 -msgid "permission" -msgstr "oprávnění" +#: contrib/admin/views/doc.py:309 +msgid "Phone number" +msgstr "Telefonní číslo" -#: contrib/auth/models.py:43 -#: contrib/auth/models.py:58 -msgid "permissions" -msgstr "oprávnění" +#: contrib/admin/views/doc.py:314 +msgid "Text" +msgstr "Text" -#: contrib/auth/models.py:60 -msgid "group" -msgstr "skupina" +#: contrib/admin/views/doc.py:315 +msgid "Time" +msgstr "Čas" -#: contrib/auth/models.py:61 -#: contrib/auth/models.py:100 -msgid "groups" -msgstr "skupiny" +#: contrib/admin/views/doc.py:317 +msgid "U.S. state (two uppercase letters)" +msgstr "Stát US (2 velké znaky)" -#: contrib/auth/models.py:90 -msgid "username" -msgstr "uživatelské jméno" +#: contrib/admin/views/doc.py:318 +msgid "XML text" +msgstr "XML text" -#: contrib/auth/models.py:90 -msgid "Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)." -msgstr "Požadováno. 30 znaků nebo méně. Pouze alfanumerické znaky (znaky, čísla a podtržítka)." +#: contrib/admin/views/doc.py:344 +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s pravděpodobně není objekt urlpattern" -#: contrib/auth/models.py:91 -msgid "first name" -msgstr "křestní jméno" +#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257 +#, python-format +msgid "The %(name)s \"%(obj)s\" was added successfully." +msgstr "Záznam \"%(obj)s\" typu \"%(name)s\" byl úspěšně přidán." -#: contrib/auth/models.py:92 -msgid "last name" -msgstr "příjmení" +#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261 +#: contrib/admin/views/main.py:347 +msgid "You may edit it again below." +msgstr "V úpravách můžete pokračovat níže." -#: contrib/auth/models.py:93 -msgid "e-mail address" -msgstr "e-mailová adresa" +#: contrib/admin/views/auth.py:30 +msgid "Add user" +msgstr "Uživatel: přidat" -#: contrib/auth/models.py:94 -msgid "password" -msgstr "heslo" +#: contrib/admin/views/auth.py:57 +msgid "Password changed successfully." +msgstr "Změna hesla byla úspěšná" -#: contrib/auth/models.py:94 -msgid "Use '[algo]$[salt]$[hexdigest]'" -msgstr "Použijte '[algo]$[salt]$[hexdigest]'" +#: contrib/admin/views/auth.py:64 +#, python-format +msgid "Change password: %s" +msgstr "Heslo pro uživatele %s: změnit" -#: contrib/auth/models.py:95 -msgid "staff status" -msgstr "administrativní přístup " +#: contrib/admin/views/main.py:223 +msgid "Site administration" +msgstr "Django správa" -#: contrib/auth/models.py:95 -msgid "Designates whether the user can log into this admin site." -msgstr "Rozhodne, zda se může uživatel přihlásit do správy webu." +#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356 +#, python-format +msgid "You may add another %s below." +msgstr "Další záznam typu \"%s\" můžete přidat níže." -#: contrib/auth/models.py:96 -msgid "active" -msgstr "aktivní" +#: contrib/admin/views/main.py:289 +#, python-format +msgid "Add %s" +msgstr "%s: přidat" -#: contrib/auth/models.py:96 -msgid "Designates whether this user can log into the Django admin. Unselect this instead of deleting accounts." -msgstr "Rozhodne, zda se může uživatel přihlásit do správy webu. Nastavte toto místo mazání účtů." +#: contrib/admin/views/main.py:335 +#, python-format +msgid "Added %s." +msgstr "Záznam %s přidán." -#: contrib/auth/models.py:97 -msgid "superuser status" -msgstr "stav superuživatel" +#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337 +#: contrib/admin/views/main.py:339 db/models/manipulators.py:308 +msgid "and" +msgstr "a" -#: contrib/auth/models.py:97 -msgid "Designates that this user has all permissions without explicitly assigning them." -msgstr "Stanoví, že tento uživatel má veškerá oprávnění bez jejich explicitního přiřazení." +#: contrib/admin/views/main.py:337 +#, python-format +msgid "Changed %s." +msgstr "Záznam %s změněn." -#: contrib/auth/models.py:98 -msgid "last login" -msgstr "poslední přihlášení" +#: contrib/admin/views/main.py:339 +#, python-format +msgid "Deleted %s." +msgstr "Záznam %s smazán." -#: contrib/auth/models.py:99 -msgid "date joined" -msgstr "datum zaregistrování" +#: contrib/admin/views/main.py:342 +msgid "No fields changed." +msgstr "Nebyly změněny žádná pole." -#: contrib/auth/models.py:101 -msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in." -msgstr "Kromě manuálně přidělených oprávnění uživatel dostane všechna oprávnění pro každou skupinu, ve které je." +#: contrib/admin/views/main.py:345 +#, python-format +msgid "The %(name)s \"%(obj)s\" was changed successfully." +msgstr "Záznam \"%(obj)s\" typu \"%(name)s\" byl úspěšně změněn." -#: contrib/auth/models.py:102 -msgid "user permissions" -msgstr "uživatelskí oprávnění" +#: contrib/admin/views/main.py:353 +#, python-format +msgid "" +"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." +msgstr "" +"Záznam \"%(obj)s\" typu \"%(name)s\" byl úspěšně přidán. Níže můžete v " +"úpravách pokračovat." -#: contrib/auth/models.py:105 -msgid "user" -msgstr "uživatel" +#: contrib/admin/views/main.py:391 +#, python-format +msgid "Change %s" +msgstr "%s: změnit" -#: contrib/auth/models.py:106 -msgid "users" -msgstr "uživatelé" +#: contrib/admin/views/main.py:476 +#, python-format +msgid "One or more %(fieldname)s in %(name)s: %(obj)s" +msgstr "" +"Položka \"%(fieldname)s\" pro tento záznam typu \"%(name)s\": \"%(obj)s\"" -#: contrib/auth/models.py:111 -msgid "Personal info" -msgstr "Osobní informace" +#: contrib/admin/views/main.py:481 +#, python-format +msgid "One or more %(fieldname)s in %(name)s:" +msgstr "Položka \"%(fieldname)s\" pro tento záznam typu \"%(name)s\":" -#: contrib/auth/models.py:112 -msgid "Permissions" -msgstr "Oprávnění" +#: contrib/admin/views/main.py:514 +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "Záznam \"%(obj)s\" typu \"%(name)s\" byl úspěšně smazán." -#: contrib/auth/models.py:113 -msgid "Important dates" -msgstr "Důležitá data" +#: contrib/admin/views/main.py:517 +msgid "Are you sure?" +msgstr "Jste si jist(á)?" -#: contrib/auth/models.py:114 -msgid "Groups" -msgstr "Skupiny" +#: contrib/admin/views/main.py:539 +#, python-format +msgid "Change history: %s" +msgstr "Historie změn: %s" -#: contrib/auth/models.py:256 -msgid "message" -msgstr "zpráva" +#: contrib/admin/views/main.py:573 +#, python-format +msgid "Select %s" +msgstr "%s: vybrat" -#: contrib/auth/forms.py:52 -msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in." -msgstr "Váš prohlížeč pravděpodobně nemá zapnuté cookies. Cookies jsou potřeba pro zalogování." +#: contrib/admin/views/main.py:573 +#, python-format +msgid "Select %s to change" +msgstr "%s: vybrat pro změnu" -#: contrib/auth/forms.py:61 -msgid "This account is inactive." -msgstr "Tento účet není aktivní." +#: contrib/admin/views/main.py:768 +msgid "Database error" +msgstr "Databázová chyba" -#: contrib/contenttypes/models.py:20 -msgid "python model class name" -msgstr "jméno modelu Pythonu" +#: contrib/admin/views/decorators.py:62 +msgid "" +"Please log in again, because your session has expired. Don't worry: Your " +"submission has been saved." +msgstr "" +"Prosíme, znovu se přihlašte, Vaše sezení vypršelo. Nemusíte se obávat, Vaše " +"podání je uloženo." -#: contrib/contenttypes/models.py:23 -msgid "content type" -msgstr "typ obsahu" +#: contrib/admin/views/decorators.py:69 +msgid "" +"Looks like your browser isn't configured to accept cookies. Please enable " +"cookies, reload this page, and try again." +msgstr "" +"Vypadá to, že Váš prohlížeč není nastaven, aby akceptoval cookies. Prosíme, " +"zapněte cookies, obnovte tuto stránku a zkuste znovu." -#: contrib/contenttypes/models.py:24 -msgid "content types" -msgstr "typy obsahu" +#: contrib/admin/views/decorators.py:83 +msgid "Usernames cannot contain the '@' character." +msgstr "Uživatelská jména nemohou obsahovat znak \"@\"." -#: contrib/sessions/models.py:51 +#: contrib/admin/views/decorators.py:85 +#, python-format +msgid "Your e-mail address is not your username. Try '%s' instead." +msgstr "" +"Vaše e-mailová adresa není Vaše uživatelské jméno. Zkuste místo toho \"%s\"." + +#: contrib/admin/templatetags/admin_list.py:249 +msgid "All dates" +msgstr "Všechna data" + +#: contrib/sessions/models.py:68 msgid "session key" msgstr "klíč sezení" -#: contrib/sessions/models.py:52 +#: contrib/sessions/models.py:69 msgid "session data" msgstr "data sezení" -#: contrib/sessions/models.py:53 +#: contrib/sessions/models.py:70 msgid "expire date" msgstr "datum expirace" -#: contrib/sessions/models.py:57 +#: contrib/sessions/models.py:74 msgid "session" msgstr "sezení" -#: contrib/sessions/models.py:58 +#: contrib/sessions/models.py:75 msgid "sessions" msgstr "sezení" -#: contrib/sites/models.py:10 -msgid "domain name" -msgstr "jméno domény" +#: conf/global_settings.py:39 +msgid "Arabic" +msgstr "arabsky" -#: contrib/sites/models.py:11 -msgid "display name" -msgstr "zobrazené jméno" +#: conf/global_settings.py:40 +msgid "Bengali" +msgstr "bengálsky" -#: contrib/sites/models.py:15 -msgid "site" -msgstr "web" +#: conf/global_settings.py:41 +msgid "Bulgarian" +msgstr "bulharsky" -#: contrib/sites/models.py:16 -msgid "sites" -msgstr "weby" +#: conf/global_settings.py:42 +msgid "Catalan" +msgstr "katalánsky" + +#: conf/global_settings.py:43 +msgid "Czech" +msgstr "česky" + +#: conf/global_settings.py:44 +msgid "Welsh" +msgstr "welšsky" + +#: conf/global_settings.py:45 +msgid "Danish" +msgstr "dánsky" + +#: conf/global_settings.py:46 +msgid "German" +msgstr "německy" + +#: conf/global_settings.py:47 +msgid "Greek" +msgstr "řecky" + +#: conf/global_settings.py:48 +msgid "English" +msgstr "anglicky" + +#: conf/global_settings.py:49 +msgid "Spanish" +msgstr "španělsky" + +#: conf/global_settings.py:50 +msgid "Argentinean Spanish" +msgstr "argentinskou španělštinou" + +#: conf/global_settings.py:51 +msgid "Finnish" +msgstr "finsky" + +#: conf/global_settings.py:52 +msgid "French" +msgstr "francouzsky" + +#: conf/global_settings.py:53 +msgid "Galician" +msgstr "galicijsky" + +#: conf/global_settings.py:54 +msgid "Hungarian" +msgstr "maďarsky" + +#: conf/global_settings.py:55 +msgid "Hebrew" +msgstr "hebrejsky" + +#: conf/global_settings.py:56 +msgid "Icelandic" +msgstr "islandsky" + +#: conf/global_settings.py:57 +msgid "Italian" +msgstr "italsky" + +#: conf/global_settings.py:58 +msgid "Japanese" +msgstr "japonsky" + +#: conf/global_settings.py:59 +msgid "Korean" +msgstr "korejsky" + +#: conf/global_settings.py:60 +msgid "Kannada" +msgstr "kannadsky" + +#: conf/global_settings.py:61 +msgid "Latvian" +msgstr "litevsky" + +#: conf/global_settings.py:62 +msgid "Macedonian" +msgstr "makedonsky" + +#: conf/global_settings.py:63 +msgid "Dutch" +msgstr "holandsky" + +#: conf/global_settings.py:64 +msgid "Norwegian" +msgstr "norsky" + +#: conf/global_settings.py:65 +msgid "Polish" +msgstr "polsky" + +#: conf/global_settings.py:66 +msgid "Portugese" +msgstr "portugalsky" + +#: conf/global_settings.py:67 +msgid "Brazilian" +msgstr "brazilsky" + +#: conf/global_settings.py:68 +msgid "Romanian" +msgstr "rumunsky" + +#: conf/global_settings.py:69 +msgid "Russian" +msgstr "rusky" + +#: conf/global_settings.py:70 +msgid "Slovak" +msgstr "slovensky" + +#: conf/global_settings.py:71 +msgid "Slovenian" +msgstr "slovinsky" + +#: conf/global_settings.py:72 +msgid "Serbian" +msgstr "srbsky" + +#: conf/global_settings.py:73 +msgid "Swedish" +msgstr "švédsky" + +#: conf/global_settings.py:74 +msgid "Tamil" +msgstr "tamilsky" + +#: conf/global_settings.py:75 +msgid "Telugu" +msgstr "telužsky" + +#: conf/global_settings.py:76 +msgid "Turkish" +msgstr "turecky" + +#: conf/global_settings.py:77 +msgid "Ukrainian" +msgstr "ukrajinsky" + +#: conf/global_settings.py:78 +msgid "Simplified Chinese" +msgstr "jednoduchou čínštinou" + +#: conf/global_settings.py:79 +msgid "Traditional Chinese" +msgstr "tradiční čínštinou" + +#: views/generic/create_update.py:43 +#, python-format +msgid "The %(verbose_name)s was created successfully." +msgstr "Záznam typu \"%(verbose_name)s\" byl úspěšně vytvořen." + +#: views/generic/create_update.py:117 +#, python-format +msgid "The %(verbose_name)s was updated successfully." +msgstr "Záznam typu \"%(verbose_name)s\" byl úspěšně změnen." + +#: views/generic/create_update.py:184 +#, python-format +msgid "The %(verbose_name)s was deleted." +msgstr "Záznam typu \"%(verbose_name)s\" byl smazán." + +#: oldforms/__init__.py:361 db/models/fields/__init__.py:121 +#: db/models/fields/__init__.py:278 db/models/fields/__init__.py:675 +#: db/models/fields/__init__.py:686 newforms/models.py:185 +#: newforms/fields.py:87 newforms/fields.py:444 newforms/fields.py:520 +#: newforms/fields.py:531 +msgid "This field is required." +msgstr "Toto pole je povinné." + +#: oldforms/__init__.py:396 +#, python-format +msgid "Ensure your text is less than %s character." +msgid_plural "Ensure your text is less than %s characters." +msgstr[0] "Ujistěte se, že Váš text má méně než %s znak." +msgstr[1] "Ujistěte se, že Váš text má méně než %s znaky." +msgstr[2] "Ujistěte se, že Váš text má méně než %s znaků." + +#: oldforms/__init__.py:401 +msgid "Line breaks are not allowed here." +msgstr "Zalomení řádky zde není povoleno." + +#: oldforms/__init__.py:502 oldforms/__init__.py:575 oldforms/__init__.py:614 +#, python-format +msgid "Select a valid choice; '%(data)s' is not in %(choices)s." +msgstr "Vyberte platnou volbu. \"%(data)s\" není mezi %(choices)s." + +#: oldforms/__init__.py:676 core/validators.py:175 core/validators.py:453 +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Soubor nebyl odeslán. Zkontrolujte \"encoding type\" formuláře." + +#: oldforms/__init__.py:678 +msgid "The submitted file is empty." +msgstr "Poslaný soubor je prázdný." + +#: oldforms/__init__.py:734 +msgid "Enter a whole number between -32,768 and 32,767." +msgstr "Vložte celé číslo mezi -32768 a 32767." + +#: oldforms/__init__.py:744 +msgid "Enter a positive number." +msgstr "Vložte celé kladné číslo." + +#: oldforms/__init__.py:754 +msgid "Enter a whole number between 0 and 32,767." +msgstr "Vložte celé číslo mezi 0 a 32767." + +#: core/validators.py:65 +msgid "This value must contain only letters, numbers and underscores." +msgstr "Tato hodnota musí obsahovat pouze znaky, čísla nebo podtržítka." + +#: core/validators.py:69 +msgid "" +"This value must contain only letters, numbers, underscores, dashes or " +"slashes." +msgstr "" +"Tato hodnota musí obsahovat pouze znaky, čísla, podtržítka, pomlčky nebo " +"lomítka." + +#: core/validators.py:73 +msgid "This value must contain only letters, numbers, underscores or hyphens." +msgstr "Tato hodnota musí obsahovat pouze znaky, čísla, podtržítka nebo čárky." + +#: core/validators.py:77 +msgid "Uppercase letters are not allowed here." +msgstr "Velká písmena zde nejsou povolená." + +#: core/validators.py:81 +msgid "Lowercase letters are not allowed here." +msgstr "Malá písmena zde nejsou povolená." + +#: core/validators.py:88 +msgid "Enter only digits separated by commas." +msgstr "Vložte pouze cifry oddělené čárkami." + +#: core/validators.py:100 +msgid "Enter valid e-mail addresses separated by commas." +msgstr "Vložte platné e-mailové adresy oddělené čárkami." + +#: core/validators.py:104 +msgid "Please enter a valid IP address." +msgstr "Prosíme, zadejte platnou IP adresu." + +#: core/validators.py:108 +msgid "Empty values are not allowed here." +msgstr "Zde nejsou povolené prázdné hodnoty." + +#: core/validators.py:112 +msgid "Non-numeric characters aren't allowed here." +msgstr "Znaky, které nejsou čísla, zde nejsou povoleny." + +#: core/validators.py:116 +msgid "This value can't be comprised solely of digits." +msgstr "Tato hodnota nemůže být složená pouze z cifer." + +#: core/validators.py:121 newforms/fields.py:135 +msgid "Enter a whole number." +msgstr "Vložte celé číslo." + +#: core/validators.py:125 +msgid "Only alphabetical characters are allowed here." +msgstr "Zde jsou povoleny pouze alfanumerické znaky." + +#: core/validators.py:140 +msgid "Year must be 1900 or later." +msgstr "Rok musí být 1900 a vyšší." + +#: core/validators.py:144 +#, python-format +msgid "Invalid date: %s" +msgstr "Neplatné datum: %s" + +#: core/validators.py:149 db/models/fields/__init__.py:463 +msgid "Enter a valid date in YYYY-MM-DD format." +msgstr "Vložte platné datum ve formátu RRRR-MM-DD." + +#: core/validators.py:154 +msgid "Enter a valid time in HH:MM format." +msgstr "Vložte platný čas ve formátu HH:MM." + +#: core/validators.py:158 db/models/fields/__init__.py:532 +msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format." +msgstr "Vložte platné datum a čas ve formátu RRRR-MM-DD HH:MM." + +#: core/validators.py:163 newforms/fields.py:339 +msgid "Enter a valid e-mail address." +msgstr "Vložte platnou e-mailovou adresu." + +#: core/validators.py:179 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Nahrajte na server platný obrázek. Poslaný soubor nebyl obrázkem nebo byl " +"poškozen." + +#: core/validators.py:186 +#, python-format +msgid "The URL %s does not point to a valid image." +msgstr "URL %s neodkazuje na platný obrázek." + +#: core/validators.py:190 +#, python-format +msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid." +msgstr "Telefonní čísla musí být ve formátu XXX-XXX-XXXX. \"%s\" není platné." + +#: core/validators.py:198 +#, python-format +msgid "The URL %s does not point to a valid QuickTime video." +msgstr "URL %s neodkazuje na platné video ve formátu QuickTime." + +#: core/validators.py:202 +msgid "A valid URL is required." +msgstr "Je vyžadováno platné URL." + +#: core/validators.py:216 +#, python-format +msgid "" +"Valid HTML is required. Specific errors are:\n" +"%s" +msgstr "" +"Je vyžadováno platné HTML. Konkrétní chyby jsou:\n" +"%s" + +#: core/validators.py:223 +#, python-format +msgid "Badly formed XML: %s" +msgstr "Špatně formované XML: %s" + +#: core/validators.py:240 +#, python-format +msgid "Invalid URL: %s" +msgstr "Neplatné URL: %s" + +#: core/validators.py:245 core/validators.py:247 +#, python-format +msgid "The URL %s is a broken link." +msgstr "Odkaz na URL %s nefunguje." + +#: core/validators.py:253 +msgid "Enter a valid U.S. state abbreviation." +msgstr "Vložte platnou zkratku U.S. státu." + +#: core/validators.py:267 +#, python-format +msgid "Watch your mouth! The word %s is not allowed here." +msgid_plural "Watch your mouth! The words %s are not allowed here." +msgstr[0] "Mluvte slušně! Slovo %s zde není přípustné." +msgstr[1] "Mluvte slušně! Slova %s zde nejsou přípustná." +msgstr[2] "Mluvte slušně! Slova %s zde nejsou přípustná." + +#: core/validators.py:274 +#, python-format +msgid "This field must match the '%s' field." +msgstr "Toto pole se musí shodovat s polem \"%s\"." + +#: core/validators.py:293 +msgid "Please enter something for at least one field." +msgstr "Prosíme, vložte něco alespoň pro jedno pole." + +#: core/validators.py:302 core/validators.py:313 +msgid "Please enter both fields or leave them both empty." +msgstr "Prosíme, vložte obě pole, nebo je nechte obě prázdná." + +#: core/validators.py:321 +#, python-format +msgid "This field must be given if %(field)s is %(value)s" +msgstr "Toto pole musí být vyplněno, když %(field)s má %(value)s" + +#: core/validators.py:334 +#, python-format +msgid "This field must be given if %(field)s is not %(value)s" +msgstr "Toto pole musí být vyplněno, když %(field)s nemá %(value)s" + +#: core/validators.py:353 +msgid "Duplicate values are not allowed." +msgstr "Duplikátní hodnoty nejsou povolené." + +#: core/validators.py:368 +#, python-format +msgid "This value must be between %(lower)s and %(upper)s." +msgstr "Tato hodnota musí být mezi %(lower)s and %(upper)s." + +#: core/validators.py:370 +#, python-format +msgid "This value must be at least %s." +msgstr "Tato hodnota musí alespoň %s." + +#: core/validators.py:372 +#, python-format +msgid "This value must be no more than %s." +msgstr "Tato hodnota nesmí být více než %s." + +#: core/validators.py:408 +#, python-format +msgid "This value must be a power of %s." +msgstr "Tato hodnota musí být mocninou %s." + +#: core/validators.py:417 +msgid "Please enter a valid decimal number." +msgstr "Prosíme, vložte platné číslo." + +#: core/validators.py:423 +#, python-format +msgid "Please enter a valid decimal number with at most %s total digit." +msgid_plural "" +"Please enter a valid decimal number with at most %s total digits." +msgstr[0] "Prosíme, vložte platné číslo s nejvíce %s cifrou celkem." +msgstr[1] "Prosíme, vložte platné číslo s nejvíce %s ciframi celkem." +msgstr[2] "Prosíme, vložte platné číslo s nejvíce %s ciframi celkem." + +#: core/validators.py:426 +#, python-format +msgid "" +"Please enter a valid decimal number with a whole part of at most %s digit." +msgid_plural "" +"Please enter a valid decimal number with a whole part of at most %s digits." +msgstr[0] "Prosíme, vložte platné číslo s nejvíce %s cifrou." +msgstr[1] "Prosíme, vložte platné číslo s nejvíce %s ciframi." +msgstr[2] "Prosíme, vložte platné číslo s nejvíce %s ciframi." + +#: core/validators.py:429 +#, python-format +msgid "Please enter a valid decimal number with at most %s decimal place." +msgid_plural "" +"Please enter a valid decimal number with at most %s decimal places." +msgstr[0] "" +"Prosíme, vložte platné číslo s nejvíce %s cifrou za desetinnou čárkou celkem." +msgstr[1] "" +"Prosíme, vložte platné číslo s nejvíce %s ciframi za desetinnou čárkou " +"celkem." +msgstr[2] "" +"Prosíme, vložte platné číslo s nejvíce %s ciframi za desetinnou čárkou " +"celkem." + +#: core/validators.py:437 +msgid "Please enter a valid floating point number." +msgstr "Prosíme, vložte platné reálné číslo." + +#: core/validators.py:446 +#, python-format +msgid "Make sure your uploaded file is at least %s bytes big." +msgstr "Ujistěte se, že poslaný soubor má nejméně %s bytů." + +#: core/validators.py:447 +#, python-format +msgid "Make sure your uploaded file is at most %s bytes big." +msgstr "Ujistěte se, že soubor má nejvíce %s bytů." + +#: core/validators.py:464 +msgid "The format for this field is wrong." +msgstr "Formát pro toto pole je špatný." + +#: core/validators.py:479 +msgid "This field is invalid." +msgstr "Toto pole není platné." + +#: core/validators.py:515 +#, python-format +msgid "Could not retrieve anything from %s." +msgstr "Nelze získat nic z %s." + +#: core/validators.py:518 +#, python-format +msgid "" +"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." +msgstr "" +"URL %(url)s vrátilo neplatnou hlavičku Content-Type \"%(contenttype)s\"." + +#: core/validators.py:551 +#, python-format +msgid "" +"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with " +"\"%(start)s\".)" +msgstr "" +"Prosíme, zavřete nezavřenou značku %(tag)s z řádky %(line)s. (Řádka začíná s " +"\"%(start)s\".)" + +#: core/validators.py:555 +#, python-format +msgid "" +"Some text starting on line %(line)s is not allowed in that context. (Line " +"starts with \"%(start)s\".)" +msgstr "" +"Nějaký text začínající na řádce %(line)s není povolen v tomto kontextu. " +"(Řádka začíná s \"%(start)s\".)" + +#: core/validators.py:560 +#, python-format +msgid "" +"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%" +"(start)s\".)" +msgstr "" +"\"%(attr)s\" na řádce %(line)s je neplatný atribut. (Řádka začíná s \"%" +"(start)s\".)" + +#: core/validators.py:565 +#, python-format +msgid "" +"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%" +"(start)s\".)" +msgstr "" +"\"<%(tag)s>\" na řádce %(line)s je neplatná značka. (Řádka začíná s \"%" +"(start)s\".)" + +#: core/validators.py:569 +#, python-format +msgid "" +"A tag on line %(line)s is missing one or more required attributes. (Line " +"starts with \"%(start)s\".)" +msgstr "" +"Značce na řádce %(line)s schází jeden nebo více požadovaných atributů. " +"(Řádka začíná s \"%(start)s\".)" + +#: core/validators.py:574 +#, python-format +msgid "" +"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line " +"starts with \"%(start)s\".)" +msgstr "" +"Atribut \"%(attr)s\" na řádce %(line)s má neplatnou hodnotu. (Řádka začína s " +"\"%(start)s\".)" + +#: db/models/manipulators.py:307 +#, python-format +msgid "%(object)s with this %(type)s already exists for the given %(field)s." +msgstr "" +"%(object)s s takto vyplněným polem \"%(type)s\" již existuje pro dané pole " +"\"%(field)s\"." + +#: db/models/fields/related.py:53 +#, python-format +msgid "Please enter a valid %s." +msgstr "Prosíme, zadejte %s správně." + +#: db/models/fields/related.py:642 +msgid "Separate multiple IDs with commas." +msgstr "Oddělte více identifikátorů čárkami." + +#: db/models/fields/related.py:644 +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" +"Podržte \"Control\" (nebo \"Command\" na Macu) pro vybrání více jak jedné " +"položky." + +#: db/models/fields/related.py:691 +#, python-format +msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." +msgid_plural "" +"Please enter valid %(self)s IDs. The values %(value)r are invalid." +msgstr[0] "Prosíme, vložte platná %(self)s ID. Hodnota %(value)r není platná." +msgstr[1] "" +"Prosíme, vložte platná %(self)s ID. Hodnoty %(value)r nejsou platné." +msgstr[2] "" +"Prosíme, vložte platná %(self)s ID. Hodnoty %(value)r nejsou platné." + +#: db/models/fields/__init__.py:46 +#, python-format +msgid "%(optname)s with this %(fieldname)s already exists." +msgstr "%(optname)s s takto vyplněným polem \"%(fieldname)s\" již existuje." + +#: db/models/fields/__init__.py:373 +msgid "This value must be an integer." +msgstr "Tato hodnota musí být celé číslo." + +#: db/models/fields/__init__.py:408 +msgid "This value must be either True or False." +msgstr "Tato hodnota musí být buď Ano (True), nebo Ne (False)." + +#: db/models/fields/__init__.py:429 +msgid "This field cannot be null." +msgstr "Toto pole nemůže být prázdné (null)." + +#: db/models/fields/__init__.py:592 +msgid "This value must be a decimal number." +msgstr "Tato hodnota musí být celé číslo." + +#: db/models/fields/__init__.py:695 +msgid "Enter a valid filename." +msgstr "Vložte platný název souboru." + +#: db/models/fields/__init__.py:818 +msgid "This value must be either None, True or False." +msgstr "Tato hodnota musí být buď Nic (None), Ano (True) nebo Ne (False)." + +#: template/defaultfilters.py:491 +msgid "yes,no,maybe" +msgstr "ano, ne, možná" + +#: template/defaultfilters.py:520 +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: template/defaultfilters.py:522 +#, python-format +msgid "%.1f KB" +msgstr "" + +#: template/defaultfilters.py:524 +#, python-format +msgid "%.1f MB" +msgstr "" + +#: template/defaultfilters.py:525 +#, python-format +msgid "%.1f GB" +msgstr "" + +#: newforms/models.py:172 newforms/fields.py:432 +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Vyberte platnou možnost. Tato není dostupná." + +#: newforms/models.py:189 newforms/fields.py:448 newforms/fields.py:524 +msgid "Enter a list of values." +msgstr "Vložte seznam hodnot." + +#: newforms/models.py:195 newforms/fields.py:457 +#, python-format +msgid "Select a valid choice. %s is not one of the available choices." +msgstr "Vyberte platnou možnost. Volba %s není dostupná." + +#: newforms/fields.py:110 newforms/fields.py:324 +#, python-format +msgid "Ensure this value has at most %d characters." +msgstr "Tato hodnota musí mít nejvíce %d znaků." + +#: newforms/fields.py:112 newforms/fields.py:326 +#, python-format +msgid "Ensure this value has at least %d characters." +msgstr "Tato hodnota musí mít nejméně %d znaků." + +#: newforms/fields.py:137 newforms/fields.py:160 newforms/fields.py:192 +#, python-format +msgid "Ensure this value is less than or equal to %s." +msgstr "Tato hodnota musí být menší nebo rovná %s." + +#: newforms/fields.py:139 newforms/fields.py:162 newforms/fields.py:194 +#, python-format +msgid "Ensure this value is greater than or equal to %s." +msgstr "Tato hodnota musí být větší nebo rovná %s." + +#: newforms/fields.py:158 newforms/fields.py:186 +msgid "Enter a number." +msgstr "Vložte číslo." + +#: newforms/fields.py:196 +#, python-format +msgid "Ensure that there are no more than %s digits in total." +msgstr "Tato hodnota nesmí mít celkem více než %s cifer." + +#: newforms/fields.py:198 +#, python-format +msgid "Ensure that there are no more than %s decimal places." +msgstr "Tato hodnota nesmí mít za desetinou čárkou více než %s cifer." + +#: newforms/fields.py:200 +#, python-format +msgid "Ensure that there are no more than %s digits before the decimal point." +msgstr "Tato hodnota nesmí mít před desetinnou čárkou více než %s cifer." + +#: newforms/fields.py:233 +msgid "Enter a valid date." +msgstr "Vložte platné datum." + +#: newforms/fields.py:260 +msgid "Enter a valid time." +msgstr "Vložte platný čas." + +#: newforms/fields.py:296 +msgid "Enter a valid date/time." +msgstr "Vložte platný datum a čas." + +#: newforms/fields.py:310 +msgid "Enter a valid value." +msgstr "Vložte platnou hodnotu." + +#: newforms/fields.py:357 newforms/fields.py:379 +msgid "Enter a valid URL." +msgstr "Vložte platnou URL." + +#: newforms/fields.py:381 +msgid "This URL appears to be a broken link." +msgstr "Tento odkaz nefunguje." + +#: utils/timesince.py:12 +msgid "year" +msgid_plural "years" +msgstr[0] "rok" +msgstr[1] "roky" +msgstr[2] "let" + +#: utils/timesince.py:13 +msgid "month" +msgid_plural "months" +msgstr[0] "měsíc" +msgstr[1] "měsíce" +msgstr[2] "měsíců" + +#: utils/timesince.py:14 +msgid "week" +msgid_plural "weeks" +msgstr[0] "týden" +msgstr[1] "týdny" +msgstr[2] "týdnů" + +#: utils/timesince.py:15 +msgid "day" +msgid_plural "days" +msgstr[0] "den" +msgstr[1] "dny" +msgstr[2] "dnů" + +#: utils/timesince.py:16 +msgid "hour" +msgid_plural "hours" +msgstr[0] "hodina" +msgstr[1] "hodiny" +msgstr[2] "hodin" + +#: utils/timesince.py:17 +msgid "minute" +msgid_plural "minutes" +msgstr[0] "minuta" +msgstr[1] "minuty" +msgstr[2] "minut" + +#: utils/timesince.py:40 +#, python-format +msgid "%d milliseconds" +msgstr "" + +#: utils/timesince.py:41 +#, python-format +msgid "%(number)d %(type)s" +msgstr "" + +#: utils/timesince.py:47 +#, python-format +msgid ", %(number)d %(type)s" +msgstr "" + +#: utils/dateformat.py:40 +msgid "p.m." +msgstr "odp." + +#: utils/dateformat.py:41 +msgid "a.m." +msgstr "dop." + +#: utils/dateformat.py:46 +msgid "PM" +msgstr "odp." + +#: utils/dateformat.py:47 +msgid "AM" +msgstr "dop." + +#: utils/dateformat.py:95 +msgid "midnight" +msgstr "půlnoc" + +#: utils/dateformat.py:97 +msgid "noon" +msgstr "poledne" #: utils/dates.py:6 msgid "Monday" -msgstr "Pondělí" +msgstr "pondělí" #: utils/dates.py:6 msgid "Tuesday" -msgstr "Úterý" +msgstr "úterý" #: utils/dates.py:6 msgid "Wednesday" -msgstr "Středa" +msgstr "středa" #: utils/dates.py:6 msgid "Thursday" -msgstr "Čtvrtek" +msgstr "čtvrtek" #: utils/dates.py:6 msgid "Friday" -msgstr "Pátek" +msgstr "pátek" #: utils/dates.py:7 msgid "Saturday" -msgstr "Sobota" +msgstr "sobota" #: utils/dates.py:7 msgid "Sunday" -msgstr "Neděle" +msgstr "neděle" #: utils/dates.py:14 msgid "January" -msgstr "Leden" +msgstr "leden" #: utils/dates.py:14 msgid "February" -msgstr "Únor" +msgstr "únor" -#: utils/dates.py:14 -#: utils/dates.py:27 +#: utils/dates.py:14 utils/dates.py:27 msgid "March" -msgstr "Březen" +msgstr "březen" -#: utils/dates.py:14 -#: utils/dates.py:27 +#: utils/dates.py:14 utils/dates.py:27 msgid "April" -msgstr "Duben" +msgstr "duben" -#: utils/dates.py:14 -#: utils/dates.py:27 +#: utils/dates.py:14 utils/dates.py:27 msgid "May" -msgstr "Květen" +msgstr "květen" -#: utils/dates.py:14 -#: utils/dates.py:27 +#: utils/dates.py:14 utils/dates.py:27 msgid "June" -msgstr "Červen" +msgstr "červen" -#: utils/dates.py:15 -#: utils/dates.py:27 +#: utils/dates.py:15 utils/dates.py:27 msgid "July" -msgstr "Červenec" +msgstr "červenec" #: utils/dates.py:15 msgid "August" -msgstr "Srpen" +msgstr "srpen" #: utils/dates.py:15 msgid "September" -msgstr "Září" +msgstr "září" #: utils/dates.py:15 msgid "October" -msgstr "Říjen" +msgstr "říjen" #: utils/dates.py:15 msgid "November" -msgstr "Listopad" +msgstr "listopad" #: utils/dates.py:16 msgid "December" -msgstr "Prosinec" +msgstr "prosinec" #: utils/dates.py:19 msgid "jan" @@ -1519,592 +2987,48 @@ msgstr "pro" #: utils/dates.py:27 msgid "Jan." -msgstr "Led." +msgstr "led." #: utils/dates.py:27 msgid "Feb." -msgstr "Ún." +msgstr "ún." #: utils/dates.py:28 msgid "Aug." -msgstr "Srp." +msgstr "srp." #: utils/dates.py:28 msgid "Sept." -msgstr "Zář." +msgstr "zář." #: utils/dates.py:28 msgid "Oct." -msgstr "Říj." +msgstr "říj." #: utils/dates.py:28 msgid "Nov." -msgstr "List." +msgstr "list." #: utils/dates.py:28 msgid "Dec." -msgstr "Pros." +msgstr "pros." -#: utils/timesince.py:12 -msgid "year" -msgid_plural "years" -msgstr[0] "rok" -msgstr[1] "roky" -msgstr[2] "let" - -#: utils/timesince.py:13 -msgid "month" -msgid_plural "months" -msgstr[0] "měsíc" -msgstr[1] "měsíce" -msgstr[2] "měsíců" - -#: utils/timesince.py:14 -msgid "week" -msgid_plural "weeks" -msgstr[0] "týden" -msgstr[1] "týdny" -msgstr[2] "týdnů" - -#: utils/timesince.py:15 -msgid "day" -msgid_plural "days" -msgstr[0] "den" -msgstr[1] "dny" -msgstr[2] "dnů" - -#: utils/timesince.py:16 -msgid "hour" -msgid_plural "hours" -msgstr[0] "hodina" -msgstr[1] "hodiny" -msgstr[2] "hodin" - -#: utils/timesince.py:17 -msgid "minute" -msgid_plural "minutes" -msgstr[0] "minuta" -msgstr[1] "minuty" -msgstr[2] "minut" - -#: utils/translation/trans_real.py:362 +#: utils/translation/trans_real.py:358 msgid "DATE_FORMAT" -msgstr "j.n.Y" +msgstr "j. n. Y" -#: utils/translation/trans_real.py:363 +#: utils/translation/trans_real.py:359 msgid "DATETIME_FORMAT" -msgstr "j.n.Y, H:i" +msgstr "j. n. Y, H:i" -#: utils/translation/trans_real.py:364 +#: utils/translation/trans_real.py:360 msgid "TIME_FORMAT" msgstr "H:i" -#: utils/translation/trans_real.py:380 +#: utils/translation/trans_real.py:376 msgid "YEAR_MONTH_FORMAT" msgstr "F Y" -#: utils/translation/trans_real.py:381 +#: utils/translation/trans_real.py:377 msgid "MONTH_DAY_FORMAT" msgstr "j. F" - -#: conf/global_settings.py:39 -msgid "Arabic" -msgstr "Arabic" - -#: conf/global_settings.py:40 -msgid "Bengali" -msgstr "Bengálsky" - -#: conf/global_settings.py:41 -msgid "Czech" -msgstr "Česky" - -#: conf/global_settings.py:42 -msgid "Welsh" -msgstr "Welšsky" - -#: conf/global_settings.py:43 -msgid "Danish" -msgstr "Dánsky" - -#: conf/global_settings.py:44 -msgid "German" -msgstr "Německy" - -#: conf/global_settings.py:45 -msgid "Greek" -msgstr "Řecky" - -#: conf/global_settings.py:46 -msgid "English" -msgstr "Anglicky" - -#: conf/global_settings.py:47 -msgid "Spanish" -msgstr "Španělsky" - -#: conf/global_settings.py:48 -msgid "Argentinean Spanish" -msgstr "Argentinean Spanish" - -#: conf/global_settings.py:49 -msgid "Finnish" -msgstr "Finsky" - -#: conf/global_settings.py:50 -msgid "French" -msgstr "Francouzsky" - -#: conf/global_settings.py:51 -msgid "Galician" -msgstr "Galicijsky" - -#: conf/global_settings.py:52 -msgid "Hungarian" -msgstr "Maďarsky" - -#: conf/global_settings.py:53 -msgid "Hebrew" -msgstr "Hebrejsky" - -#: conf/global_settings.py:54 -msgid "Icelandic" -msgstr "Islandština" - -#: conf/global_settings.py:55 -msgid "Italian" -msgstr "Italsky" - -#: conf/global_settings.py:56 -msgid "Japanese" -msgstr "Japonština" - -#: conf/global_settings.py:57 -msgid "Dutch" -msgstr "Holandština" - -#: conf/global_settings.py:58 -msgid "Norwegian" -msgstr "Norsky" - -#: conf/global_settings.py:59 -msgid "Brazilian" -msgstr "Brazilsky" - -#: conf/global_settings.py:60 -msgid "Romanian" -msgstr "Rumunsky" - -#: conf/global_settings.py:61 -msgid "Russian" -msgstr "Rusky" - -#: conf/global_settings.py:62 -msgid "Slovak" -msgstr "Slovensky" - -#: conf/global_settings.py:63 -msgid "Slovenian" -msgstr "Slovinsky" - -#: conf/global_settings.py:64 -msgid "Serbian" -msgstr "Srbsky" - -#: conf/global_settings.py:65 -msgid "Swedish" -msgstr "Švédsky" - -#: conf/global_settings.py:66 -msgid "Tamil" -msgstr "Tamil" - -#: conf/global_settings.py:67 -msgid "Turkish" -msgstr "Turecky" - -#: conf/global_settings.py:68 -msgid "Ukrainian" -msgstr "Ukrajinsky" - -#: conf/global_settings.py:69 -msgid "Simplified Chinese" -msgstr "Jednoduchá čínština" - -#: conf/global_settings.py:70 -msgid "Traditional Chinese" -msgstr "Tradiční čínština" - -#: core/validators.py:63 -msgid "This value must contain only letters, numbers and underscores." -msgstr "Tato hodnota musí obsahovat pouze znaky, čísla nebo podtržítka." - -#: core/validators.py:67 -msgid "This value must contain only letters, numbers, underscores, dashes or slashes." -msgstr "Tato hodnota musí obsahovat pouze znaky, čísla, podtržítka, pomlčky nebo lomítka." - -#: core/validators.py:71 -msgid "This value must contain only letters, numbers, underscores or hyphens." -msgstr "Tato hodnota musí obsahovat pouze znaky, čísla, podtržítka nebo čárky." - -#: core/validators.py:75 -msgid "Uppercase letters are not allowed here." -msgstr "Velká písmena zde nejsou povolená." - -#: core/validators.py:79 -msgid "Lowercase letters are not allowed here." -msgstr "Malá písmena zde nejsou povolená." - -#: core/validators.py:86 -msgid "Enter only digits separated by commas." -msgstr "Vložte pouze cifry oddělené čárkami." - -#: core/validators.py:98 -msgid "Enter valid e-mail addresses separated by commas." -msgstr "Vložte platné e-mailové adresy oddělené čárkami." - -#: core/validators.py:102 -msgid "Please enter a valid IP address." -msgstr "Prosíme, zadejte platnou IP adresu." - -#: core/validators.py:106 -msgid "Empty values are not allowed here." -msgstr "Zde nejsou povolené prázdné hodnoty." - -#: core/validators.py:110 -msgid "Non-numeric characters aren't allowed here." -msgstr "Znaky, které nejsou čísla, nejsou zde povoleny." - -#: core/validators.py:114 -msgid "This value can't be comprised solely of digits." -msgstr "Tato hodnota nemůže být složená pouze z cifer." - -#: core/validators.py:119 -msgid "Enter a whole number." -msgstr "Vložte celé číslo." - -#: core/validators.py:123 -msgid "Only alphabetical characters are allowed here." -msgstr "Zde jsou povoleny pouze alfanumerické znaky." - -#: core/validators.py:138 -msgid "Year must be 1900 or later." -msgstr "Rok musí být 1900 a vyšší." - -#: core/validators.py:142 -#, python-format -msgid "Invalid date: %s." -msgstr "Neplatné datum: %s." - -#: core/validators.py:146 -#: db/models/fields/__init__.py:415 -msgid "Enter a valid date in YYYY-MM-DD format." -msgstr "Vložte platné datum ve formátu RRRR-MM-DD." - -#: core/validators.py:151 -msgid "Enter a valid time in HH:MM format." -msgstr "Vložte platný čas ve formátu HH:MM." - -#: core/validators.py:155 -#: db/models/fields/__init__.py:477 -msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format." -msgstr "Vložte platné datum a čas ve formátu RRRR-MM-DD HH:MM." - -#: core/validators.py:160 -msgid "Enter a valid e-mail address." -msgstr "Vložte platnou e-mailovou adresu." - -#: core/validators.py:172 -#: core/validators.py:401 -#: forms/__init__.py:661 -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Soubor nebyl odeslán. Zkontrolujte encoding type formuláře." - -#: core/validators.py:176 -msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image." -msgstr "Nahrajte na server platný obrázek. Soubor, který jste nahrál(a) nebyl obrázek, nebo byl porušen." - -#: core/validators.py:183 -#, python-format -msgid "The URL %s does not point to a valid image." -msgstr "URL %s neukazuje na platný obrázek." - -#: core/validators.py:187 -#, python-format -msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid." -msgstr "Telefonní čísla musí být ve formátu XXX-XXX-XXXX. \"%s\" není platné." - -#: core/validators.py:195 -#, python-format -msgid "The URL %s does not point to a valid QuickTime video." -msgstr "URL %s neodkazuje na platné video ve formátu QuickTime." - -#: core/validators.py:199 -msgid "A valid URL is required." -msgstr "Je vyžadováno platné URL." - -#: core/validators.py:213 -#, python-format -msgid "" -"Valid HTML is required. Specific errors are:\n" -"%s" -msgstr "" -"Je vyžadováno platné HTML. Konkrétní chyby jsou:\n" -"%s" - -#: core/validators.py:220 -#, python-format -msgid "Badly formed XML: %s" -msgstr "Špatně formované XML: %s" - -#: core/validators.py:230 -#, python-format -msgid "Invalid URL: %s" -msgstr "Neplatné URL: %s" - -#: core/validators.py:234 -#: core/validators.py:236 -#, python-format -msgid "The URL %s is a broken link." -msgstr "Odkaz na URL %s je rozbitý." - -#: core/validators.py:242 -msgid "Enter a valid U.S. state abbreviation." -msgstr "Vložte platnou zkraku U.S. státu." - -#: core/validators.py:256 -#, python-format -msgid "Watch your mouth! The word %s is not allowed here." -msgid_plural "Watch your mouth! The words %s are not allowed here." -msgstr[0] "Mluvte slušně! Slovo %s zde není přípustné." -msgstr[1] "Mluvte slušně! Slova %s zde nejsou přípustná." -msgstr[2] "Mluvte slušně! Slova %s zde nejsou přípustná." - -#: core/validators.py:263 -#, python-format -msgid "This field must match the '%s' field." -msgstr "Toto pole se musí shodovat s polem '%s'." - -#: core/validators.py:282 -msgid "Please enter something for at least one field." -msgstr "Prosíme, vložte něco alespoň pro jedno pole." - -#: core/validators.py:291 -#: core/validators.py:302 -msgid "Please enter both fields or leave them both empty." -msgstr "Prosíme, vložte obě pole, nebo je nechte obě prázdná." - -#: core/validators.py:309 -#, python-format -msgid "This field must be given if %(field)s is %(value)s" -msgstr "Toto pole musí být vyplněno, když %(field)s má %(value)s" - -#: core/validators.py:321 -#, python-format -msgid "This field must be given if %(field)s is not %(value)s" -msgstr "Toto pole musí být vyplněno, když %(field)s nemá %(value)s" - -#: core/validators.py:340 -msgid "Duplicate values are not allowed." -msgstr "Duplikátní hodnoty nejsou povolené." - -#: core/validators.py:363 -#, python-format -msgid "This value must be a power of %s." -msgstr "Tato hodnota musí být mocninou %s." - -#: core/validators.py:374 -msgid "Please enter a valid decimal number." -msgstr "Prosíme, vložte platné číslo." - -#: core/validators.py:378 -#, python-format -msgid "Please enter a valid decimal number with at most %s total digit." -msgid_plural "Please enter a valid decimal number with at most %s total digits." -msgstr[0] "Prosíme, vložte platné číslo s nejvíce %s cifrou celkem." -msgstr[1] "Prosíme, vložte platné číslo s nejvíce %s ciframi celkem." -msgstr[2] "Prosíme, vložte platné číslo s nejvíce %s ciframi celkem." - -#: core/validators.py:381 -#, python-format -msgid "Please enter a valid decimal number with a whole part of at most %s digit." -msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits." -msgstr[0] "Prosíme, vložte platné číslo s nejvíce %s cifrou." -msgstr[1] "Prosíme, vložte platné číslo s nejvíce %s ciframi." -msgstr[2] "Prosíme, vložte platné číslo s nejvíce %s ciframi." - -#: core/validators.py:384 -#, python-format -msgid "Please enter a valid decimal number with at most %s decimal place." -msgid_plural "Please enter a valid decimal number with at most %s decimal places." -msgstr[0] "Prosíme, vložte platné číslo s nejvíce %s cifrou za desetinnou čárkou celkem." -msgstr[1] "Prosíme, vložte platné číslo s nejvíce %s ciframi za desetinnou čárkou celkem." -msgstr[2] "Prosíme, vložte platné číslo s nejvíce %s ciframi za desetinnou čárkou celkem." - -#: core/validators.py:394 -#, python-format -msgid "Make sure your uploaded file is at least %s bytes big." -msgstr "Ujistěte se, že posílaný soubor je velký nejméně %s bytů." - -#: core/validators.py:395 -#, python-format -msgid "Make sure your uploaded file is at most %s bytes big." -msgstr "Ujistěte se, že posílaný soubor je velký nejvíce %s bytů." - -#: core/validators.py:412 -msgid "The format for this field is wrong." -msgstr "Formát pro toto pole je špatný." - -#: core/validators.py:427 -msgid "This field is invalid." -msgstr "Toto pole není platné." - -#: core/validators.py:463 -#, python-format -msgid "Could not retrieve anything from %s." -msgstr "Nemohl jsem získat nic z %s." - -#: core/validators.py:466 -#, python-format -msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." -msgstr "URL %(url)s vrátilo neplatnou hlavičku Content-Type '%(contenttype)s'." - -#: core/validators.py:499 -#, python-format -msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)" -msgstr "Prosíme, zavřete nezavřenou značku %(tag)s z řádky %(line)s. (Řádka začíná s \"%(start)s\".)" - -#: core/validators.py:503 -#, python-format -msgid "Some text starting on line %(line)s is not allowed in that context. (Line starts with \"%(start)s\".)" -msgstr "Nějaký text začínající na řádce %(line)s není povolen v tomto kontextu. (Řádka začíná s \"%(start)s\".)" - -#: core/validators.py:508 -#, python-format -msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)" -msgstr "\"%(attr)s\" na řádce %(line)s je neplatný atribut. (Řádka začíná s \"%(start)s\".)" - -#: core/validators.py:513 -#, python-format -msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)" -msgstr "\"<%(tag)s>\" na řádce %(line)s je neplatná značka. (Řádka začíná s \"%(start)s\".)" - -#: core/validators.py:517 -#, python-format -msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)" -msgstr "Značce na řádce %(line)s schází jeden nebo více požadovaných atributů. (Řádka začíná s \"%(start)s\".)" - -#: core/validators.py:522 -#, python-format -msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)" -msgstr "Atribut \"%(attr)s\" na řádce %(line)s má neplatnou hodnotu. (Řádka začína s \"%(start)s\".)" - -#: views/generic/create_update.py:43 -#, python-format -msgid "The %(verbose_name)s was created successfully." -msgstr "Záznam %(verbose_name)s byl úspěšně vytvořen." - -#: views/generic/create_update.py:117 -#, python-format -msgid "The %(verbose_name)s was updated successfully." -msgstr "Záznam %(verbose_name)s byl úspěšně změnen." - -#: views/generic/create_update.py:184 -#, python-format -msgid "The %(verbose_name)s was deleted." -msgstr "Záznam %(verbose_name)s byl smazán." - -#: db/models/manipulators.py:302 -#, python-format -msgid "%(object)s with this %(type)s already exists for the given %(field)s." -msgstr "%(object)s s tímto %(type)s již existují pro daná %(field)s." - -#: db/models/fields/__init__.py:40 -#, python-format -msgid "%(optname)s with this %(fieldname)s already exists." -msgstr "%(optname)s s tímto %(fieldname)s již existuje." - -#: db/models/fields/__init__.py:114 -#: db/models/fields/__init__.py:265 -#: db/models/fields/__init__.py:551 -#: db/models/fields/__init__.py:562 -#: forms/__init__.py:346 -msgid "This field is required." -msgstr "Toto pole je povinné." - -#: db/models/fields/__init__.py:340 -msgid "This value must be an integer." -msgstr "Tato hodnota musí být celé číslo." - -#: db/models/fields/__init__.py:372 -msgid "This value must be either True or False." -msgstr "Tato hodnota musí být buď Ano (True), nebo Ne (False)." - -#: db/models/fields/__init__.py:388 -msgid "This field cannot be null." -msgstr "Toto pole nemůže být prázdné (null)." - -#: db/models/fields/__init__.py:571 -msgid "Enter a valid filename." -msgstr "Vložte platný název souboru." - -#: db/models/fields/related.py:51 -#, python-format -msgid "Please enter a valid %s." -msgstr "Prosíme, zadejte %s správně." - -#: db/models/fields/related.py:618 -msgid "Separate multiple IDs with commas." -msgstr "Oddělte více identifikátorů čárkami." - -#: db/models/fields/related.py:620 -msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "Podržte \"Control\", nebo \"Command\" na Macu pro vybrání více jak jedné položky." - -#: db/models/fields/related.py:664 -#, python-format -msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." -msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid." -msgstr[0] "Prosíme, vložte platná %(self)s ID. Hodnota %(value)r není platná." -msgstr[1] "Prosíme, vložte platná %(self)s ID. Hodnoty %(value)r nejsou platné." -msgstr[2] "Prosíme, vložte platná %(self)s ID. Hodnoty %(value)r nejsou platné." - -#: forms/__init__.py:381 -#, python-format -msgid "Ensure your text is less than %s character." -msgid_plural "Ensure your text is less than %s characters." -msgstr[0] "Ujistěte se, že Váš text má méně než %s znak." -msgstr[1] "Ujistěte se, že Váš text má méně než %s znaky." -msgstr[2] "Ujistěte se, že Váš text má méně než %s znaků." - -#: forms/__init__.py:386 -msgid "Line breaks are not allowed here." -msgstr "Zalomení řádky zde nenjsou povolená." - -#: forms/__init__.py:487 -#: forms/__init__.py:560 -#: forms/__init__.py:599 -#, python-format -msgid "Select a valid choice; '%(data)s' is not in %(choices)s." -msgstr "Vyberte platnou volbu. '%(data)s' není mezi %(choices)s." - -#: forms/__init__.py:663 -msgid "The submitted file is empty." -msgstr "Odevzdaný soubor je prázdný." - -#: forms/__init__.py:719 -msgid "Enter a whole number between -32,768 and 32,767." -msgstr "Vložte celé číslo mezi -32,768 a 32,767." - -#: forms/__init__.py:729 -msgid "Enter a positive number." -msgstr "Vložte celé kladné číslo." - -#: forms/__init__.py:739 -msgid "Enter a whole number between 0 and 32,767." -msgstr "Vložte celé číslo mezi 0 a 32,767." - -#: template/defaultfilters.py:401 -msgid "yes,no,maybe" -msgstr "ano, ne, možná" - diff --git a/django/conf/locale/cs/LC_MESSAGES/djangojs.mo b/django/conf/locale/cs/LC_MESSAGES/djangojs.mo index 097bd199d8..d1e3f81a82 100644 Binary files a/django/conf/locale/cs/LC_MESSAGES/djangojs.mo and b/django/conf/locale/cs/LC_MESSAGES/djangojs.mo differ diff --git a/django/conf/locale/cs/LC_MESSAGES/djangojs.po b/django/conf/locale/cs/LC_MESSAGES/djangojs.po index 9143b56fdd..652f00f819 100644 --- a/django/conf/locale/cs/LC_MESSAGES/djangojs.po +++ b/django/conf/locale/cs/LC_MESSAGES/djangojs.po @@ -7,25 +7,34 @@ msgid "" msgstr "" "Project-Id-Version: Django JavaScript Czech translation\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2005-12-17 22:26+0100\n" -"PO-Revision-Date: 2006-05-03 12:04+0100\n" -"Last-Translator: \n" +"POT-Creation-Date: 2007-06-18 11:26+0200\n" "Language-Team: Czech\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Poedit-Language: Czech\n" -"X-Poedit-Country: CZECH REPUBLIC\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n>1 && n<5 ? 1 : 2;\n" + +#: contrib/admin/media/js/dateparse.js:32 +#: contrib/admin/media/js/calendar.js:24 +msgid "" +"January February March April May June July August September October November " +"December" +msgstr "" +"Leden Únor Březen Duben Květen Červen Červenec Srpen Září Říjen Listopad " +"Prosinec" + +#: contrib/admin/media/js/dateparse.js:33 +msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday" +msgstr "Neděle Pondělí Úterý Středa Čtvrtek Pátek Sobota" #: contrib/admin/media/js/SelectFilter2.js:33 #, perl-format msgid "Available %s" -msgstr "K dispozici %s" +msgstr "Dostupná %s" #: contrib/admin/media/js/SelectFilter2.js:41 msgid "Choose all" -msgstr "Vybrat vše" +msgstr "Vybrat vše" #: contrib/admin/media/js/SelectFilter2.js:46 msgid "Add" @@ -38,75 +47,72 @@ msgstr "Odebrat" #: contrib/admin/media/js/SelectFilter2.js:53 #, perl-format msgid "Chosen %s" -msgstr "Vybraný %s" +msgstr "Vybraná %s" #: contrib/admin/media/js/SelectFilter2.js:54 msgid "Select your choice(s) and click " -msgstr "Vyberte si a klikněte" +msgstr "Vyberte si a klikněte " #: contrib/admin/media/js/SelectFilter2.js:59 msgid "Clear all" -msgstr "Vše vymazat" - -#: contrib/admin/media/js/dateparse.js:26 -#: contrib/admin/media/js/calendar.js:24 -msgid "January February March April May June July August September October November December" -msgstr "Leden Únor Březen Duben Květen Červen Červenec Srpen Září Říjen Listopad Prosinec" - -#: contrib/admin/media/js/dateparse.js:27 -#, fuzzy -msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday" -msgstr "Neděle Pondělí Úterý Středa Čtvrtek Pátek Sobota" +msgstr "Vymazat vše" #: contrib/admin/media/js/calendar.js:25 -#, fuzzy msgid "S M T W T F S" msgstr "N P U S C P S" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45 -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80 +#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34 +#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72 +msgid "Show" +msgstr "Ukázat" + +#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63 +msgid "Hide" +msgstr "Skrýt" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81 msgid "Now" msgstr "Nyní" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51 msgid "Clock" msgstr "Hodiny" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78 msgid "Choose a time" msgstr "Vyberte čas" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82 msgid "Midnight" msgstr "Půlnoc" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83 msgid "6 a.m." msgstr "6 ráno" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84 msgid "Noon" msgstr "Poledne" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87 -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183 msgid "Cancel" msgstr "Storno" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111 -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177 msgid "Today" msgstr "Dnes" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132 msgid "Calendar" msgstr "Kalendář" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175 msgid "Yesterday" msgstr "Včera" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179 msgid "Tomorrow" msgstr "Zítra" - diff --git a/django/conf/locale/fa/LC_MESSAGES/django.mo b/django/conf/locale/fa/LC_MESSAGES/django.mo new file mode 100644 index 0000000000..c16335d237 Binary files /dev/null and b/django/conf/locale/fa/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/fa/LC_MESSAGES/django.po b/django/conf/locale/fa/LC_MESSAGES/django.po new file mode 100644 index 0000000000..0d4e74ccea --- /dev/null +++ b/django/conf/locale/fa/LC_MESSAGES/django.po @@ -0,0 +1,2854 @@ +# Persian translation of Django. +# Copyright (C) 2007 THE Django'S COPYRIGHT HOLDER +# This file is distributed under the same license as the Django package. +# +# +msgid "" +msgstr "" +"Project-Id-Version: Django 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-06-19 15:49+0330\n" +"PO-Revision-Date: 2007-06-19 16:14+0330\n" +"Last-Translator: Reza MohammadiTo 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 "" + +#: contrib/admin/templates/admin_doc/bookmarklets.html:19 +msgid "Documentation for this page" +msgstr "" + +#: contrib/admin/templates/admin_doc/bookmarklets.html:20 +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" + +#: contrib/admin/templates/admin_doc/bookmarklets.html:22 +msgid "Show object ID" +msgstr "" + +#: contrib/admin/templates/admin_doc/bookmarklets.html:23 +msgid "" +"Shows the content-type and unique ID for pages that represent a single " +"object." +msgstr "" + +#: contrib/admin/templates/admin_doc/bookmarklets.html:25 +msgid "Edit this object (current window)" +msgstr "" + +#: contrib/admin/templates/admin_doc/bookmarklets.html:26 +msgid "Jumps to the admin page for pages that represent a single object." +msgstr "" + +#: contrib/admin/templates/admin_doc/bookmarklets.html:28 +msgid "Edit this object (new window)" +msgstr "" + +#: contrib/admin/templates/admin_doc/bookmarklets.html:29 +msgid "As above, but opens the admin page in a new window." +msgstr "" + +#: contrib/admin/templates/registration/password_reset_email.html:2 +msgid "You're receiving this e-mail because you requested a password reset" +msgstr "درخواستی برای ایجاد گذرواژهٔ جدید با آدرس شما به ما رسیده است و ما این نامه را برای شما فرستادیم" + +#: contrib/admin/templates/registration/password_reset_email.html:3 +#, python-format +msgid "for your user account at %(site_name)s" +msgstr "برای حساب کاربریتان در %(site_name)s" + +#: contrib/admin/templates/registration/password_reset_email.html:5 +#, python-format +msgid "Your new password is: %(new_password)s" +msgstr "گذرواژهٔ جدیدتان: %(new_password)s" + +#: contrib/admin/templates/registration/password_reset_email.html:7 +msgid "Feel free to change this password by going to this page:" +msgstr "با رفتن به صفحهٔ زیر میتوانید گذرواژهتان را عوض کنید:" + +#: contrib/admin/templates/registration/password_reset_email.html:11 +msgid "Your username, in case you've forgotten:" +msgstr "نام کاربریتان، اگر یادتان رفته است:" + +#: contrib/admin/templates/registration/password_reset_email.html:13 +msgid "Thanks for using our site!" +msgstr "متشکر از استفادهٔ شما از وبگاه ما" + +#: contrib/admin/templates/registration/password_reset_email.html:15 +#, python-format +msgid "The %(site_name)s team" +msgstr "گروه %(site_name)s" + +#: contrib/admin/templates/registration/logged_out.html:8 +msgid "Thanks for spending some quality time with the Web site today." +msgstr "متشکر از اینکه مدتی از وقت خود را به ما اختصاص دادید." + +#: contrib/admin/templates/registration/logged_out.html:10 +msgid "Log in again" +msgstr "ورود دوباره" + +#: contrib/admin/templates/registration/password_reset_form.html:4 +#: contrib/admin/templates/registration/password_reset_form.html:6 +#: contrib/admin/templates/registration/password_reset_form.html:10 +#: contrib/admin/templates/registration/password_reset_done.html:4 +msgid "Password reset" +msgstr "ایجاد گذرواژهٔ جدید" + +#: contrib/admin/templates/registration/password_reset_form.html:12 +msgid "" +"Forgotten your password? Enter your e-mail address below, and we'll reset " +"your password and e-mail the new one to you." +msgstr "" + +#: contrib/admin/templates/registration/password_reset_form.html:16 +msgid "E-mail address:" +msgstr "آدرس پست الکترونیکی:" + +#: contrib/admin/templates/registration/password_reset_form.html:16 +msgid "Reset my password" +msgstr "ایجاد گذرواژهٔ جدید" + +#: contrib/admin/templates/registration/password_reset_done.html:6 +#: contrib/admin/templates/registration/password_reset_done.html:10 +msgid "Password reset successful" +msgstr "گذرواژهٔ جدید ایجاد شد." + +#: contrib/admin/templates/registration/password_reset_done.html:12 +msgid "" +"We've e-mailed a new password to the e-mail address you submitted. You " +"should be receiving it shortly." +msgstr "ما به آدرس پست اکترونیکیای که وارد کردید یک گذرواژهٔ جدید فرستادیم. به زودی به شما میرسد." + +#: contrib/admin/templates/registration/password_change_form.html:4 +#: contrib/admin/templates/registration/password_change_form.html:6 +#: contrib/admin/templates/registration/password_change_form.html:10 +#: contrib/admin/templates/registration/password_change_done.html:4 +msgid "Password change" +msgstr "تغییر گذرواژه" + +#: contrib/admin/templates/registration/password_change_form.html:12 +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "گذرواژهٔ قدیمی خود را، برای امنیت بیشتر، وارد کنید و سپس گذرواژهٔ جدیدتان را دوبار وارد کنید تا " +"ما بتوانیم چک کنیم که به درستی تایپ کردهاید." + +#: contrib/admin/templates/registration/password_change_form.html:17 +msgid "Old password:" +msgstr "گذرواژهٔ قدیمی" + +#: contrib/admin/templates/registration/password_change_form.html:19 +msgid "New password:" +msgstr "گذرواژهٔ جدید" + +#: contrib/admin/templates/registration/password_change_form.html:21 +msgid "Confirm password:" +msgstr "تکرار گذرواژه" + +#: contrib/admin/templates/registration/password_change_form.html:23 +msgid "Change my password" +msgstr "تغییر گذرواژهٔ من" + +#: contrib/admin/templates/registration/password_change_done.html:6 +#: contrib/admin/templates/registration/password_change_done.html:10 +msgid "Password change successful" +msgstr "گذرواژه تغییر یافت." + +#: contrib/admin/templates/registration/password_change_done.html:12 +msgid "Your password was changed." +msgstr "گذرواژهٔ شما تغییر یافت." + +#: contrib/redirects/models.py:7 +msgid "redirect from" +msgstr "" + +#: contrib/redirects/models.py:8 +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" + +#: contrib/redirects/models.py:9 +msgid "redirect to" +msgstr "" + +#: contrib/redirects/models.py:10 +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" + +#: contrib/redirects/models.py:13 +msgid "redirect" +msgstr "" + +#: contrib/redirects/models.py:14 +msgid "redirects" +msgstr "" + +#: contrib/sessions/models.py:68 +msgid "session key" +msgstr "" + +#: contrib/sessions/models.py:69 +msgid "session data" +msgstr "اطلاعات نشست" + +#: contrib/sessions/models.py:70 +msgid "expire date" +msgstr "تاریخ انقضاء" + +#: contrib/sessions/models.py:74 +msgid "session" +msgstr "نشست" + +#: contrib/sessions/models.py:75 +msgid "sessions" +msgstr "نشستها" + +#: contrib/comments/models.py:67 contrib/comments/models.py:166 +msgid "object ID" +msgstr "" + +#: contrib/comments/models.py:68 +msgid "headline" +msgstr "" + +#: contrib/comments/models.py:69 contrib/comments/models.py:90 +#: contrib/comments/models.py:167 +msgid "comment" +msgstr "نظر" + +#: contrib/comments/models.py:70 +msgid "rating #1" +msgstr "" + +#: contrib/comments/models.py:71 +msgid "rating #2" +msgstr "" + +#: contrib/comments/models.py:72 +msgid "rating #3" +msgstr "" + +#: contrib/comments/models.py:73 +msgid "rating #4" +msgstr "" + +#: contrib/comments/models.py:74 +msgid "rating #5" +msgstr "" + +#: contrib/comments/models.py:75 +msgid "rating #6" +msgstr "" + +#: contrib/comments/models.py:76 +msgid "rating #7" +msgstr "" + +#: contrib/comments/models.py:77 +msgid "rating #8" +msgstr "" + +#: contrib/comments/models.py:82 +msgid "is valid rating" +msgstr "" + +#: contrib/comments/models.py:83 contrib/comments/models.py:169 +msgid "date/time submitted" +msgstr "" + +#: contrib/comments/models.py:84 contrib/comments/models.py:170 +msgid "is public" +msgstr "عمومی است" + +#: contrib/comments/models.py:86 +msgid "is removed" +msgstr "پاک شده است" + +#: contrib/comments/models.py:86 +msgid "" +"Check this box if the comment is inappropriate. A \"This comment has been " +"removed\" message will be displayed instead." +msgstr "" + +#: contrib/comments/models.py:91 +msgid "comments" +msgstr "نظرها" + +#: contrib/comments/models.py:131 contrib/comments/models.py:207 +msgid "Content object" +msgstr "شئ نظر" + +#: contrib/comments/models.py:159 +#, python-format +msgid "" +"Posted by %(user)s at %(date)s\n" +"\n" +"%(comment)s\n" +"\n" +"http://%(domain)s%(url)s" +msgstr "" + +#: contrib/comments/models.py:168 +msgid "person's name" +msgstr "نام شخص" + +#: contrib/comments/models.py:171 +msgid "ip address" +msgstr "" + +#: contrib/comments/models.py:173 +msgid "approved by staff" +msgstr "" + +#: contrib/comments/models.py:176 +msgid "free comment" +msgstr "" + +#: contrib/comments/models.py:177 +msgid "free comments" +msgstr "" + +#: contrib/comments/models.py:233 +msgid "score" +msgstr "امتیاز" + +#: contrib/comments/models.py:234 +msgid "score date" +msgstr "تاریخ امتیاز" + +#: contrib/comments/models.py:237 +msgid "karma score" +msgstr "امتیاز عملکرد" + +#: contrib/comments/models.py:238 +msgid "karma scores" +msgstr "امتیازهای عملکرد" + +#: contrib/comments/models.py:242 +#, python-format +msgid "%(score)d rating by %(user)s" +msgstr "" + +#: contrib/comments/models.py:258 +#, python-format +msgid "" +"This comment was flagged by %(user)s:\n" +"\n" +"%(text)s" +msgstr "" + +#: contrib/comments/models.py:265 +msgid "flag date" +msgstr "تاریخ پرچم" + +#: contrib/comments/models.py:268 +msgid "user flag" +msgstr "پرچم کاربر" + +#: contrib/comments/models.py:269 +msgid "user flags" +msgstr "پرچمهای کاربر" + +#: contrib/comments/models.py:273 +#, python-format +msgid "Flag by %r" +msgstr "" + +#: contrib/comments/models.py:278 +msgid "deletion date" +msgstr "" + +#: contrib/comments/models.py:280 +msgid "moderator deletion" +msgstr "" + +#: contrib/comments/models.py:281 +msgid "moderator deletions" +msgstr "" + +#: contrib/comments/models.py:285 +#, python-format +msgid "Moderator deletion by %r" +msgstr "" + +#: contrib/comments/views/comments.py:27 +msgid "" +"This rating is required because you've entered at least one other rating." +msgstr "" + +#: contrib/comments/views/comments.py:111 +#, python-format +msgid "" +"This comment was posted by a user who has posted fewer than %(count)s " +"comment:\n" +"\n" +"%(text)s" +"This comment was posted by a user who has posted fewer than %(count)s " +"comments:\n" +"\n" +"%(text)s" +msgstr "" + +#: contrib/comments/views/comments.py:116 +#, python-format +msgid "" +"This comment was posted by a sketchy user:\n" +"\n" +"%(text)s" +msgstr "" + +#: contrib/comments/views/comments.py:188 +#: contrib/comments/views/comments.py:280 +msgid "Only POSTs are allowed" +msgstr "" + +#: contrib/comments/views/comments.py:192 +#: contrib/comments/views/comments.py:284 +msgid "One or more of the required fields wasn't submitted" +msgstr "" + +#: contrib/comments/views/comments.py:196 +#: contrib/comments/views/comments.py:286 +msgid "Somebody tampered with the comment form (security violation)" +msgstr "" + +#: contrib/comments/views/comments.py:206 +#: contrib/comments/views/comments.py:292 +msgid "" +"The comment form had an invalid 'target' parameter -- the object ID was " +"invalid" +msgstr "" + +#: contrib/comments/views/comments.py:257 +#: contrib/comments/views/comments.py:321 +msgid "The comment form didn't provide either 'preview' or 'post'" +msgstr "" + +#: contrib/comments/views/karma.py:19 +msgid "Anonymous users cannot vote" +msgstr "" + +#: contrib/comments/views/karma.py:23 +msgid "Invalid comment ID" +msgstr "" + +#: contrib/comments/views/karma.py:25 +msgid "No voting for yourself" +msgstr "" + +#: contrib/comments/templates/comments/form.html:8 +msgid "Forgotten your password?" +msgstr "گذرواژهتان را فراموش کردهاید؟" + +#: contrib/comments/templates/comments/form.html:12 +msgid "Ratings" +msgstr "" + +#: contrib/comments/templates/comments/form.html:12 +#: contrib/comments/templates/comments/form.html:23 +msgid "Required" +msgstr "لازم" + +#: contrib/comments/templates/comments/form.html:12 +#: contrib/comments/templates/comments/form.html:23 +msgid "Optional" +msgstr "اختیاری" + +#: contrib/comments/templates/comments/form.html:23 +msgid "Post a photo" +msgstr "ارسال عکس" + +#: contrib/comments/templates/comments/form.html:28 +#: contrib/comments/templates/comments/freeform.html:5 +msgid "Comment:" +msgstr "نظر:" + +#: contrib/comments/templates/comments/form.html:35 +#: contrib/comments/templates/comments/freeform.html:10 +msgid "Preview comment" +msgstr "پیشنمایش نظر" + +#: contrib/comments/templates/comments/freeform.html:4 +msgid "Your name:" +msgstr "نام شما:" + +#: contrib/auth/models.py:44 contrib/auth/models.py:64 +msgid "name" +msgstr "نام" + +#: contrib/auth/models.py:46 +msgid "codename" +msgstr "نام کد" + +#: contrib/auth/models.py:49 +msgid "permission" +msgstr "اجازه" + +#: contrib/auth/models.py:50 contrib/auth/models.py:65 +msgid "permissions" +msgstr "اجازهها" + +#: contrib/auth/models.py:68 +msgid "group" +msgstr "گروه" + +#: contrib/auth/models.py:69 contrib/auth/models.py:109 +msgid "groups" +msgstr "گروهها" + +#: contrib/auth/models.py:99 +msgid "username" +msgstr "نام کاربری" + +#: contrib/auth/models.py:99 +msgid "" +"Required. 30 characters or fewer. Alphanumeric characters only (letters, " +"digits and underscores)." +msgstr "" + +#: contrib/auth/models.py:100 +msgid "first name" +msgstr "نام" + +#: contrib/auth/models.py:101 +msgid "last name" +msgstr "نام خانوادگی" + +#: contrib/auth/models.py:102 +msgid "e-mail address" +msgstr "آدرس پست الکترونیکی" + +#: contrib/auth/models.py:103 +msgid "password" +msgstr "گذرواژه" + +#: contrib/auth/models.py:103 +msgid "" +"Use '[algo]$[salt]$[hexdigest]' or use the change " +"password form." +msgstr "" + +#: contrib/auth/models.py:104 +msgid "staff status" +msgstr "کارمند" + +#: contrib/auth/models.py:104 +msgid "Designates whether the user can log into this admin site." +msgstr "" + +#: contrib/auth/models.py:105 +msgid "active" +msgstr "فعال" + +#: contrib/auth/models.py:105 +msgid "" +"Designates whether this user can log into the Django admin. Unselect this " +"instead of deleting accounts." +msgstr "" + +#: contrib/auth/models.py:106 +msgid "superuser status" +msgstr "ابرکاربر" + +#: contrib/auth/models.py:106 +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" + +#: contrib/auth/models.py:107 +msgid "last login" +msgstr "آخرین ورود" + +#: contrib/auth/models.py:108 +msgid "date joined" +msgstr "تاریخ پیوستن" + +#: contrib/auth/models.py:110 +msgid "" +"In addition to the permissions manually assigned, this user will also get " +"all permissions granted to each group he/she is in." +msgstr "" + +#: contrib/auth/models.py:111 +msgid "user permissions" +msgstr "اجازههای کاربر" + +#: contrib/auth/models.py:115 +msgid "user" +msgstr "کاربر" + +#: contrib/auth/models.py:116 +msgid "users" +msgstr "کاربرها" + +#: contrib/auth/models.py:122 +msgid "Personal info" +msgstr "اطلاعات شخصی" + +#: contrib/auth/models.py:123 +msgid "Permissions" +msgstr "اجازهها" + +#: contrib/auth/models.py:124 +msgid "Important dates" +msgstr "تاریخهای مهم" + +#: contrib/auth/models.py:125 +msgid "Groups" +msgstr "گروهها" + +#: contrib/auth/models.py:269 +msgid "message" +msgstr "پیغام" + +#: contrib/auth/models.py:282 +msgid "AnonymousUser" +msgstr "کاربر ناشناس" + +#: contrib/auth/views.py:40 +msgid "Logged out" +msgstr "خارج شد" + +#: contrib/auth/forms.py:17 contrib/auth/forms.py:138 +msgid "The two password fields didn't match." +msgstr "دو فیلد گذرواژه با هم مطابقت ندارند." + +#: contrib/auth/forms.py:25 +msgid "A user with that username already exists." +msgstr "کاربری با این نام کاربری وجود دارد." + +#: contrib/auth/forms.py:53 +msgid "" +"Your Web browser doesn't appear to have cookies enabled. Cookies are " +"required for logging in." +msgstr "" + +#: contrib/auth/forms.py:62 +msgid "This account is inactive." +msgstr "این حساب غیرفعال است." + +#: contrib/auth/forms.py:85 +msgid "" +"That e-mail address doesn't have an associated user account. Are you sure " +"you've registered?" +msgstr "" + +#: contrib/auth/forms.py:117 +msgid "The two 'new password' fields didn't match." +msgstr "دو فیلد «گذرواژهٔ جدید» با هم مطابقت ندارند." + +#: contrib/auth/forms.py:124 +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "گذرواژهٔ قدیمی شما اشتباه بود. لطفاً دوباره وارد کنید." + +#: contrib/contenttypes/models.py:36 +msgid "python model class name" +msgstr "" + +#: contrib/contenttypes/models.py:39 +msgid "content type" +msgstr "نوع محتوا" + +#: contrib/contenttypes/models.py:40 +msgid "content types" +msgstr "نوعهای محتوا" + +#: contrib/humanize/templatetags/humanize.py:17 +msgid "th" +msgstr "اُم" + +#: contrib/humanize/templatetags/humanize.py:17 +msgid "st" +msgstr "اُم" + +#: contrib/humanize/templatetags/humanize.py:17 +msgid "nd" +msgstr "اُم" + +#: contrib/humanize/templatetags/humanize.py:17 +msgid "rd" +msgstr "اُم" + +#: contrib/humanize/templatetags/humanize.py:47 +#, python-format +msgid "%(value).1f million" +msgstr "" + +#: contrib/humanize/templatetags/humanize.py:50 +#, python-format +msgid "%(value).1f billion" +msgstr "" + +#: contrib/humanize/templatetags/humanize.py:53 +#, python-format +msgid "%(value).1f trillion" +msgstr "" + +#: contrib/humanize/templatetags/humanize.py:68 +msgid "one" +msgstr "یک" + +#: contrib/humanize/templatetags/humanize.py:68 +msgid "two" +msgstr "دو" + +#: contrib/humanize/templatetags/humanize.py:68 +msgid "three" +msgstr "سه" + +#: contrib/humanize/templatetags/humanize.py:68 +msgid "four" +msgstr "چهار" + +#: contrib/humanize/templatetags/humanize.py:68 +msgid "five" +msgstr "پنج" + +#: contrib/humanize/templatetags/humanize.py:68 +msgid "six" +msgstr "شش" + +#: contrib/humanize/templatetags/humanize.py:68 +msgid "seven" +msgstr "هفت" + +#: contrib/humanize/templatetags/humanize.py:68 +msgid "eight" +msgstr "هشت" + +#: contrib/humanize/templatetags/humanize.py:68 +msgid "nine" +msgstr "نُه" + +#: db/models/manipulators.py:307 +#, python-format +msgid "%(object)s with this %(type)s already exists for the given %(field)s." +msgstr "" + +#: db/models/fields/__init__.py:46 +#, python-format +msgid "%(optname)s with this %(fieldname)s already exists." +msgstr "" + +#: db/models/fields/__init__.py:373 +msgid "This value must be an integer." +msgstr "" + +#: db/models/fields/__init__.py:408 +msgid "This value must be either True or False." +msgstr "" + +#: db/models/fields/__init__.py:429 +msgid "This field cannot be null." +msgstr "" + +#: db/models/fields/__init__.py:592 +msgid "This value must be a decimal number." +msgstr "" + +#: db/models/fields/__init__.py:695 +msgid "Enter a valid filename." +msgstr "" + +#: db/models/fields/__init__.py:818 +msgid "This value must be either None, True or False." +msgstr "" + +#: db/models/fields/related.py:53 +#, python-format +msgid "Please enter a valid %s." +msgstr "" + +#: db/models/fields/related.py:642 +msgid "Separate multiple IDs with commas." +msgstr "" + +#: db/models/fields/related.py:644 +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" + +#: db/models/fields/related.py:691 +#, python-format +msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." +"Please enter valid %(self)s IDs. The values %(value)r are invalid." +msgstr "" + +#: utils/timesince.py:12 +msgid "year" +msgstr "سال" + +#: utils/timesince.py:13 +msgid "month" +msgstr "ماه" + +#: utils/timesince.py:14 +msgid "week" +msgstr "هفته" + +#: utils/timesince.py:15 +msgid "day" +msgstr "روز" + +#: utils/timesince.py:16 +msgid "hour" +msgstr "ساعت" + +#: utils/timesince.py:17 +msgid "minute" +msgstr "دقیقه" + +#: utils/timesince.py:40 +#, python-format +msgid "%d milliseconds" +msgstr "%d میلیثانیه" + +#: utils/timesince.py:41 +#, python-format +msgid "%(number)d %(type)s" +msgstr "" + +#: utils/timesince.py:47 +#, python-format +msgid ", %(number)d %(type)s" +msgstr "" + +#: utils/dateformat.py:40 +msgid "p.m." +msgstr "ب.ظ." + +#: utils/dateformat.py:41 +msgid "a.m." +msgstr "صبح" + +#: utils/dateformat.py:46 +msgid "PM" +msgstr "بعد از ظهر" + +#: utils/dateformat.py:47 +msgid "AM" +msgstr "صبح" + +#: utils/dateformat.py:95 +msgid "midnight" +msgstr "" + +#: utils/dateformat.py:97 +msgid "noon" +msgstr "" + +#: utils/dates.py:6 +msgid "Monday" +msgstr "" + +#: utils/dates.py:6 +msgid "Tuesday" +msgstr "" + +#: utils/dates.py:6 +msgid "Wednesday" +msgstr "" + +#: utils/dates.py:6 +msgid "Thursday" +msgstr "" + +#: utils/dates.py:6 +msgid "Friday" +msgstr "" + +#: utils/dates.py:7 +msgid "Saturday" +msgstr "" + +#: utils/dates.py:7 +msgid "Sunday" +msgstr "" + +#: utils/dates.py:14 +msgid "January" +msgstr "ژانویه" + +#: utils/dates.py:14 +msgid "February" +msgstr "فوریه" + +#: utils/dates.py:14 utils/dates.py:27 +msgid "March" +msgstr "مارس" + +#: utils/dates.py:14 utils/dates.py:27 +msgid "April" +msgstr "آوریل" + +#: utils/dates.py:14 utils/dates.py:27 +msgid "May" +msgstr "مه" + +#: utils/dates.py:14 utils/dates.py:27 +msgid "June" +msgstr "ژوئن" + +#: utils/dates.py:15 utils/dates.py:27 +msgid "July" +msgstr "ژوئیه" + +#: utils/dates.py:15 +msgid "August" +msgstr "اوت" + +#: utils/dates.py:15 +msgid "September" +msgstr "سپتامبر" + +#: utils/dates.py:15 +msgid "October" +msgstr "اکتبر" + +#: utils/dates.py:15 +msgid "November" +msgstr "نوامبر" + +#: utils/dates.py:16 +msgid "December" +msgstr "دسامبر" + +#: utils/dates.py:19 +msgid "jan" +msgstr "ژانویه" + +#: utils/dates.py:19 +msgid "feb" +msgstr "فوریه" + +#: utils/dates.py:19 +msgid "mar" +msgstr "مارس" + +#: utils/dates.py:19 +msgid "apr" +msgstr "آوریل" + +#: utils/dates.py:19 +msgid "may" +msgstr "مه" + +#: utils/dates.py:19 +msgid "jun" +msgstr "ژوئن" + +#: utils/dates.py:20 +msgid "jul" +msgstr "ژوئیه" + +#: utils/dates.py:20 +msgid "aug" +msgstr "اوت" + +#: utils/dates.py:20 +msgid "sep" +msgstr "سپتامبر" + +#: utils/dates.py:20 +msgid "oct" +msgstr "اکتبر" + +#: utils/dates.py:20 +msgid "nov" +msgstr "نوامبر" + +#: utils/dates.py:20 +msgid "dec" +msgstr "دسامبر" + +#: utils/dates.py:27 +msgid "Jan." +msgstr "ژانویه" + +#: utils/dates.py:27 +msgid "Feb." +msgstr "فوریه" + +#: utils/dates.py:28 +msgid "Aug." +msgstr "اوت" + +#: utils/dates.py:28 +msgid "Sept." +msgstr "سپتامبر" + +#: utils/dates.py:28 +msgid "Oct." +msgstr "اکتبر" + +#: utils/dates.py:28 +msgid "Nov." +msgstr "نوامبر" + +#: utils/dates.py:28 +msgid "Dec." +msgstr "دسامبر" + +#: utils/translation/trans_real.py:358 +msgid "DATE_FORMAT" +msgstr "" + +#: utils/translation/trans_real.py:359 +msgid "DATETIME_FORMAT" +msgstr "" + +#: utils/translation/trans_real.py:360 +msgid "TIME_FORMAT" +msgstr "" + +#: utils/translation/trans_real.py:376 +msgid "YEAR_MONTH_FORMAT" +msgstr "" + +#: utils/translation/trans_real.py:377 +msgid "MONTH_DAY_FORMAT" +msgstr "" + +#: template/defaultfilters.py:491 +msgid "yes,no,maybe" +msgstr "بله،خیر،شاید" + +#: template/defaultfilters.py:520 +#, python-format +msgid "%(size)d byte" +msgstr "%(size)d یایت" + +#: template/defaultfilters.py:522 +#, python-format +msgid "%.1f KB" +msgstr "" + +#: template/defaultfilters.py:524 +#, python-format +msgid "%.1f MB" +msgstr "" + +#: template/defaultfilters.py:525 +#, python-format +msgid "%.1f GB" +msgstr "" + diff --git a/django/conf/locale/fa/LC_MESSAGES/djangojs.mo b/django/conf/locale/fa/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000000..8d3f8e505f Binary files /dev/null and b/django/conf/locale/fa/LC_MESSAGES/djangojs.mo differ diff --git a/django/conf/locale/fa/LC_MESSAGES/djangojs.po b/django/conf/locale/fa/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000000..255cb71870 --- /dev/null +++ b/django/conf/locale/fa/LC_MESSAGES/djangojs.po @@ -0,0 +1,118 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHORTo 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" +"Para instalar bookmarklets, arrastre a ligazón á súa\n" +"barra de favoritos ou marcadores, ou faga clic co botón dereito\n" +"e engádao aos marcadores. Agora pode usar o bookmarklet dende\n" +" calquera páxina do sitio web. Teña en conta que algúns destes\n" +"bookmarklets precisan que estea a visitar o sitio dende un ordenador\n" +"designado coma \"interno\" (fale co administrador do sistema se\n" +"non está seguro de que o seu ordenador é \"interno\" .
\n" + +#: contrib/admin/templates/admin_doc/bookmarklets.html:19 +msgid "Documentation for this page" +msgstr "Documentación para esta páxina" + +#: contrib/admin/templates/admin_doc/bookmarklets.html:20 +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "Salta á documentación para a vista que xera a páxina." + +#: contrib/admin/templates/admin_doc/bookmarklets.html:22 +msgid "Show object ID" +msgstr "Amosar ID do obxecto" + +#: contrib/admin/templates/admin_doc/bookmarklets.html:23 +msgid "" +"Shows the content-type and unique ID for pages that represent a single " +"object." +msgstr "" +"Amosa o tipo de contido e a ID única para páxinas que representan un obxecto " +"determinado." + +#: contrib/admin/templates/admin_doc/bookmarklets.html:25 +msgid "Edit this object (current window)" +msgstr "Editar este obxecto (nesta fiestra)" + +#: contrib/admin/templates/admin_doc/bookmarklets.html:26 +msgid "Jumps to the admin page for pages that represent a single object." +msgstr "" +"Salta á páxina de administración para páxina que representan un obxecto " +"determinado." + +#: contrib/admin/templates/admin_doc/bookmarklets.html:28 +msgid "Edit this object (new window)" +msgstr "Editar este obxecto (nunha nova fiestra)" + +#: contrib/admin/templates/admin_doc/bookmarklets.html:29 +msgid "As above, but opens the admin page in a new window." +msgstr "Como enriba, pero abre a páxina de administración nunha nova fiestra." + +#: contrib/admin/templates/registration/logged_out.html:8 +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Grazas polo tempo que dedicou ao sitio web." + +#: contrib/admin/templates/registration/logged_out.html:10 +msgid "Log in again" +msgstr "Entrar de novo" + +#: contrib/admin/templates/registration/password_change_done.html:4 +#: contrib/admin/templates/registration/password_change_form.html:4 +#: contrib/admin/templates/registration/password_change_form.html:6 +#: contrib/admin/templates/registration/password_change_form.html:10 +msgid "Password change" +msgstr "Cambiar o contrasinal" + +#: contrib/admin/templates/registration/password_change_done.html:6 +#: contrib/admin/templates/registration/password_change_done.html:10 +msgid "Password change successful" +msgstr "O seu contrasinal cambiouse correctamente." + +#: contrib/admin/templates/registration/password_change_done.html:12 +msgid "Your password was changed." +msgstr "Cambiouse o seu contrasinal." + +#: contrib/admin/templates/registration/password_change_form.html:12 +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Por razóns de seguridade, introduza o contrasinal actual. Despois introduza " +"dúas veces o contrasinal para verificarmos que o escribiu correctamente." + +#: contrib/admin/templates/registration/password_change_form.html:17 +msgid "Old password:" +msgstr "Contrasinal actual:" + +#: contrib/admin/templates/registration/password_change_form.html:19 +msgid "New password:" +msgstr "Contrasinal novo:" + +#: contrib/admin/templates/registration/password_change_form.html:21 +msgid "Confirm password:" +msgstr "Confirmar contrasinal:" + +#: contrib/admin/templates/registration/password_change_form.html:23 +msgid "Change my password" +msgstr "Cambiar o contrasinal" + +#: 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 "Recuperar o contrasinal" + +#: contrib/admin/templates/registration/password_reset_done.html:6 +#: contrib/admin/templates/registration/password_reset_done.html:10 +msgid "Password reset successful" +msgstr "O contrasinal foi recuperado correctamente" + +#: contrib/admin/templates/registration/password_reset_done.html:12 +msgid "" +"We've e-mailed a new password to the e-mail address you submitted. You " +"should be receiving it shortly." +msgstr "" +"Acabamos de enviarlle un novo contrasinal ao enderezo de correo indicado. " +"Debería recibilo en breve." + +#: contrib/admin/templates/registration/password_reset_email.html:2 +msgid "You're receiving this e-mail because you requested a password reset" +msgstr "Recibe esta mensaxe porque solicitou recuperar o contrasinal" + +#: contrib/admin/templates/registration/password_reset_email.html:3 +#, python-format +msgid "for your user account at %(site_name)s" +msgstr "para a súa conta de usuario en %(site_name)s" + +#: contrib/admin/templates/registration/password_reset_email.html:5 +#, python-format +msgid "Your new password is: %(new_password)s" +msgstr "O seu novo contrasinal é: %(new_password)s" + +#: contrib/admin/templates/registration/password_reset_email.html:7 +msgid "Feel free to change this password by going to this page:" +msgstr "Pode cambiar este contrasinal visitando esta páxina:" + +#: contrib/admin/templates/registration/password_reset_email.html:11 +msgid "Your username, in case you've forgotten:" +msgstr "No caso de que o esquecese, o seu nome de usuario é:" + +#: contrib/admin/templates/registration/password_reset_email.html:13 +msgid "Thanks for using our site!" +msgstr "Grazas por usar o noso sitio web!" + +#: contrib/admin/templates/registration/password_reset_email.html:15 +#, python-format +msgid "The %(site_name)s team" +msgstr "O equipo de %(site_name)s" + +#: contrib/admin/templates/registration/password_reset_form.html:12 +msgid "" +"Forgotten your password? Enter your e-mail address below, and we'll reset " +"your password and e-mail the new one to you." +msgstr "" +"Esqueceu o contrasinal? Introduza o seu enderezo de correo electrónico " +"embaixo e enviarémoslle un novo contrasinal." + +#: contrib/admin/templates/registration/password_reset_form.html:16 +msgid "E-mail address:" +msgstr "Enderezo de correo electrónico:" + +#: contrib/admin/templates/registration/password_reset_form.html:16 +msgid "Reset my password" +msgstr "Recuperar o meu contrasinal" + +#: contrib/admin/templates/widget/date_time.html:3 +msgid "Date:" +msgstr "Data:" + +#: contrib/admin/templates/widget/date_time.html:4 +msgid "Time:" +msgstr "Hora" + +#: contrib/admin/templates/widget/file.html:2 +msgid "Currently:" +msgstr "Agora:" + +#: contrib/admin/templates/widget/file.html:3 +msgid "Change:" +msgstr "Modificar:" + +#: contrib/admin/templatetags/admin_list.py:249 +msgid "All dates" +msgstr "Todas as datas" + +#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257 +#, python-format +msgid "The %(name)s \"%(obj)s\" was added successfully." +msgstr "Engadiuse correctamente o/a %(name)s \"%(obj)s\"." + +#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261 +#: contrib/admin/views/main.py:347 +msgid "You may edit it again below." +msgstr "Pode editalo embaixo." + +#: contrib/admin/views/auth.py:30 +msgid "Add user" +msgstr "Engadir usuario" + +#: contrib/admin/views/auth.py:57 +msgid "Password changed successfully." +msgstr "O contrasinal cambiouse correctamente." + +#: contrib/admin/views/auth.py:64 +#, python-format +msgid "Change password: %s" +msgstr "Cambiar contrasinal: %s" + +#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:60 +msgid "" +"Please enter a correct username and password. Note that both fields are case-" +"sensitive." +msgstr "" +"Insira un nome de usuario e un contrasinal correctos. Teña en conta que nos " +"dous campos se distingue entre maiúsculas e minúsculas." + +#: contrib/admin/views/decorators.py:62 +msgid "" +"Please log in again, because your session has expired. Don't worry: Your " +"submission has been saved." +msgstr "" +"Ten que identicarse outra vez porque a súa sesión expirou. Non se preocupe, " +"o que enviou quedou gardado." + +#: contrib/admin/views/decorators.py:69 +msgid "" +"Looks like your browser isn't configured to accept cookies. Please enable " +"cookies, reload this page, and try again." +msgstr "" +"Semella que o seu navegador non está configurado para aceptar 'cookies'. " +"Por favor, habilite as 'cookies', recargue a páxina e ténteo de novo." + +#: contrib/admin/views/decorators.py:83 +msgid "Usernames cannot contain the '@' character." +msgstr "Os nomes de usuario non poden conter o carácter '@'." + +#: contrib/admin/views/decorators.py:85 +#, python-format +msgid "Your e-mail address is not your username. Try '%s' instead." +msgstr "" +"O seu enderezo de correo electrónico non é o seu nome de usuario. Probe con " +"'%s'." + +#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48 +#: contrib/admin/views/doc.py:50 +msgid "tag:" +msgstr "etiqueta:" + +#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79 +#: contrib/admin/views/doc.py:81 +msgid "filter:" +msgstr "filtro:" + +#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137 +#: contrib/admin/views/doc.py:139 +msgid "view:" +msgstr "vista:" + +#: contrib/admin/views/doc.py:164 +#, python-format +msgid "App %r not found" +msgstr "Non se atopou a aplicación %r" + +#: contrib/admin/views/doc.py:171 +#, python-format +msgid "Model %(name)r not found in app %(label)r" +msgstr "Non se atopou o modelo %(name)r na aplicación %(label)r" + +#: contrib/admin/views/doc.py:183 +#, python-format +msgid "the related `%(label)s.%(type)s` object" +msgstr "o obxecto `%(label)s.%(type)s` relacionado" + +#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205 +#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224 +msgid "model:" +msgstr "modelo:" + +#: contrib/admin/views/doc.py:214 +#, python-format +msgid "related `%(label)s.%(name)s` objects" +msgstr "obxectos `%(label)s.%(name)s` relacionados" + +#: contrib/admin/views/doc.py:219 +#, python-format +msgid "all %s" +msgstr "todos os %s" + +#: contrib/admin/views/doc.py:224 +#, python-format +msgid "number of %s" +msgstr "número de %s" + +#: contrib/admin/views/doc.py:229 +#, python-format +msgid "Fields on %s objects" +msgstr "Campos dos obxectos %s" + +#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:302 +#: contrib/admin/views/doc.py:304 contrib/admin/views/doc.py:310 +#: contrib/admin/views/doc.py:311 contrib/admin/views/doc.py:313 +msgid "Integer" +msgstr "Número enteiro" + +#: contrib/admin/views/doc.py:292 +msgid "Boolean (Either True or False)" +msgstr "Valor booleano (verdadeiro ou falso)" + +#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:312 +#, python-format +msgid "String (up to %(maxlength)s)" +msgstr "Cadea (ata %(maxlength)s caracteres)" + +#: contrib/admin/views/doc.py:294 +msgid "Comma-separated integers" +msgstr "Números enteiros separados por comas" + +#: contrib/admin/views/doc.py:295 +msgid "Date (without time)" +msgstr "Data (sen a hora)" + +#: contrib/admin/views/doc.py:296 +msgid "Date (with time)" +msgstr "Data (coa hora)" + +#: contrib/admin/views/doc.py:297 +msgid "Decimal number" +msgstr "Número decimal" + +#: contrib/admin/views/doc.py:298 +msgid "E-mail address" +msgstr "Enderezo de correo electrónico" + +#: contrib/admin/views/doc.py:299 contrib/admin/views/doc.py:300 +#: contrib/admin/views/doc.py:303 +msgid "File path" +msgstr "Ruta do ficheiro" + +#: contrib/admin/views/doc.py:301 +msgid "Floating point number" +msgstr "Número de coma flotante" + +#: contrib/admin/views/doc.py:305 contrib/comments/models.py:85 +msgid "IP address" +msgstr "Enderezo IP" + +#: contrib/admin/views/doc.py:307 +msgid "Boolean (Either True, False or None)" +msgstr "Booleano (verdadeiro, falso ou ningún)" + +#: contrib/admin/views/doc.py:308 +msgid "Relation to parent model" +msgstr "Relación cun modelo pai" + +#: contrib/admin/views/doc.py:309 +msgid "Phone number" +msgstr "Número de teléfono" + +#: contrib/admin/views/doc.py:314 +msgid "Text" +msgstr "Texto" + +#: contrib/admin/views/doc.py:315 +msgid "Time" +msgstr "Hora" + +#: contrib/admin/views/doc.py:316 contrib/flatpages/models.py:7 +msgid "URL" +msgstr "URL" + +#: contrib/admin/views/doc.py:317 +msgid "U.S. state (two uppercase letters)" +msgstr "Estado dos Estados Unidos (dúas letras maiúsculas)" + +#: contrib/admin/views/doc.py:318 +msgid "XML text" +msgstr "Texto XML" + +#: contrib/admin/views/doc.py:344 +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s non semella ser un obxecto urlpattern" + +#: contrib/admin/views/main.py:223 +msgid "Site administration" +msgstr "Administración do sitio web" + +#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356 +#, python-format +msgid "You may add another %s below." +msgstr "Pode engadir outro/a %s embaixo." + +#: contrib/admin/views/main.py:289 +#, python-format +msgid "Add %s" +msgstr "Engadir %s" + +#: contrib/admin/views/main.py:335 +#, python-format +msgid "Added %s." +msgstr "Engadido/a %s." + +#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337 +#: contrib/admin/views/main.py:339 db/models/manipulators.py:308 +msgid "and" +msgstr "e" + +#: contrib/admin/views/main.py:337 +#, python-format +msgid "Changed %s." +msgstr "Modificado(s) %s." + +#: contrib/admin/views/main.py:339 +#, python-format +msgid "Deleted %s." +msgstr "Eliminado(s) %s." + +#: contrib/admin/views/main.py:342 +msgid "No fields changed." +msgstr "Non se modificou ningún campo." + +#: contrib/admin/views/main.py:345 +#, python-format +msgid "The %(name)s \"%(obj)s\" was changed successfully." +msgstr "Modificouse correctamente o/a %(name)s \"%(obj)s\"." + +#: contrib/admin/views/main.py:353 +#, python-format +msgid "" +"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." +msgstr "Engadiuse correctamente o/a %(name)s \"%(obj)s\" Pode editalo embaixo." + +#: contrib/admin/views/main.py:391 +#, python-format +msgid "Change %s" +msgstr "Modificar %s" + +#: contrib/admin/views/main.py:476 +#, python-format +msgid "One or more %(fieldname)s in %(name)s: %(obj)s" +msgstr "Un ou máis %(fieldname)s no/a %(name)s: %(obj)s" + +#: contrib/admin/views/main.py:481 +#, python-format +msgid "One or more %(fieldname)s in %(name)s:" +msgstr "Un ou máis %(fieldname)s no/a %(name)s:" + +#: contrib/admin/views/main.py:514 +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "Eliminouse correctamente o/a %(name)s \"%(obj)s\"." + +#: contrib/admin/views/main.py:517 +msgid "Are you sure?" +msgstr "Está seguro?" + +#: contrib/admin/views/main.py:539 +#, python-format +msgid "Change history: %s" +msgstr "Histórico de cambios: %s" + +#: contrib/admin/views/main.py:573 +#, python-format +msgid "Select %s" +msgstr "Seleccione un/ha %s" + +#: contrib/admin/views/main.py:573 +#, python-format +msgid "Select %s to change" +msgstr "Seleccione %s que modificar" + +#: contrib/admin/views/main.py:768 +msgid "Database error" +msgstr "Erro da base de datos" + +#: contrib/auth/forms.py:17 contrib/auth/forms.py:138 +msgid "The two password fields didn't match." +msgstr "Os dous campos de contrasinal non coinciden." + +#: contrib/auth/forms.py:25 +msgid "A user with that username already exists." +msgstr "Xa existe un usuario con ese nome de usuario." + +#: contrib/auth/forms.py:53 +msgid "" +"Your Web browser doesn't appear to have cookies enabled. Cookies are " +"required for logging in." +msgstr "" +"Semella que o seu navegador non acepta 'cookies'. Requírense 'cookies' para " +"iniciar sesión." + +#: contrib/auth/forms.py:62 +msgid "This account is inactive." +msgstr "Esta conta está inactiva." + +#: contrib/auth/forms.py:85 +msgid "" +"That e-mail address doesn't have an associated user account. Are you sure " +"you've registered?" +msgstr "" +"Este enderezo de correo electrónico non ten unha conta de usuario asociada. " +"Está seguro de que está rexistrado?" + +#: contrib/auth/forms.py:117 +msgid "The two 'new password' fields didn't match." +msgstr "Os dous campos 'contrasinal novo' non coinciden." + +#: contrib/auth/forms.py:124 +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "Inseriu incorrectamente o seu contrasinal actual. Por favor, insírao de novo." + +#: contrib/auth/models.py:44 contrib/auth/models.py:64 +msgid "name" +msgstr "nome" + +#: contrib/auth/models.py:46 +msgid "codename" +msgstr "código" + +#: contrib/auth/models.py:49 +msgid "permission" +msgstr "permiso" + +#: contrib/auth/models.py:50 contrib/auth/models.py:65 +msgid "permissions" +msgstr "permisos" + +#: contrib/auth/models.py:68 +msgid "group" +msgstr "grupo" + +#: contrib/auth/models.py:69 contrib/auth/models.py:109 +msgid "groups" +msgstr "grupos" + +#: contrib/auth/models.py:99 +msgid "username" +msgstr "nome de usuario" + +#: contrib/auth/models.py:99 +msgid "" +"Required. 30 characters or fewer. Alphanumeric characters only (letters, " +"digits and underscores)." +msgstr "" +"Requirido. 30 caracteres ou menos. Soamente caracteres alfanuméricos " +"(letras, díxitos ou guións baixos)." + +#: contrib/auth/models.py:100 +msgid "first name" +msgstr "nome" + +#: contrib/auth/models.py:101 +msgid "last name" +msgstr "apelidos" + +#: contrib/auth/models.py:102 +msgid "e-mail address" +msgstr "enderezo de correo electrónico" + +#: contrib/auth/models.py:103 +msgid "password" +msgstr "contrasinal" + +#: contrib/auth/models.py:103 +msgid "" +"Use '[algo]$[salt]$[hexdigest]' or use the change " +"password form." +msgstr "" +"Use '[algo]$[salt]$[hexdigest]' ou utilice o formulario de " +"cambio de contrasinal." + +#: contrib/auth/models.py:104 +msgid "staff status" +msgstr "membro do persoal" + +#: contrib/auth/models.py:104 +msgid "Designates whether the user can log into this admin site." +msgstr "Indica se o usuario pode entrar neste sitio de administración." + +#: contrib/auth/models.py:105 +msgid "active" +msgstr "activo" + +#: contrib/auth/models.py:105 +msgid "" +"Designates whether this user can log into the Django admin. Unselect this " +"instead of deleting accounts." +msgstr "Indica se o usuario pode entrar na sección de administración. " +"Desactíveo no canto de borrar contas de usuario." + +#: contrib/auth/models.py:106 +msgid "superuser status" +msgstr "estatus de superusuario" + +#: contrib/auth/models.py:106 +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" +"Indica que este usuario ten todos os permisos sen asignarllos explicitamente." + + +#: contrib/auth/models.py:107 +msgid "last login" +msgstr "última sesión" + +#: contrib/auth/models.py:108 +msgid "date joined" +msgstr "data de rexistro" + +#: contrib/auth/models.py:110 +msgid "" +"In addition to the permissions manually assigned, this user will also get " +"all permissions granted to each group he/she is in." +msgstr "" +"Ademais dos permisos asignados manualmente, este usuario gozará de todos os " +"permisos concedidos a cada un dos grupos aos que pertence." + +#: contrib/auth/models.py:111 +msgid "user permissions" +msgstr "permisos de usuario" + +#: contrib/auth/models.py:115 +msgid "user" +msgstr "usuario" + +#: contrib/auth/models.py:116 +msgid "users" +msgstr "usuarios" + +#: contrib/auth/models.py:122 +msgid "Personal info" +msgstr "Información persoal" + +#: contrib/auth/models.py:123 +msgid "Permissions" +msgstr "Permisos" + +#: contrib/auth/models.py:124 +msgid "Important dates" +msgstr "Datas importantes" + +#: contrib/auth/models.py:125 +msgid "Groups" +msgstr "Grupos" + +#: contrib/auth/models.py:269 +msgid "message" +msgstr "mensaxe" + +#: contrib/auth/models.py:282 +msgid "AnonymousUser" +msgstr "UsuarioAnónimo" + +#: contrib/auth/views.py:40 +msgid "Logged out" +msgstr "Rematou a sesión" + #: contrib/comments/models.py:67 contrib/comments/models.py:166 msgid "object ID" msgstr "ID do obxecto" @@ -32,39 +1281,39 @@ msgstr "comentario" #: contrib/comments/models.py:70 msgid "rating #1" -msgstr "" +msgstr "valoración 1" #: contrib/comments/models.py:71 msgid "rating #2" -msgstr "" +msgstr "valoración 2" #: contrib/comments/models.py:72 msgid "rating #3" -msgstr "" +msgstr "valoración 3" #: contrib/comments/models.py:73 msgid "rating #4" -msgstr "" +msgstr "valoración 4" #: contrib/comments/models.py:74 msgid "rating #5" -msgstr "" +msgstr "valoración 5" #: contrib/comments/models.py:75 msgid "rating #6" -msgstr "" +msgstr "valoración 6" #: contrib/comments/models.py:76 msgid "rating #7" -msgstr "" +msgstr "valoración 7" #: contrib/comments/models.py:77 msgid "rating #8" -msgstr "" +msgstr "valoración 8" #: contrib/comments/models.py:82 msgid "is valid rating" -msgstr "é unha puntuación válida" +msgstr "é unha valoración válida" #: contrib/comments/models.py:83 contrib/comments/models.py:169 msgid "date/time submitted" @@ -74,10 +1323,6 @@ msgstr "data/hora do envío" msgid "is public" msgstr "é público" -#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289 -msgid "IP address" -msgstr "Enderezo IP" - #: contrib/comments/models.py:86 msgid "is removed" msgstr "está borrado" @@ -152,7 +1397,7 @@ msgstr "puntos de karma" #: contrib/comments/models.py:242 #, python-format msgid "%(score)d rating by %(user)s" -msgstr "" +msgstr "puntuación de %(score)d por %(user)s" #: contrib/comments/models.py:258 #, python-format @@ -199,24 +1444,49 @@ msgstr "borrados de moderador" msgid "Moderator deletion by %r" msgstr "Borrado polo moderador %r" -#: contrib/comments/views/karma.py:19 -msgid "Anonymous users cannot vote" -msgstr "Os usuarios anónimos non poden votar" +#: contrib/comments/templates/comments/form.html:8 +msgid "Forgotten your password?" +msgstr "Esqueceu o contrasinal?" -#: contrib/comments/views/karma.py:23 -msgid "Invalid comment ID" -msgstr "ID de comentario non válida" +#: contrib/comments/templates/comments/form.html:12 +msgid "Ratings" +msgstr "Valoracións" -#: contrib/comments/views/karma.py:25 -msgid "No voting for yourself" -msgstr "Vostede non se pode votar a si mesmo" +#: contrib/comments/templates/comments/form.html:12 +#: contrib/comments/templates/comments/form.html:23 +msgid "Required" +msgstr "Requirido" -#: contrib/comments/views/comments.py:28 +#: contrib/comments/templates/comments/form.html:12 +#: contrib/comments/templates/comments/form.html:23 +msgid "Optional" +msgstr "Opcional" + +#: contrib/comments/templates/comments/form.html:23 +msgid "Post a photo" +msgstr "Publicar unha foto" + +#: contrib/comments/templates/comments/form.html:28 +#: contrib/comments/templates/comments/freeform.html:5 +msgid "Comment:" +msgstr "Comentario:" + +#: contrib/comments/templates/comments/form.html:35 +#: contrib/comments/templates/comments/freeform.html:10 +msgid "Preview comment" +msgstr "Previsualizar comentario" + +#: contrib/comments/templates/comments/freeform.html:4 +msgid "Your name:" +msgstr "O seu nome:" + +#: contrib/comments/views/comments.py:27 msgid "" "This rating is required because you've entered at least one other rating." -msgstr "" +msgstr "Requírese esta valoración porque vostede inseriu polo menos " +"outra valoración." -#: contrib/comments/views/comments.py:112 +#: contrib/comments/views/comments.py:111 #, python-format msgid "" "This comment was posted by a user who has posted fewer than %(count)s " @@ -239,30 +1509,33 @@ msgstr[1] "" "\n" "%(text)s" -#: contrib/comments/views/comments.py:117 +#: contrib/comments/views/comments.py:116 #, python-format msgid "" "This comment was posted by a sketchy user:\n" "\n" "%(text)s" msgstr "" +"Este comentario foi enviado por un usuario conflitivo:\n" +"\n" +"%(text)s" -#: contrib/comments/views/comments.py:189 +#: contrib/comments/views/comments.py:188 #: contrib/comments/views/comments.py:280 msgid "Only POSTs are allowed" msgstr "Soamente se permiten envíos polo método POST" -#: contrib/comments/views/comments.py:193 +#: contrib/comments/views/comments.py:192 #: contrib/comments/views/comments.py:284 msgid "One or more of the required fields wasn't submitted" msgstr "Non se enviaron un ou máis dos campos requiridos" -#: contrib/comments/views/comments.py:197 +#: contrib/comments/views/comments.py:196 #: contrib/comments/views/comments.py:286 msgid "Somebody tampered with the comment form (security violation)" msgstr "Alguén manipulou o formulario do comentario (violación de seguridade)" -#: contrib/comments/views/comments.py:207 +#: contrib/comments/views/comments.py:206 #: contrib/comments/views/comments.py:292 msgid "" "The comment form had an invalid 'target' parameter -- the object ID was " @@ -276,816 +1549,29 @@ msgstr "" msgid "The comment form didn't provide either 'preview' or 'post'" msgstr "O formulario de comentario non proporciona 'preview' ou 'post'" -#: contrib/comments/templates/comments/form.html:6 -#: contrib/comments/templates/comments/form.html:8 -#: contrib/admin/templates/admin/login.html:17 -msgid "Username:" -msgstr "Usuario:" +#: contrib/comments/views/karma.py:19 +msgid "Anonymous users cannot vote" +msgstr "Os usuarios anónimos non poden votar" -#: contrib/comments/templates/comments/form.html:6 -#: contrib/admin/templates/admin/login.html:20 -msgid "Password:" -msgstr "Contrasinal:" +#: contrib/comments/views/karma.py:23 +msgid "Invalid comment ID" +msgstr "ID de comentario non válida" -#: contrib/comments/templates/comments/form.html:6 -msgid "Forgotten your password?" -msgstr "Esqueceu o contrasinal?" +#: contrib/comments/views/karma.py:25 +msgid "No voting for yourself" +msgstr "Vostede non se pode votar a si mesmo" -#: contrib/comments/templates/comments/form.html:8 -#: contrib/admin/templates/admin/object_history.html:3 -#: contrib/admin/templates/admin/change_list.html:5 -#: contrib/admin/templates/admin/base.html:23 -#: contrib/admin/templates/admin/delete_confirmation.html:3 -#: contrib/admin/templates/admin/change_form.html:10 -#: contrib/admin/templates/registration/password_change_done.html:3 -#: contrib/admin/templates/registration/password_change_form.html:3 -#: contrib/admin/templates/admin_doc/bookmarklets.html:4 -#: contrib/admin/templates/admin_doc/view_detail.html:4 -#: contrib/admin/templates/admin_doc/template_tag_index.html:5 -#: contrib/admin/templates/admin_doc/template_detail.html:4 -#: contrib/admin/templates/admin_doc/template_filter_index.html:5 -#: contrib/admin/templates/admin_doc/missing_docutils.html:4 -#: contrib/admin/templates/admin_doc/view_index.html:5 -#: contrib/admin/templates/admin_doc/model_detail.html:3 -#: contrib/admin/templates/admin_doc/index.html:4 -#: contrib/admin/templates/admin_doc/model_index.html:5 -msgid "Log out" -msgstr "Rematar sesión" +#: contrib/contenttypes/models.py:36 +msgid "python model class name" +msgstr "nome do módulo Python" -#: contrib/comments/templates/comments/form.html:12 -msgid "Ratings" -msgstr "" +#: contrib/contenttypes/models.py:39 +msgid "content type" +msgstr "tipo de contido" -#: contrib/comments/templates/comments/form.html:12 -#: contrib/comments/templates/comments/form.html:23 -msgid "Required" -msgstr "Requirido" - -#: contrib/comments/templates/comments/form.html:12 -#: contrib/comments/templates/comments/form.html:23 -msgid "Optional" -msgstr "Opcional" - -#: contrib/comments/templates/comments/form.html:23 -msgid "Post a photo" -msgstr "Publicar unha foto" - -#: contrib/comments/templates/comments/form.html:27 -#: contrib/comments/templates/comments/freeform.html:5 -msgid "Comment:" -msgstr "Comentario:" - -#: contrib/comments/templates/comments/form.html:32 -#: contrib/comments/templates/comments/freeform.html:9 -msgid "Preview comment" -msgstr "Previsualizar comentario" - -#: contrib/comments/templates/comments/freeform.html:4 -msgid "Your name:" -msgstr "Nome:" - -#: contrib/admin/filterspecs.py:40 -#, python-format -msgid "" -"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" -"Para instalar bookmarklets, arrastre a ligazón á súa\n" -"barra de favoritos ou marcadores, ou faga clic co botón dereito\n" -"e engádao aos marcadores. Agora pode usar o bookmarklet dende\n" -" calquera páxina do sitio web. Teña en conta que algúns destes\n" -"bookmarklets precisan que estea a visitar o sitio dende un ordenador\n" -"designado coma \"interno\" (fale co administrador do sistema se\n" -"non está seguro de que o seu ordenador é \"interno\" .
\n" - -#: contrib/admin/templates/admin_doc/bookmarklets.html:19 -msgid "Documentation for this page" -msgstr "Documentación para esta páxina" - -#: contrib/admin/templates/admin_doc/bookmarklets.html:20 -msgid "" -"Jumps you from any page to the documentation for the view that generates " -"that page." -msgstr "Salta á documentación para a vista que xera a páxina." - -#: contrib/admin/templates/admin_doc/bookmarklets.html:22 -msgid "Show object ID" -msgstr "Amosar ID do obxecto" - -#: contrib/admin/templates/admin_doc/bookmarklets.html:23 -msgid "" -"Shows the content-type and unique ID for pages that represent a single " -"object." -msgstr "" -"Amosa o tipo de contido e a ID única para páxinas que representan un obxecto " -"determinado." - -#: contrib/admin/templates/admin_doc/bookmarklets.html:25 -msgid "Edit this object (current window)" -msgstr "Editar este obxecto (nesta fiestra)" - -#: contrib/admin/templates/admin_doc/bookmarklets.html:26 -msgid "Jumps to the admin page for pages that represent a single object." -msgstr "" -"Salta á páxina de administración para páxina que representan un obxecto " -"determinado." - -#: contrib/admin/templates/admin_doc/bookmarklets.html:28 -msgid "Edit this object (new window)" -msgstr "Editar este obxecto (nunha nova fiestra)" - -#: contrib/admin/templates/admin_doc/bookmarklets.html:29 -msgid "As above, but opens the admin page in a new window." -msgstr "Como enriba, pero abre a páxina de administración nunha nova fiestra." - -#: contrib/admin/templates/widget/date_time.html:3 -msgid "Date:" -msgstr "Data:" - -#: contrib/admin/templates/widget/date_time.html:4 -msgid "Time:" -msgstr "Hora" - -#: contrib/admin/templates/widget/file.html:2 -msgid "Currently:" -msgstr "Agora:" - -#: contrib/admin/templates/widget/file.html:3 -msgid "Change:" -msgstr "Modificar:" - -#: contrib/redirects/models.py:7 -msgid "redirect from" -msgstr "orixe da redirección" - -#: contrib/redirects/models.py:8 -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"Debe ser unha ruta absoluta, sen o nome de dominio. Exemplo: '/events/" -"search/'" - -#: contrib/redirects/models.py:9 -msgid "redirect to" -msgstr "destino da redirección" - -#: contrib/redirects/models.py:10 -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"Pode ser unha ruta absoluta (coma a de enriba) ou un URL completo que empece " -"por 'http://'" - -#: contrib/redirects/models.py:12 -msgid "redirect" -msgstr "redirección" - -#: contrib/redirects/models.py:13 -msgid "redirects" -msgstr "redireccións" +#: contrib/contenttypes/models.py:40 +msgid "content types" +msgstr "tipos de contido" #: contrib/flatpages/models.py:8 msgid "" @@ -1111,11 +1597,11 @@ msgstr "nome da plantilla" #: contrib/flatpages/models.py:13 msgid "" -"Example: 'flatpages/contact_page'. If this isn't provided, the system will " -"use 'flatpages/default'." +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." msgstr "" -"Exemplo: 'flatpages/contact_page'. Se non se especifica, o sistema usará " -"'flatpages/default'." +"Exemplo: 'flatpages/contact_page.html'. Se non se especifica, o sistema usará " +"'flatpages/default.html'." #: contrib/flatpages/models.py:14 msgid "registration required" @@ -1133,154 +1619,594 @@ msgstr "páxina simple" msgid "flat pages" msgstr "páxinas simples" -#: contrib/auth/models.py:13 contrib/auth/models.py:26 -msgid "name" -msgstr "nome" +#: contrib/humanize/templatetags/humanize.py:17 +msgid "th" +msgstr "º" -#: contrib/auth/models.py:15 -msgid "codename" -msgstr "código" +#: contrib/humanize/templatetags/humanize.py:17 +msgid "st" +msgstr "º" -#: contrib/auth/models.py:17 -msgid "permission" -msgstr "permiso" +#: contrib/humanize/templatetags/humanize.py:17 +msgid "nd" +msgstr "º" -#: contrib/auth/models.py:18 contrib/auth/models.py:27 -msgid "permissions" -msgstr "permisos" +#: contrib/humanize/templatetags/humanize.py:17 +msgid "rd" +msgstr "º" -#: contrib/auth/models.py:29 -msgid "group" -msgstr "grupo" +#: contrib/humanize/templatetags/humanize.py:47 +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f millón" +msgstr[1] "%(value).1f millóns" -#: contrib/auth/models.py:30 contrib/auth/models.py:65 -msgid "groups" -msgstr "grupos" +#: contrib/humanize/templatetags/humanize.py:50 +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f mil millóns" +msgstr[1] "%(value).1f miles de millóns" -#: contrib/auth/models.py:55 -msgid "username" -msgstr "nome de usuario" +#: contrib/humanize/templatetags/humanize.py:53 +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f billón" +msgstr[1] "%(value).1f billóns" -#: contrib/auth/models.py:56 -msgid "first name" -msgstr "nome" +#: contrib/humanize/templatetags/humanize.py:68 +msgid "one" +msgstr "un" -#: contrib/auth/models.py:57 -msgid "last name" -msgstr "apelidos" +#: contrib/humanize/templatetags/humanize.py:68 +msgid "two" +msgstr "dous" -#: contrib/auth/models.py:58 -msgid "e-mail address" -msgstr "enderezo de correo electrónico" +#: contrib/humanize/templatetags/humanize.py:68 +msgid "three" +msgstr "tres" -#: contrib/auth/models.py:59 -msgid "password" -msgstr "contrasinal" +#: contrib/humanize/templatetags/humanize.py:68 +msgid "four" +msgstr "catro" -#: contrib/auth/models.py:59 -msgid "Use '[algo]$[salt]$[hexdigest]'" -msgstr "Use '[algo]$[salt]$[hexdigest]'" +#: contrib/humanize/templatetags/humanize.py:68 +msgid "five" +msgstr "cinco" -#: contrib/auth/models.py:60 -msgid "staff status" -msgstr "membro do persoal" +#: contrib/humanize/templatetags/humanize.py:68 +msgid "six" +msgstr "seis" -#: contrib/auth/models.py:60 -msgid "Designates whether the user can log into this admin site." -msgstr "Indica se o usuario pode entrar neste sitio de administración." +#: contrib/humanize/templatetags/humanize.py:68 +msgid "seven" +msgstr "sete" -#: contrib/auth/models.py:61 -msgid "active" -msgstr "activo" +#: contrib/humanize/templatetags/humanize.py:68 +msgid "eight" +msgstr "oito" -#: contrib/auth/models.py:62 -msgid "superuser status" -msgstr "estado de superusuario" +#: contrib/humanize/templatetags/humanize.py:68 +msgid "nine" +msgstr "nove" -#: contrib/auth/models.py:63 -msgid "last login" -msgstr "última sesión" +#: contrib/localflavor/au/forms.py:18 +msgid "Enter a 4 digit post code." +msgstr "Insira un código postal de 4 díxitos." -#: contrib/auth/models.py:64 -msgid "date joined" -msgstr "data de rexistro" +#: contrib/localflavor/br/forms.py:18 +msgid "Enter a zip code in the format XXXXX-XXX." +msgstr "Insira un código postal no formato XXXXX-XXX." -#: contrib/auth/models.py:66 -msgid "" -"In addition to the permissions manually assigned, this user will also get " -"all permissions granted to each group he/she is in." +#: contrib/localflavor/br/forms.py:30 +msgid "Phone numbers must be in XX-XXXX-XXXX format." msgstr "" -"Ademais dos permisos asignados manualmente, este usuario gozará de todos os " -"permisos concedidos a cada un dos grupos aos que pertence." +"Os números de teléfono deben estar no formato XX-XXXX-XXXX." -#: contrib/auth/models.py:67 -msgid "user permissions" -msgstr "permisos de usuario" +#: contrib/localflavor/br/forms.py:72 +msgid "This field requires only numbers." +msgstr "Este campo soamente admite números." -#: contrib/auth/models.py:70 -msgid "user" -msgstr "usuario" +#: contrib/localflavor/br/forms.py:74 +msgid "This field requires at most 11 digits or 14 characters." +msgstr "Este campo acepta como máximo 11 díxitos ou 14 caracteres." -#: contrib/auth/models.py:71 -msgid "users" -msgstr "usuarios" +#: contrib/localflavor/br/forms.py:84 +msgid "Invalid CPF number." +msgstr "Número de CPF non válido." -#: contrib/auth/models.py:76 -msgid "Personal info" -msgstr "Información persoal" +#: contrib/localflavor/br/forms.py:106 +msgid "This field requires at least 14 digits" +msgstr "Este campo require polo menos 14 díxitos." -#: contrib/auth/models.py:77 -msgid "Permissions" -msgstr "Permisos" +#: contrib/localflavor/br/forms.py:116 +msgid "Invalid CNPJ number." +msgstr "Número de CNPJ non válido" -#: contrib/auth/models.py:78 -msgid "Important dates" -msgstr "Datas importantes" +#: contrib/localflavor/ch/ch_states.py:5 +msgid "Aargau" +msgstr "Argovia" -#: contrib/auth/models.py:79 -msgid "Groups" -msgstr "Grupos" +#: contrib/localflavor/ch/ch_states.py:6 +msgid "Appenzell Innerrhoden" +msgstr "Appenzell Interior" -#: contrib/auth/models.py:219 -msgid "message" -msgstr "mensaxe" +#: contrib/localflavor/ch/ch_states.py:7 +msgid "Appenzell Ausserrhoden" +msgstr "Appenzell Exterior" -#: contrib/auth/forms.py:30 +#: contrib/localflavor/ch/ch_states.py:8 +msgid "Basel-Stadt" +msgstr "Basilea-Cidade" + +#: contrib/localflavor/ch/ch_states.py:9 +msgid "Basel-Land" +msgstr "Basilea-Campo" + +#: contrib/localflavor/ch/ch_states.py:10 +msgid "Berne" +msgstr "Berna" + +#: contrib/localflavor/ch/ch_states.py:11 +msgid "Fribourg" +msgstr "Friburgo" + +#: contrib/localflavor/ch/ch_states.py:12 +msgid "Geneva" +msgstr "Xenebra" + +#: contrib/localflavor/ch/ch_states.py:13 +msgid "Glarus" +msgstr "Glarus" + +#: contrib/localflavor/ch/ch_states.py:14 +msgid "Graubuenden" +msgstr "Grisóns" + +#: contrib/localflavor/ch/ch_states.py:15 +msgid "Jura" +msgstr "Xura" + +#: contrib/localflavor/ch/ch_states.py:16 +msgid "Lucerne" +msgstr "Lucerna" + +#: contrib/localflavor/ch/ch_states.py:17 +msgid "Neuchatel" +msgstr "Neuchatel" + +#: contrib/localflavor/ch/ch_states.py:18 +msgid "Nidwalden" +msgstr "Nidwald" + +#: contrib/localflavor/ch/ch_states.py:19 +msgid "Obwalden" +msgstr "Obwald" + +#: contrib/localflavor/ch/ch_states.py:20 +msgid "Schaffhausen" +msgstr "Schaffhausen" + +#: contrib/localflavor/ch/ch_states.py:21 +msgid "Schwyz" +msgstr "Schwyz" + +#: contrib/localflavor/ch/ch_states.py:22 +msgid "Solothurn" +msgstr "Soleura" + +#: contrib/localflavor/ch/ch_states.py:23 +msgid "St. Gallen" +msgstr "San Galo" + +#: contrib/localflavor/ch/ch_states.py:24 +msgid "Thurgau" +msgstr "Turgovia" + +#: contrib/localflavor/ch/ch_states.py:25 +msgid "Ticino" +msgstr "Tesino" + +#: contrib/localflavor/ch/ch_states.py:26 +msgid "Uri" +msgstr "Uri" + +#: contrib/localflavor/ch/ch_states.py:27 +msgid "Valais" +msgstr "Valais" + +#: contrib/localflavor/ch/ch_states.py:28 +msgid "Vaud" +msgstr "Vaud" + +#: contrib/localflavor/ch/ch_states.py:29 +msgid "Zug" +msgstr "Zug" + +#: contrib/localflavor/ch/ch_states.py:30 +msgid "Zurich" +msgstr "Zurich" + +#: contrib/localflavor/ch/forms.py:18 contrib/localflavor/no/forms.py:15 +msgid "Enter a zip code in the format XXXX." +msgstr "Insira un código posttal no formato XXXX." + +#: contrib/localflavor/ch/forms.py:90 msgid "" -"Your Web browser doesn't appear to have cookies enabled. Cookies are " -"required for logging in." -msgstr "Semella que o seu navegador non acepta 'cookies'. Requírense " -"'cookies' para iniciar sesión." +"Enter a valid Swiss identity or passport card number in X1234567<0 or " +"1234567890 format." +msgstr "Insira un número válido de tarxeta de identidade ou pasaporte no " +"formato X1234567<0 ou 1234567890." -#: contrib/contenttypes/models.py:25 -msgid "python model class name" -msgstr "nome do módulo Python" +#: contrib/localflavor/cl/forms.py:21 +msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X." +msgstr "Insira un RUT chileno válido. O formato é XX.XXX.XXX-X." -#: contrib/contenttypes/models.py:28 -msgid "content type" -msgstr "tipo de contido" +#: contrib/localflavor/cl/forms.py:26 +msgid "Enter valid a Chilean RUT" +msgstr "Insira un RUT chileno válido." -#: contrib/contenttypes/models.py:29 -msgid "content types" -msgstr "tipos de contido" +#: contrib/localflavor/de/de_states.py:5 +msgid "Baden-Wuerttemberg" +msgstr "Baden-Württemberg" -#: contrib/sessions/models.py:35 +#: contrib/localflavor/de/de_states.py:6 +msgid "Bavaria" +msgstr "Baviera" + +#: contrib/localflavor/de/de_states.py:7 +msgid "Berlin" +msgstr "Berlín" + +#: contrib/localflavor/de/de_states.py:8 +msgid "Brandenburg" +msgstr "Brandemburgo" + +#: contrib/localflavor/de/de_states.py:9 +msgid "Bremen" +msgstr "Bremen" + +#: contrib/localflavor/de/de_states.py:10 +msgid "Hamburg" +msgstr "Hamburgo" + +#: contrib/localflavor/de/de_states.py:11 +msgid "Hessen" +msgstr "Hesse" + +#: contrib/localflavor/de/de_states.py:12 +msgid "Mecklenburg-Western Pomerania" +msgstr "Mecklemburgo-Pomerania Occidental" + +#: contrib/localflavor/de/de_states.py:13 +msgid "Lower Saxony" +msgstr "Baixa Saxonia" + +#: contrib/localflavor/de/de_states.py:14 +msgid "North Rhine-Westphalia" +msgstr "Renania do Norte-Westfalia" + +#: contrib/localflavor/de/de_states.py:15 +msgid "Rhineland-Palatinate" +msgstr "Renania-Palatinado" + +#: contrib/localflavor/de/de_states.py:16 +msgid "Saarland" +msgstr "Sarre" + +#: contrib/localflavor/de/de_states.py:17 +msgid "Saxony" +msgstr "Saxonia" + +#: contrib/localflavor/de/de_states.py:18 +msgid "Saxony-Anhalt" +msgstr "Saxonia-Anhalt" + +#: contrib/localflavor/de/de_states.py:19 +msgid "Schleswig-Holstein" +msgstr "Schleswig-Holstein" + +#: contrib/localflavor/de/de_states.py:20 +msgid "Thuringia" +msgstr "Turinxia" + +#: contrib/localflavor/de/forms.py:16 contrib/localflavor/fi/forms.py:14 +#: contrib/localflavor/fr/forms.py:17 +msgid "Enter a zip code in the format XXXXX." +msgstr "Insira un código postal no formato XXXXX" + +#: contrib/localflavor/de/forms.py:60 +msgid "" +"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X " +"format." +msgstr "Insira un número válido de tarxeta de identidade alemá no formato " +"XXXXXXXXXXX-XXXXXXX-XXXXXXX-X." + +#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45 +msgid "Enter a valid Finnish social security number." +msgstr "Insira un número válido de tarxeta da seguridade social finlandesa." + +#: contrib/localflavor/is_/forms.py:16 +msgid "" +"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX." +msgstr "" +"Insira un número de identificación islandés válido. O formato é XXXXXX-XXXX." + +#: contrib/localflavor/is_/forms.py:30 +msgid "The Icelandic identification number is not valid." +msgstr "O número de identificación islandés non é válido." + +#: contrib/localflavor/it/forms.py:16 +msgid "Enter a valid zip code." +msgstr "Insira un código postal válido." + +#: contrib/localflavor/it/forms.py:41 +msgid "Enter a valid Social Security number." +msgstr "Insira un número da seguridade social válido." + +#: contrib/localflavor/it/forms.py:68 +msgid "Enter a valid VAT number." +msgstr "Insira un número de IVE válido." + +#: contrib/localflavor/jp/forms.py:21 +msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX." +msgstr "Insira un código postal no formato XXXXXXX ou XXX-XXXX." + +#: contrib/localflavor/jp/jp_prefectures.py:4 +msgid "Hokkaido" +msgstr "Hokkaidō" + +#: contrib/localflavor/jp/jp_prefectures.py:5 +msgid "Aomori" +msgstr "Aomori" + +#: contrib/localflavor/jp/jp_prefectures.py:6 +msgid "Iwate" +msgstr "Iwate" + +#: contrib/localflavor/jp/jp_prefectures.py:7 +msgid "Miyagi" +msgstr "Miyagi" + +#: contrib/localflavor/jp/jp_prefectures.py:8 +msgid "Akita" +msgstr "Akita" + +#: contrib/localflavor/jp/jp_prefectures.py:9 +msgid "Yamagata" +msgstr "Yamagata" + +#: contrib/localflavor/jp/jp_prefectures.py:10 +msgid "Fukushima" +msgstr "Fukushima" + +#: contrib/localflavor/jp/jp_prefectures.py:11 +msgid "Ibaraki" +msgstr "Ibaraki" + +#: contrib/localflavor/jp/jp_prefectures.py:12 +msgid "Tochigi" +msgstr "Tochigi" + +#: contrib/localflavor/jp/jp_prefectures.py:13 +msgid "Gunma" +msgstr "Gunma" + +#: contrib/localflavor/jp/jp_prefectures.py:14 +msgid "Saitama" +msgstr "Saitama" + +#: contrib/localflavor/jp/jp_prefectures.py:15 +msgid "Chiba" +msgstr "Chiba" + +#: contrib/localflavor/jp/jp_prefectures.py:16 +msgid "Tokyo" +msgstr "Toquio" + +#: contrib/localflavor/jp/jp_prefectures.py:17 +msgid "Kanagawa" +msgstr "Kanagawa" + +#: contrib/localflavor/jp/jp_prefectures.py:18 +msgid "Yamanashi" +msgstr "Yamanashi" + +#: contrib/localflavor/jp/jp_prefectures.py:19 +msgid "Nagano" +msgstr "Nagano" + +#: contrib/localflavor/jp/jp_prefectures.py:20 +msgid "Niigata" +msgstr "Niigata" + +#: contrib/localflavor/jp/jp_prefectures.py:21 +msgid "Toyama" +msgstr "Toyama" + +#: contrib/localflavor/jp/jp_prefectures.py:22 +msgid "Ishikawa" +msgstr "Ishikawa" + +#: contrib/localflavor/jp/jp_prefectures.py:23 +msgid "Fukui" +msgstr "Fukui" + +#: contrib/localflavor/jp/jp_prefectures.py:24 +msgid "Gifu" +msgstr "Gifu" + +#: contrib/localflavor/jp/jp_prefectures.py:25 +msgid "Shizuoka" +msgstr "Shizuoka" + +#: contrib/localflavor/jp/jp_prefectures.py:26 +msgid "Aichi" +msgstr "Aichi" + +#: contrib/localflavor/jp/jp_prefectures.py:27 +msgid "Mie" +msgstr "Mie" + +#: contrib/localflavor/jp/jp_prefectures.py:28 +msgid "Shiga" +msgstr "Shiga" + +#: contrib/localflavor/jp/jp_prefectures.py:29 +msgid "Kyoto" +msgstr "Kioto" + +#: contrib/localflavor/jp/jp_prefectures.py:30 +msgid "Osaka" +msgstr "Osaka" + +#: contrib/localflavor/jp/jp_prefectures.py:31 +msgid "Hyogo" +msgstr "Hyōgo" + +#: contrib/localflavor/jp/jp_prefectures.py:32 +msgid "Nara" +msgstr "Nara" + +#: contrib/localflavor/jp/jp_prefectures.py:33 +msgid "Wakayama" +msgstr "Wakayama" + +#: contrib/localflavor/jp/jp_prefectures.py:34 +msgid "Tottori" +msgstr "Tottori" + +#: contrib/localflavor/jp/jp_prefectures.py:35 +msgid "Shimane" +msgstr "Shimane" + +#: contrib/localflavor/jp/jp_prefectures.py:36 +msgid "Okayama" +msgstr "Okayama" + +#: contrib/localflavor/jp/jp_prefectures.py:37 +msgid "Hiroshima" +msgstr "Hiroshima" + +#: contrib/localflavor/jp/jp_prefectures.py:38 +msgid "Yamaguchi" +msgstr "Yamaguchi" + +#: contrib/localflavor/jp/jp_prefectures.py:39 +msgid "Tokushima" +msgstr "Tokushima" + +#: contrib/localflavor/jp/jp_prefectures.py:40 +msgid "Kagawa" +msgstr "Kagawa" + +#: contrib/localflavor/jp/jp_prefectures.py:41 +msgid "Ehime" +msgstr "Ehime" + +#: contrib/localflavor/jp/jp_prefectures.py:42 +msgid "Kochi" +msgstr "Kōchi" + +#: contrib/localflavor/jp/jp_prefectures.py:43 +msgid "Fukuoka" +msgstr "Fukuoka" + +#: contrib/localflavor/jp/jp_prefectures.py:44 +msgid "Saga" +msgstr "Saga" + +#: contrib/localflavor/jp/jp_prefectures.py:45 +msgid "Nagasaki" +msgstr "Nagasaki" + +#: contrib/localflavor/jp/jp_prefectures.py:46 +msgid "Kumamoto" +msgstr "Kumamoto" + +#: contrib/localflavor/jp/jp_prefectures.py:47 +msgid "Oita" +msgstr "Ōita" + +#: contrib/localflavor/jp/jp_prefectures.py:48 +msgid "Miyazaki" +msgstr "Miyazaki" + +#: contrib/localflavor/jp/jp_prefectures.py:49 +msgid "Kagoshima" +msgstr "Kagoshima" + +#: contrib/localflavor/jp/jp_prefectures.py:50 +msgid "Okinawa" +msgstr "Okinawa" + +#: contrib/localflavor/no/forms.py:36 +msgid "Enter a valid Norwegian social security number." +msgstr "Insira un número válida da seguridade social norueguesa." + +#: contrib/localflavor/uk/forms.py:18 +msgid "Enter a postcode. A space is required between the two postcode parts." +msgstr "Insira un código postal. Requírese un espazo entre as dúas partes do código postal." + +#: contrib/localflavor/us/forms.py:18 +msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX." +msgstr "Insira un código postal no formato XXXXX ou XXXXX-XXXX." + +#: contrib/localflavor/us/forms.py:51 +msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format." +msgstr "Insira un número válido da seguridade social dos Estados Unidos no formato XXX-XX-XXXX." + +#: contrib/redirects/models.py:7 +msgid "redirect from" +msgstr "orixe da redirección" + +#: contrib/redirects/models.py:8 +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"Debe ser unha ruta absoluta, sen o nome de dominio. Exemplo: '/events/" +"search/'" + +#: contrib/redirects/models.py:9 +msgid "redirect to" +msgstr "destino da redirección" + +#: contrib/redirects/models.py:10 +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Pode ser unha ruta absoluta (coma a de enriba) ou un URL completo que empece " +"por 'http://'" + +#: contrib/redirects/models.py:13 +msgid "redirect" +msgstr "redirección" + +#: contrib/redirects/models.py:14 +msgid "redirects" +msgstr "redireccións" + +#: contrib/sessions/models.py:68 msgid "session key" msgstr "clave da sesión" -#: contrib/sessions/models.py:36 +#: contrib/sessions/models.py:69 msgid "session data" msgstr "datos da sesión" -#: contrib/sessions/models.py:37 +#: contrib/sessions/models.py:70 msgid "expire date" msgstr "data de caducidade" -#: contrib/sessions/models.py:41 +#: contrib/sessions/models.py:74 msgid "session" msgstr "sesión" -#: contrib/sessions/models.py:42 +#: contrib/sessions/models.py:75 msgid "sessions" msgstr "sesións" @@ -1300,17 +2226,544 @@ msgstr "sitio" msgid "sites" msgstr "sitios" -#: utils/translation.py:360 -msgid "DATE_FORMAT" -msgstr "d-m-Y" +#: core/validators.py:65 +msgid "This value must contain only letters, numbers and underscores." +msgstr "Este valor soamente pode conter letras, números e guións baixos (_)." -#: utils/translation.py:361 -msgid "DATETIME_FORMAT" -msgstr "d-m-Y H:i" +#: core/validators.py:69 +msgid "" +"This value must contain only letters, numbers, underscores, dashes or " +"slashes." +msgstr "" +"Este valor soamente pode conter letras, números, guións baixos (_), guións " +"(-) e barras inclinadas (/)." -#: utils/translation.py:362 -msgid "TIME_FORMAT" -msgstr "H:i" +#: core/validators.py:73 +msgid "This value must contain only letters, numbers, underscores or hyphens." +msgstr "" +"Este valor soamente pode conter letras, números, guións baixos (_) e guións." + +#: core/validators.py:77 +msgid "Uppercase letters are not allowed here." +msgstr "Non se permiten letras maiúsculas." + +#: core/validators.py:81 +msgid "Lowercase letters are not allowed here." +msgstr "Non se permiten letras minúsculas." + +#: core/validators.py:88 +msgid "Enter only digits separated by commas." +msgstr "Insira só díxitos separados por comas." + +#: core/validators.py:100 +msgid "Enter valid e-mail addresses separated by commas." +msgstr "Insira enderezos de correo elecrónico válidos separados por comas." + +#: core/validators.py:104 +msgid "Please enter a valid IP address." +msgstr "Insira un enderezo IP válido." + +#: core/validators.py:108 +msgid "Empty values are not allowed here." +msgstr "Non se permiten valores en branco." + +#: core/validators.py:112 +msgid "Non-numeric characters aren't allowed here." +msgstr "Non se permiten caracteres non númericos." + +#: core/validators.py:116 +msgid "This value can't be comprised solely of digits." +msgstr "Este valor non pode estar composto por díxitos soamente." + +#: core/validators.py:121 newforms/fields.py:135 +msgid "Enter a whole number." +msgstr "Insira un número enteiro." + +#: core/validators.py:125 +msgid "Only alphabetical characters are allowed here." +msgstr "Soamente se permiten caracteres do alfabeto." + +#: core/validators.py:140 +msgid "Year must be 1900 or later." +msgstr "O ano debe ser 1900 ou posterior." + +#: core/validators.py:144 +#, python-format +msgid "Invalid date: %s" +msgstr "Data non válida: %s" + +#: core/validators.py:149 db/models/fields/__init__.py:463 +msgid "Enter a valid date in YYYY-MM-DD format." +msgstr "Insira unha data válida en formato AAAA-MM-DD." + +#: core/validators.py:154 +msgid "Enter a valid time in HH:MM format." +msgstr "Insira unha hora válida en formato HH:MM." + +#: core/validators.py:158 db/models/fields/__init__.py:532 +msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format." +msgstr "Insira unha data/hora válida en formato AAAA-MM-DD HH:MM." + +#: core/validators.py:163 newforms/fields.py:339 +msgid "Enter a valid e-mail address." +msgstr "Insira un enderezo de correo electrónico válido." + +#: core/validators.py:175 core/validators.py:453 oldforms/__init__.py:672 +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Non se enviou ficheiro ningún. Comprobe o tipo de codificación do formulario." + +#: core/validators.py:179 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Suba unha imaxe válida. O ficheiro subido non era unha imaxe ou esta estaba " +"corrupta." + +#: core/validators.py:186 +#, python-format +msgid "The URL %s does not point to a valid image." +msgstr "O URL %s non apunta a unha imaxe válida." + +#: core/validators.py:190 +#, python-format +msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid." +msgstr "" +"Os números de teléfono deben estar no formato XXX-XXX-XXXX. \"%s\" non é " +"válido." + +#: core/validators.py:198 +#, python-format +msgid "The URL %s does not point to a valid QuickTime video." +msgstr "O URL %s non apunta a unha vídeo QuickTime válido." + +#: core/validators.py:202 +msgid "A valid URL is required." +msgstr "Precísase un URL válido." + +#: core/validators.py:216 +#, python-format +msgid "" +"Valid HTML is required. Specific errors are:\n" +"%s" +msgstr "" +"Precísase HTML válido. Os erros específicos son estes:\n" +"%s" + +#: core/validators.py:223 +#, python-format +msgid "Badly formed XML: %s" +msgstr "XML mal formado: %s" + +#: core/validators.py:240 +#, python-format +msgid "Invalid URL: %s" +msgstr "URL non válido: %s" + +#: core/validators.py:245 core/validators.py:247 +#, python-format +msgid "The URL %s is a broken link." +msgstr "O URL %s é unha ligazón rota." + +#: core/validators.py:253 +msgid "Enter a valid U.S. state abbreviation." +msgstr "Insira unha abreviatura estatal válida para os Estados Unidos." + +#: core/validators.py:267 +#, python-format +msgid "Watch your mouth! The word %s is not allowed here." +msgid_plural "Watch your mouth! The words %s are not allowed here." +msgstr[0] "Sen palabrotas, por favor! Aquí non se pode usar a palabra %s." +msgstr[1] "Sen palabrotas, por favor! Aquí non se poden usar as palabras %s." + +#: core/validators.py:274 +#, python-format +msgid "This field must match the '%s' field." +msgstr "Este campo ten que coincidir co campo '%s'." + +#: core/validators.py:293 +msgid "Please enter something for at least one field." +msgstr "Por favor, encha polo menos un campo." + +#: core/validators.py:302 core/validators.py:313 +msgid "Please enter both fields or leave them both empty." +msgstr "Por favor, encha os dous campos ou deixe ambos en branco." + +#: core/validators.py:321 +#, python-format +msgid "This field must be given if %(field)s is %(value)s" +msgstr "Débese encher este campo se %(field)s é %(value)s" + +#: core/validators.py:334 +#, python-format +msgid "This field must be given if %(field)s is not %(value)s" +msgstr "Este campo débese encher se %(field)s non é %(value)s" + +#: core/validators.py:353 +msgid "Duplicate values are not allowed." +msgstr "Non se permiten valores duplicados." + +#: core/validators.py:368 +#, python-format +msgid "This value must be between %(lower)s and %(upper)s." +msgstr "Este valor ten que estar comprendido entre %(lower)s e %(upper)s." + +#: core/validators.py:370 +#, python-format +msgid "This value must be at least %s." +msgstr "Este valor ten que ser polo menos %s." + +#: core/validators.py:372 +#, python-format +msgid "This value must be no more than %s." +msgstr "Este valor non pode ser superior a %s." + +#: core/validators.py:408 +#, python-format +msgid "This value must be a power of %s." +msgstr "Este valor ten que ser unha potencia de %s." + +#: core/validators.py:417 +msgid "Please enter a valid decimal number." +msgstr "Insira un número decimal válido." + +#: core/validators.py:423 +#, python-format +msgid "Please enter a valid decimal number with at most %s total digit." +msgid_plural "" +"Please enter a valid decimal number with at most %s total digits." +msgstr[0] "Insira un número decimal válido cun máximo de %s díxito en total." +msgstr[1] "Insira un número decimal válido cun máximo de %s díxitos en total." + +#: core/validators.py:426 +#, python-format +msgid "" +"Please enter a valid decimal number with a whole part of at most %s digit." +msgid_plural "" +"Please enter a valid decimal number with a whole part of at most %s digits." +msgstr[0] "Insira un número decimal válido cunha parte enteira de como máximo %s díxito." +msgstr[1] "Insira un número decimal válido cunha parte enteira de como máximo %s díxitos." + +#: core/validators.py:429 +#, python-format +msgid "Please enter a valid decimal number with at most %s decimal place." +msgid_plural "" +"Please enter a valid decimal number with at most %s decimal places." +msgstr[0] "Insira un número decimal válido cun máximo de %s lugar decimal." +msgstr[1] "Insira un número decimal válido cun máximo de %s lugares decimais." + +#: core/validators.py:437 +msgid "Please enter a valid floating point number." +msgstr "Insira un número de coma flotante válido." + +#: core/validators.py:446 +#, python-format +msgid "Make sure your uploaded file is at least %s bytes big." +msgstr "Verifique que o ficheiro subido ten un tamaño mínimo de %s bytes." + +#: core/validators.py:447 +#, python-format +msgid "Make sure your uploaded file is at most %s bytes big." +msgstr "Verifique que o ficheiro subido ten un tamaño máximo de %s bytes." + +#: core/validators.py:464 +msgid "The format for this field is wrong." +msgstr "O formato deste campo é incorrecto." + +#: core/validators.py:479 +msgid "This field is invalid." +msgstr "Este campo non é válido." + +#: core/validators.py:515 +#, python-format +msgid "Could not retrieve anything from %s." +msgstr "Non se puido recibir ningún dato de %s." + +#: core/validators.py:518 +#, python-format +msgid "" +"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." +msgstr "" +"O URL %(url)s devolveu a cabeceira Content-Type non válida '%(contenttype)s'." + +#: core/validators.py:551 +#, python-format +msgid "" +"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with " +"\"%(start)s\".)" +msgstr "" +"Por favor, peche a etiqueta %(tag)s da liña %(line)s. (A liña comeza con \"%" +"(start)s\")." + +#: core/validators.py:555 +#, python-format +msgid "" +"Some text starting on line %(line)s is not allowed in that context. (Line " +"starts with \"%(start)s\".)" +msgstr "" +"Algún texto a partir da liña %(line)s non é válido nese contexto. (A liña " +"comeza con \"%(start)s\")." + +#: core/validators.py:560 +#, python-format +msgid "" +"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%" +"(start)s\".)" +msgstr "" +"\"%(attr)s\" na liña %(line)s non é un atributo válido. (A liña comeza con " +"\"%(start)s\")." + +#: core/validators.py:565 +#, python-format +msgid "" +"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%" +"(start)s\".)" +msgstr "" +"\"<%(tag)s>\" na liña %(line)s non é unha etiqueta válida. (A liña comeza " +"con \"%(start)s\")." + +#: core/validators.py:569 +#, python-format +msgid "" +"A tag on line %(line)s is missing one or more required attributes. (Line " +"starts with \"%(start)s\".)" +msgstr "" +"Falta un o máis dos atributos requiridos para unha etiqueta da liña %(line)" +"s. (A liña comeza con \"%(start)s\")." + +#: core/validators.py:574 +#, python-format +msgid "" +"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line " +"starts with \"%(start)s\".)" +msgstr "" +"O atributo \"%(attr)s\" na liña %(line)s contén un valor non válido. (A liña " +"comeza con \"%(start)s\")." + +#: db/models/manipulators.py:307 +#, python-format +msgid "%(object)s with this %(type)s already exists for the given %(field)s." +msgstr "" +"Xa existe un obxecto %(object)s con este %(type)s para o campo %(field)s." + +#: db/models/fields/__init__.py:46 +#, python-format +msgid "%(optname)s with this %(fieldname)s already exists." +msgstr "Xa existe un/ha %(optname)s con este/a %(fieldname)s." + +#: db/models/fields/__init__.py:121 db/models/fields/__init__.py:278 +#: db/models/fields/__init__.py:675 db/models/fields/__init__.py:686 +#: newforms/fields.py:87 newforms/fields.py:444 newforms/fields.py:520 +#: newforms/fields.py:531 newforms/models.py:186 oldforms/__init__.py:357 +msgid "This field is required." +msgstr "Requírese este campo." + +#: db/models/fields/__init__.py:373 +msgid "This value must be an integer." +msgstr "Este valor ten que ser un número enteiro." + +#: db/models/fields/__init__.py:408 +msgid "This value must be either True or False." +msgstr "Este valor ten que verdadeiro ou falso." + +#: db/models/fields/__init__.py:429 +msgid "This field cannot be null." +msgstr "Este campo non pode ser nulo." + +#: db/models/fields/__init__.py:592 +msgid "This value must be a decimal number." +msgstr "Este valor ten que ser un número decimal." + +#: db/models/fields/__init__.py:695 +msgid "Enter a valid filename." +msgstr "Introduza un nome de ficheiro válido." + +#: db/models/fields/__init__.py:818 +msgid "This value must be either None, True or False." +msgstr "Este valor ten que verdadeiro, falso ou nulo." + +#: db/models/fields/related.py:53 +#, python-format +msgid "Please enter a valid %s." +msgstr "Insira un %s válido/a." + +#: db/models/fields/related.py:642 +msgid "Separate multiple IDs with commas." +msgstr "Separe varias IDs con comas." + +#: db/models/fields/related.py:644 +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" +" Para seleccionar máis dunha entrada, manteña premida a tecla \"Control\", " +"ou \"Comando\" nun Mac." + +#: db/models/fields/related.py:691 +#, python-format +msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." +msgid_plural "" +"Please enter valid %(self)s IDs. The values %(value)r are invalid." +msgstr[0] "Insira IDs de %(self)s válidas. O valor %(value)r non é válido." +msgstr[1] "" +"Insira IDs de %(self)s válidas. Os valores %(value)r non son válidos." + +#: newforms/fields.py:110 newforms/fields.py:324 +#, python-format +msgid "Ensure this value has at most %d characters." +msgstr "Asegúrese de que este valor ten como máximo %d caracteres." + +#: newforms/fields.py:112 newforms/fields.py:326 +#, python-format +msgid "Ensure this value has at least %d characters." +msgstr "Asegúrese de que este valor ten polo menos %d caracteres." + +#: newforms/fields.py:137 newforms/fields.py:160 newforms/fields.py:192 +#, python-format +msgid "Ensure this value is less than or equal to %s." +msgstr "Asegúrese de que este valor é menor ou igual a %s." + +#: newforms/fields.py:139 newforms/fields.py:162 newforms/fields.py:194 +#, python-format +msgid "Ensure this value is greater than or equal to %s." +msgstr "Asegúrese de que este valor é maior ou igual a %s" + +#: newforms/fields.py:158 newforms/fields.py:186 +msgid "Enter a number." +msgstr "Insira un número." + +#: newforms/fields.py:196 +#, python-format +msgid "Ensure that there are no more than %s digits in total." +msgstr "Asegñurese de que non hai máis de %s díxitos en total." + +#: newforms/fields.py:198 +#, python-format +msgid "Ensure that there are no more than %s decimal places." +msgstr "Asegúrese de que non hai máis de %s lugares decimais." + +#: newforms/fields.py:200 +#, python-format +msgid "Ensure that there are no more than %s digits before the decimal point." +msgstr "Asegúrese de que no hai máis de %s díxitos antes do punto ou coma decimal." + +#: newforms/fields.py:233 +msgid "Enter a valid date." +msgstr "Insira unha data válida." + +#: newforms/fields.py:260 +msgid "Enter a valid time." +msgstr "Insira unha hora válida." + +#: newforms/fields.py:296 +msgid "Enter a valid date/time." +msgstr "Insira unha data/hora válida." + +#: newforms/fields.py:310 +msgid "Enter a valid value." +msgstr "Insira un valor válido." + +#: newforms/fields.py:357 newforms/fields.py:379 +msgid "Enter a valid URL." +msgstr "Insira un URL válido." + +#: newforms/fields.py:381 +msgid "This URL appears to be a broken link." +msgstr "Semella que este URL é unha ligazón rota." + +#: newforms/fields.py:432 newforms/models.py:173 +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Escolla unha opción válida. Esta opción non se atopa entre as opcións dispoñíbeis" + +#: newforms/fields.py:448 newforms/fields.py:524 newforms/models.py:190 +msgid "Enter a list of values." +msgstr "Insira unha lista de valores." + +#: newforms/fields.py:457 newforms/models.py:196 +#, python-format +msgid "Select a valid choice. %s is not one of the available choices." +msgstr "Escolla unha opción válida. %s non se atopa entre as opcións dispoñíbeis." + +#: oldforms/__init__.py:392 +#, python-format +msgid "Ensure your text is less than %s character." +msgid_plural "Ensure your text is less than %s characters." +msgstr[0] "Asegúrese de que o seu texto contén menos de %s carácter." +msgstr[1] "Asegúrese de que o seu texto contén menos de %s caracteres." + +#: oldforms/__init__.py:397 +msgid "Line breaks are not allowed here." +msgstr "Aquí non se permiten saltos de liña." + +#: oldforms/__init__.py:498 oldforms/__init__.py:571 oldforms/__init__.py:610 +#, python-format +msgid "Select a valid choice; '%(data)s' is not in %(choices)s." +msgstr "Elixa unha opción válida; '%(data)s' non está en %(choices)s." + +#: oldforms/__init__.py:674 +msgid "The submitted file is empty." +msgstr "O ficheiro enviado está baleiro." + +#: oldforms/__init__.py:730 +msgid "Enter a whole number between -32,768 and 32,767." +msgstr "Insira un número enteiro entre -32.768 e 32.767." + +#: oldforms/__init__.py:740 +msgid "Enter a positive number." +msgstr "Insira un número positivo." + +#: oldforms/__init__.py:750 +msgid "Enter a whole number between 0 and 32,767." +msgstr "Insira un número enteiro entre 0 e 32.767." + +#: template/defaultfilters.py:491 +msgid "yes,no,maybe" +msgstr "si,non,quizais" + +#: template/defaultfilters.py:520 +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d byte" +msgstr[1] "%(size)d bytes" + +#: template/defaultfilters.py:522 +#, python-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: template/defaultfilters.py:524 +#, python-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: template/defaultfilters.py:525 +#, python-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: utils/dateformat.py:40 +msgid "p.m." +msgstr "p.m." + +#: utils/dateformat.py:41 +msgid "a.m." +msgstr "a.m." + +#: utils/dateformat.py:46 +msgid "PM" +msgstr "PM" + +#: utils/dateformat.py:47 +msgid "AM" +msgstr "AM" + +#: utils/dateformat.py:95 +msgid "midnight" +msgstr "medianoite" + +#: utils/dateformat.py:97 +msgid "noon" +msgstr "mediodía" #: utils/dates.py:6 msgid "Monday" @@ -1500,474 +2953,61 @@ msgid_plural "minutes" msgstr[0] "minuto" msgstr[1] "minutos" -#: conf/global_settings.py:37 -msgid "Bengali" -msgstr "bengalí" - -#: conf/global_settings.py:38 -msgid "Czech" -msgstr "checo" - -#: conf/global_settings.py:39 -msgid "Welsh" -msgstr "galés" - -#: conf/global_settings.py:40 -msgid "Danish" -msgstr "dinamarqués" - -#: conf/global_settings.py:41 -msgid "German" -msgstr "alemán" - -#: conf/global_settings.py:42 -msgid "Greek" -msgstr "grego" - -#: conf/global_settings.py:43 -msgid "English" -msgstr "inglés" - -#: conf/global_settings.py:44 -msgid "Spanish" -msgstr "español" - -#: conf/global_settings.py:45 -msgid "French" -msgstr "francés" - -#: conf/global_settings.py:46 -msgid "Galician" -msgstr "galego" - -#: conf/global_settings.py:47 -msgid "Hungarian" -msgstr "húngaro" - -#: conf/global_settings.py:48 -msgid "Hebrew" -msgstr "hebreo" - -#: conf/global_settings.py:49 -msgid "Icelandic" -msgstr "islandés" - -#: conf/global_settings.py:50 -msgid "Italian" -msgstr "italiano" - -#: conf/global_settings.py:51 -msgid "Japanese" -msgstr "xaponés" - -#: conf/global_settings.py:52 -msgid "Dutch" -msgstr "holandés" - -#: conf/global_settings.py:53 -msgid "Norwegian" -msgstr "noruegués" - -#: conf/global_settings.py:54 -msgid "Brazilian" -msgstr "brasileiro" - -#: conf/global_settings.py:55 -msgid "Romanian" -msgstr "romanés" - -#: conf/global_settings.py:56 -msgid "Russian" -msgstr "ruso" - -#: conf/global_settings.py:57 -msgid "Slovak" -msgstr "eslovaco" - -#: conf/global_settings.py:58 -msgid "Slovenian" -msgstr "esloveno" - -#: conf/global_settings.py:59 -msgid "Serbian" -msgstr "serbio" - -#: conf/global_settings.py:60 -msgid "Swedish" -msgstr "sueco" - -#: conf/global_settings.py:61 -msgid "Ukrainian" -msgstr "ucraíno" - -#: conf/global_settings.py:62 -msgid "Simplified Chinese" -msgstr "chinés simplificado" - -#: conf/global_settings.py:63 -msgid "Traditional Chinese" -msgstr "chinés tradicional" - -#: core/validators.py:60 -msgid "This value must contain only letters, numbers and underscores." -msgstr "Este valor soamente pode conter letras, números e guións baixos (_)." - -#: core/validators.py:64 -msgid "" -"This value must contain only letters, numbers, underscores, dashes or " -"slashes." -msgstr "" -"Este valor soamente pode conter letras, números, guións baixos (_), guións (-) e barras " -"inclinadas (/)." - -#: core/validators.py:72 -msgid "Uppercase letters are not allowed here." -msgstr "Non se permiten letras maiúsculas." - -#: core/validators.py:76 -msgid "Lowercase letters are not allowed here." -msgstr "Non se permiten letras minúsculas." - -#: core/validators.py:83 -msgid "Enter only digits separated by commas." -msgstr "Insira só díxitos separados por comas." - -#: core/validators.py:95 -msgid "Enter valid e-mail addresses separated by commas." -msgstr "Insira enderezos de correo elecrónico válidos separados por comas." - -#: core/validators.py:99 -msgid "Please enter a valid IP address." -msgstr "Insira un enderezo IP válido." - -#: core/validators.py:103 -msgid "Empty values are not allowed here." -msgstr "Non se permiten valores en branco." - -#: core/validators.py:107 -msgid "Non-numeric characters aren't allowed here." -msgstr "Non se permiten caracteres non númericos." - -#: core/validators.py:111 -msgid "This value can't be comprised solely of digits." -msgstr "Este valor non pode estar composto por díxitos soamente." - -#: core/validators.py:116 -msgid "Enter a whole number." -msgstr "Insira un número enteiro." - -#: core/validators.py:120 -msgid "Only alphabetical characters are allowed here." -msgstr "Soamente se permiten caracteres do alfabeto." - -#: core/validators.py:124 -msgid "Enter a valid date in YYYY-MM-DD format." -msgstr "Insira unha data válida en formato AAAA-MM-DD." - -#: core/validators.py:128 -msgid "Enter a valid time in HH:MM format." -msgstr "Insira unha hora válida en formato HH:MM." - -#: core/validators.py:132 db/models/fields/__init__.py:468 -msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format." -msgstr "Insira unha data/hora válida en formato AAAA-MM-DD HH:MM." - -#: core/validators.py:136 -msgid "Enter a valid e-mail address." -msgstr "Insira un enderezo de correo electrónico válido." - -#: core/validators.py:148 -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Suba unha imaxe válida. O ficheiro subido non era unha imaxe ou esta estaba " -"corrupta." - -#: core/validators.py:155 +#: utils/timesince.py:40 #, python-format -msgid "The URL %s does not point to a valid image." -msgstr "O URL %s non apunta a unha imaxe válida." +msgid "%d milliseconds" +msgstr "%d milisegundos" -#: core/validators.py:159 +#: utils/timesince.py:41 #, python-format -msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid." -msgstr "" -"Os números de teléfono deben estar no formato XXX-XXX-XXXX. \"%s\" non é " -"válido." +msgid "%(number)d %(type)s" +msgstr "%(number)d %(type)s" -#: core/validators.py:167 +#: utils/timesince.py:47 #, python-format -msgid "The URL %s does not point to a valid QuickTime video." -msgstr "O URL %s non apunta a unha vídeo QuickTime válido." +msgid ", %(number)d %(type)s" +msgstr ", %(number)d %(type)s" -#: core/validators.py:171 -msgid "A valid URL is required." -msgstr "Precísase un URL válido." +#: utils/translation/trans_real.py:358 +msgid "DATE_FORMAT" +msgstr "d-m-Y" -#: core/validators.py:185 +#: utils/translation/trans_real.py:359 +msgid "DATETIME_FORMAT" +msgstr "d-m-Y H:i" + +#: utils/translation/trans_real.py:360 +msgid "TIME_FORMAT" +msgstr "H:i" + +#: utils/translation/trans_real.py:376 +msgid "YEAR_MONTH_FORMAT" +msgstr "m Y" + +#: utils/translation/trans_real.py:377 +msgid "MONTH_DAY_FORMAT" +msgstr "d m" + +#: views/generic/create_update.py:43 #, python-format -msgid "" -"Valid HTML is required. Specific errors are:\n" -"%s" -msgstr "" -"Precísase HTML válido. Os erros específicos son estes:\n" -"%s" +msgid "The %(verbose_name)s was created successfully." +msgstr "Creouse correctamente o/a %(verbose_name)s ." -#: core/validators.py:192 +#: views/generic/create_update.py:117 #, python-format -msgid "Badly formed XML: %s" -msgstr "XML mal formado: %s" +msgid "The %(verbose_name)s was updated successfully." +msgstr "Actualizouse correctamente o/a %(verbose_name)s." -#: core/validators.py:202 +#: views/generic/create_update.py:184 #, python-format -msgid "Invalid URL: %s" -msgstr "URL non válido: %s" +msgid "The %(verbose_name)s was deleted." +msgstr "Eliminouse o/a %(verbose_name)s" -#: core/validators.py:206 core/validators.py:208 -#, python-format -msgid "The URL %s is a broken link." -msgstr "O URL %s é unha ligazón rota." +#~ msgid "Have you forgotten your password?" +#~ msgstr "Esqueceu o contrasinal?" -#: core/validators.py:214 -msgid "Enter a valid U.S. state abbreviation." -msgstr "Insira unha abreviatura estatal válida para un dos Estados Unidos." - -#: core/validators.py:229 -#, python-format -msgid "Watch your mouth! The word %s is not allowed here." -msgid_plural "Watch your mouth! The words %s are not allowed here." -msgstr[0] "Sen palabrotas, por favor! Non se pode usar a palabra %s aquí." -msgstr[1] "Sen palabrotas, por favor! Non se poden usar as palabras %s aquí." - -#: core/validators.py:236 -#, python-format -msgid "This field must match the '%s' field." -msgstr "Este campo ten que coincidir co campo '%s'." - -#: core/validators.py:255 -msgid "Please enter something for at least one field." -msgstr "Por favor, encha polo menos un campo." - -#: core/validators.py:264 core/validators.py:275 -msgid "Please enter both fields or leave them both empty." -msgstr "Por favor, encha os dous campos ou deixe ambos en branco." - -#: core/validators.py:282 -#, python-format -msgid "This field must be given if %(field)s is %(value)s" -msgstr "Débese encher este campo se %(field)s é %(value)s" - -#: core/validators.py:294 -#, python-format -msgid "This field must be given if %(field)s is not %(value)s" -msgstr "Este campo débese encher se %(field)s non é %(value)s" - -#: core/validators.py:313 -msgid "Duplicate values are not allowed." -msgstr "Non se permiten valores duplicados." - -#: core/validators.py:336 -#, python-format -msgid "This value must be a power of %s." -msgstr "Este valor ten que ser unha potencia de %s." - -#: core/validators.py:347 -msgid "Please enter a valid decimal number." -msgstr "Insira un número decimal válido." - -#: core/validators.py:349 -#, python-format -msgid "Please enter a valid decimal number with at most %s total digit." -msgid_plural "" -"Please enter a valid decimal number with at most %s total digits." -msgstr[0] "Insira un número decimal válido cun máximo de %s díxito en total." -msgstr[1] "Insira un número decimal válido cun máximo de %s díxitos en total." - -#: core/validators.py:352 -#, python-format -msgid "Please enter a valid decimal number with at most %s decimal place." -msgid_plural "" -"Please enter a valid decimal number with at most %s decimal places." -msgstr[0] "Insira un número decimal válido cun máximo de %s lugar decimal." -msgstr[1] "Insira un número decimal válido cun máximo de %s lugares decimais." - -#: core/validators.py:362 -#, python-format -msgid "Make sure your uploaded file is at least %s bytes big." -msgstr "Verifique que o ficheiro subido ten un tamaño mínimo de %s bytes." - -#: core/validators.py:363 -#, python-format -msgid "Make sure your uploaded file is at most %s bytes big." -msgstr "Verifique que o ficheiro subido ten un tamaño máximo de %s bytes." - -#: core/validators.py:376 -msgid "The format for this field is wrong." -msgstr "O formato deste campo é incorrecto." - -#: core/validators.py:391 -msgid "This field is invalid." -msgstr "Este campo non é válido." - -#: core/validators.py:426 -#, python-format -msgid "Could not retrieve anything from %s." -msgstr "Non se puido recibir ningún dato de %s." - -#: core/validators.py:429 -#, python-format -msgid "" -"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." -msgstr "" -"O URL %(url)s devolveu a cabeceira Content-Type non válida '%(contenttype)s'." - -#: core/validators.py:462 -#, python-format -msgid "" -"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with " -"\"%(start)s\".)" -msgstr "" -"Por favor, peche a etiqueta %(tag)s da liña %(line)s. (A liña comeza con \"%" -"(start)s\")." - -#: core/validators.py:466 -#, python-format -msgid "" -"Some text starting on line %(line)s is not allowed in that context. (Line " -"starts with \"%(start)s\".)" -msgstr "" -"Algún texto a partir da liña %(line)s non é válido nese contexto. (A liña " -"comeza con \"%(start)s\")." - -#: core/validators.py:471 -#, python-format -msgid "" -"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%" -"(start)s\".)" -msgstr "" -"\"%(attr)s\" na liña %(line)s non é un atributo válido. (A liña comeza con " -"\"%(start)s\")." - -#: core/validators.py:476 -#, python-format -msgid "" -"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%" -"(start)s\".)" -msgstr "" -"\"<%(tag)s>\" na liña %(line)s non é unha etiqueta válida. (A liña comeza " -"con \"%(start)s\")." - -#: core/validators.py:480 -#, python-format -msgid "" -"A tag on line %(line)s is missing one or more required attributes. (Line " -"starts with \"%(start)s\".)" -msgstr "" -"Falta un o máis dos atributos requiridos para unha etiqueta da liña %(line)" -"s. (A liña comeza con \"%(start)s\")." - -#: core/validators.py:485 -#, python-format -msgid "" -"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line " -"starts with \"%(start)s\".)" -msgstr "" -"O atributo \"%(attr)s\" na liña %(line)s contén un valor non válido. (A liña " -"comeza con \"%(start)s\")." - -#: db/models/manipulators.py:302 -#, python-format -msgid "%(object)s with this %(type)s already exists for the given %(field)s." -msgstr "Xa existe un obxecto %(object)s con este %(type)s para o campo %(field)s." - -#: db/models/fields/__init__.py:40 -#, python-format -msgid "%(optname)s with this %(fieldname)s already exists." -msgstr "Xa existe un/ha %(optname)s con este/a %(fieldname)s." - -#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265 -#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553 -#: forms/__init__.py:346 -msgid "This field is required." -msgstr "Requírese este campo." - -#: db/models/fields/__init__.py:337 -msgid "This value must be an integer." -msgstr "Este valor ten que ser un número enteiro." - -#: db/models/fields/__init__.py:369 -msgid "This value must be either True or False." -msgstr "Este valor ten que verdadeiro ou falso." - -#: db/models/fields/__init__.py:385 -msgid "This field cannot be null." -msgstr "Este campo non pode ser nulo." - -#: db/models/fields/__init__.py:562 -msgid "Enter a valid filename." -msgstr "Introduza un nome de ficheiro válido." - -#: db/models/fields/related.py:43 -#, python-format -msgid "Please enter a valid %s." -msgstr "Insira un %s válido/a." - -#: db/models/fields/related.py:579 -msgid "Separate multiple IDs with commas." -msgstr "Separe IDs múltiplas con comas." - -#: db/models/fields/related.py:581 -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" -" Para seleccionar máis dunha entrada, manteña premida a tecla \"Control\", " -"ou \"Comando\" nun Mac." - -#: db/models/fields/related.py:625 -#, python-format -msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." -msgid_plural "" -"Please enter valid %(self)s IDs. The values %(value)r are invalid." -msgstr[0] "Insira IDs de %(self)s válidas. O valor %(value)r non é válido." -msgstr[1] "" -"Insira IDs de %(self)s válidas. Os valores %(value)r non son válidos." - -#: forms/__init__.py:380 -#, python-format -msgid "Ensure your text is less than %s character." -msgid_plural "Ensure your text is less than %s characters." -msgstr[0] "Asegúrese de que o seu texto contén menos de %s carácter." -msgstr[1] "Asegúrese de que o seu texto contén menos de %s caracteres." - -#: forms/__init__.py:385 -msgid "Line breaks are not allowed here." -msgstr "Aquí non se permiten saltos de liña." - -#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589 -#, python-format -msgid "Select a valid choice; '%(data)s' is not in %(choices)s." -msgstr "Elixa unha opción válida; '%(data)s' non está en %(choices)s." - -#: forms/__init__.py:645 -msgid "The submitted file is empty." -msgstr "O ficheiro enviado está baleiro." - -#: forms/__init__.py:699 -msgid "Enter a whole number between -32,768 and 32,767." -msgstr "Insira un número enteiro entre -32.768 e 32.767." - -#: forms/__init__.py:708 -msgid "Enter a positive number." -msgstr "Insira un número positivo." - -#: forms/__init__.py:717 -msgid "Enter a whole number between 0 and 32,767." -msgstr "Insira un número enteiro entre 0 e 32.767." - -#: template/defaultfilters.py:379 -msgid "yes,no,maybe" -msgstr "si,non,quizais" +#~ msgid "Use '[algo]$[salt]$[hexdigest]'" +#~ msgstr "Use '[algo]$[salt]$[hexdigest]'" #~ msgid "Comment" #~ msgstr "Comentario" diff --git a/django/conf/locale/pl/LC_MESSAGES/django.mo b/django/conf/locale/pl/LC_MESSAGES/django.mo index 1aa7e08dd4..798f8d72c4 100644 Binary files a/django/conf/locale/pl/LC_MESSAGES/django.mo and b/django/conf/locale/pl/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/pl/LC_MESSAGES/django.po b/django/conf/locale/pl/LC_MESSAGES/django.po index 7e7ccb850f..0fa18ce80c 100644 --- a/django/conf/locale/pl/LC_MESSAGES/django.po +++ b/django/conf/locale/pl/LC_MESSAGES/django.po @@ -28,7 +28,8 @@ msgstr "To pole jest wymagane." msgid "Ensure your text is less than %s character." msgid_plural "Ensure your text is less than %s characters." msgstr[0] "Upewnij się, że tekst ma mniej niż %s znak." -msgstr[1] "Upewnij się, że tekst ma mniej niż %s znaków." +msgstr[1] "Upewnij się, że tekst ma mniej niż %s znaki." +msgstr[2] "Upewnij się, że tekst ma mniej niż %s znaków." #: oldforms/__init__.py:397 msgid "Line breaks are not allowed here." @@ -75,7 +76,7 @@ msgid "Enter a whole number between 0 and 32,767." msgstr "Proszę wpisać liczbę całkowitą z zakresu od 0 do 32 767" #: db/models/manipulators.py:307 -#, fuzzy, python-format +#, python-format msgid "%(object)s with this %(type)s already exists for the given %(field)s." msgstr "%(object)s z %(type)s już istnieje dla %(field)s." @@ -85,7 +86,7 @@ msgid "and" msgstr "i" #: db/models/fields/__init__.py:42 -#, fuzzy, python-format +#, python-format msgid "%(optname)s with this %(fieldname)s already exists." msgstr "Już istnieje %(optname)s z %(fieldname)s." @@ -142,6 +143,9 @@ msgstr[0] "" msgstr[1] "" "Proszę podać poprawne identyfikatory %(self)s. Wartości %(value)r są " "niepoprawne." +msgstr[2] "" +"Proszę podać poprawne identyfikatory %(self)s. Wartości %(value)r są " +"niepoprawne." #: conf/global_settings.py:39 msgid "Arabic" @@ -370,7 +374,7 @@ msgstr "Niepoprawna data: %s" #: core/validators.py:153 msgid "Enter a valid time in HH:MM format." -msgstr "Proszę wpisać poprawną godzinę w formacie GG:MM." +msgstr "Proszę wpisać poprawną godzinę w formacie HH:MM." #: core/validators.py:162 newforms/fields.py:271 msgid "Enter a valid e-mail address." @@ -439,6 +443,7 @@ msgid "Watch your mouth! The word %s is not allowed here." msgid_plural "Watch your mouth! The words %s are not allowed here." msgstr[0] "Nie wolno przeklinać! Słowo %s nie jest dozwolone." msgstr[1] "Nie wolno przeklinać! Słowa %s nie są dozwolone." +msgstr[2] "Nie wolno przeklinać! Słowa %s nie są dozwolone." #: core/validators.py:273 #, python-format @@ -497,13 +502,15 @@ msgid "Please enter a valid decimal number with at most %s total digit." msgid_plural "Please enter a valid decimal number with at most %s total digits." msgstr[0] "Proszę wpisać poprawną liczbę dziesiętną o nie więcej niż %s cyfrze." msgstr[1] "Proszę wpisać poprawną liczbę dziesiętną o nie więcej niż %s cyfrach." +msgstr[2] "Proszę wpisać poprawną liczbę dziesiętną o nie więcej niż %s cyfrach." #: core/validators.py:425 #, python-format msgid "Please enter a valid decimal number with a whole part of at most %s digit." msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits." -msgstr[0] "Proszę wpisać poprawną liczbę dziesiętną zawierającą nie więcej niż %s cyfry." -msgstr[1] "Proszę wpisać poprawną liczbę dziesiętną zawierającą nie więcej niż %s cyfr." +msgstr[0] "Proszę wpisać poprawną liczbę dziesiętną zawierającą nie więcej niż %s cyfrę." +msgstr[1] "Proszę wpisać poprawną liczbę dziesiętną zawierającą nie więcej niż %s cyfry." +msgstr[2] "Proszę wpisać poprawną liczbę dziesiętną zawierającą nie więcej niż %s cyfr." #: core/validators.py:428 #, python-format @@ -515,6 +522,9 @@ msgstr[0] "" msgstr[1] "" "Proszę wpisać poprawną liczbę dziesiętną z dokładnością do %s miejsc po " "przecinku." +msgstr[2] "" +"Proszę wpisać poprawną liczbę dziesiętną z dokładnością do %s miejsc po " +"przecinku." #: core/validators.py:438 #, python-format @@ -668,7 +678,7 @@ msgstr "Wpisz poprawny URL." #: newforms/fields.py:313 msgid "This URL appears to be a broken link." -msgstr "Odnośnik %s jest nieprawidłowy." +msgstr "Ten odnośnik jest nieprawidłowy." #: contrib/humanize/templatetags/humanize.py:17 msgid "th" @@ -691,21 +701,24 @@ msgstr "-ci" msgid "%(value).1f million" msgid_plural "%(value).1f million" msgstr[0] "%(value).1f milion" -msgstr[1] "%(value).1f milionów" +msgstr[1] "%(value).1f miliony" +msgstr[2] "%(value).1f milionów" #: contrib/humanize/templatetags/humanize.py:50 #, python-format msgid "%(value).1f billion" msgid_plural "%(value).1f billion" msgstr[0] "%(value).1f miliard" -msgstr[1] "%(value).1f miliardów" +msgstr[1] "%(value).1f miliardy" +msgstr[2] "%(value).1f miliardów" #: contrib/humanize/templatetags/humanize.py:53 #, python-format msgid "%(value).1f trillion" msgid_plural "%(value).1f trillion" msgstr[0] "%(value).1f bilion" -msgstr[1] "%(value).1f bilionów" +msgstr[1] "%(value).1f biliony" +msgstr[2] "%(value).1f bilionów" #: contrib/humanize/templatetags/humanize.py:68 msgid "one" @@ -987,6 +1000,15 @@ msgstr[0] "" "\n" "%(text)s" msgstr[1] "" +"Ten komentarz został wysłany przez użytkownika, który wysłał mniej niż %" +"(count)s komentarze:\n" +"\n" +"%(text)s" +msgstr[2] "" +"Ten komentarz został wysłany przez użytkownika, który wysłał mniej niż %" +"(count)s komentarzy:\n" +"\n" +"%(text)s" #: contrib/comments/views/comments.py:116 #, python-format @@ -1574,7 +1596,8 @@ msgstr "Szukaj" msgid "1 result" msgid_plural "%(counter)s results" msgstr[0] "1 wynik" -msgstr[1] "%(counter)s wyników" +msgstr[1] "%(counter)s wyniki" +msgstr[2] "%(counter)s wyników" #: contrib/admin/templates/admin/search_form.html:10 #, python-format @@ -1681,6 +1704,7 @@ msgid "Please correct the error below." msgid_plural "Please correct the errors below." msgstr[0] "Proszę popraw poniższy błąd" msgstr[1] "Proszę popraw poniższe błędy" +msgstr[2] "Proszę popraw poniższe błędy" #: contrib/admin/templates/admin/change_form.html:50 msgid "Ordering" @@ -2077,7 +2101,6 @@ msgstr "" msgid "user permissions" msgstr "uprawnienia użytkownika" -# kurwa #: contrib/auth/models.py:115 msgid "user" msgstr "użytkownik" @@ -2831,37 +2854,43 @@ msgstr "Gru." msgid "year" msgid_plural "years" msgstr[0] "rok" -msgstr[1] "lat" +msgstr[1] "lata" +msgstr[2] "lat" #: utils/timesince.py:13 msgid "month" msgid_plural "months" msgstr[0] "miesiąc" -msgstr[1] "miesięcy" +msgstr[1] "miesięce" +msgstr[2] "miesięcy" #: utils/timesince.py:14 msgid "week" msgid_plural "weeks" msgstr[0] "tydzień" -msgstr[1] "tygodni" +msgstr[1] "tygodnie" +msgstr[2] "tygodni" #: utils/timesince.py:15 msgid "day" msgid_plural "days" msgstr[0] "dzień" msgstr[1] "dni" +msgstr[2] "dni" #: utils/timesince.py:16 msgid "hour" msgid_plural "hours" msgstr[0] "godzina" -msgstr[1] "godzin" +msgstr[1] "godziny" +msgstr[2] "godzin" #: utils/timesince.py:17 msgid "minute" msgid_plural "minutes" msgstr[0] "minuta" -msgstr[1] "minut" +msgstr[1] "minuty" +msgstr[2] "minut" #: utils/timesince.py:40 #, python-format @@ -2880,7 +2909,7 @@ msgstr ", %(number)d %(type)s" #: utils/dateformat.py:40 msgid "p.m." -msgstr "popołudniu" +msgstr "po południu" #: utils/dateformat.py:41 msgid "a.m." @@ -2888,7 +2917,7 @@ msgstr "rano" #: utils/dateformat.py:46 msgid "PM" -msgstr "popołudniu" +msgstr "po południu" #: utils/dateformat.py:47 msgid "AM" @@ -2931,13 +2960,13 @@ msgstr "tak,nie,może" msgid "%(size)d byte" msgid_plural "%(size)d bytes" msgstr[0] "%(size)d bajt" -msgstr[1] "%(size)d bajtów" -msgstr[2] "" +msgstr[1] "%(size)d bajty" +msgstr[2] "%(size)d bajtów" #: template/defaultfilters.py:522 #, python-format msgid "%.1f KB" -msgstr "%.1f kB" +msgstr "%.1f KB" #: template/defaultfilters.py:524 #, python-format diff --git a/django/conf/locale/pl/LC_MESSAGES/djangojs.mo b/django/conf/locale/pl/LC_MESSAGES/djangojs.mo index 752211a454..eb162ab3a1 100644 Binary files a/django/conf/locale/pl/LC_MESSAGES/djangojs.mo and b/django/conf/locale/pl/LC_MESSAGES/djangojs.mo differ diff --git a/django/conf/locale/pl/LC_MESSAGES/djangojs.po b/django/conf/locale/pl/LC_MESSAGES/djangojs.po index 8b929f309d..17af50f2ae 100644 --- a/django/conf/locale/pl/LC_MESSAGES/djangojs.po +++ b/django/conf/locale/pl/LC_MESSAGES/djangojs.po @@ -40,7 +40,6 @@ msgid "Chosen %s" msgstr "Wybrano %s" #: contrib/admin/media/js/SelectFilter2.js:54 -#, fuzzy msgid "Select your choice(s) and click " msgstr "Zaznacz swój wybór i kliknij " diff --git a/django/conf/locale/sk/LC_MESSAGES/django.mo b/django/conf/locale/sk/LC_MESSAGES/django.mo index 2789e1518f..9c8cfd3cd6 100644 Binary files a/django/conf/locale/sk/LC_MESSAGES/django.mo and b/django/conf/locale/sk/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/sk/LC_MESSAGES/django.po b/django/conf/locale/sk/LC_MESSAGES/django.po index f1a3cd77a2..98cc44579c 100644 --- a/django/conf/locale/sk/LC_MESSAGES/django.po +++ b/django/conf/locale/sk/LC_MESSAGES/django.po @@ -1,72 +1,77 @@ -# -# -# +# translation of django.po to Slovak +# +# +# msgid "" msgstr "" -"Project-Id-Version: Django\n" +"Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2007-03-31 14:02+0200\n" -"PO-Revision-Date: 2007-04-03 21:49+0200\n" -"Last-Translator: <>\n" -"Language-Team: Slovak\n" +"POT-Creation-Date: 2007-06-23 18:09-0400\n" +"PO-Revision-Date: 2007-06-22 20:54-0400\n" +"Last-Translator: VladoAk chete nainštalovať záložky, pretiahnite linku do vášho panela so záložkami\n" -"alebo kliknite pravým tlačidlom myši na linku a pridajte ju do svojich záložiek.\n" -"Následne môžete záložky použiť na stránkach. Všimnite si, že použitie niektorých záložiek vyžaduje, aby bol váš počítač pridaný do zoznamu INTERNAL_IPS. Ak nie ste si istý, že ste v tomto zozname, oslovte vášho administrátora.
\n" +msgstr "" +"\n" +"Ak chete nainštalovať záložky, pretiahnite linku do vášho " +"panela so záložkami\n" +"alebo kliknite pravým tlačidlom myši na linku a pridajte ju do svojich " +"záložiek.\n" +"Následne môžete záložky použiť na stránkach. Všimnite si, že použitie " +"niektorých záložiek vyžaduje, aby bol váš počítač pridaný do zoznamu " +"INTERNAL_IPS. Ak nie ste si istý, že ste v tomto zozname, oslovte vášho " +"administrátora.
\n" #: contrib/admin/templates/admin_doc/bookmarklets.html:19 msgid "Documentation for this page" @@ -1854,7 +1976,8 @@ msgid "" "Jumps you from any page to the documentation for the view that generates " "that page." msgstr "" -"Skočte z ľubovoľnej stránky do dokumentácie, kde je popísané, ako sa táto stránka generuje." +"Skočte z ľubovoľnej stránky do dokumentácie, kde je popísané, ako sa táto " +"stránka generuje." #: contrib/admin/templates/admin_doc/bookmarklets.html:22 msgid "Show object ID" @@ -1894,140 +2017,155 @@ msgstr "typ obsahu" msgid "content types" msgstr "typy obsahu" -#: contrib/auth/views.py:39 +#: contrib/auth/views.py:40 msgid "Logged out" msgstr "Odhlásený" -#: contrib/auth/models.py:38 contrib/auth/models.py:57 +#: contrib/auth/models.py:44 contrib/auth/models.py:64 msgid "name" msgstr "meno" -#: contrib/auth/models.py:40 +#: contrib/auth/models.py:46 msgid "codename" msgstr "codename" -#: contrib/auth/models.py:42 +#: contrib/auth/models.py:49 msgid "permission" msgstr "povolenie" -#: contrib/auth/models.py:43 contrib/auth/models.py:58 +#: contrib/auth/models.py:50 contrib/auth/models.py:65 msgid "permissions" msgstr "práva" -#: contrib/auth/models.py:60 +#: contrib/auth/models.py:68 msgid "group" msgstr "skupina" -#: contrib/auth/models.py:61 contrib/auth/models.py:100 +#: contrib/auth/models.py:69 contrib/auth/models.py:109 msgid "groups" msgstr "skupiny" -#: contrib/auth/models.py:90 +#: contrib/auth/models.py:99 msgid "username" msgstr "užívateľské meno" -#: contrib/auth/models.py:90 +#: contrib/auth/models.py:99 msgid "" "Required. 30 characters or fewer. Alphanumeric characters only (letters, " "digits and underscores)." -msgstr "Povinná položka s dĺžkou 30 znakov alebo menej. Povolené sú len alfanumerické znaky (písmená, čísla a podtržník)." +msgstr "" +"Povinná položka s dĺžkou 30 znakov alebo menej. Povolené sú len " +"alfanumerické znaky (písmená, čísla a podtržník)." -#: contrib/auth/models.py:91 +#: contrib/auth/models.py:100 msgid "first name" msgstr "krstné meno" -#: contrib/auth/models.py:92 +#: contrib/auth/models.py:101 msgid "last name" msgstr "priezvisko" -#: contrib/auth/models.py:93 +#: contrib/auth/models.py:102 msgid "e-mail address" msgstr "e-mailová adresa" -#: contrib/auth/models.py:94 +#: contrib/auth/models.py:103 msgid "password" msgstr "heslo" -#: contrib/auth/models.py:94 +#: contrib/auth/models.py:103 msgid "" "Use '[algo]$[salt]$[hexdigest]' or use the change " "password form." -msgstr "Použite '[algo]$[salt]$[hexdigest]' alebo formulár na zmenu hesla." +msgstr "" +"Použite '[algo]$[salt]$[hexdigest]' alebo formulár na " +"zmenu hesla." -#: contrib/auth/models.py:95 +#: contrib/auth/models.py:104 msgid "staff status" msgstr "zamestnanec" -#: contrib/auth/models.py:95 +#: contrib/auth/models.py:104 msgid "Designates whether the user can log into this admin site." -msgstr "Určuje, či má užívateľ oprávnenie prihlásiť sa do administračnej časti." +msgstr "" +"Určuje, či má užívateľ oprávnenie prihlásiť sa do administračnej časti." -#: contrib/auth/models.py:96 +#: contrib/auth/models.py:105 msgid "active" msgstr "aktívny" -#: contrib/auth/models.py:96 +#: contrib/auth/models.py:105 msgid "" "Designates whether this user can log into the Django admin. Unselect this " "instead of deleting accounts." -msgstr "Určuje, či je účet aktívny. Odškrtnite, ak chcete deaktivovať užívateľský účet." +msgstr "" +"Určuje, či je účet aktívny. Odškrtnite, ak chcete deaktivovať užívateľský " +"účet." -#: contrib/auth/models.py:97 +#: contrib/auth/models.py:106 msgid "superuser status" msgstr "superužívateľ" -#: contrib/auth/models.py:97 +#: contrib/auth/models.py:106 msgid "" "Designates that this user has all permissions without explicitly assigning " "them." -msgstr "Určuje, či užívateľ získava automaticky všetky práva aj bez priameho priradenia." +msgstr "" +"Určuje, či užívateľ získava automaticky všetky práva aj bez priameho " +"priradenia." -#: contrib/auth/models.py:98 +#: contrib/auth/models.py:107 msgid "last login" msgstr "naposledy prihlásený" -#: contrib/auth/models.py:99 +#: contrib/auth/models.py:108 msgid "date joined" msgstr "dátum registrácie" -#: contrib/auth/models.py:101 +#: contrib/auth/models.py:110 msgid "" "In addition to the permissions manually assigned, this user will also get " "all permissions granted to each group he/she is in." -msgstr "Okrem ručne zadaných práv bude mať užívateľ aj všetky práva prislúchajúce skupinám, v ktorých sa nachádza." +msgstr "" +"Okrem ručne zadaných práv bude mať užívateľ aj všetky práva prislúchajúce " +"skupinám, v ktorých sa nachádza." -#: contrib/auth/models.py:102 +#: contrib/auth/models.py:111 msgid "user permissions" msgstr "užívateľské práva" -#: contrib/auth/models.py:105 +#: contrib/auth/models.py:115 msgid "user" msgstr "uživateľ" -#: contrib/auth/models.py:106 +#: contrib/auth/models.py:116 msgid "users" msgstr "užívatelia" -#: contrib/auth/models.py:111 +#: contrib/auth/models.py:122 msgid "Personal info" msgstr "Osobné údaje" -#: contrib/auth/models.py:112 +#: contrib/auth/models.py:123 msgid "Permissions" msgstr "Práva" -#: contrib/auth/models.py:113 +#: contrib/auth/models.py:124 msgid "Important dates" msgstr "Dôležité dátumy" -#: contrib/auth/models.py:114 +#: contrib/auth/models.py:125 msgid "Groups" msgstr "Skupiny" -#: contrib/auth/models.py:258 +#: contrib/auth/models.py:269 msgid "message" msgstr "správa" +#: contrib/auth/models.py:282 +msgid "AnonymousUser" +msgstr "Neregistrovaný užívateľ" + #: contrib/auth/forms.py:17 contrib/auth/forms.py:138 msgid "The two password fields didn't match." msgstr "Pole hesla a jeho potvrdenie sa nezhodujú." @@ -2040,17 +2178,21 @@ msgstr "Užívateľ s týmto užívateľským menom už existuje." msgid "" "Your Web browser doesn't appear to have cookies enabled. Cookies are " "required for logging in." -msgstr "Váš prehliadač nemá povolené cookies. Cookies sú potrebné pre úspešné prihlásenie." +msgstr "" +"Váš prehliadač nemá povolené cookies. Cookies sú potrebné pre úspešné " +"prihlásenie." #: contrib/auth/forms.py:62 msgid "This account is inactive." msgstr "Účet je deaktivovaný." -#: contrib/auth/forms.py:85 +#: contrib/auth/forms.py:84 msgid "" "That e-mail address doesn't have an associated user account. Are you sure " "you've registered?" -msgstr "K danej e-mailovej adrese neexistuje užívateľský účet. Ste si istý, že ste sa zaregistrovali?" +msgstr "" +"K danej e-mailovej adrese neexistuje užívateľský účet. Ste si istý, že ste " +"sa zaregistrovali?" #: contrib/auth/forms.py:117 msgid "The two 'new password' fields didn't match." @@ -2062,17 +2204,129 @@ msgstr "Vaše staré heslo nebolo zadané správne. Prosím, zadajte heslo znova #: contrib/localflavor/uk/forms.py:18 msgid "Enter a postcode. A space is required between the two postcode parts." -msgstr "Zadajte britský poštový kód (PSČ). Medzera medzi dvomi časťami kódu je povinná." +msgstr "" +"Zadajte britský poštový kód (PSČ). Medzera medzi dvomi časťami kódu je " +"povinná." -#: contrib/localflavor/fr/forms.py:17 contrib/localflavor/it/forms.py:15 +#: contrib/localflavor/br/forms.py:18 +msgid "Enter a zip code in the format XXXXX-XXX." +msgstr "Vložte poštové smerovacie číslo v tvare XXXXX-XXX." + +#: contrib/localflavor/br/forms.py:30 +msgid "Phone numbers must be in XX-XXXX-XXXX format." +msgstr "Telefónne číslo musí mať formát XX-XXXX-XXXX. " + +#: contrib/localflavor/br/forms.py:72 +msgid "This field requires only numbers." +msgstr "Toto pole je môže obsahovať len čísla." + +#: contrib/localflavor/br/forms.py:74 +msgid "This field requires at most 11 digits or 14 characters." +msgstr "Toto pole môže mať najviac 11 čisiel alebo 14 písmen." + +#: contrib/localflavor/br/forms.py:84 +msgid "Invalid CPF number." +msgstr "Chybné CPF číslo." + +#: contrib/localflavor/br/forms.py:106 +msgid "This field requires at least 14 digits" +msgstr "Toto pole vyžaduje minimale 14 číslic." + +#: contrib/localflavor/br/forms.py:116 +msgid "Invalid CNPJ number." +msgstr "Chybné CNJP číslo." + +#: contrib/localflavor/au/forms.py:18 +msgid "Enter a 4 digit post code." +msgstr "Vložte 4 čísla poštového smerovacieho čísla." + +#: contrib/localflavor/fr/forms.py:17 contrib/localflavor/de/forms.py:16 #: contrib/localflavor/fi/forms.py:14 msgid "Enter a zip code in the format XXXXX." msgstr "Vložte poštové smerovacie číslo v tvare XXXXX." -#: contrib/localflavor/usa/forms.py:17 +#: contrib/localflavor/us/forms.py:18 msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX." msgstr "Zadajte americký poštový kód (ZIP) vo formáte XXXXX alebo XXXXX-XXXX." +#: contrib/localflavor/us/forms.py:51 +msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format." +msgstr "Vložte platné U.S. číslo sociálneho poistenia vo formáte XXX-XX-XXXX." + +#: contrib/localflavor/de/de_states.py:5 +msgid "Baden-Wuerttemberg" +msgstr "" + +#: contrib/localflavor/de/de_states.py:6 +msgid "Bavaria" +msgstr "Bavórsko" + +#: contrib/localflavor/de/de_states.py:7 +msgid "Berlin" +msgstr "Berlín" + +#: contrib/localflavor/de/de_states.py:8 +msgid "Brandenburg" +msgstr "" + +#: contrib/localflavor/de/de_states.py:9 +msgid "Bremen" +msgstr "" + +#: contrib/localflavor/de/de_states.py:10 +msgid "Hamburg" +msgstr "" + +#: contrib/localflavor/de/de_states.py:11 +msgid "Hessen" +msgstr "" + +#: contrib/localflavor/de/de_states.py:12 +msgid "Mecklenburg-Western Pomerania" +msgstr "" + +#: contrib/localflavor/de/de_states.py:13 +msgid "Lower Saxony" +msgstr "" + +#: contrib/localflavor/de/de_states.py:14 +msgid "North Rhine-Westphalia" +msgstr "" + +#: contrib/localflavor/de/de_states.py:15 +msgid "Rhineland-Palatinate" +msgstr "" + +#: contrib/localflavor/de/de_states.py:16 +msgid "Saarland" +msgstr "" + +#: contrib/localflavor/de/de_states.py:17 +msgid "Saxony" +msgstr "" + +#: contrib/localflavor/de/de_states.py:18 +msgid "Saxony-Anhalt" +msgstr "" + +#: contrib/localflavor/de/de_states.py:19 +msgid "Schleswig-Holstein" +msgstr "" + +#: contrib/localflavor/de/de_states.py:20 +msgid "Thuringia" +msgstr "" + +#: contrib/localflavor/de/forms.py:60 +msgid "" +"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X " +"format." +msgstr "" + +#: contrib/localflavor/jp/forms.py:21 +msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX." +msgstr "Zadajte poštové smerovacie číslo v tvare XXXXXXX alebo XXX-XXXX." + #: contrib/localflavor/jp/jp_prefectures.py:4 msgid "Hokkaido" msgstr "" @@ -2261,21 +2515,158 @@ msgstr "" msgid "Okinawa" msgstr "" -#: contrib/localflavor/jp/forms.py:21 -msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX." -msgstr "Zadajte poštové smerovacie číslo v tvare XXXXXXX alebo XXX-XXXX." +#: contrib/localflavor/ch/ch_states.py:5 +msgid "Aargau" +msgstr "" -#: contrib/localflavor/no/forms.py:15 +#: contrib/localflavor/ch/ch_states.py:6 +msgid "Appenzell Innerrhoden" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:7 +msgid "Appenzell Ausserrhoden" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:8 +msgid "Basel-Stadt" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:9 +msgid "Basel-Land" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:10 +msgid "Berne" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:11 +msgid "Fribourg" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:12 +msgid "Geneva" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:13 +msgid "Glarus" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:14 +msgid "Graubuenden" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:15 +msgid "Jura" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:16 +msgid "Lucerne" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:17 +msgid "Neuchatel" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:18 +msgid "Nidwalden" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:19 +msgid "Obwalden" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:20 +msgid "Schaffhausen" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:21 +msgid "Schwyz" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:22 +msgid "Solothurn" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:23 +msgid "St. Gallen" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:24 +msgid "Thurgau" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:25 +msgid "Ticino" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:26 +msgid "Uri" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:27 +msgid "Valais" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:28 +msgid "Vaud" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:29 +msgid "Zug" +msgstr "" + +#: contrib/localflavor/ch/ch_states.py:30 +msgid "Zurich" +msgstr "" + +#: contrib/localflavor/ch/forms.py:18 contrib/localflavor/no/forms.py:15 msgid "Enter a zip code in the format XXXX." msgstr "Vložte poštové smerovacie číslo v tvare XXXX." +#: contrib/localflavor/ch/forms.py:90 +msgid "" +"Enter a valid Swiss identity or passport card number in X1234567<0 or " +"1234567890 format." +msgstr "" + +#: contrib/localflavor/is_/forms.py:16 +msgid "" +"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX." +msgstr "Zadajte platné Islanské číslo v tvare XXXXXX-XXXX." + +#: contrib/localflavor/is_/forms.py:30 +msgid "The Icelandic identification number is not valid." +msgstr "" + +#: contrib/localflavor/it/forms.py:16 +msgid "Enter a valid zip code." +msgstr "Zadajte platné poštové smerovacie číslo." + +#: contrib/localflavor/it/forms.py:41 +msgid "Enter a valid Social Security number." +msgstr "Vložte platné číslo sociálneho poistenia ." + +#: contrib/localflavor/it/forms.py:68 +msgid "Enter a valid VAT number." +msgstr "Zadajte platné VAT číslo." + #: contrib/localflavor/no/forms.py:36 msgid "Enter a valid Norwegian social security number." -msgstr "Vložte platné nórske číslo sociálneho poistenia (social security number)." +msgstr "" +"Vložte platné nórske číslo sociálneho poistenia (social security number)." -#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:46 +#: contrib/localflavor/cl/forms.py:21 +msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X." +msgstr "" + +#: contrib/localflavor/cl/forms.py:26 +msgid "Enter valid a Chilean RUT" +msgstr "" + +#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45 msgid "Enter a valid Finnish social security number." -msgstr "Vložte platné fínske číslo sociálneho poistenia (social security number)." +msgstr "" +"Vložte platné fínske číslo sociálneho poistenia (social security number)." #: contrib/sessions/models.py:68 msgid "session key" @@ -2301,7 +2692,8 @@ msgstr "sessions" msgid "" "Example: '/about/contact/'. Make sure to have leading and trailing slashes." msgstr "" -"Príklad: '/about/contact/'. Uistite sa, že adresa obsahuje na začiatku a na konci.lomítka." +"Príklad: '/about/contact/'. Uistite sa, že adresa obsahuje na začiatku a na " +"konci.lomítka." #: contrib/flatpages/models.py:9 msgid "title" @@ -2324,8 +2716,8 @@ msgid "" "Example: 'flatpages/contact_page.html'. If this isn't provided, the system " "will use 'flatpages/default.html'." msgstr "" -"Príklad: 'flatpages/contact_page'. Ak táto šablóna neexistuje, systém použije " -"'flatpages/default'." +"Príklad: 'flatpages/contact_page'. Ak táto šablóna neexistuje, systém " +"použije 'flatpages/default'." #: contrib/flatpages/models.py:14 msgid "registration required" @@ -2497,27 +2889,54 @@ msgstr "Dec." #: utils/timesince.py:12 msgid "year" -msgstr "rok" +msgid_plural "years" +msgstr[0] "rok" +msgstr[1] "roky" #: utils/timesince.py:13 msgid "month" -msgstr "mesiac" +msgid_plural "months" +msgstr[0] "mesiac" +msgstr[1] "mesiacov" #: utils/timesince.py:14 msgid "week" -msgstr "týždeň" +msgid_plural "weeks" +msgstr[0] "týždeň" +msgstr[1] "týždňov" #: utils/timesince.py:15 msgid "day" -msgstr "deň" +msgid_plural "days" +msgstr[0] "deň" +msgstr[1] "dni" #: utils/timesince.py:16 msgid "hour" -msgstr "hodina" +msgid_plural "hours" +msgstr[0] "hodina" +msgstr[1] "hodín" #: utils/timesince.py:17 msgid "minute" -msgstr "minúta" +msgid_plural "minutes" +msgstr[0] "minúta" +msgstr[1] "minúty" + +#: utils/timesince.py:40 +#, python-format +msgid "%d milliseconds" +msgstr "" + +#: utils/timesince.py:41 +#, python-format +msgid "%(number)d %(type)s" +msgstr "" + +#: utils/timesince.py:47 +#, python-format +msgid ", %(number)d %(type)s" +msgstr "" #: utils/dateformat.py:40 msgid "p.m." @@ -2543,23 +2962,23 @@ msgstr "polnoc" msgid "noon" msgstr "poludnie" -#: utils/translation/trans_real.py:362 +#: utils/translation/trans_real.py:358 msgid "DATE_FORMAT" msgstr "" -#: utils/translation/trans_real.py:363 +#: utils/translation/trans_real.py:359 msgid "DATETIME_FORMAT" msgstr "" -#: utils/translation/trans_real.py:364 +#: utils/translation/trans_real.py:360 msgid "TIME_FORMAT" msgstr "" -#: utils/translation/trans_real.py:380 +#: utils/translation/trans_real.py:376 msgid "YEAR_MONTH_FORMAT" msgstr "" -#: utils/translation/trans_real.py:381 +#: utils/translation/trans_real.py:377 msgid "MONTH_DAY_FORMAT" msgstr "" @@ -2567,3 +2986,24 @@ msgstr "" msgid "yes,no,maybe" msgstr "áno,nie,možno" +#: template/defaultfilters.py:520 +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "" +msgstr[1] "" + +#: template/defaultfilters.py:522 +#, python-format +msgid "%.1f KB" +msgstr "" + +#: template/defaultfilters.py:524 +#, python-format +msgid "%.1f MB" +msgstr "" + +#: template/defaultfilters.py:525 +#, python-format +msgid "%.1f GB" +msgstr "" diff --git a/django/contrib/admin/media/js/admin/RelatedObjectLookups.js b/django/contrib/admin/media/js/admin/RelatedObjectLookups.js index db4ed1a9d1..e5e05a7e32 100644 --- a/django/contrib/admin/media/js/admin/RelatedObjectLookups.js +++ b/django/contrib/admin/media/js/admin/RelatedObjectLookups.js @@ -30,7 +30,12 @@ function dismissRelatedLookupPopup(win, chosenId) { function showAddAnotherPopup(triggeringLink) { var name = triggeringLink.id.replace(/^add_/, ''); name = name.replace(/\./g, '___'); - var win = window.open(triggeringLink.href + '?_popup=1', name, 'height=500,width=800,resizable=yes,scrollbars=yes'); + href = triggeringLink.href + if (href.indexOf('?') == -1) + href += '?_popup=1'; + else + href += '&_popup=1'; + var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); win.focus(); return false; } diff --git a/django/contrib/admin/models.py b/django/contrib/admin/models.py index 022d20bed9..7144c0b20b 100644 --- a/django/contrib/admin/models.py +++ b/django/contrib/admin/models.py @@ -9,7 +9,7 @@ DELETION = 3 class LogEntryManager(models.Manager): def log_action(self, user_id, content_type_id, object_id, object_repr, action_flag, change_message=''): - e = self.model(None, None, user_id, content_type_id, object_id, object_repr[:200], action_flag, change_message) + e = self.model(None, None, user_id, content_type_id, str(object_id), object_repr[:200], action_flag, change_message) e.save() class LogEntry(models.Model): diff --git a/django/contrib/admin/templatetags/admin_modify.py b/django/contrib/admin/templatetags/admin_modify.py index b8836caa5a..f9cad005d5 100644 --- a/django/contrib/admin/templatetags/admin_modify.py +++ b/django/contrib/admin/templatetags/admin_modify.py @@ -94,15 +94,15 @@ class FieldWidgetNode(template.Node): return cls.nodelists[klass] get_nodelist = classmethod(get_nodelist) - def iter_render(self, context): + def render(self, context): bound_field = template.resolve_variable(self.bound_field_var, context) context.push() context['bound_field'] = bound_field - for chunk in self.get_nodelist(bound_field.field.__class__).iter_render(context): - yield chunk + output = self.get_nodelist(bound_field.field.__class__).render(context) context.pop() + return output class FieldWrapper(object): def __init__(self, field ): @@ -157,7 +157,7 @@ class EditInlineNode(template.Node): def __init__(self, rel_var): self.rel_var = rel_var - def iter_render(self, context): + def render(self, context): relation = template.resolve_variable(self.rel_var, context) context.push() if relation.field.rel.edit_inline == models.TABULAR: @@ -169,9 +169,10 @@ class EditInlineNode(template.Node): original = context.get('original', None) bound_related_object = relation.bind(context['form'], original, bound_related_object_class) context['bound_related_object'] = bound_related_object - for chunk in loader.get_template(bound_related_object.template_name()).iter_render(context): - yield chunk + t = loader.get_template(bound_related_object.template_name()) + output = t.render(context) context.pop() + return output def output_all(form_fields): return ''.join([str(f) for f in form_fields]) diff --git a/django/contrib/admin/templatetags/adminapplist.py b/django/contrib/admin/templatetags/adminapplist.py index 53455d6c74..10e09ca0b6 100644 --- a/django/contrib/admin/templatetags/adminapplist.py +++ b/django/contrib/admin/templatetags/adminapplist.py @@ -7,7 +7,7 @@ class AdminApplistNode(template.Node): def __init__(self, varname): self.varname = varname - def iter_render(self, context): + def render(self, context): from django.db import models from django.utils.text import capfirst app_list = [] @@ -54,7 +54,7 @@ class AdminApplistNode(template.Node): 'models': model_list, }) context[self.varname] = app_list - return () + return '' def get_admin_app_list(parser, token): """ diff --git a/django/contrib/admin/templatetags/log.py b/django/contrib/admin/templatetags/log.py index 96db2373b4..8d52d2e944 100644 --- a/django/contrib/admin/templatetags/log.py +++ b/django/contrib/admin/templatetags/log.py @@ -10,14 +10,14 @@ class AdminLogNode(template.Node): def __repr__(self): return "(None)
{% endif %} + {% endfor %} {% endblock %} diff --git a/django/contrib/redirects/middleware.py b/django/contrib/redirects/middleware.py index 32f2760c45..8998c2ce3e 100644 --- a/django/contrib/redirects/middleware.py +++ b/django/contrib/redirects/middleware.py @@ -19,7 +19,7 @@ class RedirectFallbackMiddleware(object): except Redirect.DoesNotExist: pass if r is not None: - if r == '': + if r.new_path == '': return http.HttpResponseGone() return http.HttpResponsePermanentRedirect(r.new_path) diff --git a/django/core/management.py b/django/core/management.py index dd5df9d841..0c1b5528e2 100644 --- a/django/core/management.py +++ b/django/core/management.py @@ -7,9 +7,10 @@ from optparse import OptionParser from django.utils import termcolors import os, re, shutil, sys, textwrap -# For Python 2.3 -if not hasattr(__builtins__, 'set'): - from sets import Set as set +try: + set +except NameError: + from sets import Set as set # Python 2.3 fallback # For backwards compatibility: get_version() used to be in this module. get_version = django.get_version @@ -58,12 +59,16 @@ def _is_valid_dir_name(s): def _get_installed_models(table_list): "Gets a set of all models that are installed, given a list of existing tables" - from django.db import models + from django.db import backend, models all_models = [] for app in models.get_apps(): for model in models.get_models(app): all_models.append(model) - return set([m for m in all_models if m._meta.db_table in table_list]) + if backend.uses_case_insensitive_names: + converter = str.upper + else: + converter = lambda x: x + return set([m for m in all_models if converter(m._meta.db_table) in map(converter, table_list)]) def _get_table_list(): "Gets a list of all db tables that are physically installed." @@ -99,6 +104,7 @@ get_rel_data_type = lambda f: (f.get_internal_type() in ('AutoField', 'PositiveI def get_sql_create(app): "Returns a list of the CREATE TABLE SQL statements for the given app." from django.db import get_creation_module, models + data_types = get_creation_module().DATA_TYPES if not data_types: @@ -170,15 +176,20 @@ def _get_sql_model_create(model, known_models=set()): rel_field = f data_type = f.get_internal_type() col_type = data_types[data_type] + tablespace = f.db_tablespace or opts.db_tablespace if col_type is not None: # Make the definition (e.g. 'foo VARCHAR(30)') for this field. field_output = [style.SQL_FIELD(backend.quote_name(f.column)), style.SQL_COLTYPE(col_type % rel_field.__dict__)] field_output.append(style.SQL_KEYWORD('%sNULL' % (not f.null and 'NOT ' or ''))) - if f.unique: + if f.unique and (not f.primary_key or backend.allows_unique_and_pk): field_output.append(style.SQL_KEYWORD('UNIQUE')) if f.primary_key: field_output.append(style.SQL_KEYWORD('PRIMARY KEY')) + if tablespace and backend.supports_tablespaces and (f.unique or f.primary_key) and backend.autoindexes_primary_keys: + # We must specify the index tablespace inline, because we + # won't be generating a CREATE INDEX statement for this field. + field_output.append(backend.get_tablespace_sql(tablespace, inline=True)) if f.rel: if f.rel.to in known_models: field_output.append(style.SQL_KEYWORD('REFERENCES') + ' ' + \ @@ -202,9 +213,19 @@ def _get_sql_model_create(model, known_models=set()): full_statement = [style.SQL_KEYWORD('CREATE TABLE') + ' ' + style.SQL_TABLE(backend.quote_name(opts.db_table)) + ' ('] for i, line in enumerate(table_output): # Combine and add commas. full_statement.append(' %s%s' % (line, i < len(table_output)-1 and ',' or '')) - full_statement.append(');') + full_statement.append(')') + if opts.db_tablespace and backend.supports_tablespaces: + full_statement.append(backend.get_tablespace_sql(opts.db_tablespace)) + full_statement.append(';') final_output.append('\n'.join(full_statement)) + if opts.has_auto_field and hasattr(backend, 'get_autoinc_sql'): + # Add any extra SQL needed to support auto-incrementing primary keys + autoinc_sql = backend.get_autoinc_sql(opts.db_table) + if autoinc_sql: + for stmt in autoinc_sql: + final_output.append(stmt) + return final_output, pending_references def _get_sql_for_pending_references(model, pending_references): @@ -212,6 +233,7 @@ def _get_sql_for_pending_references(model, pending_references): Get any ALTER TABLE statements to add constraints after the fact. """ from django.db import backend, get_creation_module + from django.db.backends.util import truncate_name data_types = get_creation_module().DATA_TYPES final_output = [] @@ -228,7 +250,7 @@ def _get_sql_for_pending_references(model, pending_references): # So we are careful with character usage here. r_name = '%s_refs_%s_%x' % (r_col, col, abs(hash((r_table, table)))) final_output.append(style.SQL_KEYWORD('ALTER TABLE') + ' %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s)%s;' % \ - (backend.quote_name(r_table), r_name, + (backend.quote_name(r_table), truncate_name(r_name, backend.get_max_name_length()), backend.quote_name(r_col), backend.quote_name(table), backend.quote_name(col), backend.get_deferrable_sql())) del pending_references[model] @@ -244,12 +266,18 @@ def _get_many_to_many_sql_for_model(model): final_output = [] for f in opts.many_to_many: if not isinstance(f.rel, generic.GenericRel): + tablespace = f.db_tablespace or opts.db_tablespace + if tablespace and backend.supports_tablespaces and backend.autoindexes_primary_keys: + tablespace_sql = ' ' + backend.get_tablespace_sql(tablespace, inline=True) + else: + tablespace_sql = '' table_output = [style.SQL_KEYWORD('CREATE TABLE') + ' ' + \ style.SQL_TABLE(backend.quote_name(f.m2m_db_table())) + ' ('] - table_output.append(' %s %s %s,' % \ + table_output.append(' %s %s %s%s,' % \ (style.SQL_FIELD(backend.quote_name('id')), style.SQL_COLTYPE(data_types['AutoField']), - style.SQL_KEYWORD('NOT NULL PRIMARY KEY'))) + style.SQL_KEYWORD('NOT NULL PRIMARY KEY'), + tablespace_sql)) table_output.append(' %s %s %s %s (%s)%s,' % \ (style.SQL_FIELD(backend.quote_name(f.m2m_column_name())), style.SQL_COLTYPE(data_types[get_rel_data_type(opts.pk)] % opts.pk.__dict__), @@ -264,17 +292,30 @@ def _get_many_to_many_sql_for_model(model): style.SQL_TABLE(backend.quote_name(f.rel.to._meta.db_table)), style.SQL_FIELD(backend.quote_name(f.rel.to._meta.pk.column)), backend.get_deferrable_sql())) - table_output.append(' %s (%s, %s)' % \ + table_output.append(' %s (%s, %s)%s' % \ (style.SQL_KEYWORD('UNIQUE'), style.SQL_FIELD(backend.quote_name(f.m2m_column_name())), - style.SQL_FIELD(backend.quote_name(f.m2m_reverse_name())))) - table_output.append(');') + style.SQL_FIELD(backend.quote_name(f.m2m_reverse_name())), + tablespace_sql)) + table_output.append(')') + if opts.db_tablespace and backend.supports_tablespaces: + # f.db_tablespace is only for indices, so ignore its value here. + table_output.append(backend.get_tablespace_sql(opts.db_tablespace)) + table_output.append(';') final_output.append('\n'.join(table_output)) + + # Add any extra SQL needed to support auto-incrementing PKs + autoinc_sql = backend.get_autoinc_sql(f.m2m_db_table()) + if autoinc_sql: + for stmt in autoinc_sql: + final_output.append(stmt) + return final_output def get_sql_delete(app): "Returns a list of the DROP TABLE SQL statements for the given app." from django.db import backend, connection, models, get_introspection_module + from django.db.backends.util import truncate_name introspection = get_introspection_module() # This should work even if a connection isn't available @@ -288,6 +329,10 @@ def get_sql_delete(app): table_names = introspection.get_table_list(cursor) else: table_names = [] + if backend.uses_case_insensitive_names: + table_name_converter = str.upper + else: + table_name_converter = lambda x: x output = [] @@ -297,7 +342,7 @@ def get_sql_delete(app): references_to_delete = {} app_models = models.get_models(app) for model in app_models: - if cursor and model._meta.db_table in table_names: + if cursor and table_name_converter(model._meta.db_table) in table_names: # The table exists, so it needs to be dropped opts = model._meta for f in opts.fields: @@ -307,7 +352,7 @@ def get_sql_delete(app): to_delete.add(model) for model in app_models: - if cursor and model._meta.db_table in table_names: + if cursor and table_name_converter(model._meta.db_table) in table_names: # Drop the table now output.append('%s %s;' % (style.SQL_KEYWORD('DROP TABLE'), style.SQL_TABLE(backend.quote_name(model._meta.db_table)))) @@ -317,20 +362,26 @@ def get_sql_delete(app): col = f.column r_table = model._meta.db_table r_col = model._meta.get_field(f.rel.field_name).column + r_name = '%s_refs_%s_%x' % (col, r_col, abs(hash((table, r_table)))) output.append('%s %s %s %s;' % \ (style.SQL_KEYWORD('ALTER TABLE'), style.SQL_TABLE(backend.quote_name(table)), style.SQL_KEYWORD(backend.get_drop_foreignkey_sql()), - style.SQL_FIELD(backend.quote_name('%s_refs_%s_%x' % (col, r_col, abs(hash((table, r_table)))))))) + style.SQL_FIELD(truncate_name(r_name, backend.get_max_name_length())))) del references_to_delete[model] + if model._meta.has_auto_field and hasattr(backend, 'get_drop_sequence'): + output.append(backend.get_drop_sequence(model._meta.db_table)) # Output DROP TABLE statements for many-to-many tables. for model in app_models: opts = model._meta for f in opts.many_to_many: - if cursor and f.m2m_db_table() in table_names: + if cursor and table_name_converter(f.m2m_db_table()) in table_names: output.append("%s %s;" % (style.SQL_KEYWORD('DROP TABLE'), style.SQL_TABLE(backend.quote_name(f.m2m_db_table())))) + if hasattr(backend, 'get_drop_sequence'): + output.append(backend.get_drop_sequence("%s_%s" % (model._meta.db_table, f.column))) + app_label = app_models[0]._meta.app_label @@ -433,14 +484,20 @@ def get_sql_indexes_for_model(model): output = [] for f in model._meta.fields: - if f.db_index: + if f.db_index and not ((f.primary_key or f.unique) and backend.autoindexes_primary_keys): unique = f.unique and 'UNIQUE ' or '' + tablespace = f.db_tablespace or model._meta.db_tablespace + if tablespace and backend.supports_tablespaces: + tablespace_sql = ' ' + backend.get_tablespace_sql(tablespace) + else: + tablespace_sql = '' output.append( style.SQL_KEYWORD('CREATE %sINDEX' % unique) + ' ' + \ style.SQL_TABLE(backend.quote_name('%s_%s' % (model._meta.db_table, f.column))) + ' ' + \ style.SQL_KEYWORD('ON') + ' ' + \ style.SQL_TABLE(backend.quote_name(model._meta.db_table)) + ' ' + \ - "(%s);" % style.SQL_FIELD(backend.quote_name(f.column)) + "(%s)" % style.SQL_FIELD(backend.quote_name(f.column)) + \ + "%s;" % tablespace_sql ) return output @@ -464,7 +521,7 @@ def _emit_post_sync_signal(created_models, verbosity, interactive): def syncdb(verbosity=1, interactive=True): "Creates the database tables for all apps in INSTALLED_APPS whose tables haven't already been created." - from django.db import connection, transaction, models, get_creation_module + from django.db import backend, connection, transaction, models, get_creation_module from django.conf import settings disable_termcolors() @@ -487,6 +544,10 @@ def syncdb(verbosity=1, interactive=True): # Get a list of all existing database tables, # so we know what needs to be added. table_list = _get_table_list() + if backend.uses_case_insensitive_names: + table_name_converter = str.upper + else: + table_name_converter = lambda x: x # Get a list of already installed *models* so that references work right. seen_models = _get_installed_models(table_list) @@ -501,7 +562,7 @@ def syncdb(verbosity=1, interactive=True): # Create the model's database table, if it doesn't already exist. if verbosity >= 2: print "Processing %s.%s model" % (app_name, model._meta.object_name) - if model._meta.db_table in table_list: + if table_name_converter(model._meta.db_table) in table_list: continue sql, references = _get_sql_model_create(model, seen_models) seen_models.add(model) @@ -513,7 +574,7 @@ def syncdb(verbosity=1, interactive=True): print "Creating table %s" % model._meta.db_table for statement in sql: cursor.execute(statement) - table_list.append(model._meta.db_table) + table_list.append(table_name_converter(model._meta.db_table)) # Create the m2m tables. This must be done after all tables have been created # to ensure that all referred tables will exist. @@ -832,7 +893,7 @@ def inspectdb(): except NotImplementedError: indexes = {} for i, row in enumerate(introspection_module.get_table_description(cursor, table_name)): - att_name = row[0] + att_name = row[0].lower() comment_notes = [] # Holds Field notes, to be displayed in a Python comment. extra_params = {} # Holds Field parameters such as 'db_column'. @@ -1325,7 +1386,7 @@ def load_data(fixture_labels, verbosity=1): # Keep a count of the installed objects and fixtures count = [0,0] models = set() - + humanize = lambda dirname: dirname and "'%s'" % dirname or 'absolute path' # Get a cursor (even though we don't need one yet). This has @@ -1403,7 +1464,7 @@ def load_data(fixture_labels, verbosity=1): if verbosity > 1: print "No %s fixture '%s' in %s." % \ (format, fixture_name, humanize(fixture_dir)) - + if count[0] > 0: sequence_sql = backend.get_sql_sequence_reset(style, models) if sequence_sql: @@ -1411,10 +1472,10 @@ def load_data(fixture_labels, verbosity=1): print "Resetting sequences" for line in sequence_sql: cursor.execute(line) - + transaction.commit() transaction.leave_transaction_management() - + if count[0] == 0: if verbosity > 0: print "No fixtures found." @@ -1629,7 +1690,9 @@ def execute_from_command_line(action_mapping=DEFAULT_ACTION_MAPPING, argv=None): if not mod_list: parser.print_usage_and_exit() if action not in NO_SQL_TRANSACTION: - print style.SQL_KEYWORD("BEGIN;") + from django.db import backend + if backend.get_start_transaction_sql(): + print style.SQL_KEYWORD(backend.get_start_transaction_sql()) for mod in mod_list: if action == 'reset': output = action_mapping[action](mod, options.interactive) diff --git a/django/core/servers/basehttp.py b/django/core/servers/basehttp.py index 9e603b42d4..64ed739473 100644 --- a/django/core/servers/basehttp.py +++ b/django/core/servers/basehttp.py @@ -9,7 +9,7 @@ been reviewed for security issues. Don't use it for production use. from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer from types import ListType, StringType -import os, re, sys, time, urllib +import os, re, sys, time, urllib, mimetypes __version__ = "0.1" __all__ = ['WSGIServer','WSGIRequestHandler','demo_app'] @@ -309,7 +309,7 @@ class ServerHandler(object): """ if not self.result_is_file() and not self.sendfile(): for data in self.result: - self.write(data, False) + self.write(data) self.finish_content() self.close() @@ -377,7 +377,7 @@ class ServerHandler(object): else: self._write('Status: %s\r\n' % self.status) - def write(self, data, flush=True): + def write(self, data): """'write()' callable as specified by PEP 333""" assert type(data) is StringType,"write() argument must be string" @@ -394,8 +394,7 @@ class ServerHandler(object): # XXX check Content-Length and truncate if too many bytes written? self._write(data) - if flush: - self._flush() + self._flush() def sendfile(self): """Platform-specific file transmission @@ -422,6 +421,8 @@ class ServerHandler(object): if not self.headers_sent: self.headers['Content-Length'] = "0" self.send_headers() + else: + pass # XXX check if content-length was too short? def close(self): try: @@ -629,6 +630,9 @@ class AdminMediaHandler(object): else: status = '200 OK' headers = {} + mime_type = mimetypes.guess_type(file_path)[0] + if mime_type: + headers['Content-Type'] = mime_type output = [fp.read()] fp.close() start_response(status, headers.items()) diff --git a/django/core/urlresolvers.py b/django/core/urlresolvers.py index 38b3263da1..f4c2dc4677 100644 --- a/django/core/urlresolvers.py +++ b/django/core/urlresolvers.py @@ -9,8 +9,17 @@ a string) and returns a tuple in this format: from django.http import Http404 from django.core.exceptions import ImproperlyConfigured, ViewDoesNotExist +from django.utils.functional import memoize import re +try: + reversed +except NameError: + from django.utils.itercompat import reversed # Python 2.3 fallback + +_resolver_cache = {} # Maps urlconf modules to RegexURLResolver instances. +_callable_cache = {} # Maps view and url pattern names to their view functions. + class Resolver404(Http404): pass @@ -18,6 +27,34 @@ class NoReverseMatch(Exception): # Don't make this raise an error when used in a template. silent_variable_failure = True +def get_callable(lookup_view, can_fail=False): + """ + Convert a string version of a function name to the callable object. + + If the lookup_view is not an import path, it is assumed to be a URL pattern + label and the original string is returned. + + If can_fail is True, lookup_view might be a URL pattern label, so errors + during the import fail and the string is returned. + """ + if not callable(lookup_view): + mod_name, func_name = get_mod_func(lookup_view) + try: + if func_name != '': + lookup_view = getattr(__import__(mod_name, {}, {}, ['']), func_name) + except (ImportError, AttributeError): + if not can_fail: + raise + return lookup_view +get_callable = memoize(get_callable, _callable_cache) + +def get_resolver(urlconf): + if urlconf is None: + from django.conf import settings + urlconf = settings.ROOT_URLCONF + return RegexURLResolver(r'^/', urlconf) +get_resolver = memoize(get_resolver, _resolver_cache) + def get_mod_func(callback): # Converts 'django.views.news.stories.story_detail' to # ['django.views.news.stories', 'story_detail'] @@ -129,12 +166,13 @@ class RegexURLPattern(object): def _get_callback(self): if self._callback is not None: return self._callback - mod_name, func_name = get_mod_func(self._callback_str) try: - self._callback = getattr(__import__(mod_name, {}, {}, ['']), func_name) + self._callback = get_callable(self._callback_str) except ImportError, e: + mod_name, _ = get_mod_func(self._callback_str) raise ViewDoesNotExist, "Could not import %s. Error was: %s" % (mod_name, str(e)) except AttributeError, e: + mod_name, func_name = get_mod_func(self._callback_str) raise ViewDoesNotExist, "Tried %s in module %s. Error was: %s" % (func_name, mod_name, str(e)) return self._callback callback = property(_get_callback) @@ -160,6 +198,19 @@ class RegexURLResolver(object): self.urlconf_name = urlconf_name self.callback = None self.default_kwargs = default_kwargs or {} + self._reverse_dict = {} + + def _get_reverse_dict(self): + if not self._reverse_dict and hasattr(self.urlconf_module, 'urlpatterns'): + for pattern in reversed(self.urlconf_module.urlpatterns): + if isinstance(pattern, RegexURLResolver): + for key, value in pattern.reverse_dict.iteritems(): + self._reverse_dict[key] = (pattern,) + value + else: + self._reverse_dict[pattern.callback] = (pattern,) + self._reverse_dict[pattern.name] = (pattern,) + return self._reverse_dict + reverse_dict = property(_get_reverse_dict) def resolve(self, path): tried = [] @@ -209,24 +260,12 @@ class RegexURLResolver(object): return self._resolve_special('500') def reverse(self, lookup_view, *args, **kwargs): - if not callable(lookup_view): - mod_name, func_name = get_mod_func(lookup_view) - try: - lookup_view = getattr(__import__(mod_name, {}, {}, ['']), func_name) - except (ImportError, AttributeError): - if func_name != '': - raise NoReverseMatch - for pattern in self.urlconf_module.urlpatterns: - if isinstance(pattern, RegexURLResolver): - try: - return pattern.reverse_helper(lookup_view, *args, **kwargs) - except NoReverseMatch: - continue - elif pattern.callback == lookup_view or pattern.name == lookup_view: - try: - return pattern.reverse_helper(*args, **kwargs) - except NoReverseMatch: - continue + try: + lookup_view = get_callable(lookup_view, True) + except (ImportError, AttributeError): + raise NoReverseMatch + if lookup_view in self.reverse_dict: + return ''.join([reverse_helper(part.regex, *args, **kwargs) for part in self.reverse_dict[lookup_view]]) raise NoReverseMatch def reverse_helper(self, lookup_view, *args, **kwargs): @@ -235,17 +274,10 @@ class RegexURLResolver(object): return result + sub_match def resolve(path, urlconf=None): - if urlconf is None: - from django.conf import settings - urlconf = settings.ROOT_URLCONF - resolver = RegexURLResolver(r'^/', urlconf) - return resolver.resolve(path) + return get_resolver(urlconf).resolve(path) def reverse(viewname, urlconf=None, args=None, kwargs=None): args = args or [] kwargs = kwargs or {} - if urlconf is None: - from django.conf import settings - urlconf = settings.ROOT_URLCONF - resolver = RegexURLResolver(r'^/', urlconf) - return '/' + resolver.reverse(viewname, *args, **kwargs) + return '/' + get_resolver(urlconf).reverse(viewname, *args, **kwargs) + diff --git a/django/db/backends/ado_mssql/base.py b/django/db/backends/ado_mssql/base.py index 52363ed705..0deb6aae64 100644 --- a/django/db/backends/ado_mssql/base.py +++ b/django/db/backends/ado_mssql/base.py @@ -89,7 +89,14 @@ class DatabaseWrapper(local): self.connection.close() self.connection = None +allows_group_by_ordinal = True +allows_unique_and_pk = True +autoindexes_primary_keys = True +needs_datetime_string_cast = True +needs_upper_for_iops = False supports_constraints = True +supports_tablespaces = True +uses_case_insensitive_names = False def quote_name(name): if name.startswith('[') and name.endswith(']'): @@ -117,6 +124,9 @@ def get_date_trunc_sql(lookup_type, field_name): if lookup_type=='day': return "Convert(datetime, Convert(varchar(12), %s))" % field_name +def get_datetime_cast_sql(): + return None + def get_limit_offset_sql(limit, offset=None): # TODO: This is a guess. Make sure this is correct. sql = "LIMIT %s" % limit @@ -139,6 +149,18 @@ def get_drop_foreignkey_sql(): def get_pk_default_value(): return "DEFAULT" +def get_max_name_length(): + return None + +def get_start_transaction_sql(): + return "BEGIN;" + +def get_tablespace_sql(tablespace, inline=False): + return "ON %s" % quote_name(tablespace) + +def get_autoinc_sql(table): + return None + def get_sql_flush(style, tables, sequences): """Return a list of SQL statements required to remove all data from all tables in the database (without actually removing the tables diff --git a/django/db/backends/dummy/base.py b/django/db/backends/dummy/base.py index d0ec897407..6a190cf59c 100644 --- a/django/db/backends/dummy/base.py +++ b/django/db/backends/dummy/base.py @@ -33,6 +33,7 @@ class DatabaseWrapper: pass # close() supports_constraints = False +supports_tablespaces = False quote_name = complain dictfetchone = complain dictfetchmany = complain diff --git a/django/db/backends/mysql/base.py b/django/db/backends/mysql/base.py index d4cb1fa964..b0ca7994b7 100644 --- a/django/db/backends/mysql/base.py +++ b/django/db/backends/mysql/base.py @@ -134,7 +134,14 @@ class DatabaseWrapper(local): self.server_version = tuple([int(x) for x in m.groups()]) return self.server_version +allows_group_by_ordinal = True +allows_unique_and_pk = True +autoindexes_primary_keys = False +needs_datetime_string_cast = True # MySQLdb requires a typecast for dates +needs_upper_for_iops = False supports_constraints = True +supports_tablespaces = False +uses_case_insensitive_names = False def quote_name(name): if name.startswith("`") and name.endswith("`"): @@ -167,6 +174,9 @@ def get_date_trunc_sql(lookup_type, field_name): sql = "CAST(DATE_FORMAT(%s, '%s') AS DATETIME)" % (field_name, format_str) return sql +def get_datetime_cast_sql(): + return None + def get_limit_offset_sql(limit, offset=None): sql = "LIMIT " if offset and offset != 0: @@ -188,11 +198,20 @@ def get_drop_foreignkey_sql(): def get_pk_default_value(): return "DEFAULT" +def get_max_name_length(): + return None; + +def get_start_transaction_sql(): + return "BEGIN;" + +def get_autoinc_sql(table): + return None + def get_sql_flush(style, tables, sequences): """Return a list of SQL statements required to remove all data from all tables in the database (without actually removing the tables themselves) and put the database in an empty 'initial' state - + """ # NB: The generated SQL below is specific to MySQL # 'TRUNCATE x;', 'TRUNCATE y;', 'TRUNCATE z;'... style SQL statements @@ -204,7 +223,7 @@ def get_sql_flush(style, tables, sequences): style.SQL_FIELD(quote_name(table)) ) for table in tables] + \ ['SET FOREIGN_KEY_CHECKS = 1;'] - + # 'ALTER TABLE table AUTO_INCREMENT = 1;'... style SQL statements # to reset sequence indices sql.extend(["%s %s %s %s %s;" % \ diff --git a/django/db/backends/mysql_old/base.py b/django/db/backends/mysql_old/base.py index ac3b75efde..33960827ee 100644 --- a/django/db/backends/mysql_old/base.py +++ b/django/db/backends/mysql_old/base.py @@ -135,7 +135,14 @@ class DatabaseWrapper(local): self.server_version = tuple([int(x) for x in m.groups()]) return self.server_version +allows_group_by_ordinal = True +allows_unique_and_pk = True +autoindexes_primary_keys = False +needs_datetime_string_cast = True # MySQLdb requires a typecast for dates +needs_upper_for_iops = False supports_constraints = True +supports_tablespaces = False +uses_case_insensitive_names = False def quote_name(name): if name.startswith("`") and name.endswith("`"): @@ -168,6 +175,9 @@ def get_date_trunc_sql(lookup_type, field_name): sql = "CAST(DATE_FORMAT(%s, '%s') AS DATETIME)" % (field_name, format_str) return sql +def get_datetime_cast_sql(): + return None + def get_limit_offset_sql(limit, offset=None): sql = "LIMIT " if offset and offset != 0: @@ -189,11 +199,20 @@ def get_drop_foreignkey_sql(): def get_pk_default_value(): return "DEFAULT" +def get_max_name_length(): + return None; + +def get_start_transaction_sql(): + return "BEGIN;" + +def get_autoinc_sql(table): + return None + def get_sql_flush(style, tables, sequences): """Return a list of SQL statements required to remove all data from all tables in the database (without actually removing the tables themselves) and put the database in an empty 'initial' state - + """ # NB: The generated SQL below is specific to MySQL # 'TRUNCATE x;', 'TRUNCATE y;', 'TRUNCATE z;'... style SQL statements @@ -205,7 +224,7 @@ def get_sql_flush(style, tables, sequences): style.SQL_FIELD(quote_name(table)) ) for table in tables] + \ ['SET FOREIGN_KEY_CHECKS = 1;'] - + # 'ALTER TABLE table AUTO_INCREMENT = 1;'... style SQL statements # to reset sequence indices sql.extend(["%s %s %s %s %s;" % \ diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py index 2bc88bb7b9..48b3c27355 100644 --- a/django/db/backends/oracle/base.py +++ b/django/db/backends/oracle/base.py @@ -4,12 +4,16 @@ Oracle database backend for Django. Requires cx_Oracle: http://www.python.net/crew/atuining/cx_Oracle/ """ +from django.conf import settings from django.db.backends import util try: import cx_Oracle as Database except ImportError, e: from django.core.exceptions import ImproperlyConfigured raise ImproperlyConfigured, "Error loading cx_Oracle module: %s" % e +import datetime +from django.utils.datastructures import SortedDict + DatabaseError = Database.Error IntegrityError = Database.IntegrityError @@ -31,7 +35,6 @@ class DatabaseWrapper(local): return self.connection is not None def cursor(self): - from django.conf import settings if not self._valid_connection(): if len(settings.DATABASE_HOST.strip()) == 0: settings.DATABASE_HOST = 'localhost' @@ -41,25 +44,37 @@ class DatabaseWrapper(local): else: conn_string = "%s/%s@%s" % (settings.DATABASE_USER, settings.DATABASE_PASSWORD, settings.DATABASE_NAME) self.connection = Database.connect(conn_string, **self.options) - return FormatStylePlaceholderCursor(self.connection) + cursor = FormatStylePlaceholderCursor(self.connection) + # default arraysize of 1 is highly sub-optimal + cursor.arraysize = 100 + # set oracle date to ansi date format + cursor.execute("ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'") + cursor.execute("ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF'") + if settings.DEBUG: + return util.CursorDebugWrapper(cursor, self) + return cursor def _commit(self): if self.connection is not None: - self.connection.commit() + return self.connection.commit() def _rollback(self): if self.connection is not None: - try: - self.connection.rollback() - except Database.NotSupportedError: - pass + return self.connection.rollback() def close(self): if self.connection is not None: self.connection.close() self.connection = None +allows_group_by_ordinal = False +allows_unique_and_pk = False # Suppress UNIQUE/PK for Oracle (ORA-02259) +autoindexes_primary_keys = True +needs_datetime_string_cast = False +needs_upper_for_iops = True supports_constraints = True +supports_tablespaces = True +uses_case_insensitive_names = True class FormatStylePlaceholderCursor(Database.Cursor): """ @@ -67,45 +82,75 @@ class FormatStylePlaceholderCursor(Database.Cursor): This fixes it -- but note that if you want to use a literal "%s" in a query, you'll need to use "%%s". """ + def _rewrite_args(self, query, params=None): + if params is None: + params = [] + else: + # cx_Oracle can't handle unicode parameters, so cast to str for now + for i, param in enumerate(params): + if type(param) == unicode: + try: + params[i] = param.encode('utf-8') + except UnicodeError: + params[i] = str(param) + args = [(':arg%d' % i) for i in range(len(params))] + query = query % tuple(args) + # cx_Oracle wants no trailing ';' for SQL statements. For PL/SQL, it + # it does want a trailing ';' but not a trailing '/'. However, these + # characters must be included in the original query in case the query + # is being passed to SQL*Plus. + if query.endswith(';') or query.endswith('/'): + query = query[:-1] + return query, params + def execute(self, query, params=None): - if params is None: params = [] - query = self.convert_arguments(query, len(params)) + query, params = self._rewrite_args(query, params) return Database.Cursor.execute(self, query, params) def executemany(self, query, params=None): - if params is None: params = [] - query = self.convert_arguments(query, len(params[0])) + query, params = self._rewrite_args(query, params) return Database.Cursor.executemany(self, query, params) - def convert_arguments(self, query, num_params): - # replace occurances of "%s" with ":arg" - Oracle requires colons for parameter placeholders. - args = [':arg' for i in range(num_params)] - return query % tuple(args) - def quote_name(name): - return name + # SQL92 requires delimited (quoted) names to be case-sensitive. When + # not quoted, Oracle has case-insensitive behavior for identifiers, but + # always defaults to uppercase. + # We simplify things by making Oracle identifiers always uppercase. + if not name.startswith('"') and not name.endswith('"'): + name = '"%s"' % util.truncate_name(name.upper(), get_max_name_length()) + return name.upper() dictfetchone = util.dictfetchone dictfetchmany = util.dictfetchmany dictfetchall = util.dictfetchall def get_last_insert_id(cursor, table_name, pk_name): - query = "SELECT %s_sq.currval from dual" % table_name - cursor.execute(query) + sq_name = util.truncate_name(table_name, get_max_name_length()-3) + cursor.execute('SELECT %s_sq.currval FROM dual' % sq_name) return cursor.fetchone()[0] def get_date_extract_sql(lookup_type, table_name): # lookup_type is 'year', 'month', 'day' - # http://www.psoug.org/reference/date_func.html + # http://download-east.oracle.com/docs/cd/B10501_01/server.920/a96540/functions42a.htm#1017163 return "EXTRACT(%s FROM %s)" % (lookup_type, table_name) def get_date_trunc_sql(lookup_type, field_name): - return "EXTRACT(%s FROM TRUNC(%s))" % (lookup_type, field_name) + # lookup_type is 'year', 'month', 'day' + # Oracle uses TRUNC() for both dates and numbers. + # http://download-east.oracle.com/docs/cd/B10501_01/server.920/a96540/functions155a.htm#SQLRF06151 + if lookup_type == 'day': + sql = 'TRUNC(%s)' % (field_name,) + else: + sql = "TRUNC(%s, '%s')" % (field_name, lookup_type) + return sql + +def get_datetime_cast_sql(): + return "TO_TIMESTAMP(%s, 'YYYY-MM-DD HH24:MI:SS.FF')" def get_limit_offset_sql(limit, offset=None): # Limits and offset are too complicated to be handled here. - # Instead, they are handled in django/db/query.py. - pass + # Instead, they are handled in django/db/backends/oracle/query.py. + return "" def get_random_function_sql(): return "DBMS_RANDOM.RANDOM" @@ -117,40 +162,363 @@ def get_fulltext_search_sql(field_name): raise NotImplementedError def get_drop_foreignkey_sql(): - return "DROP FOREIGN KEY" + return "DROP CONSTRAINT" def get_pk_default_value(): return "DEFAULT" +def get_max_name_length(): + return 30 + +def get_start_transaction_sql(): + return None + +def get_tablespace_sql(tablespace, inline=False): + return "%sTABLESPACE %s" % ((inline and "USING INDEX " or ""), quote_name(tablespace)) + +def get_autoinc_sql(table): + # To simulate auto-incrementing primary keys in Oracle, we have to + # create a sequence and a trigger. + sq_name = get_sequence_name(table) + tr_name = get_trigger_name(table) + sequence_sql = 'CREATE SEQUENCE %s;' % sq_name + trigger_sql = """CREATE OR REPLACE TRIGGER %s + BEFORE INSERT ON %s + FOR EACH ROW + WHEN (new.id IS NULL) + BEGIN + SELECT %s.nextval INTO :new.id FROM dual; + END; + /""" % (tr_name, quote_name(table), sq_name) + return sequence_sql, trigger_sql + +def get_drop_sequence(table): + return "DROP SEQUENCE %s;" % quote_name(get_sequence_name(table)) + +def _get_sequence_reset_sql(): + # TODO: colorize this SQL code with style.SQL_KEYWORD(), etc. + return """ + DECLARE + startvalue integer; + cval integer; + BEGIN + LOCK TABLE %(table)s IN SHARE MODE; + SELECT NVL(MAX(id), 0) INTO startvalue FROM %(table)s; + SELECT %(sequence)s.nextval INTO cval FROM dual; + cval := startvalue - cval; + IF cval != 0 THEN + EXECUTE IMMEDIATE 'ALTER SEQUENCE %(sequence)s MINVALUE 0 INCREMENT BY '||cval; + SELECT %(sequence)s.nextval INTO cval FROM dual; + EXECUTE IMMEDIATE 'ALTER SEQUENCE %(sequence)s INCREMENT BY 1'; + END IF; + COMMIT; + END; + /""" + def get_sql_flush(style, tables, sequences): """Return a list of SQL statements required to remove all data from all tables in the database (without actually removing the tables themselves) and put the database in an empty 'initial' state """ - # Return a list of 'TRUNCATE x;', 'TRUNCATE y;', 'TRUNCATE z;'... style SQL statements - # TODO - SQL not actually tested against Oracle yet! - # TODO - autoincrement indices reset required? See other get_sql_flush() implementations - sql = ['%s %s;' % \ - (style.SQL_KEYWORD('TRUNCATE'), - style.SQL_FIELD(quote_name(table)) - ) for table in tables] + # Return a list of 'TRUNCATE x;', 'TRUNCATE y;', + # 'TRUNCATE z;'... style SQL statements + if tables: + # Oracle does support TRUNCATE, but it seems to get us into + # FK referential trouble, whereas DELETE FROM table works. + sql = ['%s %s %s;' % \ + (style.SQL_KEYWORD('DELETE'), + style.SQL_KEYWORD('FROM'), + style.SQL_FIELD(quote_name(table)) + ) for table in tables] + # Since we've just deleted all the rows, running our sequence + # ALTER code will reset the sequence to 0. + for sequence_info in sequences: + table_name = sequence_info['table'] + seq_name = get_sequence_name(table_name) + query = _get_sequence_reset_sql() % {'sequence':seq_name, + 'table':quote_name(table_name)} + sql.append(query) + return sql + else: + return [] + +def get_sequence_name(table): + name_length = get_max_name_length() - 3 + return '%s_SQ' % util.truncate_name(table, name_length).upper() def get_sql_sequence_reset(style, model_list): "Returns a list of the SQL statements to reset sequences for the given models." - # No sequence reset required - return [] + from django.db import models + output = [] + query = _get_sequence_reset_sql() + for model in model_list: + for f in model._meta.fields: + if isinstance(f, models.AutoField): + sequence_name = get_sequence_name(model._meta.db_table) + output.append(query % {'sequence':sequence_name, + 'table':model._meta.db_table}) + break # Only one AutoField is allowed per model, so don't bother continuing. + for f in model._meta.many_to_many: + sequence_name = get_sequence_name(f.m2m_db_table()) + output.append(query % {'sequence':sequence_name, + 'table':f.m2m_db_table()}) + return output + +def get_trigger_name(table): + name_length = get_max_name_length() - 3 + return '%s_TR' % util.truncate_name(table, name_length).upper() + +def get_query_set_class(DefaultQuerySet): + "Create a custom QuerySet class for Oracle." + + from django.db import backend, connection + from django.db.models.query import EmptyResultSet, GET_ITERATOR_CHUNK_SIZE, quote_only_if_word + + class OracleQuerySet(DefaultQuerySet): + + def iterator(self): + "Performs the SELECT database lookup of this QuerySet." + + from django.db.models.query import get_cached_row + + # self._select is a dictionary, and dictionaries' key order is + # undefined, so we convert it to a list of tuples. + extra_select = self._select.items() + + full_query = None + + try: + try: + select, sql, params, full_query = self._get_sql_clause(get_full_query=True) + except TypeError: + select, sql, params = self._get_sql_clause() + except EmptyResultSet: + raise StopIteration + if not full_query: + full_query = "SELECT %s%s\n%s" % \ + ((self._distinct and "DISTINCT " or ""), + ', '.join(select), sql) + + cursor = connection.cursor() + cursor.execute(full_query, params) + + fill_cache = self._select_related + fields = self.model._meta.fields + index_end = len(fields) + + # so here's the logic; + # 1. retrieve each row in turn + # 2. convert NCLOBs + + while 1: + rows = cursor.fetchmany(GET_ITERATOR_CHUNK_SIZE) + if not rows: + raise StopIteration + for row in rows: + row = self.resolve_columns(row, fields) + if fill_cache: + obj, index_end = get_cached_row(klass=self.model, row=row, + index_start=0, max_depth=self._max_related_depth) + else: + obj = self.model(*row[:index_end]) + for i, k in enumerate(extra_select): + setattr(obj, k[0], row[index_end+i]) + yield obj + + + def _get_sql_clause(self, get_full_query=False): + from django.db.models.query import fill_table_cache, \ + handle_legacy_orderlist, orderfield2column + + opts = self.model._meta + + # Construct the fundamental parts of the query: SELECT X FROM Y WHERE Z. + select = ["%s.%s" % (backend.quote_name(opts.db_table), backend.quote_name(f.column)) for f in opts.fields] + tables = [quote_only_if_word(t) for t in self._tables] + joins = SortedDict() + where = self._where[:] + params = self._params[:] + + # Convert self._filters into SQL. + joins2, where2, params2 = self._filters.get_sql(opts) + joins.update(joins2) + where.extend(where2) + params.extend(params2) + + # Add additional tables and WHERE clauses based on select_related. + if self._select_related: + fill_table_cache(opts, select, tables, where, opts.db_table, [opts.db_table]) + + # Add any additional SELECTs. + if self._select: + select.extend(['(%s) AS %s' % (quote_only_if_word(s[1]), backend.quote_name(s[0])) for s in self._select.items()]) + + # Start composing the body of the SQL statement. + sql = [" FROM", backend.quote_name(opts.db_table)] + + # Compose the join dictionary into SQL describing the joins. + if joins: + sql.append(" ".join(["%s %s %s ON %s" % (join_type, table, alias, condition) + for (alias, (table, join_type, condition)) in joins.items()])) + + # Compose the tables clause into SQL. + if tables: + sql.append(", " + ", ".join(tables)) + + # Compose the where clause into SQL. + if where: + sql.append(where and "WHERE " + " AND ".join(where)) + + # ORDER BY clause + order_by = [] + if self._order_by is not None: + ordering_to_use = self._order_by + else: + ordering_to_use = opts.ordering + for f in handle_legacy_orderlist(ordering_to_use): + if f == '?': # Special case. + order_by.append(backend.get_random_function_sql()) + else: + if f.startswith('-'): + col_name = f[1:] + order = "DESC" + else: + col_name = f + order = "ASC" + if "." in col_name: + table_prefix, col_name = col_name.split('.', 1) + table_prefix = backend.quote_name(table_prefix) + '.' + else: + # Use the database table as a column prefix if it wasn't given, + # and if the requested column isn't a custom SELECT. + if "." not in col_name and col_name not in (self._select or ()): + table_prefix = backend.quote_name(opts.db_table) + '.' + else: + table_prefix = '' + order_by.append('%s%s %s' % (table_prefix, backend.quote_name(orderfield2column(col_name, opts)), order)) + if order_by: + sql.append("ORDER BY " + ", ".join(order_by)) + + # Look for column name collisions in the select elements + # and fix them with an AS alias. This allows us to do a + # SELECT * later in the paging query. + cols = [clause.split('.')[-1] for clause in select] + for index, col in enumerate(cols): + if cols.count(col) > 1: + col = '%s%d' % (col.replace('"', ''), index) + cols[index] = col + select[index] = '%s AS %s' % (select[index], col) + + # LIMIT and OFFSET clauses + # To support limits and offsets, Oracle requires some funky rewriting of an otherwise normal looking query. + select_clause = ",".join(select) + distinct = (self._distinct and "DISTINCT " or "") + + if order_by: + order_by_clause = " OVER (ORDER BY %s )" % (", ".join(order_by)) + else: + #Oracle's row_number() function always requires an order-by clause. + #So we need to define a default order-by, since none was provided. + order_by_clause = " OVER (ORDER BY %s.%s)" % \ + (backend.quote_name(opts.db_table), + backend.quote_name(opts.fields[0].db_column or opts.fields[0].column)) + # limit_and_offset_clause + if self._limit is None: + assert self._offset is None, "'offset' is not allowed without 'limit'" + + if self._offset is not None: + offset = int(self._offset) + else: + offset = 0 + if self._limit is not None: + limit = int(self._limit) + else: + limit = None + + limit_and_offset_clause = '' + if limit is not None: + limit_and_offset_clause = "WHERE rn > %s AND rn <= %s" % (offset, limit+offset) + elif offset: + limit_and_offset_clause = "WHERE rn > %s" % (offset) + + if len(limit_and_offset_clause) > 0: + fmt = \ +"""SELECT * FROM + (SELECT %s%s, + ROW_NUMBER()%s AS rn + %s) +%s""" + full_query = fmt % (distinct, select_clause, + order_by_clause, ' '.join(sql).strip(), + limit_and_offset_clause) + else: + full_query = None + + if get_full_query: + return select, " ".join(sql), params, full_query + else: + return select, " ".join(sql), params + + def resolve_columns(self, row, fields=()): + from django.db.models.fields import DateField, DateTimeField, \ + TimeField, BooleanField, NullBooleanField, DecimalField, Field + values = [] + for value, field in map(None, row, fields): + if isinstance(value, Database.LOB): + value = value.read() + # Oracle stores empty strings as null. We need to undo this in + # order to adhere to the Django convention of using the empty + # string instead of null, but only if the field accepts the + # empty string. + if value is None and isinstance(field, Field) and field.empty_strings_allowed: + value = '' + # Convert 1 or 0 to True or False + elif value in (1, 0) and isinstance(field, (BooleanField, NullBooleanField)): + value = bool(value) + # Convert floats to decimals + elif value is not None and isinstance(field, DecimalField): + value = util.typecast_decimal(field.format_number(value)) + # cx_Oracle always returns datetime.datetime objects for + # DATE and TIMESTAMP columns, but Django wants to see a + # python datetime.date, .time, or .datetime. We use the type + # of the Field to determine which to cast to, but it's not + # always available. + # As a workaround, we cast to date if all the time-related + # values are 0, or to time if the date is 1/1/1900. + # This could be cleaned a bit by adding a method to the Field + # classes to normalize values from the database (the to_python + # method is used for validation and isn't what we want here). + elif isinstance(value, Database.Timestamp): + # In Python 2.3, the cx_Oracle driver returns its own + # Timestamp object that we must convert to a datetime class. + if not isinstance(value, datetime.datetime): + value = datetime.datetime(value.year, value.month, value.day, value.hour, + value.minute, value.second, value.fsecond) + if isinstance(field, DateTimeField): + pass # DateTimeField subclasses DateField so must be checked first. + elif isinstance(field, DateField): + value = value.date() + elif isinstance(field, TimeField) or (value.year == 1900 and value.month == value.day == 1): + value = value.time() + elif value.hour == value.minute == value.second == value.microsecond == 0: + value = value.date() + values.append(value) + return values + + return OracleQuerySet + OPERATOR_MAPPING = { 'exact': '= %s', - 'iexact': 'LIKE %s', - 'contains': 'LIKE %s', - 'icontains': 'LIKE %s', + 'iexact': '= UPPER(%s)', + 'contains': "LIKE %s ESCAPE '\\'", + 'icontains': "LIKE UPPER(%s) ESCAPE '\\'", 'gt': '> %s', 'gte': '>= %s', 'lt': '< %s', 'lte': '<= %s', - 'startswith': 'LIKE %s', - 'endswith': 'LIKE %s', - 'istartswith': 'LIKE %s', - 'iendswith': 'LIKE %s', + 'startswith': "LIKE %s ESCAPE '\\'", + 'endswith': "LIKE %s ESCAPE '\\'", + 'istartswith': "LIKE UPPER(%s) ESCAPE '\\'", + 'iendswith': "LIKE UPPER(%s) ESCAPE '\\'", } diff --git a/django/db/backends/oracle/client.py b/django/db/backends/oracle/client.py index 7e32ebef2f..372783aa97 100644 --- a/django/db/backends/oracle/client.py +++ b/django/db/backends/oracle/client.py @@ -2,9 +2,10 @@ from django.conf import settings import os def runshell(): - args = '' - args += settings.DATABASE_USER + dsn = settings.DATABASE_USER if settings.DATABASE_PASSWORD: - args += "/%s" % settings.DATABASE_PASSWORD - args += "@%s" % settings.DATABASE_NAME - os.execvp('sqlplus', args) + dsn += "/%s" % settings.DATABASE_PASSWORD + if settings.DATABASE_NAME: + dsn += "@%s" % settings.DATABASE_NAME + args = ["sqlplus", "-L", dsn] + os.execvp("sqlplus", args) diff --git a/django/db/backends/oracle/creation.py b/django/db/backends/oracle/creation.py index 303c7d917f..6d5039add8 100644 --- a/django/db/backends/oracle/creation.py +++ b/django/db/backends/oracle/creation.py @@ -1,26 +1,304 @@ +import sys, time +from django.core import management + +# This dictionary maps Field objects to their associated Oracle column +# types, as strings. Column-type strings can contain format strings; they'll +# be interpolated against the values of Field.__dict__ before being output. +# If a column type is set to None, it won't be included in the output. DATA_TYPES = { - 'AutoField': 'number(38)', - 'BooleanField': 'number(1)', - 'CharField': 'varchar2(%(maxlength)s)', - 'CommaSeparatedIntegerField': 'varchar2(%(maxlength)s)', - 'DateField': 'date', - 'DateTimeField': 'date', - 'DecimalField': 'number(%(max_digits)s, %(decimal_places)s)', - 'FileField': 'varchar2(100)', - 'FilePathField': 'varchar2(100)', - 'FloatField': 'double precision', - 'ImageField': 'varchar2(100)', - 'IntegerField': 'integer', - 'IPAddressField': 'char(15)', - 'NullBooleanField': 'integer', - 'OneToOneField': 'integer', - 'PhoneNumberField': 'varchar(20)', - 'PositiveIntegerField': 'integer', - 'PositiveSmallIntegerField': 'smallint', - 'SlugField': 'varchar(50)', - 'SmallIntegerField': 'smallint', - 'TextField': 'long', - 'TimeField': 'timestamp', - 'USStateField': 'varchar(2)', + 'AutoField': 'NUMBER(11)', + 'BooleanField': 'NUMBER(1) CHECK (%(column)s IN (0,1))', + 'CharField': 'VARCHAR2(%(maxlength)s)', + 'CommaSeparatedIntegerField': 'VARCHAR2(%(maxlength)s)', + 'DateField': 'DATE', + 'DateTimeField': 'TIMESTAMP', + 'DecimalField': 'NUMBER(%(max_digits)s, %(decimal_places)s)', + 'FileField': 'VARCHAR2(100)', + 'FilePathField': 'VARCHAR2(100)', + 'FloatField': 'DOUBLE PRECISION', + 'ImageField': 'VARCHAR2(100)', + 'IntegerField': 'NUMBER(11)', + 'IPAddressField': 'VARCHAR2(15)', + 'NullBooleanField': 'NUMBER(1) CHECK ((%(column)s IN (0,1)) OR (%(column)s IS NULL))', + 'OneToOneField': 'NUMBER(11)', + 'PhoneNumberField': 'VARCHAR2(20)', + 'PositiveIntegerField': 'NUMBER(11) CHECK (%(column)s >= 0)', + 'PositiveSmallIntegerField': 'NUMBER(11) CHECK (%(column)s >= 0)', + 'SlugField': 'VARCHAR2(50)', + 'SmallIntegerField': 'NUMBER(11)', + 'TextField': 'NCLOB', + 'TimeField': 'TIMESTAMP', + 'URLField': 'VARCHAR2(200)', + 'USStateField': 'CHAR(2)', 'NoField': None, } + +TEST_DATABASE_PREFIX = 'test_' +PASSWORD = 'Im_a_lumberjack' +REMEMBER = {} + + +def create_test_db(settings, connection, backend, verbosity=1, autoclobber=False): + + TEST_DATABASE_NAME = _test_database_name(settings) + TEST_DATABASE_USER = _test_database_user(settings) + TEST_DATABASE_PASSWD = _test_database_passwd(settings) + TEST_DATABASE_TBLSPACE = _test_database_tblspace(settings) + TEST_DATABASE_TBLSPACE_TMP = _test_database_tblspace_tmp(settings) + + parameters = { + 'dbname': TEST_DATABASE_NAME, + 'user': TEST_DATABASE_USER, + 'password': TEST_DATABASE_PASSWD, + 'tblspace': TEST_DATABASE_TBLSPACE, + 'tblspace_temp': TEST_DATABASE_TBLSPACE_TMP, + } + + REMEMBER['user'] = settings.DATABASE_USER + REMEMBER['passwd'] = settings.DATABASE_PASSWORD + + cursor = connection.cursor() + if _test_database_create(settings): + if verbosity >= 1: + print 'Creating test database...' + try: + _create_test_db(cursor, parameters, verbosity) + except Exception, e: + sys.stderr.write("Got an error creating the test database: %s\n" % e) + if not autoclobber: + confirm = raw_input("It appears the test database, %s, already exists. Type 'yes' to delete it, or 'no' to cancel: " % TEST_DATABASE_NAME) + if autoclobber or confirm == 'yes': + try: + if verbosity >= 1: + print "Destroying old test database..." + _destroy_test_db(cursor, parameters, verbosity) + if verbosity >= 1: + print "Creating test database..." + _create_test_db(cursor, parameters, verbosity) + except Exception, e: + sys.stderr.write("Got an error recreating the test database: %s\n" % e) + sys.exit(2) + else: + print "Tests cancelled." + sys.exit(1) + + if _test_user_create(settings): + if verbosity >= 1: + print "Creating test user..." + try: + _create_test_user(cursor, parameters, verbosity) + except Exception, e: + sys.stderr.write("Got an error creating the test user: %s\n" % e) + if not autoclobber: + confirm = raw_input("It appears the test user, %s, already exists. Type 'yes' to delete it, or 'no' to cancel: " % TEST_DATABASE_USER) + if autoclobber or confirm == 'yes': + try: + if verbosity >= 1: + print "Destroying old test user..." + _destroy_test_user(cursor, parameters, verbosity) + if verbosity >= 1: + print "Creating test user..." + _create_test_user(cursor, parameters, verbosity) + except Exception, e: + sys.stderr.write("Got an error recreating the test user: %s\n" % e) + sys.exit(2) + else: + print "Tests cancelled." + sys.exit(1) + + connection.close() + settings.DATABASE_USER = TEST_DATABASE_USER + settings.DATABASE_PASSWORD = TEST_DATABASE_PASSWD + + management.syncdb(verbosity, interactive=False) + + # Get a cursor (even though we don't need one yet). This has + # the side effect of initializing the test database. + cursor = connection.cursor() + + +def destroy_test_db(settings, connection, backend, old_database_name, verbosity=1): + connection.close() + + TEST_DATABASE_NAME = _test_database_name(settings) + TEST_DATABASE_USER = _test_database_user(settings) + TEST_DATABASE_PASSWD = _test_database_passwd(settings) + TEST_DATABASE_TBLSPACE = _test_database_tblspace(settings) + TEST_DATABASE_TBLSPACE_TMP = _test_database_tblspace_tmp(settings) + + settings.DATABASE_NAME = old_database_name + settings.DATABASE_USER = REMEMBER['user'] + settings.DATABASE_PASSWORD = REMEMBER['passwd'] + + parameters = { + 'dbname': TEST_DATABASE_NAME, + 'user': TEST_DATABASE_USER, + 'password': TEST_DATABASE_PASSWD, + 'tblspace': TEST_DATABASE_TBLSPACE, + 'tblspace_temp': TEST_DATABASE_TBLSPACE_TMP, + } + + REMEMBER['user'] = settings.DATABASE_USER + REMEMBER['passwd'] = settings.DATABASE_PASSWORD + + cursor = connection.cursor() + time.sleep(1) # To avoid "database is being accessed by other users" errors. + if _test_user_create(settings): + if verbosity >= 1: + print 'Destroying test user...' + _destroy_test_user(cursor, parameters, verbosity) + if _test_database_create(settings): + if verbosity >= 1: + print 'Destroying test database...' + _destroy_test_db(cursor, parameters, verbosity) + connection.close() + + +def _create_test_db(cursor, parameters, verbosity): + if verbosity >= 2: + print "_create_test_db(): dbname = %s" % parameters['dbname'] + statements = [ + """CREATE TABLESPACE %(tblspace)s + DATAFILE '%(tblspace)s.dbf' SIZE 20M + REUSE AUTOEXTEND ON NEXT 10M MAXSIZE 100M + """, + """CREATE TEMPORARY TABLESPACE %(tblspace_temp)s + TEMPFILE '%(tblspace_temp)s.dbf' SIZE 20M + REUSE AUTOEXTEND ON NEXT 10M MAXSIZE 100M + """, + ] + _execute_statements(cursor, statements, parameters, verbosity) + + +def _create_test_user(cursor, parameters, verbosity): + if verbosity >= 2: + print "_create_test_user(): username = %s" % parameters['user'] + statements = [ + """CREATE USER %(user)s + IDENTIFIED BY %(password)s + DEFAULT TABLESPACE %(tblspace)s + TEMPORARY TABLESPACE %(tblspace_temp)s + """, + """GRANT CONNECT, RESOURCE TO %(user)s""", + ] + _execute_statements(cursor, statements, parameters, verbosity) + + +def _destroy_test_db(cursor, parameters, verbosity): + if verbosity >= 2: + print "_destroy_test_db(): dbname=%s" % parameters['dbname'] + statements = [ + 'DROP TABLESPACE %(tblspace)s INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS', + 'DROP TABLESPACE %(tblspace_temp)s INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS', + ] + _execute_statements(cursor, statements, parameters, verbosity) + + +def _destroy_test_user(cursor, parameters, verbosity): + if verbosity >= 2: + print "_destroy_test_user(): user=%s" % parameters['user'] + print "Be patient. This can take some time..." + statements = [ + 'DROP USER %(user)s CASCADE', + ] + _execute_statements(cursor, statements, parameters, verbosity) + + +def _execute_statements(cursor, statements, parameters, verbosity): + for template in statements: + stmt = template % parameters + if verbosity >= 2: + print stmt + try: + cursor.execute(stmt) + except Exception, err: + sys.stderr.write("Failed (%s)\n" % (err)) + raise + + +def _test_database_name(settings): + name = TEST_DATABASE_PREFIX + settings.DATABASE_NAME + try: + if settings.TEST_DATABASE_NAME: + name = settings.TEST_DATABASE_NAME + except AttributeError: + pass + except: + raise + return name + + +def _test_database_create(settings): + name = True + try: + if settings.TEST_DATABASE_CREATE: + name = True + else: + name = False + except AttributeError: + pass + except: + raise + return name + + +def _test_user_create(settings): + name = True + try: + if settings.TEST_USER_CREATE: + name = True + else: + name = False + except AttributeError: + pass + except: + raise + return name + + +def _test_database_user(settings): + name = TEST_DATABASE_PREFIX + settings.DATABASE_NAME + try: + if settings.TEST_DATABASE_USER: + name = settings.TEST_DATABASE_USER + except AttributeError: + pass + except: + raise + return name + + +def _test_database_passwd(settings): + name = PASSWORD + try: + if settings.TEST_DATABASE_PASSWD: + name = settings.TEST_DATABASE_PASSWD + except AttributeError: + pass + except: + raise + return name + + +def _test_database_tblspace(settings): + name = TEST_DATABASE_PREFIX + settings.DATABASE_NAME + try: + if settings.TEST_DATABASE_TBLSPACE: + name = settings.TEST_DATABASE_TBLSPACE + except AttributeError: + pass + except: + raise + return name + + +def _test_database_tblspace_tmp(settings): + name = TEST_DATABASE_PREFIX + settings.DATABASE_NAME + '_temp' + try: + if settings.TEST_DATABASE_TBLSPACE_TMP: + name = settings.TEST_DATABASE_TBLSPACE_TMP + except AttributeError: + pass + except: + raise + return name diff --git a/django/db/backends/oracle/introspection.py b/django/db/backends/oracle/introspection.py index 7634206178..44430a0029 100644 --- a/django/db/backends/oracle/introspection.py +++ b/django/db/backends/oracle/introspection.py @@ -1,14 +1,19 @@ +from django.db.backends.oracle.base import quote_name import re +import cx_Oracle + foreign_key_re = re.compile(r"\sCONSTRAINT `[^`]*` FOREIGN KEY \(`([^`]*)`\) REFERENCES `([^`]*)` \(`([^`]*)`\)") def get_table_list(cursor): "Returns a list of table names in the current database." cursor.execute("SELECT TABLE_NAME FROM USER_TABLES") - return [row[0] for row in cursor.fetchall()] + return [row[0].upper() for row in cursor.fetchall()] def get_table_description(cursor, table_name): - return table_name + "Returns a description of the table, with the DB-API cursor.description interface." + cursor.execute("SELECT * FROM %s WHERE ROWNUM < 2" % quote_name(table_name)) + return cursor.description def _name_to_index(cursor, table_name): """ @@ -22,7 +27,24 @@ def get_relations(cursor, table_name): Returns a dictionary of {field_index: (field_index_other_table, other_table)} representing all relationships to the given table. Indexes are 0-based. """ - raise NotImplementedError + cursor.execute(""" +SELECT ta.column_id - 1, tb.table_name, tb.column_id - 1 +FROM user_constraints, USER_CONS_COLUMNS ca, USER_CONS_COLUMNS cb, + user_tab_cols ta, user_tab_cols tb +WHERE user_constraints.table_name = %s AND + ta.table_name = %s AND + ta.column_name = ca.column_name AND + ca.table_name = %s AND + user_constraints.constraint_name = ca.constraint_name AND + user_constraints.r_constraint_name = cb.constraint_name AND + cb.table_name = tb.table_name AND + cb.column_name = tb.column_name AND + ca.position = cb.position""", [table_name, table_name, table_name]) + + relations = {} + for row in cursor.fetchall(): + relations[row[0]] = (row[2], row[1]) + return relations def get_indexes(cursor, table_name): """ @@ -31,20 +53,46 @@ def get_indexes(cursor, table_name): {'primary_key': boolean representing whether it's the primary key, 'unique': boolean representing whether it's a unique index} """ - raise NotImplementedError + # This query retrieves each index on the given table, including the + # first associated field name + # "We were in the nick of time; you were in great peril!" + sql = """ +WITH primarycols AS ( + SELECT user_cons_columns.table_name, user_cons_columns.column_name, 1 AS PRIMARYCOL + FROM user_cons_columns, user_constraints + WHERE user_cons_columns.constraint_name = user_constraints.constraint_name AND + user_constraints.constraint_type = 'P' AND + user_cons_columns.table_name = %s), + uniquecols AS ( + SELECT user_ind_columns.table_name, user_ind_columns.column_name, 1 AS UNIQUECOL + FROM user_indexes, user_ind_columns + WHERE uniqueness = 'UNIQUE' AND + user_indexes.index_name = user_ind_columns.index_name AND + user_ind_columns.table_name = %s) +SELECT allcols.column_name, primarycols.primarycol, uniquecols.UNIQUECOL +FROM (SELECT column_name FROM primarycols UNION SELECT column_name FROM +uniquecols) allcols, + primarycols, uniquecols +WHERE allcols.column_name = primarycols.column_name (+) AND + allcols.column_name = uniquecols.column_name (+) + """ + cursor.execute(sql, [table_name, table_name]) + indexes = {} + for row in cursor.fetchall(): + # row[1] (idx.indkey) is stored in the DB as an array. It comes out as + # a string of space-separated integers. This designates the field + # indexes (1-based) of the fields that have indexes on the table. + # Here, we skip any indexes across multiple fields. + indexes[row[0]] = {'primary_key': row[1], 'unique': row[2]} + return indexes -# Maps type codes to Django Field types. +# Maps type objects to Django Field types. DATA_TYPES_REVERSE = { - 16: 'BooleanField', - 21: 'SmallIntegerField', - 23: 'IntegerField', - 25: 'TextField', - 869: 'IPAddressField', - 1043: 'CharField', - 1082: 'DateField', - 1083: 'TimeField', - 1114: 'DateTimeField', - 1184: 'DateTimeField', - 1266: 'TimeField', - 1700: 'DecimalField', + cx_Oracle.CLOB: 'TextField', + cx_Oracle.DATETIME: 'DateTimeField', + cx_Oracle.FIXED_CHAR: 'CharField', + cx_Oracle.NCLOB: 'TextField', + cx_Oracle.NUMBER: 'DecimalField', + cx_Oracle.STRING: 'CharField', + cx_Oracle.TIMESTAMP: 'DateTimeField', } diff --git a/django/db/backends/postgresql/base.py b/django/db/backends/postgresql/base.py index fedbb6b7f1..351b553506 100644 --- a/django/db/backends/postgresql/base.py +++ b/django/db/backends/postgresql/base.py @@ -87,7 +87,7 @@ class DatabaseWrapper(local): global postgres_version if not postgres_version: cursor.execute("SELECT version()") - postgres_version = [int(val) for val in cursor.fetchone()[0].split()[1].split('.')] + postgres_version = [int(val) for val in cursor.fetchone()[0].split()[1].split('.')] if settings.DEBUG: return util.CursorDebugWrapper(cursor, self) return cursor @@ -105,7 +105,14 @@ class DatabaseWrapper(local): self.connection.close() self.connection = None +allows_group_by_ordinal = True +allows_unique_and_pk = True +autoindexes_primary_keys = True +needs_datetime_string_cast = True +needs_upper_for_iops = False supports_constraints = True +supports_tablespaces = False +uses_case_insensitive_names = False def quote_name(name): if name.startswith('"') and name.endswith('"'): @@ -138,6 +145,9 @@ def get_date_trunc_sql(lookup_type, field_name): # http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC return "DATE_TRUNC('%s', %s)" % (lookup_type, field_name) +def get_datetime_cast_sql(): + return None + def get_limit_offset_sql(limit, offset=None): sql = "LIMIT %s" % limit if offset and offset != 0: @@ -149,7 +159,7 @@ def get_random_function_sql(): def get_deferrable_sql(): return " DEFERRABLE INITIALLY DEFERRED" - + def get_fulltext_search_sql(field_name): raise NotImplementedError @@ -159,12 +169,21 @@ def get_drop_foreignkey_sql(): def get_pk_default_value(): return "DEFAULT" +def get_max_name_length(): + return None + +def get_start_transaction_sql(): + return "BEGIN;" + +def get_autoinc_sql(table): + return None + def get_sql_flush(style, tables, sequences): """Return a list of SQL statements required to remove all data from all tables in the database (without actually removing the tables themselves) and put the database in an empty 'initial' state - - """ + + """ if tables: if postgres_version[0] >= 8 and postgres_version[1] >= 1: # Postgres 8.1+ can do 'TRUNCATE x, y, z...;'. In fact, it *has to* in order to be able to @@ -175,7 +194,7 @@ def get_sql_flush(style, tables, sequences): style.SQL_FIELD(', '.join([quote_name(table) for table in tables])) )] else: - # Older versions of Postgres can't do TRUNCATE in a single call, so they must use + # Older versions of Postgres can't do TRUNCATE in a single call, so they must use # a simple delete. sql = ['%s %s %s;' % \ (style.SQL_KEYWORD('DELETE'), @@ -243,7 +262,7 @@ def get_sql_sequence_reset(style, model_list): style.SQL_KEYWORD('FROM'), style.SQL_TABLE(f.m2m_db_table()))) return output - + # Register these custom typecasts, because Django expects dates/times to be # in Python's native (standard-library) datetime/time format, whereas psycopg # use mx.DateTime by default. diff --git a/django/db/backends/postgresql_psycopg2/base.py b/django/db/backends/postgresql_psycopg2/base.py index d9ad363ac1..36f4d97a22 100644 --- a/django/db/backends/postgresql_psycopg2/base.py +++ b/django/db/backends/postgresql_psycopg2/base.py @@ -55,7 +55,7 @@ class DatabaseWrapper(local): global postgres_version if not postgres_version: cursor.execute("SELECT version()") - postgres_version = [int(val) for val in cursor.fetchone()[0].split()[1].split('.')] + postgres_version = [int(val) for val in cursor.fetchone()[0].split()[1].split('.')] if settings.DEBUG: return util.CursorDebugWrapper(cursor, self) return cursor @@ -73,7 +73,14 @@ class DatabaseWrapper(local): self.connection.close() self.connection = None +allows_group_by_ordinal = True +allows_unique_and_pk = True +autoindexes_primary_keys = True +needs_datetime_string_cast = False +needs_upper_for_iops = False supports_constraints = True +supports_tablespaces = False +uses_case_insensitive_names = False def quote_name(name): if name.startswith('"') and name.endswith('"'): @@ -98,6 +105,9 @@ def get_date_trunc_sql(lookup_type, field_name): # http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC return "DATE_TRUNC('%s', %s)" % (lookup_type, field_name) +def get_datetime_cast_sql(): + return None + def get_limit_offset_sql(limit, offset=None): sql = "LIMIT %s" % limit if offset and offset != 0: @@ -119,6 +129,15 @@ def get_drop_foreignkey_sql(): def get_pk_default_value(): return "DEFAULT" +def get_max_name_length(): + return None + +def get_start_transaction_sql(): + return "BEGIN;" + +def get_autoinc_sql(table): + return None + def get_sql_flush(style, tables, sequences): """Return a list of SQL statements required to remove all data from all tables in the database (without actually removing the tables @@ -139,7 +158,7 @@ def get_sql_flush(style, tables, sequences): style.SQL_KEYWORD('FROM'), style.SQL_FIELD(quote_name(table)) ) for table in tables] - + # 'ALTER SEQUENCE sequence_name RESTART WITH 1;'... style SQL statements # to reset sequence indices for sequence in sequences: @@ -200,7 +219,7 @@ def get_sql_sequence_reset(style, model_list): style.SQL_KEYWORD('FROM'), style.SQL_TABLE(f.m2m_db_table()))) return output - + OPERATOR_MAPPING = { 'exact': '= %s', 'iexact': 'ILIKE %s', diff --git a/django/db/backends/sqlite3/base.py b/django/db/backends/sqlite3/base.py index 5cd67a32f5..b753879d7a 100644 --- a/django/db/backends/sqlite3/base.py +++ b/django/db/backends/sqlite3/base.py @@ -107,7 +107,14 @@ class SQLiteCursorWrapper(Database.Cursor): def convert_query(self, query, num_params): return query % tuple("?" * num_params) +allows_group_by_ordinal = True +allows_unique_and_pk = True +autoindexes_primary_keys = True +needs_datetime_string_cast = True +needs_upper_for_iops = False supports_constraints = False +supports_tablespaces = False +uses_case_insensitive_names = False def quote_name(name): if name.startswith('"') and name.endswith('"'): @@ -139,6 +146,9 @@ def get_date_trunc_sql(lookup_type, field_name): # sqlite doesn't support DATE_TRUNC, so we fake it as above. return 'django_date_trunc("%s", %s)' % (lookup_type.lower(), field_name) +def get_datetime_cast_sql(): + return None + def get_limit_offset_sql(limit, offset=None): sql = "LIMIT %s" % limit if offset and offset != 0: @@ -160,11 +170,20 @@ def get_drop_foreignkey_sql(): def get_pk_default_value(): return "NULL" +def get_max_name_length(): + return None + +def get_start_transaction_sql(): + return "BEGIN;" + +def get_autoinc_sql(table): + return None + def get_sql_flush(style, tables, sequences): """Return a list of SQL statements required to remove all data from all tables in the database (without actually removing the tables themselves) and put the database in an empty 'initial' state - + """ # NB: The generated SQL below is specific to SQLite # Note: The DELETE FROM... SQL generated below works for SQLite databases @@ -182,7 +201,7 @@ def get_sql_sequence_reset(style, model_list): "Returns a list of the SQL statements to reset sequences for the given models." # No sequence reset required return [] - + def _sqlite_date_trunc(lookup_type, dt): try: dt = util.typecast_timestamp(dt) diff --git a/django/db/backends/util.py b/django/db/backends/util.py index 81c752e664..58f2d1e990 100644 --- a/django/db/backends/util.py +++ b/django/db/backends/util.py @@ -1,4 +1,5 @@ import datetime +import md5 from time import time try: @@ -107,6 +108,16 @@ def rev_typecast_decimal(d): return None return str(d) +def truncate_name(name, length=None): + """Shortens a string to a repeatable mangled version with the given length. + """ + if length is None or len(name) <= length: + return name + + hash = md5.md5(name).hexdigest()[:4] + + return '%s%s' % (name[:length-4], hash) + ################################################################################## # Helper functions for dictfetch* for databases that don't natively support them # ################################################################################## diff --git a/django/db/models/base.py b/django/db/models/base.py index e02d6de861..b1c4a43628 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -96,9 +96,9 @@ class Model(object): def __init__(self, *args, **kwargs): dispatcher.send(signal=signals.pre_init, sender=self.__class__, args=args, kwargs=kwargs) - + # There is a rather weird disparity here; if kwargs, it's set, then args - # overrides it. It should be one or the other; don't duplicate the work + # overrides it. It should be one or the other; don't duplicate the work # The reason for the kwargs check is that standard iterator passes in by # args, and nstantiation for iteration is 33% faster. args_len = len(args) @@ -122,10 +122,10 @@ class Model(object): # Maintain compatibility with existing calls. if isinstance(field.rel, ManyToOneRel): kwargs.pop(field.attname, None) - + # Now we're left with the unprocessed fields that *must* come from # keywords, or default. - + for field in fields_iter: if kwargs: if isinstance(field.rel, ManyToOneRel): @@ -147,7 +147,7 @@ class Model(object): try: val = getattr(rel_obj, field.rel.get_related_field().attname) except AttributeError: - raise TypeError("Invalid value: %r should be a %s instance, not a %s" % + raise TypeError("Invalid value: %r should be a %s instance, not a %s" % (field.name, field.rel.to, type(rel_obj))) else: val = kwargs.pop(field.attname, field.get_default()) @@ -210,17 +210,18 @@ class Model(object): record_exists = True if pk_set: # Determine whether a record with the primary key already exists. - cursor.execute("SELECT 1 FROM %s WHERE %s=%%s LIMIT 1" % \ - (backend.quote_name(self._meta.db_table), backend.quote_name(self._meta.pk.column)), [pk_val]) + cursor.execute("SELECT COUNT(*) FROM %s WHERE %s=%%s" % \ + (backend.quote_name(self._meta.db_table), backend.quote_name(self._meta.pk.column)), + self._meta.pk.get_db_prep_lookup('exact', pk_val)) # If it does already exist, do an UPDATE. - if cursor.fetchone(): + if cursor.fetchone()[0] > 0: db_values = [f.get_db_prep_save(f.pre_save(self, False)) for f in non_pks] if db_values: cursor.execute("UPDATE %s SET %s WHERE %s=%%s" % \ (backend.quote_name(self._meta.db_table), ','.join(['%s=%%s' % backend.quote_name(f.column) for f in non_pks]), backend.quote_name(self._meta.pk.column)), - db_values + [pk_val]) + db_values + self._meta.pk.get_db_prep_lookup('exact', pk_val)) else: record_exists = False if not pk_set or not record_exists: diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 136ce31b8b..016e26099b 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -74,12 +74,16 @@ class Field(object): core=False, rel=None, default=NOT_PROVIDED, editable=True, serialize=True, prepopulate_from=None, unique_for_date=None, unique_for_month=None, unique_for_year=None, validator_list=None, choices=None, radio_admin=None, - help_text='', db_column=None): + help_text='', db_column=None, db_tablespace=None): self.name = name self.verbose_name = verbose_name self.primary_key = primary_key self.maxlength, self.unique = maxlength, unique self.blank, self.null = blank, null + # Oracle treats the empty string ('') as null, so coerce the null + # option whenever '' is a possible value. + if self.empty_strings_allowed and settings.DATABASE_ENGINE == 'oracle': + self.null = True self.core, self.rel, self.default = core, rel, default self.editable = editable self.serialize = serialize @@ -91,6 +95,7 @@ class Field(object): self.radio_admin = radio_admin self.help_text = help_text self.db_column = db_column + self.db_tablespace = db_tablespace # Set db_index to True if the field has a relationship and doesn't explicitly set db_index. self.db_index = db_index @@ -201,7 +206,7 @@ class Field(object): if callable(self.default): return self.default() return self.default - if not self.empty_strings_allowed or self.null: + if not self.empty_strings_allowed or (self.null and settings.DATABASE_ENGINE != 'oracle'): return None return "" @@ -806,6 +811,7 @@ class IPAddressField(Field): validators.isValidIPAddress4(field_data, None) class NullBooleanField(Field): + empty_strings_allowed = False def __init__(self, *args, **kwargs): kwargs['null'] = True Field.__init__(self, *args, **kwargs) @@ -875,10 +881,18 @@ class TimeField(Field): Field.__init__(self, verbose_name, name, **kwargs) def get_db_prep_lookup(self, lookup_type, value): - if lookup_type == 'range': - value = [str(v) for v in value] + if settings.DATABASE_ENGINE == 'oracle': + # Oracle requires a date in order to parse. + def prep(value): + if isinstance(value, datetime.time): + value = datetime.datetime.combine(datetime.date(1900, 1, 1), value) + return str(value) else: - value = str(value) + prep = str + if lookup_type == 'range': + value = [prep(v) for v in value] + else: + value = prep(value) return Field.get_db_prep_lookup(self, lookup_type, value) def pre_save(self, model_instance, add): @@ -896,7 +910,15 @@ class TimeField(Field): # doesn't support microseconds. if settings.DATABASE_ENGINE == 'mysql' and hasattr(value, 'microsecond'): value = value.replace(microsecond=0) - value = str(value) + if settings.DATABASE_ENGINE == 'oracle': + # cx_Oracle expects a datetime.datetime to persist into TIMESTAMP field. + if isinstance(value, datetime.time): + value = datetime.datetime(1900, 1, 1, value.hour, value.minute, + value.second, value.microsecond) + elif isinstance(value, basestring): + value = datetime.datetime(*(time.strptime(value, '%H:%M:%S')[:6])) + else: + value = str(value) return Field.get_db_prep_save(self, value) def get_manipulator_field_objs(self): diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index 42eec6b4f0..60503ce14f 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -10,9 +10,10 @@ from django import oldforms from django import newforms as forms from django.dispatch import dispatcher -# For Python 2.3 -if not hasattr(__builtins__, 'set'): - from sets import Set as set +try: + set +except NameError: + from sets import Set as set # Python 2.3 fallback # Values for Relation.edit_inline. TABULAR, STACKED = 1, 2 @@ -335,10 +336,7 @@ def create_many_related_manager(superclass): (target_col_name, self.join_table, source_col_name, target_col_name, ",".join(['%s'] * len(new_ids))), [self._pk_val] + list(new_ids)) - if cursor.rowcount is not None and cursor.rowcount != 0: - existing_ids = set([row[0] for row in cursor.fetchmany(cursor.rowcount)]) - else: - existing_ids = set() + existing_ids = set([row[0] for row in cursor.fetchall()]) # Add the ones that aren't there already for obj_id in (new_ids - existing_ids): diff --git a/django/db/models/options.py b/django/db/models/options.py index dd6c586ddd..93627f7b72 100644 --- a/django/db/models/options.py +++ b/django/db/models/options.py @@ -13,7 +13,7 @@ get_verbose_name = lambda class_name: re.sub('(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]| DEFAULT_NAMES = ('verbose_name', 'db_table', 'ordering', 'unique_together', 'permissions', 'get_latest_by', - 'order_with_respect_to', 'app_label') + 'order_with_respect_to', 'app_label', 'db_tablespace') class Options(object): def __init__(self, meta): @@ -27,6 +27,7 @@ class Options(object): self.object_name, self.app_label = None, None self.get_latest_by = None self.order_with_respect_to = None + self.db_tablespace = None self.admin = None self.meta = meta self.pk = None @@ -59,6 +60,8 @@ class Options(object): del self.meta def _prepare(self, model): + from django.db import backend + from django.db.backends.util import truncate_name if self.order_with_respect_to: self.order_with_respect_to = self.get_field(self.order_with_respect_to) self.ordering = ('_order',) @@ -73,6 +76,8 @@ class Options(object): # If the db_table wasn't provided, use the app_label + module_name. if not self.db_table: self.db_table = "%s_%s" % (self.app_label, self.module_name) + self.db_table = truncate_name(self.db_table, + backend.get_max_name_length()) def add_field(self, field): # Insert the given field in the order in which it was created, using @@ -88,10 +93,10 @@ class Options(object): def __repr__(self): return 's." - return self._html_output(u'
%(label)s %(field)s%(help_text)s
', u'%s
', '', u' %s', True) + return self._html_output(u'%(label)s %(field)s%(help_text)s
', u'%s', '', u' %s', True) def non_field_errors(self): """ diff --git a/django/newforms/widgets.py b/django/newforms/widgets.py index 6ee3177a25..d4b5f596d1 100644 --- a/django/newforms/widgets.py +++ b/django/newforms/widgets.py @@ -3,16 +3,15 @@ HTML Widget classes """ try: - set # Only available in Python 2.4+ + set except NameError: - from sets import Set as set # Python 2.3 fallback -from itertools import chain + from sets import Set as set # Python 2.3 fallback +from itertools import chain from django.utils.datastructures import MultiValueDict from django.utils.html import escape from django.utils.translation import gettext from django.utils.encoding import StrAndUnicode, smart_unicode - from util import flatatt __all__ = ( diff --git a/django/oldforms/__init__.py b/django/oldforms/__init__.py index ea1f425ad3..5814eef7ff 100644 --- a/django/oldforms/__init__.py +++ b/django/oldforms/__init__.py @@ -309,10 +309,6 @@ class FormField(object): return data html2python = staticmethod(html2python) - def iter_render(self, data): - # this even needed? - return (self.render(data),) - def render(self, data): raise NotImplementedError diff --git a/django/shortcuts/__init__.py b/django/shortcuts/__init__.py index 3a0f6a0091..81381d08c1 100644 --- a/django/shortcuts/__init__.py +++ b/django/shortcuts/__init__.py @@ -7,7 +7,7 @@ from django.http import HttpResponse, Http404 from django.db.models.manager import Manager def render_to_response(*args, **kwargs): - return HttpResponse(loader.render_to_iter(*args, **kwargs)) + return HttpResponse(loader.render_to_string(*args, **kwargs)) load_and_render = render_to_response # For backwards compatibility. def get_object_or_404(klass, *args, **kwargs): diff --git a/django/template/__init__.py b/django/template/__init__.py index 7495eea878..4cda9bc8d0 100644 --- a/django/template/__init__.py +++ b/django/template/__init__.py @@ -55,7 +55,6 @@ times with multiple contexts) '\n\n\n\n' """ import re -import types from inspect import getargspec from django.conf import settings from django.template.context import Context, RequestContext, ContextPopException @@ -168,12 +167,9 @@ class Template(object): for subnode in node: yield subnode - def iter_render(self, context): - "Display stage -- can be called many times" - return self.nodelist.iter_render(context) - def render(self, context): - return ''.join(self.iter_render(context)) + "Display stage -- can be called many times" + return self.nodelist.render(context) def compile_string(template_string, origin): "Compiles template_string into NodeList ready for rendering" @@ -699,26 +695,10 @@ def resolve_variable(path, context): del bits[0] return current -class NodeBase(type): - def __new__(cls, name, bases, attrs): - """ - Ensures that either a 'render' or 'render_iter' method is defined on - any Node sub-class. This avoids potential infinite loops at runtime. - """ - if not (isinstance(attrs.get('render'), types.FunctionType) or - isinstance(attrs.get('iter_render'), types.FunctionType)): - raise TypeError('Unable to create Node subclass without either "render" or "iter_render" method.') - return type.__new__(cls, name, bases, attrs) - class Node(object): - __metaclass__ = NodeBase - - def iter_render(self, context): - return (self.render(context),) - def render(self, context): "Return the node rendered as a string" - return ''.join(self.iter_render(context)) + pass def __iter__(self): yield self @@ -734,12 +714,13 @@ class Node(object): class NodeList(list): def render(self, context): - return ''.join(self.iter_render(context)) - - def iter_render(self, context): + bits = [] for node in self: - for chunk in node.iter_render(context): - yield chunk + if isinstance(node, Node): + bits.append(self.render_node(node, context)) + else: + bits.append(node) + return ''.join(bits) def get_nodes_by_type(self, nodetype): "Return a list of all nodes of the given type" @@ -748,25 +729,24 @@ class NodeList(list): nodes.extend(node.get_nodes_by_type(nodetype)) return nodes + def render_node(self, node, context): + return(node.render(context)) + class DebugNodeList(NodeList): - def iter_render(self, context): - for node in self: - if not isinstance(node, Node): - yield node - continue - try: - for chunk in node.iter_render(context): - yield chunk - except TemplateSyntaxError, e: - if not hasattr(e, 'source'): - e.source = node.source - raise - except Exception, e: - from sys import exc_info - wrapped = TemplateSyntaxError('Caught an exception while rendering: %s' % e) - wrapped.source = node.source - wrapped.exc_info = exc_info() - raise wrapped + def render_node(self, node, context): + try: + result = node.render(context) + except TemplateSyntaxError, e: + if not hasattr(e, 'source'): + e.source = node.source + raise + except Exception, e: + from sys import exc_info + wrapped = TemplateSyntaxError('Caught an exception while rendering: %s' % e) + wrapped.source = node.source + wrapped.exc_info = exc_info() + raise wrapped + return result class TextNode(Node): def __init__(self, s): @@ -775,9 +755,6 @@ class TextNode(Node): def __repr__(self): return "-
-
If you don't pass any values to the Form's __init__(), or if you pass None, @@ -2668,7 +2684,7 @@ its field's order in the form.
First name:
Last name:
Birthday:
diff --git a/tests/regressiontests/serializers_regress/tests.py b/tests/regressiontests/serializers_regress/tests.py index 1a144c8356..febcfa822e 100644 --- a/tests/regressiontests/serializers_regress/tests.py +++ b/tests/regressiontests/serializers_regress/tests.py @@ -15,6 +15,7 @@ from django.utils.functional import curry from django.core import serializers from django.db import transaction from django.core import management +from django.conf import settings from models import * try: @@ -116,10 +117,13 @@ test_data = [ (data_obj, 31, DateTimeData, None), (data_obj, 40, EmailData, "hovercraft@example.com"), (data_obj, 41, EmailData, None), + (data_obj, 42, EmailData, ""), (data_obj, 50, FileData, 'file:///foo/bar/whiz.txt'), (data_obj, 51, FileData, None), + (data_obj, 52, FileData, ""), (data_obj, 60, FilePathData, "/foo/bar/whiz.txt"), (data_obj, 61, FilePathData, None), + (data_obj, 62, FilePathData, ""), (data_obj, 70, DecimalData, decimal.Decimal('12.345')), (data_obj, 71, DecimalData, decimal.Decimal('-12.345')), (data_obj, 72, DecimalData, decimal.Decimal('0.0')), @@ -146,6 +150,7 @@ test_data = [ (data_obj, 131, PositiveSmallIntegerData, None), (data_obj, 140, SlugData, "this-is-a-slug"), (data_obj, 141, SlugData, None), + (data_obj, 142, SlugData, ""), (data_obj, 150, SmallData, 12), (data_obj, 151, SmallData, -12), (data_obj, 152, SmallData, 0), @@ -160,8 +165,10 @@ The end."""), (data_obj, 171, TimeData, None), (data_obj, 180, USStateData, "MA"), (data_obj, 181, USStateData, None), + (data_obj, 182, USStateData, ""), (data_obj, 190, XMLData, "