summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoulder Sprinters <boulder-sprinters@djangoproject.com>2007-03-13 15:40:41 +0000
committerBoulder Sprinters <boulder-sprinters@djangoproject.com>2007-03-13 15:40:41 +0000
commitca343fc0ac546822839e5737c30c887dd59176b3 (patch)
treecee235426ff053deb8a29b9a5556333ff9f46bc6
parent429a542cece57e837387c5d3978677fbf4ce52f3 (diff)
boulder-oracle-sprint: Merged rest of package to trunk [4719]
git-svn-id: http://code.djangoproject.com/svn/django/branches/boulder-oracle-sprint@4722 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--AUTHORS1
-rwxr-xr-xdjango/bin/make-messages.py4
-rw-r--r--django/conf/locale/fr/LC_MESSAGES/django.mobin32963 -> 39707 bytes
-rw-r--r--django/conf/locale/fr/LC_MESSAGES/django.po2060
-rw-r--r--django/contrib/admin/views/doc.py6
-rw-r--r--django/contrib/contenttypes/management.py1
-rw-r--r--django/contrib/contenttypes/models.py10
-rw-r--r--django/contrib/humanize/templatetags/humanize.py17
-rw-r--r--django/core/management.py4
-rw-r--r--django/core/serializers/__init__.py7
-rw-r--r--django/core/serializers/base.py6
-rw-r--r--django/core/serializers/python.py9
-rw-r--r--django/core/serializers/pyyaml.py36
-rw-r--r--django/core/serializers/xml_serializer.py31
-rw-r--r--django/core/validators.py5
-rw-r--r--django/db/models/fields/__init__.py7
-rw-r--r--django/db/models/related.py2
-rw-r--r--django/oldforms/__init__.py7
-rw-r--r--django/template/defaultfilters.py17
-rw-r--r--django/template/defaulttags.py51
-rw-r--r--django/utils/dateformat.py13
-rw-r--r--django/views/i18n.py6
-rw-r--r--docs/fastcgi.txt11
-rw-r--r--docs/forms.txt21
-rw-r--r--docs/i18n.txt11
25 files changed, 1489 insertions, 854 deletions
diff --git a/AUTHORS b/AUTHORS
index 4a027fdd6e..760ffdd21e 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -85,6 +85,7 @@ answer newbie questions, and generally made Django that much better:
Marc Fargas <telenieko@telenieko.com>
favo@exoweb.net
Eric Floehr <eric@intellovations.com>
+ Jorge Gajon <gajon@gajon.org>
gandalf@owca.info
Baishampayan Ghose
martin.glueck@gmail.com
diff --git a/django/bin/make-messages.py b/django/bin/make-messages.py
index 557cb5eeec..34fb68dcfe 100755
--- a/django/bin/make-messages.py
+++ b/django/bin/make-messages.py
@@ -81,7 +81,7 @@ def make_messages():
src = pythonize_re.sub('\n#', src)
open(os.path.join(dirpath, '%s.py' % file), "wb").write(src)
thefile = '%s.py' % file
- cmd = 'xgettext %s -d %s -L Perl --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy -o - "%s"' % (
+ cmd = 'xgettext %s -d %s -L Perl --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy --from-code UTF-8 -o - "%s"' % (
os.path.exists(potfile) and '--omit-header' or '', domain, os.path.join(dirpath, thefile))
(stdin, stdout, stderr) = os.popen3(cmd, 'b')
msgs = stdout.read()
@@ -103,7 +103,7 @@ def make_messages():
open(os.path.join(dirpath, '%s.py' % file), "wb").write(templatize(src))
thefile = '%s.py' % file
if verbose: sys.stdout.write('processing file %s in %s\n' % (file, dirpath))
- cmd = 'xgettext %s -d %s -L Python --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy -o - "%s"' % (
+ cmd = 'xgettext %s -d %s -L Python --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy --from-code UTF-8 -o - "%s"' % (
os.path.exists(potfile) and '--omit-header' or '', domain, os.path.join(dirpath, thefile))
(stdin, stdout, stderr) = os.popen3(cmd, 'b')
msgs = stdout.read()
diff --git a/django/conf/locale/fr/LC_MESSAGES/django.mo b/django/conf/locale/fr/LC_MESSAGES/django.mo
index c8dc1444d4..14b8a935a1 100644
--- a/django/conf/locale/fr/LC_MESSAGES/django.mo
+++ b/django/conf/locale/fr/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/fr/LC_MESSAGES/django.po b/django/conf/locale/fr/LC_MESSAGES/django.po
index 98053d4678..62f3b46c37 100644
--- a/django/conf/locale/fr/LC_MESSAGES/django.po
+++ b/django/conf/locale/fr/LC_MESSAGES/django.po
@@ -7,14 +7,775 @@ msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-05-16 10:11+0200\n"
+"POT-Creation-Date: 2007-03-11 11:46+0100\n"
"PO-Revision-Date: 2006-05-08 15:12+0200\n"
-"Last-Translator: Gaël Chardon <gael.dev_at_nospam_4now.net>\n"
+"Last-Translator: Baptiste Goupil <baptiste.goupil_at_google_email.com>\n"
"Language-Team: français <fr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
+#: oldforms/__init__.py:357 db/models/fields/__init__.py:116
+#: db/models/fields/__init__.py:273 db/models/fields/__init__.py:609
+#: db/models/fields/__init__.py:620 newforms/models.py:177
+#: newforms/fields.py:78 newforms/fields.py:374 newforms/fields.py:450
+#: newforms/fields.py:461
+msgid "This field is required."
+msgstr "Ce champ est obligatoire."
+
+#: oldforms/__init__.py:392
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Assurez-vous que votre texte fait moins de %s caractère."
+msgstr[1] "Assurez-vous que votre texte fait moins de %s caractères."
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "Les retours à la ligne ne sont pas autorisés ici."
+
+#: oldforms/__init__.py:498 oldforms/__init__.py:571 oldforms/__init__.py:610
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Sélectionnez un choix valide ; '%(data)s' n'est pas dans %(choices)s."
+
+#: oldforms/__init__.py:577 newforms/widgets.py:170
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Inconnu"
+
+#: oldforms/__init__.py:577 newforms/widgets.py:170
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Oui"
+
+#: oldforms/__init__.py:577 newforms/widgets.py:170
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Non"
+
+#: oldforms/__init__.py:672 core/validators.py:174 core/validators.py:445
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+
+#: oldforms/__init__.py:674
+msgid "The submitted file is empty."
+msgstr "Le fichier soumis est vide."
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Entrez un nombre entier entre -32 768 et 32 767."
+
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
+msgstr "Entrez un nombre entier positif."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Entrez un nombre entier entre 0 et 32 767."
+
+#: db/models/manipulators.py:307
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+
+#: db/models/manipulators.py:308 contrib/admin/views/main.py:335
+#: contrib/admin/views/main.py:337 contrib/admin/views/main.py:339
+msgid "and"
+msgstr "et"
+
+#: db/models/fields/__init__.py:42
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s avec le champ %(fieldname)s existe déjà."
+
+#: db/models/fields/__init__.py:366
+msgid "This value must be an integer."
+msgstr "Cette valeur doit être un entier."
+
+#: db/models/fields/__init__.py:401
+msgid "This value must be either True or False."
+msgstr "Cette valeur doit être soit Vraie soit Fausse."
+
+#: db/models/fields/__init__.py:422
+msgid "This field cannot be null."
+msgstr "Ce champ ne peut pas être vide."
+
+#: db/models/fields/__init__.py:456 core/validators.py:148
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Entrez une date valide au format AAAA-MM-JJ."
+
+#: db/models/fields/__init__.py:525 core/validators.py:157
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Entrez une date et une heure valide au format AAAA-MM-JJ HH:MM."
+
+#: db/models/fields/__init__.py:629
+msgid "Enter a valid filename."
+msgstr "Entrez un nom de fichier valide."
+
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Entrez un %s valide."
+
+#: db/models/fields/related.py:642
+msgid "Separate multiple IDs with commas."
+msgstr "Séparez les ID par des virgules."
+
+#: db/models/fields/related.py:644
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Maintenez \"Contrôle (ctrl)\", ou \"Commande (touche pomme)\" sur un Mac, "
+"pour en sélectionner plusieurs."
+
+#: db/models/fields/related.py:691
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Entrez un ID %(self)s valide. La valeur %(value)r est invalide."
+msgstr[1] ""
+"Entrez des ID %(self)s valides. Les valeurs %(value)r sont invalides."
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Arabe"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Indien"
+
+#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr "Catalan"
+
+#: conf/global_settings.py:42
+msgid "Czech"
+msgstr "Tchèque"
+
+#: conf/global_settings.py:43
+msgid "Welsh"
+msgstr "Gallois"
+
+#: conf/global_settings.py:44
+msgid "Danish"
+msgstr "Dannois"
+
+#: conf/global_settings.py:45
+msgid "German"
+msgstr "Allemand"
+
+#: conf/global_settings.py:46
+msgid "Greek"
+msgstr "Grec"
+
+#: conf/global_settings.py:47
+msgid "English"
+msgstr "Anglais"
+
+#: conf/global_settings.py:48
+msgid "Spanish"
+msgstr "Espagnol"
+
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
+msgstr "Espagnol Argentin"
+
+#: conf/global_settings.py:50
+msgid "Finnish"
+msgstr "Dannois"
+
+#: conf/global_settings.py:51
+msgid "French"
+msgstr "Français"
+
+#: conf/global_settings.py:52
+msgid "Galician"
+msgstr "Galicien"
+
+#: conf/global_settings.py:53
+msgid "Hungarian"
+msgstr "Hongrois"
+
+#: conf/global_settings.py:54
+msgid "Hebrew"
+msgstr "Israélien"
+
+#: conf/global_settings.py:55
+msgid "Icelandic"
+msgstr "Islandais"
+
+#: conf/global_settings.py:56
+msgid "Italian"
+msgstr "Italien"
+
+#: conf/global_settings.py:57
+msgid "Japanese"
+msgstr "Japonais"
+
+#: conf/global_settings.py:58
+msgid "Kannada"
+msgstr "Kannada"
+
+#: conf/global_settings.py:59
+msgid "Latvian"
+msgstr "Letton"
+
+#: conf/global_settings.py:60
+msgid "Macedonian"
+msgstr "Macédonien"
+
+#: conf/global_settings.py:61
+msgid "Dutch"
+msgstr "Néerlandais"
+
+#: conf/global_settings.py:62
+msgid "Norwegian"
+msgstr "Norvégien"
+
+#: conf/global_settings.py:63
+msgid "Polish"
+msgstr "Polonais"
+
+#: conf/global_settings.py:64
+msgid "Brazilian"
+msgstr "Brésilien"
+
+#: conf/global_settings.py:65
+msgid "Romanian"
+msgstr "Roumain"
+
+#: conf/global_settings.py:66
+msgid "Russian"
+msgstr "Russe"
+
+#: conf/global_settings.py:67
+msgid "Slovak"
+msgstr "Slovaque"
+
+#: conf/global_settings.py:68
+msgid "Slovenian"
+msgstr "Slovaque"
+
+#: conf/global_settings.py:69
+msgid "Serbian"
+msgstr "Serbe"
+
+#: conf/global_settings.py:70
+msgid "Swedish"
+msgstr "Suédois"
+
+#: conf/global_settings.py:71
+msgid "Tamil"
+msgstr "Tamoul"
+
+#: conf/global_settings.py:72
+msgid "Telugu"
+msgstr "Télougou"
+
+#: conf/global_settings.py:73
+msgid "Turkish"
+msgstr "Turc"
+
+#: conf/global_settings.py:74
+msgid "Ukrainian"
+msgstr "Ukrainien"
+
+#: conf/global_settings.py:75
+msgid "Simplified Chinese"
+msgstr "Chinois simplifié"
+
+#: conf/global_settings.py:76
+msgid "Traditional Chinese"
+msgstr "Chinois traditionnel"
+
+#: core/validators.py:64
+msgid "This value must contain only letters, numbers and underscores."
+msgstr ""
+"Ce champ ne doit contenir que des lettres, des nombres et des tirets bas "
+"('_')."
+
+#: core/validators.py:68
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Ce champ ne doit contenir que des lettres, des nombres, des tirets bas ('_') "
+"et des '/'."
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"Ce champ ne doit contenir que des lettres, des nombres, des tirets bas ('_') "
+"et des '-'."
+
+#: core/validators.py:76
+msgid "Uppercase letters are not allowed here."
+msgstr "Les lettres majuscules ne sont pas autorisées ici."
+
+#: core/validators.py:80
+msgid "Lowercase letters are not allowed here."
+msgstr "Les lettres minuscules ne sont pas autorisées ici."
+
+#: core/validators.py:87
+msgid "Enter only digits separated by commas."
+msgstr "Saisissez uniquement des chiffres séparés par des virgules."
+
+#: core/validators.py:99
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Entrez des adresses de courriel valides séparées par des virgules."
+
+#: core/validators.py:103
+msgid "Please enter a valid IP address."
+msgstr "Entrez une adresse IP valide."
+
+#: core/validators.py:107
+msgid "Empty values are not allowed here."
+msgstr "Vous ne pouvez pas laisser ce champ vide."
+
+#: core/validators.py:111
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Les caractères non numériques ne sont pas autorisés ici."
+
+#: core/validators.py:115
+msgid "This value can't be comprised solely of digits."
+msgstr "Cette valeur ne peut pas être composé uniquement de chiffres."
+
+#: core/validators.py:120 newforms/fields.py:126
+msgid "Enter a whole number."
+msgstr "Entrez un nombre entier."
+
+#: core/validators.py:124
+msgid "Only alphabetical characters are allowed here."
+msgstr "Seules les lettres de l'alphabet sont autorisées ici."
+
+#: core/validators.py:139
+msgid "Year must be 1900 or later."
+msgstr "L'année doit être supérieure à 1900."
+
+#: core/validators.py:143
+#, fuzzy, python-format
+msgid "Invalid date: %s"
+msgstr "URL invalide : %s"
+
+#: core/validators.py:153
+msgid "Enter a valid time in HH:MM format."
+msgstr "Entrez une heure valide au format HH:MM."
+
+#: core/validators.py:162 newforms/fields.py:269
+msgid "Enter a valid e-mail address."
+msgstr "Entrez une adresse de courriel valide."
+
+#: core/validators.py:178
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Envoyez une image valide. Le fichier que vous avez transferé n'est pas une "
+"image ou bien est une image corrompue."
+
+#: core/validators.py:185
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "L'URL %s ne pointe pas vers une image valide."
+
+#: core/validators.py:189
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Les numéros de téléphone doivent être au format XXX-XXX-XXXX. \"%s\" est "
+"incorrect."
+
+#: core/validators.py:197
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "L'URL %s ne pointe pas vers une vidéo QuickTime valide."
+
+#: core/validators.py:201
+msgid "A valid URL is required."
+msgstr "Une URL valide est requise."
+
+#: core/validators.py:215
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Du HTML valide est requis. Les erreurs sont les suivantes :\n"
+"%s"
+
+#: core/validators.py:222
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML mal formé : %s"
+
+#: core/validators.py:239
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL invalide : %s"
+
+#: core/validators.py:244 core/validators.py:246
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "L'URL %s est un lien cassé."
+
+#: core/validators.py:252
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Entrez une abréviation d'état américain valide."
+
+#: core/validators.py:266
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Attention à votre langage ! Le mot %s n'est pas autorisé ici."
+msgstr[1] "Attention à votre langage ! Les mots %s ne sont pas autorisés ici."
+
+#: core/validators.py:273
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Ce champ doit correspondre au champ '%s'."
+
+#: core/validators.py:292
+msgid "Please enter something for at least one field."
+msgstr "Saisissez au moins une valeur dans un des champs s'il vous plaît."
+
+#: core/validators.py:301 core/validators.py:312
+msgid "Please enter both fields or leave them both empty."
+msgstr ""
+"Renseignez chacun des champs ou laissez les deux vides s'il vous plaît."
+
+#: core/validators.py:320
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Ce champ doit être renseigné si %(field)s vaut %(value)s"
+
+#: core/validators.py:333
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Ce champ doit être renseigné si %(field)s ne vaut pas %(value)s"
+
+#: core/validators.py:352
+msgid "Duplicate values are not allowed."
+msgstr "Des valeurs identiques ne sont pas autorisées."
+
+#: core/validators.py:367
+#, fuzzy, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Cette valeur doit être entre %(lower)s et %(upper)s."
+
+#: core/validators.py:369
+#, fuzzy, python-format
+msgid "This value must be at least %s."
+msgstr "Cette valeur doit être au moins %s."
+
+#: core/validators.py:371
+#, fuzzy, python-format
+msgid "This value must be no more than %s."
+msgstr "Cette valeur ne doit pas dépasser %s."
+
+#: core/validators.py:407
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Cette valeur doit être une puissance de %s."
+
+#: core/validators.py:418
+msgid "Please enter a valid decimal number."
+msgstr "Saisissez un nombre décimal valide s'il vous plaît."
+
+#: core/validators.py:422
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+"Saisissez un nombre décimal valide avec au plus %s chiffre s'il vous plaît."
+msgstr[1] ""
+"Saisissez un nombre décimal valide avec au plus %s chiffres s'il vous plaît."
+
+#: core/validators.py:425
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "Veuillez saisir un nombre décimal valide avec au plus %s chiffre."
+msgstr[1] "Veuillez saisir un nombre décimal valide avec au plus %s chiffres."
+
+#: core/validators.py:428
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Veuillez saisir un nombre décimal valide avec au plus %s décimale."
+msgstr[1] "Veuillez saisir un nombre décimal valide avec au plus %s décimales."
+
+#: core/validators.py:438
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+"Vérifiez que le fichier transféré fait au moins une taille de %s octets."
+
+#: core/validators.py:439
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+"Vérifiez que le fichier transféré fait au plus une taille de %s octets."
+
+#: core/validators.py:456
+msgid "The format for this field is wrong."
+msgstr "Le format de ce champ est mauvais."
+
+#: core/validators.py:471
+msgid "This field is invalid."
+msgstr "Ce champ est invalide."
+
+#: core/validators.py:507
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Impossible de récupérer quoi que ce soit depuis %s."
+
+#: core/validators.py:510
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"L'entête Content-Type '%(contenttype)s', renvoyée par l'url %(url)s n'est "
+"pas valide."
+
+#: core/validators.py:543
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Veuillez fermer le tag %(tag)s de la ligne %(line)s. (La ligne débutant par "
+"\"%(start)s\".)"
+
+#: core/validators.py:547
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Du texte commençant à la ligne %(line)s n'est pas autorisé dans ce contexte. "
+"(Ligne débutant par \"%(start)s\".)"
+
+#: core/validators.py:552
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" ligne %(line)s n'est pas un attribut valide. (Ligne débutant "
+"par \"%(start)s\".)"
+
+#: core/validators.py:557
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" ligne %(line)s n'est pas un tag valide. (Ligne débutant par \"%"
+"(start)s\".)"
+
+#: core/validators.py:561
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Un tag, ou un ou plusieurs attributs, de la ligne %(line)s est manquant. "
+"(Ligne débutant par \"%(start)s\".)"
+
+#: core/validators.py:566
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"La valeur de l'attribut \"%(attr)s\" de la ligne %(line)s n'est pas valide. "
+"(Ligne débutant par \"%(start)s\".)"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "L'objet %(verbose_name)s a été créé avec succès."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "L'objet %(verbose_name)s a été mis à jour avec succès."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "L'objet %(verbose_name)s a été supprimé."
+
+#: newforms/models.py:164 newforms/fields.py:360
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Sélectionnez un choix valide. Ce choix ne fait pas partie de ceux "
+"disponibles."
+
+#: newforms/models.py:181 newforms/fields.py:378 newforms/fields.py:454
+msgid "Enter a list of values."
+msgstr "Entrez une liste de valeur."
+
+#: newforms/models.py:187 newforms/fields.py:387
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Sélectionnez un choix valide ; %s n'en fait pas partie."
+
+#: newforms/fields.py:101 newforms/fields.py:254
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "Assurez-vous que cette valeur fait moins de %d caractère."
+
+#: newforms/fields.py:103 newforms/fields.py:256
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "Assurez-vous que cette valeur fait au moins %d caractère."
+
+#: newforms/fields.py:128
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Assurez-vous que cette valeur soit plus petite ou égale à %s."
+
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Assurez-vous que cette valeur soit plus grande ou égale à %s."
+
+#: newforms/fields.py:163
+msgid "Enter a valid date."
+msgstr "Entrez une date valide."
+
+#: newforms/fields.py:190
+msgid "Enter a valid time."
+msgstr "Entrez une heure valide."
+
+#: newforms/fields.py:226
+msgid "Enter a valid date/time."
+msgstr "Entrez une date et une heure valides."
+
+#: newforms/fields.py:240
+msgid "Enter a valid value."
+msgstr "Entrez une valeur valide."
+
+#: newforms/fields.py:287 newforms/fields.py:309
+msgid "Enter a valid URL."
+msgstr "Entrez une URL valide."
+
+#: newforms/fields.py:311
+msgid "This URL appears to be a broken link."
+msgstr "L'URL est un lien cassé."
+
+#: contrib/humanize/templatetags/humanize.py:16
+msgid "th"
+msgstr "e"
+
+#: contrib/humanize/templatetags/humanize.py:16
+msgid "st"
+msgstr "er"
+
+#: contrib/humanize/templatetags/humanize.py:16
+msgid "nd"
+msgstr "d"
+
+#: contrib/humanize/templatetags/humanize.py:16
+msgid "rd"
+msgstr "e"
+
+#: contrib/humanize/templatetags/humanize.py:48
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f million"
+msgstr[1] "%(value).1f millions"
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f milliard"
+msgstr[1] "%(value).1f milliards"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f billion"
+msgstr[1] "%(value).1f billions"
+
+#: contrib/humanize/templatetags/humanize.py:69
+msgid "one"
+msgstr "un"
+
+#: contrib/humanize/templatetags/humanize.py:69
+msgid "two"
+msgstr "deux"
+
+#: contrib/humanize/templatetags/humanize.py:69
+msgid "three"
+msgstr "trois"
+
+#: contrib/humanize/templatetags/humanize.py:69
+msgid "four"
+msgstr "quatre"
+
+#: contrib/humanize/templatetags/humanize.py:69
+msgid "five"
+msgstr "cinq"
+
+#: contrib/humanize/templatetags/humanize.py:69
+msgid "six"
+msgstr "six"
+
+#: contrib/humanize/templatetags/humanize.py:69
+msgid "seven"
+msgstr "sept"
+
+#: contrib/humanize/templatetags/humanize.py:69
+msgid "eight"
+msgstr "huit"
+
+#: contrib/humanize/templatetags/humanize.py:69
+msgid "nine"
+msgstr "neuf"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redirigé depuis"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Ceci doit être un chemin absolu, sans nom de domaine. Par exemple: '/events/"
+"search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redirigé vers"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Ceci peut être soit un chemin absolu (voir ci-dessus) soit une URL complète "
+"débutant par 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "redirige"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "redirige"
+
#: contrib/comments/models.py:67 contrib/comments/models.py:166
msgid "object ID"
msgstr "ID de l'objet"
@@ -72,7 +833,7 @@ msgstr "date et heure soumises"
msgid "is public"
msgstr "est public"
-#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
msgid "IP address"
msgstr "adresse IP"
@@ -209,13 +970,13 @@ msgstr "ID de commentaire invalide"
msgid "No voting for yourself"
msgstr "Impossible de voter pour soi-même"
-#: contrib/comments/views/comments.py:28
+#: contrib/comments/views/comments.py:27
msgid ""
"This rating is required because you've entered at least one other rating."
msgstr ""
"Ce votre est nécéssaire parceque vous avez saisi au moins un autre vote."
-#: contrib/comments/views/comments.py:112
+#: contrib/comments/views/comments.py:111
#, python-format
msgid ""
"This comment was posted by a user who has posted fewer than %(count)s "
@@ -238,7 +999,7 @@ msgstr[1] ""
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:117
+#: contrib/comments/views/comments.py:116
#, python-format
msgid ""
"This comment was posted by a sketchy user:\n"
@@ -249,24 +1010,24 @@ msgstr ""
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:188
#: contrib/comments/views/comments.py:280
msgid "Only POSTs are allowed"
msgstr "Seuls les POSTs sont autorisés"
-#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:192
#: contrib/comments/views/comments.py:284
msgid "One or more of the required fields wasn't submitted"
msgstr "Un ou plusieurs champs requis n'ont pas été remplis"
-#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:196
#: contrib/comments/views/comments.py:286
msgid "Somebody tampered with the comment form (security violation)"
msgstr ""
"Quelqu'un a trafiqué le formulaire de commentaire (violation des règles de "
"sécurité)"
-#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:206
#: contrib/comments/views/comments.py:292
msgid ""
"The comment form had an invalid 'target' parameter -- the object ID was "
@@ -282,6 +1043,20 @@ msgstr ""
"Le formulaire de commentaire ne proposait ni les options de prévisualisation "
"ni d'envoi"
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Votre nom :"
+
+#: contrib/comments/templates/comments/freeform.html:5
+#: contrib/comments/templates/comments/form.html:28
+msgid "Comment:"
+msgstr "Commentaire :"
+
+#: contrib/comments/templates/comments/freeform.html:10
+#: contrib/comments/templates/comments/form.html:35
+msgid "Preview comment"
+msgstr "Prévisualisation du commentaire"
+
#: contrib/comments/templates/comments/form.html:6
#: contrib/comments/templates/comments/form.html:8
#: contrib/admin/templates/admin/login.html:17
@@ -289,20 +1064,12 @@ msgid "Username:"
msgstr "Nom d'utilisateur"
#: contrib/comments/templates/comments/form.html:6
-#: contrib/admin/templates/admin/login.html:20
-msgid "Password:"
-msgstr "Mot de passe"
-
-#: contrib/comments/templates/comments/form.html:6
-msgid "Forgotten your password?"
-msgstr "Mot de passe oublié?"
-
-#: contrib/comments/templates/comments/form.html:8
#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/admin_doc/bookmarklets.html:4
@@ -318,6 +1085,15 @@ msgstr "Mot de passe oublié?"
msgid "Log out"
msgstr "Déconnexion"
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Mot de passe"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Mot de passe oublié?"
+
#: contrib/comments/templates/comments/form.html:12
msgid "Ratings"
msgstr "Votes"
@@ -336,19 +1112,21 @@ msgstr "Optionel"
msgid "Post a photo"
msgstr "Poster une photo"
-#: contrib/comments/templates/comments/form.html:27
-#: contrib/comments/templates/comments/freeform.html:5
-msgid "Comment:"
-msgstr "Commentaire :"
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "nom de domaine"
-#: contrib/comments/templates/comments/form.html:32
-#: contrib/comments/templates/comments/freeform.html:9
-msgid "Preview comment"
-msgstr "Prévisualisation du commentaire"
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "nom à afficher"
-#: contrib/comments/templates/comments/freeform.html:4
-msgid "Your name:"
-msgstr "Votre nom :"
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "site"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "sites"
#: contrib/admin/filterspecs.py:40
#, python-format
@@ -360,7 +1138,7 @@ msgstr ""
"<ul>\n"
#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
-#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
msgid "All"
msgstr "Tout"
@@ -384,18 +1162,6 @@ msgstr "Ce mois-ci"
msgid "This year"
msgstr "Cette année"
-#: contrib/admin/filterspecs.py:143
-msgid "Yes"
-msgstr "Oui"
-
-#: contrib/admin/filterspecs.py:143
-msgid "No"
-msgstr "Non"
-
-#: contrib/admin/filterspecs.py:150
-msgid "Unknown"
-msgstr "Inconnu"
-
#: contrib/admin/models.py:16
msgid "action time"
msgstr "heure de l'action"
@@ -424,12 +1190,11 @@ msgstr "entrée d'historique"
msgid "log entries"
msgstr "entrées d'historique"
-#: contrib/admin/templatetags/admin_list.py:228
+#: contrib/admin/templatetags/admin_list.py:247
msgid "All dates"
msgstr "Toutes les dates"
-#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
-#: contrib/auth/forms.py:41
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:60
msgid ""
"Please enter a correct username and password. Note that both fields are case-"
"sensitive."
@@ -438,12 +1203,12 @@ msgstr ""
"Remarquez que chacun de ces champs est sensible à la casse (différenciation "
"des majuscules/minuscules)."
-#: contrib/admin/views/decorators.py:23
+#: contrib/admin/views/decorators.py:24
#: contrib/admin/templates/admin/login.html:25
msgid "Log in"
msgstr "Connectez-vous"
-#: contrib/admin/views/decorators.py:61
+#: contrib/admin/views/decorators.py:62
msgid ""
"Please log in again, because your session has expired. Don't worry: Your "
"submission has been saved."
@@ -451,7 +1216,7 @@ msgstr ""
"Votre session a expiré, connectez-vous de nouveau s'il vous plaît. Ne vous "
"inquiétez pas, votre travail précédement éffectué a été sauvé."
-#: contrib/admin/views/decorators.py:68
+#: contrib/admin/views/decorators.py:69
msgid ""
"Looks like your browser isn't configured to accept cookies. Please enable "
"cookies, reload this page, and try again."
@@ -459,69 +1224,80 @@ msgstr ""
"Il semblerait que votre navigateur n'accepte pas les cookies. Activez-les, "
"rechargez cette page et rééssayez s'il vous plaît."
-#: contrib/admin/views/decorators.py:82
+#: contrib/admin/views/decorators.py:83
msgid "Usernames cannot contain the '@' character."
msgstr "Les noms d'utilisateur ne peuvent contenir le caractère '@'"
-#: contrib/admin/views/decorators.py:84
+#: contrib/admin/views/decorators.py:85
#, python-format
msgid "Your e-mail address is not your username. Try '%s' instead."
msgstr ""
"Votre courriel n'est pas votre nom d'utilisateur. Essayez '%s' à la place."
-#: contrib/admin/views/main.py:226
-msgid "Site administration"
-msgstr "Gestion du site"
-
-#: contrib/admin/views/main.py:260
+#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257
#, python-format
msgid "The %(name)s \"%(obj)s\" was added successfully."
msgstr "L'objet %(name)s \"%(obj)s\" a été ajouté avec succès."
-#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261
+#: contrib/admin/views/main.py:347
msgid "You may edit it again below."
msgstr "Vous pouvez continuez de l'éditez ci-dessous."
-#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#: contrib/admin/views/auth.py:30
+#, fuzzy
+msgid "Add user"
+msgstr "Ajouter %s"
+
+#: contrib/admin/views/auth.py:57
+#, fuzzy
+msgid "Password changed successfully."
+msgstr "Mot de passe modifié avec succés"
+
+#: contrib/admin/views/auth.py:64
+#, fuzzy, python-format
+msgid "Change password: %s"
+msgstr "Modifier votre mot de passe"
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "Gestion du site"
+
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
#, python-format
msgid "You may add another %s below."
msgstr "Vous pouvez ajouter un autre %s ci-dessous."
-#: contrib/admin/views/main.py:290
+#: contrib/admin/views/main.py:289
#, python-format
msgid "Add %s"
msgstr "Ajouter %s"
-#: contrib/admin/views/main.py:336
+#: contrib/admin/views/main.py:335
#, python-format
msgid "Added %s."
msgstr "Ajouté %s."
-#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
-#: contrib/admin/views/main.py:340
-msgid "and"
-msgstr "et"
-
-#: contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:337
#, python-format
msgid "Changed %s."
msgstr "Modifié %s."
-#: contrib/admin/views/main.py:340
+#: contrib/admin/views/main.py:339
#, python-format
msgid "Deleted %s."
msgstr "Supprimé %s."
-#: contrib/admin/views/main.py:343
+#: contrib/admin/views/main.py:342
msgid "No fields changed."
msgstr "Aucun champ modifié."
-#: contrib/admin/views/main.py:346
+#: contrib/admin/views/main.py:345
#, python-format
msgid "The %(name)s \"%(obj)s\" was changed successfully."
msgstr "L'objet %(name)s \"%(obj)s\" a été modifié avec succès."
-#: contrib/admin/views/main.py:354
+#: contrib/admin/views/main.py:353
#, python-format
msgid ""
"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
@@ -529,121 +1305,203 @@ msgstr ""
"L'objet %(name)s \"%(obj)s\" a été ajouté avec succès.Vous pouvez continuez "
"de l'éditez ci-dessous."
-#: contrib/admin/views/main.py:392
+#: contrib/admin/views/main.py:391
#, python-format
msgid "Change %s"
msgstr "Changement %s"
-#: contrib/admin/views/main.py:470
+#: contrib/admin/views/main.py:476
#, python-format
msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
msgstr "Un ou plusieurs %(fieldname)s dans %(name)s: %(obj)s"
-#: contrib/admin/views/main.py:475
+#: contrib/admin/views/main.py:481
#, python-format
msgid "One or more %(fieldname)s in %(name)s:"
msgstr "Un ou plusieurs %(fieldname)s dans %(name)s:"
-#: contrib/admin/views/main.py:508
+#: contrib/admin/views/main.py:514
#, python-format
msgid "The %(name)s \"%(obj)s\" was deleted successfully."
msgstr "L'objet %(name)s \"%(obj)s\" a été supprimé avec succès."
-#: contrib/admin/views/main.py:511
+#: contrib/admin/views/main.py:517
msgid "Are you sure?"
msgstr "Êtes-vous sûr ?"
-#: contrib/admin/views/main.py:533
+#: contrib/admin/views/main.py:539
#, python-format
msgid "Change history: %s"
msgstr "Historique des changements : %s"
-#: contrib/admin/views/main.py:565
+#: contrib/admin/views/main.py:573
#, python-format
msgid "Select %s"
msgstr "Sélectionnez %s"
-#: contrib/admin/views/main.py:565
+#: contrib/admin/views/main.py:573
#, python-format
msgid "Select %s to change"
msgstr "Sélectionnez %s pour changer"
-#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
-#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
-#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+#: contrib/admin/views/main.py:768
+msgid "Database error"
+msgstr ""
+
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "mot-clé :"
+
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "filtre :"
+
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "vue :"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "L'application %r n'a pas été trouvée."
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "Le modèle %(name)r n'a pas été trouvé dans l'application %(label)r"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "l'objet `%(label)s.%(type)s en relation "
+
+#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr "modèle :"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "les objets `%(label)s.%(type)s en relation"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr ""
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "nombre de %s"
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr ""
+
+#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309
+#: contrib/admin/views/doc.py:310 contrib/admin/views/doc.py:312
msgid "Integer"
msgstr "Entier"
-#: contrib/admin/views/doc.py:278
+#: contrib/admin/views/doc.py:292
msgid "Boolean (Either True or False)"
msgstr "Booléen (Vrai ou Faux)"
-#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
#, python-format
msgid "String (up to %(maxlength)s)"
msgstr "Chaîne de caractère (jusqu'à %(maxlength)s)"
-#: contrib/admin/views/doc.py:280
+#: contrib/admin/views/doc.py:294
msgid "Comma-separated integers"
msgstr "Des entiers séparés par une virgule"
-#: contrib/admin/views/doc.py:281
+#: contrib/admin/views/doc.py:295
msgid "Date (without time)"
msgstr "Date (sans l'heure)"
-#: contrib/admin/views/doc.py:282
+#: contrib/admin/views/doc.py:296
msgid "Date (with time)"
msgstr "Date (avec l'heure)"
-#: contrib/admin/views/doc.py:283
+#: contrib/admin/views/doc.py:297
msgid "E-mail address"
msgstr "Courriel :"
-#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
msgid "File path"
msgstr "Chemin vers le fichier"
-#: contrib/admin/views/doc.py:285
+#: contrib/admin/views/doc.py:300
msgid "Decimal number"
msgstr "Nombre décimal"
-#: contrib/admin/views/doc.py:291
+#: contrib/admin/views/doc.py:306
msgid "Boolean (Either True, False or None)"
msgstr "Booléen (Vrai, Faux ou None)"
-#: contrib/admin/views/doc.py:292
+#: contrib/admin/views/doc.py:307
msgid "Relation to parent model"
msgstr "Relation au modèle parent"
-#: contrib/admin/views/doc.py:293
+#: contrib/admin/views/doc.py:308
msgid "Phone number"
msgstr "Numéro de téléphone"
-#: contrib/admin/views/doc.py:298
+#: contrib/admin/views/doc.py:313
msgid "Text"
msgstr "Texte"
-#: contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:314
msgid "Time"
msgstr "Heure"
-#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
msgid "URL"
msgstr "URL"
-#: contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:316
msgid "U.S. state (two uppercase letters)"
msgstr "État U.S. (deux lettres majuscules)"
-#: contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:317
msgid "XML text"
msgstr "Texte XML"
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s ne semble pas être un objet urlpattern"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Actuellement :"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Modification :"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Date :"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Heure :"
+
#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
@@ -652,9 +1510,12 @@ msgstr "Documentation"
#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/admin_doc/bookmarklets.html:4
@@ -671,11 +1532,13 @@ msgid "Change password"
msgstr "Modifier votre mot de passe"
#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/500.html:4
#: contrib/admin/templates/admin/change_list.html:6
-#: contrib/admin/templates/admin/base.html:28
-#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/invalid_setup.html:4
#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_reset_form.html:4
#: contrib/admin/templates/registration/logged_out.html:4
@@ -686,7 +1549,7 @@ msgid "Home"
msgstr "Accueil"
#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/change_form.html:21
msgid "History"
msgstr "Historique"
@@ -714,13 +1577,15 @@ msgstr ""
"Cet objet n'a pas d'historique de modification. Il n'a probablement pas été "
"ajouté au moyen de ce site d'administration."
-#: contrib/admin/templates/admin/base_site.html:4
-msgid "Django site admin"
-msgstr "Site d'administration de Django"
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Ajouter %(name)s"
-#: contrib/admin/templates/admin/base_site.html:7
-msgid "Django administration"
-msgstr "Administration de Django"
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Par %(filter_title)s "
#: contrib/admin/templates/admin/500.html:4
msgid "Server error"
@@ -743,6 +1608,45 @@ msgstr ""
"administrateurs du site et sera corrigée dans les meilleurs délais. Merci "
"pour votre patience."
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Envoyer"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 résultat"
+msgstr[1] "%(counter)s résultats"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s résultats"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Tout montrer"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Site d'administration de Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administration de Django"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filtre"
+
#: contrib/admin/templates/admin/404.html:4
#: contrib/admin/templates/admin/404.html:8
msgid "Page not found"
@@ -757,6 +1661,11 @@ msgstr "Nous sommes désolés, mais la page demandée est introuvable."
msgid "Models available in the %(name)s application."
msgstr "Modèles disponibles dans l'application %(name)s."
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
#: contrib/admin/templates/admin/index.html:28
#: contrib/admin/templates/admin/change_form.html:15
msgid "Add"
@@ -782,16 +1691,26 @@ msgstr "Mes actions"
msgid "None available"
msgstr "Aucun(e) disponible"
-#: contrib/admin/templates/admin/change_list.html:11
-#, python-format
-msgid "Add %(name)s"
-msgstr "Ajouter %(name)s"
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "Voir sur le site"
-#: contrib/admin/templates/admin/login.html:22
-msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
-msgstr "Avez vous <a href=\"/password_reset/\">perdu votre mot de passe</a>?"
+#: contrib/admin/templates/admin/change_form.html:32
+#: contrib/admin/templates/admin/auth/user/change_password.html:24
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Veuillez corriger l'erreur ci-dessous."
+msgstr[1] "Veuillez corriger les erreurs ci-dessous."
+
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "Tri"
-#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "Ordre :"
+
+#: contrib/admin/templates/admin/base.html:25
msgid "Welcome,"
msgstr "Bienvenue,"
@@ -803,54 +1722,28 @@ msgstr "Supprimer"
#: contrib/admin/templates/admin/delete_confirmation.html:14
#, python-format
msgid ""
-"Deleting the %(object_name)s '%(object)s' would result in deleting related "
-"objects, but your account doesn't have permission to delete the following "
-"types of objects:"
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
msgstr ""
-"Supprimer l'objet %(object_name)s '%(object)s' provoquerait la suppression "
-"des objets qui lui sont liés mais votre compte ne possède pas la permission "
-"de supprimer les types d'objets suivants :"
+"Supprimer l'objet %(object_name)s '%(escaped_object)s' provoquerait la "
+"suppression des objets qui lui sont liés mais votre compte ne possède pas la "
+"permission de supprimer les types d'objets suivants :"
#: contrib/admin/templates/admin/delete_confirmation.html:21
#, python-format
msgid ""
-"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
-"the following related items will be deleted:"
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
msgstr ""
-"Êtes vous certain de vouloir supprimer l'objet %(object_name)s \"%(object)s"
-"\" ? Les éléments suivant sont liés à celui-ci et seront aussi supprimés :"
+"Êtes vous certain de vouloir supprimer l'objet %(object_name)s \"%"
+"(escaped_object)s\" ? Les éléments suivant sont liés à celui-ci et seront "
+"aussi supprimés :"
#: contrib/admin/templates/admin/delete_confirmation.html:26
msgid "Yes, I'm sure"
msgstr "Oui, j'en suis certain"
-#: contrib/admin/templates/admin/filter.html:2
-#, python-format
-msgid " By %(title)s "
-msgstr " Par %(title)s "
-
-#: contrib/admin/templates/admin/search_form.html:8
-msgid "Go"
-msgstr "Envoyer"
-
-#: contrib/admin/templates/admin/change_form.html:21
-msgid "View on site"
-msgstr "Voir sur le site"
-
-#: contrib/admin/templates/admin/change_form.html:30
-msgid "Please correct the error below."
-msgid_plural "Please correct the errors below."
-msgstr[0] "Veuillez corriger l'erreur ci-dessous."
-msgstr[1] "Veuillez corriger les erreurs ci-dessous."
-
-#: contrib/admin/templates/admin/change_form.html:48
-msgid "Ordering"
-msgstr "Tri"
-
-#: contrib/admin/templates/admin/change_form.html:51
-msgid "Order:"
-msgstr "Ordre :"
-
#: contrib/admin/templates/admin/submit_line.html:4
msgid "Save as new"
msgstr "Sauver en tant que nouveau"
@@ -867,6 +1760,40 @@ msgstr "Sauver et continuer les modifications"
msgid "Save"
msgstr "Sauver"
+#: contrib/admin/templates/admin/auth/user/change_password.html:28
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Entrez un nouveau mot de passe pour l'utilisateur <strong>%(username)s</"
+"strong>."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "Mot de passe"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "Mot de passe (à nouveau)"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "Entrez le même mot de passe que précedemment, par sécurité."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Entrez tout d'abord un nom d'utilisateur et un mot de passe.Vous pourrez "
+"ensuite modifier plus d'options."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Nom d'utilisateur"
+
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_change_form.html:4
#: contrib/admin/templates/registration/password_change_form.html:6
@@ -1046,176 +1973,123 @@ msgstr ""
"Comme ci-dessus, mais ouvre la page d'administration dans une nouvelle "
"fenêtre."
-#: contrib/admin/templates/widget/date_time.html:3
-msgid "Date:"
-msgstr "Date :"
-
-#: contrib/admin/templates/widget/date_time.html:4
-msgid "Time:"
-msgstr "Heure :"
-
-#: contrib/admin/templates/widget/file.html:2
-msgid "Currently:"
-msgstr "Actuellement :"
-
-#: contrib/admin/templates/widget/file.html:3
-msgid "Change:"
-msgstr "Modification :"
-
-#: contrib/redirects/models.py:7
-msgid "redirect from"
-msgstr "redirigé depuis"
-
-#: contrib/redirects/models.py:8
-msgid ""
-"This should be an absolute path, excluding the domain name. Example: '/"
-"events/search/'."
-msgstr ""
-"Ceci doit être un chemin absolu, sans nom de domaine. Par exemple: '/events/"
-"search/'."
-
-#: contrib/redirects/models.py:9
-msgid "redirect to"
-msgstr "redirigé vers"
-
-#: contrib/redirects/models.py:10
-msgid ""
-"This can be either an absolute path (as above) or a full URL starting with "
-"'http://'."
-msgstr ""
-"Ceci peut être soit un chemin absolu (voir ci-dessus) soit une URL complète "
-"débutant par 'http://'."
-
-#: contrib/redirects/models.py:12
-msgid "redirect"
-msgstr "redirige"
-
-#: contrib/redirects/models.py:13
-msgid "redirects"
-msgstr "redirige"
-
-#: contrib/flatpages/models.py:8
-msgid ""
-"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
-msgstr ""
-"Par exemple : '/about/contact/'. Vérifiez la présence du caractère '/' en "
-"début et en fin de chaine."
-
-#: contrib/flatpages/models.py:9
-msgid "title"
-msgstr "titre"
-
-#: contrib/flatpages/models.py:10
-msgid "content"
-msgstr "contenu"
-
-#: contrib/flatpages/models.py:11
-msgid "enable comments"
-msgstr "autoriser les commentaires"
-
-#: contrib/flatpages/models.py:12
-msgid "template name"
-msgstr "nom du template"
-
-#: contrib/flatpages/models.py:13
-msgid ""
-"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
-"use 'flatpages/default'."
-msgstr ""
-"Par exemple: 'flatfiles/contact_page'. Sans définition, le système utilisera "
-"'flatfiles/default'."
-
-#: contrib/flatpages/models.py:14
-msgid "registration required"
-msgstr "enregistrement requis"
+#: contrib/contenttypes/models.py:26
+msgid "python model class name"
+msgstr "nom du module python"
-#: contrib/flatpages/models.py:14
-msgid "If this is checked, only logged-in users will be able to view the page."
-msgstr ""
-"Si coché, seuls les utilisateurs connectés auront la possibilité de voir "
-"cette page."
+#: contrib/contenttypes/models.py:29
+msgid "content type"
+msgstr "type de contenu"
-#: contrib/flatpages/models.py:18
-msgid "flat page"
-msgstr "page à plat"
+#: contrib/contenttypes/models.py:30
+msgid "content types"
+msgstr "types de contenu"
-#: contrib/flatpages/models.py:19
-msgid "flat pages"
-msgstr "pages à plat"
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "Déconnecté"
-#: contrib/auth/models.py:13 contrib/auth/models.py:26
+#: contrib/auth/models.py:38 contrib/auth/models.py:57
msgid "name"
msgstr "nom"
-#: contrib/auth/models.py:15
+#: contrib/auth/models.py:40
msgid "codename"
msgstr "nom de code"
-#: contrib/auth/models.py:17
+#: contrib/auth/models.py:42
msgid "permission"
msgstr "permission"
-#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#: contrib/auth/models.py:43 contrib/auth/models.py:58
msgid "permissions"
msgstr "permissions"
-#: contrib/auth/models.py:29
+#: contrib/auth/models.py:60
msgid "group"
msgstr "groupe"
-#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#: contrib/auth/models.py:61 contrib/auth/models.py:100
msgid "groups"
msgstr "groupes"
-#: contrib/auth/models.py:55
+#: contrib/auth/models.py:90
msgid "username"
msgstr "nom d'utilisateur"
-#: contrib/auth/models.py:56
+#: contrib/auth/models.py:90
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Requis. 30 caractères maximum, alphanumériques uniquement (lettres, "
+"chiffres, et tirets bas '_')."
+
+#: contrib/auth/models.py:91
msgid "first name"
msgstr "prénom"
-#: contrib/auth/models.py:57
+#: contrib/auth/models.py:92
msgid "last name"
msgstr "nom"
-#: contrib/auth/models.py:58
+#: contrib/auth/models.py:93
msgid "e-mail address"
msgstr "courriel"
-#: contrib/auth/models.py:59
+#: contrib/auth/models.py:94
msgid "password"
msgstr "mot de passe"
-#: contrib/auth/models.py:59
-msgid "Use '[algo]$[salt]$[hexdigest]'"
-msgstr "Utilisez '[algo]$[salt]$[hexdigest]'"
+#: contrib/auth/models.py:94
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Utilisez [algo]$[salt]$[hexdigest]' ou le <a href=\"password/\">formulaire "
+"de changement de mot de passe</a>."
-#: contrib/auth/models.py:60
+#: contrib/auth/models.py:95
msgid "staff status"
msgstr "statut équipe"
-#: contrib/auth/models.py:60
+#: contrib/auth/models.py:95
msgid "Designates whether the user can log into this admin site."
msgstr "Précise si l'utilisateur peut se connecter à ce site d'administration."
-#: contrib/auth/models.py:61
+#: contrib/auth/models.py:96
msgid "active"
msgstr "actif"
-#: contrib/auth/models.py:62
+#: contrib/auth/models.py:96
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Précise si l'utilisateur peut se connecter à l'administration. "
+"Déselectionnezceci plutôt que supprimer le compte."
+
+#: contrib/auth/models.py:97
msgid "superuser status"
msgstr "statut super-utilisateur"
-#: contrib/auth/models.py:63
+#: contrib/auth/models.py:97
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Précise que l'utilisateur possède toutes les permissions sans les assigner "
+"explicitement."
+
+#: contrib/auth/models.py:98
msgid "last login"
msgstr "dernière connexion"
-#: contrib/auth/models.py:64
+#: contrib/auth/models.py:99
msgid "date joined"
msgstr "date d'inscription"
-#: contrib/auth/models.py:66
+#: contrib/auth/models.py:101
msgid ""
"In addition to the permissions manually assigned, this user will also get "
"all permissions granted to each group he/she is in."
@@ -1224,39 +2098,47 @@ msgstr ""
"recevra aussi toutes les permissions de tous les groupes auquels il "
"appartient. "
-#: contrib/auth/models.py:67
+#: contrib/auth/models.py:102
msgid "user permissions"
msgstr "permissions de l'utilisateur"
-#: contrib/auth/models.py:70
+#: contrib/auth/models.py:105
msgid "user"
msgstr "utilisateur"
-#: contrib/auth/models.py:71
+#: contrib/auth/models.py:106
msgid "users"
msgstr "utilisateurs"
-#: contrib/auth/models.py:76
+#: contrib/auth/models.py:111
msgid "Personal info"
msgstr "Information personnelle"
-#: contrib/auth/models.py:77
+#: contrib/auth/models.py:112
msgid "Permissions"
msgstr "Permissions"
-#: contrib/auth/models.py:78
+#: contrib/auth/models.py:113
msgid "Important dates"
msgstr "Dates importantes"
-#: contrib/auth/models.py:79
+#: contrib/auth/models.py:114
msgid "Groups"
msgstr "Groupes"
-#: contrib/auth/models.py:219
+#: contrib/auth/models.py:258
msgid "message"
msgstr "message"
-#: contrib/auth/forms.py:30
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Les deux mots de passe ne correspondent pas."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Un utilisateur avec ce nom existe déjà."
+
+#: contrib/auth/forms.py:53
msgid ""
"Your Web browser doesn't appear to have cookies enabled. Cookies are "
"required for logging in."
@@ -1264,65 +2146,102 @@ msgstr ""
"Votre navigateur ne semble pas avoir activé les cookies. Les cookies sont "
"nécessaire pour se connecter"
-#: contrib/contenttypes/models.py:25
-msgid "python model class name"
-msgstr "nom du module python"
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Ce compte est inactif."
-#: contrib/contenttypes/models.py:28
-msgid "content type"
-msgstr "type de contenu"
+#: contrib/auth/forms.py:85
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Cette adresse e-mail ne correspond à aucun compte utilisateur. Êtes-vous sûr "
+"de vous être enregistré ?"
-#: contrib/contenttypes/models.py:29
-msgid "content types"
-msgstr "types de contenu"
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Les deux nouveaux mots de passe ne correspondent pas."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Votre ancien mot de passe est incorrect. Veuillez le rectifier."
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr ""
-#: contrib/sessions/models.py:35
+#: contrib/localflavor/usa/forms.py:17
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr ""
+
+#: contrib/sessions/models.py:51
msgid "session key"
msgstr "clé de session"
-#: contrib/sessions/models.py:36
+#: contrib/sessions/models.py:52
msgid "session data"
msgstr "donnée de session"
-#: contrib/sessions/models.py:37
+#: contrib/sessions/models.py:53
msgid "expire date"
msgstr "date d'expiration"
-#: contrib/sessions/models.py:41
+#: contrib/sessions/models.py:57
msgid "session"
msgstr "session"
-#: contrib/sessions/models.py:42
+#: contrib/sessions/models.py:58
msgid "sessions"
msgstr "sessions"
-#: contrib/sites/models.py:10
-msgid "domain name"
-msgstr "nom de domaine"
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Par exemple : '/about/contact/'. Vérifiez la présence du caractère '/' en "
+"début et en fin de chaine."
-#: contrib/sites/models.py:11
-msgid "display name"
-msgstr "nom à afficher"
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "titre"
-#: contrib/sites/models.py:15
-msgid "site"
-msgstr "site"
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "contenu"
-#: contrib/sites/models.py:16
-msgid "sites"
-msgstr "sites"
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "autoriser les commentaires"
-#: utils/translation.py:360
-msgid "DATE_FORMAT"
-msgstr "j F Y"
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nom du template"
-#: utils/translation.py:361
-msgid "DATETIME_FORMAT"
-msgstr "j F Y, G:i"
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Par exemple: 'flatfiles/contact_page'. Sans définition, le système utilisera "
+"'flatfiles/default'."
-#: utils/translation.py:362
-msgid "TIME_FORMAT"
-msgstr "G:i:s"
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "enregistrement requis"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Si coché, seuls les utilisateurs connectés auront la possibilité de voir "
+"cette page."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "page à plat"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "pages à plat"
#: utils/dates.py:6
msgid "Monday"
@@ -1512,484 +2431,65 @@ msgid_plural "minutes"
msgstr[0] "minute"
msgstr[1] "minutes"
-#: conf/global_settings.py:37
-msgid "Bengali"
-msgstr "Indien"
-
-#: conf/global_settings.py:38
-msgid "Czech"
-msgstr "Tchèque"
-
-#: conf/global_settings.py:39
-msgid "Welsh"
-msgstr "Gallois"
-
-#: conf/global_settings.py:40
-msgid "Danish"
-msgstr "Dannois"
-
-#: conf/global_settings.py:41
-msgid "German"
-msgstr "Allemand"
-
-#: conf/global_settings.py:42
-msgid "Greek"
-msgstr "Grec"
-
-#: conf/global_settings.py:43
-msgid "English"
-msgstr "Anglais"
-
-#: conf/global_settings.py:44
-msgid "Spanish"
-msgstr "Espagnol"
-
-#: conf/global_settings.py:45
-msgid "French"
-msgstr "Français"
-
-#: conf/global_settings.py:46
-msgid "Galician"
-msgstr "Galicien"
-
-#: conf/global_settings.py:47
-msgid "Hungarian"
-msgstr "Hongrois"
-
-#: conf/global_settings.py:48
-msgid "Hebrew"
-msgstr "Israélien"
-
-#: conf/global_settings.py:49
-msgid "Icelandic"
-msgstr "Islandais"
-
-#: conf/global_settings.py:50
-msgid "Italian"
-msgstr "Italien"
-
-#: conf/global_settings.py:51
-msgid "Japanese"
-msgstr "Japonais"
-
-#: conf/global_settings.py:52
-msgid "Dutch"
-msgstr "Néerlandais"
-
-#: conf/global_settings.py:53
-msgid "Norwegian"
-msgstr "Norvégien"
-
-#: conf/global_settings.py:54
-msgid "Brazilian"
-msgstr "Brésilien"
-
-#: conf/global_settings.py:55
-msgid "Romanian"
-msgstr "Roumain"
-
-#: conf/global_settings.py:56
-msgid "Russian"
-msgstr "Russe"
-
-#: conf/global_settings.py:57
-msgid "Slovak"
-msgstr "Slovaque"
-
-#: conf/global_settings.py:58
-msgid "Slovenian"
-msgstr "Slovaque"
-
-#: conf/global_settings.py:59
-msgid "Serbian"
-msgstr "Serbe"
-
-#: conf/global_settings.py:60
-msgid "Swedish"
-msgstr "Suédois"
-
-#: conf/global_settings.py:61
-msgid "Ukrainian"
-msgstr "Ukrainien"
-
-#: conf/global_settings.py:62
-msgid "Simplified Chinese"
-msgstr "Chinois simplifié"
-
-#: conf/global_settings.py:63
-msgid "Traditional Chinese"
-msgstr "Chinois traditionnel"
-
-#: core/validators.py:60
-msgid "This value must contain only letters, numbers and underscores."
-msgstr ""
-"Ce champ ne doit contenir que des lettres, des nombres et des tirets bas "
-"('_')."
-
-#: core/validators.py:64
-msgid ""
-"This value must contain only letters, numbers, underscores, dashes or "
-"slashes."
-msgstr ""
-"Ce champ ne doit contenir que des lettres, des nombres, des tirets bas ('_') "
-"et des '/'."
-
-#: core/validators.py:72
-msgid "Uppercase letters are not allowed here."
-msgstr "Les lettres majuscules ne sont pas autorisées ici."
-
-#: core/validators.py:76
-msgid "Lowercase letters are not allowed here."
-msgstr "Les lettres minuscules ne sont pas autorisées ici."
-
-#: core/validators.py:83
-msgid "Enter only digits separated by commas."
-msgstr "Saisissez uniquement des chiffres séparés par des virgules."
-
-#: core/validators.py:95
-msgid "Enter valid e-mail addresses separated by commas."
-msgstr "Entrez des adresses de courriel valides séparées par des virgules."
-
-#: core/validators.py:99
-msgid "Please enter a valid IP address."
-msgstr "Entrez une adresse IP valide."
-
-#: core/validators.py:103
-msgid "Empty values are not allowed here."
-msgstr "Vous ne pouvez pas laisser ce champ vide."
-
-#: core/validators.py:107
-msgid "Non-numeric characters aren't allowed here."
-msgstr "Les caractères non numériques ne sont pas autorisés ici."
-
-#: core/validators.py:111
-msgid "This value can't be comprised solely of digits."
-msgstr "Cette valeur ne peut pas être composé uniquement de chiffres."
-
-#: core/validators.py:116
-msgid "Enter a whole number."
-msgstr "Entrez un nombre entier."
-
-#: core/validators.py:120
-msgid "Only alphabetical characters are allowed here."
-msgstr "Seules les lettres de l'alphabet sont autorisées ici."
-
-#: core/validators.py:124
-msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr "Entrez une date valide au format AAAA-MM-JJ."
-
-#: core/validators.py:128
-msgid "Enter a valid time in HH:MM format."
-msgstr "Entrez une heure valide au format HH:MM."
-
-#: core/validators.py:132 db/models/fields/__init__.py:468
-msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
-msgstr "Entrez une date et une heure valide au format AAAA-MM-JJ HH:MM."
-
-#: core/validators.py:136
-msgid "Enter a valid e-mail address."
-msgstr "Entrez une adresse de courriel valide."
-
-#: core/validators.py:148
-msgid ""
-"Upload a valid image. The file you uploaded was either not an image or a "
-"corrupted image."
-msgstr ""
-"Envoyez une image valide. Le fichier que vous avez transferé n'est pas une "
-"image ou bien est une image corrompue."
-
-#: core/validators.py:155
-#, python-format
-msgid "The URL %s does not point to a valid image."
-msgstr "L'URL %s ne pointe pas vers une image valide."
-
-#: core/validators.py:159
-#, python-format
-msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
-msgstr ""
-"Les numéros de téléphone doivent être au format XXX-XXX-XXXX. \"%s\" est "
-"incorrect."
-
-#: core/validators.py:167
-#, python-format
-msgid "The URL %s does not point to a valid QuickTime video."
-msgstr "L'URL %s ne pointe pas vers une vidéo QuickTime valide."
-
-#: core/validators.py:171
-msgid "A valid URL is required."
-msgstr "Une URL valide est requise."
-
-#: core/validators.py:185
-#, python-format
-msgid ""
-"Valid HTML is required. Specific errors are:\n"
-"%s"
-msgstr ""
-"Du HTML valide est requis. Les erreurs sont les suivantes :\n"
-"%s"
-
-#: core/validators.py:192
-#, python-format
-msgid "Badly formed XML: %s"
-msgstr "XML mal formé : %s"
-
-#: core/validators.py:202
-#, python-format
-msgid "Invalid URL: %s"
-msgstr "URL invalide : %s"
-
-#: core/validators.py:206 core/validators.py:208
-#, python-format
-msgid "The URL %s is a broken link."
-msgstr "L'URL %s est un lien cassé."
-
-#: core/validators.py:214
-msgid "Enter a valid U.S. state abbreviation."
-msgstr "Entrez une abréviation d'état américain valide."
-
-#: core/validators.py:229
-#, python-format
-msgid "Watch your mouth! The word %s is not allowed here."
-msgid_plural "Watch your mouth! The words %s are not allowed here."
-msgstr[0] "Attention à votre langage ! Le mot %s n'est pas autorisé ici."
-msgstr[1] "Attention à votre langage ! Les mots %s ne sont pas autorisés ici."
-
-#: core/validators.py:236
-#, python-format
-msgid "This field must match the '%s' field."
-msgstr "Ce champ doit correspondre au champ '%s'."
-
-#: core/validators.py:255
-msgid "Please enter something for at least one field."
-msgstr "Saisissez au moins une valeur dans un des champs s'il vous plaît."
-
-#: core/validators.py:264 core/validators.py:275
-msgid "Please enter both fields or leave them both empty."
-msgstr ""
-"Renseignez chacun des champs ou laissez les deux vides s'il vous plaît."
-
-#: core/validators.py:282
-#, python-format
-msgid "This field must be given if %(field)s is %(value)s"
-msgstr "Ce champ doit être renseigné si %(field)s vaut %(value)s"
-
-#: core/validators.py:294
-#, python-format
-msgid "This field must be given if %(field)s is not %(value)s"
-msgstr "Ce champ doit être renseigné si %(field)s ne vaut pas %(value)s"
-
-#: core/validators.py:313
-msgid "Duplicate values are not allowed."
-msgstr "Des valeurs identiques ne sont pas autorisées."
-
-#: core/validators.py:336
-#, python-format
-msgid "This value must be a power of %s."
-msgstr "Cette valeur doit être une puissance de %s."
-
-#: core/validators.py:347
-msgid "Please enter a valid decimal number."
-msgstr "Saisissez un nombre décimal valide s'il vous plaît."
-
-#: core/validators.py:349
-#, python-format
-msgid "Please enter a valid decimal number with at most %s total digit."
-msgid_plural ""
-"Please enter a valid decimal number with at most %s total digits."
-msgstr[0] ""
-"Saisissez un nombre décimal valide avec au plus %s chiffre s'il vous plaît."
-msgstr[1] ""
-"Saisissez un nombre décimal valide avec au plus %s chiffres s'il vous plaît."
-
-#: core/validators.py:352
-#, python-format
-msgid "Please enter a valid decimal number with at most %s decimal place."
-msgid_plural ""
-"Please enter a valid decimal number with at most %s decimal places."
-msgstr[0] ""
-"Saisissez un nombre décimal valide avec au plus %s décimale s'il vous plaît"
-msgstr[1] ""
-"Saisissez un nombre décimal valide avec au plus %s décimales s'il vous plaît"
-
-#: core/validators.py:362
-#, python-format
-msgid "Make sure your uploaded file is at least %s bytes big."
-msgstr ""
-"Vérifiez que le fichier transféré fait au moins une taille de %s octets."
-
-#: core/validators.py:363
-#, python-format
-msgid "Make sure your uploaded file is at most %s bytes big."
-msgstr ""
-"Vérifiez que le fichier transféré fait au plus une taille de %s octets."
-
-#: core/validators.py:376
-msgid "The format for this field is wrong."
-msgstr "Le format de ce champ est mauvais."
-
-#: core/validators.py:391
-msgid "This field is invalid."
-msgstr "Ce champ est invalide."
-
-#: core/validators.py:426
-#, python-format
-msgid "Could not retrieve anything from %s."
-msgstr "Impossible de récupérer quoi que ce soit depuis %s."
+#: utils/dateformat.py:40
+msgid "p.m."
+msgstr "après-midi"
-#: core/validators.py:429
-#, python-format
-msgid ""
-"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
-msgstr ""
-"L'entête Content-Type '%(contenttype)s', renvoyée par l'url %(url)s n'est "
-"pas valide."
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr "matin"
-#: core/validators.py:462
-#, python-format
-msgid ""
-"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
-"\"%(start)s\".)"
-msgstr ""
-"Veuillez fermer le tag %(tag)s de la ligne %(line)s. (La ligne débutant par "
-"\"%(start)s\".)"
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr "Matin"
-#: core/validators.py:466
-#, python-format
-msgid ""
-"Some text starting on line %(line)s is not allowed in that context. (Line "
-"starts with \"%(start)s\".)"
-msgstr ""
-"Du texte commençant à la ligne %(line)s n'est pas autorisé dans ce contexte. "
-"(Ligne débutant par \"%(start)s\".)"
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr "Après-midi"
-#: core/validators.py:471
-#, python-format
-msgid ""
-"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
-"(start)s\".)"
-msgstr ""
-"\"%(attr)s\" ligne %(line)s n'est pas un attribut valide. (Ligne débutant "
-"par \"%(start)s\".)"
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "minuit"
-#: core/validators.py:476
-#, python-format
-msgid ""
-"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
-"(start)s\".)"
-msgstr ""
-"\"<%(tag)s>\" ligne %(line)s n'est pas un tag valide. (Ligne débutant par \"%"
-"(start)s\".)"
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "midi"
-#: core/validators.py:480
-#, python-format
-msgid ""
-"A tag on line %(line)s is missing one or more required attributes. (Line "
-"starts with \"%(start)s\".)"
-msgstr ""
-"Un tag, ou un ou plusieurs attributs, de la ligne %(line)s est manquant. "
-"(Ligne débutant par \"%(start)s\".)"
-
-#: core/validators.py:485
-#, python-format
-msgid ""
-"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
-"starts with \"%(start)s\".)"
-msgstr ""
-"La valeur de l'attribut \"%(attr)s\" de la ligne %(line)s n'est pas valide. "
-"(Ligne débutant par \"%(start)s\".)"
-
-#: db/models/manipulators.py:302
-#, python-format
-msgid "%(object)s with this %(type)s already exists for the given %(field)s."
-msgstr ""
-
-#: db/models/fields/__init__.py:40
-#, python-format
-msgid "%(optname)s with this %(fieldname)s already exists."
-msgstr "%(optname)s avec le champ %(fieldname)s existe déjà."
-
-#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
-#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
-#: forms/__init__.py:346
-msgid "This field is required."
-msgstr "Ce champ est obligatoire."
-
-#: db/models/fields/__init__.py:337
-msgid "This value must be an integer."
-msgstr "Cette valeur doit être un entier."
-
-#: db/models/fields/__init__.py:369
-msgid "This value must be either True or False."
-msgstr "Cette valeur doit être soit Vraie soit Fausse."
-
-#: db/models/fields/__init__.py:385
-msgid "This field cannot be null."
-msgstr "Ce champ ne peut pas être vide."
-
-#: db/models/fields/__init__.py:562
-msgid "Enter a valid filename."
-msgstr "Entrez un nom de fichier valide."
-
-#: db/models/fields/related.py:43
-#, python-format
-msgid "Please enter a valid %s."
-msgstr "Entrez un %s valide."
-
-#: db/models/fields/related.py:579
-msgid "Separate multiple IDs with commas."
-msgstr "Séparez les ID par des virgules."
-
-#: db/models/fields/related.py:581
-msgid ""
-"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
-msgstr ""
-"Maintenez \"Contrôle (ctrl)\", ou \"Commande (touche pomme)\" sur un Mac, "
-"pour en sélectionner plusieurs."
-
-#: db/models/fields/related.py:625
-#, python-format
-msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
-msgid_plural ""
-"Please enter valid %(self)s IDs. The values %(value)r are invalid."
-msgstr[0] "Entrez un ID %(self)s valide. La valeur %(value)r est invalide."
-msgstr[1] ""
-"Entrez des ID %(self)s valides. Les valeurs %(value)r sont invalides."
+#: utils/translation/trans_real.py:362
+msgid "DATE_FORMAT"
+msgstr "j F Y"
-#: forms/__init__.py:380
-#, python-format
-msgid "Ensure your text is less than %s character."
-msgid_plural "Ensure your text is less than %s characters."
-msgstr[0] "Assurez-vous que votre texte fais moins de %s caractère."
-msgstr[1] "Assurez-vous que votre texte fais moins de %s caractères."
+#: utils/translation/trans_real.py:363
+msgid "DATETIME_FORMAT"
+msgstr "j F Y, G:i"
-#: forms/__init__.py:385
-msgid "Line breaks are not allowed here."
-msgstr "Les retours à la ligne ne sont pas autorisés ici."
+#: utils/translation/trans_real.py:364
+msgid "TIME_FORMAT"
+msgstr "G:i:s"
-#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
-#, python-format
-msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
-msgstr "Sélectionnez un choix valide ; '%(data)s' n'est pas dans %(choices)s."
+#: utils/translation/trans_real.py:380
+#, fuzzy
+msgid "YEAR_MONTH_FORMAT"
+msgstr "j F Y"
-#: forms/__init__.py:645
-msgid "The submitted file is empty."
-msgstr "Le fichier soumis est vide."
+#: utils/translation/trans_real.py:381
+#, fuzzy
+msgid "MONTH_DAY_FORMAT"
+msgstr "j F Y"
-#: forms/__init__.py:699
-msgid "Enter a whole number between -32,768 and 32,767."
-msgstr "Entrez un nombre entier entre -32 768 et 32 767."
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "oui,non,peut-être"
-#: forms/__init__.py:708
-msgid "Enter a positive number."
-msgstr "Entrez un nombre entier positif."
+#~ msgid "%dth"
+#~ msgstr "%de"
-#: forms/__init__.py:717
-msgid "Enter a whole number between 0 and 32,767."
-msgstr "Entrez un nombre entier entre 0 et 32 767."
+#~ msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+#~ msgstr ""
+#~ "Avez vous <a href=\"/password_reset/\">perdu votre mot de passe</a>?"
-#: template/defaultfilters.py:379
-msgid "yes,no,maybe"
-msgstr "oui,non,peut-être"
+#~ msgid "Use '[algo]$[salt]$[hexdigest]'"
+#~ msgstr "Utilisez '[algo]$[salt]$[hexdigest]'"
#~ msgid "Comment"
#~ msgstr "Commentaire"
diff --git a/django/contrib/admin/views/doc.py b/django/contrib/admin/views/doc.py
index 4b592acebd..6adfb57c92 100644
--- a/django/contrib/admin/views/doc.py
+++ b/django/contrib/admin/views/doc.py
@@ -168,7 +168,7 @@ def model_detail(request, app_label, model_name):
model = m
break
if model is None:
- raise Http404, _("Model %r not found in app %r") % (model_name, app_label)
+ raise Http404, _("Model %(name)r not found in app %(label)r") % {'name': model_name, 'label': app_label}
opts = model._meta
@@ -180,7 +180,7 @@ def model_detail(request, app_label, model_name):
if isinstance(field, models.ForeignKey):
data_type = related_object_name = field.rel.to.__name__
app_label = field.rel.to._meta.app_label
- verbose = utils.parse_rst((_("the related `%s.%s` object") % (app_label, data_type)), 'model', _('model:') + data_type)
+ verbose = utils.parse_rst((_("the related `%(label)s.%(type)s` object") % {'label': app_label, 'type': data_type}), 'model', _('model:') + data_type)
else:
data_type = get_readable_field_data_type(field)
verbose = field.verbose_name
@@ -211,7 +211,7 @@ def model_detail(request, app_label, model_name):
# Gather related objects
for rel in opts.get_all_related_objects():
- verbose = _("related `%s.%s` objects") % (rel.opts.app_label, rel.opts.object_name)
+ verbose = _("related `%(label)s.%(name)s` objects") % {'label': rel.opts.app_label, 'name': rel.opts.object_name}
accessor = rel.get_accessor_name()
fields.append({
'name' : "%s.all" % accessor,
diff --git a/django/contrib/contenttypes/management.py b/django/contrib/contenttypes/management.py
index f492f54303..3572d93049 100644
--- a/django/contrib/contenttypes/management.py
+++ b/django/contrib/contenttypes/management.py
@@ -7,6 +7,7 @@ from django.db.models import get_apps, get_models, signals
def create_contenttypes(app, created_models, verbosity=2):
from django.contrib.contenttypes.models import ContentType
+ ContentType.objects.clear_cache()
app_models = get_models(app)
if not app_models:
return
diff --git a/django/contrib/contenttypes/models.py b/django/contrib/contenttypes/models.py
index 3384134cb2..0a5e68f37e 100644
--- a/django/contrib/contenttypes/models.py
+++ b/django/contrib/contenttypes/models.py
@@ -19,6 +19,16 @@ class ContentTypeManager(models.Manager):
model=key[1], defaults={'name': str(opts.verbose_name)})
CONTENT_TYPE_CACHE[key] = ct
return ct
+
+ def clear_cache(self):
+ """
+ Clear out the content-type cache. This needs to happen during database
+ flushes to prevent caching of "stale" content type IDs (see
+ django.contrib.contenttypes.management.create_contenttypes for where
+ this gets called).
+ """
+ global CONTENT_TYPE_CACHE
+ CONTENT_TYPE_CACHE = {}
class ContentType(models.Model):
name = models.CharField(maxlength=100)
diff --git a/django/contrib/humanize/templatetags/humanize.py b/django/contrib/humanize/templatetags/humanize.py
index b2d28a0ab4..a399e7eef1 100644
--- a/django/contrib/humanize/templatetags/humanize.py
+++ b/django/contrib/humanize/templatetags/humanize.py
@@ -1,3 +1,5 @@
+from django.utils.translation import ngettext
+from django.utils.translation import gettext_lazy as _
from django import template
import re
@@ -12,9 +14,9 @@ def ordinal(value):
value = int(value)
except ValueError:
return value
- t = ('th', 'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th')
+ t = (_('th'), _('st'), _('nd'), _('rd'), _('th'), _('th'), _('th'), _('th'), _('th'), _('th'))
if value % 100 in (11, 12, 13): # special case
- return '%dth' % value
+ return "%d%s" % (value, t[0])
return '%d%s' % (value, t[value % 10])
register.filter(ordinal)
@@ -41,11 +43,14 @@ def intword(value):
if value < 1000000:
return value
if value < 1000000000:
- return '%.1f million' % (value / 1000000.0)
+ new_value = value / 1000000.0
+ return ngettext('%(value).1f million', '%(value).1f million', new_value) % {'value': new_value}
if value < 1000000000000:
- return '%.1f billion' % (value / 1000000000.0)
+ new_value = value / 1000000000.0
+ return ngettext('%(value).1f billion', '%(value).1f billion', new_value) % {'value': new_value}
if value < 1000000000000000:
- return '%.1f trillion' % (value / 1000000000000.0)
+ new_value = value / 1000000000000.0
+ return ngettext('%(value).1f trillion', '%(value).1f trillion', new_value) % {'value': new_value}
return value
register.filter(intword)
@@ -60,5 +65,5 @@ def apnumber(value):
return value
if not 0 < value < 10:
return value
- return ('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine')[value-1]
+ return (_('one'), _('two'), _('three'), _('four'), _('five'), _('six'), _('seven'), _('eight'), _('nine'))[value-1]
register.filter(apnumber)
diff --git a/django/core/management.py b/django/core/management.py
index 97deb58361..6b965b1724 100644
--- a/django/core/management.py
+++ b/django/core/management.py
@@ -1463,7 +1463,7 @@ def dump_data(app_labels, format='json', indent=None):
for model in get_models(app):
objects.extend(model.objects.all())
try:
- print serializers.serialize(format, objects, indent=indent)
+ return serializers.serialize(format, objects, indent=indent)
except Exception, e:
sys.stderr.write(style.ERROR("Unable to serialize database: %s\n" % e))
dump_data.help_doc = 'Output the contents of the database as a fixture of the given format'
@@ -1609,7 +1609,7 @@ def execute_from_command_line(action_mapping=DEFAULT_ACTION_MAPPING, argv=None):
parser.print_usage_and_exit()
elif action == 'dumpdata':
try:
- action_mapping[action](args[1:], options.format, options.indent)
+ print action_mapping[action](args[1:], options.format, options.indent)
except IndexError:
parser.print_usage_and_exit()
elif action in ('startapp', 'startproject'):
diff --git a/django/core/serializers/__init__.py b/django/core/serializers/__init__.py
index f20258c416..494393f3cf 100644
--- a/django/core/serializers/__init__.py
+++ b/django/core/serializers/__init__.py
@@ -25,6 +25,13 @@ BUILTIN_SERIALIZERS = {
"json" : "django.core.serializers.json",
}
+# Check for PyYaml and register the serializer if it's available.
+try:
+ import yaml
+ BUILTIN_SERIALIZERS["yaml"] = "django.core.serializers.pyyaml"
+except ImportError:
+ pass
+
_serializers = {}
def register_serializer(format, serializer_module):
diff --git a/django/core/serializers/base.py b/django/core/serializers/base.py
index 0ec05d1cf3..7dde2a4faf 100644
--- a/django/core/serializers/base.py
+++ b/django/core/serializers/base.py
@@ -54,11 +54,7 @@ class Serializer(object):
Convert a field's value to a string.
"""
if isinstance(field, models.DateTimeField):
- value = getattr(obj, field.name)
- if value is None:
- value = ''
- else:
- value = value.strftime("%Y-%m-%d %H:%M:%S")
+ value = getattr(obj, field.name).strftime("%Y-%m-%d %H:%M:%S")
elif isinstance(field, models.FileField):
value = getattr(obj, "get_%s_url" % field.name, lambda: None)()
else:
diff --git a/django/core/serializers/python.py b/django/core/serializers/python.py
index a9baa01d5a..29ce6bf9bd 100644
--- a/django/core/serializers/python.py
+++ b/django/core/serializers/python.py
@@ -57,7 +57,7 @@ def Deserializer(object_list, **options):
for d in object_list:
# Look up the model and starting build a dict of data for it.
Model = _get_model(d["model"])
- data = {Model._meta.pk.attname : d["pk"]}
+ data = {Model._meta.pk.attname : Model._meta.pk.to_python(d["pk"])}
m2m_data = {}
# Handle each field
@@ -70,16 +70,17 @@ def Deserializer(object_list, **options):
# Handle M2M relations
if field.rel and isinstance(field.rel, models.ManyToManyRel):
pks = []
+ m2m_convert = field.rel.to._meta.pk.to_python
for pk in field_value:
if isinstance(pk, unicode):
- pks.append(pk.encode(options.get("encoding", settings.DEFAULT_CHARSET)))
+ pks.append(m2m_convert(pk.encode(options.get("encoding", settings.DEFAULT_CHARSET))))
else:
- pks.append(pk)
+ pks.append(m2m_convert(pk))
m2m_data[field.name] = pks
# Handle FK fields
elif field.rel and isinstance(field.rel, models.ManyToOneRel):
- data[field.attname] = field_value
+ data[field.attname] = field.rel.to._meta.pk.to_python(field_value)
# Handle all other fields
else:
diff --git a/django/core/serializers/pyyaml.py b/django/core/serializers/pyyaml.py
new file mode 100644
index 0000000000..f45a511e79
--- /dev/null
+++ b/django/core/serializers/pyyaml.py
@@ -0,0 +1,36 @@
+"""
+YAML serializer.
+
+Requires PyYaml (http://pyyaml.org/), but that's checked for in __init__.
+"""
+
+import datetime
+from django.core.serializers.python import Serializer as PythonSerializer
+from django.core.serializers.python import Deserializer as PythonDeserializer
+try:
+ from cStringIO import StringIO
+except ImportError:
+ from StringIO import StringIO
+import yaml
+
+class Serializer(PythonSerializer):
+ """
+ Convert a queryset to JSON.
+ """
+ def end_serialization(self):
+ yaml.dump(self.objects, self.stream, **self.options)
+
+ def getvalue(self):
+ return self.stream.getvalue()
+
+def Deserializer(stream_or_string, **options):
+ """
+ Deserialize a stream or string of JSON data.
+ """
+ if isinstance(stream_or_string, basestring):
+ stream = StringIO(stream_or_string)
+ else:
+ stream = stream_or_string
+ for obj in PythonDeserializer(yaml.load(stream)):
+ yield obj
+
diff --git a/django/core/serializers/xml_serializer.py b/django/core/serializers/xml_serializer.py
index 8fa7bbfac9..9e37f03cc2 100644
--- a/django/core/serializers/xml_serializer.py
+++ b/django/core/serializers/xml_serializer.py
@@ -57,10 +57,12 @@ class Serializer(base.Serializer):
})
# Get a "string version" of the object's data (this is handled by the
- # serializer base class). None is handled specially.
- value = self.get_string_value(obj, field)
- if value is not None:
+ # serializer base class).
+ if getattr(obj, field.name) is not None:
+ value = self.get_string_value(obj, field)
self.xml.characters(str(value))
+ else:
+ self.xml.addQuickElement("None")
self.xml.endElement("field")
@@ -127,7 +129,8 @@ class Deserializer(base.Deserializer):
pk = node.getAttribute("pk")
if not pk:
raise base.DeserializationError("<object> node is missing the 'pk' attribute")
- data = {Model._meta.pk.name : pk}
+
+ data = {Model._meta.pk.attname : Model._meta.pk.to_python(pk)}
# Also start building a dict of m2m data (this is saved as
# {m2m_accessor_attribute : [list_of_related_objects]})
@@ -148,17 +151,20 @@ class Deserializer(base.Deserializer):
# As is usually the case, relation fields get the special treatment.
if field.rel and isinstance(field.rel, models.ManyToManyRel):
- m2m_data[field.name] = self._handle_m2m_field_node(field_node)
+ m2m_data[field.name] = self._handle_m2m_field_node(field_node, field)
elif field.rel and isinstance(field.rel, models.ManyToOneRel):
- data[field.attname] = self._handle_fk_field_node(field_node)
+ data[field.attname] = self._handle_fk_field_node(field_node, field)
else:
- value = field.to_python(getInnerText(field_node).strip().encode(self.encoding))
+ if len(field_node.childNodes) == 1 and field_node.childNodes[0].nodeName == 'None':
+ value = None
+ else:
+ value = field.to_python(getInnerText(field_node).strip().encode(self.encoding))
data[field.name] = value
# Return a DeserializedObject so that the m2m data has a place to live.
return base.DeserializedObject(Model(**data), m2m_data)
- def _handle_fk_field_node(self, node):
+ def _handle_fk_field_node(self, node, field):
"""
Handle a <field> node for a ForeignKey
"""
@@ -166,13 +172,16 @@ class Deserializer(base.Deserializer):
if len(node.childNodes) == 1 and node.childNodes[0].nodeName == 'None':
return None
else:
- return getInnerText(node).strip().encode(self.encoding)
+ return field.rel.to._meta.pk.to_python(
+ getInnerText(node).strip().encode(self.encoding))
- def _handle_m2m_field_node(self, node):
+ def _handle_m2m_field_node(self, node, field):
"""
Handle a <field> node for a ManyToManyField
"""
- return [c.getAttribute("pk").encode(self.encoding) for c in node.getElementsByTagName("object")]
+ return [field.rel.to._meta.pk.to_python(
+ c.getAttribute("pk").encode(self.encoding))
+ for c in node.getElementsByTagName("object")]
def _get_model_from_node(self, node, attr):
"""
diff --git a/django/core/validators.py b/django/core/validators.py
index ebfbd3961e..bd7d790e04 100644
--- a/django/core/validators.py
+++ b/django/core/validators.py
@@ -140,7 +140,8 @@ def _isValidDate(date_string):
try:
date(year, month, day)
except ValueError, e:
- raise ValidationError, gettext('Invalid date: %s.' % e)
+ msg = gettext('Invalid date: %s') % gettext(str(e))
+ raise ValidationError, msg
def isValidANSIDate(field_data, all_data):
if not ansi_date_re.search(field_data):
@@ -363,7 +364,7 @@ class NumberIsInRange(object):
self.lower, self.upper = lower, upper
if not error_message:
if lower and upper:
- self.error_message = gettext("This value must be between %s and %s.") % (lower, upper)
+ self.error_message = gettext("This value must be between %(lower)s and %(upper)s.") % {'lower': lower, 'upper': upper}
elif lower:
self.error_message = gettext("This value must be at least %s.") % lower
elif upper:
diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
index d0d6078da9..c54aeedaa8 100644
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -762,6 +762,13 @@ class NullBooleanField(Field):
kwargs['null'] = True
Field.__init__(self, *args, **kwargs)
+ def to_python(self, value):
+ if value in (None, True, False): return value
+ if value in ('None'): return None
+ if value in ('t', 'True', '1'): return True
+ if value in ('f', 'False', '0'): return False
+ raise validators.ValidationError, gettext("This value must be either None, True or False.")
+
def get_manipulator_field_objs(self):
return [oldforms.NullBooleanField]
diff --git a/django/db/models/related.py b/django/db/models/related.py
index 8c64b464ec..2c1dc5c516 100644
--- a/django/db/models/related.py
+++ b/django/db/models/related.py
@@ -16,7 +16,7 @@ class RelatedObject(object):
self.opts = model._meta
self.field = field
self.edit_inline = field.rel.edit_inline
- self.name = '%s_%s' % (self.opts.app_label, self.opts.module_name)
+ self.name = '%s:%s' % (self.opts.app_label, self.opts.module_name)
self.var_name = self.opts.object_name.lower()
def flatten_data(self, follow, obj=None):
diff --git a/django/oldforms/__init__.py b/django/oldforms/__init__.py
index decf0f7064..56101984f5 100644
--- a/django/oldforms/__init__.py
+++ b/django/oldforms/__init__.py
@@ -130,7 +130,9 @@ class FormWrapper(object):
if self.edit_inline:
self.fill_inline_collections()
for inline_collection in self._inline_collections:
- if inline_collection.name == key:
+ # The 'orig_name' comparison is for backwards compatibility
+ # with hand-crafted forms.
+ if inline_collection.name == key or (':' not in key and inline_collection.orig_name == key):
return inline_collection
raise KeyError, "Could not find Formfield or InlineObjectCollection named %r" % key
@@ -226,6 +228,9 @@ class InlineObjectCollection(object):
self.errors = errors
self._collections = None
self.name = rel_obj.name
+ # This is the name used prior to fixing #1839. Needs for backwards
+ # compatibility.
+ self.orig_name = rel_obj.opts.module_name
def __len__(self):
self.fill()
diff --git a/django/template/defaultfilters.py b/django/template/defaultfilters.py
index b53375b42d..a025365c90 100644
--- a/django/template/defaultfilters.py
+++ b/django/template/defaultfilters.py
@@ -70,14 +70,15 @@ def floatformat(text, arg=-1):
With a negative numeric argument, it will display that many decimal
places -- but only if there's places to be displayed.
Examples:
- num1 = 34.23234
- num2 = 34.00000
- num1|floatformat results in 34.2
- num2|floatformat is 34
- num1|floatformat:3 is 34.232
- num2|floatformat:3 is 34.000
- num1|floatformat:-3 is 34.232
- num2|floatformat:-3 is 34
+
+ * num1 = 34.23234
+ * num2 = 34.00000
+ * num1|floatformat results in 34.2
+ * num2|floatformat is 34
+ * num1|floatformat:3 is 34.232
+ * num2|floatformat:3 is 34.000
+ * num1|floatformat:-3 is 34.232
+ * num2|floatformat:-3 is 34
"""
try:
f = float(text)
diff --git a/django/template/defaulttags.py b/django/template/defaulttags.py
index 6aa53cfd8b..ed870047b1 100644
--- a/django/template/defaulttags.py
+++ b/django/template/defaulttags.py
@@ -435,6 +435,15 @@ def cycle(parser, token):
cycle = register.tag(cycle)
def debug(parser, token):
+ """
+ Output a whole load of debugging information, including the current context and imported modules.
+
+ Sample usage::
+
+ <pre>
+ {% debug %}
+ </pre>
+ """
return DebugNode()
debug = register.tag(debug)
@@ -538,21 +547,6 @@ def do_for(parser, token):
do_for = register.tag("for", do_for)
def do_ifequal(parser, token, negate):
- """
- Output the contents of the block if the two arguments equal/don't equal each other.
-
- Examples::
-
- {% ifequal user.id comment.user_id %}
- ...
- {% endifequal %}
-
- {% ifnotequal user.id comment.user_id %}
- ...
- {% else %}
- ...
- {% endifnotequal %}
- """
bits = list(token.split_contents())
if len(bits) != 3:
raise TemplateSyntaxError, "%r takes two arguments" % bits[0]
@@ -568,11 +562,27 @@ def do_ifequal(parser, token, negate):
#@register.tag
def ifequal(parser, token):
+ """
+ Output the contents of the block if the two arguments equal each other.
+
+ Examples::
+
+ {% ifequal user.id comment.user_id %}
+ ...
+ {% endifequal %}
+
+ {% ifnotequal user.id comment.user_id %}
+ ...
+ {% else %}
+ ...
+ {% endifnotequal %}
+ """
return do_ifequal(parser, token, False)
ifequal = register.tag(ifequal)
#@register.tag
def ifnotequal(parser, token):
+ """Output the contents of the block if the two arguments are not equal. See ifequal"""
return do_ifequal(parser, token, True)
ifnotequal = register.tag(ifnotequal)
@@ -889,8 +899,9 @@ templatetag = register.tag(templatetag)
def url(parser, token):
"""
- Returns an absolute URL matching given view with its parameters. This is a
- way to define links that aren't tied to a particular url configuration:
+ Returns an absolute URL matching given view with its parameters.
+
+ This is a way to define links that aren't tied to a particular url configuration::
{% url path.to.some_view arg1,arg2,name1=value1 %}
@@ -901,16 +912,16 @@ def url(parser, token):
URL. All arguments for the URL should be present.
For example if you have a view ``app_name.client`` taking client's id and
- the corresponding line in a urlconf looks like this:
+ the corresponding line in a urlconf looks like this::
('^client/(\d+)/$', 'app_name.client')
and this app's urlconf is included into the project's urlconf under some
- path:
+ path::
('^clients/', include('project_name.app_name.urls'))
- then in a template you can create a link for a certain client like this:
+ then in a template you can create a link for a certain client like this::
{% url app_name.client client.id %}
diff --git a/django/utils/dateformat.py b/django/utils/dateformat.py
index e3712175af..a558e3a69f 100644
--- a/django/utils/dateformat.py
+++ b/django/utils/dateformat.py
@@ -13,6 +13,7 @@ Usage:
from django.utils.dates import MONTHS, MONTHS_3, MONTHS_AP, WEEKDAYS
from django.utils.tzinfo import LocalTimezone
+from django.utils.translation import gettext as _
from calendar import isleap, monthrange
import re, time
@@ -36,14 +37,14 @@ class TimeFormat(Formatter):
def a(self):
"'a.m.' or 'p.m.'"
if self.data.hour > 11:
- return 'p.m.'
- return 'a.m.'
+ return _('p.m.')
+ return _('a.m.')
def A(self):
"'AM' or 'PM'"
if self.data.hour > 11:
- return 'PM'
- return 'AM'
+ return _('PM')
+ return _('AM')
def B(self):
"Swatch Internet time"
@@ -91,9 +92,9 @@ class TimeFormat(Formatter):
Proprietary extension.
"""
if self.data.minute == 0 and self.data.hour == 0:
- return 'midnight'
+ return _('midnight')
if self.data.minute == 0 and self.data.hour == 12:
- return 'noon'
+ return _('noon')
return '%s %s' % (self.f(), self.a())
def s(self):
diff --git a/django/views/i18n.py b/django/views/i18n.py
index b5eb32bda3..0a19cfe986 100644
--- a/django/views/i18n.py
+++ b/django/views/i18n.py
@@ -9,16 +9,16 @@ def set_language(request):
"""
Redirect to a given url while setting the chosen language in the
session or cookie. The url and the language code need to be
- specified in the GET paramters.
+ specified in the GET parameters.
"""
- lang_code = request.GET['language']
+ lang_code = request.GET.get('language', None)
next = request.GET.get('next', None)
if not next:
next = request.META.get('HTTP_REFERER', None)
if not next:
next = '/'
response = http.HttpResponseRedirect(next)
- if check_for_language(lang_code):
+ if lang_code and check_for_language(lang_code):
if hasattr(request, 'session'):
request.session['django_language'] = lang_code
else:
diff --git a/docs/fastcgi.txt b/docs/fastcgi.txt
index 1efeaf09cf..5ecaac8666 100644
--- a/docs/fastcgi.txt
+++ b/docs/fastcgi.txt
@@ -304,3 +304,14 @@ If you have access to a command shell on a Unix system, you can accomplish this
easily by using the ``touch`` command::
touch mysite.fcgi
+
+Serving admin media files
+=========================
+
+Regardless of the server and configuration you eventually decide to use, you will
+also need to give some thought to how to serve the admin media files. The
+advice given in the modpython_ documentation is also applicable in the setups
+detailed above.
+
+.. _modpython: ../modpython/#serving-the-admin-files
+
diff --git a/docs/forms.txt b/docs/forms.txt
index 8c40eeb997..f76f6d27ef 100644
--- a/docs/forms.txt
+++ b/docs/forms.txt
@@ -417,6 +417,27 @@ Here's a simple function that might drive the above form::
form = forms.FormWrapper(manipulator, new_data, errors)
return render_to_response('contact_form.html', {'form': form})
+Implementing ``flatten_data`` for custom manipulators
+------------------------------------------------------
+
+It is possible (although rarely needed) to replace the default automatically
+created manipulators on a model with your own custom manipulators. If you do
+this and you are intending to use those models in generic views, you should
+also define a ``flatten_data`` method in any ``ChangeManipulator`` replacement.
+This should act like the default ``flatten_data`` and return a dictionary
+mapping field names to their values, like so::
+
+ def flatten_data(self):
+ obj = self.original_object
+ return dict(
+ from = obj.from,
+ subject = obj.subject,
+ ...
+ )
+
+In this way, your new change manipulator will act exactly like the default
+version.
+
``FileField`` and ``ImageField`` special cases
==============================================
diff --git a/docs/i18n.txt b/docs/i18n.txt
index d7f5db6861..d430a56160 100644
--- a/docs/i18n.txt
+++ b/docs/i18n.txt
@@ -282,6 +282,17 @@ How to create language files
Once you've tagged your strings for later translation, you need to write (or
obtain) the language translations themselves. Here's how that works.
+.. admonition:: Locale restrictions
+
+ Django does not support localising your application into a locale for
+ which Django itself has not been translated -- it will ignore your
+ translation files. If you were to try this and Django supported it, you
+ would inevitably see a mixture of translated strings (from your
+ application) and English strings (from Django itself). If you are wanting
+ to support a locale for your application that is not already part of
+ Django, you will need to make at least a minimal translation of the Django
+ core.
+
Message files
-------------