diff --git a/AUTHORS b/AUTHORS
index 760ffdd21e..a2cf8c68cc 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -133,6 +133,7 @@ answer newbie questions, and generally made Django that much better:
masonsimon+django@gmail.com
Manuzhai
Petar Marić
+ Nuno Mariz
mark@junklight.com
Yasushi Masuda
mattycakes@gmail.com
diff --git a/django/__init__.py b/django/__init__.py
index 5d5461c867..a91a7e13c3 100644
--- a/django/__init__.py
+++ b/django/__init__.py
@@ -1 +1 @@
-VERSION = (0, 96, 'pre')
+VERSION = (0, 96, None)
diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py
index 02a882fd99..f26911d7f9 100644
--- a/django/conf/global_settings.py
+++ b/django/conf/global_settings.py
@@ -61,6 +61,7 @@ LANGUAGES = (
('nl', gettext_noop('Dutch')),
('no', gettext_noop('Norwegian')),
('pl', gettext_noop('Polish')),
+ ('pt', gettext_noop('Portugese')),
('pt-br', gettext_noop('Brazilian')),
('ro', gettext_noop('Romanian')),
('ru', gettext_noop('Russian')),
diff --git a/django/conf/locale/it/LC_MESSAGES/django.mo b/django/conf/locale/it/LC_MESSAGES/django.mo
index 584531c9b2..821828383e 100644
Binary files a/django/conf/locale/it/LC_MESSAGES/django.mo and b/django/conf/locale/it/LC_MESSAGES/django.mo differ
diff --git a/django/conf/locale/it/LC_MESSAGES/django.po b/django/conf/locale/it/LC_MESSAGES/django.po
index 94a83048be..66a4e09f88 100644
--- a/django/conf/locale/it/LC_MESSAGES/django.po
+++ b/django/conf/locale/it/LC_MESSAGES/django.po
@@ -11,7 +11,7 @@ msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2007-02-26 20:44+0100\n"
-"PO-Revision-Date: 2007-02-27 20:06+0100\n"
+"PO-Revision-Date: 2007-03-14 19:29+0100\n"
"Last-Translator: Nicola Larosa \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -523,7 +523,7 @@ msgstr ""
#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
msgid "The two password fields didn't match."
-msgstr "I due campi parola chiave non corrispondono."
+msgstr "I due campi password non corrispondono."
#: contrib/auth/forms.py:25
msgid "A user with that username already exists."
@@ -555,7 +555,7 @@ msgstr "Questo indirizzo email non è associato ad alcun account utente. Sei sic
#: contrib/auth/forms.py:117
msgid "The two 'new password' fields didn't match."
-msgstr "I due campi 'nuova parola chiave' non corrispondono."
+msgstr "I due campi 'nuova password' non corrispondono."
#: contrib/auth/forms.py:124
msgid "Your old password was entered incorrectly. Please enter it again."
@@ -609,13 +609,13 @@ msgstr "indirizzo e-mail"
#: contrib/auth/models.py:94
msgid "password"
-msgstr "parola chiave"
+msgstr "password"
#: contrib/auth/models.py:94
msgid ""
"Use '[algo]$[salt]$[hexdigest]' or use the change "
"password form."
-msgstr "Usare '[algo]$[salt]$[hexdigest]' oppure la maschera di cambio parola chiave."
+msgstr "Usare '[algo]$[salt]$[hexdigest]' oppure la maschera di cambio password."
#: contrib/auth/models.py:95
msgid "staff status"
@@ -1040,12 +1040,12 @@ msgstr "Aggiungi utente"
#: contrib/admin/views/auth.py:57
msgid "Password changed successfully."
-msgstr "La parola chiave è stata cambiata correttamente."
+msgstr "La password è stata cambiata correttamente."
#: contrib/admin/views/auth.py:64
#, python-format
msgid "Change password: %s"
-msgstr "Cambia la parola chiave: %s"
+msgstr "Cambia la password: %s"
#: contrib/admin/templatetags/admin_list.py:247
msgid "All dates"
@@ -1088,7 +1088,7 @@ msgstr "Documentazione"
#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/registration/password_change_done.html:3
msgid "Change password"
-msgstr "Cambia la parola chiave"
+msgstr "Cambia la password"
#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/change_form.html:10
@@ -1335,11 +1335,11 @@ msgstr "Nome utente:"
#: contrib/admin/templates/admin/login.html:20
#: contrib/comments/templates/comments/form.html:8
msgid "Password:"
-msgstr "Parola chiave:"
+msgstr "Password:"
#: contrib/admin/templates/admin/login.html:22
msgid "Have you forgotten your password?"
-msgstr "Hai dimenticato la parola chiave?"
+msgstr "Hai dimenticato la password?"
#: contrib/admin/templates/admin/base.html:25
msgid "Welcome,"
@@ -1349,7 +1349,7 @@ msgstr "Benvenuto,"
msgid ""
"First, enter a username and password. Then, you'll be able to edit more user "
"options."
-msgstr "Inserire innanzitutto nome utente e parola chiave. Si potrà quindi modificare le altre impostazioni dell'utente."
+msgstr "Inserire innanzitutto nome utente e password. Si potrà quindi modificare le altre impostazioni dell'utente."
#: contrib/admin/templates/admin/auth/user/add_form.html:12
msgid "Username"
@@ -1358,22 +1358,22 @@ msgstr "Nome utente"
#: contrib/admin/templates/admin/auth/user/add_form.html:18
#: contrib/admin/templates/admin/auth/user/change_password.html:34
msgid "Password"
-msgstr "Parola chiave"
+msgstr "Password"
#: contrib/admin/templates/admin/auth/user/add_form.html:23
#: contrib/admin/templates/admin/auth/user/change_password.html:39
msgid "Password (again)"
-msgstr "Parola chiave (di nuovo)"
+msgstr "Password (di nuovo)"
#: contrib/admin/templates/admin/auth/user/add_form.html:24
#: contrib/admin/templates/admin/auth/user/change_password.html:40
msgid "Enter the same password as above, for verification."
-msgstr "Inserire la stessa parola chiave inserita sopra, come verifica."
+msgstr "Inserire la stessa password inserita sopra, come verifica."
#: contrib/admin/templates/admin/auth/user/change_password.html:28
#, python-format
msgid "Enter a new password for the user %(username)s."
-msgstr "Inserire una nuova parola chiave per l'utente %(username)s."
+msgstr "Inserire una nuova password per l'utente %(username)s."
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
msgid "Bookmarklets"
@@ -1460,13 +1460,13 @@ msgstr "Modifica:"
#: contrib/admin/templates/registration/password_reset_form.html:10
#: contrib/admin/templates/registration/password_reset_done.html:4
msgid "Password reset"
-msgstr "Reimposta la parola chiave"
+msgstr "Reimposta la password"
#: contrib/admin/templates/registration/password_reset_form.html:12
msgid ""
"Forgotten your password? Enter your e-mail address below, and we'll reset "
"your password and e-mail the new one to you."
-msgstr "Dimenticata la parola chiave? Inserire il proprio indirizzo e-mail qui sotto: la parola chiave sarà reimpostata, e la nuova ti verrà inviata per e-mail."
+msgstr "Dimenticata la password? Inserire il proprio indirizzo e-mail qui sotto: la password sarà reimpostata, e la nuova ti verrà inviata per e-mail."
#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "E-mail address:"
@@ -1474,11 +1474,11 @@ msgstr "Indirizzo e-mail:"
#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "Reset my password"
-msgstr "Reimposta la mia parola chiave"
+msgstr "Reimposta la mia password"
#: contrib/admin/templates/registration/password_reset_email.html:2
msgid "You're receiving this e-mail because you requested a password reset"
-msgstr "Hai ricevuto questa e-mail perché hai chiesto di reimpostare la parola chiave"
+msgstr "Hai ricevuto questa e-mail perché hai chiesto di reimpostare la password"
#: contrib/admin/templates/registration/password_reset_email.html:3
#, python-format
@@ -1488,11 +1488,11 @@ msgstr "per il tuo account utente su %(site_name)s"
#: contrib/admin/templates/registration/password_reset_email.html:5
#, python-format
msgid "Your new password is: %(new_password)s"
-msgstr "La tua nuova parola chiave è: %(new_password)s"
+msgstr "La tua nuova password è: %(new_password)s"
#: contrib/admin/templates/registration/password_reset_email.html:7
msgid "Feel free to change this password by going to this page:"
-msgstr "Puoi liberamente cambiare la tua parola chiave tramite questa pagina:"
+msgstr "Puoi liberamente cambiare la tua password tramite questa pagina:"
#: contrib/admin/templates/registration/password_reset_email.html:11
msgid "Your username, in case you've forgotten:"
@@ -1518,51 +1518,51 @@ msgstr "Accedi di nuovo"
#: contrib/admin/templates/registration/password_reset_done.html:6
#: contrib/admin/templates/registration/password_reset_done.html:10
msgid "Password reset successful"
-msgstr "Parola chiave reimpostata correttamente"
+msgstr "Password reimpostata correttamente"
#: contrib/admin/templates/registration/password_reset_done.html:12
msgid ""
"We've e-mailed a new password to the e-mail address you submitted. You "
"should be receiving it shortly."
-msgstr "La nuova parola chiave è stata inviata all'indirizzo e-mail inserito. Arriverà a breve."
+msgstr "La nuova password è stata inviata all'indirizzo e-mail inserito. Arriverà a breve."
#: contrib/admin/templates/registration/password_change_form.html:4
#: contrib/admin/templates/registration/password_change_form.html:6
#: contrib/admin/templates/registration/password_change_form.html:10
#: contrib/admin/templates/registration/password_change_done.html:4
msgid "Password change"
-msgstr "Cambio di parola chiave"
+msgstr "Cambio password"
#: contrib/admin/templates/registration/password_change_form.html:12
msgid ""
"Please enter your old password, for security's sake, and then enter your new "
"password twice so we can verify you typed it in correctly."
-msgstr "Inserire l'attuale parola chiave, per ragioni di sicurezza, e poi la nuova parola chiave due volte, per verificare di averla scritta correttamente."
+msgstr "Inserire l'attuale password, per ragioni di sicurezza, e poi la nuova password due volte, per verificare di averla scritta correttamente."
#: contrib/admin/templates/registration/password_change_form.html:17
msgid "Old password:"
-msgstr "Parola chiave attuale:"
+msgstr "Password attuale:"
#: contrib/admin/templates/registration/password_change_form.html:19
msgid "New password:"
-msgstr "Nuova parola chiave:"
+msgstr "Nuova password:"
#: contrib/admin/templates/registration/password_change_form.html:21
msgid "Confirm password:"
-msgstr "Confermare la parola chiave:"
+msgstr "Confermare la password:"
#: contrib/admin/templates/registration/password_change_form.html:23
msgid "Change my password"
-msgstr "Modifica la mia parola chiave"
+msgstr "Modifica la mia password"
#: contrib/admin/templates/registration/password_change_done.html:6
#: contrib/admin/templates/registration/password_change_done.html:10
msgid "Password change successful"
-msgstr "Cambio di parola chiave avvenuto correttamente"
+msgstr "Cambio di password avvenuto correttamente"
#: contrib/admin/templates/registration/password_change_done.html:12
msgid "Your password was changed."
-msgstr "La parola chiave è stata cambiata."
+msgstr "La password è stata cambiata."
#: contrib/sites/models.py:10
msgid "domain name"
@@ -1905,7 +1905,7 @@ msgstr "Il modulo di commento non fornisce né 'anteprima' né 'invia'"
#: contrib/comments/templates/comments/form.html:8
msgid "Forgotten your password?"
-msgstr "Hai dimenticato la parola chiave?"
+msgstr "Hai dimenticato la password?"
#: contrib/comments/templates/comments/form.html:12
msgid "Ratings"
diff --git a/django/conf/locale/pl/LC_MESSAGES/djangojs.mo b/django/conf/locale/pl/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000000..752211a454
Binary files /dev/null and b/django/conf/locale/pl/LC_MESSAGES/djangojs.mo differ
diff --git a/django/conf/locale/pl/LC_MESSAGES/djangojs.po b/django/conf/locale/pl/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000000..8b929f309d
--- /dev/null
+++ b/django/conf/locale/pl/LC_MESSAGES/djangojs.po
@@ -0,0 +1,112 @@
+# translation of djangojs.po to Polish
+# Copyright (C) 2007 Michal Chruszcz
+# This file is distributed under the same license as the django package.
+#
+# Michal Chruszcz , 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: 0.1\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2007-03-12 11:42+0100\n"
+"Last-Translator: Michal Chruszcz \n"
+"Language-Team: Polish \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Dostępne %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Wybierz wszystko"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Dodaj"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Usuń"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Wybrano %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+#, fuzzy
+msgid "Select your choice(s) and click "
+msgstr "Zaznacz swój wybór i kliknij "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Wyczyść wszystko"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "Styczeń Luty Marzec Kwiecień Maj Czerwiec Lipiec Sierpień Wrzesień Październik Listopad Grudzień"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Niedziela Poniedziałek Wtorek Środa Czwartek Piątek Sobota"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "N Pn Wt Śr Cz Pt So"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Teraz"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Zegar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Wybierz czas"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Północ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 rano"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Południe"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Anuluj"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Dzisiaj"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Kalendarz"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Wczoraj"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Jutro"
+
diff --git a/django/conf/locale/pt/LC_MESSAGES/django.mo b/django/conf/locale/pt/LC_MESSAGES/django.mo
new file mode 100644
index 0000000000..7adc41be5b
Binary files /dev/null and b/django/conf/locale/pt/LC_MESSAGES/django.mo differ
diff --git a/django/conf/locale/pt/LC_MESSAGES/django.po b/django/conf/locale/pt/LC_MESSAGES/django.po
new file mode 100644
index 0000000000..d99f51d78b
--- /dev/null
+++ b/django/conf/locale/pt/LC_MESSAGES/django.po
@@ -0,0 +1,2125 @@
+# Portuguese translation of Django.
+# Copyright (C) 2007 the Lawrence Journal-World
+# This file is distributed under the same license as the PACKAGE package.
+# Nuno Mariz , 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django 0.96pre\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-03-15 15:43+0200\n"
+"PO-Revision-Date: 2007-03-16 10:00+0000\n"
+"Last-Translator: Nuno Mariz \n"
+"Language-Team: pt_PT \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID do objecto"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "título"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "comentário"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "avaliação #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "avaliação #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "avaliação #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "avaliação #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "avaliação #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "avaliação #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "avaliação #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "avaliação #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "é uma avaliação válida"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "data/hora de submissão"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "é público"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
+msgid "IP address"
+msgstr "Endereço IP"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "foi removido"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr "Seleccione esta opção se o comentário não é apropriado. Uma mensagem \"Este comentário foi removido\" será mostrada no seu lugar."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "comentários"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Objecto de conteúdo"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Colocado pelo utilizador %(user)s em %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "nome da pessoa"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "endereço ip"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "aprovado pela equipa"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "comentário livre"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "comentários livres"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "pontuação"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "data da pontuação"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "pontuação do karma"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "pontuações do karma"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "Avaliação %(score)d por %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"O utilizador %(user)s colocou uma flag neste comentário\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "data da flag"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "flag do utilizador"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "flags do utilizador"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Flag por %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "data de remoção"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "remoção pelo moderador"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "remoções pelo moderador"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Remoção de moderador %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Utilizadores anónimos não podem votar"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "ID de comentário inválido"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Não pode votar em si"
+
+#: contrib/comments/views/comments.py:27
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Esta avaliação é obrigatória porque introduziu pelo menos uma outra avaliação."
+
+#: contrib/comments/views/comments.py:111
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Este comentário foi colocado por um utilizador que efectuou menos de %(count)s comentário:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Este comentário foi colocado por um utilizador que efectuou menos de %(count)s comentários:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:116
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Este comentário foi colocado por um utilizador incompleto:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Apenas POSTs são autorizados"
+
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Um ou mais campos obrigatórios não foram submetidos"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Alguém modificou o formulário de comentário (violação de segurança)"
+
+#: contrib/comments/views/comments.py:206
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr "O formulário de comentário teve um parâmetro 'target' inválido -- o ID do objecto foi inválido"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "O formulário de comentário não forneceu nem 'preview' ou 'post'"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Utilizador:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Sair"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Palavra-passe:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Esqueceu-se da palavra-passe?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Avaliações"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Obrigatório"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opcional"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Colocar uma foto"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Comentário:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Pré-visualizar comentário"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "O seu nome:"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"
By %s:
\n"
+"
\n"
+msgstr ""
+"
Por %s:
\n"
+"
\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
+msgid "All"
+msgstr "Todos"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Qualquer data"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Hoje"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Últimos 7 dias"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Este mês"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Este ano"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Sim"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Não"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Desconhecido"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "hora da acção"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id do objecto"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "repr do objecto"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "flag de acção"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "modificar mensagem"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "entrada de log"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "entradas de log"
+
+#: contrib/admin/templatetags/admin_list.py:230
+msgid "All dates"
+msgstr "Todas as datas"
+
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:59
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr "Por favor introduza o utilizador e palavra-passe correctos. Note que ambos os casos diferenciam maiúsculas e minúsculas."
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Entrar"
+
+#: contrib/admin/views/decorators.py:62
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr "Por favor autentique-se novamente, porque a sua sessão expirou. Não se preocupe: Os dados submetidos foram gravados."
+
+#: contrib/admin/views/decorators.py:69
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr "Aparentemente o seu browser não está configurado para aceitar cookies. Por favor active os cookies, carrege novamente a página e volte a tentar."
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "Nomes de utilizador não podem conter o caracter '@'."
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "O seu endereço de e-mail não é o seu nome de utilizador. Tente usar '%s'."
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "Administração do site"
+
+#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:17
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "O(A) %(name)s \"%(obj)s\" foi adicionado(a) com sucesso."
+
+#: contrib/admin/views/main.py:261 contrib/admin/views/main.py:347
+#: contrib/admin/views/auth.py:22
+msgid "You may edit it again below."
+msgstr "Pode editá-lo(a) outra vez abaixo."
+
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr "Pode adicionar outro %s abaixo."
+
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "Adicionar %s"
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "Foi adicionado %s"
+
+#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:339
+msgid "and"
+msgstr "e"
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr "Foi modificado %s."
+
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "Foi removido %s."
+
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "Nenhum campo foi modificado."
+
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "O(A) %(name)s \"%(obj)s\" foi modificado(a) com sucesso."
+
+#: contrib/admin/views/main.py:353
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "O(A) %(name)s \"%(obj)s\" foi adicionado(a) com sucesso. Pode voltar a editar novamente abaixo."
+
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr "Modificar %s"
+
+#: contrib/admin/views/main.py:473
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Um ou mais %(fieldname)s em %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:478
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Um ou mais %(fieldname)s em %(name)s:"
+
+#: contrib/admin/views/main.py:511
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "O(A) %(name)s \"%(obj)s\" foi removido(a) com sucesso."
+
+#: contrib/admin/views/main.py:514
+msgid "Are you sure?"
+msgstr "Tem a certeza?"
+
+#: contrib/admin/views/main.py:536
+#, python-format
+msgid "Change history: %s"
+msgstr "Histórico de modificações: %s"
+
+#: contrib/admin/views/main.py:570
+#, python-format
+msgid "Select %s"
+msgstr "Seleccionar %s"
+
+#: contrib/admin/views/main.py:570
+#, python-format
+msgid "Select %s to change"
+msgstr "Seleccione %s para modificar"
+
+#: contrib/admin/views/main.py:758
+msgid "Database error"
+msgstr "Erro de base de dados"
+
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "tag:"
+
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "filtro:"
+
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "ver:"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "A aplicação %r não encontrada"
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %r not found in app %r"
+msgstr "O Model %r não foi encontrado na aplicação %r"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%s.%s` object"
+msgstr "o objecto `%s.%s` relacionado"
+
+#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr "model:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%s.%s` objects"
+msgstr "os objectos `%s.%s` relacionados"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "todos %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "número de %s"
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Campos nos objectos %s"
+
+#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309
+#: contrib/admin/views/doc.py:310 contrib/admin/views/doc.py:312
+msgid "Integer"
+msgstr "Inteiro"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (Pode ser True ou False)"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "String (até %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "Inteiros separados por virgula"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "Data (sem hora)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "Data (com hora)"
+
+#: contrib/admin/views/doc.py:297
+msgid "E-mail address"
+msgstr "Endereço de e-mail"
+
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
+msgid "File path"
+msgstr "Caminho do ficheiro"
+
+#: contrib/admin/views/doc.py:300
+msgid "Decimal number"
+msgstr "Número décimal"
+
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolean (Pode ser True, False ou None)"
+
+#: contrib/admin/views/doc.py:307
+msgid "Relation to parent model"
+msgstr "Relação para o pai do model"
+
+#: contrib/admin/views/doc.py:308
+msgid "Phone number"
+msgstr "Número de telefone"
+
+#: contrib/admin/views/doc.py:313
+msgid "Text"
+msgstr "Texto"
+
+#: contrib/admin/views/doc.py:314
+msgid "Time"
+msgstr "Hora"
+
+#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "Estado dos E.U.A (duas letras em maiúsculas)"
+
+#: contrib/admin/views/doc.py:317
+msgid "XML text"
+msgstr "Texto XML"
+
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s não parece ser um objecto urlpattern"
+
+#: contrib/admin/views/auth.py:28
+msgid "Add user"
+msgstr "Adicionar utilizador"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Documentação"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Modificar palavra-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:30
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Início"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "História"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Data/hora"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Utilizador"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Acção"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr "Este objecto não tem histórico de modificações. Provavelmente não foi modificado via site de administração."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Site de administração do Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administração do Django"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Erro do servidor"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Erro do servidor (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error (500)"
+msgstr "Erro do servidor (500)"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr "Ocorreu um erro. Foi reportado aos administradores do site via e-mail e deverá ser corrigido brevemente. Obrigado pela sua paciência."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Página não encontrada"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Pedimos desculpa, mas a página solicitada não foi encontrada."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Models disponíveis na aplicação %(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"
+msgstr "Adicionar"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Modificar"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Não tem permissão para modificar nada."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Acções Recentes"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "As minhas Acções"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Nenhum disponível"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Adicionar %(name)s"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you forgotten your password?"
+msgstr "Esqueceu-se a sua palavra-passe?"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Bem-vindo,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Remover"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr "A remoção de %(object_name)s '%(escaped_objects)s' resultará na remoção dos objectos relacionados, mas a sua conta não tem permissão de remoção dos seguintes tipos de objectos:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr "Tem a certeza que deseja remover %(object_name)s \"%(escaped_object)s\"? Todos os items relacionados seguintes irão ser removidos:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Sim, tenho a certeza"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Por %(filter_title)s "
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Ir"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 resultado"
+msgstr[1] "%(counter)s resultados"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s no total"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Mostrar todos"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filtro"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Ver no site"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Por favor corrija o erro abaixo."
+msgstr[1] "Por favor corrija os erros abaixo."
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Ordenação"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Ordem:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Gravar como novo"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Gravar e adicionar outro"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Gravar e continuar a editar"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Gravar"
+
+#: 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 "Passa-se algo de errado com a instalação da sua base de dados. Verifique se as tabelas da base de dados foram criadas apropriadamente e verifique se a base de dados pode ser lida pelo utilizador definido."
+
+#: 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 "Primeiro introduza o nome do utilizador e palavra-passe. Depois poderá editar mais opções do utilizador."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Utilizador"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "Palavra-passe"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "Palavra-passe (novamente)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "Introduza a palavra-passe como acima, para verificação."
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Modificação de palavra-passe"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Palavra-passe modificada com sucesso"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "A sua palavra-passe foi modificada."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Reinicializar palavra-passe"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr "Esqueceu-se da palavra-passe? Introduza o seu email abaixo, e enviaremos a sua palavra-passe reinicializada para o seu e-mail."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Endereço de e-mail:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Reinicializar a minha palavra-passe"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Obrigado por ter gasto tempo de qualidade no Web site hoje."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Entrar novamente"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Palavra-passe reinicializada com sucesso"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr "Foi enviada uma nova palavra-passe nova para o e-mail que submeteu. Deverá estar a recebê-la brevemente."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr "Por razões de segurança, por favor introduza a sua palavra-passe antiga e depois introduza a nova duas vezes para que possamos verificar se introduziu correctamente."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Palavra-passe antiga:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Nova password:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Confirmação da palavra-passe:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Modificar a minha palavra-passe"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Está a receber este e-mail porque requisitou a reinicialização da sua palavra-passe"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "para a sua conta de utilizador em %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "A sua nova palavra-chave é: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Tenha a liberdade de modificar esta palavra-passe através desta página:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "O seu nome de utilizador, no caso de se ter esquecido:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Obrigado pela sua visita ao nosso site!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "A equipa do %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Itens do bookmark"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Documentação dos itens do bookmark"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"
To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site. Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").
\n"
+msgstr ""
+"\n"
+"
Para instalar itens no bookmark, arraste o link para sua barra \n"
+"de bookmarks, ou clique com o lado direito do rato no link e adicione ao seus bookmarks. Agora pode \n"
+"seleccionar o link do bookmark de qualquer página no site. Note que alguns destes \n"
+"itens do bookmark requerem que visualize o site de um computador designado \n"
+"por \"internal\" (entre em contacto com o seu administrador de sistema se \n"
+"não tiver a certeza se o seu computador é \"internal\".
\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Documentação desta página"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr "Vai de qualquer página para a documentação da view que gera essa página."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Mostrar o ID do objecto"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr "Mostra o tipo de conteúdo e o ID único para as páginas que representam um único objecto."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Editar este objecto (janela actual)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Vai para a página de admin para as páginas que representam um único objecto."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Editar este objecto (nova janela)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Tal como acima, mas abre a página de admin numa nova janela."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Data:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Hora:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Actualmente:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Modificar:"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redireccionar de"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr "Isto deverá ser um caminho absoluto, excluindo o domínio. Exemplo: '/events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redireccionar para"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr "Isto poderá ser um caminho absoluto (como acima) ou um URL completo começado por 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "redireccionar"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "redirecciona"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Exemplo: '/about/contact/'. Verifique se possui as barras no inicio e no fim."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "titulo"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "conteúdo"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "permitir comentários"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nome da template"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr "Exemplo: 'flatpages/contact_page.html'. Se não for fornecido, o sistema usará: 'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "é necessário registo"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Se estiver seleccionado, apenas utilizadores autenticados poderão ver esta página."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "página plana"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "páginas planas"
+
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "Saiu"
+
+#: contrib/auth/models.py:38 contrib/auth/models.py:57
+msgid "name"
+msgstr "nome"
+
+#: contrib/auth/models.py:40
+msgid "codename"
+msgstr "nome de código"
+
+#: contrib/auth/models.py:42
+msgid "permission"
+msgstr "permissão"
+
+#: contrib/auth/models.py:43 contrib/auth/models.py:58
+msgid "permissions"
+msgstr "permissões"
+
+#: contrib/auth/models.py:60
+msgid "group"
+msgstr "grupo"
+
+#: contrib/auth/models.py:61 contrib/auth/models.py:100
+msgid "groups"
+msgstr "grupos"
+
+#: contrib/auth/models.py:90
+msgid "username"
+msgstr "utilizador"
+
+#: contrib/auth/models.py:90
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr "Obrigatório. 30 caracteres ou menos. Apenas caracteres alfanúmericos (letras, números ou underscores)."
+
+#: contrib/auth/models.py:91
+msgid "first name"
+msgstr "primeiro nome"
+
+#: contrib/auth/models.py:92
+msgid "last name"
+msgstr "último nome"
+
+#: contrib/auth/models.py:93
+msgid "e-mail address"
+msgstr "endereço de e-mail"
+
+#: contrib/auth/models.py:94
+msgid "password"
+msgstr "palavra-passe"
+
+#: contrib/auth/models.py:94
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "Use '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:95
+msgid "staff status"
+msgstr "status de equipa"
+
+#: contrib/auth/models.py:95
+msgid "Designates whether the user can log into this admin site."
+msgstr "Define se o utilizador pode usar a administração do site."
+
+#: contrib/auth/models.py:96
+msgid "active"
+msgstr "activo"
+
+#: contrib/auth/models.py:96
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr "Define se este utiliador pode usar a adminstração do site. Não seleccione em vez de remover as contas."
+
+#: contrib/auth/models.py:97
+msgid "superuser status"
+msgstr "Status de superuser"
+
+#: contrib/auth/models.py:97
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "Define se este utilizador tem todas as permissões sem explicitamente as atribuir."
+
+#: contrib/auth/models.py:98
+msgid "last login"
+msgstr "última entrada"
+
+#: contrib/auth/models.py:99
+msgid "date joined"
+msgstr "data de registo"
+
+#: 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 "Em adição às permissões definidas manualmente, este utilizador também terá todas as permissões atribuídas a cada grupo a que partence."
+
+#: contrib/auth/models.py:102
+msgid "user permissions"
+msgstr "permissões do utilizador"
+
+#: contrib/auth/models.py:105
+msgid "user"
+msgstr "utilizador"
+
+#: contrib/auth/models.py:106
+msgid "users"
+msgstr "utilizadores"
+
+#: contrib/auth/models.py:111
+msgid "Personal info"
+msgstr "Informação pessoal"
+
+#: contrib/auth/models.py:112
+msgid "Permissions"
+msgstr "Permissões"
+
+#: contrib/auth/models.py:113
+msgid "Important dates"
+msgstr "Datas importantes"
+
+#: contrib/auth/models.py:114
+msgid "Groups"
+msgstr "Grupos"
+
+#: contrib/auth/models.py:256
+msgid "message"
+msgstr "mensagem"
+
+#: contrib/auth/forms.py:52
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr "Aparentemente que o seu browser não está configurado para aceitar cookies. Os cookies são necessários para poder entrar."
+
+#: contrib/auth/forms.py:61
+msgid "This account is inactive."
+msgstr "Esta conta não está activa."
+
+#: contrib/contenttypes/models.py:20
+msgid "python model class name"
+msgstr "python model class name"
+
+#: contrib/contenttypes/models.py:23
+msgid "content type"
+msgstr "tipo de conteúdo"
+
+#: contrib/contenttypes/models.py:24
+msgid "content types"
+msgstr "tipos de conteúdos"
+
+#: contrib/sessions/models.py:51
+msgid "session key"
+msgstr "chave da sessão"
+
+#: contrib/sessions/models.py:52
+msgid "session data"
+msgstr "dados da sessão"
+
+#: contrib/sessions/models.py:53
+msgid "expire date"
+msgstr "data de expiração"
+
+#: contrib/sessions/models.py:57
+msgid "session"
+msgstr "sessão"
+
+#: contrib/sessions/models.py:58
+msgid "sessions"
+msgstr "sessões"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "nome do domínio"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "mostrar nome"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "site"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "sites"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Segunda-feira"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Terça-feira"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Quarta-feira"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Quinta-feira"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Sexta-feira"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sábado"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Domingo"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Janeiro"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Fevereiro"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Março"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Abril"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Maio"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Junho"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Julho"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Agosto"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Setembro"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Outubro"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Novembro"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Dezembro"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "jan"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "fev"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "abr"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "mai"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "jun"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "jul"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "ago"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "set"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "out"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "dez"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Fev."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Ago."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Set."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Out."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dez."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "ano"
+msgstr[1] "anos"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mês"
+msgstr[1] "meses"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "semana"
+msgstr[1] "semanas"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dia"
+msgstr[1] "dias"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "horas"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minutos"
+
+#: utils/translation/trans_real.py:362
+msgid "DATE_FORMAT"
+msgstr "N j, Y"
+
+#: utils/translation/trans_real.py:363
+msgid "DATETIME_FORMAT"
+msgstr "N j, Y, P"
+
+#: utils/translation/trans_real.py:364
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: utils/translation/trans_real.py:380
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:381
+msgid "MONTH_DAY_FORMAT"
+msgstr "F j"
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Árabe"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Bengalês"
+
+#: conf/global_settings.py:41
+msgid "Czech"
+msgstr "Checo"
+
+#: conf/global_settings.py:42
+msgid "Welsh"
+msgstr "Galês"
+
+#: conf/global_settings.py:43
+msgid "Danish"
+msgstr "Dinamarquês"
+
+#: conf/global_settings.py:44
+msgid "German"
+msgstr "Alemão"
+
+#: conf/global_settings.py:45
+msgid "Greek"
+msgstr "Grego"
+
+#: conf/global_settings.py:46
+msgid "English"
+msgstr "Inglês"
+
+#: conf/global_settings.py:47
+msgid "Spanish"
+msgstr "Espanhol"
+
+#: conf/global_settings.py:48
+msgid "Argentinean Spanish"
+msgstr "Espanhol Argentino"
+
+#: conf/global_settings.py:49
+msgid "Finnish"
+msgstr "Filandês"
+
+#: conf/global_settings.py:50
+msgid "French"
+msgstr "Francês"
+
+#: conf/global_settings.py:51
+msgid "Galician"
+msgstr "Galaciano"
+
+#: conf/global_settings.py:52
+msgid "Hungarian"
+msgstr "Húngaro"
+
+#: conf/global_settings.py:53
+msgid "Hebrew"
+msgstr "Hebraico"
+
+#: conf/global_settings.py:54
+msgid "Icelandic"
+msgstr "Islandês"
+
+#: conf/global_settings.py:55
+msgid "Italian"
+msgstr "Italiano"
+
+#: conf/global_settings.py:56
+msgid "Japanese"
+msgstr "Japonês"
+
+#: conf/global_settings.py:57
+msgid "Dutch"
+msgstr "Holandês"
+
+#: conf/global_settings.py:58
+msgid "Norwegian"
+msgstr "Norueguês"
+
+#: conf/global_settings.py:59
+msgid "Brazilian"
+msgstr "Brasileiro"
+
+#: conf/global_settings.py:60
+msgid "Romanian"
+msgstr "Romeno"
+
+#: conf/global_settings.py:61
+msgid "Russian"
+msgstr "Russo"
+
+#: conf/global_settings.py:62
+msgid "Slovak"
+msgstr "Eslovaco"
+
+#: conf/global_settings.py:63
+msgid "Slovenian"
+msgstr "Esloveno"
+
+#: conf/global_settings.py:64
+msgid "Serbian"
+msgstr "Sérvio"
+
+#: conf/global_settings.py:65
+msgid "Swedish"
+msgstr "Sueco"
+
+#: conf/global_settings.py:66
+msgid "Tamil"
+msgstr "Tamil"
+
+#: conf/global_settings.py:67
+msgid "Turkish"
+msgstr "Turco"
+
+#: conf/global_settings.py:68
+msgid "Ukrainian"
+msgstr "Ucraniano"
+
+#: conf/global_settings.py:69
+msgid "Simplified Chinese"
+msgstr "Chinês Simplificado"
+
+#: conf/global_settings.py:70
+msgid "Traditional Chinese"
+msgstr "Chinês Tradicional"
+
+#: core/validators.py:63
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Este valor apenas poderá conter letras, números ou underscores."
+
+#: core/validators.py:67
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "Este valor apenas poderá conter letras, números, underscores ou traços."
+
+#: core/validators.py:71
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Este valor apenas poderá conter letras, números, undercores ou hífenes."
+
+#: core/validators.py:75
+msgid "Uppercase letters are not allowed here."
+msgstr "Letras em maiúsculas não são permitidas aqui."
+
+#: core/validators.py:79
+msgid "Lowercase letters are not allowed here."
+msgstr "Letras em minúsculas não são permitidas aqui."
+
+#: core/validators.py:86
+msgid "Enter only digits separated by commas."
+msgstr "Introduza apenas números separados por vírgulas."
+
+#: core/validators.py:98
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Introduza endereços de e-mail válidos separados por vírgulas."
+
+#: core/validators.py:102
+msgid "Please enter a valid IP address."
+msgstr "Por favor introduza um endereço IP válido."
+
+#: core/validators.py:106
+msgid "Empty values are not allowed here."
+msgstr "Valores em branco não são permitidos aqui."
+
+#: core/validators.py:110
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Caracteres não númericos não são permitidos aqui."
+
+#: core/validators.py:114
+msgid "This value can't be comprised solely of digits."
+msgstr "Este valor não pode ser constituido apenas por números."
+
+#: core/validators.py:119
+msgid "Enter a whole number."
+msgstr "Introduza um número inteiro."
+
+#: core/validators.py:123
+msgid "Only alphabetical characters are allowed here."
+msgstr "Apenas letras são válidas aqui."
+
+#: core/validators.py:138
+msgid "Year must be 1900 or later."
+msgstr "O ano deve ser 1900 ou superior."
+
+#: core/validators.py:142
+#, python-format
+msgid "Invalid date: %s."
+msgstr "Data inválida: %s."
+
+#: core/validators.py:146 db/models/fields/__init__.py:415
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Introduza uma data válida no formato AAAA-MM-DD."
+
+#: core/validators.py:151
+msgid "Enter a valid time in HH:MM format."
+msgstr "Introduza uma hora válida no formato HH:MM."
+
+#: core/validators.py:155 db/models/fields/__init__.py:477
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Introduza uma data/hora válida no formato AAAA-MM-DD HH:MM."
+
+#: core/validators.py:160
+msgid "Enter a valid e-mail address."
+msgstr "Introduza um endereço de e-mail válido."
+
+#: core/validators.py:172 core/validators.py:401 forms/__init__.py:661
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Nenhum ficheiro foi submetido. Verifique o tipo de codificação do formulário."
+
+#: core/validators.py:176
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr "Introduza uma imagem válida. O ficheiro que introduziu ou não é uma imagem ou está corrompido."
+
+#: core/validators.py:183
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "O URL %s não aponta para uma imagem válida."
+
+#: core/validators.py:187
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Os números de telefone deverão ser no formato XXX-XXX-XXXX. \"%s\" é inválido."
+
+#: core/validators.py:195
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "O URL %s não aponta para um QuickTime video válido."
+
+#: core/validators.py:199
+msgid "A valid URL is required."
+msgstr "É obrigatório um URL válido"
+
+#: core/validators.py:213
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"É obrigatório um HTML válido. Os erros específicos são:\n"
+"%s"
+
+#: core/validators.py:220
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML mal formatado: %s"
+
+#: core/validators.py:230
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL inválido: %s"
+
+#: core/validators.py:234 core/validators.py:236
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "O URL %s é um link quebrado."
+
+#: core/validators.py:242
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Introduza uma abreviação de um estado dos E.U.A. válido."
+
+#: core/validators.py:256
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Atenção à linguagem! A palavra %s não é permitida aqui."
+msgstr[1] "Atenção à linguagem! As palavras %s não são permitidas aqui."
+
+#: core/validators.py:263
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Este campo deve ser igual ao campo '%s'."
+
+#: core/validators.py:282
+msgid "Please enter something for at least one field."
+msgstr "Por favor preencha pelo menos um campo."
+
+#: core/validators.py:291 core/validators.py:302
+msgid "Please enter both fields or leave them both empty."
+msgstr "Por favor preencha ambos os campos ou deixe ambos vazios."
+
+#: core/validators.py:309
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Este campo deve ser preenchido se %(field)s for %(value)s"
+
+#: core/validators.py:321
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Este campo deve ser preenchido se %(field)s não é %(value)s"
+
+#: core/validators.py:340
+msgid "Duplicate values are not allowed."
+msgstr "Valores duplicados não são permitidos."
+
+#: core/validators.py:363
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Este valor deverá ser uma potência de %s."
+
+#: core/validators.py:374
+msgid "Please enter a valid decimal number."
+msgstr "Por favor introduza um número décimal válido."
+
+#: core/validators.py:378
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Por favor introduza um número décimal com um máximo de %s digito."
+msgstr[1] "Por favor introduza um número décimal com um máximo de %s digitos."
+
+#: core/validators.py:381
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "Por favor introduza um número décimal com o máximo de % digito na parte inteira."
+msgstr[1] "Por favor introduza um número décimal com o máximo de % digitos na parte inteira."
+
+#: core/validators.py:384
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Por favor introduza um número décimal com o máximo de %s digito na parte décimal."
+msgstr[1] "Por favor introduza um número décimal com o máximo de %s digitos na parte décimal."
+
+#: core/validators.py:394
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Verifique que o ficheiro introduzido tem pelo menos %s bytes."
+
+#: core/validators.py:395
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Verifique se o ficheiro introduzido tem no máximo %s bytes."
+
+#: core/validators.py:412
+msgid "The format for this field is wrong."
+msgstr "O formato deste campo é errado."
+
+#: core/validators.py:427
+msgid "This field is invalid."
+msgstr "Este campo é inválido."
+
+#: core/validators.py:463
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Não foi possível extrair nada de %s."
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "O URL %(url)s devolveu um tipo de conteúdo inválido no header: '%s(contenttype)s'."
+
+#: core/validators.py:499
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr "Por favor feche a tag %(tag)s na linha %(line)s. (A linha começa por \"%(start)s\".)"
+
+#: core/validators.py:503
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr "Algum texto começado na linha %(line)s não é permitido nesse contexto. (A linha começa por \"%(start)s\".)"
+
+#: core/validators.py:508
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr "\"%(attr)s\" na linha %(line)s é um atributo inválido. (A linha começa por \"%(start)s\".)"
+
+#: core/validators.py:513
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr "\"<%(tag)s>\" na linha %(line)s é um tag inválida. (A linha começa por \"%(start)s\".)"
+
+#: core/validators.py:517
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr "Uma tag na linha %(line)s não tem um o mais atributos obrigatórios. (A linha começa por \"%(start)s\".)"
+
+#: core/validators.py:522
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr "O atributo \"%(attr)s\" na linha %(line)s tem um valor inválido. (A linha começa por \"%(start)s\".)"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "O(A) %(verbose_name)s foi criado(a) com sucesso."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "O(A) %(verbose_name)s foi actualizado(a) com sucesso."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "O(A) %(verbose_name)s foi removido(a)."
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "O(A) %(object)s com este %(type)s já existe para o(a) %(field)s fornecido."
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s com %(fieldname)s já existe."
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:551 db/models/fields/__init__.py:562
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Este campo é obrigatório."
+
+#: db/models/fields/__init__.py:340
+msgid "This value must be an integer."
+msgstr "Este campo deverá ser inteiro."
+
+#: db/models/fields/__init__.py:372
+msgid "This value must be either True or False."
+msgstr "Este valor deverá ser True ou False."
+
+#: db/models/fields/__init__.py:388
+msgid "This field cannot be null."
+msgstr "Este campo não pode ser nulo."
+
+#: db/models/fields/__init__.py:571
+msgid "Enter a valid filename."
+msgstr "Introduza um nome de ficheiro válido."
+
+#: db/models/fields/related.py:51
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Por favor introduza um %s válido."
+
+#: db/models/fields/related.py:618
+msgid "Separate multiple IDs with commas."
+msgstr "Separe múltiplos IDs através de vírgulas."
+
+#: db/models/fields/related.py:620
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Mantenha pressionado o \"Control\", or \"Command\" no Mac, para seleccionar mais do que um."
+
+#: db/models/fields/related.py:664
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Por favor introduza IDs de %(self)s válidos. O valor %(value)r é inválido."
+msgstr[1] "Por favor introduza IDs de %(self)s válidos. Os valores %(value)r são inválidos."
+
+#: forms/__init__.py:381
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Verifique se o seu texto tem menos de %s caracter."
+msgstr[1] "Verifique se o seu texto tem menos de %s caracteres."
+
+#: forms/__init__.py:386
+msgid "Line breaks are not allowed here."
+msgstr "Quebras de linha não são permitas aqui."
+
+#: forms/__init__.py:487 forms/__init__.py:560 forms/__init__.py:599
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Seleccione uma opção válida; '%(data)s' não se encontra em %(choices)s."
+
+#: forms/__init__.py:663
+msgid "The submitted file is empty."
+msgstr "O ficheiro submetido encontra-se vazio."
+
+#: forms/__init__.py:719
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Introduza um número entre -32,768 e 32,767."
+
+#: forms/__init__.py:729
+msgid "Enter a positive number."
+msgstr "Introduza um número positivo."
+
+#: forms/__init__.py:739
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Introduza um número entre 0 e 32,767."
+
+#: template/defaultfilters.py:401
+msgid "yes,no,maybe"
+msgstr "sim,não,talvez"
diff --git a/django/conf/locale/pt/LC_MESSAGES/djangojs.mo b/django/conf/locale/pt/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000000..669dd9d119
Binary files /dev/null and b/django/conf/locale/pt/LC_MESSAGES/djangojs.mo differ
diff --git a/django/conf/locale/pt/LC_MESSAGES/djangojs.po b/django/conf/locale/pt/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000000..90f4b9de86
--- /dev/null
+++ b/django/conf/locale/pt/LC_MESSAGES/djangojs.po
@@ -0,0 +1,108 @@
+# Portuguese translation of Django.
+# Copyright (C) 2007 the Lawrence Journal-World
+# This file is distributed under the same license as the PACKAGE package.
+# Nuno Mariz , 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django 0.96pre\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-03-15 11:51+0100\n"
+"PO-Revision-Date: 2007-03-16 10:01+0000\n"
+"Last-Translator: Nuno Mariz \n"
+"Language-Team: pt_PT \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Disponível %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Escolher todos"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Adicionar"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Remover"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Escolhido %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Seleccione a(s) sua(s) escolha(s) e clique "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Limpar tudo"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "Janeiro Fevereiro Março Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Domingo Segunda Terça Quarta Quinta Sexta Sábado"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "D S T Q Q S S"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Agora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Relógio"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Escolha a hora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Meia-noite"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 a.m."
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Meio-dia"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Hoje"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Calendário"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Ontem"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Amanhã"
diff --git a/django/conf/locale/ta/LC_MESSAGES/django.mo b/django/conf/locale/ta/LC_MESSAGES/django.mo
index c85327d06b..c1d3cf26f5 100644
Binary files a/django/conf/locale/ta/LC_MESSAGES/django.mo and b/django/conf/locale/ta/LC_MESSAGES/django.mo differ
diff --git a/django/conf/locale/ta/LC_MESSAGES/django.po b/django/conf/locale/ta/LC_MESSAGES/django.po
index 7637bb9cdb..e3c539a8a1 100644
--- a/django/conf/locale/ta/LC_MESSAGES/django.po
+++ b/django/conf/locale/ta/LC_MESSAGES/django.po
@@ -1,20 +1,21 @@
-# translation of django.po to
-# translation of django_aa.po to
-# translation of django_aa.po to tamil
-# Parthan , 2006.
-# R Hariram Aatreya , 2006.
+# translation of django-new.po to tamil
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# PONNUSAMY.A , 2007.
+#
msgid ""
msgstr ""
-"Project-Id-Version: django\n"
+"Project-Id-Version: django-new\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-05-16 10:14+0200\n"
-"PO-Revision-Date: 2006-07-18 16:47+0530\n"
-"Last-Translator: R Hariram Aatreya \n"
-"Language-Team: \n"
+"POT-Creation-Date: 2006-09-25 15:43+0200\n"
+"PO-Revision-Date: 2007-03-15 16:48+0530\n"
+"Last-Translator: PONNUSAMY \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KBabel 1.9\n"
+"Language-Team: tamil \n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=n>1;"
#: contrib/comments/models.py:67 contrib/comments/models.py:166
msgid "object ID"
@@ -67,15 +68,15 @@ msgstr "அங்கீகரிக்கப்பட்ட தரவரிச
#: contrib/comments/models.py:83 contrib/comments/models.py:169
msgid "date/time submitted"
-msgstr "தேதிநேரம் சமர்ப்பிக்கப்பட்டுள்ளது"
+msgstr "தேதி/நேரம் சமர்ப்பிக்கப்பட்டுள்ளது"
#: contrib/comments/models.py:84 contrib/comments/models.py:170
msgid "is public"
msgstr "பொதுவானது"
-#: 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 "ip விலாசம்"
+msgstr "IP விலாசம்"
#: contrib/comments/models.py:86
msgid "is removed"
@@ -85,7 +86,7 @@ msgstr "நீக்கபட்டது"
msgid ""
"Check this box if the comment is inappropriate. A \"This comment has been "
"removed\" message will be displayed instead."
-msgstr "குறிப்பு செரியாக இல்லையென்றால் இந்த் பெட்டியில் குறியிடவும். இதற்கு பதிலாக \"இந்த குறிப்பு நீக்கபட்டது\" காண்பிக்கபடும்."
+msgstr "குறிப்பு சரியாக இல்லையென்றால் இந்த பெட்டியில் குறியிடவும். இதற்கு பதிலாக \"இந்த குறிப்பு நீக்கபட்டது\" காண்பிக்கபடும்."
#: contrib/comments/models.py:91
msgid "comments"
@@ -128,15 +129,15 @@ msgstr "சுதந்தரமான குறிப்பு"
#: contrib/comments/models.py:177
msgid "free comments"
-msgstr "சுதந்தரமான குறிப்பு"
+msgstr "சுதந்தரமான குறிப்புகள்"
#: contrib/comments/models.py:233
msgid "score"
-msgstr "மதிப்பீடு"
+msgstr "மதிப்பீடு "
#: contrib/comments/models.py:234
msgid "score date"
-msgstr "மதிப்பீடு தேதி"
+msgstr "மதிப்பீட்டு தேதி"
#: contrib/comments/models.py:237
msgid "karma score"
@@ -189,7 +190,7 @@ msgstr "மட்டொறுத்தால் நீக்கப்பட்
#: contrib/comments/models.py:281
msgid "moderator deletions"
-msgstr "மட்டொறுத்தால் நீக்கப்பட்டது"
+msgstr "மட்டொறுத்தர்களால் நீக்கப்பட்டது"
#: contrib/comments/models.py:285
#, python-format
@@ -198,7 +199,7 @@ msgstr "மட்டொறுத்தால் நீக்கப்பட்
#: contrib/comments/views/karma.py:19
msgid "Anonymous users cannot vote"
-msgstr "அடயாள்ம் இல்லாத பயனாளறால் வாக்களிக்க முடியாது"
+msgstr "அடையாளம் இல்லாத பயனாளறால் வாக்களிக்க முடியாது"
#: contrib/comments/views/karma.py:23
msgid "Invalid comment ID"
@@ -208,85 +209,82 @@ msgstr "செல்லாத குறிப்பு ID"
msgid "No voting for yourself"
msgstr "உங்களை நீங்களே தேர்வு செய்து கொள்ள முடியாது"
-#: 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 "மற்றொரு தரவரிசை அளிக்க்பட்டதால் இந்த தரவரிசை தேவைப்படுகிறது."
+msgstr "இந்த தரவரிசை தேவைப்படுகிறது ஏனெனில் மற்றொரு தரவரிசை அளிக்கப்பட்டு விட்டதால்"
-#: 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 "
"comment:\n"
"\n"
"%(text)s"
+msgid_plural ""
"This comment was posted by a user who has posted fewer than %(count)s "
"comments:\n"
"\n"
"%(text)s"
-msgstr ""
-"%(count)s குறைவாக அளித்த பயனாளரால் இந்த குரிப்பை அள்த்தபடது:\n"
+msgstr[0] ""
+"இந்த குறிப்பானது குறைவாக அளித்த பயனாளரால் %(count)s "
+"அளிக்கப்பட்டது:\n"
"\n"
"%(text)s"
-"%(count)s குறைவாக அளித்த பயனாளரால் இந்த குரிப்பை அள்த்தபடது:\n"
+msgstr[1] ""
+"இந்த குறிப்பானது குறைவாக அளித்த பயனாளர்களால் %(count)s"
+" அளிக்கப்பட்டது:\n"
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:117
+
+#: contrib/comments/views/comments.py:116
#, python-format
msgid ""
"This comment was posted by a sketchy user:\n"
"\n"
"%(text)s"
msgstr ""
-"முழுமையான விவரஙகளை அளிக்காத பயனாளறால் கொடுக்கப்பட்டது:\n"
+"முழுமையான விவரங்களை அளிக்காத பயனாளரால் கொடுக்கப்பட்டது:\n"
+"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:188
#: contrib/comments/views/comments.py:280
msgid "Only POSTs are allowed"
msgstr "POSTகளுக்கு மட்டும் அனுமதி உண்டு"
-#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:192
#: contrib/comments/views/comments.py:284
msgid "One or more of the required fields wasn't submitted"
msgstr "ஒன்று அல்லது ஒன்றிற்கு மேற்ப்பட்ட புலங்கள் சமற்பிக்கப்படவில்லை"
-#: 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 "எவறோ குரிப்புறையை செதப்படுத்திவிட்டாற்கள் (பாதுகாப்பு மீறல்)"
+msgstr "எவறோ குறிப்புறையைச் சேதப்படுத்திவிட்டர்கள் (பாதுகாப்பு மீறல்)"
-#: 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 "
"invalid"
-msgstr "குறிப்புறை படிவத்தில் முறையான இலக்கு அளவுருக்க இல்லை -- object ID முறையானதாக இல்லை"
+msgstr "குறிப்புறை படிவத்தில் முறையான இலக்கு அளவுருக்கவில்லை -- object ID முறையானதாக இல்லை"
#: contrib/comments/views/comments.py:257
#: contrib/comments/views/comments.py:321
msgid "The comment form didn't provide either 'preview' or 'post'"
-msgstr "குறிப்பு படிவம் முன்னோட்டம் அல்லது பிற்பட்டதை வழங்கவில்லை."
+msgstr "குறிப்பு படிவம் முன்னோட்டம் அல்லது பிற்பட்டதை வழங்குவது இல்லை"
#: contrib/comments/templates/comments/form.html:6
#: contrib/comments/templates/comments/form.html:8
#: contrib/admin/templates/admin/login.html:17
msgid "Username:"
-msgstr "பயணர் பெயர்:"
+msgstr "பயனர் பெயர்:"
#: contrib/comments/templates/comments/form.html:6
-#: contrib/admin/templates/admin/login.html:20
-msgid "Password:"
-msgstr "கடவுச்சொல்:"
-
-#: contrib/comments/templates/comments/form.html:6
-msgid "Forgotten your password?"
-msgstr "கடவுச்சொல்லை மறந்துவிட்டீரா?"
-
-#: 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/base.html:25
#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/change_form.html:10
#: contrib/admin/templates/registration/password_change_done.html:3
@@ -304,6 +302,15 @@ msgstr "கடவுச்சொல்லை மறந்துவிட்ட
msgid "Log out"
msgstr "வெளியேறு"
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "கடவுச்சொல்:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "கடவுச்சொல்லை மறந்துவிட்டீரா?"
+
#: contrib/comments/templates/comments/form.html:12
msgid "Ratings"
msgstr "விகிதம்"
@@ -311,7 +318,7 @@ msgstr "விகிதம்"
#: contrib/comments/templates/comments/form.html:12
#: contrib/comments/templates/comments/form.html:23
msgid "Required"
-msgstr "தேவைப்படுகிறது "
+msgstr "தேவைப்படுகிறது"
#: contrib/comments/templates/comments/form.html:12
#: contrib/comments/templates/comments/form.html:23
@@ -320,88 +327,21 @@ msgstr "விருப்பத்தேர்வு"
#: contrib/comments/templates/comments/form.html:23
msgid "Post a photo"
-msgstr "புகைப்படத்தை அணுப்பு"
+msgstr "புகைப்படத்தை அனுப்பு"
-#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/form.html:28
#: contrib/comments/templates/comments/freeform.html:5
msgid "Comment:"
msgstr "விவரம்:"
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# translation of django_ab.po to
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# , 2006.
-# R Hariram Aatreya , 2006.
-#: contrib/comments/templates/comments/form.html:32
-#: contrib/comments/templates/comments/freeform.html:9
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
msgid "Preview comment"
msgstr "குறிப்பை முன்னேற்றமிடு"
#: contrib/comments/templates/comments/freeform.html:4
msgid "Your name:"
-msgstr "உங்கள்பெயர்:"
+msgstr "உங்கள் பெயர்:"
#: contrib/admin/filterspecs.py:40
#, python-format
@@ -413,9 +353,9 @@ msgstr ""
"
-
+
{% endblock %}
diff --git a/django/contrib/sessions/middleware.py b/django/contrib/sessions/middleware.py
index c134a9c9cf..1498f3c8ba 100644
--- a/django/contrib/sessions/middleware.py
+++ b/django/contrib/sessions/middleware.py
@@ -83,7 +83,12 @@ class SessionMiddleware(object):
if accessed:
patch_vary_headers(response, ('Cookie',))
if modified or settings.SESSION_SAVE_EVERY_REQUEST:
- session_key = request.session.session_key or Session.objects.get_new_session_key()
+ if request.session.session_key:
+ session_key = request.session.session_key
+ else:
+ obj = Session.objects.get_new_session_object()
+ session_key = obj.session_key
+
if settings.SESSION_EXPIRE_AT_BROWSER_CLOSE:
max_age = None
expires = None
diff --git a/django/contrib/sessions/models.py b/django/contrib/sessions/models.py
index f684cd381e..77718407e1 100644
--- a/django/contrib/sessions/models.py
+++ b/django/contrib/sessions/models.py
@@ -1,4 +1,4 @@
-import base64, md5, random, sys
+import base64, md5, random, sys, datetime
import cPickle as pickle
from django.db import models
from django.utils.translation import gettext_lazy as _
@@ -23,6 +23,23 @@ class SessionManager(models.Manager):
break
return session_key
+ def get_new_session_object(self):
+ """
+ Returns a new session object.
+ """
+ # FIXME: There is a *small* chance of collision here, meaning we will
+ # return an existing object. That can be fixed when we add a way to
+ # validate (and guarantee) that non-auto primary keys are unique. For
+ # now, we save immediately in order to reduce the "window of
+ # misfortune" as much as possible.
+ created = False
+ while not created:
+ obj, created = self.get_or_create(session_key=self.get_new_session_key(),
+ expire_date = datetime.datetime.now())
+ # Collision in key generation, so re-seed the generator
+ random.seed()
+ return obj
+
def save(self, session_key, session_dict, expire_date):
s = self.model(session_key, self.encode(session_dict), expire_date)
if session_dict:
diff --git a/django/core/management.py b/django/core/management.py
index 25fb73d8ce..091c38b637 100644
--- a/django/core/management.py
+++ b/django/core/management.py
@@ -280,7 +280,7 @@ def get_sql_delete(app):
from django.db import backend, connection, models, get_introspection_module
introspection = get_introspection_module()
- # This should work even if a connecton isn't available
+ # This should work even if a connection isn't available
try:
cursor = connection.cursor()
except:
@@ -512,6 +512,7 @@ def syncdb(verbosity=1, interactive=True):
created_models = set()
pending_references = {}
+ # Create the tables for each model
for app in models.get_apps():
app_name = app.__name__.split('.')[-2]
model_list = models.get_models(app)
@@ -533,6 +534,11 @@ def syncdb(verbosity=1, interactive=True):
cursor.execute(statement)
table_list.append(model._meta.db_table)
+ # Create the m2m tables. This must be done after all tables have been created
+ # to ensure that all referred tables will exist.
+ for app in models.get_apps():
+ app_name = app.__name__.split('.')[-2]
+ model_list = models.get_models(app)
for model in model_list:
if model in created_models:
sql = _get_many_to_many_sql_for_model(model)
@@ -542,7 +548,7 @@ def syncdb(verbosity=1, interactive=True):
for statement in sql:
cursor.execute(statement)
- transaction.commit_unless_managed()
+ transaction.commit_unless_managed()
# Send the post_syncdb signal, so individual apps can do whatever they need
# to do at this point.
diff --git a/django/core/serializers/base.py b/django/core/serializers/base.py
index 7dde2a4faf..8e610ad240 100644
--- a/django/core/serializers/base.py
+++ b/django/core/serializers/base.py
@@ -34,17 +34,17 @@ class Serializer(object):
for obj in queryset:
self.start_object(obj)
for field in obj._meta.fields:
- if field is obj._meta.pk:
- continue
- elif field.rel is None:
- if self.selected_fields is None or field.attname in self.selected_fields:
- self.handle_field(obj, field)
- else:
- if self.selected_fields is None or field.attname[:-3] in self.selected_fields:
- self.handle_fk_field(obj, field)
+ if field.serialize:
+ if field.rel is None:
+ if self.selected_fields is None or field.attname in self.selected_fields:
+ self.handle_field(obj, field)
+ else:
+ if self.selected_fields is None or field.attname[:-3] in self.selected_fields:
+ self.handle_fk_field(obj, field)
for field in obj._meta.many_to_many:
- if self.selected_fields is None or field.attname in self.selected_fields:
- self.handle_m2m_field(obj, field)
+ if field.serialize:
+ if self.selected_fields is None or field.attname in self.selected_fields:
+ self.handle_m2m_field(obj, field)
self.end_object(obj)
self.end_serialization()
return self.getvalue()
diff --git a/django/core/serializers/pyyaml.py b/django/core/serializers/pyyaml.py
index f45a511e79..fa3dec984e 100644
--- a/django/core/serializers/pyyaml.py
+++ b/django/core/serializers/pyyaml.py
@@ -15,7 +15,7 @@ import yaml
class Serializer(PythonSerializer):
"""
- Convert a queryset to JSON.
+ Convert a queryset to YAML.
"""
def end_serialization(self):
yaml.dump(self.objects, self.stream, **self.options)
@@ -25,7 +25,7 @@ class Serializer(PythonSerializer):
def Deserializer(stream_or_string, **options):
"""
- Deserialize a stream or string of JSON data.
+ Deserialize a stream or string of YAML data.
"""
if isinstance(stream_or_string, basestring):
stream = StringIO(stream_or_string)
diff --git a/django/core/serializers/xml_serializer.py b/django/core/serializers/xml_serializer.py
index 9e37f03cc2..3a0fdb5395 100644
--- a/django/core/serializers/xml_serializer.py
+++ b/django/core/serializers/xml_serializer.py
@@ -13,6 +13,10 @@ class Serializer(base.Serializer):
Serializes a QuerySet to XML.
"""
+ def indent(self, level):
+ if self.options.get('indent', None) is not None:
+ self.xml.ignorableWhitespace('\n' + ' ' * self.options.get('indent', None) * level)
+
def start_serialization(self):
"""
Start serialization -- open the XML document and the root element.
@@ -25,6 +29,7 @@ class Serializer(base.Serializer):
"""
End serialization -- end the document.
"""
+ self.indent(0)
self.xml.endElement("django-objects")
self.xml.endDocument()
@@ -35,6 +40,7 @@ class Serializer(base.Serializer):
if not hasattr(obj, "_meta"):
raise base.SerializationError("Non-model object (%s) encountered during serialization" % type(obj))
+ self.indent(1)
self.xml.startElement("object", {
"pk" : str(obj._get_pk_val()),
"model" : str(obj._meta),
@@ -44,6 +50,7 @@ class Serializer(base.Serializer):
"""
Called after handling all fields for an object.
"""
+ self.indent(1)
self.xml.endElement("object")
def handle_field(self, obj, field):
@@ -51,6 +58,7 @@ class Serializer(base.Serializer):
Called to handle each field on an object (except for ForeignKeys and
ManyToManyFields)
"""
+ self.indent(2)
self.xml.startElement("field", {
"name" : field.name,
"type" : field.get_internal_type()
@@ -94,6 +102,7 @@ class Serializer(base.Serializer):
"""
Helper to output the element for relational fields
"""
+ self.indent(2)
self.xml.startElement("field", {
"name" : field.name,
"rel" : field.rel.__class__.__name__,
diff --git a/django/db/backends/mysql/base.py b/django/db/backends/mysql/base.py
index cbe080144c..94718595cb 100644
--- a/django/db/backends/mysql/base.py
+++ b/django/db/backends/mysql/base.py
@@ -10,8 +10,14 @@ try:
except ImportError, e:
from django.core.exceptions import ImproperlyConfigured
raise ImproperlyConfigured, "Error loading MySQLdb module: %s" % e
-if Database.version_info < (1,2,1,'final',2):
- raise ImportError, "MySQLdb-1.2.1p2 or newer is required; you have %s" % MySQLdb.__version__
+
+# We want version (1, 2, 1, 'final', 2) or later. We can't just use
+# lexicographic ordering in this check because then (1, 2, 1, 'gamma')
+# inadvertently passes the version test.
+version = Database.version_info
+if (version < (1,2,1) or (version[:3] == (1, 2, 1) and
+ (len(version) < 5 or version[3] != 'final' or version[4] < 2))):
+ raise ImportError, "MySQLdb-1.2.1p2 or newer is required; you have %s" % Database.__version__
from MySQLdb.converters import conversions
from MySQLdb.constants import FIELD_TYPE
@@ -74,6 +80,8 @@ class DatabaseWrapper(local):
if not self._valid_connection():
kwargs = {
'conv': django_conversions,
+ 'charset': 'utf8',
+ 'use_unicode': False,
}
if settings.DATABASE_USER:
kwargs['user'] = settings.DATABASE_USER
diff --git a/django/db/backends/mysql_old/__init__.py b/django/db/backends/mysql_old/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/django/db/backends/mysql_old/base.py b/django/db/backends/mysql_old/base.py
new file mode 100644
index 0000000000..4bd87518e8
--- /dev/null
+++ b/django/db/backends/mysql_old/base.py
@@ -0,0 +1,233 @@
+"""
+MySQL database backend for Django.
+
+Requires MySQLdb: http://sourceforge.net/projects/mysql-python
+"""
+
+from django.db.backends import util
+try:
+ import MySQLdb as Database
+except ImportError, e:
+ from django.core.exceptions import ImproperlyConfigured
+ raise ImproperlyConfigured, "Error loading MySQLdb module: %s" % e
+from MySQLdb.converters import conversions
+from MySQLdb.constants import FIELD_TYPE
+import types
+import re
+
+DatabaseError = Database.DatabaseError
+
+django_conversions = conversions.copy()
+django_conversions.update({
+ types.BooleanType: util.rev_typecast_boolean,
+ FIELD_TYPE.DATETIME: util.typecast_timestamp,
+ FIELD_TYPE.DATE: util.typecast_date,
+ FIELD_TYPE.TIME: util.typecast_time,
+})
+
+# This should match the numerical portion of the version numbers (we can treat
+# versions like 5.0.24 and 5.0.24a as the same). Based on the list of version
+# at http://dev.mysql.com/doc/refman/4.1/en/news.html and
+# http://dev.mysql.com/doc/refman/5.0/en/news.html .
+server_version_re = re.compile(r'(\d{1,2})\.(\d{1,2})\.(\d{1,2})')
+
+# This is an extra debug layer over MySQL queries, to display warnings.
+# It's only used when DEBUG=True.
+class MysqlDebugWrapper:
+ def __init__(self, cursor):
+ self.cursor = cursor
+
+ def execute(self, sql, params=()):
+ try:
+ return self.cursor.execute(sql, params)
+ except Database.Warning, w:
+ self.cursor.execute("SHOW WARNINGS")
+ raise Database.Warning, "%s: %s" % (w, self.cursor.fetchall())
+
+ def executemany(self, sql, param_list):
+ try:
+ return self.cursor.executemany(sql, param_list)
+ except Database.Warning, w:
+ self.cursor.execute("SHOW WARNINGS")
+ raise Database.Warning, "%s: %s" % (w, self.cursor.fetchall())
+
+ def __getattr__(self, attr):
+ if self.__dict__.has_key(attr):
+ return self.__dict__[attr]
+ else:
+ return getattr(self.cursor, attr)
+
+try:
+ # Only exists in Python 2.4+
+ from threading import local
+except ImportError:
+ # Import copy of _thread_local.py from Python 2.4
+ from django.utils._threading_local import local
+
+class DatabaseWrapper(local):
+ def __init__(self, **kwargs):
+ self.connection = None
+ self.queries = []
+ self.server_version = None
+ self.options = kwargs
+
+ def _valid_connection(self):
+ if self.connection is not None:
+ try:
+ self.connection.ping()
+ return True
+ except DatabaseError:
+ self.connection.close()
+ self.connection = None
+ return False
+
+ def cursor(self):
+ from django.conf import settings
+ if not self._valid_connection():
+ kwargs = {
+ 'user': settings.DATABASE_USER,
+ 'db': settings.DATABASE_NAME,
+ 'passwd': settings.DATABASE_PASSWORD,
+ 'conv': django_conversions,
+ }
+ if settings.DATABASE_HOST.startswith('/'):
+ kwargs['unix_socket'] = settings.DATABASE_HOST
+ else:
+ kwargs['host'] = settings.DATABASE_HOST
+ if settings.DATABASE_PORT:
+ kwargs['port'] = int(settings.DATABASE_PORT)
+ kwargs.update(self.options)
+ self.connection = Database.connect(**kwargs)
+ cursor = self.connection.cursor()
+ if self.connection.get_server_info() >= '4.1':
+ cursor.execute("SET NAMES 'utf8'")
+ else:
+ cursor = self.connection.cursor()
+ if settings.DEBUG:
+ return util.CursorDebugWrapper(MysqlDebugWrapper(cursor), self)
+ return cursor
+
+ def _commit(self):
+ if self.connection is not None:
+ self.connection.commit()
+
+ def _rollback(self):
+ if self.connection is not None:
+ try:
+ self.connection.rollback()
+ except Database.NotSupportedError:
+ pass
+
+ def close(self):
+ if self.connection is not None:
+ self.connection.close()
+ self.connection = None
+
+ def get_server_version(self):
+ if not self.server_version:
+ if not self._valid_connection():
+ self.cursor()
+ m = server_version_re.match(self.connection.get_server_info())
+ if not m:
+ raise Exception('Unable to determine MySQL version from version string %r' % self.connection.get_server_info())
+ self.server_version = tuple([int(x) for x in m.groups()])
+ return self.server_version
+
+supports_constraints = True
+
+def quote_name(name):
+ if name.startswith("`") and name.endswith("`"):
+ return name # Quoting once is enough.
+ return "`%s`" % name
+
+dictfetchone = util.dictfetchone
+dictfetchmany = util.dictfetchmany
+dictfetchall = util.dictfetchall
+
+def get_last_insert_id(cursor, table_name, pk_name):
+ return cursor.lastrowid
+
+def get_date_extract_sql(lookup_type, table_name):
+ # lookup_type is 'year', 'month', 'day'
+ # http://dev.mysql.com/doc/mysql/en/date-and-time-functions.html
+ return "EXTRACT(%s FROM %s)" % (lookup_type.upper(), table_name)
+
+def get_date_trunc_sql(lookup_type, field_name):
+ # lookup_type is 'year', 'month', 'day'
+ fields = ['year', 'month', 'day', 'hour', 'minute', 'second']
+ format = ('%%Y-', '%%m', '-%%d', ' %%H:', '%%i', ':%%s') # Use double percents to escape.
+ format_def = ('0000-', '01', '-01', ' 00:', '00', ':00')
+ try:
+ i = fields.index(lookup_type) + 1
+ except ValueError:
+ sql = field_name
+ else:
+ format_str = ''.join([f for f in format[:i]] + [f for f in format_def[i:]])
+ sql = "CAST(DATE_FORMAT(%s, '%s') AS DATETIME)" % (field_name, format_str)
+ return sql
+
+def get_limit_offset_sql(limit, offset=None):
+ sql = "LIMIT "
+ if offset and offset != 0:
+ sql += "%s," % offset
+ return sql + str(limit)
+
+def get_random_function_sql():
+ return "RAND()"
+
+def get_deferrable_sql():
+ return ""
+
+def get_fulltext_search_sql(field_name):
+ return 'MATCH (%s) AGAINST (%%s IN BOOLEAN MODE)' % field_name
+
+def get_drop_foreignkey_sql():
+ return "DROP FOREIGN KEY"
+
+def get_pk_default_value():
+ return "DEFAULT"
+
+def get_sql_flush(style, tables, sequences):
+ """Return a list of SQL statements required to remove all data from
+ all tables in the database (without actually removing the tables
+ themselves) and put the database in an empty 'initial' state
+
+ """
+ # NB: The generated SQL below is specific to MySQL
+ # 'TRUNCATE x;', 'TRUNCATE y;', 'TRUNCATE z;'... style SQL statements
+ # to clear all tables of all data
+ if tables:
+ sql = ['SET FOREIGN_KEY_CHECKS = 0;'] + \
+ ['%s %s;' % \
+ (style.SQL_KEYWORD('TRUNCATE'),
+ style.SQL_FIELD(quote_name(table))
+ ) for table in tables] + \
+ ['SET FOREIGN_KEY_CHECKS = 1;']
+
+ # 'ALTER TABLE table AUTO_INCREMENT = 1;'... style SQL statements
+ # to reset sequence indices
+ sql.extend(["%s %s %s %s %s;" % \
+ (style.SQL_KEYWORD('ALTER'),
+ style.SQL_KEYWORD('TABLE'),
+ style.SQL_TABLE(quote_name(sequence['table'])),
+ style.SQL_KEYWORD('AUTO_INCREMENT'),
+ style.SQL_FIELD('= 1'),
+ ) for sequence in sequences])
+ return sql
+ else:
+ return []
+
+OPERATOR_MAPPING = {
+ 'exact': '= %s',
+ 'iexact': 'LIKE %s',
+ 'contains': 'LIKE BINARY %s',
+ 'icontains': 'LIKE %s',
+ 'gt': '> %s',
+ 'gte': '>= %s',
+ 'lt': '< %s',
+ 'lte': '<= %s',
+ 'startswith': 'LIKE BINARY %s',
+ 'endswith': 'LIKE BINARY %s',
+ 'istartswith': 'LIKE %s',
+ 'iendswith': 'LIKE %s',
+}
diff --git a/django/db/backends/mysql_old/client.py b/django/db/backends/mysql_old/client.py
new file mode 100644
index 0000000000..f9d6297b8e
--- /dev/null
+++ b/django/db/backends/mysql_old/client.py
@@ -0,0 +1,14 @@
+from django.conf import settings
+import os
+
+def runshell():
+ args = ['']
+ args += ["--user=%s" % settings.DATABASE_USER]
+ if settings.DATABASE_PASSWORD:
+ args += ["--password=%s" % settings.DATABASE_PASSWORD]
+ if settings.DATABASE_HOST:
+ args += ["--host=%s" % settings.DATABASE_HOST]
+ if settings.DATABASE_PORT:
+ args += ["--port=%s" % settings.DATABASE_PORT]
+ args += [settings.DATABASE_NAME]
+ os.execvp('mysql', args)
diff --git a/django/db/backends/mysql_old/creation.py b/django/db/backends/mysql_old/creation.py
new file mode 100644
index 0000000000..22ed901653
--- /dev/null
+++ b/django/db/backends/mysql_old/creation.py
@@ -0,0 +1,29 @@
+# This dictionary maps Field objects to their associated MySQL column
+# types, as strings. Column-type strings can contain format strings; they'll
+# be interpolated against the values of Field.__dict__ before being output.
+# If a column type is set to None, it won't be included in the output.
+DATA_TYPES = {
+ 'AutoField': 'integer AUTO_INCREMENT',
+ 'BooleanField': 'bool',
+ 'CharField': 'varchar(%(maxlength)s)',
+ 'CommaSeparatedIntegerField': 'varchar(%(maxlength)s)',
+ 'DateField': 'date',
+ 'DateTimeField': 'datetime',
+ 'FileField': 'varchar(100)',
+ 'FilePathField': 'varchar(100)',
+ 'FloatField': 'numeric(%(max_digits)s, %(decimal_places)s)',
+ 'ImageField': 'varchar(100)',
+ 'IntegerField': 'integer',
+ 'IPAddressField': 'char(15)',
+ 'ManyToManyField': None,
+ 'NullBooleanField': 'bool',
+ 'OneToOneField': 'integer',
+ 'PhoneNumberField': 'varchar(20)',
+ 'PositiveIntegerField': 'integer UNSIGNED',
+ 'PositiveSmallIntegerField': 'smallint UNSIGNED',
+ 'SlugField': 'varchar(%(maxlength)s)',
+ 'SmallIntegerField': 'smallint',
+ 'TextField': 'longtext',
+ 'TimeField': 'time',
+ 'USStateField': 'varchar(2)',
+}
diff --git a/django/db/backends/mysql_old/introspection.py b/django/db/backends/mysql_old/introspection.py
new file mode 100644
index 0000000000..5ea626a5a9
--- /dev/null
+++ b/django/db/backends/mysql_old/introspection.py
@@ -0,0 +1,95 @@
+from django.db.backends.mysql_old.base import quote_name
+from MySQLdb import ProgrammingError, OperationalError
+from MySQLdb.constants import FIELD_TYPE
+import re
+
+foreign_key_re = re.compile(r"\sCONSTRAINT `[^`]*` FOREIGN KEY \(`([^`]*)`\) REFERENCES `([^`]*)` \(`([^`]*)`\)")
+
+def get_table_list(cursor):
+ "Returns a list of table names in the current database."
+ cursor.execute("SHOW TABLES")
+ return [row[0] for row in cursor.fetchall()]
+
+def get_table_description(cursor, table_name):
+ "Returns a description of the table, with the DB-API cursor.description interface."
+ cursor.execute("SELECT * FROM %s LIMIT 1" % quote_name(table_name))
+ return cursor.description
+
+def _name_to_index(cursor, table_name):
+ """
+ Returns a dictionary of {field_name: field_index} for the given table.
+ Indexes are 0-based.
+ """
+ return dict([(d[0], i) for i, d in enumerate(get_table_description(cursor, table_name))])
+
+def get_relations(cursor, table_name):
+ """
+ Returns a dictionary of {field_index: (field_index_other_table, other_table)}
+ representing all relationships to the given table. Indexes are 0-based.
+ """
+ my_field_dict = _name_to_index(cursor, table_name)
+ constraints = []
+ relations = {}
+ try:
+ # This should work for MySQL 5.0.
+ cursor.execute("""
+ SELECT column_name, referenced_table_name, referenced_column_name
+ FROM information_schema.key_column_usage
+ WHERE table_name = %s
+ AND table_schema = DATABASE()
+ AND referenced_table_name IS NOT NULL
+ AND referenced_column_name IS NOT NULL""", [table_name])
+ constraints.extend(cursor.fetchall())
+ except (ProgrammingError, OperationalError):
+ # Fall back to "SHOW CREATE TABLE", for previous MySQL versions.
+ # Go through all constraints and save the equal matches.
+ cursor.execute("SHOW CREATE TABLE %s" % quote_name(table_name))
+ for row in cursor.fetchall():
+ pos = 0
+ while True:
+ match = foreign_key_re.search(row[1], pos)
+ if match == None:
+ break
+ pos = match.end()
+ constraints.append(match.groups())
+
+ for my_fieldname, other_table, other_field in constraints:
+ other_field_index = _name_to_index(cursor, other_table)[other_field]
+ my_field_index = my_field_dict[my_fieldname]
+ relations[my_field_index] = (other_field_index, other_table)
+
+ return relations
+
+def get_indexes(cursor, table_name):
+ """
+ Returns a dictionary of fieldname -> infodict for the given table,
+ where each infodict is in the format:
+ {'primary_key': boolean representing whether it's the primary key,
+ 'unique': boolean representing whether it's a unique index}
+ """
+ cursor.execute("SHOW INDEX FROM %s" % quote_name(table_name))
+ indexes = {}
+ for row in cursor.fetchall():
+ indexes[row[4]] = {'primary_key': (row[2] == 'PRIMARY'), 'unique': not bool(row[1])}
+ return indexes
+
+DATA_TYPES_REVERSE = {
+ FIELD_TYPE.BLOB: 'TextField',
+ FIELD_TYPE.CHAR: 'CharField',
+ FIELD_TYPE.DECIMAL: 'FloatField',
+ FIELD_TYPE.DATE: 'DateField',
+ FIELD_TYPE.DATETIME: 'DateTimeField',
+ FIELD_TYPE.DOUBLE: 'FloatField',
+ FIELD_TYPE.FLOAT: 'FloatField',
+ FIELD_TYPE.INT24: 'IntegerField',
+ FIELD_TYPE.LONG: 'IntegerField',
+ FIELD_TYPE.LONGLONG: 'IntegerField',
+ FIELD_TYPE.SHORT: 'IntegerField',
+ FIELD_TYPE.STRING: 'TextField',
+ FIELD_TYPE.TIMESTAMP: 'DateTimeField',
+ FIELD_TYPE.TINY: 'IntegerField',
+ FIELD_TYPE.TINY_BLOB: 'TextField',
+ FIELD_TYPE.MEDIUM_BLOB: 'TextField',
+ FIELD_TYPE.LONG_BLOB: 'TextField',
+ FIELD_TYPE.VAR_STRING: 'CharField',
+}
diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
index 781e4cb9e9..3972de7d4a 100644
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -67,7 +67,7 @@ class Field(object):
def __init__(self, verbose_name=None, name=None, primary_key=False,
maxlength=None, unique=False, blank=False, null=False, db_index=False,
- core=False, rel=None, default=NOT_PROVIDED, editable=True,
+ core=False, rel=None, default=NOT_PROVIDED, editable=True, serialize=True,
prepopulate_from=None, unique_for_date=None, unique_for_month=None,
unique_for_year=None, validator_list=None, choices=None, radio_admin=None,
help_text='', db_column=None):
@@ -78,6 +78,7 @@ class Field(object):
self.blank, self.null = blank, null
self.core, self.rel, self.default = core, rel, default
self.editable = editable
+ self.serialize = serialize
self.validator_list = validator_list or []
self.prepopulate_from = prepopulate_from
self.unique_for_date, self.unique_for_month = unique_for_date, unique_for_month
diff --git a/django/db/models/fields/generic.py b/django/db/models/fields/generic.py
index 1ad8346e42..480ee689c9 100644
--- a/django/db/models/fields/generic.py
+++ b/django/db/models/fields/generic.py
@@ -94,6 +94,7 @@ class GenericRelation(RelatedField, Field):
kwargs['blank'] = True
kwargs['editable'] = False
+ kwargs['serialize'] = False
Field.__init__(self, **kwargs)
def get_manipulator_field_objs(self):
diff --git a/django/db/models/options.py b/django/db/models/options.py
index ff0d112d16..51cf0a019b 100644
--- a/django/db/models/options.py
+++ b/django/db/models/options.py
@@ -84,6 +84,7 @@ class Options(object):
self.fields.insert(bisect(self.fields, field), field)
if not self.pk and field.primary_key:
self.pk = field
+ field.serialize = False
def __repr__(self):
return '' % self.object_name
diff --git a/django/db/models/query.py b/django/db/models/query.py
index a03f4ecc1f..e01905551e 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -109,6 +109,8 @@ class QuerySet(object):
def __getitem__(self, k):
"Retrieve an item or slice from the set of results."
+ if not isinstance(k, (slice, int)):
+ raise TypeError
assert (not isinstance(k, slice) and (k >= 0)) \
or (isinstance(k, slice) and (k.start is None or k.start >= 0) and (k.stop is None or k.stop >= 0)), \
"Negative indexing is not supported."
@@ -780,7 +782,7 @@ def fill_table_cache(opts, select, tables, where, old_prefix, cache_tables_seen,
def parse_lookup(kwarg_items, opts):
# Helper function that handles converting API kwargs
# (e.g. "name__exact": "tom") to SQL.
- # Returns a tuple of (tables, joins, where, params).
+ # Returns a tuple of (joins, where, params).
# 'joins' is a sorted dictionary describing the tables that must be joined
# to complete the query. The dictionary is sorted because creation order
diff --git a/django/shortcuts/__init__.py b/django/shortcuts/__init__.py
index be2155bb09..81381d08c1 100644
--- a/django/shortcuts/__init__.py
+++ b/django/shortcuts/__init__.py
@@ -19,7 +19,7 @@ def get_object_or_404(klass, *args, **kwargs):
try:
return manager.get(*args, **kwargs)
except klass.DoesNotExist:
- raise Http404
+ raise Http404('No %s matches the given query.' % klass._meta.object_name)
def get_list_or_404(klass, *args, **kwargs):
if isinstance(klass, Manager):
@@ -28,5 +28,5 @@ def get_list_or_404(klass, *args, **kwargs):
manager = klass._default_manager
obj_list = list(manager.filter(*args, **kwargs))
if not obj_list:
- raise Http404
+ raise Http404('No %s matches the given query.' % manager.model._meta.object_name)
return obj_list
diff --git a/django/template/defaulttags.py b/django/template/defaulttags.py
index ed870047b1..b18fa1dce7 100644
--- a/django/template/defaulttags.py
+++ b/django/template/defaulttags.py
@@ -582,7 +582,7 @@ 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"""
+ """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)
@@ -901,7 +901,7 @@ 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::
+ 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 %}
@@ -912,11 +912,11 @@ 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
+ and this app's URLconf is included into the project's URLconf under some
path::
('^clients/', include('project_name.app_name.urls'))
diff --git a/django/test/client.py b/django/test/client.py
index 682dd01261..95d3b85922 100644
--- a/django/test/client.py
+++ b/django/test/client.py
@@ -69,6 +69,14 @@ def encode_multipart(boundary, data):
'',
value.read()
])
+ elif hasattr(value, '__iter__'):
+ for item in value:
+ lines.extend([
+ '--' + boundary,
+ 'Content-Disposition: form-data; name="%s"' % key,
+ '',
+ str(item)
+ ])
else:
lines.extend([
'--' + boundary,
diff --git a/django/utils/datastructures.py b/django/utils/datastructures.py
index e924e4edbc..7b7fa2b0f0 100644
--- a/django/utils/datastructures.py
+++ b/django/utils/datastructures.py
@@ -94,7 +94,7 @@ class SortedDict(dict):
def copy(self):
"Returns a copy of this object."
- # This way of initialising the copy means it works for subclasses, too.
+ # This way of initializing the copy means it works for subclasses, too.
obj = self.__class__(self)
obj.keyOrder = self.keyOrder
return obj
diff --git a/django/utils/text.py b/django/utils/text.py
index 1c1c456e2d..faf8705fa9 100644
--- a/django/utils/text.py
+++ b/django/utils/text.py
@@ -17,7 +17,7 @@ def wrap(text, width):
pos = len(word) - word.rfind('\n') - 1
for word in it:
if "\n" in word:
- lines = word.splitlines()
+ lines = word.split('\n')
else:
lines = (word,)
pos += len(lines[0]) + 1
diff --git a/docs/add_ons.txt b/docs/add_ons.txt
index 1756fe5720..9809cf46f8 100644
--- a/docs/add_ons.txt
+++ b/docs/add_ons.txt
@@ -1,6 +1,6 @@
-=====================
-The "contrib" add-ons
-=====================
+============================
+The "django.contrib" add-ons
+============================
Django aims to follow Python's `"batteries included" philosophy`_. It ships
with a variety of extra, optional tools that solve common Web-development
@@ -51,8 +51,6 @@ See the `csrf documentation`_.
formtools
=========
-**New in Django development version**
-
A set of high-level abstractions for Django forms (django.newforms).
django.contrib.formtools.preview
@@ -142,8 +140,6 @@ See the `flatpages documentation`_.
localflavor
===========
-**New in Django development version**
-
A collection of various Django snippets that are useful only for a particular
country or culture. For example, ``django.contrib.localflavor.usa.forms``
contains a ``USZipCodeField`` that you can use to validate U.S. zip codes.
@@ -153,12 +149,16 @@ markup
A collection of template filters that implement these common markup languages:
- * Textile
- * Markdown
- * ReST (ReStructured Text)
+ * `Textile`_
+ * `Markdown`_
+ * `ReST (ReStructured Text)`_
For documentation, read the source code in django/contrib/markup/templatetags/markup.py.
+.. _Textile: http://en.wikipedia.org/wiki/Textile_%28markup_language%29
+.. _Markdown: http://en.wikipedia.org/wiki/Markdown
+.. _ReST (ReStructured Text): http://en.wikipedia.org/wiki/ReStructuredText
+
redirects
=========
diff --git a/docs/contributing.txt b/docs/contributing.txt
index 8364405775..1d2b635b76 100644
--- a/docs/contributing.txt
+++ b/docs/contributing.txt
@@ -303,11 +303,11 @@ Please follow these coding standards when writing code for inclusion in Django:
def my_view(req, foo):
# ...
- * Our policy is to keep the names of developers and contributors
- in the ``AUTHORS`` file distributed with Django, so please don't include
- your name in the actual code. Feel free to include a change to the
- ``AUTHORS`` file in your patch if you make more than a single trivial
- change.
+ * Please don't put your name in the code you contribute. Our policy is to
+ keep contributors' names in the ``AUTHORS`` file distributed with Django
+ -- not scattered throughout the codebase itself. Feel free to include a
+ change to the ``AUTHORS`` file in your patch if you make more than a
+ single trivial change.
Committing code
===============
@@ -527,12 +527,12 @@ sure all other lines are commented::
# http://code.djangoproject.com/svn/django/trunk/
#
/path/to/trunk
-
+
# is a svn checkout of:
# http://code.djangoproject.com/svn/django/branches//
#
#/path/to/
-
+
# On windows a path may look like this:
# C:/path/to/
diff --git a/docs/databases.txt b/docs/databases.txt
index ff6abd7271..3545b58d47 100644
--- a/docs/databases.txt
+++ b/docs/databases.txt
@@ -1,56 +1,59 @@
===============================
-Notes About Supported Databases
+Notes about supported databases
===============================
-Django attempts to support as many features as possible on all databases.
-However, since not all database servers are identical, there is obviously
-going to be some variations. This file describes some of the
-features that might relevant to Django usage. It is not intended as a
-replacement for server-specific documentation or reference manuals.
+Django attempts to support as many features as possible on all database
+backends. However, not all database backends are alike, and we've had to make
+design decisions on which features to support and which assumptions we can make
+safely.
-MySQL Notes
+This file describes some of the features that might be relevant to Django
+usage. Of course, it is not intended as a replacement for server-specific
+documentation or reference manuals.
+
+MySQL notes
===========
Django expects the database to support transactions, referential integrity,
-and Unicode support (UTF-8 encoding). Fortunately MySQL_ has all these
+and Unicode support (UTF-8 encoding). Fortunately, MySQL_ has all these
features as available as far back as 3.23. While it may be possible to use
-3.23 or 4.0, you will probably have less trouble if you use 4.1 or 5.0.
+3.23 or 4.0, you'll probably have less trouble if you use 4.1 or 5.0.
-MySQL-4.1
+MySQL 4.1
---------
-MySQL-4.1_ has greatly improved support for character sets. It is possible to
+`MySQL 4.1`_ has greatly improved support for character sets. It is possible to
set different default character sets on the database, table, and column.
Previous versions have only a server-wide character set setting. It's also the
first version where the character set can be changed on the fly. 4.1 also has
-support for views, but these are not currently used by Django.
+support for views, but Django currently doesn't use views.
-MySQL-5.0
+MySQL 5.0
---------
-MySQL-5.0_ adds the ``information_schema`` database, which contains detailed
-data on all database schema. This is used for Django's ``inspectdb`` feature,
-when it is available. 5.0 also has support for stored procedures, but these
-are not currently used by Django.
+`MySQL 5.0`_ adds the ``information_schema`` database, which contains detailed
+data on all database schema. Django's ``inspectdb`` feature uses this
+``information_schema`` if it's available. 5.0 also has support for stored
+procedures, but Django currently doesn't use stored procedures.
.. _MySQL: http://www.mysql.com/
-.. _MySQL-4.1: http://dev.mysql.com/doc/refman/4.1/en/index.html
-.. _MySQL-5.0: http://dev.mysql.com/doc/refman/5.0/en/index.html
+.. _MySQL 4.1: http://dev.mysql.com/doc/refman/4.1/en/index.html
+.. _MySQL 5.0: http://dev.mysql.com/doc/refman/5.0/en/index.html
-Storage Engines
+Storage engines
---------------
MySQL has several `storage engines`_ (previously called table types). You can
change the default storage engine in the server configuration.
-The default one is MyISAM_. The main drawback of MyISAM is that it does not
-currently have support for transactions or foreign keys. On the plus side, it
-is currently the only engine that supports full-text indexing and searching.
+The default engine is MyISAM_. The main drawback of MyISAM is that it doesn't
+currently support transactions or foreign keys. On the plus side, it's
+currently the only engine that supports full-text indexing and searching.
The InnoDB_ engine is fully transactional and supports foreign key references.
The BDB_ engine, like InnoDB, is also fully transactional and supports foreign
-key references. However, it's use seems to be somewhat deprecated.
+key references. However, its use seems to be deprecated.
`Other storage engines`_, including SolidDB_ and Falcon_, are on the horizon.
For now, InnoDB is probably your best choice.
@@ -66,25 +69,25 @@ For now, InnoDB is probably your best choice.
MySQLdb
-------
-`MySQLdb`_ is the Python interface to MySQL. 1.2.1 is the first version which
-has support for MySQL-4.1 and newer. If you are trying to use an older version
-of MySQL, then 1.2.0 *may* work for you.
+`MySQLdb`_ is the Python interface to MySQL. 1.2.1 is the first version that
+has support for MySQL 4.1 and newer. If you are trying to use an older version
+of MySQL, then 1.2.0 *might* work for you.
.. _MySQLdb: http://sourceforge.net/projects/mysql-python
Creating your database
-~~~~~~~~~~~~~~~~~~~~~~
+----------------------
You can `create your database`_ using the command-line tools and this SQL::
CREATE DATABASE CHARACTER SET utf8;
-
-This ensures all tables and columns will use utf8 by default.
-
+
+This ensures all tables and columns will use UTF-8 by default.
+
.. _create your database: http://dev.mysql.com/doc/refman/5.0/en/create-database.html
Connecting to the database
-~~~~~~~~~~~~~~~~~~~~~~~~~~
+--------------------------
Refer to the `settings documentation`_.
@@ -106,7 +109,7 @@ Here's a sample configuration which uses a MySQL option file::
DATABASE_OPTIONS = {
'read_default_file': '/path/to/my.cnf',
}
-
+
# my.cnf
[client]
database = DATABASE_NAME
@@ -114,49 +117,46 @@ Here's a sample configuration which uses a MySQL option file::
passwd = DATABASE_PASSWORD
default-character-set = utf8
-There are several other MySQLdb connection options which may be useful, such
-as ``ssl``, ``use_unicode``, ``init_command``, and ``sql_mode``; consult the
+Several other MySQLdb connection options may be useful, such as ``ssl``,
+``use_unicode``, ``init_command``, and ``sql_mode``. Consult the
`MySQLdb documentation`_ for more details.
-
+
.. _settings documentation: http://www.djangoproject.com/documentation/settings/#database-engine
.. _MySQL option file: http://dev.mysql.com/doc/refman/5.0/en/option-files.html
.. _MySQLdb documentation: http://mysql-python.sourceforge.net/
Creating your tables
-~~~~~~~~~~~~~~~~~~~~
+--------------------
-When Django generates the schema, it doesn't specify a storage engine, so they
-will be created with whatever default `storage engine`__ your database server
-is configured for. The easiest solution is to set your database server's default
-storage engine to the desired engine.
+When Django generates the schema, it doesn't specify a storage engine, so
+tables will be created with whatever default storage engine your database
+server is configured for. The easiest solution is to set your database server's
+default storage engine to the desired engine.
-__ `storage engines`_
-
-If you are using a hosting service and can't change your server's default
+If you're using a hosting service and can't change your server's default
storage engine, you have a couple of options.
-After the tables is created, all that is needed to convert it to a new storage
-engine (such as InnoDB) is::
-
- ALTER TABLE ENGINE=INNODB;
+ * After the tables are created, execute an ``ALTER TABLE`` statement to
+ convert a table to a new storage engine (such as InnoDB)::
-With a lot of tables, this can be tedious.
+ ALTER TABLE ENGINE=INNODB;
-Another option is to use the ``init_command`` option for MySQLdb prior to
-creating your tables::
+ This can be tedious if you have a lot of tables.
- DATABASE_OPTIONS = {
- ...
- "init_command": "SET storage_engine=INNODB",
- ...
- }
+ * Another option is to use the ``init_command`` option for MySQLdb prior to
+ creating your tables::
-This sets the default storage engine upon connecting to the database. After
-your tables are set up and running in production, you should remove this
-option.
+ DATABASE_OPTIONS = {
+ # ...
+ "init_command": "SET storage_engine=INNODB",
+ # ...
+ }
-Another method for changing the storage engine is described in
-AlterModelOnSyncDB_.
+ This sets the default storage engine upon connecting to the database.
+ After your tables have been created, you should remove this option.
+
+ * Another method for changing the storage engine is described in
+ AlterModelOnSyncDB_.
.. _AlterModelOnSyncDB: http://code.djangoproject.com/wiki/AlterModelOnSyncDB
diff --git a/docs/distributions.txt b/docs/distributions.txt
index a77d3a1959..63206c535e 100644
--- a/docs/distributions.txt
+++ b/docs/distributions.txt
@@ -57,7 +57,7 @@ Gentoo
------
A Django build is available for `Gentoo Linux`_, and is based on Django 0.95.1.
-The `current Gentoo build`_ can be installed by typing ``emerge Django``.
+The `current Gentoo build`_ can be installed by typing ``emerge django``.
.. _Gentoo Linux: http://www.gentoo.org/
.. _current Gentoo build: http://packages.gentoo.org/packages/?category=dev-python;name=django
diff --git a/docs/django-admin.txt b/docs/django-admin.txt
index 371c44e010..28e28089cc 100644
--- a/docs/django-admin.txt
+++ b/docs/django-admin.txt
@@ -100,8 +100,6 @@ if you're ever curious to see the full list of defaults.
dumpdata [appname appname ...]
------------------------------
-**New in Django development version**
-
Output to standard output all data in the database associated with the named
application(s).
@@ -117,8 +115,6 @@ The output of ``dumpdata`` can be used as input for ``loaddata``.
flush
-----
-**New in Django development version**
-
Return the database to the state it was in immediately after syncdb was
executed. This means that all data will be removed from the database, any
post-synchronization handlers will be re-executed, and the ``initial_data``
@@ -165,18 +161,9 @@ needed.
``inspectdb`` works with PostgreSQL, MySQL and SQLite. Foreign-key detection
only works in PostgreSQL and with certain types of MySQL tables.
-install [appname appname ...]
------------------------------
-
-**Removed in Django development version**
-
-Executes the equivalent of ``sqlall`` for the given appnames.
-
loaddata [fixture fixture ...]
------------------------------
-**New in Django development version**
-
Searches for and loads the contents of the named fixture into the database.
A *Fixture* is a collection of files that contain the serialized contents of
@@ -216,7 +203,7 @@ installation will be aborted, and any data installed in the call to
``loaddata`` will be removed from the database.
The fixtures that are named can include directory components. These
-directories will be inluded in the search path. For example::
+directories will be included in the search path. For example::
django-admin.py loaddata foo/bar/mydata.json
@@ -350,8 +337,6 @@ Prints the DROP TABLE SQL statements for the given appnames.
sqlcustom [appname appname ...]
-------------------------------
-**New in Django development version**
-
Prints the custom SQL statements for the given appnames.
For each model in each specified app, this command looks for the file
@@ -373,13 +358,6 @@ sqlindexes [appname appname ...]
Prints the CREATE INDEX SQL statements for the given appnames.
-sqlinitialdata [appname appname ...]
---------------------------------------------
-
-**Removed in Django development version**
-
-This method has been renamed ``sqlcustom`` in the development version of Django.
-
sqlreset [appname appname ...]
--------------------------------------
@@ -426,8 +404,6 @@ fixture data files.
test
----
-**New in Django development version**
-
Discover and run tests for all installed models. See `Testing Django applications`_ for more information.
.. _testing django applications: ../testing/
@@ -475,8 +451,6 @@ setting the Python path for you.
--format
--------
-**New in Django development version**
-
Example usage::
django-admin.py dumpdata --format=xml
@@ -493,8 +467,6 @@ options.
--indent
--------
-**New in Django development version**
-
Example usage::
django-admin.py dumpdata --indent=4
@@ -506,8 +478,6 @@ Pretty-printing will only be enabled if the indent option is provided.
--noinput
---------
-**New in Django development version**
-
Inform django-admin that the user should NOT be prompted for any input. Useful
if the django-admin script will be executed as an unattended, automated
script.
@@ -530,8 +500,6 @@ Example output::
--verbosity
-----------
-**New in Django development version**
-
Example usage::
django-admin.py syncdb --verbosity=2
@@ -543,8 +511,6 @@ and `2` is verbose output.
--adminmedia
------------
-**New in Django development version**
-
Example usage::
django-admin.py manage.py --adminmedia=/tmp/new-admin-style/
diff --git a/docs/generic_views.txt b/docs/generic_views.txt
index a136c72a07..7659a428c5 100644
--- a/docs/generic_views.txt
+++ b/docs/generic_views.txt
@@ -97,8 +97,7 @@ which is a dictionary of the parameters captured in the URL.
* ``extra_context``: A dictionary of values to add to the template
context. By default, this is an empty dictionary. If a value in the
dictionary is callable, the generic view will call it
- just before rendering the template. (**This is new in the
- Django development version.**)
+ just before rendering the template.
**Example:**
@@ -752,10 +751,10 @@ If the results are paginated, the context will contain these extra variables:
* ``previous``: The previous page number, as an integer. This is 1-based.
- * `last_on_page`: **New in Django development version** The number of the
+ * `last_on_page`: The number of the
last result on the current page. This is 1-based.
- * `first_on_page`: **New in Django development version** The number of the
+ * `first_on_page`: The number of the
first result on the current page. This is 1-based.
* ``pages``: The total number of pages, as an integer.
diff --git a/docs/i18n.txt b/docs/i18n.txt
index d430a56160..4a05e53ddf 100644
--- a/docs/i18n.txt
+++ b/docs/i18n.txt
@@ -284,13 +284,13 @@ 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
+ Django does not support localizing your application into a locale for
+ which Django itself has not been translated. In this case, 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 want to
+ support a locale for your application that is not already part of
+ Django, you'll need to make at least a minimal translation of the Django
core.
Message files
diff --git a/docs/install.txt b/docs/install.txt
index 3eede02af0..dbbde93f83 100644
--- a/docs/install.txt
+++ b/docs/install.txt
@@ -86,25 +86,17 @@ Installing the official version
Distribution-provided packages will typically allow for automatic
installation of dependancies and easy upgrade paths.
- 2. Download Django-0.95.tar.gz from our `download page`_.
+ 2. Download the latest release from our `download page`_.
- 3. ``tar xzvf Django-0.95.tar.gz``
+ 3. Untar the downloaded file (e.g. ``tar xzvf Django-NNN.tar.gz``).
- 4. ``cd Django-0.95``
+ 4. Change into the downloaded directory (e.g. ``cd Django-NNN``).
- 5. ``sudo python setup.py install``
-
-Note that the last command will automatically download and install setuptools_
-if you don't already have it installed. This requires a working Internet
-connection and may cause problems on Python 2.5. If you run into problems,
-try using our development version by following the instructions below. The
-development version no longer uses setuptools nor requires an Internet
-connection.
+ 5. Run ``sudo python setup.py install``.
The command will install Django in your Python installation's ``site-packages``
directory.
-.. _setuptools: http://peak.telecommunity.com/DevCenter/setuptools
.. _distribution specific notes: ../distributions/
Installing the development version
diff --git a/docs/middleware.txt b/docs/middleware.txt
index 7635442a5c..0d533443d3 100644
--- a/docs/middleware.txt
+++ b/docs/middleware.txt
@@ -104,8 +104,6 @@ Also removes the content from any response to a HEAD request and sets the
django.middleware.http.SetRemoteAddrFromForwardedFor
----------------------------------------------------
-**New in Django development version**
-
Sets ``request.META['REMOTE_ADDR']`` based on
``request.META['HTTP_X_FORWARDED_FOR']``, if the latter is set. This is useful
if you're sitting behind a reverse proxy that causes each request's
diff --git a/docs/model-api.txt b/docs/model-api.txt
index e66e96de68..155ef63271 100644
--- a/docs/model-api.txt
+++ b/docs/model-api.txt
@@ -362,9 +362,8 @@ Like a ``PositiveIntegerField``, but only allows values under a certain
containing only letters, numbers, underscores or hyphens. They're generally
used in URLs.
-In the Django development version, you can specify ``maxlength``. If
-``maxlength`` is not specified, Django will use a default length of 50. In
-previous Django versions, there's no way to override the length of 50.
+Like a CharField, you can specify ``maxlength``. If ``maxlength`` is
+not specified, Django will use a default length of 50.
Implies ``db_index=True``.
@@ -1216,8 +1215,9 @@ screen via ``