diff options
50 files changed, 1899 insertions, 527 deletions
@@ -123,6 +123,7 @@ answer newbie questions, and generally made Django that much better: Ian Holsman <http://feh.holsman.net/> Kieran Holland <http://www.kieranholland.com> Sung-Jin Hong <serialx.net@gmail.com> + Richard House <Richard.House@i-logue.com> Robert Rock Howard <http://djangomojo.com/> Jason Huggins <http://www.jrandolph.com/blog/> Hyun Mi Ae @@ -231,6 +232,7 @@ answer newbie questions, and generally made Django that much better: Frank Tegtmeyer <fte@fte.to> thebjorn <bp@datakortet.no> Zach Thompson <zthompson47@gmail.com> + tibimicu@gmax.net Tom Tobin Joe Topjian <http://joe.terrarum.net/geek/code/python/django/> torne-django@wolfpuppy.org.uk diff --git a/django/conf/locale/bn/LC_MESSAGES/djangojs.mo b/django/conf/locale/bn/LC_MESSAGES/djangojs.mo Binary files differnew file mode 100644 index 0000000000..1db40df910 --- /dev/null +++ b/django/conf/locale/bn/LC_MESSAGES/djangojs.mo diff --git a/django/conf/locale/bn/LC_MESSAGES/djangojs.po b/django/conf/locale/bn/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000000..4084313848 --- /dev/null +++ b/django/conf/locale/bn/LC_MESSAGES/djangojs.po @@ -0,0 +1,118 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-06-28 17:36+1000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: contrib/admin/media/js/SelectFilter2.js:33 +#, perl-format +msgid "Available %s" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:41 +msgid "Choose all" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:46 +msgid "Add" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:48 +msgid "Remove" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:53 +#, perl-format +msgid "Chosen %s" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:54 +msgid "Select your choice(s) and click " +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:59 +msgid "Clear all" +msgstr "" + +#: contrib/admin/media/js/dateparse.js:32 +#: contrib/admin/media/js/calendar.js:24 +msgid "" +"January February March April May June July August September October November " +"December" +msgstr "" + +#: contrib/admin/media/js/dateparse.js:33 +msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday" +msgstr "" + +#: contrib/admin/media/js/calendar.js:25 +msgid "S M T W T F S" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81 +msgid "Now" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51 +msgid "Clock" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78 +msgid "Choose a time" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82 +msgid "Midnight" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83 +msgid "6 a.m." +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84 +msgid "Noon" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183 +msgid "Cancel" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177 +msgid "Today" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132 +msgid "Calendar" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175 +msgid "Yesterday" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179 +msgid "Tomorrow" +msgstr "" + +#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34 +#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72 +msgid "Show" +msgstr "" + +#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63 +msgid "Hide" +msgstr "" diff --git a/django/conf/locale/ca/LC_MESSAGES/django.mo b/django/conf/locale/ca/LC_MESSAGES/django.mo Binary files differindex 665d7d41a9..f308c7589a 100644 --- a/django/conf/locale/ca/LC_MESSAGES/django.mo +++ b/django/conf/locale/ca/LC_MESSAGES/django.mo diff --git a/django/conf/locale/ca/LC_MESSAGES/django.po b/django/conf/locale/ca/LC_MESSAGES/django.po index 30a8797a91..b8450ad1b9 100644 --- a/django/conf/locale/ca/LC_MESSAGES/django.po +++ b/django/conf/locale/ca/LC_MESSAGES/django.po @@ -1,20 +1,18 @@ # translation of django.po to -# This file is distributed under the same license as the PACKAGE package. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. +# This file is distributed under the same license as the Django package. # msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2007-05-25 13:04+0200\n" -"PO-Revision-Date: 2007-05-25 13:04+0200\n" -"Last-Translator: Marc Fargas <marc@fargas.com>\n" +"POT-Creation-Date: 2007-06-25 17:31+0200\n" +"PO-Revision-Date: 2007-06-25 17:47+0200\n" +"Last-Translator: Marc Fargas <telenieko@telenieko.com>\n" "Language-Team: <es@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: VIM 7.0\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: nplurals=2; plural=(n != 1);" #: template/defaultfilters.py:491 msgid "yes,no,maybe" @@ -42,38 +40,38 @@ msgstr "%.1f MB" msgid "%.1f GB" msgstr "%.1f GB" -#: newforms/models.py:173 newforms/fields.py:432 +#: newforms/models.py:172 newforms/fields.py:432 msgid "Select a valid choice. That choice is not one of the available choices." msgstr "" "Esculli una opció vàlida; Aquesta opció no és una de les opcions disponibles." -#: newforms/models.py:186 newforms/fields.py:87 newforms/fields.py:444 -#: newforms/fields.py:520 newforms/fields.py:531 oldforms/__init__.py:357 -#: db/models/fields/__init__.py:121 db/models/fields/__init__.py:278 -#: db/models/fields/__init__.py:675 db/models/fields/__init__.py:686 +#: newforms/models.py:185 newforms/fields.py:87 newforms/fields.py:444 +#: newforms/fields.py:522 newforms/fields.py:533 oldforms/__init__.py:357 +#: db/models/fields/__init__.py:126 db/models/fields/__init__.py:283 +#: db/models/fields/__init__.py:680 db/models/fields/__init__.py:691 msgid "This field is required." msgstr "Aquest camp és obligatori." -#: newforms/models.py:190 newforms/fields.py:448 newforms/fields.py:524 +#: newforms/models.py:189 newforms/fields.py:448 newforms/fields.py:526 msgid "Enter a list of values." msgstr "Introdueixi una llista de valors." -#: newforms/models.py:196 newforms/fields.py:457 +#: newforms/models.py:195 newforms/fields.py:457 #, python-format msgid "Select a valid choice. %s is not one of the available choices." msgstr "Esculli una opció vàlida; %s' no és una de les opcions vàlides." -#: newforms/widgets.py:182 contrib/admin/filterspecs.py:150 +#: newforms/widgets.py:181 contrib/admin/filterspecs.py:150 #: oldforms/__init__.py:577 msgid "Unknown" msgstr "Desconegut" -#: newforms/widgets.py:182 contrib/admin/filterspecs.py:143 +#: newforms/widgets.py:181 contrib/admin/filterspecs.py:143 #: oldforms/__init__.py:577 msgid "Yes" msgstr "Si" -#: newforms/widgets.py:182 contrib/admin/filterspecs.py:143 +#: newforms/widgets.py:181 contrib/admin/filterspecs.py:143 #: oldforms/__init__.py:577 msgid "No" msgstr "No" @@ -121,11 +119,11 @@ msgstr "Asseguris 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 "Asseguris de que no hia ha més de %s dígits decimals." -#: newforms/fields.py:233 +#: newforms/fields.py:233 newforms/fields.py:566 msgid "Enter a valid date." msgstr "Introdueixi una data vàlida." -#: newforms/fields.py:260 +#: newforms/fields.py:260 newforms/fields.py:568 msgid "Enter a valid time." msgstr "Introdueixi una hora vàlida." @@ -198,118 +196,122 @@ msgid "Argentinean Spanish" msgstr "Castellà Argentí" #: conf/global_settings.py:51 +msgid "Persian" +msgstr "Persa" + +#: conf/global_settings.py:52 msgid "Finnish" msgstr "Finlandès" -#: conf/global_settings.py:52 +#: conf/global_settings.py:53 msgid "French" msgstr "Francès" -#: conf/global_settings.py:53 +#: conf/global_settings.py:54 msgid "Galician" msgstr "Galleg" -#: conf/global_settings.py:54 +#: conf/global_settings.py:55 msgid "Hungarian" msgstr "Húngar" -#: conf/global_settings.py:55 +#: conf/global_settings.py:56 msgid "Hebrew" msgstr "Hebreu" -#: conf/global_settings.py:56 +#: conf/global_settings.py:57 msgid "Icelandic" msgstr "Islandès" -#: conf/global_settings.py:57 +#: conf/global_settings.py:58 msgid "Italian" msgstr "Italià" -#: conf/global_settings.py:58 +#: conf/global_settings.py:59 msgid "Japanese" msgstr "Japonès" -#: conf/global_settings.py:59 +#: conf/global_settings.py:60 msgid "Korean" msgstr "Coreà" -#: conf/global_settings.py:60 +#: conf/global_settings.py:61 msgid "Kannada" msgstr "" -#: conf/global_settings.py:61 +#: conf/global_settings.py:62 msgid "Latvian" -msgstr "" +msgstr "Letó" -#: conf/global_settings.py:62 +#: conf/global_settings.py:63 msgid "Macedonian" msgstr "Macedoni" -#: conf/global_settings.py:63 +#: conf/global_settings.py:64 msgid "Dutch" msgstr "Holandès" -#: conf/global_settings.py:64 +#: conf/global_settings.py:65 msgid "Norwegian" msgstr "Norueg" -#: conf/global_settings.py:65 +#: conf/global_settings.py:66 msgid "Polish" msgstr "Polac" -#: conf/global_settings.py:66 +#: conf/global_settings.py:67 msgid "Portugese" msgstr "Portuguès" -#: conf/global_settings.py:67 +#: conf/global_settings.py:68 msgid "Brazilian" msgstr "Brasileny" -#: conf/global_settings.py:68 +#: conf/global_settings.py:69 msgid "Romanian" msgstr "Rumanès" -#: conf/global_settings.py:69 +#: conf/global_settings.py:70 msgid "Russian" msgstr "Rús" -#: conf/global_settings.py:70 +#: conf/global_settings.py:71 msgid "Slovak" msgstr "Eslovac" -#: conf/global_settings.py:71 +#: conf/global_settings.py:72 msgid "Slovenian" msgstr "Esloveni" -#: conf/global_settings.py:72 +#: conf/global_settings.py:73 msgid "Serbian" msgstr "Serbi" -#: conf/global_settings.py:73 +#: conf/global_settings.py:74 msgid "Swedish" msgstr "Suec" -#: conf/global_settings.py:74 +#: conf/global_settings.py:75 msgid "Tamil" -msgstr "" +msgstr "Tàmil" -#: conf/global_settings.py:75 +#: conf/global_settings.py:76 msgid "Telugu" -msgstr "" +msgstr "Telugu" -#: conf/global_settings.py:76 +#: conf/global_settings.py:77 msgid "Turkish" msgstr "Turc" -#: conf/global_settings.py:77 +#: conf/global_settings.py:78 msgid "Ukrainian" msgstr "Ucranià" -#: conf/global_settings.py:78 +#: conf/global_settings.py:79 msgid "Simplified Chinese" msgstr "Xinés simplificat" -#: conf/global_settings.py:79 +#: conf/global_settings.py:80 msgid "Traditional Chinese" msgstr "Xinés tradicional" @@ -576,17 +578,15 @@ msgid "" "comment:\n" "\n" "%(text)s" -msgid_plural "" "This comment was posted by a user who has posted fewer than %(count)s " "comments:\n" "\n" "%(text)s" -msgstr[0] "" +msgstr "" "Aquest comentari el va enviar un usuari que ha enviat menys de %(count)s " "comentari:\n" "\n" "%(text)s" -msgstr[1] "" "Aquest comentari el va enviar un usuari que ha enviat menys de %(count)s " "comentaris:\n" "\n" @@ -1218,13 +1218,13 @@ msgstr "Editar aquest objecte (nova finestra)" msgid "As above, but opens the admin page in a new window." msgstr "Com abans, però obre la pàgina d'administració en una nova finestra." -#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257 +#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:262 #, python-format msgid "The %(name)s \"%(obj)s\" was added successfully." msgstr "El/la %(name)s \"%(obj)s\".ha estat agregat/da amb èxit." -#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261 -#: contrib/admin/views/main.py:347 +#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:266 +#: contrib/admin/views/main.py:352 msgid "You may edit it again below." msgstr "Pot editar-lo de nou abaix." @@ -1241,96 +1241,96 @@ msgstr "Canvi de clau exitós" msgid "Change password: %s" msgstr "Canviar clau: %s" -#: contrib/admin/views/main.py:223 +#: contrib/admin/views/main.py:228 msgid "Site administration" msgstr "Lloc administratiu" -#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356 +#: contrib/admin/views/main.py:276 contrib/admin/views/main.py:361 #, python-format msgid "You may add another %s below." msgstr "Pot agregar un altre %s abaix." -#: contrib/admin/views/main.py:289 +#: contrib/admin/views/main.py:294 #, python-format msgid "Add %s" msgstr "Agregar %s" -#: contrib/admin/views/main.py:335 +#: contrib/admin/views/main.py:340 #, python-format msgid "Added %s." msgstr "Agregat %s." -#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337 -#: contrib/admin/views/main.py:339 db/models/manipulators.py:308 +#: contrib/admin/views/main.py:340 contrib/admin/views/main.py:342 +#: contrib/admin/views/main.py:344 db/models/manipulators.py:308 msgid "and" msgstr "i" -#: contrib/admin/views/main.py:337 +#: contrib/admin/views/main.py:342 #, python-format msgid "Changed %s." msgstr "Modificat %s." -#: contrib/admin/views/main.py:339 +#: contrib/admin/views/main.py:344 #, python-format msgid "Deleted %s." msgstr "Eliminat %s." -#: contrib/admin/views/main.py:342 +#: contrib/admin/views/main.py:347 msgid "No fields changed." msgstr "Cap camp canviat." -#: contrib/admin/views/main.py:345 +#: contrib/admin/views/main.py:350 #, python-format msgid "The %(name)s \"%(obj)s\" was changed successfully." msgstr "S'ha modificat amb èxist el/la %(name)s \"%(obj)s." -#: contrib/admin/views/main.py:353 +#: contrib/admin/views/main.py:358 #, python-format msgid "" "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." msgstr "" "S'ha agregat amb èxit el/la %(name)s \"%(obj)s\". Pot editar-lo de nou abaix." -#: contrib/admin/views/main.py:391 +#: contrib/admin/views/main.py:396 #, python-format msgid "Change %s" msgstr "Modificar %s" -#: contrib/admin/views/main.py:476 +#: contrib/admin/views/main.py:481 #, python-format msgid "One or more %(fieldname)s in %(name)s: %(obj)s" msgstr "Un o més %(fieldname)s en %(name)s: %(obj)s" -#: contrib/admin/views/main.py:481 +#: contrib/admin/views/main.py:486 #, python-format msgid "One or more %(fieldname)s in %(name)s:" msgstr "Un o més %(fieldname)s en %(name)s:" -#: contrib/admin/views/main.py:514 +#: contrib/admin/views/main.py:518 #, python-format msgid "The %(name)s \"%(obj)s\" was deleted successfully." msgstr "El/la %(name)s \"%(obj)s\".ha estat eliminat amb èxit." -#: contrib/admin/views/main.py:517 +#: contrib/admin/views/main.py:521 msgid "Are you sure?" msgstr "Està segur?" -#: contrib/admin/views/main.py:539 +#: contrib/admin/views/main.py:543 #, python-format msgid "Change history: %s" msgstr "Modificar històric: %s" -#: contrib/admin/views/main.py:573 +#: contrib/admin/views/main.py:577 #, python-format msgid "Select %s" msgstr "Seleccioni %s" -#: contrib/admin/views/main.py:573 +#: contrib/admin/views/main.py:577 #, python-format msgid "Select %s to change" msgstr "Seleccioni %s per modificar" -#: contrib/admin/views/main.py:768 +#: contrib/admin/views/main.py:772 msgid "Database error" msgstr "Error de/en la base de dades" @@ -1697,35 +1697,35 @@ msgstr "llocs" msgid "Logged out" msgstr "Sessió finalitzada" -#: contrib/auth/models.py:44 contrib/auth/models.py:64 +#: contrib/auth/models.py:49 contrib/auth/models.py:69 msgid "name" msgstr "nom" -#: contrib/auth/models.py:46 +#: contrib/auth/models.py:51 msgid "codename" msgstr "nom en clau" -#: contrib/auth/models.py:49 +#: contrib/auth/models.py:54 msgid "permission" msgstr "permís" -#: contrib/auth/models.py:50 contrib/auth/models.py:65 +#: contrib/auth/models.py:55 contrib/auth/models.py:70 msgid "permissions" msgstr "permissos" -#: contrib/auth/models.py:68 +#: contrib/auth/models.py:73 msgid "group" msgstr "grup" -#: contrib/auth/models.py:69 contrib/auth/models.py:109 +#: contrib/auth/models.py:74 contrib/auth/models.py:114 msgid "groups" msgstr "grups" -#: contrib/auth/models.py:99 +#: contrib/auth/models.py:104 msgid "username" msgstr "nom d'usuari" -#: contrib/auth/models.py:99 +#: contrib/auth/models.py:104 msgid "" "Required. 30 characters or fewer. Alphanumeric characters only (letters, " "digits and underscores)." @@ -1733,23 +1733,23 @@ msgstr "" "Requerit. 30 o menys caracters. Només caracters alfanumèrics (lletres, " "dígits i guions baixos)." -#: contrib/auth/models.py:100 +#: contrib/auth/models.py:105 msgid "first name" msgstr "nom propi" -#: contrib/auth/models.py:101 +#: contrib/auth/models.py:106 msgid "last name" msgstr "cognoms" -#: contrib/auth/models.py:102 +#: contrib/auth/models.py:107 msgid "e-mail address" msgstr "adreça de correu electrònic" -#: contrib/auth/models.py:103 +#: contrib/auth/models.py:108 msgid "password" msgstr "contrasenya" -#: contrib/auth/models.py:103 +#: contrib/auth/models.py:108 msgid "" "Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change " "password form</a>." @@ -1757,19 +1757,19 @@ msgstr "" "Utilitzi '[algo]$[salt]$[hexdigest]' o el <a href=\"password/\">formulari de " "canvi de contrasenya</a>." -#: contrib/auth/models.py:104 +#: contrib/auth/models.py:109 msgid "staff status" msgstr "és membre del personal" -#: contrib/auth/models.py:104 +#: contrib/auth/models.py:109 msgid "Designates whether the user can log into this admin site." msgstr "Indica si l'usuari pot entrar en el lloc administratiu." -#: contrib/auth/models.py:105 +#: contrib/auth/models.py:110 msgid "active" msgstr "actiu" -#: contrib/auth/models.py:105 +#: contrib/auth/models.py:110 msgid "" "Designates whether this user can log into the Django admin. Unselect this " "instead of deleting accounts." @@ -1777,11 +1777,11 @@ msgstr "" "Designa si aquest usuari pot iniciar sessió a la interfície administrativa " "Djano. Deselecciona-ho enlloc de esborrar comptes d'usuari." -#: contrib/auth/models.py:106 +#: contrib/auth/models.py:111 msgid "superuser status" msgstr "estat de superusuari" -#: contrib/auth/models.py:106 +#: contrib/auth/models.py:111 msgid "" "Designates that this user has all permissions without explicitly assigning " "them." @@ -1789,15 +1789,15 @@ msgstr "" "Designa que aquest usuari té tots els permisos sense assignar-los " "explícitament." -#: contrib/auth/models.py:107 +#: contrib/auth/models.py:112 msgid "last login" msgstr "últim inici de sessió" -#: contrib/auth/models.py:108 +#: contrib/auth/models.py:113 msgid "date joined" msgstr "data de creació" -#: contrib/auth/models.py:110 +#: contrib/auth/models.py:115 msgid "" "In addition to the permissions manually assigned, this user will also get " "all permissions granted to each group he/she is in." @@ -1805,39 +1805,39 @@ msgstr "" "Junt amb els permissos asignats manualment, aquest usuari tindrà, també, els " "permissos dels grups dels que sigui membre." -#: contrib/auth/models.py:111 +#: contrib/auth/models.py:116 msgid "user permissions" msgstr "permissos de l'usuari" -#: contrib/auth/models.py:115 +#: contrib/auth/models.py:120 msgid "user" msgstr "usuari" -#: contrib/auth/models.py:116 +#: contrib/auth/models.py:121 msgid "users" msgstr "usuaris" -#: contrib/auth/models.py:122 +#: contrib/auth/models.py:127 msgid "Personal info" msgstr "Informaciò personal" -#: contrib/auth/models.py:123 +#: contrib/auth/models.py:128 msgid "Permissions" msgstr "permissos" -#: contrib/auth/models.py:124 +#: contrib/auth/models.py:129 msgid "Important dates" msgstr "Dates importants" -#: contrib/auth/models.py:125 +#: contrib/auth/models.py:130 msgid "Groups" msgstr "Grups" -#: contrib/auth/models.py:269 +#: contrib/auth/models.py:273 msgid "message" msgstr "missatge" -#: contrib/auth/models.py:282 +#: contrib/auth/models.py:286 msgid "AnonymousUser" msgstr "AnonymousUser" @@ -1861,7 +1861,7 @@ msgstr "" msgid "This account is inactive." msgstr "Aquest compte està inactiu" -#: contrib/auth/forms.py:85 +#: contrib/auth/forms.py:84 msgid "" "That e-mail address doesn't have an associated user account. Are you sure " "you've registered?" @@ -2423,7 +2423,7 @@ msgstr "L'any ha de ser posterior al 1900" msgid "Invalid date: %s" msgstr "Data invàlida: %s" -#: core/validators.py:149 db/models/fields/__init__.py:463 +#: core/validators.py:149 db/models/fields/__init__.py:468 msgid "Enter a valid date in YYYY-MM-DD format." msgstr "Introdueixi una data vàlida en el forma AAAA-MM-DD." @@ -2431,7 +2431,7 @@ msgstr "Introdueixi una data vàlida en el forma AAAA-MM-DD." msgid "Enter a valid time in HH:MM format." msgstr "Introdueixi una hora vàlida en el format HH:MM." -#: core/validators.py:158 db/models/fields/__init__.py:532 +#: core/validators.py:158 db/models/fields/__init__.py:537 msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format." msgstr "Introdueixi un data/hora vàlida en format YYYY-MM-DD HH:MM." @@ -2558,35 +2558,29 @@ msgstr "Si us plau, introdueixi un número decimal vàlid." #: core/validators.py:423 #, python-format msgid "Please enter a valid decimal number with at most %s total digit." -msgid_plural "" "Please enter a valid decimal number with at most %s total digits." -msgstr[0] "" +msgstr "" "Si us plau, introdueixi un número decimal vàlid amb no més de %s digit." -msgstr[1] "" "Si us plau, introdueixi un número decimal vàlid amb no més de %s digits." #: core/validators.py:426 #, python-format msgid "" "Please enter a valid decimal number with a whole part of at most %s digit." -msgid_plural "" "Please enter a valid decimal number with a whole part of at most %s digits." -msgstr[0] "" +msgstr "" "Si us plau, introdueixi un número decimal vàlid amb la part entera amb com a " "màxim %s dígit." -msgstr[1] "" "Si us plau, introdueixi un número decimal vàlid amb la part entera amb com a " "màxim %s dígits." #: core/validators.py:429 #, python-format msgid "Please enter a valid decimal number with at most %s decimal place." -msgid_plural "" "Please enter a valid decimal number with at most %s decimal places." -msgstr[0] "" +msgstr "" "Si us plau, introdueixi un número decimal vàlid amb no més de %s dígit en la " "part decimal." -msgstr[1] "" "Si us plau, introdueixi un número decimal vàlid amb no més de %s dígits en " "la part decimal." @@ -2983,52 +2977,51 @@ msgstr "Ja existeix un %(object)s del tipus %(type)s amb aquest %(field)s." msgid "%(optname)s with this %(fieldname)s already exists." msgstr "Ja existeix %(optname)s amb auqest %(fieldname)s." -#: db/models/fields/__init__.py:373 +#: db/models/fields/__init__.py:378 msgid "This value must be an integer." msgstr "Aquest valor ha de ser un enter." -#: db/models/fields/__init__.py:408 +#: db/models/fields/__init__.py:413 msgid "This value must be either True or False." msgstr "Aquest valor ha de ser True (Veritat) o False (Fals)" -#: db/models/fields/__init__.py:429 +#: db/models/fields/__init__.py:434 msgid "This field cannot be null." msgstr "Aquest camp no pot ser null (estar buit)." -#: db/models/fields/__init__.py:592 +#: db/models/fields/__init__.py:597 msgid "This value must be a decimal number." msgstr "Aquest valor ha de ser un número decimal." -#: db/models/fields/__init__.py:695 +#: db/models/fields/__init__.py:700 msgid "Enter a valid filename." msgstr "Introdueixi un nom de fitxer vàlid." -#: db/models/fields/__init__.py:818 +#: db/models/fields/__init__.py:824 msgid "This value must be either None, True or False." msgstr "Aquest valor ha de ser None (Cap), True (Veritat) o False (Fals)" -#: db/models/fields/related.py:53 +#: db/models/fields/related.py:54 #, python-format msgid "Please enter a valid %s." msgstr "Si us plau, introdueixi un %s vàlid." -#: db/models/fields/related.py:642 +#: db/models/fields/related.py:640 msgid "Separate multiple IDs with commas." msgstr "Separi múltiples IDs amb comes." -#: db/models/fields/related.py:644 +#: db/models/fields/related.py:642 msgid "" "Hold down \"Control\", or \"Command\" on a Mac, to select more than one." msgstr "Premi \"Control\" o \"Command\" en un Mac per escollir més d'un." -#: db/models/fields/related.py:691 +#: db/models/fields/related.py:689 #, python-format msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." -msgid_plural "" "Please enter valid %(self)s IDs. The values %(value)r are invalid." -msgstr[0] "" +msgstr "" "Si us plau, introdueixi IDs de %(self)s vàlids. El valor %(value)r és " "invàlid." -msgstr[1] "" "Si us plau, introdueixi IDs de %(self)s vàlids. Els valors %(value)r són " "invàlids." + diff --git a/django/conf/locale/ca/LC_MESSAGES/djangojs.mo b/django/conf/locale/ca/LC_MESSAGES/djangojs.mo Binary files differindex a5b908df1f..581b176be4 100644 --- a/django/conf/locale/ca/LC_MESSAGES/djangojs.mo +++ b/django/conf/locale/ca/LC_MESSAGES/djangojs.mo diff --git a/django/conf/locale/ca/LC_MESSAGES/djangojs.po b/django/conf/locale/ca/LC_MESSAGES/djangojs.po index 8167253005..3ae0e9bad8 100644 --- a/django/conf/locale/ca/LC_MESSAGES/djangojs.po +++ b/django/conf/locale/ca/LC_MESSAGES/djangojs.po @@ -1,15 +1,14 @@ # translation of djangojs.po to -# Spanish translation for the django-admin JS files. -# Copyright (C) -# This file is distributed under the same license as the PACKAGE package. +# Catalan translation for the django-admin JS files. +# This file is distributed under the same license as the Django package. # msgid "" msgstr "" "Project-Id-Version: djangojs\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-05-20 18:25+0200\n" -"PO-Revision-Date: 2007-05-20 18:24+0200\n" -"Last-Translator: Marc Fargas <marc@fargas.com>\n" +"PO-Revision-Date: 2007-06-25 17:47+0200\n" +"Last-Translator: Marc Fargas <telenieko@telenieko.com>\n" "Language-Team: <es@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/django/conf/locale/da/LC_MESSAGES/djangojs.mo b/django/conf/locale/da/LC_MESSAGES/djangojs.mo Binary files differnew file mode 100644 index 0000000000..1db40df910 --- /dev/null +++ b/django/conf/locale/da/LC_MESSAGES/djangojs.mo diff --git a/django/conf/locale/da/LC_MESSAGES/djangojs.po b/django/conf/locale/da/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000000..4084313848 --- /dev/null +++ b/django/conf/locale/da/LC_MESSAGES/djangojs.po @@ -0,0 +1,118 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-06-28 17:36+1000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: contrib/admin/media/js/SelectFilter2.js:33 +#, perl-format +msgid "Available %s" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:41 +msgid "Choose all" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:46 +msgid "Add" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:48 +msgid "Remove" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:53 +#, perl-format +msgid "Chosen %s" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:54 +msgid "Select your choice(s) and click " +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:59 +msgid "Clear all" +msgstr "" + +#: contrib/admin/media/js/dateparse.js:32 +#: contrib/admin/media/js/calendar.js:24 +msgid "" +"January February March April May June July August September October November " +"December" +msgstr "" + +#: contrib/admin/media/js/dateparse.js:33 +msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday" +msgstr "" + +#: contrib/admin/media/js/calendar.js:25 +msgid "S M T W T F S" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81 +msgid "Now" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51 +msgid "Clock" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78 +msgid "Choose a time" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82 +msgid "Midnight" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83 +msgid "6 a.m." +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84 +msgid "Noon" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183 +msgid "Cancel" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177 +msgid "Today" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132 +msgid "Calendar" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175 +msgid "Yesterday" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179 +msgid "Tomorrow" +msgstr "" + +#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34 +#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72 +msgid "Show" +msgstr "" + +#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63 +msgid "Hide" +msgstr "" diff --git a/django/conf/locale/ja/LC_MESSAGES/django.mo b/django/conf/locale/ja/LC_MESSAGES/django.mo Binary files differindex 07d3994755..20eb7dbcd3 100644 --- a/django/conf/locale/ja/LC_MESSAGES/django.mo +++ b/django/conf/locale/ja/LC_MESSAGES/django.mo diff --git a/django/conf/locale/ja/LC_MESSAGES/django.po b/django/conf/locale/ja/LC_MESSAGES/django.po index ab761254ae..56f1bf99da 100644 --- a/django/conf/locale/ja/LC_MESSAGES/django.po +++ b/django/conf/locale/ja/LC_MESSAGES/django.po @@ -1,13 +1,12 @@ # Translation of django.po to japanese. # Copyright (C) 2005,2006,2007 makoto tsuyuki # This file is distributed under the same license as the PACKAGE package. -# makoto tsuyuki <mtsuyuki@gmail.com>, 2005,2006,2007. -# +# msgid "" msgstr "" "Project-Id-Version: Django 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2007-03-26 22:51+0900\n" +"POT-Creation-Date: 2007-06-26 11:33+0900\n" "PO-Revision-Date: 2006-05-18 00:28+0900\n" "Last-Translator: makoto tsuyuki <mtsuyuki@gmail.com>\n" "Language-Team: Japanese <django-ja@googlegroups.com>\n" @@ -24,150 +23,162 @@ msgid "Bengali" msgstr "ベンガル語" #: conf/global_settings.py:41 +msgid "Bulgarian" +msgstr "ブルガリア語" + +#: conf/global_settings.py:42 msgid "Catalan" msgstr "カタロニア語" -#: conf/global_settings.py:42 +#: conf/global_settings.py:43 msgid "Czech" msgstr "チェコ語" -#: conf/global_settings.py:43 +#: conf/global_settings.py:44 msgid "Welsh" msgstr "ウェールズ語" -#: conf/global_settings.py:44 +#: conf/global_settings.py:45 msgid "Danish" msgstr "デンマーク語" -#: conf/global_settings.py:45 +#: conf/global_settings.py:46 msgid "German" msgstr "ドイツ語" -#: conf/global_settings.py:46 +#: conf/global_settings.py:47 msgid "Greek" msgstr "ギリシャ語" -#: conf/global_settings.py:47 +#: conf/global_settings.py:48 msgid "English" msgstr "英語" -#: conf/global_settings.py:48 +#: conf/global_settings.py:49 msgid "Spanish" msgstr "スペイン語" -#: conf/global_settings.py:49 +#: conf/global_settings.py:50 msgid "Argentinean Spanish" msgstr "アルゼンチンスペイン語" -#: conf/global_settings.py:50 +#: conf/global_settings.py:51 +msgid "Persian" +msgstr "ペルシア語" + +#: conf/global_settings.py:52 msgid "Finnish" msgstr "フィンランド語" -#: conf/global_settings.py:51 +#: conf/global_settings.py:53 msgid "French" msgstr "フランス語" -#: conf/global_settings.py:52 +#: conf/global_settings.py:54 msgid "Galician" msgstr "ガリシア語" -#: conf/global_settings.py:53 +#: conf/global_settings.py:55 msgid "Hungarian" msgstr "ハンガリー語" -#: conf/global_settings.py:54 +#: conf/global_settings.py:56 msgid "Hebrew" msgstr "ヘブライ語" -#: conf/global_settings.py:55 +#: conf/global_settings.py:57 msgid "Icelandic" msgstr "アイスランド語" -#: conf/global_settings.py:56 +#: conf/global_settings.py:58 msgid "Italian" msgstr "イタリア語" -#: conf/global_settings.py:57 +#: conf/global_settings.py:59 msgid "Japanese" msgstr "日本語" -#: conf/global_settings.py:58 +#: conf/global_settings.py:60 +msgid "Korean" +msgstr "韓国語" + +#: conf/global_settings.py:61 msgid "Kannada" msgstr "カンナダ語" -#: conf/global_settings.py:59 +#: conf/global_settings.py:62 msgid "Latvian" msgstr "ラトビア語" -#: conf/global_settings.py:60 +#: conf/global_settings.py:63 msgid "Macedonian" msgstr "マケドニア語" -#: conf/global_settings.py:61 +#: conf/global_settings.py:64 msgid "Dutch" msgstr "オランダ語" -#: conf/global_settings.py:62 +#: conf/global_settings.py:65 msgid "Norwegian" msgstr "ノルウェー語" -#: conf/global_settings.py:63 +#: conf/global_settings.py:66 msgid "Polish" msgstr "ポーランド語" -#: conf/global_settings.py:64 +#: conf/global_settings.py:67 msgid "Portugese" msgstr "ポルトガル語" -#: conf/global_settings.py:65 +#: conf/global_settings.py:68 msgid "Brazilian" msgstr "ブラジル語" -#: conf/global_settings.py:66 +#: conf/global_settings.py:69 msgid "Romanian" msgstr "ルーマニア語" -#: conf/global_settings.py:67 +#: conf/global_settings.py:70 msgid "Russian" msgstr "ロシア語" -#: conf/global_settings.py:68 +#: conf/global_settings.py:71 msgid "Slovak" msgstr "スロバキア語" -#: conf/global_settings.py:69 +#: conf/global_settings.py:72 msgid "Slovenian" msgstr "スロヴェニア語" -#: conf/global_settings.py:70 +#: conf/global_settings.py:73 msgid "Serbian" msgstr "セルビア語" -#: conf/global_settings.py:71 +#: conf/global_settings.py:74 msgid "Swedish" msgstr "スウェーデン語" -#: conf/global_settings.py:72 +#: conf/global_settings.py:75 msgid "Tamil" msgstr "タミル語" -#: conf/global_settings.py:73 +#: conf/global_settings.py:76 msgid "Telugu" msgstr "テルグ語" -#: conf/global_settings.py:74 +#: conf/global_settings.py:77 msgid "Turkish" msgstr "トルコ語" -#: conf/global_settings.py:75 +#: conf/global_settings.py:78 msgid "Ukrainian" msgstr "ウクライナ語" -#: conf/global_settings.py:76 +#: conf/global_settings.py:79 msgid "Simplified Chinese" msgstr "簡体字中国語" -#: conf/global_settings.py:77 +#: conf/global_settings.py:80 msgid "Traditional Chinese" msgstr "繁体字中国語" @@ -205,17 +216,17 @@ msgstr "今月" msgid "This year" msgstr "今年" -#: contrib/admin/filterspecs.py:143 newforms/widgets.py:170 +#: contrib/admin/filterspecs.py:143 newforms/widgets.py:181 #: oldforms/__init__.py:577 msgid "Yes" msgstr "はい" -#: contrib/admin/filterspecs.py:143 newforms/widgets.py:170 +#: contrib/admin/filterspecs.py:143 newforms/widgets.py:181 #: oldforms/__init__.py:577 msgid "No" msgstr "いいえ" -#: contrib/admin/filterspecs.py:150 newforms/widgets.py:170 +#: contrib/admin/filterspecs.py:150 newforms/widgets.py:181 #: oldforms/__init__.py:577 msgid "Unknown" msgstr "不明" @@ -781,17 +792,17 @@ msgstr "現在:" msgid "Change:" msgstr "変更:" -#: contrib/admin/templatetags/admin_list.py:247 +#: contrib/admin/templatetags/admin_list.py:249 msgid "All dates" msgstr "いつでも" -#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257 +#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:262 #, python-format msgid "The %(name)s \"%(obj)s\" was added successfully." msgstr "%(name)s \"%(obj)s\" を追加しました。" -#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261 -#: contrib/admin/views/main.py:347 +#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:266 +#: contrib/admin/views/main.py:352 msgid "You may edit it again below." msgstr "続けて編集できます。" @@ -895,9 +906,9 @@ msgstr "%s の数" msgid "Fields on %s objects" msgstr "%s のフィールド" -#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301 -#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309 -#: contrib/admin/views/doc.py:310 contrib/admin/views/doc.py:312 +#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:302 +#: contrib/admin/views/doc.py:304 contrib/admin/views/doc.py:310 +#: contrib/admin/views/doc.py:311 contrib/admin/views/doc.py:313 msgid "Integer" msgstr "整数" @@ -905,7 +916,7 @@ msgstr "整数" msgid "Boolean (Either True or False)" msgstr "ブール値 (真: True または偽: False)" -#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311 +#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:312 #, python-format msgid "String (up to %(maxlength)s)" msgstr "文字列 ( %(maxlength)s 字まで )" @@ -923,148 +934,152 @@ msgid "Date (with time)" msgstr "日時" #: contrib/admin/views/doc.py:297 +msgid "Decimal number" +msgstr "10 進数 (小数可)" + +#: contrib/admin/views/doc.py:298 msgid "E-mail address" msgstr "メールアドレス" -#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299 -#: contrib/admin/views/doc.py:302 +#: contrib/admin/views/doc.py:299 contrib/admin/views/doc.py:300 +#: contrib/admin/views/doc.py:303 msgid "File path" msgstr "ファイルの場所" -#: contrib/admin/views/doc.py:300 -msgid "Decimal number" -msgstr "10 進数 (小数可)" +#: contrib/admin/views/doc.py:301 +msgid "Floating point number" +msgstr "浮動小数点" -#: contrib/admin/views/doc.py:304 contrib/comments/models.py:85 +#: contrib/admin/views/doc.py:305 contrib/comments/models.py:85 msgid "IP address" msgstr "IP アドレス" -#: contrib/admin/views/doc.py:306 +#: contrib/admin/views/doc.py:307 msgid "Boolean (Either True, False or None)" msgstr "ブール値 (真: True 、偽: False または None)" -#: contrib/admin/views/doc.py:307 +#: contrib/admin/views/doc.py:308 msgid "Relation to parent model" msgstr "親モデルへのリレーション" -#: contrib/admin/views/doc.py:308 +#: contrib/admin/views/doc.py:309 msgid "Phone number" msgstr "電話番号" -#: contrib/admin/views/doc.py:313 +#: contrib/admin/views/doc.py:314 msgid "Text" msgstr "テキスト" -#: contrib/admin/views/doc.py:314 +#: contrib/admin/views/doc.py:315 msgid "Time" msgstr "時刻" -#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7 +#: contrib/admin/views/doc.py:316 contrib/flatpages/models.py:7 msgid "URL" msgstr "URL" -#: contrib/admin/views/doc.py:316 +#: contrib/admin/views/doc.py:317 msgid "U.S. state (two uppercase letters)" msgstr "アメリカの州 (大文字二文字で)" -#: contrib/admin/views/doc.py:317 +#: contrib/admin/views/doc.py:318 msgid "XML text" msgstr "XMLテキスト" -#: contrib/admin/views/doc.py:343 +#: contrib/admin/views/doc.py:344 #, python-format msgid "%s does not appear to be a urlpattern object" msgstr "%s はurlpatternオブジェクトでは無いようです" -#: contrib/admin/views/main.py:223 +#: contrib/admin/views/main.py:228 msgid "Site administration" msgstr "サイト管理" -#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356 +#: contrib/admin/views/main.py:276 contrib/admin/views/main.py:361 #, python-format msgid "You may add another %s below." msgstr "続けて別の %s を追加できます。" -#: contrib/admin/views/main.py:289 +#: contrib/admin/views/main.py:294 #, python-format msgid "Add %s" msgstr "%s を追加" -#: contrib/admin/views/main.py:335 +#: contrib/admin/views/main.py:340 #, python-format msgid "Added %s." msgstr "%s を追加しました。" -#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337 -#: contrib/admin/views/main.py:339 db/models/manipulators.py:308 +#: contrib/admin/views/main.py:340 contrib/admin/views/main.py:342 +#: contrib/admin/views/main.py:344 db/models/manipulators.py:308 msgid "and" msgstr "と" -#: contrib/admin/views/main.py:337 +#: contrib/admin/views/main.py:342 #, python-format msgid "Changed %s." msgstr "%s を変更しました。" -#: contrib/admin/views/main.py:339 +#: contrib/admin/views/main.py:344 #, python-format msgid "Deleted %s." msgstr "%s を削除しました。" -#: contrib/admin/views/main.py:342 +#: contrib/admin/views/main.py:347 msgid "No fields changed." msgstr "変更はありませんでした。" -#: contrib/admin/views/main.py:345 +#: contrib/admin/views/main.py:350 #, python-format msgid "The %(name)s \"%(obj)s\" was changed successfully." msgstr "%(name)s \"%(obj)s\" を変更しました。" -#: contrib/admin/views/main.py:353 +#: contrib/admin/views/main.py:358 #, python-format msgid "" "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." msgstr "%(name)s \"%(obj)s\" を追加しました。続けて編集できます。" -#: contrib/admin/views/main.py:391 +#: contrib/admin/views/main.py:396 #, python-format msgid "Change %s" msgstr "%s を変更" -#: contrib/admin/views/main.py:476 +#: contrib/admin/views/main.py:481 #, python-format msgid "One or more %(fieldname)s in %(name)s: %(obj)s" msgstr "%(name)s に %(fieldname)s が一つ以上あります: %(obj)s" -#: contrib/admin/views/main.py:481 +#: contrib/admin/views/main.py:486 #, python-format msgid "One or more %(fieldname)s in %(name)s:" msgstr "%(name)s に %(fieldname)s が一つ以上あります:" -#: contrib/admin/views/main.py:514 +#: contrib/admin/views/main.py:518 #, python-format msgid "The %(name)s \"%(obj)s\" was deleted successfully." msgstr "%(name)s \"%(obj)s\" を削除しました。" -#: contrib/admin/views/main.py:517 +#: contrib/admin/views/main.py:521 msgid "Are you sure?" msgstr "よろしいですか?" -#: contrib/admin/views/main.py:539 +#: contrib/admin/views/main.py:543 #, python-format msgid "Change history: %s" msgstr "変更履歴: %s" -#: contrib/admin/views/main.py:573 +#: contrib/admin/views/main.py:577 #, python-format msgid "Select %s" msgstr "%s を選択" -#: contrib/admin/views/main.py:573 +#: contrib/admin/views/main.py:577 #, python-format msgid "Select %s to change" msgstr "変更する %s を選択" -#: contrib/admin/views/main.py:768 +#: contrib/admin/views/main.py:772 msgid "Database error" msgstr "データベースエラー" @@ -1088,7 +1103,7 @@ msgstr "" msgid "This account is inactive." msgstr "アカウントが無効です。" -#: contrib/auth/forms.py:85 +#: contrib/auth/forms.py:84 msgid "" "That e-mail address doesn't have an associated user account. Are you sure " "you've registered?" @@ -1102,35 +1117,35 @@ msgstr "新しいパスワード(確認用)が一致しません。" msgid "Your old password was entered incorrectly. Please enter it again." msgstr "元のパスワードが間違っています。もう一度入力してください。" -#: contrib/auth/models.py:38 contrib/auth/models.py:57 +#: contrib/auth/models.py:49 contrib/auth/models.py:69 msgid "name" msgstr "名前" -#: contrib/auth/models.py:40 +#: contrib/auth/models.py:51 msgid "codename" msgstr "コード名" -#: contrib/auth/models.py:42 +#: contrib/auth/models.py:54 msgid "permission" msgstr "パーミッション" -#: contrib/auth/models.py:43 contrib/auth/models.py:58 +#: contrib/auth/models.py:55 contrib/auth/models.py:70 msgid "permissions" msgstr "パーミッション" -#: contrib/auth/models.py:60 +#: contrib/auth/models.py:73 msgid "group" msgstr "グループ" -#: contrib/auth/models.py:61 contrib/auth/models.py:100 +#: contrib/auth/models.py:74 contrib/auth/models.py:114 msgid "groups" msgstr "グループ" -#: contrib/auth/models.py:90 +#: contrib/auth/models.py:104 msgid "username" msgstr "ユーザ名" -#: contrib/auth/models.py:90 +#: contrib/auth/models.py:104 msgid "" "Required. 30 characters or fewer. Alphanumeric characters only (letters, " "digits and underscores)." @@ -1138,23 +1153,23 @@ msgstr "" "この項目は必須です。半角アルファベット、半角数字、半角アンダーバーで30文字以" "下にしてください。" -#: contrib/auth/models.py:91 +#: contrib/auth/models.py:105 msgid "first name" msgstr "名" -#: contrib/auth/models.py:92 +#: contrib/auth/models.py:106 msgid "last name" msgstr "姓" -#: contrib/auth/models.py:93 +#: contrib/auth/models.py:107 msgid "e-mail address" msgstr "メールアドレス" -#: contrib/auth/models.py:94 +#: contrib/auth/models.py:108 msgid "password" msgstr "パスワード" -#: contrib/auth/models.py:94 +#: contrib/auth/models.py:108 msgid "" "Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change " "password form</a>." @@ -1162,43 +1177,43 @@ msgstr "" "'[algo]$[salt]$[hexdigest]'形式か、<a href=\"password/\">パスワード変更フォー" "ム</a>を使ってください。" -#: contrib/auth/models.py:95 +#: contrib/auth/models.py:109 msgid "staff status" msgstr "スタッフ権限" -#: contrib/auth/models.py:95 +#: contrib/auth/models.py:109 msgid "Designates whether the user can log into this admin site." msgstr "ユーザが管理サイトにログイン可能かどうかを示します。" -#: contrib/auth/models.py:96 +#: contrib/auth/models.py:110 msgid "active" msgstr "有効" -#: contrib/auth/models.py:96 +#: contrib/auth/models.py:110 msgid "" "Designates whether this user can log into the Django admin. Unselect this " "instead of deleting accounts." msgstr "ユーザが管理サイトにログイン可能かどうかを示します。" -#: contrib/auth/models.py:97 +#: contrib/auth/models.py:111 msgid "superuser status" msgstr "スーパーユーザ権限" -#: contrib/auth/models.py:97 +#: contrib/auth/models.py:111 msgid "" "Designates that this user has all permissions without explicitly assigning " "them." msgstr "全ての権限を持っているとみなされます。" -#: contrib/auth/models.py:98 +#: contrib/auth/models.py:112 msgid "last login" msgstr "最終ログイン" -#: contrib/auth/models.py:99 +#: contrib/auth/models.py:113 msgid "date joined" msgstr "登録日" -#: contrib/auth/models.py:101 +#: contrib/auth/models.py:115 msgid "" "In addition to the permissions manually assigned, this user will also get " "all permissions granted to each group he/she is in." @@ -1206,39 +1221,43 @@ msgstr "" "手動で付与したパーミッションに加え、所属しているグループに付与された全ての" "パーミッションを獲得します。" -#: contrib/auth/models.py:102 +#: contrib/auth/models.py:116 msgid "user permissions" msgstr "ユーザパーミッション" -#: contrib/auth/models.py:105 +#: contrib/auth/models.py:120 msgid "user" msgstr "ユーザ" -#: contrib/auth/models.py:106 +#: contrib/auth/models.py:121 msgid "users" msgstr "ユーザ" -#: contrib/auth/models.py:111 +#: contrib/auth/models.py:127 msgid "Personal info" msgstr "個人情報" -#: contrib/auth/models.py:112 +#: contrib/auth/models.py:128 msgid "Permissions" msgstr "パーミッション" -#: contrib/auth/models.py:113 +#: contrib/auth/models.py:129 msgid "Important dates" msgstr "重要な日程" -#: contrib/auth/models.py:114 +#: contrib/auth/models.py:130 msgid "Groups" msgstr "グループ" -#: contrib/auth/models.py:258 +#: contrib/auth/models.py:272 msgid "message" msgstr "メッセージ" -#: contrib/auth/views.py:39 +#: contrib/auth/models.py:285 +msgid "AnonymousUser" +msgstr "非認証ユーザ" + +#: contrib/auth/views.py:40 msgid "Logged out" msgstr "ログアウト" @@ -1660,11 +1679,260 @@ msgstr "8" msgid "nine" msgstr "9" +#: contrib/localflavor/au/forms.py:18 +msgid "Enter a 4 digit post code." +msgstr "4桁でポストコードを入力してください。" + +#: contrib/localflavor/br/forms.py:18 +msgid "Enter a zip code in the format XXXXX-XXX." +msgstr "XXXXX-XXXの形式でZipコードを入力してください。" + +#: contrib/localflavor/br/forms.py:30 +msgid "Phone numbers must be in XX-XXXX-XXXX format." +msgstr "電話番号は XX-XXXX-XXXX 形式で入力してください。" + +#: contrib/localflavor/br/forms.py:72 +msgid "This field requires only numbers." +msgstr "このフィールドは必須です(数値のみ)。" + +#: contrib/localflavor/br/forms.py:74 +msgid "This field requires at most 11 digits or 14 characters." +msgstr "11桁の数字か14文字で入力してください。" + +#: contrib/localflavor/br/forms.py:84 +msgid "Invalid CPF number." +msgstr "ブラジル納税者番号が無効です。" + +#: contrib/localflavor/br/forms.py:106 +msgid "This field requires at least 14 digits" +msgstr "14桁以上で入力して下さい。" + +#: contrib/localflavor/br/forms.py:116 +msgid "Invalid CNPJ number." +msgstr "納税登録番号が正しくありません。" + +#: contrib/localflavor/ch/ch_states.py:5 +msgid "Aargau" +msgstr "Aargau" + +#: contrib/localflavor/ch/ch_states.py:6 +msgid "Appenzell Innerrhoden" +msgstr "Appenzell Innerrhoden" + +#: contrib/localflavor/ch/ch_states.py:7 +msgid "Appenzell Ausserrhoden" +msgstr "Appenzell Ausserrhoden" + +#: contrib/localflavor/ch/ch_states.py:8 +msgid "Basel-Stadt" +msgstr "Basel-Stadt" + +#: contrib/localflavor/ch/ch_states.py:9 +msgid "Basel-Land" +msgstr "Basel-Land" + +#: contrib/localflavor/ch/ch_states.py:10 +msgid "Berne" +msgstr "Berne" + +#: contrib/localflavor/ch/ch_states.py:11 +msgid "Fribourg" +msgstr "Fribourg" + +#: contrib/localflavor/ch/ch_states.py:12 +msgid "Geneva" +msgstr "Geneva" + +#: contrib/localflavor/ch/ch_states.py:13 +msgid "Glarus" +msgstr "Glarus" + +#: contrib/localflavor/ch/ch_states.py:14 +msgid "Graubuenden" +msgstr "Graubuenden" + +#: contrib/localflavor/ch/ch_states.py:15 +msgid "Jura" +msgstr "Jura" + +#: contrib/localflavor/ch/ch_states.py:16 +msgid "Lucerne" +msgstr "Lucerne" + +#: contrib/localflavor/ch/ch_states.py:17 +msgid "Neuchatel" +msgstr "Neuchatel" + +#: contrib/localflavor/ch/ch_states.py:18 +msgid "Nidwalden" +msgstr "Nidwalden" + +#: contrib/localflavor/ch/ch_states.py:19 +msgid "Obwalden" +msgstr "Obwalden" + +#: contrib/localflavor/ch/ch_states.py:20 +msgid "Schaffhausen" +msgstr "Schaffhausen" + +#: contrib/localflavor/ch/ch_states.py:21 +msgid "Schwyz" +msgstr "Schwyz" + +#: contrib/localflavor/ch/ch_states.py:22 +msgid "Solothurn" +msgstr "Solothurn" + +#: contrib/localflavor/ch/ch_states.py:23 +msgid "St. Gallen" +msgstr "St. Gallen" + +#: contrib/localflavor/ch/ch_states.py:24 +msgid "Thurgau" +msgstr "Thurgau" + +#: contrib/localflavor/ch/ch_states.py:25 +msgid "Ticino" +msgstr "Ticino" + +#: contrib/localflavor/ch/ch_states.py:26 +msgid "Uri" +msgstr "Uri" + +#: contrib/localflavor/ch/ch_states.py:27 +msgid "Valais" +msgstr "Valais" + +#: contrib/localflavor/ch/ch_states.py:28 +msgid "Vaud" +msgstr "Vaud" + +#: contrib/localflavor/ch/ch_states.py:29 +msgid "Zug" +msgstr "Zug" + +#: contrib/localflavor/ch/ch_states.py:30 +msgid "Zurich" +msgstr "Zurich" + +#: contrib/localflavor/ch/forms.py:18 contrib/localflavor/no/forms.py:15 +msgid "Enter a zip code in the format XXXX." +msgstr "XXXXの形式でZipコードを入力してください。" + +#: contrib/localflavor/ch/forms.py:90 +msgid "" +"Enter a valid Swiss identity or passport card number in X1234567<0 or " +"1234567890 format." +msgstr "スイス アイデンティティかパスポート番号を X1234567<0 か 1234567890 の形式で入力して下さい。" + +#: contrib/localflavor/cl/forms.py:21 +msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X." +msgstr "XX.XXX.XXX-Xの形式でチリ納税者番号を入力してください。" + +#: contrib/localflavor/cl/forms.py:26 +msgid "Enter valid a Chilean RUT" +msgstr "正しいチリ納税者番号を入力してください。" + +#: contrib/localflavor/de/de_states.py:5 +msgid "Baden-Wuerttemberg" +msgstr "Baden-Wuerttemberg" + +#: contrib/localflavor/de/de_states.py:6 +msgid "Bavaria" +msgstr "Bavaria" + +#: contrib/localflavor/de/de_states.py:7 +msgid "Berlin" +msgstr "Berlin" + +#: contrib/localflavor/de/de_states.py:8 +msgid "Brandenburg" +msgstr "Brandenburg" + +#: contrib/localflavor/de/de_states.py:9 +msgid "Bremen" +msgstr "Bremen" + +#: contrib/localflavor/de/de_states.py:10 +msgid "Hamburg" +msgstr "Hamburg" + +#: contrib/localflavor/de/de_states.py:11 +msgid "Hessen" +msgstr "Hessen" + +#: contrib/localflavor/de/de_states.py:12 +msgid "Mecklenburg-Western Pomerania" +msgstr "Mecklenburg-Western Pomerania" + +#: contrib/localflavor/de/de_states.py:13 +msgid "Lower Saxony" +msgstr "Lower Saxony" + +#: contrib/localflavor/de/de_states.py:14 +msgid "North Rhine-Westphalia" +msgstr "North Rhine-Westphalia" + +#: contrib/localflavor/de/de_states.py:15 +msgid "Rhineland-Palatinate" +msgstr "Rhineland-Palatinate" + +#: contrib/localflavor/de/de_states.py:16 +msgid "Saarland" +msgstr "Saarland" + +#: contrib/localflavor/de/de_states.py:17 +msgid "Saxony" +msgstr "Saxony" + +#: contrib/localflavor/de/de_states.py:18 +msgid "Saxony-Anhalt" +msgstr "Saxony-Anhalt" + +#: contrib/localflavor/de/de_states.py:19 +msgid "Schleswig-Holstein" +msgstr "Schleswig-Holstein" + +#: contrib/localflavor/de/de_states.py:20 +msgid "Thuringia" +msgstr "Thuringia" + +#: contrib/localflavor/de/forms.py:16 contrib/localflavor/fi/forms.py:14 #: contrib/localflavor/fr/forms.py:17 -#, fuzzy msgid "Enter a zip code in the format XXXXX." msgstr "XXXXXの形式でZipコードを入力してください。" +#: contrib/localflavor/de/forms.py:60 +msgid "" +"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X " +"format." +msgstr "XXXXXXXXXXX-XXXXXXX-XXXXXXX-X の形式でドイツIDカード番号を入力して下さい。" + +#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45 +msgid "Enter a valid Finnish social security number." +msgstr "フィンランド社会保証番号を正しく入力してください。" + +#: contrib/localflavor/is_/forms.py:16 +msgid "" +"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX." +msgstr "XXXXXか、XXXXX-XXXXの形式でアイスランド納税者番号を入力してください。" + +#: contrib/localflavor/is_/forms.py:30 +msgid "The Icelandic identification number is not valid." +msgstr "アイスランド納税者番号を正しく入力して下さい。" + +#: contrib/localflavor/it/forms.py:16 +msgid "Enter a valid zip code." +msgstr "Zipコードを正しく入力してください。" + +#: contrib/localflavor/it/forms.py:41 +msgid "Enter a valid Social Security number." +msgstr "社会保障番号番号を正しく入力してください。" + +#: contrib/localflavor/it/forms.py:68 +msgid "Enter a valid VAT number." +msgstr "VAT番号を正しく入力してください。" + #: contrib/localflavor/jp/forms.py:21 msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX." msgstr "XXXXXか、XXXXX-XXXXの形式で郵便番号を入力してください。" @@ -1857,14 +2125,24 @@ msgstr "鹿児島県" msgid "Okinawa" msgstr "沖縄県" +#: contrib/localflavor/no/forms.py:36 +msgid "Enter a valid Norwegian social security number." +msgstr "ノルウェー社会保障番号を正しく入力してください。" + #: contrib/localflavor/uk/forms.py:18 msgid "Enter a postcode. A space is required between the two postcode parts." -msgstr "ポスタルコードを入力してください。コードとコードの間は半角のスペースで区切ってください。" +msgstr "" +"ポスタルコードを入力してください。コードとコードの間は半角のスペースで区切っ" +"てください。" -#: contrib/localflavor/usa/forms.py:17 +#: contrib/localflavor/us/forms.py:18 msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX." msgstr "XXXXXか、XXXXX-XXXXの形式で郵便番号を入力してください。" +#: contrib/localflavor/us/forms.py:51 +msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format." +msgstr "XXX-XX-XXXX の形式で、米国社会保障番号を入力して下さい。" + #: contrib/redirects/models.py:7 msgid "redirect from" msgstr "リダイレクト元" @@ -1929,92 +2207,92 @@ msgstr "サイト" msgid "sites" msgstr "サイト" -#: core/validators.py:64 +#: core/validators.py:65 msgid "This value must contain only letters, numbers and underscores." msgstr "半角の英数字およびアンダースコア以外は使用できません。" -#: core/validators.py:68 +#: core/validators.py:69 msgid "" "This value must contain only letters, numbers, underscores, dashes or " "slashes." msgstr "" "半角の英数字、アンダースコア、ダッシュ、スラッシュ以外は使用できません。" -#: core/validators.py:72 +#: core/validators.py:73 msgid "This value must contain only letters, numbers, underscores or hyphens." msgstr "半角の英数字、アンダースコア、ハイフン以外は使用できません。" -#: core/validators.py:76 +#: core/validators.py:77 msgid "Uppercase letters are not allowed here." msgstr "大文字はここでは使用できません。" -#: core/validators.py:80 +#: core/validators.py:81 msgid "Lowercase letters are not allowed here." msgstr "小文字はここでは使用できません。" -#: core/validators.py:87 +#: core/validators.py:88 msgid "Enter only digits separated by commas." msgstr "カンマ区切りの数字だけを入力してください。" -#: core/validators.py:99 +#: core/validators.py:100 msgid "Enter valid e-mail addresses separated by commas." msgstr "カンマ区切りの有効なメールアドレスを入力してください。" -#: core/validators.py:103 +#: core/validators.py:104 msgid "Please enter a valid IP address." msgstr "有効な IP アドレスを入力してください。" -#: core/validators.py:107 +#: core/validators.py:108 msgid "Empty values are not allowed here." msgstr "入力は必須です。" -#: core/validators.py:111 +#: core/validators.py:112 msgid "Non-numeric characters aren't allowed here." msgstr "数値以外は使用できません。" -#: core/validators.py:115 +#: core/validators.py:116 msgid "This value can't be comprised solely of digits." msgstr "数値だけの値にはできません。" -#: core/validators.py:120 newforms/fields.py:126 +#: core/validators.py:121 newforms/fields.py:135 msgid "Enter a whole number." msgstr "整数を入力してください。" -#: core/validators.py:124 +#: core/validators.py:125 msgid "Only alphabetical characters are allowed here." msgstr "半角アルファベット以外使用できません。" -#: core/validators.py:139 +#: core/validators.py:140 msgid "Year must be 1900 or later." msgstr "1900年以降を指定してください。" -#: core/validators.py:143 +#: core/validators.py:144 #, python-format msgid "Invalid date: %s" msgstr "無効な日付: %s" -#: core/validators.py:148 db/models/fields/__init__.py:457 +#: core/validators.py:149 db/models/fields/__init__.py:468 msgid "Enter a valid date in YYYY-MM-DD format." msgstr "YYYY-MM-DD形式で日付を入力してください。" -#: core/validators.py:153 +#: core/validators.py:154 msgid "Enter a valid time in HH:MM format." msgstr "HH:MM形式で時刻を入力してください。" -#: core/validators.py:157 db/models/fields/__init__.py:526 +#: core/validators.py:158 db/models/fields/__init__.py:537 msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format." msgstr "YYYY-MM-DD HH:MM形式で日時を入力してください。" -#: core/validators.py:162 newforms/fields.py:269 +#: core/validators.py:163 newforms/fields.py:339 msgid "Enter a valid e-mail address." msgstr "有効なメールアドレスを入力してください。" -#: core/validators.py:174 core/validators.py:445 oldforms/__init__.py:672 +#: core/validators.py:175 core/validators.py:453 oldforms/__init__.py:672 msgid "No file was submitted. Check the encoding type on the form." msgstr "" "ファイルが取得できませんでした。formのencoding typeを確認してください。" -#: core/validators.py:178 +#: core/validators.py:179 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." @@ -2022,26 +2300,26 @@ msgstr "" "画像をアップロードしてください。アップロードした画像は画像でないか、または壊" "れています。" -#: core/validators.py:185 +#: core/validators.py:186 #, python-format msgid "The URL %s does not point to a valid image." msgstr "URL ( %s ) は画像ではありません。" -#: core/validators.py:189 +#: core/validators.py:190 #, python-format msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid." msgstr "電話番号は XXX-XXX-XXXX 形式で入力してください。\"%s\" は無効です。" -#: core/validators.py:197 +#: core/validators.py:198 #, python-format msgid "The URL %s does not point to a valid QuickTime video." msgstr "URL ( %s ) は QuickTime ビデオではありません。" -#: core/validators.py:201 +#: core/validators.py:202 msgid "A valid URL is required." msgstr "正しい URL を入力してください。" -#: core/validators.py:215 +#: core/validators.py:216 #, python-format msgid "" "Valid HTML is required. Specific errors are:\n" @@ -2050,86 +2328,86 @@ msgstr "" "有効な HTML を入力してください。エラー:\n" "%s" -#: core/validators.py:222 +#: core/validators.py:223 #, python-format msgid "Badly formed XML: %s" msgstr "不正な XML です: %s" -#: core/validators.py:239 +#: core/validators.py:240 #, python-format msgid "Invalid URL: %s" msgstr "無効なURL: %s" -#: core/validators.py:244 core/validators.py:246 +#: core/validators.py:245 core/validators.py:247 #, python-format msgid "The URL %s is a broken link." msgstr "URL ( %s ) はリンクが壊れています。" -#: core/validators.py:252 +#: core/validators.py:253 msgid "Enter a valid U.S. state abbreviation." msgstr "正しい米州略称を入力してください。" -#: core/validators.py:266 +#: core/validators.py:267 #, python-format msgid "Watch your mouth! The word %s is not allowed here." msgid_plural "Watch your mouth! The words %s are not allowed here." msgstr[0] "言葉使いに気を付けて! %s という言葉は使えません。" msgstr[1] "言葉使いに気を付けて! %s という言葉は使えません。" -#: core/validators.py:273 +#: core/validators.py:274 #, python-format msgid "This field must match the '%s' field." msgstr "このフィールドは '%s' フィールドと一致せねばなりません。" -#: core/validators.py:292 +#: core/validators.py:293 msgid "Please enter something for at least one field." msgstr "少なくとも一つのフィールドに何か入力してください。" -#: core/validators.py:301 core/validators.py:312 +#: core/validators.py:302 core/validators.py:313 msgid "Please enter both fields or leave them both empty." msgstr "両方のフィールドに入力するか、両方とも未入力にしてください。" -#: core/validators.py:320 +#: core/validators.py:321 #, python-format msgid "This field must be given if %(field)s is %(value)s" msgstr "" "%(field)s を %(value)s にするのなら、このフィールドに必ず入力してください。" -#: core/validators.py:333 +#: core/validators.py:334 #, python-format msgid "This field must be given if %(field)s is not %(value)s" msgstr "" "%(field)s を %(value)s にしないのなら、このフィールドに必ず入力してください。" -#: core/validators.py:352 +#: core/validators.py:353 msgid "Duplicate values are not allowed." msgstr "重複する値は認められません。" -#: core/validators.py:367 +#: core/validators.py:368 #, python-format msgid "This value must be between %(lower)s and %(upper)s." msgstr "この値は %(lower)s から %(upper)s の間でなければなりません。" -#: core/validators.py:369 +#: core/validators.py:370 #, python-format msgid "This value must be at least %s." msgstr "この値は %s 以上でなければなりません。" -#: core/validators.py:371 +#: core/validators.py:372 #, python-format msgid "This value must be no more than %s." msgstr "この値は %s より小さくなければなりません。" -#: core/validators.py:407 +#: core/validators.py:408 #, python-format msgid "This value must be a power of %s." msgstr "この値は %s の累乗でなければなりません。" -#: core/validators.py:418 +#: core/validators.py:417 msgid "Please enter a valid decimal number." msgstr "有効な 10 進数を入力してください。" -#: core/validators.py:422 +#: core/validators.py:423 #, python-format msgid "Please enter a valid decimal number with at most %s total digit." msgid_plural "" @@ -2137,7 +2415,7 @@ msgid_plural "" msgstr[0] "全体で %s 文字以下の数字を入力してください。" msgstr[1] "全体で %s 文字以下の数字を入力してください。" -#: core/validators.py:425 +#: core/validators.py:426 #, python-format msgid "" "Please enter a valid decimal number with a whole part of at most %s digit." @@ -2146,7 +2424,7 @@ msgid_plural "" msgstr[0] "整数部は %s 文字以下の数字を入力してください。" msgstr[1] "整数部は %s 文字以下の数字を入力してください。" -#: core/validators.py:428 +#: core/validators.py:429 #, python-format msgid "Please enter a valid decimal number with at most %s decimal place." msgid_plural "" @@ -2154,37 +2432,41 @@ msgid_plural "" msgstr[0] "小数部は %s 文字以下の数字を入力してください。" msgstr[1] "小数部は %s 文字以下の数字を入力してください。" -#: core/validators.py:438 +#: core/validators.py:437 +msgid "Please enter a valid floating point number." +msgstr "有効な 小数 を入力してください。" + +#: core/validators.py:446 #, python-format msgid "Make sure your uploaded file is at least %s bytes big." msgstr "アップロードするファイルの大きさは %s バイト以上にしてください。" -#: core/validators.py:439 +#: core/validators.py:447 #, python-format msgid "Make sure your uploaded file is at most %s bytes big." msgstr "アップロードするファイルの大きさは %s 最大バイトまでです。" -#: core/validators.py:456 +#: core/validators.py:464 msgid "The format for this field is wrong." msgstr "フィールドの形式が正しくありません。" -#: core/validators.py:471 +#: core/validators.py:479 msgid "This field is invalid." msgstr "このフィールドは無効です。" -#: core/validators.py:507 +#: core/validators.py:515 #, python-format msgid "Could not retrieve anything from %s." msgstr "%s から何も検索できませんでした。" -#: core/validators.py:510 +#: core/validators.py:518 #, python-format msgid "" "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." msgstr "" "URL %(url)s は無効なコンテンツタイプヘッダ '%(contenttype)s' を返しました。" -#: core/validators.py:543 +#: core/validators.py:551 #, python-format msgid "" "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with " @@ -2193,7 +2475,7 @@ msgstr "" "%(line)s 行目から始まる %(tag)s タグを閉じてください (\"%(start)s\" で始まる" "行です)。" -#: core/validators.py:547 +#: core/validators.py:555 #, python-format msgid "" "Some text starting on line %(line)s is not allowed in that context. (Line " @@ -2202,7 +2484,7 @@ msgstr "" "%(line)s 行目から始まるテキストはこのコンテキストでは使えません。 (\"%(start)" "s\" で始まる行です)。" -#: core/validators.py:552 +#: core/validators.py:560 #, python-format msgid "" "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%" @@ -2211,7 +2493,7 @@ msgstr "" "%(line)s 行目の \"%(attr)s\" は無効なアトリビュートです (\"%(start)s\" で始ま" "る行です)。" -#: core/validators.py:557 +#: core/validators.py:565 #, python-format msgid "" "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%" @@ -2220,7 +2502,7 @@ msgstr "" "%(line)s 行目の \"<%(tag)s>\" は無効なタグです( \"%(start)s\" で始まる行で" "す)。" -#: core/validators.py:561 +#: core/validators.py:569 #, python-format msgid "" "A tag on line %(line)s is missing one or more required attributes. (Line " @@ -2229,7 +2511,7 @@ msgstr "" "%(line)s 行目のタグは必須アトリビュートが未入力です( \"%(start)s\" で始まる行" "です)。" -#: core/validators.py:566 +#: core/validators.py:574 #, python-format msgid "" "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line " @@ -2244,55 +2526,59 @@ msgid "%(object)s with this %(type)s already exists for the given %(field)s." msgstr "" "%(field)s に入力されたものは、この %(type)s の %(object)s に既に存在します。" -#: db/models/fields/__init__.py:42 +#: db/models/fields/__init__.py:46 #, python-format msgid "%(optname)s with this %(fieldname)s already exists." msgstr "%(fieldname)s に %(optname)s は既に存在します。" -#: db/models/fields/__init__.py:117 db/models/fields/__init__.py:274 -#: db/models/fields/__init__.py:610 db/models/fields/__init__.py:621 -#: newforms/fields.py:78 newforms/fields.py:374 newforms/fields.py:450 -#: newforms/fields.py:461 newforms/models.py:177 oldforms/__init__.py:357 +#: db/models/fields/__init__.py:126 db/models/fields/__init__.py:283 +#: db/models/fields/__init__.py:680 db/models/fields/__init__.py:691 +#: newforms/fields.py:87 newforms/fields.py:444 newforms/fields.py:522 +#: newforms/fields.py:533 newforms/models.py:185 oldforms/__init__.py:357 msgid "This field is required." msgstr "このフィールドは必須です。" -#: db/models/fields/__init__.py:367 +#: db/models/fields/__init__.py:378 msgid "This value must be an integer." msgstr "値は整数でなければなりません。" -#: db/models/fields/__init__.py:402 +#: db/models/fields/__init__.py:413 msgid "This value must be either True or False." msgstr "値は真: True または偽: False でなければなりません。" -#: db/models/fields/__init__.py:423 +#: db/models/fields/__init__.py:434 msgid "This field cannot be null." msgstr "このフィールドには NULL を指定できません。" -#: db/models/fields/__init__.py:630 +#: db/models/fields/__init__.py:597 +msgid "This value must be a decimal number." +msgstr "値は整数でなければなりません。" + +#: db/models/fields/__init__.py:700 msgid "Enter a valid filename." msgstr "正しいファイル名を入力してください。" -#: db/models/fields/__init__.py:751 +#: db/models/fields/__init__.py:824 msgid "This value must be either None, True or False." msgstr "値は、空: None、真: True または偽: False でなければなりません。" -#: db/models/fields/related.py:53 +#: db/models/fields/related.py:54 #, python-format msgid "Please enter a valid %s." msgstr "正しい %s を入力してください。" -#: db/models/fields/related.py:642 +#: db/models/fields/related.py:640 msgid "Separate multiple IDs with commas." msgstr "複数の ID はカンマで区切ってください。" -#: db/models/fields/related.py:644 +#: db/models/fields/related.py:642 msgid "" "Hold down \"Control\", or \"Command\" on a Mac, to select more than one." msgstr "" "複数選択するときには Control キーを押したまま選択してください。Mac は " "Command キーを使ってください" -#: db/models/fields/related.py:691 +#: db/models/fields/related.py:689 #, python-format msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." msgid_plural "" @@ -2300,59 +2586,78 @@ msgid_plural "" msgstr[0] "正しい %(self)s IDを入力してください。 %(value)r は無効です。" msgstr[1] "正しい %(self)s IDを入力してください。 %(value)r は無効です。" -#: newforms/fields.py:101 newforms/fields.py:254 +#: newforms/fields.py:110 newforms/fields.py:324 #, python-format msgid "Ensure this value has at most %d characters." msgstr "%d 字以下で入力してください。" -#: newforms/fields.py:103 newforms/fields.py:256 +#: newforms/fields.py:112 newforms/fields.py:326 #, python-format msgid "Ensure this value has at least %d characters." msgstr "%d 字以上で入力してください。" -#: newforms/fields.py:128 +#: newforms/fields.py:137 newforms/fields.py:160 newforms/fields.py:192 #, python-format msgid "Ensure this value is less than or equal to %s." msgstr "この値は %s 以下でなければなりません。" -#: newforms/fields.py:130 +#: newforms/fields.py:139 newforms/fields.py:162 newforms/fields.py:194 #, python-format msgid "Ensure this value is greater than or equal to %s." msgstr "この値は %s 以上でなければなりません。" -#: newforms/fields.py:163 +#: newforms/fields.py:158 newforms/fields.py:186 +msgid "Enter a number." +msgstr "整数を入力してください。" + +#: newforms/fields.py:196 +#, python-format +msgid "Ensure that there are no more than %s digits in total." +msgstr "整数部と少数部を併せて %s 桁までで入力して下さい。" + +#: newforms/fields.py:198 +#, python-format +msgid "Ensure that there are no more than %s decimal places." +msgstr "少数部は %s 桁までで入力して下さい。" + +#: newforms/fields.py:200 +#, python-format +msgid "Ensure that there are no more than %s digits before the decimal point." +msgstr "整数部は %s 桁までで入力して下さい。" + +#: newforms/fields.py:233 newforms/fields.py:566 msgid "Enter a valid date." msgstr "日付を正しく入力してください。" -#: newforms/fields.py:190 +#: newforms/fields.py:260 newforms/fields.py:568 msgid "Enter a valid time." msgstr "時間を正しく入力してください。" -#: newforms/fields.py:226 +#: newforms/fields.py:296 msgid "Enter a valid date/time." msgstr "日付/時間を正しく入力してください。" -#: newforms/fields.py:240 +#: newforms/fields.py:310 msgid "Enter a valid value." msgstr "値を正しく入力してください。" -#: newforms/fields.py:287 newforms/fields.py:309 +#: newforms/fields.py:357 newforms/fields.py:379 msgid "Enter a valid URL." msgstr "URLを正しく入力してください。" -#: newforms/fields.py:311 +#: newforms/fields.py:381 msgid "This URL appears to be a broken link." msgstr "このURLはリンクが壊れています。" -#: newforms/fields.py:360 newforms/models.py:164 +#: newforms/fields.py:432 newforms/models.py:172 msgid "Select a valid choice. That choice is not one of the available choices." msgstr "正しく選択してください。選択したものは候補にありません。" -#: newforms/fields.py:378 newforms/fields.py:454 newforms/models.py:181 +#: newforms/fields.py:448 newforms/fields.py:526 newforms/models.py:189 msgid "Enter a list of values." msgstr "リストを入力してください。" -#: newforms/fields.py:387 newforms/models.py:187 +#: newforms/fields.py:457 newforms/models.py:195 #, python-format msgid "Select a valid choice. %s is not one of the available choices." msgstr "正しく選択してください。 %s は候補にありません。" @@ -2393,6 +2698,28 @@ msgstr "0 から 32,767 までの整数を入力してください。" msgid "yes,no,maybe" msgstr "はい,いいえ,たぶん" +#: template/defaultfilters.py:520 +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d byte" +msgstr[1] "%(size)d bytes" + +#: template/defaultfilters.py:522 +#, python-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: template/defaultfilters.py:524 +#, python-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: template/defaultfilters.py:525 +#, python-format +msgid "%.1f GB" +msgstr "%.1f GB" + #: utils/dateformat.py:40 msgid "p.m." msgstr "p.m." @@ -2605,23 +2932,38 @@ msgid_plural "minutes" msgstr[0] "分" msgstr[1] "分" -#: utils/translation/trans_real.py:362 +#: utils/timesince.py:40 +#, python-format +msgid "%d milliseconds" +msgstr "%d ミリ秒" + +#: utils/timesince.py:41 +#, python-format +msgid "%(number)d %(type)s" +msgstr "%(number)d %(type)s" + +#: utils/timesince.py:47 +#, python-format +msgid ", %(number)d %(type)s" +msgstr ", %(number)d %(type)s" + +#: utils/translation/trans_real.py:358 msgid "DATE_FORMAT" msgstr "Y/m/d" -#: utils/translation/trans_real.py:363 +#: utils/translation/trans_real.py:359 msgid "DATETIME_FORMAT" msgstr "Y/m/d H:i" -#: utils/translation/trans_real.py:364 +#: utils/translation/trans_real.py:360 msgid "TIME_FORMAT" msgstr "H:i" -#: utils/translation/trans_real.py:380 +#: utils/translation/trans_real.py:376 msgid "YEAR_MONTH_FORMAT" msgstr "Y/m/d" -#: utils/translation/trans_real.py:381 +#: utils/translation/trans_real.py:377 msgid "MONTH_DAY_FORMAT" msgstr "m/d" diff --git a/django/conf/locale/ro/LC_MESSAGES/django.mo b/django/conf/locale/ro/LC_MESSAGES/django.mo Binary files differindex ffac5d5f9e..9b46b6c6d6 100644 --- a/django/conf/locale/ro/LC_MESSAGES/django.mo +++ b/django/conf/locale/ro/LC_MESSAGES/django.mo diff --git a/django/conf/locale/ro/LC_MESSAGES/django.po b/django/conf/locale/ro/LC_MESSAGES/django.po index 293e428c71..09494d7b4e 100644 --- a/django/conf/locale/ro/LC_MESSAGES/django.po +++ b/django/conf/locale/ro/LC_MESSAGES/django.po @@ -23,13 +23,13 @@ msgstr "id obiect" #: contrib/comments/models.py:68 msgid "headline" -msgstr "" +msgstr "titlu" #: contrib/comments/models.py:69 contrib/comments/models.py:90 #: contrib/comments/models.py:167 #, fuzzy msgid "comment" -msgstr "conţinut" +msgstr "comentariu" #: contrib/comments/models.py:70 msgid "rating #1" @@ -69,20 +69,19 @@ msgstr "" #: contrib/comments/models.py:83 contrib/comments/models.py:169 msgid "date/time submitted" -msgstr "" +msgstr "data/ora crearii" #: contrib/comments/models.py:84 contrib/comments/models.py:170 msgid "is public" -msgstr "" +msgstr "public" #: contrib/comments/models.py:85 contrib/admin/views/doc.py:289 -#, fuzzy msgid "IP address" -msgstr "adresa email" +msgstr "adresa ip" #: contrib/comments/models.py:86 msgid "is removed" -msgstr "" +msgstr "sters" #: contrib/comments/models.py:86 msgid "" @@ -122,7 +121,7 @@ msgstr "adresa email" #: contrib/comments/models.py:173 msgid "approved by staff" -msgstr "" +msgstr "aprobat de echipa" #: contrib/comments/models.py:176 #, fuzzy @@ -282,9 +281,8 @@ msgid "Password:" msgstr "Parola:" #: contrib/comments/templates/comments/form.html:6 -#, fuzzy msgid "Forgotten your password?" -msgstr "Schimbă-mi parola" +msgstr "Ai uitat parola?" #: contrib/comments/templates/comments/form.html:8 #: contrib/admin/templates/admin/object_history.html:3 @@ -338,9 +336,8 @@ msgid "Preview comment" msgstr "permite comentarii" #: contrib/comments/templates/comments/freeform.html:4 -#, fuzzy msgid "Your name:" -msgstr "nume utilizator" +msgstr "numele dumneavoastra" #: contrib/admin/filterspecs.py:40 #, python-format @@ -352,41 +349,39 @@ msgstr "" #: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88 #: contrib/admin/filterspecs.py:143 msgid "All" -msgstr "" +msgstr "tot" #: contrib/admin/filterspecs.py:109 msgid "Any date" -msgstr "" +msgstr "orice data" #: contrib/admin/filterspecs.py:110 -#, fuzzy msgid "Today" -msgstr "Luni" +msgstr "Astazi" #: contrib/admin/filterspecs.py:113 msgid "Past 7 days" -msgstr "" +msgstr "Ultimele 7 zile" #: contrib/admin/filterspecs.py:115 msgid "This month" -msgstr "" +msgstr "Luna aceasta" #: contrib/admin/filterspecs.py:117 msgid "This year" -msgstr "" +msgstr "Anul acesta" #: contrib/admin/filterspecs.py:143 msgid "Yes" -msgstr "" +msgstr "Da" #: contrib/admin/filterspecs.py:143 -#, fuzzy msgid "No" -msgstr "Noi." +msgstr "Nu" #: contrib/admin/filterspecs.py:150 msgid "Unknown" -msgstr "" +msgstr "Necunoscut" #: contrib/admin/models.py:16 msgid "action time" @@ -418,7 +413,7 @@ msgstr "intrări log" #: contrib/admin/templatetags/admin_list.py:228 msgid "All dates" -msgstr "" +msgstr "Toate datele" #: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36 #: contrib/auth/forms.py:41 @@ -426,6 +421,8 @@ msgid "" "Please enter a correct username and password. Note that both fields are case-" "sensitive." msgstr "" +"Va rugam sa introduceti username-ul si parola corecta. Aveti grija deoarece" +"casutele sunt case sensitive." #: contrib/admin/views/decorators.py:23 #: contrib/admin/templates/admin/login.html:25 @@ -437,16 +434,21 @@ msgid "" "Please log in again, because your session has expired. Don't worry: Your " "submission has been saved." msgstr "" +"Va rugam sa va inregistrati din nou, deoarece sesiunea a expirat. Nu va " +"faceti griji datele au fost salvate." #: contrib/admin/views/decorators.py:68 msgid "" "Looks like your browser isn't configured to accept cookies. Please enable " "cookies, reload this page, and try again." msgstr "" +"Se pare ca browserul dumneavostra nu este configurat sa accepte cookies. Va " +"rugam sa va setati browserul sa accepte cookies, dati un reload la pagina si " +"incercati din nou." #: contrib/admin/views/decorators.py:82 msgid "Usernames cannot contain the '@' character." -msgstr "" +msgstr "Username-ul nu are voie sa contina caracterul '@'." #: contrib/admin/views/decorators.py:84 #, python-format @@ -461,61 +463,62 @@ msgstr "Administrare Django" #: contrib/admin/views/main.py:260 #, python-format msgid "The %(name)s \"%(obj)s\" was added successfully." -msgstr "" +msgstr "%(name)s \"%(obj)s\" a fost inserat cu succes." #: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348 msgid "You may edit it again below." -msgstr "" +msgstr "Va puteti edita datele din nou mai jos." #: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357 #, python-format msgid "You may add another %s below." -msgstr "" +msgstr "Mai puteti adauga un alt %s mai jos." #: contrib/admin/views/main.py:290 -#, fuzzy, python-format +#, python-format msgid "Add %s" -msgstr "Adaugă" +msgstr "Adaugă %s" #: contrib/admin/views/main.py:336 #, python-format msgid "Added %s." -msgstr "" +msgstr "Adaugat %s." #: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338 #: contrib/admin/views/main.py:340 msgid "and" -msgstr "" +msgstr "si" #: contrib/admin/views/main.py:338 -#, fuzzy, python-format +#, python-format msgid "Changed %s." -msgstr "Schimbă" +msgstr "Schimbă %s." #: contrib/admin/views/main.py:340 #, python-format msgid "Deleted %s." -msgstr "" +msgstr "Am sters %s." #: contrib/admin/views/main.py:343 msgid "No fields changed." -msgstr "" +msgstr "Nu s-a facut nicio schimbare." #: contrib/admin/views/main.py:346 #, python-format msgid "The %(name)s \"%(obj)s\" was changed successfully." -msgstr "" +msgstr "%(name)s \"%(obj)s\" au fost modificate cu succes." #: contrib/admin/views/main.py:354 #, python-format msgid "" "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." msgstr "" +"%(name)s \"%(obj)s\" au fost adaugate cu succes. Le puteti edita mai jos." #: contrib/admin/views/main.py:392 -#, fuzzy, python-format +#, python-format msgid "Change %s" -msgstr "Schimbă" +msgstr "Schimbă %s" #: contrib/admin/views/main.py:470 #, python-format @@ -530,16 +533,16 @@ msgstr "" #: contrib/admin/views/main.py:508 #, python-format msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "" +msgstr "%(name)s \"%(obj)s\" au fost sterse cu succes." #: contrib/admin/views/main.py:511 msgid "Are you sure?" -msgstr "" +msgstr "Sunteti sigur?" #: contrib/admin/views/main.py:533 -#, fuzzy, python-format +#, python-format msgid "Change history: %s" -msgstr "Schimbă parola" +msgstr "Schimbari facute: %s" #: contrib/admin/views/main.py:565 #, python-format @@ -549,13 +552,13 @@ msgstr "" #: contrib/admin/views/main.py:565 #, python-format msgid "Select %s to change" -msgstr "" +msgstr "Selecteaza %s pentru schimbare" #: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286 #: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294 #: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297 msgid "Integer" -msgstr "" +msgstr "Intreg" #: contrib/admin/views/doc.py:278 msgid "Boolean (Either True or False)" @@ -564,26 +567,23 @@ msgstr "" #: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296 #, python-format msgid "String (up to %(maxlength)s)" -msgstr "" +msgstr "String (pana la %(maxlength)s caractere)" #: contrib/admin/views/doc.py:280 msgid "Comma-separated integers" msgstr "" #: contrib/admin/views/doc.py:281 -#, fuzzy msgid "Date (without time)" -msgstr "timp acţiune" +msgstr "Data (fara ora)" #: contrib/admin/views/doc.py:282 -#, fuzzy msgid "Date (with time)" -msgstr "Dată/oră" +msgstr "Data (cu ora)" #: contrib/admin/views/doc.py:283 -#, fuzzy msgid "E-mail address" -msgstr "Adresa email:" +msgstr "Adresa email" #: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287 msgid "File path" @@ -603,9 +603,8 @@ msgid "Relation to parent model" msgstr "" #: contrib/admin/views/doc.py:293 -#, fuzzy msgid "Phone number" -msgstr "Introduceţi un număr întreg." +msgstr "Numar de telefon" #: contrib/admin/views/doc.py:298 msgid "Text" @@ -613,7 +612,7 @@ msgstr "" #: contrib/admin/views/doc.py:299 msgid "Time" -msgstr "" +msgstr "Timp" #: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7 msgid "URL" @@ -636,7 +635,7 @@ msgstr "" #: contrib/admin/templates/registration/password_change_form.html:3 #: contrib/admin/templates/admin_doc/bookmarklets.html:3 msgid "Documentation" -msgstr "" +msgstr "Documentatie" #: contrib/admin/templates/admin/object_history.html:3 #: contrib/admin/templates/admin/change_list.html:5 @@ -770,9 +769,9 @@ msgid "None available" msgstr "Indisponibil" #: contrib/admin/templates/admin/change_list.html:11 -#, fuzzy, python-format +#, python-format msgid "Add %(name)s" -msgstr "Adaugă" +msgstr "Adaugă %(name)s" #: contrib/admin/templates/admin/login.html:22 msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?" @@ -785,7 +784,7 @@ msgstr "Bine ai venit," #: contrib/admin/templates/admin/delete_confirmation.html:9 #: contrib/admin/templates/admin/submit_line.html:3 msgid "Delete" -msgstr "" +msgstr "Sterge" #: contrib/admin/templates/admin/delete_confirmation.html:14 #, python-format @@ -814,7 +813,7 @@ msgstr "Da, sînt sigur" #: contrib/admin/templates/admin/filter.html:2 #, python-format msgid " By %(title)s " -msgstr "" +msgstr " Dupa %(title)s " #: contrib/admin/templates/admin/search_form.html:8 msgid "Go" @@ -827,33 +826,32 @@ msgstr "" #: contrib/admin/templates/admin/change_form.html:30 msgid "Please correct the error below." msgid_plural "Please correct the errors below." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Va rugam sa corectati eroarea de mai jos" +msgstr[1] "Va rugam sa corectati erorile de mai jos" #: contrib/admin/templates/admin/change_form.html:48 msgid "Ordering" -msgstr "" +msgstr "Ordonate dupa" #: contrib/admin/templates/admin/change_form.html:51 msgid "Order:" -msgstr "" +msgstr "Ordonare:" #: contrib/admin/templates/admin/submit_line.html:4 msgid "Save as new" -msgstr "" +msgstr "Salvati ca nou" #: contrib/admin/templates/admin/submit_line.html:5 msgid "Save and add another" -msgstr "" +msgstr "Salvati si adaugati altul" #: contrib/admin/templates/admin/submit_line.html:6 msgid "Save and continue editing" -msgstr "" +msgstr "Salvati si continuati" #: contrib/admin/templates/admin/submit_line.html:7 -#, fuzzy msgid "Save" -msgstr "activ" +msgstr "Salveaza" #: contrib/admin/templates/registration/password_change_done.html:4 #: contrib/admin/templates/registration/password_change_form.html:4 @@ -1133,24 +1131,20 @@ msgid "codename" msgstr "nume cod" #: contrib/auth/models.py:17 -#, fuzzy msgid "permission" -msgstr "Permisiune" +msgstr "permisiune" #: contrib/auth/models.py:18 contrib/auth/models.py:27 -#, fuzzy msgid "permissions" -msgstr "Permisiuni" +msgstr "permisiuni" #: contrib/auth/models.py:29 -#, fuzzy msgid "group" -msgstr "Grup" +msgstr "grup" #: contrib/auth/models.py:30 contrib/auth/models.py:65 -#, fuzzy msgid "groups" -msgstr "Grupuri" +msgstr "grupuri" #: contrib/auth/models.py:55 msgid "username" @@ -1209,19 +1203,16 @@ msgstr "" "permisiunile alocate fiecărui grup din care el/ea face parte." #: contrib/auth/models.py:67 -#, fuzzy msgid "user permissions" -msgstr "Permisiuni" +msgstr "permisiuni utilizator" #: contrib/auth/models.py:70 -#, fuzzy msgid "user" -msgstr "Utilizator" +msgstr "utilizator" #: contrib/auth/models.py:71 -#, fuzzy msgid "users" -msgstr "Utilizatori" +msgstr "utilizatori" #: contrib/auth/models.py:76 msgid "Personal info" @@ -1240,15 +1231,16 @@ msgid "Groups" msgstr "Grupuri" #: contrib/auth/models.py:219 -#, fuzzy msgid "message" -msgstr "Mesaj" +msgstr "mesaj" #: contrib/auth/forms.py:30 msgid "" "Your Web browser doesn't appear to have cookies enabled. Cookies are " "required for logging in." msgstr "" +"Se pare ca browserul dumneavoastra nu suporta cookies. Aveti nevoie de un " +"browser care suporta cookies ca sa va logati." #: contrib/contenttypes/models.py:25 #, fuzzy @@ -1277,7 +1269,7 @@ msgstr "data expirare" #: contrib/sessions/models.py:41 msgid "session" -msgstr "seiune" +msgstr "sesiune" #: contrib/sessions/models.py:42 msgid "sessions" @@ -1389,7 +1381,7 @@ msgstr "Decembrie" #: utils/dates.py:19 msgid "jan" -msgstr "" +msgstr "ian" #: utils/dates.py:19 msgid "feb" @@ -1404,17 +1396,16 @@ msgid "apr" msgstr "" #: utils/dates.py:19 -#, fuzzy msgid "may" -msgstr "Mai" +msgstr "mai" #: utils/dates.py:19 msgid "jun" -msgstr "" +msgstr "iun" #: utils/dates.py:20 msgid "jul" -msgstr "" +msgstr "iul" #: utils/dates.py:20 msgid "aug" @@ -1430,7 +1421,7 @@ msgstr "" #: utils/dates.py:20 msgid "nov" -msgstr "" +msgstr "noi" #: utils/dates.py:20 msgid "dec" @@ -1467,40 +1458,38 @@ msgstr "Dec." #: utils/timesince.py:12 msgid "year" msgid_plural "years" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "an" +msgstr[1] "ani" #: utils/timesince.py:13 msgid "month" msgid_plural "months" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "luna" +msgstr[1] "luni" #: utils/timesince.py:14 msgid "week" msgid_plural "weeks" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "saptamana" +msgstr[1] "saptamani" #: utils/timesince.py:15 -#, fuzzy msgid "day" msgid_plural "days" -msgstr[0] "Mai" -msgstr[1] "Mai" +msgstr[0] "zi" +msgstr[1] "zile" #: utils/timesince.py:16 msgid "hour" msgid_plural "hours" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "ora" +msgstr[1] "ore" #: utils/timesince.py:17 -#, fuzzy msgid "minute" msgid_plural "minutes" -msgstr[0] "sit" -msgstr[1] "sit" +msgstr[0] "minut" +msgstr[1] "minute" #: conf/global_settings.py:37 msgid "Bengali" @@ -1545,7 +1534,7 @@ msgstr "Galiciană" #: conf/global_settings.py:47 msgid "Hungarian" -msgstr "" +msgstr "Ungara" #: conf/global_settings.py:48 msgid "Hebrew" @@ -1577,7 +1566,7 @@ msgstr "Braziliană" #: conf/global_settings.py:55 msgid "Romanian" -msgstr "" +msgstr "Romana" #: conf/global_settings.py:56 msgid "Russian" @@ -1750,7 +1739,7 @@ msgstr[1] "Îngrijiţi-vă limbajul! Cuvintele %s nu sînt permise aici." #: core/validators.py:236 #, python-format msgid "This field must match the '%s' field." -msgstr "" +msgstr "Acest camp trebuie sa fie identic cu '%s'." #: core/validators.py:255 #, fuzzy @@ -1897,9 +1886,8 @@ msgstr "" #: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265 #: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553 #: forms/__init__.py:346 -#, fuzzy msgid "This field is required." -msgstr "Cîmpul este invalid." +msgstr "Campul acesta trebuie completat obligatoriu." #: db/models/fields/__init__.py:337 #, fuzzy @@ -1917,14 +1905,13 @@ msgid "This field cannot be null." msgstr "Cîmpul este invalid." #: db/models/fields/__init__.py:562 -#, fuzzy msgid "Enter a valid filename." -msgstr "Introduceţi o adresă de email validă." +msgstr "Introduceti un nume de fisier valid." #: db/models/fields/related.py:43 -#, fuzzy, python-format +#, python-format msgid "Please enter a valid %s." -msgstr "Introduceţi vă rog o adresă IP validă." +msgstr "Introduceti va rog un %s valid." #: db/models/fields/related.py:579 #, fuzzy @@ -1953,6 +1940,7 @@ msgid "Ensure your text is less than %s character." msgid_plural "Ensure your text is less than %s characters." msgstr[0] "" msgstr[1] "" +"Va rugam asigurati-va ca textul dumneavoastra are mai putin de %s caractere." #: forms/__init__.py:385 #, fuzzy @@ -1966,7 +1954,7 @@ msgstr "" #: forms/__init__.py:645 msgid "The submitted file is empty." -msgstr "" +msgstr "Fisierul uploadat este gol" #: forms/__init__.py:699 #, fuzzy @@ -1985,7 +1973,7 @@ msgstr "Introduceţi un număr întreg." #: template/defaultfilters.py:379 msgid "yes,no,maybe" -msgstr "" +msgstr "da,nu,poate" #, fuzzy #~ msgid "Comments" diff --git a/django/conf/locale/ro/LC_MESSAGES/djangojs.mo b/django/conf/locale/ro/LC_MESSAGES/djangojs.mo Binary files differnew file mode 100644 index 0000000000..1db40df910 --- /dev/null +++ b/django/conf/locale/ro/LC_MESSAGES/djangojs.mo diff --git a/django/conf/locale/ro/LC_MESSAGES/djangojs.po b/django/conf/locale/ro/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000000..4084313848 --- /dev/null +++ b/django/conf/locale/ro/LC_MESSAGES/djangojs.po @@ -0,0 +1,118 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-06-28 17:36+1000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: contrib/admin/media/js/SelectFilter2.js:33 +#, perl-format +msgid "Available %s" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:41 +msgid "Choose all" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:46 +msgid "Add" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:48 +msgid "Remove" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:53 +#, perl-format +msgid "Chosen %s" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:54 +msgid "Select your choice(s) and click " +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:59 +msgid "Clear all" +msgstr "" + +#: contrib/admin/media/js/dateparse.js:32 +#: contrib/admin/media/js/calendar.js:24 +msgid "" +"January February March April May June July August September October November " +"December" +msgstr "" + +#: contrib/admin/media/js/dateparse.js:33 +msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday" +msgstr "" + +#: contrib/admin/media/js/calendar.js:25 +msgid "S M T W T F S" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81 +msgid "Now" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51 +msgid "Clock" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78 +msgid "Choose a time" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82 +msgid "Midnight" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83 +msgid "6 a.m." +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84 +msgid "Noon" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183 +msgid "Cancel" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177 +msgid "Today" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132 +msgid "Calendar" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175 +msgid "Yesterday" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179 +msgid "Tomorrow" +msgstr "" + +#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34 +#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72 +msgid "Show" +msgstr "" + +#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63 +msgid "Hide" +msgstr "" diff --git a/django/conf/locale/uk/LC_MESSAGES/djangojs.mo b/django/conf/locale/uk/LC_MESSAGES/djangojs.mo Binary files differnew file mode 100644 index 0000000000..1db40df910 --- /dev/null +++ b/django/conf/locale/uk/LC_MESSAGES/djangojs.mo diff --git a/django/conf/locale/uk/LC_MESSAGES/djangojs.po b/django/conf/locale/uk/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000000..4084313848 --- /dev/null +++ b/django/conf/locale/uk/LC_MESSAGES/djangojs.po @@ -0,0 +1,118 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-06-28 17:36+1000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: contrib/admin/media/js/SelectFilter2.js:33 +#, perl-format +msgid "Available %s" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:41 +msgid "Choose all" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:46 +msgid "Add" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:48 +msgid "Remove" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:53 +#, perl-format +msgid "Chosen %s" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:54 +msgid "Select your choice(s) and click " +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:59 +msgid "Clear all" +msgstr "" + +#: contrib/admin/media/js/dateparse.js:32 +#: contrib/admin/media/js/calendar.js:24 +msgid "" +"January February March April May June July August September October November " +"December" +msgstr "" + +#: contrib/admin/media/js/dateparse.js:33 +msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday" +msgstr "" + +#: contrib/admin/media/js/calendar.js:25 +msgid "S M T W T F S" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81 +msgid "Now" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51 +msgid "Clock" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78 +msgid "Choose a time" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82 +msgid "Midnight" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83 +msgid "6 a.m." +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84 +msgid "Noon" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183 +msgid "Cancel" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177 +msgid "Today" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132 +msgid "Calendar" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175 +msgid "Yesterday" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179 +msgid "Tomorrow" +msgstr "" + +#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34 +#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72 +msgid "Show" +msgstr "" + +#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63 +msgid "Hide" +msgstr "" diff --git a/django/conf/locale/zh_TW/LC_MESSAGES/djangojs.mo b/django/conf/locale/zh_TW/LC_MESSAGES/djangojs.mo Binary files differnew file mode 100644 index 0000000000..1db40df910 --- /dev/null +++ b/django/conf/locale/zh_TW/LC_MESSAGES/djangojs.mo diff --git a/django/conf/locale/zh_TW/LC_MESSAGES/djangojs.po b/django/conf/locale/zh_TW/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000000..4084313848 --- /dev/null +++ b/django/conf/locale/zh_TW/LC_MESSAGES/djangojs.po @@ -0,0 +1,118 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-06-28 17:36+1000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: contrib/admin/media/js/SelectFilter2.js:33 +#, perl-format +msgid "Available %s" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:41 +msgid "Choose all" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:46 +msgid "Add" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:48 +msgid "Remove" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:53 +#, perl-format +msgid "Chosen %s" +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:54 +msgid "Select your choice(s) and click " +msgstr "" + +#: contrib/admin/media/js/SelectFilter2.js:59 +msgid "Clear all" +msgstr "" + +#: contrib/admin/media/js/dateparse.js:32 +#: contrib/admin/media/js/calendar.js:24 +msgid "" +"January February March April May June July August September October November " +"December" +msgstr "" + +#: contrib/admin/media/js/dateparse.js:33 +msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday" +msgstr "" + +#: contrib/admin/media/js/calendar.js:25 +msgid "S M T W T F S" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81 +msgid "Now" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51 +msgid "Clock" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78 +msgid "Choose a time" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82 +msgid "Midnight" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83 +msgid "6 a.m." +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84 +msgid "Noon" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183 +msgid "Cancel" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177 +msgid "Today" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132 +msgid "Calendar" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175 +msgid "Yesterday" +msgstr "" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179 +msgid "Tomorrow" +msgstr "" + +#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34 +#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72 +msgid "Show" +msgstr "" + +#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63 +msgid "Hide" +msgstr "" diff --git a/django/conf/project_template/settings.py b/django/conf/project_template/settings.py index 36039d7e98..8b3617d4b6 100644 --- a/django/conf/project_template/settings.py +++ b/django/conf/project_template/settings.py @@ -9,7 +9,7 @@ ADMINS = ( MANAGERS = ADMINS -DATABASE_ENGINE = '' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'. +DATABASE_ENGINE = '' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. DATABASE_NAME = '' # Or path to database file if using sqlite3. DATABASE_USER = '' # Not used with sqlite3. DATABASE_PASSWORD = '' # Not used with sqlite3. diff --git a/django/core/mail.py b/django/core/mail.py index 9190a55989..4cfb5f37cb 100644 --- a/django/core/mail.py +++ b/django/core/mail.py @@ -4,10 +4,13 @@ Tools for sending email. from django.conf import settings from django.utils.encoding import smart_str, force_unicode +from email import Charset, Encoders from email.MIMEText import MIMEText +from email.MIMEMultipart import MIMEMultipart +from email.MIMEBase import MIMEBase from email.Header import Header from email.Utils import formatdate, parseaddr, formataddr -from email import Charset +import mimetypes import os import smtplib import socket @@ -18,6 +21,10 @@ import random # some spam filters. Charset.add_charset('utf-8', Charset.SHORTEST, Charset.QP, 'utf-8') +# Default MIME type to use on attachments (if it is not explicitly given +# and cannot be guessed). +DEFAULT_ATTACHMENT_MIME_TYPE = 'application/octet-stream' + # Cache the hostname, but do it lazily: socket.getfqdn() can take a couple of # seconds, which slows down the restart of the server. class CachedDnsName(object): @@ -56,7 +63,7 @@ def make_msgid(idstring=None): class BadHeaderError(ValueError): pass -class SafeMIMEText(MIMEText): +class SafeHeaderMixin(object): def __setitem__(self, name, val): "Forbids multi-line headers, to prevent header injection." if '\n' in val or '\r' in val: @@ -73,7 +80,15 @@ class SafeMIMEText(MIMEText): val = ', '.join(result) else: val = Header(force_unicode(val), settings.DEFAULT_CHARSET) - MIMEText.__setitem__(self, name, val) + # Note: using super() here is safe; any __setitem__ overrides must use + # the same argument signature. + super(SafeHeaderMixin, self).__setitem__(name, val) + +class SafeMIMEText(MIMEText, SafeHeaderMixin): + pass + +class SafeMIMEMultipart(MIMEMultipart, SafeHeaderMixin): + pass class SMTPConnection(object): """ @@ -165,7 +180,12 @@ class EmailMessage(object): """ A container for email information. """ - def __init__(self, subject='', body='', from_email=None, to=None, bcc=None, connection=None): + content_subtype = 'plain' + multipart_subtype = 'mixed' + encoding = None # None => use settings default + + def __init__(self, subject='', body='', from_email=None, to=None, bcc=None, + connection=None, attachments=None, headers=None): """ Initialise a single email message (which can be sent to multiple recipients). @@ -179,6 +199,8 @@ class EmailMessage(object): self.from_email = from_email or settings.DEFAULT_FROM_EMAIL self.subject = subject self.body = body + self.attachments = attachments or [] + self.extra_headers = headers or {} self.connection = connection def get_connection(self, fail_silently=False): @@ -187,7 +209,18 @@ class EmailMessage(object): return self.connection def message(self): - msg = SafeMIMEText(smart_str(self.body, settings.DEFAULT_CHARSET), 'plain', settings.DEFAULT_CHARSET) + encoding = self.encoding or settings.DEFAULT_CHARSET + msg = SafeMIMEText(smart_str(self.body, settings.DEFAULT_CHARSET), self.content_subtype, encoding) + if self.attachments: + body_msg = msg + msg = SafeMIMEMultipart(_subtype=self.multipart_subtype) + if self.body: + msg.attach(body_msg) + for attachment in self.attachments: + if isinstance(attachment, MIMEBase): + msg.attach(attachment) + else: + msg.attach(self._create_attachment(*attachment)) msg['Subject'] = self.subject msg['From'] = self.from_email msg['To'] = ', '.join(self.to) @@ -195,6 +228,8 @@ class EmailMessage(object): msg['Message-ID'] = make_msgid() if self.bcc: msg['Bcc'] = ', '.join(self.bcc) + for name, value in self.extra_headers.items(): + msg[name] = value return msg def recipients(self): @@ -208,6 +243,61 @@ class EmailMessage(object): """Send the email message.""" return self.get_connection(fail_silently).send_messages([self]) + def attach(self, filename=None, content=None, mimetype=None): + """ + Attaches a file with the given filename and content. The filename can + be omitted (useful for multipart/alternative messages) and the mimetype + is guessed, if not provided. + + If the first parameter is a MIMEBase subclass it is inserted directly + into the resulting message attachments. + """ + if isinstance(filename, MIMEBase): + assert content == mimetype == None + self.attachements.append(filename) + else: + assert content is not None + self.attachments.append((filename, content, mimetype)) + + def attach_file(self, path, mimetype=None): + """Attaches a file from the filesystem.""" + filename = os.path.basename(path) + content = open(path, 'rb').read() + self.attach(filename, content, mimetype) + + def _create_attachment(self, filename, content, mimetype=None): + """ + Convert the filename, content, mimetype triple into a MIME attachment + object. + """ + if mimetype is None: + mimetype, _ = mimetypes.guess_type(filename) + if mimetype is None: + mimetype = DEFAULT_ATTACHMENT_MIME_TYPE + basetype, subtype = mimetype.split('/', 1) + if basetype == 'text': + attachment = SafeMIMEText(content, subtype, settings.DEFAULT_CHARSET) + else: + # Encode non-text attachments with base64. + attachment = MIMEBase(basetype, subtype) + attachment.set_payload(content) + Encoders.encode_base64(attachment) + if filename: + attachment.add_header('Content-Disposition', 'attachment', filename=filename) + return attachment + +class EmailMultiAlternatives(EmailMessage): + """ + A version of EmailMessage that makes it easy to send multipart/alternative + messages. For example, including text and HTML versions of the text is + made easier. + """ + multipart_subtype = 'alternative' + + def attach_alternative(self, content, mimetype=None): + """Attach an alternative content representation.""" + self.attach(content=content, mimetype=mimetype) + def send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None): """ Easy wrapper for sending a single message to a recipient list. All members diff --git a/django/core/urlresolvers.py b/django/core/urlresolvers.py index b2cc86708d..7de840d578 100644 --- a/django/core/urlresolvers.py +++ b/django/core/urlresolvers.py @@ -202,7 +202,7 @@ class RegexURLResolver(object): self._reverse_dict = {} def _get_reverse_dict(self): - if not self._reverse_dict: + if not self._reverse_dict and hasattr(self.urlconf_module, 'urlpatterns'): for pattern in reversed(self.urlconf_module.urlpatterns): if isinstance(pattern, RegexURLResolver): for key, value in pattern.reverse_dict.iteritems(): diff --git a/django/db/backends/dummy/base.py b/django/db/backends/dummy/base.py index 6a190cf59c..f47cbdf3d4 100644 --- a/django/db/backends/dummy/base.py +++ b/django/db/backends/dummy/base.py @@ -41,11 +41,16 @@ dictfetchall = complain get_last_insert_id = complain get_date_extract_sql = complain get_date_trunc_sql = complain +get_datetime_cast_sql = complain get_limit_offset_sql = complain get_random_function_sql = complain get_deferrable_sql = complain get_fulltext_search_sql = complain get_drop_foreignkey_sql = complain +get_pk_default_value = complain +get_max_name_length = ignore +get_start_transaction_sql = complain +get_autoinc_sql = complain get_sql_flush = complain get_sql_sequence_reset = complain diff --git a/django/db/backends/mysql/base.py b/django/db/backends/mysql/base.py index a6d56406d6..25ae2fa84f 100644 --- a/django/db/backends/mysql/base.py +++ b/django/db/backends/mysql/base.py @@ -247,6 +247,8 @@ OPERATOR_MAPPING = { 'iexact': 'LIKE %s', 'contains': 'LIKE BINARY %s', 'icontains': 'LIKE %s', + 'regex': 'REGEXP BINARY %s', + 'iregex': 'REGEXP %s', 'gt': '> %s', 'gte': '>= %s', 'lt': '< %s', diff --git a/django/db/backends/mysql_old/base.py b/django/db/backends/mysql_old/base.py index 4a14fa822a..0a5c127e81 100644 --- a/django/db/backends/mysql_old/base.py +++ b/django/db/backends/mysql_old/base.py @@ -250,6 +250,8 @@ OPERATOR_MAPPING = { 'iexact': 'LIKE %s', 'contains': 'LIKE BINARY %s', 'icontains': 'LIKE %s', + 'regex': 'REGEXP BINARY %s', + 'iregex': 'REGEXP %s', 'gt': '> %s', 'gte': '>= %s', 'lt': '< %s', diff --git a/django/db/backends/postgresql/base.py b/django/db/backends/postgresql/base.py index e2051beaa2..d90f0cc225 100644 --- a/django/db/backends/postgresql/base.py +++ b/django/db/backends/postgresql/base.py @@ -300,6 +300,8 @@ OPERATOR_MAPPING = { 'iexact': 'ILIKE %s', 'contains': 'LIKE %s', 'icontains': 'ILIKE %s', + 'regex': '~ %s', + 'iregex': '~* %s', 'gt': '> %s', 'gte': '>= %s', 'lt': '< %s', diff --git a/django/db/backends/postgresql_psycopg2/base.py b/django/db/backends/postgresql_psycopg2/base.py index 4a9a44b3f9..c0ecbf80e9 100644 --- a/django/db/backends/postgresql_psycopg2/base.py +++ b/django/db/backends/postgresql_psycopg2/base.py @@ -229,6 +229,8 @@ OPERATOR_MAPPING = { 'iexact': 'ILIKE %s', 'contains': 'LIKE %s', 'icontains': 'ILIKE %s', + 'regex': '~ %s', + 'iregex': '~* %s', 'gt': '> %s', 'gte': '>= %s', 'lt': '< %s', diff --git a/django/db/backends/sqlite3/base.py b/django/db/backends/sqlite3/base.py index d31d11fea6..a0b1341b53 100644 --- a/django/db/backends/sqlite3/base.py +++ b/django/db/backends/sqlite3/base.py @@ -56,9 +56,10 @@ class DatabaseWrapper(local): } kwargs.update(self.options) self.connection = Database.connect(**kwargs) - # Register extract and date_trunc functions. + # Register extract, date_trunc, and regexp functions. self.connection.create_function("django_extract", 2, _sqlite_extract) self.connection.create_function("django_date_trunc", 2, _sqlite_date_trunc) + self.connection.create_function("regexp", 2, _sqlite_regexp) cursor = self.connection.cursor(factory=SQLiteCursorWrapper) if settings.DEBUG: return util.CursorDebugWrapper(cursor, self) @@ -206,6 +207,13 @@ def _sqlite_date_trunc(lookup_type, dt): elif lookup_type == 'day': return "%i-%02i-%02i 00:00:00" % (dt.year, dt.month, dt.day) +def _sqlite_regexp(re_pattern, re_string): + import re + try: + return bool(re.search(re_pattern, re_string)) + except: + return False + # SQLite requires LIKE statements to include an ESCAPE clause if the value # being escaped has a percent or underscore in it. # See http://www.sqlite.org/lang_expr.html for an explanation. @@ -214,6 +222,8 @@ OPERATOR_MAPPING = { 'iexact': "LIKE %s ESCAPE '\\'", 'contains': "LIKE %s ESCAPE '\\'", 'icontains': "LIKE %s ESCAPE '\\'", + 'regex': 'REGEXP %s', + 'iregex': "REGEXP '(?i)' || %s", 'gt': '> %s', 'gte': '>= %s', 'lt': '< %s', diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 167155fdbb..7ef532eab6 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -175,7 +175,7 @@ class Field(object): def get_db_prep_lookup(self, lookup_type, value): "Returns field's value prepared for database lookup." - if lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte', 'month', 'day', 'search'): + if lookup_type in ('exact', 'regex', 'iregex', 'gt', 'gte', 'lt', 'lte', 'month', 'day', 'search'): return [value] elif lookup_type in ('range', 'in'): return value @@ -801,6 +801,7 @@ class IntegerField(Field): return super(IntegerField, self).formfield(**defaults) class IPAddressField(Field): + empty_strings_allowed = False def __init__(self, *args, **kwargs): kwargs['maxlength'] = 15 Field.__init__(self, *args, **kwargs) diff --git a/django/db/models/query.py b/django/db/models/query.py index 076fa15fae..5771f3d7d9 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -1,3 +1,4 @@ +from django.conf import settings from django.db import backend, connection, transaction from django.db.models.fields import DateField, FieldDoesNotExist from django.db.models import signals, loading @@ -23,6 +24,7 @@ QUERY_TERMS = ( 'gt', 'gte', 'lt', 'lte', 'in', 'startswith', 'istartswith', 'endswith', 'iendswith', 'range', 'year', 'month', 'day', 'isnull', 'search', + 'regex', 'iregex', ) # Size of each "chunk" for get_iterator calls. @@ -798,6 +800,15 @@ def get_where_clause(lookup_type, table_prefix, field_name, value): return "%s%s IS %sNULL" % (table_prefix, field_name, (not value and 'NOT ' or '')) elif lookup_type == 'search': return backend.get_fulltext_search_sql(table_prefix + field_name) + elif lookup_type in ('regex', 'iregex'): + if settings.DATABASE_ENGINE == 'oracle': + if lookup_type == 'regex': + match_option = 'c' + else: + match_option = 'i' + return "REGEXP_LIKE(%s%s, %s, '%s')" % (table_prefix, field_name, cast_sql, match_option) + else: + raise NotImplementedError raise TypeError, "Got invalid lookup_type: %s" % repr(lookup_type) def get_cached_row(klass, row, index_start, max_depth=0, cur_depth=0): diff --git a/django/http/__init__.py b/django/http/__init__.py index b5af9b6e6a..76f9246ca6 100644 --- a/django/http/__init__.py +++ b/django/http/__init__.py @@ -214,7 +214,7 @@ class HttpResponse(object): status_code = 200 - def __init__(self, content='', mimetype=None): + def __init__(self, content='', mimetype=None, status=None): from django.conf import settings self._charset = settings.DEFAULT_CHARSET if not mimetype: @@ -227,6 +227,8 @@ class HttpResponse(object): self._is_string = True self.headers = {'Content-Type': mimetype} self.cookies = SimpleCookie() + if status: + self.status_code = status def __str__(self): "Full HTTP message, including headers" diff --git a/django/newforms/fields.py b/django/newforms/fields.py index a91e5af450..b6abea6400 100644 --- a/django/newforms/fields.py +++ b/django/newforms/fields.py @@ -482,17 +482,18 @@ class ComboField(Field): class MultiValueField(Field): """ - A Field that is composed of multiple Fields. - - Its clean() method takes a "decompressed" list of values. Each value in + A Field that aggregates the logic of multiple Fields. + + Its clean() method takes a "decompressed" list of values, which are then + cleaned into a single value according to self.fields. Each value in this list is cleaned by the corresponding field -- the first value is cleaned by the first field, the second value is cleaned by the second field, etc. Once all fields are cleaned, the list of clean values is "compressed" into a single value. - Subclasses should implement compress(), which specifies how a list of - valid values should be converted to a single value. Subclasses should not - have to implement clean(). + Subclasses should not have to implement clean(). Instead, they must + implement compress(), which takes a list of valid values and returns a + "compressed" version of those values -- a single value. You'll probably want to use this with MultiWidget. """ diff --git a/django/newforms/widgets.py b/django/newforms/widgets.py index 50de37074a..b90e6df9cd 100644 --- a/django/newforms/widgets.py +++ b/django/newforms/widgets.py @@ -304,19 +304,28 @@ class MultiWidget(Widget): """ A widget that is composed of multiple widgets. - Its render() method takes a "decompressed" list of values, not a single - value. Each value in this list is rendered in the corresponding widget -- - the first value is rendered in the first widget, the second value is - rendered in the second widget, etc. + Its render() method is different than other widgets', because it has to + figure out how to split a single value for display in multiple widgets. + The ``value`` argument can be one of two things: - Subclasses should implement decompress(), which specifies how a single - value should be converted to a list of values. Subclasses should not - have to implement clean(). + * A list. + * A normal value (e.g., a string) that has been "compressed" from + a list of values. + + In the second case -- i.e., if the value is NOT a list -- render() will + first "decompress" the value into a list before rendering it. It does so by + calling the decompress() method, which MultiWidget subclasses must + implement. This method takes a single "compressed" value and returns a + list. + + When render() does its HTML rendering, each value in the list is rendered + with the corresponding widget -- the first value is rendered in the first + widget, the second value is rendered in the second widget, etc. Subclasses may implement format_output(), which takes the list of rendered - widgets and returns HTML that formats them any way you'd like. + widgets and returns a string of HTML that formats them any way you'd like. - You'll probably want to use this with MultiValueField. + You'll probably want to use this class with MultiValueField. """ def __init__(self, widgets, attrs=None): self.widgets = [isinstance(w, type) and w() or w for w in widgets] @@ -351,6 +360,13 @@ class MultiWidget(Widget): return [widget.value_from_datadict(data, name + '_%s' % i) for i, widget in enumerate(self.widgets)] def format_output(self, rendered_widgets): + """ + Given a list of rendered widgets (as strings), returns a Unicode string + representing the HTML for the whole lot. + + This hook allows you to format the HTML design of the widgets, if + needed. + """ return u''.join(rendered_widgets) def decompress(self, value): diff --git a/docs/authentication.txt b/docs/authentication.txt index 972ca42073..efe4d47513 100644 --- a/docs/authentication.txt +++ b/docs/authentication.txt @@ -325,7 +325,7 @@ Manually checking a user's password If you'd like to manually authenticate a user by comparing a plain-text password to the hashed password in the database, use the -convenience function `django.contrib.auth.models.check_password`. It +convenience function ``django.contrib.auth.models.check_password``. It takes two arguments: the plain-text password to check, and the full value of a user's ``password`` field in the database to check against, and returns ``True`` if they match, ``False`` otherwise. @@ -461,7 +461,7 @@ block:: Other built-in views -------------------- -In addition to the `login` view, the authentication system includes a +In addition to the ``login`` view, the authentication system includes a few other useful built-in views: ``django.contrib.auth.views.logout`` diff --git a/docs/contributing.txt b/docs/contributing.txt index 3880a1e13e..fa16f858b6 100644 --- a/docs/contributing.txt +++ b/docs/contributing.txt @@ -383,6 +383,65 @@ Model style ('F', 'Female'), ) +Documentation style +=================== + +We place a high importance on consistency and readability of documentation. +(After all, Django was created in a journalism environment!) + +Guidelines for ReST files +------------------------- + +These guidelines regulate the format of our ReST documentation: + + * In section titles, capitalize only initial words and proper nouns. + + * Wrap the documentation at 80 characters wide, unless a code example + is significantly less readable when split over two lines, or for another + good reason. + +Commonly used terms +------------------- + +Here are some style guidelines on commonly used terms throughout the +documentation: + + * **Django** -- when referring to the framework, capitalize Django. It is + lowercase only in Python code and in the djangoproject.com logo. + + * **e-mail** -- it has a hyphen. + + * **MySQL** + + * **PostgreSQL** + + * **Python** -- when referring to the language, capitalize Python. + + * **realize**, **customize**, **initialize**, etc. -- use the American + "ize" suffix, not "ise." + + * **SQLite** + + * **subclass** -- it's a single word without a hyphen, both as a verb + ("subclass that model") and as a noun ("create a subclass"). + + * **Web**, **World Wide Web**, **the Web** -- note Web is always + capitalized when referring to the World Wide Web. + + * **Web site** -- use two words, with Web capitalized. + +Django-specific terminology +--------------------------- + + * **model** -- it's not capitalized. + + * **template** -- it's not capitalized. + + * **URLconf** -- use three capitalized letters, with no space before + "conf." + + * **view** -- it's not capitalized. + Committing code =============== diff --git a/docs/db-api.txt b/docs/db-api.txt index 38510ef530..ef3d811189 100644 --- a/docs/db-api.txt +++ b/docs/db-api.txt @@ -1173,6 +1173,58 @@ like ``contains`` but is significantly faster due to full-text indexing. Note this is only available in MySQL and requires direct manipulation of the database to add the full-text index. +regex +~~~~~ + +**New in Django development version** + +Case-sensitive regular expression match. + +The regular expression syntax is that of the database backend in use. In the +case of SQLite, which doesn't natively support regular-expression lookups, the +syntax is that of Python's ``re`` module. + +Example:: + + Entry.objects.get(title__regex=r'^(An?|The) +') + +SQL equivalents:: + + SELECT ... WHERE title REGEXP BINARY '^(An?|The) +'; -- MySQL + + SELECT ... WHERE REGEXP_LIKE(title, '^(an?|the) +', 'c'); -- Oracle + + SELECT ... WHERE title ~ '^(An?|The) +'; -- PostgreSQL + + SELECT ... WHERE title REGEXP '^(An?|The) +'; -- SQLite + +Using raw strings (e.g., ``r'foo'`` instead of ``'foo'``) for passing in the +regular expression syntax is recommended. + +Regular expression matching is not supported on the ``ado_mssql`` backend. +It will raise a ``NotImplementedError`` at runtime. + +iregex +~~~~~~ + +**New in Django development version** + +Case-insensitive regular expression match. + +Example:: + + Entry.objects.get(title__iregex=r'^(an?|the) +') + +SQL equivalents:: + + SELECT ... WHERE title REGEXP '^(an?|the) +'; -- MySQL + + SELECT ... WHERE REGEXP_LIKE(title, '^(an?|the) +', 'i'); -- Oracle + + SELECT ... WHERE title ~* '^(an?|the) +'; -- PostgreSQL + + SELECT ... WHERE title REGEXP '(?i)^(an?|the) +'; -- SQLite + Default lookups are exact ------------------------- @@ -1779,7 +1831,7 @@ use the default manager, or if you want to search a list of related objects, you can provide ``get_object_or_404()`` with a manager object instead. For example:: - # Get the author of blog instance `e` with a name of 'Fred' + # Get the author of blog instance e with a name of 'Fred' a = get_object_or_404(e.authors, name='Fred') # Use a custom manager 'recent_entries' in the search for an diff --git a/docs/django-admin.txt b/docs/django-admin.txt index d20db7edc9..75c2738543 100644 --- a/docs/django-admin.txt +++ b/docs/django-admin.txt @@ -513,7 +513,7 @@ Example usage:: Verbosity determines the amount of notification and debug information that will be printed to the console. '0' is no output, '1' is normal output, -and `2` is verbose output. +and ``2`` is verbose output. --adminmedia ------------ diff --git a/docs/email.txt b/docs/email.txt index 66948e5294..50dafaf8df 100644 --- a/docs/email.txt +++ b/docs/email.txt @@ -28,9 +28,9 @@ settings, if set, are used to authenticate to the SMTP server, and the .. note:: The character set of e-mail sent with ``django.core.mail`` will be set to - the value of your `DEFAULT_CHARSET setting`_. + the value of your `DEFAULT_CHARSET`_ setting. -.. _DEFAULT_CHARSET setting: ../settings/#default-charset +.. _DEFAULT_CHARSET: ../settings/#default-charset .. _EMAIL_HOST: ../settings/#email-host .. _EMAIL_PORT: ../settings/#email-port .. _EMAIL_HOST_USER: ../settings/#email-host-user @@ -198,27 +198,58 @@ e-mail, you can subclass these two classes to suit your needs. .. note:: Not all features of the ``EmailMessage`` class are available through the ``send_mail()`` and related wrapper functions. If you wish to use advanced - features, such as BCC'ed recipients or multi-part e-mail, you'll need to - create ``EmailMessage`` instances directly. + features, such as BCC'ed recipients, file attachments, or multi-part + e-mail, you'll need to create ``EmailMessage`` instances directly. + + This is a design feature. ``send_mail()`` and related functions were + originally the only interface Django provided. However, the list of + parameters they accepted was slowly growing over time. It made sense to + move to a more object-oriented design for e-mail messages and retain the + original functions only for backwards compatibility. In general, ``EmailMessage`` is responsible for creating the e-mail message itself. ``SMTPConnection`` is responsible for the network connection side of the operation. This means you can reuse the same connection (an ``SMTPConnection`` instance) for multiple messages. -The ``EmailMessage`` class is initialized as follows:: +E-mail messages +--------------- + +The ``EmailMessage`` class is initialized with the following parameters (in +the given order, if positional arguments are used). All parameters are +optional and can be set at any time prior to calling the ``send()`` method. + + * ``subject``: The subject line of the e-mail. + + * ``body``: The body text. This should be a plain text message. + + * ``from_email``: The sender's address. Both ``fred@example.com`` and + ``Fred <fred@example.com>`` forms are legal. If omitted, the + ``DEFAULT_FROM_EMAIL`` setting is used. - email = EmailMessage(subject, body, from_email, to, bcc, connection) + * ``to``: A list or tuple of recipient addresses. -All of these parameters are optional. If ``from_email`` is omitted, the value -from ``settings.DEFAULT_FROM_EMAIL`` is used. Both the ``to`` and ``bcc`` -parameters are lists of addresses, as strings. + * ``bcc``: A list or tuple of addresses used in the "Bcc" header when + sending the e-mail. + + * ``connection``: An ``SMTPConnection`` instance. Use this parameter if + you want to use the same conneciton for multiple messages. If omitted, a + new connection is created when ``send()`` is called. + + * ``attachments``: A list of attachments to put on the message. These can + be either ``email.MIMEBase.MIMEBase`` instances, or ``(filename, + content, mimetype)`` triples. + + * ``headers``: A dictionary of extra headers to put on the message. The + keys are the header name, values are the header values. It's up to the + caller to ensure header names and values are in the correct format for + an e-mail message. For example:: email = EmailMessage('Hello', 'Body goes here', 'from@example.com', - ['to1@example.com', 'to2@example.com'], - ['bcc@example.com']) + ['to1@example.com', 'to2@example.com'], ['bcc@example.com'], + headers = {'Reply-To': 'another@example.com'}) The class has the following methods: @@ -227,18 +258,83 @@ The class has the following methods: if none already exists. * ``message()`` constructs a ``django.core.mail.SafeMIMEText`` object (a - sub-class of Python's ``email.MIMEText.MIMEText`` class) holding the - message to be sent. If you ever need to extend the `EmailMessage` class, - you'll probably want to override this method to put the content you wish + subclass of Python's ``email.MIMEText.MIMEText`` class) or a + ``django.core.mail.SafeMIMEMultipart`` object holding the + message to be sent. If you ever need to extend the ``EmailMessage`` class, + you'll probably want to override this method to put the content you want into the MIME object. * ``recipients()`` returns a list of all the recipients of the message, whether they're recorded in the ``to`` or ``bcc`` attributes. This is - another method you might need to override when sub-classing, because the + another method you might need to override when subclassing, because the SMTP server needs to be told the full list of recipients when the message is sent. If you add another way to specify recipients in your class, they need to be returned from this method as well. + * ``attach()`` creates a new file attachment and adds it to the message. + There are two ways to call ``attach()``: + + * You can pass it a single argument that is an + ``email.MIMBase.MIMEBase`` instance. This will be inserted directly + into the resulting message. + + * Alternatively, you can pass ``attach()`` three arguments: + ``filename``, ``content`` and ``mimetype``. ``filename`` is the name + of the file attachment as it will appear in the e-mail, ``content`` is + the data that will be contained inside the attachment and + ``mimetype`` is the optional MIME type for the attachment. If you + omit ``mimetype``, the MIME content type will be guessed from the + filename of the attachment. + + For example:: + + message.attach('design.png', img_data, 'image/png') + + * ``attach_file()`` creates a new attachment using a file from your + filesystem. Call it with the path of the file to attach and, optionally, + the MIME type to use for the attachment. If the MIME type is omitted, it + will be guessed from the filename. The simplest use would be:: + + message.attach_file('/images/weather_map.png') + +Sending alternative content types +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +It can be useful to include multiple versions of the content in an e-mail; +the classic example is to send both text and HTML versions of a message. With +Django's e-mail library, you can do this using the ``EmailMultiAlternatives`` +class. This subclass of ``EmailMessage`` has an ``attach_alternative()`` method +for including extra versions of the message body in the e-mail. All the other +methods (including the class initialization) are inherited directly from +``EmailMessage``. + +To send a text and HTML combination, you could write:: + + from django.core.mail import EmailMultiAlternatives + + subject, from_email, to = 'hello', 'from@example.com', 'to@example.com' + text_content = 'This is an important message.' + html_content = '<p>This is an <strong>important</strong> message.' + msg = EmailMultiAlternatives(subject, text_content, from_email, to) + msg.attach_alternative(html_content, "text/html") + msg.send() + +By default, the MIME type of the ``body`` parameter in an ``EmailMessage`` is +``"text/plain"``. It is good practice to leave this alone, because it +guarantees that any recipient will be able to read the e-mail, regardless of +their mail client. However, if you are confident that your recipients can +handle an alternative content type, you can use the ``content_subtype`` +attribute on the ``EmailMessage`` class to change the main content type. The +major type will always be ``"text"``, but you can change it to the subtype. For +example:: + + msg = EmailMessage(subject, html_content, from_email, to) + msg.content_subtype = "html" # Main content is now text/html + msg.send() + +SMTP network connections +------------------------ + The ``SMTPConnection`` class is initialized with the host, port, username and password for the SMTP server. If you don't specify one or more of those options, they are read from your settings file. diff --git a/docs/faq.txt b/docs/faq.txt index d7d8f41146..67ed8a49a5 100644 --- a/docs/faq.txt +++ b/docs/faq.txt @@ -104,7 +104,7 @@ Lawrence, Kansas, USA. `Wilson Miner`_ Wilson's design-fu makes us all look like rock stars. By day, he's an - interactive designer for `Apple`. Don't ask him what he's working on, or + interactive designer for `Apple`_. Don't ask him what he's working on, or he'll have to kill you. He lives in San Francisco. On IRC, Wilson goes by ``wilsonian``. diff --git a/docs/generic_views.txt b/docs/generic_views.txt index 359a82506a..2b80348903 100644 --- a/docs/generic_views.txt +++ b/docs/generic_views.txt @@ -754,10 +754,10 @@ If the results are paginated, the context will contain these extra variables: * ``previous``: The previous page number, as an integer. This is 1-based. - * `last_on_page`: The number of the + * ``last_on_page``: The number of the last result on the current page. This is 1-based. - * `first_on_page`: The number of the + * ``first_on_page``: The number of the first result on the current page. This is 1-based. * ``pages``: The total number of pages, as an integer. diff --git a/docs/install.txt b/docs/install.txt index 99aad4e52d..e850e48955 100644 --- a/docs/install.txt +++ b/docs/install.txt @@ -48,7 +48,8 @@ Get your database running If you plan to use Django's database API functionality, you'll need to make sure a database server is running. Django works with PostgreSQL_, -MySQL_ and SQLite_. +MySQL_, Oracle_ and SQLite_ (the latter doesn't require a separate server to +be running). Additionally, you'll need to make sure your Python database bindings are installed. @@ -76,6 +77,7 @@ installed. .. _pysqlite: http://initd.org/tracker/pysqlite .. _MySQL backend: ../databases/ .. _cx_Oracle: http://www.python.net/crew/atuining/cx_Oracle/ +.. _Oracle: http://www.oracle.com/ Remove any old versions of Django ================================= diff --git a/docs/legacy_databases.txt b/docs/legacy_databases.txt index ca3927e52f..b87a661f90 100644 --- a/docs/legacy_databases.txt +++ b/docs/legacy_databases.txt @@ -18,7 +18,7 @@ You'll need to tell Django what your database connection parameters are, and what the name of the database is. Do that by editing these settings in your `settings file`_: - * `DATABASE_NAME` + * `DATABASE_NAME`_ * `DATABASE_ENGINE`_ * `DATABASE_USER`_ * `DATABASE_PASSWORD`_ diff --git a/docs/model-api.txt b/docs/model-api.txt index 074e5fec82..4b0bc0d238 100644 --- a/docs/model-api.txt +++ b/docs/model-api.txt @@ -493,9 +493,9 @@ possible values for "no data;" Django convention is to use the empty string, not ``NULL``. .. note:: - Due to database limitations, when using the Oracle backend the - ``null=True`` option will be coerced for string-based fields that can - blank, and the value ``NULL`` will be stored to denote the empty string. + When using the Oracle database backend, the ``null=True`` option will + be coerced for string-based fields that can blank, and the value + ``NULL`` will be stored to denote the empty string. ``blank`` ~~~~~~~~~ @@ -594,9 +594,12 @@ statement for this field. ``db_tablespace`` ~~~~~~~~~~~~~~~~~ -If this field is indexed, the name of the database tablespace to use for the -index. The default is the ``db_tablespace`` of the model, if any. If the -backend doesn't support tablespaces, this option is ignored. +**New in Django development version** + +The name of the database tablespace to use for this field's index, if +indeed this field is indexed. The default is the ``db_tablespace`` of +the model, if any. If the backend doesn't support tablespaces, this +option is ignored. ``default`` ~~~~~~~~~~~ @@ -1011,6 +1014,8 @@ that's OK. Django quotes column and table names behind the scenes. ``db_tablespace`` ----------------- +**New in Django development version** + The name of the database tablespace to use for the model. If the backend doesn't support tablespaces, this option is ignored. diff --git a/docs/release_notes_0.96.txt b/docs/release_notes_0.96.txt index f62780c6b2..4227de8155 100644 --- a/docs/release_notes_0.96.txt +++ b/docs/release_notes_0.96.txt @@ -28,7 +28,7 @@ The following changes may require you to update your code when you switch from Due to a bug in older versions of the ``MySQLdb`` Python module (which Django uses to connect to MySQL databases), Django's MySQL backend now -requires version 1.2.1p2 or higher of `MySQLdb`, and will raise +requires version 1.2.1p2 or higher of ``MySQLdb``, and will raise exceptions if you attempt to use an older version. If you're currently unable to upgrade your copy of ``MySQLdb`` to meet diff --git a/docs/serialization.txt b/docs/serialization.txt index 01afa2708c..fa9b4edd51 100644 --- a/docs/serialization.txt +++ b/docs/serialization.txt @@ -48,12 +48,12 @@ Subset of fields ~~~~~~~~~~~~~~~~ If you only want a subset of fields to be serialized, you can -specify a `fields` argument to the serializer:: +specify a ``fields`` argument to the serializer:: from django.core import serializers data = serializers.serialize('xml', SomeModel.objects.all(), fields=('name','size')) -In this example, only the `name` and `size` attributes of each model will +In this example, only the ``name`` and ``size`` attributes of each model will be serialized. .. note:: diff --git a/docs/templates_python.txt b/docs/templates_python.txt index f3e2f2c64b..7171f32612 100644 --- a/docs/templates_python.txt +++ b/docs/templates_python.txt @@ -342,7 +342,7 @@ If ``TEMPLATE_CONTEXT_PROCESSORS`` contains this processor, every * ``user`` -- An ``auth.User`` instance representing the currently logged-in user (or an ``AnonymousUser`` instance, if the client isn't - logged in). See the `user authentication docs`. + logged in). See the `user authentication docs`_. * ``messages`` -- A list of messages (as strings) for the currently logged-in user. Behind the scenes, this calls diff --git a/docs/testing.txt b/docs/testing.txt index 50c4ec3046..b326e0099d 100644 --- a/docs/testing.txt +++ b/docs/testing.txt @@ -253,8 +253,8 @@ can be invoked on the ``Client`` instance. f.close() will result in the evaluation of a POST request on ``/customers/wishes/``, - with a POST dictionary that contains `name`, `attachment` (containing the - file name), and `attachment_file` (containing the file data). Note that you + with a POST dictionary that contains ``name``, ``attachment`` (containing the + file name), and ``attachment_file`` (containing the file data). Note that you need to manually close the file after it has been provided to the POST. ``login(**credentials)`` @@ -660,8 +660,8 @@ arguments: tested. This is the same format returned by ``django.db.models.get_apps()`` Verbosity determines the amount of notification and debug information that - will be printed to the console; `0` is no output, `1` is normal output, - and `2` is verbose output. + will be printed to the console; ``0`` is no output, ``1`` is normal output, + and ``2`` is verbose output. This method should return the number of tests that failed. diff --git a/docs/tutorial01.txt b/docs/tutorial01.txt index eb530e92ff..56a2a3fefc 100644 --- a/docs/tutorial01.txt +++ b/docs/tutorial01.txt @@ -360,7 +360,7 @@ Note the following: quotes. The author of this tutorial runs PostgreSQL, so the example output is in PostgreSQL syntax. - * The `sql` command doesn't actually run the SQL in your database - it just + * The ``sql`` command doesn't actually run the SQL in your database - it just prints it to the screen so that you can see what SQL Django thinks is required. If you wanted to, you could copy and paste this SQL into your database prompt. However, as we will see shortly, Django provides an easier way of committing diff --git a/tests/modeltests/lookup/models.py b/tests/modeltests/lookup/models.py index 03630de2d1..207b27a7d9 100644 --- a/tests/modeltests/lookup/models.py +++ b/tests/modeltests/lookup/models.py @@ -5,6 +5,7 @@ This demonstrates features of the database API. """ from django.db import models +from django.conf import settings class Article(models.Model): headline = models.CharField(maxlength=100) @@ -251,4 +252,100 @@ Traceback (most recent call last): ... TypeError: Cannot resolve keyword 'headline__starts' into field. Choices are: id, headline, pub_date +# Create some articles with a bit more interesting headlines for testing field lookups: +>>> now = datetime.now() +>>> for a in Article.objects.all(): +... a.delete() +>>> a1 = Article(pub_date=now, headline='f') +>>> a1.save() +>>> a2 = Article(pub_date=now, headline='fo') +>>> a2.save() +>>> a3 = Article(pub_date=now, headline='foo') +>>> a3.save() +>>> a4 = Article(pub_date=now, headline='fooo') +>>> a4.save() +>>> a5 = Article(pub_date=now, headline='hey-Foo') +>>> a5.save() + +# zero-or-more +>>> Article.objects.filter(headline__regex=r'fo*') +[<Article: f>, <Article: fo>, <Article: foo>, <Article: fooo>] +>>> Article.objects.filter(headline__iregex=r'fo*') +[<Article: f>, <Article: fo>, <Article: foo>, <Article: fooo>, <Article: hey-Foo>] + +# one-or-more +>>> Article.objects.filter(headline__regex=r'fo+') +[<Article: fo>, <Article: foo>, <Article: fooo>] + +# wildcard +>>> Article.objects.filter(headline__regex=r'fooo?') +[<Article: foo>, <Article: fooo>] + +# and some more: +>>> a6 = Article(pub_date=now, headline='bar') +>>> a6.save() +>>> a7 = Article(pub_date=now, headline='AbBa') +>>> a7.save() +>>> a8 = Article(pub_date=now, headline='baz') +>>> a8.save() +>>> a9 = Article(pub_date=now, headline='baxZ') +>>> a9.save() + +# leading anchor +>>> Article.objects.filter(headline__regex=r'^b') +[<Article: bar>, <Article: baxZ>, <Article: baz>] +>>> Article.objects.filter(headline__iregex=r'^a') +[<Article: AbBa>] + +# trailing anchor +>>> Article.objects.filter(headline__regex=r'z$') +[<Article: baz>] +>>> Article.objects.filter(headline__iregex=r'z$') +[<Article: baxZ>, <Article: baz>] + +# character sets +>>> Article.objects.filter(headline__regex=r'ba[rz]') +[<Article: bar>, <Article: baz>] +>>> Article.objects.filter(headline__regex=r'ba.[RxZ]') +[<Article: baxZ>] +>>> Article.objects.filter(headline__iregex=r'ba[RxZ]') +[<Article: bar>, <Article: baxZ>, <Article: baz>] + +# and yet more: +>>> a10 = Article(pub_date=now, headline='foobar') +>>> a10.save() +>>> a11 = Article(pub_date=now, headline='foobaz') +>>> a11.save() +>>> a12 = Article(pub_date=now, headline='ooF') +>>> a12.save() +>>> a13 = Article(pub_date=now, headline='foobarbaz') +>>> a13.save() +>>> a14 = Article(pub_date=now, headline='zoocarfaz') +>>> a14.save() +>>> a15 = Article(pub_date=now, headline='barfoobaz') +>>> a15.save() +>>> a16 = Article(pub_date=now, headline='bazbaRFOO') +>>> a16.save() + +# alternation +>>> Article.objects.filter(headline__regex=r'oo(f|b)') +[<Article: barfoobaz>, <Article: foobar>, <Article: foobarbaz>, <Article: foobaz>] +>>> Article.objects.filter(headline__iregex=r'oo(f|b)') +[<Article: barfoobaz>, <Article: foobar>, <Article: foobarbaz>, <Article: foobaz>, <Article: ooF>] +>>> Article.objects.filter(headline__regex=r'^foo(f|b)') +[<Article: foobar>, <Article: foobarbaz>, <Article: foobaz>] + +# greedy matching +>>> Article.objects.filter(headline__regex=r'b.*az') +[<Article: barfoobaz>, <Article: baz>, <Article: bazbaRFOO>, <Article: foobarbaz>, <Article: foobaz>] +>>> Article.objects.filter(headline__iregex=r'b.*ar') +[<Article: bar>, <Article: barfoobaz>, <Article: bazbaRFOO>, <Article: foobar>, <Article: foobarbaz>] """} + + +if settings.DATABASE_ENGINE not in ('mysql', 'mysql_old'): + __test__['API_TESTS'] += r""" +# grouping and backreferences +>>> Article.objects.filter(headline__regex=r'b(.).*b\1') +[<Article: barfoobaz>, <Article: bazbaRFOO>, <Article: foobarbaz>] +""" diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py index c78ccff678..3934863a03 100644 --- a/tests/regressiontests/templates/tests.py +++ b/tests/regressiontests/templates/tests.py @@ -225,6 +225,9 @@ class Templates(unittest.TestCase): # in the final output. 'filter-syntax18': (r'{{ var }}', {'var': UTF8Class()}, u'\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111'), + # Numbers as filter arguments should work + 'filter-syntax19': ('{{ var|truncatewords:1 }}', {"var": "hello world"}, "hello ..."), + ### COMMENT SYNTAX ######################################################## 'comment-syntax01': ("{# this is hidden #}hello", {}, "hello"), 'comment-syntax02': ("{# this is hidden #}hello{# foo #}", {}, "hello"), |