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 favo@exoweb.net Eric Floehr + Jorge Gajon 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 Binary files a/django/conf/locale/fr/LC_MESSAGES/django.mo and b/django/conf/locale/fr/LC_MESSAGES/django.mo 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 \n" +"Last-Translator: Baptiste Goupil \n" "Language-Team: français \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 "" "
    \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 forgotten your password?" -msgstr "Avez vous perdu votre mot de passe?" +#: 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/base.html:23 +#: contrib/admin/templates/admin/change_form.html:50 +msgid "Ordering" +msgstr "Tri" + +#: 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 %(username)s." +msgstr "" +"Entrez un nouveau mot de passe pour l'utilisateur %(username)s." + +#: 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,53 +1973,226 @@ 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/contenttypes/models.py:26 +msgid "python model class name" +msgstr "nom du module python" -#: contrib/admin/templates/widget/date_time.html:4 -msgid "Time:" -msgstr "Heure :" +#: contrib/contenttypes/models.py:29 +msgid "content type" +msgstr "type de contenu" -#: contrib/admin/templates/widget/file.html:2 -msgid "Currently:" -msgstr "Actuellement :" +#: contrib/contenttypes/models.py:30 +msgid "content types" +msgstr "types de contenu" -#: contrib/admin/templates/widget/file.html:3 -msgid "Change:" -msgstr "Modification :" +#: contrib/auth/views.py:39 +msgid "Logged out" +msgstr "Déconnecté" -#: contrib/redirects/models.py:7 -msgid "redirect from" -msgstr "redirigé depuis" +#: contrib/auth/models.py:38 contrib/auth/models.py:57 +msgid "name" +msgstr "nom" -#: contrib/redirects/models.py:8 +#: contrib/auth/models.py:40 +msgid "codename" +msgstr "nom de code" + +#: contrib/auth/models.py:42 +msgid "permission" +msgstr "permission" + +#: contrib/auth/models.py:43 contrib/auth/models.py:58 +msgid "permissions" +msgstr "permissions" + +#: contrib/auth/models.py:60 +msgid "group" +msgstr "groupe" + +#: contrib/auth/models.py:61 contrib/auth/models.py:100 +msgid "groups" +msgstr "groupes" + +#: contrib/auth/models.py:90 +msgid "username" +msgstr "nom d'utilisateur" + +#: contrib/auth/models.py:90 msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." +"Required. 30 characters or fewer. Alphanumeric characters only (letters, " +"digits and underscores)." msgstr "" -"Ceci doit être un chemin absolu, sans nom de domaine. Par exemple: '/events/" -"search/'." +"Requis. 30 caractères maximum, alphanumériques uniquement (lettres, " +"chiffres, et tirets bas '_')." -#: contrib/redirects/models.py:9 -msgid "redirect to" -msgstr "redirigé vers" +#: contrib/auth/models.py:91 +msgid "first name" +msgstr "prénom" -#: contrib/redirects/models.py:10 +#: contrib/auth/models.py:92 +msgid "last name" +msgstr "nom" + +#: contrib/auth/models.py:93 +msgid "e-mail address" +msgstr "courriel" + +#: contrib/auth/models.py:94 +msgid "password" +msgstr "mot de passe" + +#: contrib/auth/models.py:94 msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." +"Use '[algo]$[salt]$[hexdigest]' or use the change " +"password form." msgstr "" -"Ceci peut être soit un chemin absolu (voir ci-dessus) soit une URL complète " -"débutant par 'http://'." +"Utilisez [algo]$[salt]$[hexdigest]' ou le formulaire " +"de changement de mot de passe." -#: contrib/redirects/models.py:12 -msgid "redirect" -msgstr "redirige" +#: contrib/auth/models.py:95 +msgid "staff status" +msgstr "statut équipe" -#: contrib/redirects/models.py:13 -msgid "redirects" -msgstr "redirige" +#: 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:96 +msgid "active" +msgstr "actif" + +#: 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: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:99 +msgid "date joined" +msgstr "date d'inscription" + +#: contrib/auth/models.py:101 +msgid "" +"In addition to the permissions manually assigned, this user will also get " +"all permissions granted to each group he/she is in." +msgstr "" +"En plus des permissions qui lui sont manuellement assignées, cet utilisateur " +"recevra aussi toutes les permissions de tous les groupes auquels il " +"appartient. " + +#: contrib/auth/models.py:102 +msgid "user permissions" +msgstr "permissions de l'utilisateur" + +#: contrib/auth/models.py:105 +msgid "user" +msgstr "utilisateur" + +#: contrib/auth/models.py:106 +msgid "users" +msgstr "utilisateurs" + +#: contrib/auth/models.py:111 +msgid "Personal info" +msgstr "Information personnelle" + +#: contrib/auth/models.py:112 +msgid "Permissions" +msgstr "Permissions" + +#: contrib/auth/models.py:113 +msgid "Important dates" +msgstr "Dates importantes" + +#: contrib/auth/models.py:114 +msgid "Groups" +msgstr "Groupes" + +#: contrib/auth/models.py:258 +msgid "message" +msgstr "message" + +#: 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." +msgstr "" +"Votre navigateur ne semble pas avoir activé les cookies. Les cookies sont " +"nécessaire pour se connecter" + +#: contrib/auth/forms.py:62 +msgid "This account is inactive." +msgstr "Ce compte est inactif." + +#: 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/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/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:52 +msgid "session data" +msgstr "donnée de session" + +#: contrib/sessions/models.py:53 +msgid "expire date" +msgstr "date d'expiration" + +#: contrib/sessions/models.py:57 +msgid "session" +msgstr "session" + +#: contrib/sessions/models.py:58 +msgid "sessions" +msgstr "sessions" #: contrib/flatpages/models.py:8 msgid "" @@ -1119,8 +2219,8 @@ 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'." +"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'." @@ -1143,187 +2243,6 @@ msgstr "page à plat" msgid "flat pages" msgstr "pages à plat" -#: contrib/auth/models.py:13 contrib/auth/models.py:26 -msgid "name" -msgstr "nom" - -#: contrib/auth/models.py:15 -msgid "codename" -msgstr "nom de code" - -#: contrib/auth/models.py:17 -msgid "permission" -msgstr "permission" - -#: contrib/auth/models.py:18 contrib/auth/models.py:27 -msgid "permissions" -msgstr "permissions" - -#: contrib/auth/models.py:29 -msgid "group" -msgstr "groupe" - -#: contrib/auth/models.py:30 contrib/auth/models.py:65 -msgid "groups" -msgstr "groupes" - -#: contrib/auth/models.py:55 -msgid "username" -msgstr "nom d'utilisateur" - -#: contrib/auth/models.py:56 -msgid "first name" -msgstr "prénom" - -#: contrib/auth/models.py:57 -msgid "last name" -msgstr "nom" - -#: contrib/auth/models.py:58 -msgid "e-mail address" -msgstr "courriel" - -#: contrib/auth/models.py:59 -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:60 -msgid "staff status" -msgstr "statut équipe" - -#: contrib/auth/models.py:60 -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 -msgid "active" -msgstr "actif" - -#: contrib/auth/models.py:62 -msgid "superuser status" -msgstr "statut super-utilisateur" - -#: contrib/auth/models.py:63 -msgid "last login" -msgstr "dernière connexion" - -#: contrib/auth/models.py:64 -msgid "date joined" -msgstr "date d'inscription" - -#: contrib/auth/models.py:66 -msgid "" -"In addition to the permissions manually assigned, this user will also get " -"all permissions granted to each group he/she is in." -msgstr "" -"En plus des permissions qui lui sont manuellement assignées, cet utilisateur " -"recevra aussi toutes les permissions de tous les groupes auquels il " -"appartient. " - -#: contrib/auth/models.py:67 -msgid "user permissions" -msgstr "permissions de l'utilisateur" - -#: contrib/auth/models.py:70 -msgid "user" -msgstr "utilisateur" - -#: contrib/auth/models.py:71 -msgid "users" -msgstr "utilisateurs" - -#: contrib/auth/models.py:76 -msgid "Personal info" -msgstr "Information personnelle" - -#: contrib/auth/models.py:77 -msgid "Permissions" -msgstr "Permissions" - -#: contrib/auth/models.py:78 -msgid "Important dates" -msgstr "Dates importantes" - -#: contrib/auth/models.py:79 -msgid "Groups" -msgstr "Groupes" - -#: contrib/auth/models.py:219 -msgid "message" -msgstr "message" - -#: contrib/auth/forms.py:30 -msgid "" -"Your Web browser doesn't appear to have cookies enabled. Cookies are " -"required for logging in." -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/contenttypes/models.py:28 -msgid "content type" -msgstr "type de contenu" - -#: contrib/contenttypes/models.py:29 -msgid "content types" -msgstr "types de contenu" - -#: contrib/sessions/models.py:35 -msgid "session key" -msgstr "clé de session" - -#: contrib/sessions/models.py:36 -msgid "session data" -msgstr "donnée de session" - -#: contrib/sessions/models.py:37 -msgid "expire date" -msgstr "date d'expiration" - -#: contrib/sessions/models.py:41 -msgid "session" -msgstr "session" - -#: contrib/sessions/models.py:42 -msgid "sessions" -msgstr "sessions" - -#: contrib/sites/models.py:10 -msgid "domain name" -msgstr "nom de domaine" - -#: contrib/sites/models.py:11 -msgid "display name" -msgstr "nom à afficher" - -#: contrib/sites/models.py:15 -msgid "site" -msgstr "site" - -#: contrib/sites/models.py:16 -msgid "sites" -msgstr "sites" - -#: utils/translation.py:360 -msgid "DATE_FORMAT" -msgstr "j F Y" - -#: utils/translation.py:361 -msgid "DATETIME_FORMAT" -msgstr "j F Y, G:i" - -#: utils/translation.py:362 -msgid "TIME_FORMAT" -msgstr "G:i:s" - #: utils/dates.py:6 msgid "Monday" msgstr "Lundi" @@ -1512,485 +2431,66 @@ msgid_plural "minutes" msgstr[0] "minute" msgstr[1] "minutes" -#: conf/global_settings.py:37 -msgid "Bengali" -msgstr "Indien" +#: utils/dateformat.py:40 +msgid "p.m." +msgstr "après-midi" -#: conf/global_settings.py:38 -msgid "Czech" -msgstr "Tchèque" +#: utils/dateformat.py:41 +msgid "a.m." +msgstr "matin" -#: conf/global_settings.py:39 -msgid "Welsh" -msgstr "Gallois" +#: utils/dateformat.py:46 +msgid "PM" +msgstr "Matin" -#: conf/global_settings.py:40 -msgid "Danish" -msgstr "Dannois" +#: utils/dateformat.py:47 +msgid "AM" +msgstr "Après-midi" -#: conf/global_settings.py:41 -msgid "German" -msgstr "Allemand" +#: utils/dateformat.py:95 +msgid "midnight" +msgstr "minuit" -#: conf/global_settings.py:42 -msgid "Greek" -msgstr "Grec" +#: utils/dateformat.py:97 +msgid "noon" +msgstr "midi" -#: conf/global_settings.py:43 -msgid "English" -msgstr "Anglais" +#: utils/translation/trans_real.py:362 +msgid "DATE_FORMAT" +msgstr "j F Y" -#: conf/global_settings.py:44 -msgid "Spanish" -msgstr "Espagnol" +#: utils/translation/trans_real.py:363 +msgid "DATETIME_FORMAT" +msgstr "j F Y, G:i" -#: conf/global_settings.py:45 -msgid "French" -msgstr "Français" +#: utils/translation/trans_real.py:364 +msgid "TIME_FORMAT" +msgstr "G:i:s" -#: conf/global_settings.py:46 -msgid "Galician" -msgstr "Galicien" +#: utils/translation/trans_real.py:380 +#, fuzzy +msgid "YEAR_MONTH_FORMAT" +msgstr "j F Y" -#: conf/global_settings.py:47 -msgid "Hungarian" -msgstr "Hongrois" +#: utils/translation/trans_real.py:381 +#, fuzzy +msgid "MONTH_DAY_FORMAT" +msgstr "j F Y" -#: 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." - -#: 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." - -#: 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\".)" - -#: 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\".)" - -#: 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\".)" - -#: 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\".)" - -#: 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." - -#: 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." - -#: forms/__init__.py:385 -msgid "Line breaks are not allowed here." -msgstr "Les retours à la ligne ne sont pas autorisés ici." - -#: 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." - -#: forms/__init__.py:645 -msgid "The submitted file is empty." -msgstr "Le fichier soumis est vide." - -#: 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." - -#: forms/__init__.py:708 -msgid "Enter a positive number." -msgstr "Entrez un nombre entier positif." - -#: forms/__init__.py:717 -msgid "Enter a whole number between 0 and 32,767." -msgstr "Entrez un nombre entier entre 0 et 32 767." - -#: template/defaultfilters.py:379 +#: template/defaultfilters.py:491 msgid "yes,no,maybe" msgstr "oui,non,peut-être" +#~ msgid "%dth" +#~ msgstr "%de" + +#~ msgid "Have you forgotten your password?" +#~ msgstr "" +#~ "Avez vous perdu votre mot de passe?" + +#~ 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(" 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 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 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:: + +
    +            {% debug %}
    +        
    + """ 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 -------------