From 94e002c6e4560a049db3be876219deb72ec2459b Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Thu, 9 Jul 2009 17:45:59 +0000 Subject: [PATCH] [soc2009/multidb] Merged up to trunk r11205 git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2009/multidb@11209 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/conf/locale/ca/LC_MESSAGES/django.mo | Bin 64639 -> 67049 bytes django/conf/locale/ca/LC_MESSAGES/django.po | 549 ++++++++++------- django/conf/locale/es/LC_MESSAGES/django.mo | Bin 64913 -> 67328 bytes django/conf/locale/es/LC_MESSAGES/django.po | 556 ++++++++++-------- .../contrib/gis/gdal/prototypes/generation.py | 9 +- .../contrib/gis/geos/prototypes/topology.py | 2 + django/core/urlresolvers.py | 9 +- django/forms/models.py | 32 +- django/template/defaulttags.py | 14 +- docs/_ext/djangodocs.py | 53 +- docs/_templates/layout.html | 2 +- docs/faq/admin.txt | 19 +- docs/howto/deployment/modpython.txt | 25 +- docs/ref/contrib/admin/index.txt | 4 +- docs/ref/databases.txt | 2 +- docs/ref/templates/builtins.txt | 27 +- docs/topics/i18n.txt | 81 ++- docs/topics/testing.txt | 29 +- tests/regressiontests/admin_views/models.py | 21 +- tests/regressiontests/admin_views/tests.py | 112 +++- 20 files changed, 1013 insertions(+), 533 deletions(-) diff --git a/django/conf/locale/ca/LC_MESSAGES/django.mo b/django/conf/locale/ca/LC_MESSAGES/django.mo index 38aecaae328e24ca907908ac5c018a8714ac246e..3039bd8fad17608ccf9430ce3013cbefa2f19766 100644 GIT binary patch delta 23221 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 delta 21118 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%0AL8Ozl{PJ`?h0{z zRdT&eN|`@5m7}avF7kWGry^yg<51j$*HXIhF+%-q8>}m3k>tzKM%NO@|NVK5x&Zpl zu=*{g{_2`U-P{1?PaxBog6gD;-x!j zgnr7ur(IggFJK?y+Bl2&q#AQQ(Eh)ounir~q28HBxY7p7m(q-Ha2!Ti1GV95K)WvF zo08g*zlMR-e{KCf#|gCSO{zlu65@fhsY7Z+eh6i{iu(xek*PpMJ^T~4hXsA)na>UQhjX(ooU@>JCzVnpBN^E5^|EmH7^3vDEb-1(RwLuO$6Tn@p&yo%7Z6 z&uZ)Ob)OMlwhILqLaZigo<3E;H)e+LaHik9zo>O0#@iLL#pl+#+-Tjq;%zvCl zRcxSEGy8FG~3dlCDkG zez^<14=mn6eK*o6%A+v5K7VQvoU;aM{{{nJr}EV`in=bgYL(?BKg24V;s0p6kg^fv zGvHga53=^vFp;<-ZN9THI}tA zOUb`Y{c^l)W7MQwJ?eDjw=(6wqRn7ZXVU*juP&d@8uzr4BXmkfnm~Cf%92RAN$ZF| z{?C9vGf24g&1vO-*%;Yuf@tc0qHG&!2l+PEelzh0q*27aCUnk0u#!}a^cV3#(r7Ak zGSD*2iz_J0ME$F42bm6(eM8+q+GHiK>o9R645jQ0`TC?Y#6?xf<+FD6u(ke0AT60c zX;h8$>N-p&nE`Z_r#zhWA??NzHz5@!E=imPyOO@7tUF291L8MH^QqVMndATdT*SC% zi6&7W_Ue1JB^_##Zd#{zX!Hw>YLI@T{FId!3i5|E+YpfSOY;s%Lt3o!S8tgo(7(NP zVz9qz`-Y)OQ@e*GxxqRfSu`H$lQlV%PX6;d&}Pygu3 z{=7ry2PQrA6-v7Ao8q55{9u5;->4fQ{`M0V1^F{g`6=C&d1(TYBIl3rubjU$RZ{aM zgOVOBDU_6B>1X~;OFs_^FI&7!x#-emtCT8Lv{Y$-`<1~#EGZ&s&FcC|Rn}}xs@k%c zzrxz|fk`XY4+-ex&%Yri*x!1~n`!*dcJ0sP|K{ZF;H2-)R`lmQcQr66^Z7ZcSQKm8 zbpCo^($XLI`TJk266k++rAMg0`^`r|S-bV>*(thNVt+3#p;NCu{d;ukP1Myt^7q7W uf7oA90ZHYajrJdT);(lqm4NZH(*^`Y&5j5N$T7QgK)}}Iy8!|J2K_&4h4g*^ diff --git a/django/conf/locale/ca/LC_MESSAGES/django.po b/django/conf/locale/ca/LC_MESSAGES/django.po index 9cfafe3e2a..57f8764938 100644 --- a/django/conf/locale/ca/LC_MESSAGES/django.po +++ b/django/conf/locale/ca/LC_MESSAGES/django.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-03-24 13:00+0100\n" +"POT-Creation-Date: 2009-07-07 15:04+0200\n" "PO-Revision-Date: 2009-03-24 13:28+0100\n" "Last-Translator: Django Catalan Group \n" "Language-Team: Catalan \n" @@ -218,6 +218,20 @@ msgstr "xinès simplificat" msgid "Traditional Chinese" msgstr "xinès tradicional" +#: contrib/admin/actions.py:60 +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Eliminat/s %(count)d %(items)s satisfactòriament." + +#: contrib/admin/actions.py:67 contrib/admin/options.py:1025 +msgid "Are you sure?" +msgstr "Esteu segurs?" + +#: contrib/admin/actions.py:85 +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Eliminar els %(verbose_name_plural)s seleccionats" + #: contrib/admin/filterspecs.py:44 #, python-format msgid "" @@ -252,15 +266,15 @@ msgstr "Aquest mes" msgid "This year" msgstr "Aquest any" -#: contrib/admin/filterspecs.py:147 forms/widgets.py:413 +#: contrib/admin/filterspecs.py:147 forms/widgets.py:434 msgid "Yes" msgstr "Si" -#: contrib/admin/filterspecs.py:147 forms/widgets.py:413 +#: contrib/admin/filterspecs.py:147 forms/widgets.py:434 msgid "No" msgstr "No" -#: contrib/admin/filterspecs.py:154 forms/widgets.py:413 +#: contrib/admin/filterspecs.py:154 forms/widgets.py:434 msgid "Unknown" msgstr "Desconegut" @@ -296,74 +310,61 @@ msgstr "entrada del registre" msgid "log entries" msgstr "entrades del registre" -#: contrib/admin/options.py:131 contrib/admin/options.py:145 +#: contrib/admin/options.py:133 contrib/admin/options.py:147 msgid "None" msgstr "cap" -#: contrib/admin/options.py:498 -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Eliminat/s %(count)d %(items)s satisfactòriament." - -#: contrib/admin/options.py:505 contrib/admin/options.py:1012 -msgid "Are you sure?" -msgstr "Esteu segurs?" - -#: contrib/admin/options.py:523 -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Eliminar els %(verbose_name_plural)s seleccionats" - -#: contrib/admin/options.py:531 +#: contrib/admin/options.py:519 #, python-format msgid "Changed %s." msgstr "Modificat %s." -#: contrib/admin/options.py:531 contrib/admin/options.py:541 -#: contrib/comments/templates/comments/preview.html:15 forms/models.py:296 +#: contrib/admin/options.py:519 contrib/admin/options.py:529 +#: contrib/comments/templates/comments/preview.html:16 forms/models.py:388 +#: forms/models.py:600 msgid "and" msgstr "i" -#: contrib/admin/options.py:536 +#: contrib/admin/options.py:524 #, python-format msgid "Added %(name)s \"%(object)s\"." msgstr "Afegit %(name)s \"%(object)s\"" -#: contrib/admin/options.py:540 +#: contrib/admin/options.py:528 #, python-format msgid "Changed %(list)s for %(name)s \"%(object)s\"." msgstr "Modificat %(list)s per a %(name)s \"%(object)s\"." -#: contrib/admin/options.py:545 +#: contrib/admin/options.py:533 #, python-format msgid "Deleted %(name)s \"%(object)s\"." msgstr "Eliminat %(name)s \"%(object)s\"." -#: contrib/admin/options.py:549 +#: contrib/admin/options.py:537 msgid "No fields changed." msgstr "Cap camp canviat." -#: contrib/admin/options.py:610 contrib/auth/admin.py:67 +#: contrib/admin/options.py:598 contrib/auth/admin.py:67 #, python-format msgid "The %(name)s \"%(obj)s\" was added successfully." msgstr "El/la %(name)s \"%(obj)s\".ha estat afegit/da amb èxit." -#: contrib/admin/options.py:614 contrib/admin/options.py:647 +#: contrib/admin/options.py:602 contrib/admin/options.py:635 #: contrib/auth/admin.py:75 msgid "You may edit it again below." msgstr "Podeu editar-lo de nou a baix." -#: contrib/admin/options.py:624 contrib/admin/options.py:657 +#: contrib/admin/options.py:612 contrib/admin/options.py:645 #, python-format msgid "You may add another %s below." msgstr "Podeu afegir un altre %s a baix." -#: contrib/admin/options.py:645 +#: contrib/admin/options.py:633 #, python-format msgid "The %(name)s \"%(obj)s\" was changed successfully." msgstr "S'ha modificat amb èxit el/la %(name)s \"%(obj)s." -#: contrib/admin/options.py:653 +#: contrib/admin/options.py:641 #, python-format msgid "" "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." @@ -371,43 +372,43 @@ msgstr "" "S'ha afegit exitosament el/la %(name)s \"%(obj)s\". Pot editar-lo de nou " "abaix." -#: contrib/admin/options.py:774 +#: contrib/admin/options.py:772 #, python-format msgid "Add %s" msgstr "Afegir %s" -#: contrib/admin/options.py:805 contrib/admin/options.py:990 +#: contrib/admin/options.py:803 contrib/admin/options.py:1003 #, python-format msgid "%(name)s object with primary key %(key)r does not exist." msgstr "No existèix cap objecte %(name)s amb la clau primària %(key)r." -#: contrib/admin/options.py:862 +#: contrib/admin/options.py:860 #, python-format msgid "Change %s" msgstr "Modificar %s" -#: contrib/admin/options.py:894 +#: contrib/admin/options.py:904 msgid "Database error" msgstr "Error de base de dades" -#: contrib/admin/options.py:930 +#: contrib/admin/options.py:940 #, python-format msgid "%(count)s %(name)s was changed successfully." msgid_plural "%(count)s %(name)s were changed successfully." msgstr[0] "%(count)s %(name)s s'ha modificat amb èxit." msgstr[1] "%(count)s %(name)s s'han modificat amb èxit." -#: contrib/admin/options.py:1005 +#: contrib/admin/options.py:1018 #, python-format msgid "The %(name)s \"%(obj)s\" was deleted successfully." msgstr "El/la %(name)s \"%(obj)s\" ha estat eliminat amb èxit." -#: contrib/admin/options.py:1041 +#: contrib/admin/options.py:1054 #, python-format msgid "Change history: %s" msgstr "Modificar històric: %s" -#: contrib/admin/sites.py:15 contrib/admin/views/decorators.py:14 +#: contrib/admin/sites.py:20 contrib/admin/views/decorators.py:14 #: contrib/auth/forms.py:80 msgid "" "Please enter a correct username and password. Note that both fields are case-" @@ -416,11 +417,11 @@ msgstr "" "Si us plau, introduïu un nom d'usuari i contrasenya vàlids. Tingueu en " "compte que tots dos camps son sensibles a majúscules i minúscules." -#: contrib/admin/sites.py:250 contrib/admin/views/decorators.py:40 +#: contrib/admin/sites.py:278 contrib/admin/views/decorators.py:40 msgid "Please log in again, because your session has expired." msgstr "Si us plau, identifiqueu-vos de nou doncs la vostra sessió ha expirat." -#: contrib/admin/sites.py:257 contrib/admin/views/decorators.py:47 +#: contrib/admin/sites.py:285 contrib/admin/views/decorators.py:47 msgid "" "Looks like your browser isn't configured to accept cookies. Please enable " "cookies, reload this page, and try again." @@ -429,29 +430,29 @@ msgstr "" "'cookies' (galetes). Si us plau, habiliteu les 'cookies', recarregueu " "aquesta pàgina i proveu-ho de nou. " -#: contrib/admin/sites.py:273 contrib/admin/sites.py:279 +#: contrib/admin/sites.py:301 contrib/admin/sites.py:307 #: contrib/admin/views/decorators.py:66 msgid "Usernames cannot contain the '@' character." msgstr "Els noms d'usuari no poden contenir el caracter '@'." -#: contrib/admin/sites.py:276 contrib/admin/views/decorators.py:62 +#: contrib/admin/sites.py:304 contrib/admin/views/decorators.py:62 #, python-format msgid "Your e-mail address is not your username. Try '%s' instead." msgstr "" "La vostra adreça de correu no és el vostre nom d'usuari. Provi '%s' en tot " "cas." -#: contrib/admin/sites.py:336 +#: contrib/admin/sites.py:360 msgid "Site administration" msgstr "Lloc administratiu" -#: contrib/admin/sites.py:349 contrib/admin/templates/admin/login.html:26 +#: contrib/admin/sites.py:373 contrib/admin/templates/admin/login.html:26 #: contrib/admin/templates/registration/password_reset_complete.html:14 #: contrib/admin/views/decorators.py:20 msgid "Log in" msgstr "Iniciar sessió" -#: contrib/admin/sites.py:396 +#: contrib/admin/sites.py:417 #, python-format msgid "%s administration" msgstr "Administració de %s" @@ -466,34 +467,27 @@ msgstr "Un o més %(fieldname)s en %(name)s: %(obj)s" msgid "One or more %(fieldname)s in %(name)s:" msgstr "Un o més %(fieldname)s en %(name)s:" -#: contrib/admin/util.py:222 -#, fuzzy -msgid "verbose_name" -msgid_plural "verbose_name_plural" -msgstr[0] "verbose_name" -msgstr[1] "verbose_name_plural" - -#: contrib/admin/widgets.py:70 +#: contrib/admin/widgets.py:71 msgid "Date:" msgstr "Data:" -#: contrib/admin/widgets.py:70 +#: contrib/admin/widgets.py:71 msgid "Time:" msgstr "Hora:" -#: contrib/admin/widgets.py:94 +#: contrib/admin/widgets.py:95 msgid "Currently:" msgstr "Actualment:" -#: contrib/admin/widgets.py:94 +#: contrib/admin/widgets.py:95 msgid "Change:" msgstr "Modificar:" -#: contrib/admin/widgets.py:123 +#: contrib/admin/widgets.py:124 msgid "Lookup" msgstr "Cercar" -#: contrib/admin/widgets.py:230 +#: contrib/admin/widgets.py:236 msgid "Add Another" msgstr "Afegir un altre" @@ -508,9 +502,9 @@ msgstr "Ho sentim, però no s'ha pogut trobar la pàgina sol·licitada" #: contrib/admin/templates/admin/500.html:4 #: contrib/admin/templates/admin/app_index.html:8 -#: contrib/admin/templates/admin/base.html:33 +#: contrib/admin/templates/admin/base.html:31 #: contrib/admin/templates/admin/change_form.html:17 -#: contrib/admin/templates/admin/change_list.html:20 +#: contrib/admin/templates/admin/change_list.html:25 #: contrib/admin/templates/admin/delete_confirmation.html:6 #: contrib/admin/templates/admin/delete_selected_confirmation.html:6 #: contrib/admin/templates/admin/invalid_setup.html:4 @@ -552,7 +546,6 @@ msgid "Run the selected action" msgstr "Executar la acció seleccionada" #: contrib/admin/templates/admin/actions.html:4 -#: contrib/admin/templates/admin/search_form.html:8 msgid "Go" msgstr "Anar" @@ -562,26 +555,26 @@ msgstr "Anar" msgid "%(name)s" msgstr "%(name)s" -#: contrib/admin/templates/admin/base.html:28 +#: contrib/admin/templates/admin/base.html:26 msgid "Welcome," msgstr "Benvingut/da," -#: contrib/admin/templates/admin/base.html:28 +#: contrib/admin/templates/admin/base.html:26 #: contrib/admin/templates/registration/password_change_done.html:3 #: contrib/admin/templates/registration/password_change_form.html:3 #: contrib/admindocs/templates/admin_doc/bookmarklets.html:3 msgid "Documentation" msgstr "Documentació" -#: contrib/admin/templates/admin/base.html:28 -#: contrib/admin/templates/admin/auth/user/change_password.html:13 -#: contrib/admin/templates/admin/auth/user/change_password.html:46 +#: contrib/admin/templates/admin/base.html:26 +#: contrib/admin/templates/admin/auth/user/change_password.html:14 +#: contrib/admin/templates/admin/auth/user/change_password.html:47 #: contrib/admin/templates/registration/password_change_done.html:3 #: contrib/admin/templates/registration/password_change_form.html:3 msgid "Change password" msgstr "Canviar contrasenya" -#: contrib/admin/templates/admin/base.html:28 +#: contrib/admin/templates/admin/base.html:26 #: contrib/admin/templates/registration/password_change_done.html:3 #: contrib/admin/templates/registration/password_change_form.html:3 msgid "Log out" @@ -612,24 +605,24 @@ msgid "View on site" msgstr "Veure al lloc" #: contrib/admin/templates/admin/change_form.html:38 -#: contrib/admin/templates/admin/change_list.html:49 -#: contrib/admin/templates/admin/auth/user/change_password.html:22 +#: contrib/admin/templates/admin/change_list.html:54 +#: contrib/admin/templates/admin/auth/user/change_password.html:23 msgid "Please correct the error below." msgid_plural "Please correct the errors below." msgstr[0] "Si us plau, corregiu l'error mostrat a baix." msgstr[1] "Si us plau, corregiu els errors mostrats a baix." -#: contrib/admin/templates/admin/change_list.html:41 +#: contrib/admin/templates/admin/change_list.html:46 #, python-format msgid "Add %(name)s" msgstr "Afegir %(name)s" -#: contrib/admin/templates/admin/change_list.html:60 +#: contrib/admin/templates/admin/change_list.html:65 msgid "Filter" msgstr "Filtre" #: contrib/admin/templates/admin/delete_confirmation.html:10 -#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:251 +#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:275 msgid "Delete" msgstr "Eliminar" @@ -669,9 +662,9 @@ msgid "" "your account doesn't have permission to delete the following types of " "objects:" msgstr "" -"Eliminar el/la %(object_name)s provocaria l'eliminació " -"d'objectes relacionats, però el vostre compte no te permissos per a esborrar " -"els tipus d'objecte següents:" +"Eliminar el/la %(object_name)s provocaria l'eliminació d'objectes " +"relacionats, però el vostre compte no te permissos per a esborrar els tipus " +"d'objecte següents:" #: contrib/admin/templates/admin/delete_selected_confirmation.html:22 #, python-format @@ -679,8 +672,8 @@ msgid "" "Are you sure you want to delete the selected %(object_name)s objects? All of " "the following objects and it's related items will be deleted:" msgstr "" -"Esteu segurs de voler esborrar els/les %(object_name)s seleccionats?" -"Tots aquests objectes i els seus elements relacionats s'esborraran:" +"Esteu segurs de voler esborrar els/les %(object_name)s seleccionats?Tots " +"aquests objectes i els seus elements relacionats s'esborraran:" #: contrib/admin/templates/admin/filter.html:2 #, python-format @@ -712,6 +705,10 @@ msgstr "Les meves accions" msgid "None available" msgstr "Cap disponible" +#: contrib/admin/templates/admin/index.html:72 +msgid "Unknown content" +msgstr "Contingut desconegut" + #: contrib/admin/templates/admin/invalid_setup.html:7 msgid "" "Something's wrong with your database installation. Make sure the appropriate " @@ -760,6 +757,15 @@ msgstr "" msgid "Show all" msgstr "Mostrar tots" +#: contrib/admin/templates/admin/pagination.html:11 +#: contrib/admin/templates/admin/submit_line.html:3 +msgid "Save" +msgstr "Desar" + +#: contrib/admin/templates/admin/search_form.html:8 +msgid "Search" +msgstr "Cerca" + #: contrib/admin/templates/admin/search_form.html:10 #, python-format msgid "1 result" @@ -772,10 +778,6 @@ msgstr[1] "%(counter)s resultats" msgid "%(full_result_count)s total" msgstr "%(full_result_count)s en total" -#: contrib/admin/templates/admin/submit_line.html:3 -msgid "Save" -msgstr "Desar" - #: contrib/admin/templates/admin/submit_line.html:5 msgid "Save as new" msgstr "Desar com a nou" @@ -802,23 +804,23 @@ msgid "Username" msgstr "Usuari" #: contrib/admin/templates/admin/auth/user/add_form.html:20 -#: contrib/admin/templates/admin/auth/user/change_password.html:33 +#: contrib/admin/templates/admin/auth/user/change_password.html:34 #: contrib/auth/forms.py:17 contrib/auth/forms.py:60 contrib/auth/forms.py:185 msgid "Password" msgstr "Contrasenya" #: contrib/admin/templates/admin/auth/user/add_form.html:26 -#: contrib/admin/templates/admin/auth/user/change_password.html:39 +#: contrib/admin/templates/admin/auth/user/change_password.html:40 #: contrib/auth/forms.py:186 msgid "Password (again)" msgstr "Contrasenya (de nou)" #: contrib/admin/templates/admin/auth/user/add_form.html:27 -#: contrib/admin/templates/admin/auth/user/change_password.html:40 +#: contrib/admin/templates/admin/auth/user/change_password.html:41 msgid "Enter the same password as above, for verification." msgstr "Introduïu la mateixa contrasenya de dalt, per fer-ne la verificació." -#: contrib/admin/templates/admin/auth/user/change_password.html:26 +#: contrib/admin/templates/admin/auth/user/change_password.html:27 #, python-format msgid "Enter a new password for the user %(username)s." msgstr "Introduïu una contrasenya per l'usuari %(username)s" @@ -1035,114 +1037,115 @@ msgstr "El model %(model_name)r no s'ha trobat en l'aplicació %(app_label)r" msgid "the related `%(app_label)s.%(data_type)s` object" msgstr "l'objecte relacionat `%(app_label)s.%(data_type)s`" -#: contrib/admindocs/views.py:206 contrib/admindocs/views.py:228 -#: contrib/admindocs/views.py:242 contrib/admindocs/views.py:247 +#: contrib/admindocs/views.py:206 contrib/admindocs/views.py:225 +#: contrib/admindocs/views.py:230 contrib/admindocs/views.py:244 +#: contrib/admindocs/views.py:258 contrib/admindocs/views.py:263 msgid "model:" msgstr "model:" -#: contrib/admindocs/views.py:237 +#: contrib/admindocs/views.py:221 contrib/admindocs/views.py:253 #, python-format msgid "related `%(app_label)s.%(object_name)s` objects" msgstr "objectes relacionats `%(app_label)s.%(object_name)s`" -#: contrib/admindocs/views.py:242 +#: contrib/admindocs/views.py:225 contrib/admindocs/views.py:258 #, python-format msgid "all %s" msgstr "tots %s" -#: contrib/admindocs/views.py:247 +#: contrib/admindocs/views.py:230 contrib/admindocs/views.py:263 #, python-format msgid "number of %s" msgstr "nombre de %s" -#: contrib/admindocs/views.py:252 +#: contrib/admindocs/views.py:268 #, python-format msgid "Fields on %s objects" msgstr "Camps en objectes %s" -#: contrib/admindocs/views.py:315 contrib/admindocs/views.py:326 -#: contrib/admindocs/views.py:328 contrib/admindocs/views.py:334 -#: contrib/admindocs/views.py:335 contrib/admindocs/views.py:337 +#: contrib/admindocs/views.py:331 contrib/admindocs/views.py:342 +#: contrib/admindocs/views.py:344 contrib/admindocs/views.py:350 +#: contrib/admindocs/views.py:351 contrib/admindocs/views.py:353 msgid "Integer" msgstr "Enter" -#: contrib/admindocs/views.py:316 +#: contrib/admindocs/views.py:332 msgid "Boolean (Either True or False)" msgstr "Booleà (Verdader o Fals)" -#: contrib/admindocs/views.py:317 contrib/admindocs/views.py:336 +#: contrib/admindocs/views.py:333 contrib/admindocs/views.py:352 #, python-format msgid "String (up to %(max_length)s)" msgstr "Cadena (de fins a %(max_length)s)" -#: contrib/admindocs/views.py:318 +#: contrib/admindocs/views.py:334 msgid "Comma-separated integers" msgstr "Enters separats per comes" -#: contrib/admindocs/views.py:319 +#: contrib/admindocs/views.py:335 msgid "Date (without time)" msgstr "Data (sense hora)" -#: contrib/admindocs/views.py:320 +#: contrib/admindocs/views.py:336 msgid "Date (with time)" msgstr "Data (amb hora)" -#: contrib/admindocs/views.py:321 +#: contrib/admindocs/views.py:337 msgid "Decimal number" msgstr "Número decimal" -#: contrib/admindocs/views.py:322 +#: contrib/admindocs/views.py:338 msgid "E-mail address" msgstr "Adreça de correu electrònic" -#: contrib/admindocs/views.py:323 contrib/admindocs/views.py:324 -#: contrib/admindocs/views.py:327 +#: contrib/admindocs/views.py:339 contrib/admindocs/views.py:340 +#: contrib/admindocs/views.py:343 msgid "File path" msgstr "Ruta del fitxer" -#: contrib/admindocs/views.py:325 +#: contrib/admindocs/views.py:341 msgid "Floating point number" msgstr "Número amb punt de coma flotant" -#: contrib/admindocs/views.py:329 contrib/comments/models.py:58 +#: contrib/admindocs/views.py:345 contrib/comments/models.py:60 msgid "IP address" msgstr "Adreça IP" -#: contrib/admindocs/views.py:331 +#: contrib/admindocs/views.py:347 msgid "Boolean (Either True, False or None)" msgstr "Booleà (Verdader, Fals o 'None' (cap))" -#: contrib/admindocs/views.py:332 +#: contrib/admindocs/views.py:348 msgid "Relation to parent model" msgstr "Relació amb el model pare" -#: contrib/admindocs/views.py:333 +#: contrib/admindocs/views.py:349 msgid "Phone number" msgstr "Número de telèfon" -#: contrib/admindocs/views.py:338 +#: contrib/admindocs/views.py:354 msgid "Text" msgstr "Text" -#: contrib/admindocs/views.py:339 +#: contrib/admindocs/views.py:355 msgid "Time" msgstr "Hora" -#: contrib/admindocs/views.py:340 contrib/comments/forms.py:95 +#: contrib/admindocs/views.py:356 contrib/comments/forms.py:95 #: contrib/comments/templates/comments/moderation_queue.html:37 #: contrib/flatpages/admin.py:8 contrib/flatpages/models.py:7 msgid "URL" msgstr "URL" -#: contrib/admindocs/views.py:341 +#: contrib/admindocs/views.py:357 msgid "U.S. state (two uppercase letters)" msgstr "Estat dels E.U.A. (dues lletres majúscules)" -#: contrib/admindocs/views.py:342 +#: contrib/admindocs/views.py:358 msgid "XML text" msgstr "Text XML" -#: contrib/admindocs/views.py:368 +#: contrib/admindocs/views.py:384 #, python-format msgid "%s does not appear to be a urlpattern object" msgstr "%s no sembla ser un objecte 'urlpattern'" @@ -1247,7 +1250,7 @@ msgid "Change password: %s" msgstr "Canviar contrasenya: %s" #: contrib/auth/forms.py:15 contrib/auth/forms.py:48 -#: contrib/auth/models.py:127 +#: contrib/auth/models.py:128 msgid "" "Required. 30 characters or fewer. Alphanumeric characters only (letters, " "digits and underscores)." @@ -1338,31 +1341,31 @@ msgstr "permisos" msgid "group" msgstr "grup" -#: contrib/auth/models.py:91 contrib/auth/models.py:137 +#: contrib/auth/models.py:91 contrib/auth/models.py:138 msgid "groups" msgstr "grups" -#: contrib/auth/models.py:127 +#: contrib/auth/models.py:128 msgid "username" msgstr "nom d'usuari" -#: contrib/auth/models.py:128 +#: contrib/auth/models.py:129 msgid "first name" msgstr "nom propi" -#: contrib/auth/models.py:129 +#: contrib/auth/models.py:130 msgid "last name" msgstr "cognoms" -#: contrib/auth/models.py:130 +#: contrib/auth/models.py:131 msgid "e-mail address" msgstr "adreça de correu electrònic" -#: contrib/auth/models.py:131 +#: contrib/auth/models.py:132 msgid "password" msgstr "contrasenya" -#: contrib/auth/models.py:131 +#: contrib/auth/models.py:132 msgid "" "Use '[algo]$[salt]$[hexdigest]' or use the change " "password form." @@ -1370,19 +1373,19 @@ msgstr "" "Utilitzeu '[algo]$[salt]$[hexdigest]' o el formulari " "de canvi de contrasenya." -#: contrib/auth/models.py:132 +#: contrib/auth/models.py:133 msgid "staff status" msgstr "membre del personal" -#: contrib/auth/models.py:132 +#: contrib/auth/models.py:133 msgid "Designates whether the user can log into this admin site." msgstr "Indica si l'usuari pot entrar en el lloc administratiu." -#: contrib/auth/models.py:133 +#: contrib/auth/models.py:134 msgid "active" msgstr "actiu" -#: contrib/auth/models.py:133 +#: contrib/auth/models.py:134 msgid "" "Designates whether this user should be treated as active. Unselect this " "instead of deleting accounts." @@ -1390,11 +1393,11 @@ msgstr "" "Designa si aquest usuari ha de ser tractat com a actiu. Deseleccioneu-ho " "enlloc d'esborrar comptes d'usuari." -#: contrib/auth/models.py:134 +#: contrib/auth/models.py:135 msgid "superuser status" msgstr "estat de superusuari" -#: contrib/auth/models.py:134 +#: contrib/auth/models.py:135 msgid "" "Designates that this user has all permissions without explicitly assigning " "them." @@ -1402,15 +1405,15 @@ msgstr "" "Designa que aquest usuari té tots els permissos sense assignar-los " "explícitament." -#: contrib/auth/models.py:135 +#: contrib/auth/models.py:136 msgid "last login" msgstr "últim inici de sessió" -#: contrib/auth/models.py:136 +#: contrib/auth/models.py:137 msgid "date joined" msgstr "data de creació" -#: contrib/auth/models.py:138 +#: contrib/auth/models.py:139 msgid "" "In addition to the permissions manually assigned, this user will also get " "all permissions granted to each group he/she is in." @@ -1418,23 +1421,24 @@ msgstr "" "Junt amb els permissos asignats manualment, aquest usuari tindrà, també, els " "permissos dels grups dels que sigui membre." -#: contrib/auth/models.py:139 +#: contrib/auth/models.py:140 msgid "user permissions" msgstr "permissos de l'usuari" -#: contrib/auth/models.py:143 +#: contrib/auth/models.py:144 contrib/comments/models.py:50 +#: contrib/comments/models.py:168 msgid "user" msgstr "usuari" -#: contrib/auth/models.py:144 +#: contrib/auth/models.py:145 msgid "users" msgstr "usuaris" -#: contrib/auth/models.py:300 +#: contrib/auth/models.py:301 msgid "message" msgstr "missatge" -#: contrib/auth/views.py:50 +#: contrib/auth/views.py:56 msgid "Logged out" msgstr "Sessió finalitzada" @@ -1450,6 +1454,16 @@ msgstr "contingut" msgid "Metadata" msgstr "metadades" +#: contrib/comments/feeds.py:13 +#, python-format +msgid "%(site_name)s comments" +msgstr "comentaris de %(site_name)s" + +#: contrib/comments/feeds.py:23 +#, python-format +msgid "Latest comments on %(site_name)s" +msgstr "Últims comentaris a %(site_name)s." + #: contrib/comments/forms.py:93 #: contrib/comments/templates/comments/moderation_queue.html:34 msgid "Name" @@ -1479,46 +1493,51 @@ msgstr "" "Si entreu cualsevol cosa en aquest camp el vostre comentari es tractarà com " "a spam" -#: contrib/comments/models.py:23 +#: contrib/comments/models.py:22 contrib/contenttypes/models.py:74 +msgid "content type" +msgstr "tipus de contingut" + +#: contrib/comments/models.py:24 msgid "object ID" msgstr "ID de l'objecte" -#: contrib/comments/models.py:50 +#: contrib/comments/models.py:52 msgid "user's name" msgstr "nom d'usuari" -#: contrib/comments/models.py:51 +#: contrib/comments/models.py:53 msgid "user's email address" msgstr "adreça de correu electrònic del usuari" -#: contrib/comments/models.py:52 +#: contrib/comments/models.py:54 msgid "user's URL" msgstr "URL del usuari" -#: contrib/comments/models.py:54 +#: contrib/comments/models.py:56 contrib/comments/models.py:76 +#: contrib/comments/models.py:169 msgid "comment" msgstr "comentari" -#: contrib/comments/models.py:57 +#: contrib/comments/models.py:59 msgid "date/time submitted" msgstr "data/hora d'enviament" -#: contrib/comments/models.py:59 +#: contrib/comments/models.py:61 msgid "is public" msgstr "és públic" -#: contrib/comments/models.py:60 +#: contrib/comments/models.py:62 msgid "" "Uncheck this box to make the comment effectively disappear from the site." msgstr "" "Desmarqui aquesta casella per fer desaparèixar aquest comentari del lloc web " "de forma efectiva." -#: contrib/comments/models.py:62 +#: contrib/comments/models.py:64 msgid "is removed" msgstr "està eliminat" -#: contrib/comments/models.py:63 +#: contrib/comments/models.py:65 msgid "" "Check this box if the comment is inappropriate. A \"This comment has been " "removed\" message will be displayed instead." @@ -1526,7 +1545,11 @@ msgstr "" "Marqueu aquesta caixa si el comentari no és apropiat. En lloc seu es " "mostrarà \"Aquest comentari ha estat eliminat\" " -#: contrib/comments/models.py:115 +#: contrib/comments/models.py:77 +msgid "comments" +msgstr "comentaris" + +#: contrib/comments/models.py:119 msgid "" "This comment was posted by an authenticated user and thus the name is read-" "only." @@ -1534,7 +1557,7 @@ msgstr "" "Aquest comentari va ser publicat per un usuari autentificat, per això el seu " "nom no es modificable." -#: contrib/comments/models.py:124 +#: contrib/comments/models.py:128 msgid "" "This comment was posted by an authenticated user and thus the email is read-" "only." @@ -1542,7 +1565,7 @@ msgstr "" "Aquest comentari va ser publicat per un usuari autentificat, per això la " "seva adreça de correu electrònic no es pot modificar." -#: contrib/comments/models.py:149 +#: contrib/comments/models.py:153 #, python-format msgid "" "Posted by %(user)s at %(date)s\n" @@ -1557,9 +1580,26 @@ msgstr "" "\n" "http://%(domain)s%(url)s" +# Context problem... waitting for comments from django-i18n +#: contrib/comments/models.py:170 +msgid "flag" +msgstr "marcar" + +#: contrib/comments/models.py:171 +msgid "date" +msgstr "data" + +#: contrib/comments/models.py:181 +msgid "comment flag" +msgstr "marca del comentari" + +#: contrib/comments/models.py:182 +msgid "comment flags" +msgstr "marques de comentari" + #: contrib/comments/templates/comments/approve.html:4 msgid "Approve a comment" -msgstr "aprovar un comentari" +msgstr "Aprovar un comentari" #: contrib/comments/templates/comments/approve.html:7 msgid "Really make this comment public?" @@ -1616,13 +1656,13 @@ msgstr "Marcar" msgid "Thanks for flagging" msgstr "Gràcies per marcar" -#: contrib/comments/templates/comments/form.html:16 -#: contrib/comments/templates/comments/preview.html:31 +#: contrib/comments/templates/comments/form.html:17 +#: contrib/comments/templates/comments/preview.html:32 msgid "Post" msgstr "Publicar" -#: contrib/comments/templates/comments/form.html:17 -#: contrib/comments/templates/comments/preview.html:32 +#: contrib/comments/templates/comments/form.html:18 +#: contrib/comments/templates/comments/preview.html:33 msgid "Preview" msgstr "Vista prèvia" @@ -1668,33 +1708,29 @@ msgid "Thank you for your comment" msgstr "Gràcies pel seu comentari" #: contrib/comments/templates/comments/preview.html:4 -#: contrib/comments/templates/comments/preview.html:12 +#: contrib/comments/templates/comments/preview.html:13 msgid "Preview your comment" msgstr "Previsualitzar el seu comentari" -#: contrib/comments/templates/comments/preview.html:10 +#: contrib/comments/templates/comments/preview.html:11 msgid "Please correct the error below" msgid_plural "Please correct the errors below" msgstr[0] "Si us plau, corregiu l'error mostrat a baix." msgstr[1] "Si us plau, corregiu els errors mostrats a baix." -#: contrib/comments/templates/comments/preview.html:15 +#: contrib/comments/templates/comments/preview.html:16 msgid "Post your comment" msgstr "Enviar el seu comentari" -#: contrib/comments/templates/comments/preview.html:15 +#: contrib/comments/templates/comments/preview.html:16 msgid "or make changes" msgstr "o faci canvis." -#: contrib/contenttypes/models.py:67 +#: contrib/contenttypes/models.py:70 msgid "python model class name" msgstr "nom de la classe del model en python" -#: contrib/contenttypes/models.py:71 -msgid "content type" -msgstr "tipus de contingut" - -#: contrib/contenttypes/models.py:72 +#: contrib/contenttypes/models.py:75 msgid "content types" msgstr "tipus de continguts" @@ -1765,18 +1801,26 @@ msgstr "" "Ho sentim, pero el seu formulari ha expirat. Per favor, continui omplint el " "formulari en aquesta pàgina." -#: contrib/gis/forms/fields.py:14 +#: contrib/gis/forms/fields.py:17 msgid "No geometry value provided." msgstr "No s'ha indicat cap valor de geometria." -#: contrib/gis/forms/fields.py:15 +#: contrib/gis/forms/fields.py:18 msgid "Invalid geometry value." msgstr "Valor de geometria invàlid." -#: contrib/gis/forms/fields.py:16 +#: contrib/gis/forms/fields.py:19 msgid "Invalid geometry type." msgstr "Tipus de geometria invàlid." +#: contrib/gis/forms/fields.py:20 +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" +"Ha ocurregut un error al transformar la geometria al SRID de la geometria " +"del camp de formulari." + #: contrib/humanize/templatetags/humanize.py:19 msgid "th" msgstr "rt" @@ -2112,51 +2156,51 @@ msgstr "Regió Bohèmia Central" #: contrib/localflavor/cz/cz_regions.py:10 msgid "South Bohemian Region" -msgstr "Regió Bohemia Sur" +msgstr "Regió Bohèmia Sur" #: contrib/localflavor/cz/cz_regions.py:11 msgid "Pilsen Region" -msgstr "" +msgstr "Regió Pilsen" #: contrib/localflavor/cz/cz_regions.py:12 msgid "Carlsbad Region" -msgstr "" +msgstr "Regió Carlsbad" #: contrib/localflavor/cz/cz_regions.py:13 msgid "Usti Region" -msgstr "" +msgstr "Regió Usti" #: contrib/localflavor/cz/cz_regions.py:14 msgid "Liberec Region" -msgstr "" +msgstr "Regió Liberec" #: contrib/localflavor/cz/cz_regions.py:15 msgid "Hradec Region" -msgstr "" +msgstr "Regió Hradec" #: contrib/localflavor/cz/cz_regions.py:16 msgid "Pardubice Region" -msgstr "" +msgstr "Regió Pardubice" #: contrib/localflavor/cz/cz_regions.py:17 msgid "Vysocina Region" -msgstr "" +msgstr "Regió Vysocina" #: contrib/localflavor/cz/cz_regions.py:18 msgid "South Moravian Region" -msgstr "" +msgstr "Regió Moràvia Sur" #: contrib/localflavor/cz/cz_regions.py:19 msgid "Olomouc Region" -msgstr "" +msgstr "Regió Olomouc" #: contrib/localflavor/cz/cz_regions.py:20 msgid "Zlin Region" -msgstr "" +msgstr "Regió Zlin" #: contrib/localflavor/cz/cz_regions.py:21 msgid "Moravian-Silesian Region" -msgstr "" +msgstr "Regió Moràvia-Silesiana" #: contrib/localflavor/cz/forms.py:27 contrib/localflavor/sk/forms.py:30 msgid "Enter a postal code in the format XXXXX or XXX XX." @@ -2164,11 +2208,13 @@ msgstr "Introduïu un codi postal en el format XXXXX or XXX XX." #: contrib/localflavor/cz/forms.py:47 msgid "Enter a birth number in the format XXXXXX/XXXX or XXXXXXXXXX." -msgstr "Introduïu un número de naixement en el format XXXXXX/XXXX o XXXXXXXXXX." +msgstr "" +"Introduïu un número de naixement en el format XXXXXX/XXXX o XXXXXXXXXX." #: contrib/localflavor/cz/forms.py:48 msgid "Invalid optional parameter Gender, valid values are 'f' and 'm'" -msgstr "El paràmetre opcional 'Gènere' és invàlid, els valors vàlids son 'f' i 'm'." +msgstr "" +"El paràmetre opcional 'Gènere' és invàlid, els valors vàlids son 'f' i 'm'." #: contrib/localflavor/cz/forms.py:49 msgid "Enter a valid birth number." @@ -3004,16 +3050,16 @@ msgstr "Introduïu un número NIP en el format XXX-XXX-XX-XX o XX-XX-XXX-XXX." msgid "Wrong checksum for the Tax Number (NIP)." msgstr "Validació invàlida del número tributari (NIP)." -#: contrib/localflavor/pl/forms.py:111 -msgid "National Business Register Number (REGON) consists of 7 or 9 digits." +#: contrib/localflavor/pl/forms.py:109 +msgid "National Business Register Number (REGON) consists of 9 or 14 digits." msgstr "" -"El número nacional de registre de negocis (REGON) consisteix en 7 o 9 dígits." +"El número nacional de registre de negocis (REGON) consisteix en 9 o 14 dígits." -#: contrib/localflavor/pl/forms.py:112 +#: contrib/localflavor/pl/forms.py:110 msgid "Wrong checksum for the National Business Register Number (REGON)." msgstr "Validació invàlida del número nacional de registre de negocis." -#: contrib/localflavor/pl/forms.py:155 +#: contrib/localflavor/pl/forms.py:148 msgid "Enter a postal code in the format XX-XXX." msgstr "Introduïu un codi postal en el format XX-XXX." @@ -3851,60 +3897,60 @@ msgstr "nom per mostrar" msgid "sites" msgstr "llocs" -#: db/models/fields/__init__.py:356 db/models/fields/__init__.py:700 +#: db/models/fields/__init__.py:356 db/models/fields/__init__.py:710 msgid "This value must be an integer." msgstr "Aquest valor ha de ser un enter." -#: db/models/fields/__init__.py:387 +#: db/models/fields/__init__.py:388 msgid "This value must be either True or False." msgstr "Aquest valor ha de ser True (Veritat) o False (Fals)" -#: db/models/fields/__init__.py:420 +#: db/models/fields/__init__.py:427 msgid "This field cannot be null." msgstr "Aquest camp no pot ser nul." -#: db/models/fields/__init__.py:436 +#: db/models/fields/__init__.py:443 msgid "Enter only digits separated by commas." msgstr "Introduïu només dígits separats per comes." -#: db/models/fields/__init__.py:467 +#: db/models/fields/__init__.py:474 msgid "Enter a valid date in YYYY-MM-DD format." msgstr "Introduïu una data vàlida en el forma AAAA-MM-DD." -#: db/models/fields/__init__.py:476 +#: db/models/fields/__init__.py:483 #, python-format msgid "Invalid date: %s" msgstr "Data invàlida: %s" -#: db/models/fields/__init__.py:540 db/models/fields/__init__.py:558 +#: db/models/fields/__init__.py:547 db/models/fields/__init__.py:565 msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format." msgstr "" "Introduïu un data/hora vàlida en format YYYY-MM-DD HH:MM[:ss[.uuuuuu]]." -#: db/models/fields/__init__.py:594 +#: db/models/fields/__init__.py:601 msgid "This value must be a decimal number." msgstr "Aquest valor ha de ser un número decimal." -#: db/models/fields/__init__.py:676 +#: db/models/fields/__init__.py:686 msgid "This value must be a float." msgstr "Aquest valor ha de ser un número amb punt de coma flotant." -#: db/models/fields/__init__.py:736 +#: db/models/fields/__init__.py:746 msgid "This value must be either None, True or False." msgstr "Aquest valor ha de ser None (Cap), True (Veritat) o False (Fals)" -#: db/models/fields/__init__.py:839 db/models/fields/__init__.py:853 +#: db/models/fields/__init__.py:849 db/models/fields/__init__.py:863 msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format." msgstr "Introduïu una hora vàlida en el format HH:MM[:ss[.uuuuuu]]." -#: db/models/fields/related.py:779 +#: db/models/fields/related.py:816 msgid "" "Hold down \"Control\", or \"Command\" on a Mac, to select more than one." msgstr "" "Premeu la tecla \"Control\" -o \"Command\" en un Mac- per seleccionar més " "d'un valor." -#: db/models/fields/related.py:857 +#: db/models/fields/related.py:894 #, python-format msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." msgid_plural "" @@ -3971,11 +4017,11 @@ msgstr "Assegureu-vos de que no hi ha més de %s decimals." msgid "Ensure that there are no more than %s digits before the decimal point." msgstr "Assegureu-vos de que no hi ha més de %s dígits decimals." -#: forms/fields.py:288 forms/fields.py:850 +#: forms/fields.py:288 forms/fields.py:863 msgid "Enter a valid date." msgstr "Introduïu una data vàlida." -#: forms/fields.py:322 forms/fields.py:851 +#: forms/fields.py:322 forms/fields.py:864 msgid "Enter a valid time." msgstr "Introduïu una hora vàlida." @@ -3996,7 +4042,15 @@ msgstr "No s'ha enviat cap fitxer." msgid "The submitted file is empty." msgstr "El fitxer enviat està buit." -#: forms/fields.py:478 +#: forms/fields.py:450 +#, python-format +msgid "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr "" +"Assegureu-vos de que el valor té com a màxim %(max)d caràcters " +"(en té %(length)d)." + +#: forms/fields.py:483 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." @@ -4004,106 +4058,139 @@ msgstr "" "Envieu una imatge vàlida. El fitxer que heu enviat no era una imatge o " "estava corrupte." -#: forms/fields.py:539 +#: forms/fields.py:544 msgid "Enter a valid URL." msgstr "Introduïu una URL vàlida." -#: forms/fields.py:540 +#: forms/fields.py:545 msgid "This URL appears to be a broken link." msgstr "Aquesta URL sembla ser un enllaç trencat." -#: forms/fields.py:619 forms/fields.py:697 +#: forms/fields.py:625 forms/fields.py:703 #, python-format msgid "Select a valid choice. %(value)s is not one of the available choices." msgstr "Esculliu una opció vàlida. %(value)s no és una de les opcions vàlides." -#: forms/fields.py:698 forms/fields.py:759 forms/models.py:729 +#: forms/fields.py:704 forms/fields.py:765 forms/models.py:1003 msgid "Enter a list of values." msgstr "Introduïu una llista de valors." -#: forms/fields.py:879 +#: forms/fields.py:892 msgid "Enter a valid IPv4 address." msgstr "Introduïu una adreça IPv4 vàlida." -#: forms/fields.py:889 +#: forms/fields.py:902 msgid "" "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." msgstr "" "Introduïu un 'slug' vàlid, consistent en lletres, números, guions o guions " "baixos." -#: forms/formsets.py:247 forms/formsets.py:249 +#: forms/formsets.py:271 forms/formsets.py:273 msgid "Order" msgstr "Ordre" -#: forms/models.py:289 forms/models.py:298 +#: forms/models.py:367 +#, python-format +msgid "%(field_name)s must be unique for %(date_field)s %(lookup)s." +msgstr "El camp %(field_name)s ha de ser únic per a %(lookup)s %(date_field)s." + +#: forms/models.py:381 forms/models.py:389 #, python-format msgid "%(model_name)s with this %(field_label)s already exists." msgstr "Ja existeix %(model_name)s amb aquest %(field_label)s." -#: forms/models.py:602 +#: forms/models.py:594 +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Si us plau, corregiu la dada duplicada per a %(field)s." + +#: forms/models.py:598 +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "Si us plau, corregiu la dada duplicada per a %(field)s, la qual ha de ser única." + +#: forms/models.py:604 +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Si us plau, corregiu la dada duplicada per a %(field_name)s, " +"la qual ha de ser única per a la cerca %(lookup)s en %(date_field)s." + +#: forms/models.py:612 +msgid "Please correct the duplicate values below." +msgstr "Si us plau, corregiu els valors duplicats a baix." + +#: forms/models.py:867 msgid "The inline foreign key did not match the parent instance primary key." msgstr "" "La clau forànea en línea no coincideix amb la clau primària de la instància " "del pare" -#: forms/models.py:659 +#: forms/models.py:930 msgid "Select a valid choice. That choice is not one of the available choices." msgstr "" "Escolli una opció vàlida; Aquesta opció no és una de les opcions disponibles." -#: forms/models.py:730 +#: forms/models.py:1004 #, python-format msgid "Select a valid choice. %s is not one of the available choices." msgstr "Escolliu una opció vàlida; %s' no és una de les opcions vàlides." -#: template/defaultfilters.py:751 +#: forms/models.py:1006 +#, python-format +msgid "\"%s\" is not a valid value for a primary key." +msgstr "\"%s\" no és un valor vàlid per a una clau primària." + +#: template/defaultfilters.py:767 msgid "yes,no,maybe" msgstr "si,no,potser" -#: template/defaultfilters.py:782 +#: template/defaultfilters.py:798 #, python-format msgid "%(size)d byte" msgid_plural "%(size)d bytes" msgstr[0] "%(size)d byte" msgstr[1] "%(size)d bytes" -#: template/defaultfilters.py:784 +#: template/defaultfilters.py:800 #, python-format msgid "%.1f KB" msgstr "%.1f KB" -#: template/defaultfilters.py:786 +#: template/defaultfilters.py:802 #, python-format msgid "%.1f MB" msgstr "%.1f MB" -#: template/defaultfilters.py:787 +#: template/defaultfilters.py:803 #, python-format msgid "%.1f GB" msgstr "%.1f GB" -#: utils/dateformat.py:41 +#: utils/dateformat.py:42 msgid "p.m." msgstr "p.m." -#: utils/dateformat.py:42 +#: utils/dateformat.py:43 msgid "a.m." msgstr "a.m." -#: utils/dateformat.py:47 +#: utils/dateformat.py:48 msgid "PM" msgstr "PM" -#: utils/dateformat.py:48 +#: utils/dateformat.py:49 msgid "AM" msgstr "AM" -#: utils/dateformat.py:97 +#: utils/dateformat.py:98 msgid "midnight" msgstr "mitja nit" -#: utils/dateformat.py:99 +#: utils/dateformat.py:100 msgid "noon" msgstr "mig dia" @@ -4327,16 +4414,16 @@ msgid_plural "minutes" msgstr[0] "minut" msgstr[1] "minuts" -#: utils/timesince.py:43 +#: utils/timesince.py:45 msgid "minutes" msgstr "minuts" -#: utils/timesince.py:48 +#: utils/timesince.py:50 #, python-format msgid "%(number)d %(type)s" msgstr "%(number)d %(type)s" -#: utils/timesince.py:54 +#: utils/timesince.py:56 #, python-format msgid ", %(number)d %(type)s" msgstr ", %(number)d %(type)s" @@ -4371,3 +4458,9 @@ msgstr "El/la %(verbose_name)s s'ha actualtzat amb èxit." #, python-format msgid "The %(verbose_name)s was deleted." msgstr "El %(verbose_name)s s'ha eliminat." + +#, fuzzy +#~ msgid "verbose_name" +#~ msgid_plural "verbose_name_plural" +#~ msgstr[0] "verbose_name" +#~ msgstr[1] "verbose_name_plural" diff --git a/django/conf/locale/es/LC_MESSAGES/django.mo b/django/conf/locale/es/LC_MESSAGES/django.mo index 831964a5aec4edafa3e857bdfdf374d15f12430d..a8bd5f985de2bd15ff9f9a2a0eb931d5cc4686e2 100644 GIT binary patch delta 23398 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 delta 21233 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 diff --git a/django/conf/locale/es/LC_MESSAGES/django.po b/django/conf/locale/es/LC_MESSAGES/django.po index b02ab9b7ff..fb5eec0c43 100644 --- a/django/conf/locale/es/LC_MESSAGES/django.po +++ b/django/conf/locale/es/LC_MESSAGES/django.po @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: Django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-03-24 13:00+0100\n" -"PO-Revision-Date: 2009-03-24 13:26+0100\n" +"POT-Creation-Date: 2009-07-07 15:15+0200\n" +"PO-Revision-Date: 2009-07-07 15:22+0200\n" "Last-Translator: Django Spanish Team Language-" "Team: Django Spanish Team MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -217,6 +217,20 @@ msgstr "chino simplificado" msgid "Traditional Chinese" msgstr "chino tradicional" +#: contrib/admin/actions.py:60 +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Eliminado/s %(count)d %(items)s satisfactoriamente." + +#: contrib/admin/actions.py:67 contrib/admin/options.py:1025 +msgid "Are you sure?" +msgstr "¿Está seguro?" + +#: contrib/admin/actions.py:85 +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Eliminar %(verbose_name_plural)s seleccionado/s" + #: contrib/admin/filterspecs.py:44 #, python-format msgid "" @@ -251,15 +265,15 @@ msgstr "Este mes" msgid "This year" msgstr "Este año" -#: contrib/admin/filterspecs.py:147 forms/widgets.py:413 +#: contrib/admin/filterspecs.py:147 forms/widgets.py:434 msgid "Yes" msgstr "Sí" -#: contrib/admin/filterspecs.py:147 forms/widgets.py:413 +#: contrib/admin/filterspecs.py:147 forms/widgets.py:434 msgid "No" msgstr "No" -#: contrib/admin/filterspecs.py:154 forms/widgets.py:413 +#: contrib/admin/filterspecs.py:154 forms/widgets.py:434 msgid "Unknown" msgstr "Desconocido" @@ -295,117 +309,104 @@ msgstr "entrada de registro" msgid "log entries" msgstr "entradas de registro" -#: contrib/admin/options.py:131 contrib/admin/options.py:145 +#: contrib/admin/options.py:133 contrib/admin/options.py:147 msgid "None" msgstr "Ninguno" -#: contrib/admin/options.py:498 -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Eliminado/s %(count)d %(items)s satisfactoriamente." - -#: contrib/admin/options.py:505 contrib/admin/options.py:1012 -msgid "Are you sure?" -msgstr "¿Está seguro?" - -#: contrib/admin/options.py:523 -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Eliminar %(verbose_name_plural)s seleccionado/s" - -#: contrib/admin/options.py:531 +#: contrib/admin/options.py:519 #, python-format msgid "Changed %s." msgstr "Modificado/a %s." -#: contrib/admin/options.py:531 contrib/admin/options.py:541 -#: contrib/comments/templates/comments/preview.html:15 forms/models.py:296 +#: contrib/admin/options.py:519 contrib/admin/options.py:529 +#: contrib/comments/templates/comments/preview.html:16 forms/models.py:388 +#: forms/models.py:600 msgid "and" msgstr "y" -#: contrib/admin/options.py:536 +#: contrib/admin/options.py:524 #, python-format msgid "Added %(name)s \"%(object)s\"." msgstr "Añadido/a \"%(object)s\" %(name)s." -#: contrib/admin/options.py:540 +#: contrib/admin/options.py:528 #, python-format msgid "Changed %(list)s for %(name)s \"%(object)s\"." msgstr "Modificados %(list)s para \"%(object)s\" %(name)s." -#: contrib/admin/options.py:545 +#: contrib/admin/options.py:533 #, python-format msgid "Deleted %(name)s \"%(object)s\"." msgstr "Eliminado/a \"%(object)s\" %(name)s." -#: contrib/admin/options.py:549 +#: contrib/admin/options.py:537 msgid "No fields changed." msgstr "No ha cambiado ningún campo." -#: contrib/admin/options.py:610 contrib/auth/admin.py:67 +#: contrib/admin/options.py:598 contrib/auth/admin.py:67 #, python-format msgid "The %(name)s \"%(obj)s\" was added successfully." msgstr "Se añadió con éxito el %(name)s \"%(obj)s\"." -#: contrib/admin/options.py:614 contrib/admin/options.py:647 +#: contrib/admin/options.py:602 contrib/admin/options.py:635 #: contrib/auth/admin.py:75 msgid "You may edit it again below." msgstr "Puede editarlo de nuevo abajo." -#: contrib/admin/options.py:624 contrib/admin/options.py:657 +#: contrib/admin/options.py:612 contrib/admin/options.py:645 #, python-format msgid "You may add another %s below." msgstr "Puede añadir otro %s abajo." -#: contrib/admin/options.py:645 +#: contrib/admin/options.py:633 #, python-format msgid "The %(name)s \"%(obj)s\" was changed successfully." msgstr "Se modificó con éxito el %(name)s \"%(obj)s\"." -#: contrib/admin/options.py:653 +#: contrib/admin/options.py:641 #, python-format msgid "" "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." msgstr "" "Se añadió con éxito el %(name)s \"%(obj)s. Puede editarlo de nuevo abajo." -#: contrib/admin/options.py:774 +#: contrib/admin/options.py:772 #, python-format msgid "Add %s" msgstr "Añadir %s" -#: contrib/admin/options.py:805 contrib/admin/options.py:990 +#: contrib/admin/options.py:803 contrib/admin/options.py:1003 #, python-format msgid "%(name)s object with primary key %(key)r does not exist." msgstr "No existe ningún objeto %(name)s con la clave primaria %(key)r." -#: contrib/admin/options.py:862 +#: contrib/admin/options.py:860 #, python-format msgid "Change %s" msgstr "Modificar %s" -#: contrib/admin/options.py:894 +#: contrib/admin/options.py:904 msgid "Database error" msgstr "Error en la base de datos" -#: contrib/admin/options.py:930 +#: contrib/admin/options.py:940 #, python-format msgid "%(count)s %(name)s was changed successfully." msgid_plural "%(count)s %(name)s were changed successfully." msgstr[0] "%(count)s %(name)s fué modificado con éxito." msgstr[1] "%(count)s %(name)s fueron modificados con éxito." -#: contrib/admin/options.py:1005 +#: contrib/admin/options.py:1018 #, python-format msgid "The %(name)s \"%(obj)s\" was deleted successfully." msgstr "Se eliminó con éxito el %(name)s \"%(obj)s\"." -#: contrib/admin/options.py:1041 +#: contrib/admin/options.py:1054 #, python-format msgid "Change history: %s" msgstr "Histórico de modificaciones: %s" -#: contrib/admin/sites.py:15 contrib/admin/views/decorators.py:14 +#: contrib/admin/sites.py:20 contrib/admin/views/decorators.py:14 #: contrib/auth/forms.py:80 msgid "" "Please enter a correct username and password. Note that both fields are case-" @@ -414,11 +415,11 @@ msgstr "" "Por favor, introduzca un nombre de usuario y contraseña correctos. Note que " "ambos campos son sensibles a mayúsculas/minúsculas." -#: contrib/admin/sites.py:250 contrib/admin/views/decorators.py:40 +#: contrib/admin/sites.py:278 contrib/admin/views/decorators.py:40 msgid "Please log in again, because your session has expired." msgstr "Por favor, inicie sesión de nuevo, ya que su sesión ha caducado." -#: contrib/admin/sites.py:257 contrib/admin/views/decorators.py:47 +#: contrib/admin/sites.py:285 contrib/admin/views/decorators.py:47 msgid "" "Looks like your browser isn't configured to accept cookies. Please enable " "cookies, reload this page, and try again." @@ -426,29 +427,29 @@ msgstr "" "Parece que su navegador no está configurado para aceptar cookies. " "Actívelas , recargue esta página, e inténtelo de nuevo." -#: contrib/admin/sites.py:273 contrib/admin/sites.py:279 +#: contrib/admin/sites.py:301 contrib/admin/sites.py:307 #: contrib/admin/views/decorators.py:66 msgid "Usernames cannot contain the '@' character." msgstr "Los nombres de usuario no pueden contener el carácter '@'." -#: contrib/admin/sites.py:276 contrib/admin/views/decorators.py:62 +#: contrib/admin/sites.py:304 contrib/admin/views/decorators.py:62 #, python-format msgid "Your e-mail address is not your username. Try '%s' instead." msgstr "" "Su dirección de correo no es su nombre de usuario. Pruebe con '%s' en su " "lugar." -#: contrib/admin/sites.py:336 +#: contrib/admin/sites.py:360 msgid "Site administration" msgstr "Sitio administrativo" -#: contrib/admin/sites.py:349 contrib/admin/templates/admin/login.html:26 +#: contrib/admin/sites.py:373 contrib/admin/templates/admin/login.html:26 #: contrib/admin/templates/registration/password_reset_complete.html:14 #: contrib/admin/views/decorators.py:20 msgid "Log in" msgstr "Iniciar sesión" -#: contrib/admin/sites.py:396 +#: contrib/admin/sites.py:417 #, python-format msgid "%s administration" msgstr "Administración de %s" @@ -463,33 +464,27 @@ msgstr "Uno o más %(fieldname)s en %(name)s: %(obj)s" msgid "One or more %(fieldname)s in %(name)s:" msgstr "Uno o más %(fieldname)s en %(name)s:" -#: contrib/admin/util.py:222 -msgid "verbose_name" -msgid_plural "verbose_name_plural" -msgstr[0] "verbose_name" -msgstr[1] "verbose_name_plural" - -#: contrib/admin/widgets.py:70 +#: contrib/admin/widgets.py:71 msgid "Date:" msgstr "Fecha:" -#: contrib/admin/widgets.py:70 +#: contrib/admin/widgets.py:71 msgid "Time:" msgstr "Hora:" -#: contrib/admin/widgets.py:94 +#: contrib/admin/widgets.py:95 msgid "Currently:" msgstr "Actualmente:" -#: contrib/admin/widgets.py:94 +#: contrib/admin/widgets.py:95 msgid "Change:" msgstr "Modificar:" -#: contrib/admin/widgets.py:123 +#: contrib/admin/widgets.py:124 msgid "Lookup" msgstr "Buscar" -#: contrib/admin/widgets.py:230 +#: contrib/admin/widgets.py:236 msgid "Add Another" msgstr "Añadir otro" @@ -504,9 +499,9 @@ msgstr "Lo sentimos, pero no se encuentra la página solicitada." #: contrib/admin/templates/admin/500.html:4 #: contrib/admin/templates/admin/app_index.html:8 -#: contrib/admin/templates/admin/base.html:33 +#: contrib/admin/templates/admin/base.html:31 #: contrib/admin/templates/admin/change_form.html:17 -#: contrib/admin/templates/admin/change_list.html:20 +#: contrib/admin/templates/admin/change_list.html:25 #: contrib/admin/templates/admin/delete_confirmation.html:6 #: contrib/admin/templates/admin/delete_selected_confirmation.html:6 #: contrib/admin/templates/admin/invalid_setup.html:4 @@ -549,7 +544,6 @@ msgid "Run the selected action" msgstr "Ejecutar la acción seleccionada" #: contrib/admin/templates/admin/actions.html:4 -#: contrib/admin/templates/admin/search_form.html:8 msgid "Go" msgstr "Ir" @@ -559,26 +553,26 @@ msgstr "Ir" msgid "%(name)s" msgstr "%(name)s" -#: contrib/admin/templates/admin/base.html:28 +#: contrib/admin/templates/admin/base.html:26 msgid "Welcome," msgstr "Bienvenido/a," -#: contrib/admin/templates/admin/base.html:28 +#: contrib/admin/templates/admin/base.html:26 #: contrib/admin/templates/registration/password_change_done.html:3 #: contrib/admin/templates/registration/password_change_form.html:3 #: contrib/admindocs/templates/admin_doc/bookmarklets.html:3 msgid "Documentation" msgstr "Documentación" -#: contrib/admin/templates/admin/base.html:28 -#: contrib/admin/templates/admin/auth/user/change_password.html:13 -#: contrib/admin/templates/admin/auth/user/change_password.html:46 +#: contrib/admin/templates/admin/base.html:26 +#: contrib/admin/templates/admin/auth/user/change_password.html:14 +#: contrib/admin/templates/admin/auth/user/change_password.html:47 #: contrib/admin/templates/registration/password_change_done.html:3 #: contrib/admin/templates/registration/password_change_form.html:3 msgid "Change password" msgstr "Cambiar contraseña" -#: contrib/admin/templates/admin/base.html:28 +#: contrib/admin/templates/admin/base.html:26 #: contrib/admin/templates/registration/password_change_done.html:3 #: contrib/admin/templates/registration/password_change_form.html:3 msgid "Log out" @@ -609,24 +603,24 @@ msgid "View on site" msgstr "Ver en el sitio" #: contrib/admin/templates/admin/change_form.html:38 -#: contrib/admin/templates/admin/change_list.html:49 -#: contrib/admin/templates/admin/auth/user/change_password.html:22 +#: contrib/admin/templates/admin/change_list.html:54 +#: contrib/admin/templates/admin/auth/user/change_password.html:23 msgid "Please correct the error below." msgid_plural "Please correct the errors below." msgstr[0] "Por favor, corrija el siguiente error." msgstr[1] "Por favor, corrija los siguientes errores." -#: contrib/admin/templates/admin/change_list.html:41 +#: contrib/admin/templates/admin/change_list.html:46 #, python-format msgid "Add %(name)s" msgstr "Añadir %(name)s" -#: contrib/admin/templates/admin/change_list.html:60 +#: contrib/admin/templates/admin/change_list.html:65 msgid "Filter" msgstr "Filtro" #: contrib/admin/templates/admin/delete_confirmation.html:10 -#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:251 +#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:275 msgid "Delete" msgstr "Eliminar" @@ -666,9 +660,9 @@ msgid "" "your account doesn't have permission to delete the following types of " "objects:" msgstr "" -"Eliminar el %(object_name)s provocaría la eliminación " -"de objetos relacionados, pero su cuenta no tiene permiso para borrar los " -"siguientes tipos de objetos:" +"Eliminar el %(object_name)s provocaría la eliminación de objetos " +"relacionados, pero su cuenta no tiene permiso para borrar los siguientes " +"tipos de objetos:" #: contrib/admin/templates/admin/delete_selected_confirmation.html:22 #, python-format @@ -676,8 +670,8 @@ msgid "" "Are you sure you want to delete the selected %(object_name)s objects? All of " "the following objects and it's related items will be deleted:" msgstr "" -"¿Está seguro de que quiere borrar los %(object_name)s? " -"Los siguientes objetos y sus elementos relacionados serán eliminados:" +"¿Está seguro de que quiere borrar los %(object_name)s? Los siguientes " +"objetos y sus elementos relacionados serán eliminados:" #: contrib/admin/templates/admin/filter.html:2 #, python-format @@ -709,6 +703,10 @@ msgstr "Mis acciones" msgid "None available" msgstr "Ninguno disponible" +#: contrib/admin/templates/admin/index.html:72 +msgid "Unknown content" +msgstr "Contenido desconocido" + #: contrib/admin/templates/admin/invalid_setup.html:7 msgid "" "Something's wrong with your database installation. Make sure the appropriate " @@ -757,6 +755,15 @@ msgstr "" msgid "Show all" msgstr "Mostrar todo" +#: contrib/admin/templates/admin/pagination.html:11 +#: contrib/admin/templates/admin/submit_line.html:3 +msgid "Save" +msgstr "Grabar" + +#: contrib/admin/templates/admin/search_form.html:8 +msgid "Search" +msgstr "Buscar" + #: contrib/admin/templates/admin/search_form.html:10 #, python-format msgid "1 result" @@ -769,10 +776,6 @@ msgstr[1] "%(counter)s resultados" msgid "%(full_result_count)s total" msgstr "%(full_result_count)s total" -#: contrib/admin/templates/admin/submit_line.html:3 -msgid "Save" -msgstr "Grabar" - #: contrib/admin/templates/admin/submit_line.html:5 msgid "Save as new" msgstr "Grabar como nuevo" @@ -799,23 +802,23 @@ msgid "Username" msgstr "Nombre de usuario" #: contrib/admin/templates/admin/auth/user/add_form.html:20 -#: contrib/admin/templates/admin/auth/user/change_password.html:33 +#: contrib/admin/templates/admin/auth/user/change_password.html:34 #: contrib/auth/forms.py:17 contrib/auth/forms.py:60 contrib/auth/forms.py:185 msgid "Password" msgstr "Contraseña" #: contrib/admin/templates/admin/auth/user/add_form.html:26 -#: contrib/admin/templates/admin/auth/user/change_password.html:39 +#: contrib/admin/templates/admin/auth/user/change_password.html:40 #: contrib/auth/forms.py:186 msgid "Password (again)" msgstr "Contraseña (de nuevo)" #: contrib/admin/templates/admin/auth/user/add_form.html:27 -#: contrib/admin/templates/admin/auth/user/change_password.html:40 +#: contrib/admin/templates/admin/auth/user/change_password.html:41 msgid "Enter the same password as above, for verification." msgstr "Introduzca la misma contraseña que arriba, para verificación." -#: contrib/admin/templates/admin/auth/user/change_password.html:26 +#: contrib/admin/templates/admin/auth/user/change_password.html:27 #, python-format msgid "Enter a new password for the user %(username)s." msgstr "" @@ -1037,114 +1040,115 @@ msgstr "" msgid "the related `%(app_label)s.%(data_type)s` object" msgstr "el objeto relacionado `%(app_label)s.%(data_type)s`" -#: contrib/admindocs/views.py:206 contrib/admindocs/views.py:228 -#: contrib/admindocs/views.py:242 contrib/admindocs/views.py:247 +#: contrib/admindocs/views.py:206 contrib/admindocs/views.py:225 +#: contrib/admindocs/views.py:230 contrib/admindocs/views.py:244 +#: contrib/admindocs/views.py:258 contrib/admindocs/views.py:263 msgid "model:" msgstr "modelo:" -#: contrib/admindocs/views.py:237 +#: contrib/admindocs/views.py:221 contrib/admindocs/views.py:253 #, python-format msgid "related `%(app_label)s.%(object_name)s` objects" msgstr "los objetos relacionados `%(app_label)s.%(object_name)s`" -#: contrib/admindocs/views.py:242 +#: contrib/admindocs/views.py:225 contrib/admindocs/views.py:258 #, python-format msgid "all %s" msgstr "todo %s" -#: contrib/admindocs/views.py:247 +#: contrib/admindocs/views.py:230 contrib/admindocs/views.py:263 #, python-format msgid "number of %s" msgstr "número de %s" -#: contrib/admindocs/views.py:252 +#: contrib/admindocs/views.py:268 #, python-format msgid "Fields on %s objects" msgstr "Campos en %s objetos" -#: contrib/admindocs/views.py:315 contrib/admindocs/views.py:326 -#: contrib/admindocs/views.py:328 contrib/admindocs/views.py:334 -#: contrib/admindocs/views.py:335 contrib/admindocs/views.py:337 +#: contrib/admindocs/views.py:331 contrib/admindocs/views.py:342 +#: contrib/admindocs/views.py:344 contrib/admindocs/views.py:350 +#: contrib/admindocs/views.py:351 contrib/admindocs/views.py:353 msgid "Integer" msgstr "Entero" -#: contrib/admindocs/views.py:316 +#: contrib/admindocs/views.py:332 msgid "Boolean (Either True or False)" msgstr "Booleano (Verdadero o Falso)" -#: contrib/admindocs/views.py:317 contrib/admindocs/views.py:336 +#: contrib/admindocs/views.py:333 contrib/admindocs/views.py:352 #, python-format msgid "String (up to %(max_length)s)" msgstr "Cadena (máximo %(max_length)s)" -#: contrib/admindocs/views.py:318 +#: contrib/admindocs/views.py:334 msgid "Comma-separated integers" msgstr "Enteros separados por comas" -#: contrib/admindocs/views.py:319 +#: contrib/admindocs/views.py:335 msgid "Date (without time)" msgstr "Fecha (sin hora)" -#: contrib/admindocs/views.py:320 +#: contrib/admindocs/views.py:336 msgid "Date (with time)" msgstr "Fecha (con hora)" -#: contrib/admindocs/views.py:321 +#: contrib/admindocs/views.py:337 msgid "Decimal number" msgstr "Número decimal" -#: contrib/admindocs/views.py:322 +#: contrib/admindocs/views.py:338 msgid "E-mail address" msgstr "Dirección de correo electrónico" -#: contrib/admindocs/views.py:323 contrib/admindocs/views.py:324 -#: contrib/admindocs/views.py:327 +#: contrib/admindocs/views.py:339 contrib/admindocs/views.py:340 +#: contrib/admindocs/views.py:343 msgid "File path" msgstr "Ruta de fichero" -#: contrib/admindocs/views.py:325 +#: contrib/admindocs/views.py:341 msgid "Floating point number" msgstr "Número en coma flotante" -#: contrib/admindocs/views.py:329 contrib/comments/models.py:58 +#: contrib/admindocs/views.py:345 contrib/comments/models.py:60 msgid "IP address" msgstr "Dirección IP" -#: contrib/admindocs/views.py:331 +#: contrib/admindocs/views.py:347 msgid "Boolean (Either True, False or None)" msgstr "Booleano (Verdadero, Falso o Nulo)" -#: contrib/admindocs/views.py:332 +#: contrib/admindocs/views.py:348 msgid "Relation to parent model" msgstr "Relación con el modelo padre" -#: contrib/admindocs/views.py:333 +#: contrib/admindocs/views.py:349 msgid "Phone number" msgstr "Número de teléfono" -#: contrib/admindocs/views.py:338 +#: contrib/admindocs/views.py:354 msgid "Text" msgstr "Texto" -#: contrib/admindocs/views.py:339 +#: contrib/admindocs/views.py:355 msgid "Time" msgstr "Hora" -#: contrib/admindocs/views.py:340 contrib/comments/forms.py:95 +#: contrib/admindocs/views.py:356 contrib/comments/forms.py:95 #: contrib/comments/templates/comments/moderation_queue.html:37 #: contrib/flatpages/admin.py:8 contrib/flatpages/models.py:7 msgid "URL" msgstr "URL" -#: contrib/admindocs/views.py:341 +#: contrib/admindocs/views.py:357 msgid "U.S. state (two uppercase letters)" msgstr "Estado de los EEUU (dos letras mayúsculas)" -#: contrib/admindocs/views.py:342 +#: contrib/admindocs/views.py:358 msgid "XML text" msgstr "Texto XML" -#: contrib/admindocs/views.py:368 +#: contrib/admindocs/views.py:384 #, python-format msgid "%s does not appear to be a urlpattern object" msgstr "%s no parece ser un objeto urlpattern" @@ -1248,7 +1252,7 @@ msgid "Change password: %s" msgstr "Cambiar contraseña: %s" #: contrib/auth/forms.py:15 contrib/auth/forms.py:48 -#: contrib/auth/models.py:127 +#: contrib/auth/models.py:128 msgid "" "Required. 30 characters or fewer. Alphanumeric characters only (letters, " "digits and underscores)." @@ -1340,31 +1344,31 @@ msgstr "permisos" msgid "group" msgstr "grupo" -#: contrib/auth/models.py:91 contrib/auth/models.py:137 +#: contrib/auth/models.py:91 contrib/auth/models.py:138 msgid "groups" msgstr "grupos" -#: contrib/auth/models.py:127 +#: contrib/auth/models.py:128 msgid "username" msgstr "nombre de usuario" -#: contrib/auth/models.py:128 +#: contrib/auth/models.py:129 msgid "first name" msgstr "nombre propio" -#: contrib/auth/models.py:129 +#: contrib/auth/models.py:130 msgid "last name" msgstr "apellidos" -#: contrib/auth/models.py:130 +#: contrib/auth/models.py:131 msgid "e-mail address" msgstr "dirección de correo electrónico" -#: contrib/auth/models.py:131 +#: contrib/auth/models.py:132 msgid "password" msgstr "contraseña" -#: contrib/auth/models.py:131 +#: contrib/auth/models.py:132 msgid "" "Use '[algo]$[salt]$[hexdigest]' or use the change " "password form." @@ -1372,19 +1376,19 @@ msgstr "" "Use'[algo]$[sal]$[hash hexadecimal]' o use el " "formulario para cambiar la contraseña." -#: contrib/auth/models.py:132 +#: contrib/auth/models.py:133 msgid "staff status" msgstr "es staff" -#: contrib/auth/models.py:132 +#: contrib/auth/models.py:133 msgid "Designates whether the user can log into this admin site." msgstr "Indica si el usuario puede entrar en este sitio de administración." -#: contrib/auth/models.py:133 +#: contrib/auth/models.py:134 msgid "active" msgstr "activo" -#: contrib/auth/models.py:133 +#: contrib/auth/models.py:134 msgid "" "Designates whether this user should be treated as active. Unselect this " "instead of deleting accounts." @@ -1392,11 +1396,11 @@ msgstr "" "Indica si el usuario puede ser tratado como activo. Desmarque esta opción en " "lugar de borrar la cuenta." -#: contrib/auth/models.py:134 +#: contrib/auth/models.py:135 msgid "superuser status" msgstr "es superusuario" -#: contrib/auth/models.py:134 +#: contrib/auth/models.py:135 msgid "" "Designates that this user has all permissions without explicitly assigning " "them." @@ -1404,15 +1408,15 @@ msgstr "" "Indica que este usuario tiene todos los permisos sin asignárselos " "explícitamente." -#: contrib/auth/models.py:135 +#: contrib/auth/models.py:136 msgid "last login" msgstr "último inicio de sesión" -#: contrib/auth/models.py:136 +#: contrib/auth/models.py:137 msgid "date joined" msgstr "fecha de alta" -#: contrib/auth/models.py:138 +#: contrib/auth/models.py:139 msgid "" "In addition to the permissions manually assigned, this user will also get " "all permissions granted to each group he/she is in." @@ -1420,23 +1424,24 @@ msgstr "" "Además de los permisos asignados manualmente, este usuario también tendrá " "todos los permisos de los grupos en los que esté." -#: contrib/auth/models.py:139 +#: contrib/auth/models.py:140 msgid "user permissions" msgstr "permisos de usuario" -#: contrib/auth/models.py:143 +#: contrib/auth/models.py:144 contrib/comments/models.py:50 +#: contrib/comments/models.py:168 msgid "user" msgstr "usuario" -#: contrib/auth/models.py:144 +#: contrib/auth/models.py:145 msgid "users" msgstr "usuarios" -#: contrib/auth/models.py:300 +#: contrib/auth/models.py:301 msgid "message" msgstr "mensaje" -#: contrib/auth/views.py:50 +#: contrib/auth/views.py:56 msgid "Logged out" msgstr "Sesión terminada" @@ -1452,10 +1457,20 @@ msgstr "contenido" msgid "Metadata" msgstr "metadatos" +#: contrib/comments/feeds.py:13 +#, python-format +msgid "%(site_name)s comments" +msgstr "comentarios de %(site_name)s" + +#: contrib/comments/feeds.py:23 +#, python-format +msgid "Latest comments on %(site_name)s" +msgstr "Últimos comentarios en %(site_name)s" + #: contrib/comments/forms.py:93 #: contrib/comments/templates/comments/moderation_queue.html:34 msgid "Name" -msgstr "nombre" +msgstr "Nombre" #: contrib/comments/forms.py:94 msgid "Email address" @@ -1464,7 +1479,7 @@ msgstr "dirección de correo electrónico" #: contrib/comments/forms.py:96 #: contrib/comments/templates/comments/moderation_queue.html:35 msgid "Comment" -msgstr "comentario" +msgstr "Comentario" #: contrib/comments/forms.py:173 #, python-format @@ -1478,46 +1493,51 @@ msgid "" "If you enter anything in this field your comment will be treated as spam" msgstr "Si introduce algo en este campo su comentario será tratado como spam" -#: contrib/comments/models.py:23 +#: contrib/comments/models.py:22 contrib/contenttypes/models.py:74 +msgid "content type" +msgstr "tipo de contenido" + +#: contrib/comments/models.py:24 msgid "object ID" msgstr "ID de objeto" -#: contrib/comments/models.py:50 +#: contrib/comments/models.py:52 msgid "user's name" msgstr "nombre del usuario" -#: contrib/comments/models.py:51 +#: contrib/comments/models.py:53 msgid "user's email address" msgstr "dirección de correo electrónico del usuario" -#: contrib/comments/models.py:52 +#: contrib/comments/models.py:54 msgid "user's URL" msgstr "URL del usuario" -#: contrib/comments/models.py:54 +#: contrib/comments/models.py:56 contrib/comments/models.py:76 +#: contrib/comments/models.py:169 msgid "comment" msgstr "comentario" -#: contrib/comments/models.py:57 +#: contrib/comments/models.py:59 msgid "date/time submitted" msgstr "fecha/hora de envío" -#: contrib/comments/models.py:59 +#: contrib/comments/models.py:61 msgid "is public" msgstr "es público" -#: contrib/comments/models.py:60 +#: contrib/comments/models.py:62 msgid "" "Uncheck this box to make the comment effectively disappear from the site." msgstr "" "Desmarque esta casilla para hacer desaparecer el comentario del sitio web de " "forma efectiva." -#: contrib/comments/models.py:62 +#: contrib/comments/models.py:64 msgid "is removed" msgstr "está eliminado" -#: contrib/comments/models.py:63 +#: contrib/comments/models.py:65 msgid "" "Check this box if the comment is inappropriate. A \"This comment has been " "removed\" message will be displayed instead." @@ -1525,7 +1545,11 @@ msgstr "" "Marque esta opción si el comentario es inapropiado. En su lugar se mostrará " "el mensaje \"Este comentario ha sido eliminado\"." -#: contrib/comments/models.py:115 +#: contrib/comments/models.py:77 +msgid "comments" +msgstr "comentarios" + +#: contrib/comments/models.py:119 msgid "" "This comment was posted by an authenticated user and thus the name is read-" "only." @@ -1533,7 +1557,7 @@ msgstr "" "Este comentario ha sido enviado por un usuario autentificado: de modo que su " "nombre no es modificable." -#: contrib/comments/models.py:124 +#: contrib/comments/models.py:128 msgid "" "This comment was posted by an authenticated user and thus the email is read-" "only." @@ -1541,7 +1565,7 @@ msgstr "" "Este comentario ha sido colocado por un usuario autentificado: de modo que " "su dirección de correo electrónico no es modificable." -#: contrib/comments/models.py:149 +#: contrib/comments/models.py:153 #, python-format msgid "" "Posted by %(user)s at %(date)s\n" @@ -1556,6 +1580,22 @@ msgstr "" "\n" "http://%(domain)s%(url)s" +#: contrib/comments/models.py:170 +msgid "flag" +msgstr "marcar" + +#: contrib/comments/models.py:171 +msgid "date" +msgstr "fecha" + +#: contrib/comments/models.py:181 +msgid "comment flag" +msgstr "marca de comentario" + +#: contrib/comments/models.py:182 +msgid "comment flags" +msgstr "marcas de comentario" + #: contrib/comments/templates/comments/approve.html:4 msgid "Approve a comment" msgstr "Aprovar un comentario" @@ -1615,13 +1655,13 @@ msgstr "Marcar" msgid "Thanks for flagging" msgstr "Graciar por marcar" -#: contrib/comments/templates/comments/form.html:16 -#: contrib/comments/templates/comments/preview.html:31 +#: contrib/comments/templates/comments/form.html:17 +#: contrib/comments/templates/comments/preview.html:32 msgid "Post" msgstr "Enviar" -#: contrib/comments/templates/comments/form.html:17 -#: contrib/comments/templates/comments/preview.html:32 +#: contrib/comments/templates/comments/form.html:18 +#: contrib/comments/templates/comments/preview.html:33 msgid "Preview" msgstr "Previsualizar" @@ -1667,33 +1707,29 @@ msgid "Thank you for your comment" msgstr "Gracias por su comentario" #: contrib/comments/templates/comments/preview.html:4 -#: contrib/comments/templates/comments/preview.html:12 +#: contrib/comments/templates/comments/preview.html:13 msgid "Preview your comment" msgstr "Previsualizar su comentario" -#: contrib/comments/templates/comments/preview.html:10 +#: contrib/comments/templates/comments/preview.html:11 msgid "Please correct the error below" msgid_plural "Please correct the errors below" msgstr[0] "Por favor, corrija el siguiente error." msgstr[1] "Por favor, corrija los siguientes errores." -#: contrib/comments/templates/comments/preview.html:15 +#: contrib/comments/templates/comments/preview.html:16 msgid "Post your comment" msgstr "Envie su comentario" -#: contrib/comments/templates/comments/preview.html:15 +#: contrib/comments/templates/comments/preview.html:16 msgid "or make changes" msgstr "o haga cambios" -#: contrib/contenttypes/models.py:67 +#: contrib/contenttypes/models.py:70 msgid "python model class name" msgstr "nombre de la clase modelo de python" -#: contrib/contenttypes/models.py:71 -msgid "content type" -msgstr "tipo de contenido" - -#: contrib/contenttypes/models.py:72 +#: contrib/contenttypes/models.py:75 msgid "content types" msgstr "tipos de contenido" @@ -1762,18 +1798,26 @@ msgstr "" "Lo sentimos, pero su formulario ha expirado. Por favor, continue rellenando " "el formulario en esta página." -#: contrib/gis/forms/fields.py:14 +#: contrib/gis/forms/fields.py:17 msgid "No geometry value provided." msgstr "No se indico ningún valor de geometría." -#: contrib/gis/forms/fields.py:15 +#: contrib/gis/forms/fields.py:18 msgid "Invalid geometry value." msgstr "Valor de geometría inválido." -#: contrib/gis/forms/fields.py:16 +#: contrib/gis/forms/fields.py:19 msgid "Invalid geometry type." msgstr "Tipo de geometría inválido." +#: contrib/gis/forms/fields.py:20 +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" +"Ocurrió un error al transformar la geometria al SRID de la geometria " +"del campo de formulario." + #: contrib/humanize/templatetags/humanize.py:19 msgid "th" msgstr "º" @@ -1891,11 +1935,11 @@ msgstr "Carinthia" #: contrib/localflavor/at/at_states.py:7 msgid "Lower Austria" -msgstr "" +msgstr "Australia Baja" #: contrib/localflavor/at/at_states.py:8 msgid "Upper Austria" -msgstr "" +msgstr "Australia Alta" #: contrib/localflavor/at/at_states.py:9 msgid "Salzburg" @@ -2112,47 +2156,47 @@ msgstr "Región Bohemia Sur" #: contrib/localflavor/cz/cz_regions.py:11 msgid "Pilsen Region" -msgstr "" +msgstr "Región Pilsen" #: contrib/localflavor/cz/cz_regions.py:12 msgid "Carlsbad Region" -msgstr "" +msgstr "Región Carlsbad" #: contrib/localflavor/cz/cz_regions.py:13 msgid "Usti Region" -msgstr "" +msgstr "Región Usti" #: contrib/localflavor/cz/cz_regions.py:14 msgid "Liberec Region" -msgstr "" +msgstr "Región Liberec" #: contrib/localflavor/cz/cz_regions.py:15 msgid "Hradec Region" -msgstr "" +msgstr "Región Hradec" #: contrib/localflavor/cz/cz_regions.py:16 msgid "Pardubice Region" -msgstr "" +msgstr "Región Pardubice" #: contrib/localflavor/cz/cz_regions.py:17 msgid "Vysocina Region" -msgstr "" +msgstr "Región Vysocina" #: contrib/localflavor/cz/cz_regions.py:18 msgid "South Moravian Region" -msgstr "" +msgstr "Región Moravia Sur" #: contrib/localflavor/cz/cz_regions.py:19 msgid "Olomouc Region" -msgstr "" +msgstr "Región Olomouc" #: contrib/localflavor/cz/cz_regions.py:20 msgid "Zlin Region" -msgstr "" +msgstr "Región Zlin" #: contrib/localflavor/cz/cz_regions.py:21 msgid "Moravian-Silesian Region" -msgstr "" +msgstr "Región Moravia-Silesiana" #: contrib/localflavor/cz/forms.py:27 contrib/localflavor/sk/forms.py:30 msgid "Enter a postal code in the format XXXXX or XXX XX." @@ -2165,7 +2209,8 @@ msgstr "" #: contrib/localflavor/cz/forms.py:48 msgid "Invalid optional parameter Gender, valid values are 'f' and 'm'" -msgstr "El parámetro opcional 'Género' es inválido, los valores válidos son 'f' y 'm'" +msgstr "" +"El parámetro opcional 'Género' es inválido, los valores válidos son 'f' y 'm'" #: contrib/localflavor/cz/forms.py:49 msgid "Enter a valid birth number." @@ -3004,16 +3049,16 @@ msgstr "" msgid "Wrong checksum for the Tax Number (NIP)." msgstr "El Número de Identificación Tributaria (NIP) es incorrecto." -#: contrib/localflavor/pl/forms.py:111 -msgid "National Business Register Number (REGON) consists of 7 or 9 digits." +#: contrib/localflavor/pl/forms.py:109 +msgid "National Business Register Number (REGON) consists of 9 or 14 digits." msgstr "" -"El Número Nacional de Registro de Negocios (REGON) consiste en 7 o 9 dígitos." +"El Número Nacional de Registro de Negocios (REGON) consiste en 9 o 14 dígitos." -#: contrib/localflavor/pl/forms.py:112 +#: contrib/localflavor/pl/forms.py:110 msgid "Wrong checksum for the National Business Register Number (REGON)." msgstr "El Número Nacional de Registro de Negocios (REGON) es incorrecto." -#: contrib/localflavor/pl/forms.py:155 +#: contrib/localflavor/pl/forms.py:148 msgid "Enter a postal code in the format XX-XXX." msgstr "Introduzca un código postal en el formato XX-XXX." @@ -3850,60 +3895,60 @@ msgstr "nombre para mostrar" msgid "sites" msgstr "sitios" -#: db/models/fields/__init__.py:356 db/models/fields/__init__.py:700 +#: db/models/fields/__init__.py:356 db/models/fields/__init__.py:710 msgid "This value must be an integer." msgstr "Este valor debe ser un entero." -#: db/models/fields/__init__.py:387 +#: db/models/fields/__init__.py:388 msgid "This value must be either True or False." msgstr "Este valor debe ser Verdadero o Falso." -#: db/models/fields/__init__.py:420 +#: db/models/fields/__init__.py:427 msgid "This field cannot be null." msgstr "Este campo no puede estar vacío." -#: db/models/fields/__init__.py:436 +#: db/models/fields/__init__.py:443 msgid "Enter only digits separated by commas." msgstr "Introduzca sólo dígitos separados por comas." -#: db/models/fields/__init__.py:467 +#: db/models/fields/__init__.py:474 msgid "Enter a valid date in YYYY-MM-DD format." msgstr "Introduzca una fecha válida en formato AAAA-MM-DD." -#: db/models/fields/__init__.py:476 +#: db/models/fields/__init__.py:483 #, python-format msgid "Invalid date: %s" msgstr "Fecha no válida: %s" -#: db/models/fields/__init__.py:540 db/models/fields/__init__.py:558 +#: db/models/fields/__init__.py:547 db/models/fields/__init__.py:565 msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format." msgstr "" "Introduzca una fecha/hora válida en formato AAAA-MM-DD HH:MM[:ss[.uuuuuu]]." -#: db/models/fields/__init__.py:594 +#: db/models/fields/__init__.py:601 msgid "This value must be a decimal number." msgstr "Este valor debe ser un entero." -#: db/models/fields/__init__.py:676 +#: db/models/fields/__init__.py:686 msgid "This value must be a float." msgstr "Este valor debe ser un número con coma flotante." -#: db/models/fields/__init__.py:736 +#: db/models/fields/__init__.py:746 msgid "This value must be either None, True or False." msgstr "Este valor debe ser Verdadero, Falso o Ninguno." -#: db/models/fields/__init__.py:839 db/models/fields/__init__.py:853 +#: db/models/fields/__init__.py:849 db/models/fields/__init__.py:863 msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format." msgstr "Introduzca una hora válida en formato HH:MM[:ss[.uuuuuu]]." -#: db/models/fields/related.py:779 +#: db/models/fields/related.py:816 msgid "" "Hold down \"Control\", or \"Command\" on a Mac, to select more than one." msgstr "" "Mantenga presionado \"Control\", o \"Command\" en un Mac, para seleccionar " "más de una opción." -#: db/models/fields/related.py:857 +#: db/models/fields/related.py:894 #, python-format msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." msgid_plural "" @@ -3970,11 +4015,11 @@ msgstr "Asegúrese de que no hay más de %s decimales." msgid "Ensure that there are no more than %s digits before the decimal point." msgstr "Asegúrese de que no hay más de %s dígitos antes de la coma decimal." -#: forms/fields.py:288 forms/fields.py:850 +#: forms/fields.py:288 forms/fields.py:863 msgid "Enter a valid date." msgstr "Introduzca una fecha válida." -#: forms/fields.py:322 forms/fields.py:851 +#: forms/fields.py:322 forms/fields.py:864 msgid "Enter a valid time." msgstr "Introduzca una hora válida." @@ -3996,7 +4041,15 @@ msgstr "No se ha enviado ningún fichero" msgid "The submitted file is empty." msgstr "El fichero enviado está vacío." -#: forms/fields.py:478 +#: forms/fields.py:450 +#, python-format +msgid "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr "" +"Asegúrese de que su texto tiene no más de %(max)d caracteres (actualmente " +"tiene %(length)d)." + +#: forms/fields.py:483 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." @@ -4004,106 +4057,140 @@ msgstr "" "Envíe una imagen válida. El fichero que ha enviado no era una imagen o se " "trataba de una imagen corrupta." -#: forms/fields.py:539 +#: forms/fields.py:544 msgid "Enter a valid URL." msgstr "Introduzca una URL válida." -#: forms/fields.py:540 +#: forms/fields.py:545 msgid "This URL appears to be a broken link." msgstr "La URL parece ser un enlace roto." -#: forms/fields.py:619 forms/fields.py:697 +#: forms/fields.py:625 forms/fields.py:703 #, python-format msgid "Select a valid choice. %(value)s is not one of the available choices." msgstr "" "Escoja una opción válida. %(value)s no es una de las opciones disponibles." -#: forms/fields.py:698 forms/fields.py:759 forms/models.py:729 +#: forms/fields.py:704 forms/fields.py:765 forms/models.py:1003 msgid "Enter a list of values." msgstr "Introduzca una lista de valores." -#: forms/fields.py:879 +#: forms/fields.py:892 msgid "Enter a valid IPv4 address." msgstr "Introduzca una dirección IPv4 válida." -#: forms/fields.py:889 +#: forms/fields.py:902 msgid "" "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." msgstr "" "Introduzca un 'slug' válido, consistente en letras, números, guiones bajos o " "medios." -#: forms/formsets.py:247 forms/formsets.py:249 +#: forms/formsets.py:271 forms/formsets.py:273 msgid "Order" msgstr "Orden" -#: forms/models.py:289 forms/models.py:298 +#: forms/models.py:367 +#, python-format +msgid "%(field_name)s must be unique for %(date_field)s %(lookup)s." +msgstr "El campo %(field_name)s debe ser único para %(lookup)s %(date_field)s" + +#: forms/models.py:381 forms/models.py:389 #, python-format msgid "%(model_name)s with this %(field_label)s already exists." msgstr "Ya existe %(model_name)s con este %(field_label)s." -#: forms/models.py:602 +#: forms/models.py:594 +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Por favor, corrija el dato duplicado para %(field)s." + +#: forms/models.py:598 +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"Por favor corriga el dato duplicado para %(field)s, el cual debe ser único." + +#: forms/models.py:604 +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Por favor corriga los datos duplicados para %(field_name)s el cual debe ser " +"único para %(lookup)s en %(date_field)s." + +#: forms/models.py:612 +msgid "Please correct the duplicate values below." +msgstr "Por favor, corrija los valores duplicados abajo." + +#: forms/models.py:867 msgid "The inline foreign key did not match the parent instance primary key." msgstr "" "La clave foránea en linea no coincide con la clave primaria de la instancia " "padre." -#: forms/models.py:659 +#: forms/models.py:930 msgid "Select a valid choice. That choice is not one of the available choices." msgstr "Escoja una opción válida. Esa opción no está entre las disponibles." -#: forms/models.py:730 +#: forms/models.py:1004 #, python-format msgid "Select a valid choice. %s is not one of the available choices." msgstr "Escoja una opción válida; '%s' no es una de las opciones disponibles." -#: template/defaultfilters.py:751 +#: forms/models.py:1006 +#, python-format +msgid "\"%s\" is not a valid value for a primary key." +msgstr "\"%s\" no es un valor válido para una clave primaria." + +#: template/defaultfilters.py:767 msgid "yes,no,maybe" msgstr "sí,no,tal vez" -#: template/defaultfilters.py:782 +#: template/defaultfilters.py:798 #, python-format msgid "%(size)d byte" msgid_plural "%(size)d bytes" msgstr[0] "%(size)d byte" msgstr[1] "%(size)d bytes" -#: template/defaultfilters.py:784 +#: template/defaultfilters.py:800 #, python-format msgid "%.1f KB" msgstr "%.1f KB" -#: template/defaultfilters.py:786 +#: template/defaultfilters.py:802 #, python-format msgid "%.1f MB" msgstr "%.1f MB" -#: template/defaultfilters.py:787 +#: template/defaultfilters.py:803 #, python-format msgid "%.1f GB" msgstr "%.1f GB" -#: utils/dateformat.py:41 +#: utils/dateformat.py:42 msgid "p.m." msgstr "p.m." -#: utils/dateformat.py:42 +#: utils/dateformat.py:43 msgid "a.m." msgstr "a.m." -#: utils/dateformat.py:47 +#: utils/dateformat.py:48 msgid "PM" msgstr "PM" -#: utils/dateformat.py:48 +#: utils/dateformat.py:49 msgid "AM" msgstr "AM" -#: utils/dateformat.py:97 +#: utils/dateformat.py:98 msgid "midnight" msgstr "media noche" -#: utils/dateformat.py:99 +#: utils/dateformat.py:100 msgid "noon" msgstr "medio día" @@ -4327,16 +4414,16 @@ msgid_plural "minutes" msgstr[0] "minuto" msgstr[1] "minutos" -#: utils/timesince.py:43 +#: utils/timesince.py:45 msgid "minutes" msgstr "minutos" -#: utils/timesince.py:48 +#: utils/timesince.py:50 #, python-format msgid "%(number)d %(type)s" msgstr "%(number)d %(type)s" -#: utils/timesince.py:54 +#: utils/timesince.py:56 #, python-format msgid ", %(number)d %(type)s" msgstr ", %(number)d %(type)s" @@ -4372,6 +4459,11 @@ msgstr "Se actualizó con éxito el %(verbose_name)s." msgid "The %(verbose_name)s was deleted." msgstr "El/La %(verbose_name)s ha sido borrado." +#~ msgid "verbose_name" +#~ msgid_plural "verbose_name_plural" +#~ msgstr[0] "verbose_name" +#~ msgstr[1] "verbose_name_plural" + #~ msgid "DATE_WITH_TIME_FULL" #~ msgstr "j M Y P" @@ -4411,9 +4503,6 @@ msgstr "El/La %(verbose_name)s ha sido borrado." #~ msgid "is valid rating" #~ msgstr "puntuación válida" -#~ msgid "comments" -#~ msgstr "comentarios" - #~ msgid "Content object" #~ msgstr "Objeto contenido" @@ -4610,9 +4699,6 @@ msgstr "El/La %(verbose_name)s ha sido borrado." #~ msgid "Please enter both fields or leave them both empty." #~ msgstr "Por favor, rellene ambos campos o deje ambos vacíos." -#~ msgid "This field must be given if %(field)s is %(value)s" -#~ msgstr "Se debe proporcionar este campo si %(field)s es %(value)s" - #~ msgid "This field must be given if %(field)s is not %(value)s" #~ msgstr "Se debe proporcionar este campo si %(field)s no es %(value)s" diff --git a/django/contrib/gis/gdal/prototypes/generation.py b/django/contrib/gis/gdal/prototypes/generation.py index bba715d67c..1303532372 100644 --- a/django/contrib/gis/gdal/prototypes/generation.py +++ b/django/contrib/gis/gdal/prototypes/generation.py @@ -8,6 +8,9 @@ from django.contrib.gis.gdal.prototypes.errcheck import \ check_arg_errcode, check_errcode, check_geom, check_geom_offset, \ check_pointer, check_srs, check_str_arg, check_string, check_const_string +class gdal_char_p(c_char_p): + pass + def double_output(func, argtypes, errcheck=False, strarg=False): "Generates a ctypes function that returns a double value." func.argtypes = argtypes @@ -77,9 +80,9 @@ def string_output(func, argtypes, offset=-1, str_result=False): """ func.argtypes = argtypes if str_result: - # String is the result, don't explicitly define - # the argument type so we can get the pointer. - pass + # Use subclass of c_char_p so the error checking routine + # can free the memory at the pointer's address. + func.restype = gdal_char_p else: # Error code is returned func.restype = c_int diff --git a/django/contrib/gis/geos/prototypes/topology.py b/django/contrib/gis/geos/prototypes/topology.py index 633340901b..65c26f9f37 100644 --- a/django/contrib/gis/geos/prototypes/topology.py +++ b/django/contrib/gis/geos/prototypes/topology.py @@ -10,6 +10,7 @@ __all__ = ['geos_boundary', 'geos_buffer', 'geos_centroid', 'geos_convexhull', from ctypes import c_char_p, c_double, c_int from django.contrib.gis.geos.libgeos import lgeos, GEOM_PTR, GEOS_PREPARE from django.contrib.gis.geos.prototypes.errcheck import check_geom, check_string +from django.contrib.gis.geos.prototypes.geom import geos_char_p def topology(func, *args): "For GEOS unary topology functions." @@ -38,6 +39,7 @@ geos_union = topology(lgeos.GEOSUnion, GEOM_PTR) # GEOSRelate returns a string, not a geometry. geos_relate = lgeos.GEOSRelate geos_relate.argtypes = [GEOM_PTR, GEOM_PTR] +geos_relate.restype = geos_char_p geos_relate.errcheck = check_string # Routines only in GEOS 3.1+ diff --git a/django/core/urlresolvers.py b/django/core/urlresolvers.py index b3dcfdb8c1..b507ea0987 100644 --- a/django/core/urlresolvers.py +++ b/django/core/urlresolvers.py @@ -185,7 +185,11 @@ class RegexURLResolver(object): try: sub_match = pattern.resolve(new_path) except Resolver404, e: - tried.extend([(pattern.regex.pattern + ' ' + t) for t in e.args[0]['tried']]) + sub_tried = e.args[0].get('tried') + if sub_tried is not None: + tried.extend([(pattern.regex.pattern + ' ' + t) for t in sub_tried]) + else: + tried.append(pattern.regex.pattern) else: if sub_match: sub_match_dict = dict([(smart_str(k), v) for k, v in match.groupdict().items()]) @@ -195,7 +199,7 @@ class RegexURLResolver(object): return sub_match[0], sub_match[1], sub_match_dict tried.append(pattern.regex.pattern) raise Resolver404, {'tried': tried, 'path': new_path} - raise Resolver404, {'tried': [], 'path' : path} + raise Resolver404, {'path' : path} def _get_urlconf_module(self): try: @@ -286,4 +290,3 @@ def get_script_prefix(): instance is normally going to be a lot cleaner). """ return _prefixes.get(currentThread(), u'/') - diff --git a/django/forms/models.py b/django/forms/models.py index 8e9c0de0e7..cc43612bf5 100644 --- a/django/forms/models.py +++ b/django/forms/models.py @@ -464,8 +464,21 @@ class BaseModelFormSet(BaseFormSet): return len(self.get_queryset()) return super(BaseModelFormSet, self).initial_form_count() + def _existing_object(self, pk): + if not hasattr(self, '_object_dict'): + self._object_dict = dict([(o.pk, o) for o in self.get_queryset()]) + return self._object_dict.get(pk) + def _construct_form(self, i, **kwargs): - if i < self.initial_form_count(): + if self.is_bound and i < self.initial_form_count(): + pk_key = "%s-%s" % (self.add_prefix(i), self.model._meta.pk.name) + pk = self.data[pk_key] + pk_field = self.model._meta.pk + pk = pk_field.get_db_prep_lookup('exact', pk) + if isinstance(pk, list): + pk = pk[0] + kwargs['instance'] = self._existing_object(pk) + if i < self.initial_form_count() and not kwargs.get('instance'): kwargs['instance'] = self.get_queryset()[i] return super(BaseModelFormSet, self)._construct_form(i, **kwargs) @@ -604,10 +617,6 @@ class BaseModelFormSet(BaseFormSet): if not self.get_queryset(): return [] - # Put the objects from self.get_queryset into a dict so they are easy to lookup by pk - existing_objects = {} - for obj in self.get_queryset(): - existing_objects[obj.pk] = obj saved_instances = [] for form in self.initial_forms: pk_name = self._pk_field.name @@ -618,7 +627,7 @@ class BaseModelFormSet(BaseFormSet): pk_value = form.fields[pk_name].clean(raw_pk_value) pk_value = getattr(pk_value, 'pk', pk_value) - obj = existing_objects[pk_value] + obj = self._existing_object(pk_value) if self.can_delete: raw_delete_value = form._raw_value(DELETION_FIELD_NAME) should_delete = form.fields[DELETION_FIELD_NAME].clean(raw_delete_value) @@ -663,10 +672,13 @@ class BaseModelFormSet(BaseFormSet): return ((not pk.editable) or (pk.auto_created or isinstance(pk, AutoField)) or (pk.rel and pk.rel.parent_link and pk_is_not_editable(pk.rel.to._meta.pk))) if pk_is_not_editable(pk) or pk.name not in form.fields: - try: - pk_value = self.get_queryset()[index].pk - except IndexError: - pk_value = None + if form.is_bound: + pk_value = form.instance.pk + else: + try: + pk_value = self.get_queryset()[index].pk + except IndexError: + pk_value = None if isinstance(pk, OneToOneField) or isinstance(pk, ForeignKey): qs = pk.rel.to._default_manager.get_query_set() else: diff --git a/django/template/defaulttags.py b/django/template/defaulttags.py index a61dd8b36c..7d91cd6415 100644 --- a/django/template/defaulttags.py +++ b/django/template/defaulttags.py @@ -564,7 +564,7 @@ do_filter = register.tag("filter", do_filter) #@register.tag def firstof(parser, token): """ - Outputs the first variable passed that is not False. + Outputs the first variable passed that is not False, without escaping. Outputs nothing if all the passed variables are False. @@ -575,11 +575,11 @@ def firstof(parser, token): This is equivalent to:: {% if var1 %} - {{ var1 }} + {{ var1|safe }} {% else %}{% if var2 %} - {{ var2 }} + {{ var2|safe }} {% else %}{% if var3 %} - {{ var3 }} + {{ var3|safe }} {% endif %}{% endif %}{% endif %} but obviously much cleaner! @@ -589,6 +589,12 @@ def firstof(parser, token): {% firstof var1 var2 var3 "fallback value" %} + If you want to escape the output, use a filter tag:: + + {% filter force_escape %} + {% firstof var1 var2 var3 "fallback value" %} + {% endfilter %} + """ bits = token.split_contents()[1:] if len(bits) < 1: diff --git a/docs/_ext/djangodocs.py b/docs/_ext/djangodocs.py index 65a823e10b..af07a84f32 100644 --- a/docs/_ext/djangodocs.py +++ b/docs/_ext/djangodocs.py @@ -6,10 +6,16 @@ import docutils.nodes import docutils.transforms import sphinx import sphinx.addnodes -import sphinx.builder +try: + from sphinx import builders +except ImportError: + import sphinx.builder as builders import sphinx.directives import sphinx.environment -import sphinx.htmlwriter +try: + import sphinx.writers.html as sphinx_htmlwriter +except ImportError: + import sphinx.htmlwriter as sphinx_htmlwriter import sphinx.roles from docutils import nodes @@ -44,7 +50,7 @@ def setup(app): directivename = "django-admin-option", rolename = "djadminopt", indextemplate = "pair: %s; django-admin command-line option", - parse_node = lambda env, sig, signode: sphinx.directives.parse_option_desc(signode, sig), + parse_node = parse_django_adminopt_node, ) app.add_config_value('django_next_version', '0.0', True) app.add_directive('versionadded', parse_version_directive, 1, (1, 1, 1)) @@ -102,7 +108,7 @@ class SuppressBlockquotes(docutils.transforms.Transform): if len(node.children) == 1 and isinstance(node.children[0], self.suppress_blockquote_child_nodes): node.replace_self(node.children[0]) -class DjangoHTMLTranslator(sphinx.htmlwriter.SmartyPantsHTMLTranslator): +class DjangoHTMLTranslator(sphinx_htmlwriter.SmartyPantsHTMLTranslator): """ Django-specific reST to HTML tweaks. """ @@ -125,10 +131,10 @@ class DjangoHTMLTranslator(sphinx.htmlwriter.SmartyPantsHTMLTranslator): # def visit_literal_block(self, node): self.no_smarty += 1 - sphinx.htmlwriter.SmartyPantsHTMLTranslator.visit_literal_block(self, node) - + sphinx_htmlwriter.SmartyPantsHTMLTranslator.visit_literal_block(self, node) + def depart_literal_block(self, node): - sphinx.htmlwriter.SmartyPantsHTMLTranslator.depart_literal_block(self, node) + sphinx_htmlwriter.SmartyPantsHTMLTranslator.depart_literal_block(self, node) self.no_smarty -= 1 # @@ -162,7 +168,7 @@ class DjangoHTMLTranslator(sphinx.htmlwriter.SmartyPantsHTMLTranslator): # Give each section a unique ID -- nice for custom CSS hooks # This is different on docutils 0.5 vs. 0.4... - if hasattr(sphinx.htmlwriter.SmartyPantsHTMLTranslator, 'start_tag_with_title') and sphinx.__version__ == '0.4.2': + if hasattr(sphinx_htmlwriter.SmartyPantsHTMLTranslator, 'start_tag_with_title') and sphinx.__version__ == '0.4.2': def start_tag_with_title(self, node, tagname, **atts): node = { 'classes': node.get('classes', []), @@ -176,7 +182,7 @@ class DjangoHTMLTranslator(sphinx.htmlwriter.SmartyPantsHTMLTranslator): node['ids'] = ['s-' + i for i in old_ids] if sphinx.__version__ != '0.4.2': node['ids'].extend(old_ids) - sphinx.htmlwriter.SmartyPantsHTMLTranslator.visit_section(self, node) + sphinx_htmlwriter.SmartyPantsHTMLTranslator.visit_section(self, node) node['ids'] = old_ids def parse_django_admin_node(env, sig, signode): @@ -186,6 +192,25 @@ def parse_django_admin_node(env, sig, signode): signode += sphinx.addnodes.desc_name(title, title) return sig +def parse_django_adminopt_node(env, sig, signode): + """A copy of sphinx.directives.CmdoptionDesc.parse_signature()""" + from sphinx import addnodes + from sphinx.directives.desc import option_desc_re + count = 0 + firstname = '' + for m in option_desc_re.finditer(sig): + optname, args = m.groups() + if count: + signode += addnodes.desc_addname(', ', ', ') + signode += addnodes.desc_name(optname, optname) + signode += addnodes.desc_addname(args, args) + if not count: + firstname = optname + count += 1 + if not firstname: + raise ValueError + return firstname + def monkeypatch_pickle_builder(): import shutil from os import path @@ -214,12 +239,12 @@ def monkeypatch_pickle_builder(): # copy the environment file from the doctree dir to the output dir # as needed by the web app - shutil.copyfile(path.join(self.doctreedir, sphinx.builder.ENV_PICKLE_FILENAME), - path.join(self.outdir, sphinx.builder.ENV_PICKLE_FILENAME)) + shutil.copyfile(path.join(self.doctreedir, builders.ENV_PICKLE_FILENAME), + path.join(self.outdir, builders.ENV_PICKLE_FILENAME)) # touch 'last build' file, used by the web application to determine # when to reload its environment and clear the cache - open(path.join(self.outdir, sphinx.builder.LAST_BUILD_FILENAME), 'w').close() + open(path.join(self.outdir, builders.LAST_BUILD_FILENAME), 'w').close() + + builders.PickleHTMLBuilder.handle_finish = handle_finish - sphinx.builder.PickleHTMLBuilder.handle_finish = handle_finish - diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html index eb42298ab3..5bf1da6a37 100644 --- a/docs/_templates/layout.html +++ b/docs/_templates/layout.html @@ -1,6 +1,6 @@ {% extends "!layout.html" %} -{%- macro secondnav %} +{%- macro secondnav() %} {%- if prev %} « previous {{ reldelim2 }} diff --git a/docs/faq/admin.txt b/docs/faq/admin.txt index c23bdd1fe9..4c7b570f00 100644 --- a/docs/faq/admin.txt +++ b/docs/faq/admin.txt @@ -37,20 +37,19 @@ Set the :setting:`CACHE_MIDDLEWARE_ANONYMOUS_ONLY` setting to ``True``. See the How do I automatically set a field's value to the user who last edited the object in the admin? ----------------------------------------------------------------------------------------------- -At this point, Django doesn't have an official way to do this. But it's an oft-requested -feature, so we're discussing how it can be implemented. The problem is we don't want to couple -the model layer with the admin layer with the request layer (to get the current user). It's a -tricky problem. - -One person hacked up a `solution that doesn't require patching Django`_, but note that it's an -unofficial solution, and there's no guarantee it won't break at some point. - -.. _solution that doesn't require patching Django: http://lukeplant.me.uk/blog.php?id=1107301634 +The :class:`ModelAdmin` class provides customization hooks that allow you to transform +an object as it saved, using details from the request. By extracting the current user +from the request, and customizing the :meth:`ModelAdmin.save_model` hook, you can update +an object to reflect the user that edited it. See :ref:`the documentation on ModelAdmin +methods ` for an example. How do I limit admin access so that objects can only be edited by the users who created them? --------------------------------------------------------------------------------------------- -See the answer to the previous question. +The :class:`ModelAdmin` class also provides customization hooks that allow you to control the +visibility and editability of objects in the admin. Using the same trick of extracting the +user from the request, the :meth:`ModelAdmin.queryset` and :meth:`ModelAdmin.has_change_permission` +can be used to control the visibility and editability of objects in the admin. My admin-site CSS and images showed up fine using the development server, but they're not displaying when using mod_python. --------------------------------------------------------------------------------------------------------------------------- diff --git a/docs/howto/deployment/modpython.txt b/docs/howto/deployment/modpython.txt index 9ba1c2f9fb..8b9a4d3696 100644 --- a/docs/howto/deployment/modpython.txt +++ b/docs/howto/deployment/modpython.txt @@ -6,8 +6,8 @@ How to use Django with Apache and mod_python .. highlight:: apache -The `mod_python`_ module for Apache_ can be used to deploy Django to a -production server, although it has been mostly superseded by the simpler +The `mod_python`_ module for Apache_ can be used to deploy Django to a +production server, although it has been mostly superseded by the simpler :ref:`mod_wsgi deployment option `. mod_python is similar to (and inspired by) `mod_perl`_ : It embeds Python within @@ -378,3 +378,24 @@ as necessary. .. _Expat Causing Apache Crash: http://www.dscpl.com.au/articles/modpython-006.html .. _mod_python FAQ entry: http://modpython.org/FAQ/faqw.py?req=show&file=faq02.013.htp .. _Getting mod_python Working: http://www.dscpl.com.au/articles/modpython-001.html + +If you get a UnicodeEncodeError +=============================== + +If you're taking advantage of the internationalization features of Django (see +:ref:`topics-i18n`) and you intend to allow users to upload files, you must +ensure that the environment used to start Apache is configured to accept +non-ASCII file names. If your environment is not correctly configured, you +will trigger ``UnicodeEncodeError`` exceptions when calling functions like +``os.path()`` on filenames that contain non-ASCII characters. + +To avoid these problems, the environment used to start Apache should contain +settings analogous to the following:: + + export LANG='en_US.UTF-8' + export LC_ALL='en_US.UTF-8' + +Consult the documentation for your operating system for the appropriate syntax +and location to put these configuration items; ``/etc/apache2/envvars`` is a +common location on Unix platforms. Once you have added these statements +to your environment, restart Apache. diff --git a/docs/ref/contrib/admin/index.txt b/docs/ref/contrib/admin/index.txt index 64d9c52492..4b1dc55b21 100644 --- a/docs/ref/contrib/admin/index.txt +++ b/docs/ref/contrib/admin/index.txt @@ -704,6 +704,8 @@ objects. Templates can override or extend base admin templates as described in If you don't specify this attribute, a default template shipped with Django that provides the standard appearance is used. +.. _model-admin-methods: + ``ModelAdmin`` methods ---------------------- @@ -792,7 +794,7 @@ return a subset of objects for this foreign key field based on the user:: class MyModelAdmin(admin.ModelAdmin): def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == "car": - kwargs["queryset"] = Car.object.filter(owner=request.user) + kwargs["queryset"] = Car.objects.filter(owner=request.user) return db_field.formfield(**kwargs) return super(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) diff --git a/docs/ref/databases.txt b/docs/ref/databases.txt index 4943bcc2a5..7cdbe66df8 100644 --- a/docs/ref/databases.txt +++ b/docs/ref/databases.txt @@ -220,7 +220,7 @@ bytestrings (which shouldn't be too difficult) is the recommended solution. Should you decide to use ``utf8_bin`` collation for some of your tables with MySQLdb 1.2.1p2, you should still use ``utf8_collation_ci_swedish`` (the default) collation for the :class:`django.contrib.sessions.models.Session` -table (usually called ``django_session`` and the table +table (usually called ``django_session``) and the :class:`django.contrib.admin.models.LogEntry` table (usually called ``django_admin_log``). Those are the two standard tables that use :class:`~django.db.model.TextField` internally. diff --git a/docs/ref/templates/builtins.txt b/docs/ref/templates/builtins.txt index 32b5984767..aedad6562f 100644 --- a/docs/ref/templates/builtins.txt +++ b/docs/ref/templates/builtins.txt @@ -101,6 +101,14 @@ You can use any number of values in a ``{% cycle %}`` tag, separated by spaces. Values enclosed in single (``'``) or double quotes (``"``) are treated as string literals, while values without quotes are treated as template variables. +Note that the variables included in the cycle will not be escaped. This is +because template tags do not escape their content. If you want to escape the +variables in the cycle, you must do so explicitly:: + + {% filter force_escape %} + {% cycle var1 var2 var3 %} + {% endfilter %} + For backwards compatibility, the ``{% cycle %}`` tag supports the much inferior old syntax from previous Django versions. You shouldn't use this in any new projects, but for the sake of the people who are still using it, here's what it @@ -160,8 +168,9 @@ Sample usage:: firstof ~~~~~~~ -Outputs the first variable passed that is not False. Outputs nothing if all the -passed variables are False. +Outputs the first variable passed that is not False, without escaping. + +Outputs nothing if all the passed variables are False. Sample usage:: @@ -170,11 +179,11 @@ Sample usage:: This is equivalent to:: {% if var1 %} - {{ var1 }} + {{ var1|safe }} {% else %}{% if var2 %} - {{ var2 }} + {{ var2|safe }} {% else %}{% if var3 %} - {{ var3 }} + {{ var3|safe }} {% endif %}{% endif %}{% endif %} You can also use a literal string as a fallback value in case all @@ -182,6 +191,14 @@ passed variables are False:: {% firstof var1 var2 var3 "fallback value" %} +Note that the variables included in the firstof tag will not be escaped. This +is because template tags do not escape their content. If you want to escape +the variables in the firstof tag, you must do so explicitly:: + + {% filter force_escape %} + {% firstof var1 var2 var3 "fallback value" %} + {% endfilter %} + .. templatetag:: for for diff --git a/docs/topics/i18n.txt b/docs/topics/i18n.txt index 86c03221aa..7bf51c11c5 100644 --- a/docs/topics/i18n.txt +++ b/docs/topics/i18n.txt @@ -223,7 +223,19 @@ Pluralization ~~~~~~~~~~~~~ Use the function ``django.utils.translation.ungettext()`` to specify pluralized -messages. Example:: +messages. + +``ungettext`` takes three arguments: the singular translation string, the plural +translation string and the number of objects. + +This function is useful when your need you Django application to be localizable +to languages where the number and complexity of `plural forms +`_ is +greater than the two forms used in English ('object' for the singular and +'objects' for all the cases where ``count`` is different from zero, irrespective +of its value.) + +For example:: from django.utils.translation import ungettext def hello_world(request, count): @@ -232,9 +244,61 @@ messages. Example:: } return HttpResponse(page) -``ungettext`` takes three arguments: the singular translation string, the plural -translation string and the number of objects (which is passed to the -translation languages as the ``count`` variable). +In this example the number of objects is passed to the translation languages as +the ``count`` variable. + +Lets see a slightly more complex usage example:: + + from django.utils.translation import ungettext + + count = Report.objects.count() + if count == 1: + name = Report._meta.verbose_name + else: + name = Report._meta.verbose_name_plural + + text = ungettext( + 'There is %(count)d %(name)s available.', + 'There are %(count)d %(name)s available.', + count + ) % { + 'count': count, + 'name': name + } + +Here we reuse localizable, hopefully already translated literals (contained in +the ``verbose_name`` and ``verbose_name_plural`` model ``Meta`` options) for +other parts of the sentence so all of it is consistently based on the +cardinality of the elements at play. + +.. _pluralization-var-notes: + +.. note:: + + When using this technique, make sure you use a single name for every + extrapolated variable included in the literal. In the example above note how + we used the ``name`` Python variable in both translation strings. This + example would fail:: + + from django.utils.translation import ungettext + from myapp.models import Report + + count = Report.objects.count() + d = { + 'count': count, + 'name': Report._meta.verbose_name + 'plural_name': Report._meta.verbose_name_plural + } + text = ungettext( + 'There is %(count)d %(name)s available.', + 'There are %(count)d %(plural_name)s available.', + count + ) % d + + You would get a ``a format specification for argument 'name', as in + 'msgstr[0]', doesn't exist in 'msgid'`` error when running + ``django-admin.py compilemessages`` or a ``KeyError`` Python exception at + runtime. In template code ---------------- @@ -257,6 +321,8 @@ content that will require translation in the future:: {% trans "myvar" noop %} +Internally, inline translations use an ``ugettext`` call. + It's not possible to mix a template variable inside a string within ``{% trans %}``. If your translations require strings with variables (placeholders), use ``{% blocktrans %}``:: @@ -288,8 +354,11 @@ To pluralize, specify both the singular and plural forms with the There are {{ counter }} {{ name }} objects. {% endblocktrans %} -Internally, all block and inline translations use the appropriate -``ugettext`` / ``ungettext`` call. +When you use the pluralization feature and bind additional values to local +variables apart from the counter value that selects the translated literal to be +used, have in mind that the ``blocktrans`` construct is internally converted +to an ``ungettext`` call. This means the same :ref:`notes regarding ungettext +variables ` apply. Each ``RequestContext`` has access to three translation-specific variables: diff --git a/docs/topics/testing.txt b/docs/topics/testing.txt index 6ef086b1ba..aebe085881 100644 --- a/docs/topics/testing.txt +++ b/docs/topics/testing.txt @@ -479,7 +479,7 @@ arguments at time of construction: Once you have a ``Client`` instance, you can call any of the following methods: - .. method:: Client.get(path, data={}, follow=False) + .. method:: Client.get(path, data={}, follow=False, **extra) Makes a GET request on the provided ``path`` and returns a ``Response`` @@ -495,6 +495,17 @@ arguments at time of construction: /customers/details/?name=fred&age=7 + The ``extra`` keyword arguments parameter can be used to specify + headers to be sent in the request. For example:: + + >>> c = Client() + >>> c.get('/customers/details/', {'name': 'fred', 'age': 7}, + ... HTTP_X_REQUESTED_WITH='XMLHttpRequest') + + ...will send the HTTP header ``HTTP_X_REQUESTED_WITH`` to the + details view, which is a good way to test code paths that use the + :meth:`django.http.HttpRequest.is_ajax()` method. + .. versionadded:: 1.1 If you already have the GET arguments in URL-encoded form, you can @@ -518,7 +529,7 @@ arguments at time of construction: >>> response.redirect_chain [(u'http://testserver/next/', 302), (u'http://testserver/final/', 302)] - .. method:: Client.post(path, data={}, content_type=MULTIPART_CONTENT, follow=False) + .. method:: Client.post(path, data={}, content_type=MULTIPART_CONTENT, follow=False, **extra) Makes a POST request on the provided ``path`` and returns a ``Response`` object, which is documented below. @@ -569,6 +580,8 @@ arguments at time of construction: Note that you should manually close the file after it has been provided to ``post()``. + The ``extra`` argument acts the same as for :meth:`Client.get`. + .. versionchanged:: 1.1 If the URL you request with a POST contains encoded parameters, these @@ -585,7 +598,7 @@ arguments at time of construction: and a ``redirect_chain`` attribute will be set in the response object containing tuples of the intermediate urls and status codes. - .. method:: Client.head(path, data={}, follow=False) + .. method:: Client.head(path, data={}, follow=False, **extra) .. versionadded:: 1.1 @@ -597,7 +610,7 @@ arguments at time of construction: and a ``redirect_chain`` attribute will be set in the response object containing tuples of the intermediate urls and status codes. - .. method:: Client.options(path, data={}, follow=False) + .. method:: Client.options(path, data={}, follow=False, **extra) .. versionadded:: 1.1 @@ -608,7 +621,9 @@ arguments at time of construction: and a ``redirect_chain`` attribute will be set in the response object containing tuples of the intermediate urls and status codes. - .. method:: Client.put(path, data={}, content_type=MULTIPART_CONTENT, follow=False) + The ``extra`` argument acts the same as for :meth:`Client.get`. + + .. method:: Client.put(path, data={}, content_type=MULTIPART_CONTENT, follow=False, **extra) .. versionadded:: 1.1 @@ -620,7 +635,7 @@ arguments at time of construction: and a ``redirect_chain`` attribute will be set in the response object containing tuples of the intermediate urls and status codes. - .. method:: Client.delete(path, follow=False) + .. method:: Client.delete(path, follow=False, **extra) .. versionadded:: 1.1 @@ -631,6 +646,8 @@ arguments at time of construction: and a ``redirect_chain`` attribute will be set in the response object containing tuples of the intermediate urls and status codes. + The ``extra`` argument acts the same as for :meth:`Client.get`. + .. method:: Client.login(**credentials) .. versionadded:: 1.0 diff --git a/tests/regressiontests/admin_views/models.py b/tests/regressiontests/admin_views/models.py index 231d4781ce..50bc05eef0 100644 --- a/tests/regressiontests/admin_views/models.py +++ b/tests/regressiontests/admin_views/models.py @@ -326,7 +326,6 @@ class GalleryAdmin(admin.ModelAdmin): class PictureAdmin(admin.ModelAdmin): pass - class Language(models.Model): iso = models.CharField(max_length=5, primary_key=True) name = models.CharField(max_length=50) @@ -401,8 +400,25 @@ class WhatsitInline(admin.StackedInline): class FancyDoodadInline(admin.StackedInline): model = FancyDoodad +class Category(models.Model): + collector = models.ForeignKey(Collector) + order = models.PositiveIntegerField() + + class Meta: + ordering = ('order',) + + def __unicode__(self): + return u'%s:o%s' % (self.id, self.order) + +class CategoryAdmin(admin.ModelAdmin): + list_display = ('id', 'collector', 'order') + list_editable = ('order',) + +class CategoryInline(admin.StackedInline): + model = Category + class CollectorAdmin(admin.ModelAdmin): - inlines = [WidgetInline, DooHickeyInline, GrommetInline, WhatsitInline, FancyDoodadInline] + inlines = [WidgetInline, DooHickeyInline, GrommetInline, WhatsitInline, FancyDoodadInline, CategoryInline] admin.site.register(Article, ArticleAdmin) admin.site.register(CustomArticle, CustomArticleAdmin) @@ -426,6 +442,7 @@ admin.site.register(Language, LanguageAdmin) admin.site.register(Recommendation, RecommendationAdmin) admin.site.register(Recommender) admin.site.register(Collector, CollectorAdmin) +admin.site.register(Category, CategoryAdmin) # We intentionally register Promo and ChapterXtra1 but not Chapter nor ChapterXtra2. # That way we cover all four cases: diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py index 8e7010be9f..99168fdeee 100644 --- a/tests/regressiontests/admin_views/tests.py +++ b/tests/regressiontests/admin_views/tests.py @@ -16,7 +16,8 @@ from django.utils.html import escape from models import Article, BarAccount, CustomArticle, EmptyModel, \ ExternalSubscriber, FooAccount, Gallery, ModelWithStringPrimaryKey, \ Person, Persona, Picture, Podcast, Section, Subscriber, Vodcast, \ - Language, Collector, Widget, Grommet, DooHickey, FancyDoodad, Whatsit + Language, Collector, Widget, Grommet, DooHickey, FancyDoodad, Whatsit, \ + Category try: set @@ -921,6 +922,45 @@ class AdminViewListEditable(TestCase): self.failUnlessEqual(Person.objects.get(name="John Mauchly").alive, False) + def test_list_editable_ordering(self): + collector = Collector.objects.create(id=1, name="Frederick Clegg") + + Category.objects.create(id=1, order=1, collector=collector) + Category.objects.create(id=2, order=2, collector=collector) + Category.objects.create(id=3, order=0, collector=collector) + Category.objects.create(id=4, order=0, collector=collector) + + # NB: The order values must be changed so that the items are reordered. + data = { + "form-TOTAL_FORMS": "4", + "form-INITIAL_FORMS": "4", + + "form-0-order": "14", + "form-0-id": "1", + "form-0-collector": "1", + + "form-1-order": "13", + "form-1-id": "2", + "form-1-collector": "1", + + "form-2-order": "1", + "form-2-id": "3", + "form-2-collector": "1", + + "form-3-order": "0", + "form-3-id": "4", + "form-3-collector": "1", + } + response = self.client.post('/test_admin/admin/admin_views/category/', data) + # Successful post will redirect + self.failUnlessEqual(response.status_code, 302) + + # Check that the order values have been applied to the right objects + self.failUnlessEqual(Category.objects.get(id=1).order, 14) + self.failUnlessEqual(Category.objects.get(id=2).order, 13) + self.failUnlessEqual(Category.objects.get(id=3).order, 1) + self.failUnlessEqual(Category.objects.get(id=4).order, 0) + class AdminSearchTest(TestCase): fixtures = ['admin-views-users','multiple-child-classes'] @@ -1254,11 +1294,24 @@ class AdminInlineTests(TestCase): "fancydoodad_set-2-owner": "1", "fancydoodad_set-2-name": "", "fancydoodad_set-2-expensive": "on", + + "category_set-TOTAL_FORMS": "3", + "category_set-INITIAL_FORMS": "0", + "category_set-0-order": "", + "category_set-0-id": "", + "category_set-0-collector": "1", + "category_set-1-order": "", + "category_set-1-id": "", + "category_set-1-collector": "1", + "category_set-2-order": "", + "category_set-2-id": "", + "category_set-2-collector": "1", } result = self.client.login(username='super', password='secret') self.failUnlessEqual(result, True) - Collector(pk=1,name='John Fowles').save() + self.collector = Collector(pk=1,name='John Fowles') + self.collector.save() def tearDown(self): self.client.logout() @@ -1419,3 +1472,58 @@ class AdminInlineTests(TestCase): self.failUnlessEqual(response.status_code, 302) self.failUnlessEqual(FancyDoodad.objects.count(), 1) self.failUnlessEqual(FancyDoodad.objects.all()[0].name, "Fancy Doodad 1 Updated") + + def test_ordered_inline(self): + """Check that an inline with an editable ordering fields is + updated correctly. Regression for #10922""" + # Create some objects with an initial ordering + Category.objects.create(id=1, order=1, collector=self.collector) + Category.objects.create(id=2, order=2, collector=self.collector) + Category.objects.create(id=3, order=0, collector=self.collector) + Category.objects.create(id=4, order=0, collector=self.collector) + + # NB: The order values must be changed so that the items are reordered. + self.post_data.update({ + "name": "Frederick Clegg", + + "category_set-TOTAL_FORMS": "7", + "category_set-INITIAL_FORMS": "4", + + "category_set-0-order": "14", + "category_set-0-id": "1", + "category_set-0-collector": "1", + + "category_set-1-order": "13", + "category_set-1-id": "2", + "category_set-1-collector": "1", + + "category_set-2-order": "1", + "category_set-2-id": "3", + "category_set-2-collector": "1", + + "category_set-3-order": "0", + "category_set-3-id": "4", + "category_set-3-collector": "1", + + "category_set-4-order": "", + "category_set-4-id": "", + "category_set-4-collector": "1", + + "category_set-5-order": "", + "category_set-5-id": "", + "category_set-5-collector": "1", + + "category_set-6-order": "", + "category_set-6-id": "", + "category_set-6-collector": "1", + }) + response = self.client.post('/test_admin/admin/admin_views/collector/1/', self.post_data) + # Successful post will redirect + self.failUnlessEqual(response.status_code, 302) + + # Check that the order values have been applied to the right objects + self.failUnlessEqual(self.collector.category_set.count(), 4) + self.failUnlessEqual(Category.objects.get(id=1).order, 14) + self.failUnlessEqual(Category.objects.get(id=2).order, 13) + self.failUnlessEqual(Category.objects.get(id=3).order, 1) + self.failUnlessEqual(Category.objects.get(id=4).order, 0)