summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Long <indirecthit@gmail.com>2006-09-23 18:18:58 +0000
committerChristopher Long <indirecthit@gmail.com>2006-09-23 18:18:58 +0000
commit5ea24f0c141a90f1e9a61ca7a8397cc28566623f (patch)
treef6946d2ab0ab835408e7a30032bca807816d3572
parent13d039ddabc79113bb319a668a8283097de4d165 (diff)
downloaddjango-5ea24f0c141a90f1e9a61ca7a8397cc28566623f.tar.gz
[per-object-permissions] Merged to trunk [3809]
git-svn-id: http://code.djangoproject.com/svn/django/branches/per-object-permissions@3810 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--AUTHORS8
-rw-r--r--README4
-rw-r--r--django/conf/global_settings.py5
-rw-r--r--django/conf/locale/es_AR/LC_MESSAGES/django.mobin33953 -> 36332 bytes
-rw-r--r--django/conf/locale/es_AR/LC_MESSAGES/django.po548
-rw-r--r--django/conf/locale/fi/LC_MESSAGES/django.mobin0 -> 33598 bytes
-rw-r--r--django/conf/locale/fi/LC_MESSAGES/django.po2031
-rw-r--r--django/conf/locale/fi/LC_MESSAGES/djangojs.mobin0 -> 1529 bytes
-rw-r--r--django/conf/locale/fi/LC_MESSAGES/djangojs.po110
-rw-r--r--django/conf/locale/no/LC_MESSAGES/django.mobin23238 -> 27469 bytes
-rw-r--r--django/conf/locale/no/LC_MESSAGES/django.po273
-rw-r--r--django/conf/locale/no/LC_MESSAGES/djangojs.mobin1432 -> 1492 bytes
-rw-r--r--django/conf/locale/no/LC_MESSAGES/djangojs.po11
-rw-r--r--django/conf/locale/pl/LC_MESSAGES/django.mobin23926 -> 28373 bytes
-rw-r--r--django/conf/locale/pl/LC_MESSAGES/django.po96
-rw-r--r--django/conf/locale/ru/LC_MESSAGES/django.mobin34467 -> 42820 bytes
-rw-r--r--django/conf/locale/ru/LC_MESSAGES/django.po506
-rw-r--r--django/contrib/admin/media/js/admin/DateTimeShortcuts.js1
-rw-r--r--django/contrib/admin/templatetags/admin_modify.py4
-rw-r--r--django/contrib/admin/templatetags/row_level_permission.py1
-rw-r--r--django/contrib/admin/views/auth.py4
-rw-r--r--django/contrib/admin/views/main.py2
-rw-r--r--django/contrib/auth/decorators.py8
-rw-r--r--django/contrib/auth/handlers/modpython.py31
-rw-r--r--django/contrib/auth/middleware.py9
-rw-r--r--django/contrib/auth/templatetags/auth.py24
-rw-r--r--django/core/context_processors.py6
-rw-r--r--django/core/handlers/modpython.py7
-rw-r--r--django/core/handlers/wsgi.py28
-rw-r--r--django/core/management.py59
-rw-r--r--django/core/serializers/json.py2
-rw-r--r--django/core/servers/fastcgi.py3
-rw-r--r--django/core/validators.py9
-rw-r--r--django/core/xheaders.py5
-rw-r--r--django/db/backends/mysql/introspection.py3
-rw-r--r--django/db/backends/util.py6
-rw-r--r--django/db/models/related.py3
-rw-r--r--django/forms/__init__.py27
-rw-r--r--django/http/__init__.py31
-rw-r--r--django/middleware/common.py3
-rw-r--r--django/middleware/doc.py9
-rw-r--r--django/template/defaultfilters.py2
-rw-r--r--django/template/defaulttags.py12
-rw-r--r--django/test/simple.py21
-rw-r--r--django/utils/datastructures.py3
-rw-r--r--django/utils/functional.py4
-rw-r--r--django/utils/text.py6
-rw-r--r--docs/authentication.txt40
-rw-r--r--docs/contributing.txt35
-rw-r--r--docs/db-api.txt2
-rw-r--r--docs/django-admin.txt6
-rw-r--r--docs/fastcgi.txt4
-rw-r--r--docs/forms.txt43
-rw-r--r--docs/model-api.txt4
-rw-r--r--docs/serialization.txt15
-rw-r--r--docs/settings.txt6
-rw-r--r--docs/templates_python.txt17
-rw-r--r--docs/testing.txt22
-rw-r--r--tests/modeltests/invalid_models/models.py37
-rw-r--r--tests/regressiontests/defaultfilters/tests.py3
-rw-r--r--tests/regressiontests/templates/tests.py5
61 files changed, 3354 insertions, 810 deletions
diff --git a/AUTHORS b/AUTHORS
index 4d57503bf8..8959a3a746 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -44,6 +44,7 @@ answer newbie questions, and generally made Django that much better:
akaihola
Andreas
+ ant9000@netwise.it
David Ascher <http://ascher.ca/>
Arthur <avandorp@gmail.com>
Jiri Barton
@@ -67,15 +68,19 @@ answer newbie questions, and generally made Django that much better:
Alex Dedul
deric@monowerks.com
dne@mayonnaise.net
+ Maximillian Dornseif <md@hudora.de>
+ dummy@habmalnefrage.de
Jeremy Dunck <http://dunck.us/>
Andy Dustman <farcepest@gmail.com>
Clint Ecker
+ favo@exoweb.net
gandalf@owca.info
Baishampayan Ghose
martin.glueck@gmail.com
Simon Greenhill <dev@simon.net.nz>
Espen Grindhaug <http://grindhaug.org/>
Brant Harris
+ heckj@mac.com
hipertracker@gmail.com
Ian Holsman <http://feh.holsman.net/>
Kieran Holland <http://www.kieranholland.com>
@@ -95,6 +100,7 @@ answer newbie questions, and generally made Django that much better:
lakin.wecker@gmail.com
Stuart Langridge <http://www.kryogenix.org/>
Eugene Lazutkin <http://lazutkin.com/blog/>
+ Jeong-Min Lee
Christopher Lenz <http://www.cmlenz.net/>
limodou
Martin Maney <http://www.chipy.org/Martin_Maney>
@@ -121,11 +127,13 @@ answer newbie questions, and generally made Django that much better:
Daniel Poelzleithner <http://poelzi.org/>
J. Rademaker
Michael Radziej <mir@noris.de>
+ ramiro
Brian Ray <http://brianray.chipy.org/>
rhettg@gmail.com
Oliver Rutherfurd <http://rutherfurd.net/>
Ivan Sagalaev (Maniac) <http://www.softwaremaniacs.org/>
David Schein
+ serbaut@gmail.com
Pete Shinners <pete@shinners.org>
SmileyChris <smileychris@gmail.com>
sopel
diff --git a/README b/README
index d52451d3ba..084f863a1e 100644
--- a/README
+++ b/README
@@ -25,10 +25,10 @@ http://code.djangoproject.com/newticket
To get more help:
* Join the #django channel on irc.freenode.net. Lots of helpful people
- hang out there. Read the archives at http://loglibrary.com/179 .
+ hang out there. Read the archives at http://simon.bofh.ms/logger/django/ .
* Join the django-users mailing list, or read the archives, at
- http://groups-beta.google.com/group/django-users.
+ http://groups.google.com/group/django-users.
To contribute to Django:
diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py
index c382d7bf96..ff691410bc 100644
--- a/django/conf/global_settings.py
+++ b/django/conf/global_settings.py
@@ -46,6 +46,7 @@ LANGUAGES = (
('en', gettext_noop('English')),
('es', gettext_noop('Spanish')),
('es_AR', gettext_noop('Argentinean Spanish')),
+ ('fi', gettext_noop('Finnish')),
('fr', gettext_noop('French')),
('gl', gettext_noop('Galician')),
('hu', gettext_noop('Hungarian')),
@@ -271,6 +272,10 @@ CACHE_MIDDLEWARE_KEY_PREFIX = ''
COMMENTS_ALLOW_PROFANITIES = False
+# The profanities that will trigger a validation error in the
+# 'hasNoProfanities' validator. All of these should be in lower-case.
+PROFANITIES_LIST = ['asshat', 'asshead', 'asshole', 'cunt', 'fuck', 'gook', 'nigger', 'shit']
+
# The group ID that designates which users are banned.
# Set to None if you're not using it.
COMMENTS_BANNED_USERS_GROUP = None
diff --git a/django/conf/locale/es_AR/LC_MESSAGES/django.mo b/django/conf/locale/es_AR/LC_MESSAGES/django.mo
index f550fca3db..dd96bf99ce 100644
--- a/django/conf/locale/es_AR/LC_MESSAGES/django.mo
+++ b/django/conf/locale/es_AR/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/es_AR/LC_MESSAGES/django.po b/django/conf/locale/es_AR/LC_MESSAGES/django.po
index 8af7c42e5e..e5169e9c4a 100644
--- a/django/conf/locale/es_AR/LC_MESSAGES/django.po
+++ b/django/conf/locale/es_AR/LC_MESSAGES/django.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-06-19 11:19-0300\n"
-"PO-Revision-Date: 2006-05-16 10:05-0300\n"
+"POT-Creation-Date: 2006-08-18 18:57-0300\n"
+"PO-Revision-Date: 2006-08-21 18:06-0300\n"
"Last-Translator: Ramiro Morales <rm0@gmx.net>\n"
"Language-Team: Spanish <es@li.org>\n"
"MIME-Version: 1.0\n"
@@ -17,15 +17,15 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: contrib/contenttypes/models.py:25
+#: contrib/contenttypes/models.py:20
msgid "python model class name"
msgstr "nombre de la clase python del modelo"
-#: contrib/contenttypes/models.py:28
+#: contrib/contenttypes/models.py:23
msgid "content type"
msgstr "tipo de contenido"
-#: contrib/contenttypes/models.py:29
+#: contrib/contenttypes/models.py:24
msgid "content types"
msgstr "tipos de contenido"
@@ -33,79 +33,103 @@ msgstr "tipos de contenido"
msgid "Logged out"
msgstr "Sesión cerrada"
-#: contrib/auth/models.py:13 contrib/auth/models.py:26
+#: contrib/auth/models.py:38 contrib/auth/models.py:57
msgid "name"
msgstr "nombre"
-#: contrib/auth/models.py:15
+#: contrib/auth/models.py:40
msgid "codename"
msgstr "nombre en código"
-#: contrib/auth/models.py:17
+#: contrib/auth/models.py:42
msgid "permission"
msgstr "permiso"
-#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#: contrib/auth/models.py:43 contrib/auth/models.py:58
msgid "permissions"
msgstr "permisos"
-#: contrib/auth/models.py:29
+#: contrib/auth/models.py:60
msgid "group"
msgstr "grupo"
-#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#: contrib/auth/models.py:61 contrib/auth/models.py:100
msgid "groups"
msgstr "grupos"
-#: contrib/auth/models.py:55
+#: contrib/auth/models.py:90
msgid "username"
msgstr "nombre de usuario"
-#: contrib/auth/models.py:56
+#: contrib/auth/models.py:90
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Requerido. Longitud máxima 30 caracteres alfanuméricos (letras, dígitos y "
+"guiones bajos)."
+
+#: contrib/auth/models.py:91
msgid "first name"
msgstr "nombre"
-#: contrib/auth/models.py:57
+#: contrib/auth/models.py:92
msgid "last name"
msgstr "apellido"
-#: contrib/auth/models.py:58
+#: contrib/auth/models.py:93
msgid "e-mail address"
msgstr "dirección de correo"
-#: contrib/auth/models.py:59
+#: contrib/auth/models.py:94
msgid "password"
msgstr "contraseña"
-#: contrib/auth/models.py:59
+#: contrib/auth/models.py:94
msgid "Use '[algo]$[salt]$[hexdigest]'"
msgstr "Use '[algoritmo]$[salt]$[hexdigest]'"
-#: contrib/auth/models.py:60
+#: contrib/auth/models.py:95
msgid "staff status"
msgstr "es staff"
-#: contrib/auth/models.py:60
+#: contrib/auth/models.py:95
msgid "Designates whether the user can log into this admin site."
msgstr "Indica si el usuario puede ingresar a este sitio de administración."
-#: contrib/auth/models.py:61
+#: contrib/auth/models.py:96
msgid "active"
msgstr "activo"
-#: contrib/auth/models.py:62
+#: contrib/auth/models.py:96
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Indica si el usuario puede ingresar al sitio de administración Django."
+"Desactive este campo en lugar de eliminar usuarios."
+
+#: contrib/auth/models.py:97
msgid "superuser status"
msgstr "es superusuario"
-#: contrib/auth/models.py:63
+#: contrib/auth/models.py:97
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Indica que este usuario posee todos los permisos, sin asignarle los mismos "
+"explícitamente."
+
+#: contrib/auth/models.py:98
msgid "last login"
msgstr "último registro"
-#: contrib/auth/models.py:64
+#: contrib/auth/models.py:99
msgid "date joined"
msgstr "fecha de creación"
-#: contrib/auth/models.py:66
+#: contrib/auth/models.py:101
msgid ""
"In addition to the permissions manually assigned, this user will also get "
"all permissions granted to each group he/she is in."
@@ -113,39 +137,39 @@ msgstr ""
"Además de los permisos asignados manualmente, este usuario también poseerá "
"todos los permisos de los grupos a los que pertenezca."
-#: contrib/auth/models.py:67
+#: contrib/auth/models.py:102
msgid "user permissions"
msgstr "permisos de usuario"
-#: contrib/auth/models.py:70
+#: contrib/auth/models.py:105
msgid "user"
msgstr "usuario"
-#: contrib/auth/models.py:71
+#: contrib/auth/models.py:106
msgid "users"
msgstr "usuarios"
-#: contrib/auth/models.py:76
+#: contrib/auth/models.py:111
msgid "Personal info"
msgstr "Información personal"
-#: contrib/auth/models.py:77
+#: contrib/auth/models.py:112
msgid "Permissions"
msgstr "Permisos"
-#: contrib/auth/models.py:78
+#: contrib/auth/models.py:113
msgid "Important dates"
msgstr "Fechas importantes"
-#: contrib/auth/models.py:79
+#: contrib/auth/models.py:114
msgid "Groups"
msgstr "Grupos"
-#: contrib/auth/models.py:219
+#: contrib/auth/models.py:256
msgid "message"
msgstr "mensaje"
-#: contrib/auth/forms.py:30
+#: contrib/auth/forms.py:52
msgid ""
"Your Web browser doesn't appear to have cookies enabled. Cookies are "
"required for logging in."
@@ -153,8 +177,7 @@ msgstr ""
"Su navegador Web aparenta no tener cookies activas. Las cookies son un "
"requerimiento para poder ingresar."
-#: contrib/auth/forms.py:36 contrib/auth/forms.py:43
-#: contrib/admin/views/decorators.py:9
+#: contrib/auth/forms.py:59 contrib/admin/views/decorators.py:10
msgid ""
"Please enter a correct username and password. Note that both fields are case-"
"sensitive."
@@ -162,7 +185,7 @@ msgstr ""
"Por favor ingrese un nombre de usuario y una contraseña correctos. Note que "
"ambos campos son sensibles a mayúsculas/minúsculas."
-#: contrib/auth/forms.py:45
+#: contrib/auth/forms.py:61
msgid "This account is inactive."
msgstr "Esta cuenta está inactiva"
@@ -255,7 +278,7 @@ msgstr "fecha/hora de envío"
msgid "is public"
msgstr "es público"
-#: contrib/comments/models.py:85 contrib/admin/views/doc.py:292
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
msgid "IP address"
msgstr "Dirección IP"
@@ -392,12 +415,12 @@ msgstr "ID de comentario no válido"
msgid "No voting for yourself"
msgstr "No puedes votarte tú mismo"
-#: 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 "Se precisa esta puntuación porque ha introducido al menos otra más."
-#: 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 "
@@ -420,7 +443,7 @@ msgstr[1] ""
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:117
+#: contrib/comments/views/comments.py:116
#, fuzzy, python-format
msgid ""
"This comment was posted by a sketchy user:\n"
@@ -431,24 +454,24 @@ msgstr ""
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:188
#: contrib/comments/views/comments.py:280
msgid "Only POSTs are allowed"
msgstr "Sólo se admiten POSTs"
-#: 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 "No se proporcionó uno o más de los siguientes campos requeridos"
-#: 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 ""
"Alguien está jugando con el formulario de comentarios (violación de "
"seguridad)"
-#: 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 "
@@ -467,12 +490,12 @@ msgid "Your name:"
msgstr "Su nombre:"
#: contrib/comments/templates/comments/freeform.html:5
-#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/form.html:28
msgid "Comment:"
msgstr "Comentario:"
-#: contrib/comments/templates/comments/freeform.html:9
-#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:10
+#: contrib/comments/templates/comments/form.html:35
msgid "Preview comment"
msgstr "Previsualizar comentario"
@@ -483,19 +506,10 @@ msgid "Username:"
msgstr "Usuario:"
#: contrib/comments/templates/comments/form.html:6
-#: contrib/admin/templates/admin/login.html:20
-msgid "Password:"
-msgstr "Contraseña:"
-
-#: contrib/comments/templates/comments/form.html:6
-msgid "Forgotten your password?"
-msgstr "Olvidó su contraseña?"
-
-#: 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/change_form.html:10
-#: contrib/admin/templates/admin/base.html:24
+#: contrib/admin/templates/admin/base.html:25
#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
@@ -512,6 +526,15 @@ msgstr "Olvidó su contraseña?"
msgid "Log out"
msgstr "Cerrar sesión"
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Contraseña:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Olvidó su contraseña?"
+
#: contrib/comments/templates/comments/form.html:12
msgid "Ratings"
msgstr "Calificaciones"
@@ -530,7 +553,7 @@ msgstr "Opcional"
msgid "Post a photo"
msgstr "Enviar una foto"
-#: contrib/flatpages/models.py:7 contrib/admin/views/doc.py:303
+#: contrib/flatpages/models.py:7 contrib/admin/views/doc.py:315
msgid "URL"
msgstr "URL"
@@ -559,11 +582,11 @@ msgstr "nombre de plantilla"
#: contrib/flatpages/models.py:13
msgid ""
-"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
-"use 'flatpages/default'."
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
msgstr ""
-"Ejemplo: 'flatpages/contact_page'. Si no lo proporciona, el sistema usará "
-"'flatpages/default'."
+"Ejemplo: 'flatpages/contact_page.html'. Si no lo proporciona, el sistema "
+"usará 'flatpages/default.html'."
#: contrib/flatpages/models.py:14
msgid "registration required"
@@ -581,23 +604,23 @@ msgstr "página estática"
msgid "flat pages"
msgstr "páginas estáticas"
-#: contrib/sessions/models.py:35
+#: contrib/sessions/models.py:51
msgid "session key"
msgstr "clave de sesión"
-#: contrib/sessions/models.py:36
+#: contrib/sessions/models.py:52
msgid "session data"
msgstr "datos de sesión"
-#: contrib/sessions/models.py:37
+#: contrib/sessions/models.py:53
msgid "expire date"
msgstr "fecha de caducidad"
-#: contrib/sessions/models.py:41
+#: contrib/sessions/models.py:57
msgid "session"
msgstr "sesión"
-#: contrib/sessions/models.py:42
+#: contrib/sessions/models.py:58
msgid "sessions"
msgstr "sesiones"
@@ -695,12 +718,12 @@ msgstr "entradas de registro"
msgid "All dates"
msgstr "Todas las fechas"
-#: contrib/admin/views/decorators.py:23
+#: contrib/admin/views/decorators.py:24
#: contrib/admin/templates/admin/login.html:25
msgid "Log in"
msgstr "Identificarse"
-#: contrib/admin/views/decorators.py:61
+#: contrib/admin/views/decorators.py:62
msgid ""
"Please log in again, because your session has expired. Don't worry: Your "
"submission has been saved."
@@ -708,7 +731,7 @@ msgstr ""
"Por favor, identifíquese de nuevo porque su sesión ha caducado. No se "
"preocupe: se ha guardado su envío."
-#: contrib/admin/views/decorators.py:68
+#: contrib/admin/views/decorators.py:69
msgid ""
"Looks like your browser isn't configured to accept cookies. Please enable "
"cookies, reload this page, and try again."
@@ -716,187 +739,253 @@ msgstr ""
"Parece que su navegador no está configurado para aceptar cookies. Actívelas "
"por favor, recargue esta página, e inténtelo de nuevo."
-#: contrib/admin/views/decorators.py:82
+#: contrib/admin/views/decorators.py:83
msgid "Usernames cannot contain the '@' character."
msgstr "Los nombres de usuario no pueden contener el carácter '@'."
-#: contrib/admin/views/decorators.py:84
+#: contrib/admin/views/decorators.py:85
#, python-format
msgid "Your e-mail address is not your username. Try '%s' instead."
msgstr ""
"Su dirección de correo no es su nombre de usuario. Pruebe con '%s' en su "
"lugar."
-#: contrib/admin/views/main.py:226
+#: contrib/admin/views/main.py:223
msgid "Site administration"
msgstr "Sitio administrativo"
-#: contrib/admin/views/main.py:260
+#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:14
#, python-format
msgid "The %(name)s \"%(obj)s\" was added successfully."
-msgstr "Se añadió con éxito el %(name)s \"%(obj)s\"."
+msgstr "Se agregó con éxito el %(name)s \"%(obj)s\"."
-#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+#: contrib/admin/views/main.py:261 contrib/admin/views/main.py:347
+#: contrib/admin/views/auth.py:19
msgid "You may edit it again below."
-msgstr "Puede editarlo de nuevo abajo."
+msgstr "Puede modificarlo nuevamente abajo."
-#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
#, python-format
msgid "You may add another %s below."
msgstr "Puede agregar otro %s abajo."
-#: contrib/admin/views/main.py:290
+#: contrib/admin/views/main.py:289
#, python-format
msgid "Add %s"
msgstr "Agregar %s"
-#: contrib/admin/views/main.py:336
+#: contrib/admin/views/main.py:335
#, python-format
msgid "Added %s."
msgstr "Agregado %s."
-#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
-#: contrib/admin/views/main.py:340
+#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:339
msgid "and"
msgstr "y"
-#: contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:337
#, python-format
msgid "Changed %s."
msgstr "Modifica %s."
-#: contrib/admin/views/main.py:340
+#: contrib/admin/views/main.py:339
#, python-format
msgid "Deleted %s."
msgstr "Elimina %s."
-#: contrib/admin/views/main.py:343
+#: contrib/admin/views/main.py:342
msgid "No fields changed."
-msgstr "No ha cambiado ningún campo."
+msgstr "No ha modificado ningún campo."
-#: contrib/admin/views/main.py:346
+#: contrib/admin/views/main.py:345
#, python-format
msgid "The %(name)s \"%(obj)s\" was changed successfully."
msgstr "Se modificó con éxito el %(name)s \"%(obj)s."
-#: contrib/admin/views/main.py:354
+#: contrib/admin/views/main.py:353
#, python-format
msgid ""
"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
msgstr ""
-"Se agregó con éxito el %(name)s \"%(obj)s. Puede editarlo de nuevo abajo."
+"Se agregó con éxito el %(name)s \"%(obj)s. Puede modificarlo nuevamente "
+"abajo."
-#: contrib/admin/views/main.py:392
+#: contrib/admin/views/main.py:391
#, python-format
msgid "Change %s"
msgstr "Modificar %s"
-#: contrib/admin/views/main.py:470
+#: contrib/admin/views/main.py:473
#, python-format
msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
msgstr "Uno o más %(fieldname)s en %(name)s: %(obj)s"
-#: contrib/admin/views/main.py:475
+#: contrib/admin/views/main.py:478
#, python-format
msgid "One or more %(fieldname)s in %(name)s:"
msgstr "Uno o más %(fieldname)s en %(name)s:"
-#: contrib/admin/views/main.py:508
+#: contrib/admin/views/main.py:511
#, python-format
msgid "The %(name)s \"%(obj)s\" was deleted successfully."
msgstr "Se eliminó con éxito el %(name)s \"%(obj)s\"."
-#: contrib/admin/views/main.py:511
+#: contrib/admin/views/main.py:514
msgid "Are you sure?"
msgstr "¿Está seguro?"
-#: contrib/admin/views/main.py:533
+#: contrib/admin/views/main.py:536
#, python-format
msgid "Change history: %s"
msgstr "Historia de modificaciones: %s"
-#: contrib/admin/views/main.py:567
+#: contrib/admin/views/main.py:570
#, python-format
msgid "Select %s"
msgstr "Seleccione %s"
-#: contrib/admin/views/main.py:567
+#: contrib/admin/views/main.py:570
#, python-format
msgid "Select %s to change"
msgstr "Seleccione %s a modificar"
-#: contrib/admin/views/main.py:743
+#: contrib/admin/views/main.py:756
msgid "Database error"
msgstr "Error de base de datos"
-#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:289
-#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:297
-#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:300
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "etiqueta:"
+
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "Filtrar:"
+
+#: 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 "App %r no encontrada"
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %r not found in app %r"
+msgstr "Modelo %r no encontrado en app %r"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%s.%s` object"
+msgstr "El objeto relacionado `%s.%s`"
+
+#: 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 "modelo:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%s.%s` objects"
+msgstr "objetos relacionados `%s.%s`"
+
+#: 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 "Capos en %s objetos"
+
+#: 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 "Entero"
-#: contrib/admin/views/doc.py:280
+#: contrib/admin/views/doc.py:292
msgid "Boolean (Either True or False)"
msgstr "Booleano (Verdadero o Falso)"
-#: contrib/admin/views/doc.py:281 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
#, python-format
msgid "String (up to %(maxlength)s)"
msgstr "Cadena (máximo %(maxlength)s)"
-#: contrib/admin/views/doc.py:282
+#: contrib/admin/views/doc.py:294
msgid "Comma-separated integers"
msgstr "Enteros separados por comas"
-#: contrib/admin/views/doc.py:283
+#: contrib/admin/views/doc.py:295
msgid "Date (without time)"
msgstr "Fecha (sin hora)"
-#: contrib/admin/views/doc.py:284
+#: contrib/admin/views/doc.py:296
msgid "Date (with time)"
msgstr "Fecha (con hora)"
-#: contrib/admin/views/doc.py:285
+#: contrib/admin/views/doc.py:297
msgid "E-mail address"
msgstr "Dirección de correo electrónico"
-#: contrib/admin/views/doc.py:286 contrib/admin/views/doc.py:287
-#: contrib/admin/views/doc.py:290
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
msgid "File path"
msgstr "Ruta de archivo"
-#: contrib/admin/views/doc.py:288
+#: contrib/admin/views/doc.py:300
msgid "Decimal number"
msgstr "Número decimal"
-#: contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:306
msgid "Boolean (Either True, False or None)"
msgstr "Booleano (Verdadero, Falso o Nulo)"
-#: contrib/admin/views/doc.py:295
+#: contrib/admin/views/doc.py:307
msgid "Relation to parent model"
msgstr "Relación con el modelo padre"
-#: contrib/admin/views/doc.py:296
+#: contrib/admin/views/doc.py:308
msgid "Phone number"
msgstr "Número de teléfono"
-#: contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:313
msgid "Text"
msgstr "Texto"
-#: contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:314
msgid "Time"
msgstr "Hora"
-#: contrib/admin/views/doc.py:304
+#: contrib/admin/views/doc.py:316
msgid "U.S. state (two uppercase letters)"
msgstr "Estado de los EEUU (dos letras mayúsculas)"
-#: contrib/admin/views/doc.py:305
+#: contrib/admin/views/doc.py:317
msgid "XML text"
msgstr "Texto XML"
+#: contrib/admin/views/doc.py:339
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s no parece ser un objeto urlpattern"
+
+#: contrib/admin/views/auth.py:25
+msgid "Add user"
+msgstr "Agregar usuario"
+
#: contrib/admin/templates/widget/file.html:2
msgid "Currently:"
msgstr "Actualmente"
@@ -916,7 +1005,7 @@ msgstr "Hora:"
#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/admin/base.html:24
+#: contrib/admin/templates/admin/base.html:25
#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
@@ -927,7 +1016,7 @@ msgstr "Documentación"
#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/admin/base.html:24
+#: contrib/admin/templates/admin/base.html:25
#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
@@ -948,7 +1037,7 @@ msgstr "Cambiar contraseña"
#: contrib/admin/templates/admin/change_list.html:6
#: contrib/admin/templates/admin/500.html:4
#: contrib/admin/templates/admin/change_form.html:13
-#: contrib/admin/templates/admin/base.html:29
+#: contrib/admin/templates/admin/base.html:30
#: contrib/admin/templates/admin/delete_confirmation.html:6
#: contrib/admin/templates/admin/invalid_setup.html:4
#: contrib/admin/templates/registration/password_change_done.html:4
@@ -996,8 +1085,8 @@ msgstr "Agregar %(name)s"
#: contrib/admin/templates/admin/filter.html:2
#, python-format
-msgid " By %(title)s "
-msgstr " Por %(title)s "
+msgid " By %(filter_title)s "
+msgstr " Por %(filter_title)s "
#: contrib/admin/templates/admin/500.html:4
msgid "Server error"
@@ -1053,6 +1142,11 @@ msgstr "Administración de Django"
msgid "Models available in the %(name)s application."
msgstr "Modelos disponibles en la aplicación %(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"
@@ -1113,7 +1207,7 @@ msgstr "Ordenación"
msgid "Order:"
msgstr "Orden:"
-#: contrib/admin/templates/admin/base.html:24
+#: contrib/admin/templates/admin/base.html:25
msgid "Welcome,"
msgstr "Bienvenido,"
@@ -1125,22 +1219,22 @@ msgstr "Eliminar"
#: contrib/admin/templates/admin/delete_confirmation.html:14
#, python-format
msgid ""
-"Deleting the %(object_name)s '%(object)s' would result in deleting related "
-"objects, but your account doesn't have permission to delete the following "
-"types of objects:"
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
msgstr ""
-"Eliminar el %(object_name)s '%(object)s' provocaría la eliminación de "
-"objetos relacionados, pero su cuenta no tiene permiso para eliminar los "
+"Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación "
+"de objetos relacionados, pero su cuenta no tiene permiso para eliminar los "
"siguientes tipos de objetos:"
#: contrib/admin/templates/admin/delete_confirmation.html:21
#, python-format
msgid ""
-"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
-"the following related items will be deleted:"
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
msgstr ""
-"¿Está seguro de que quiere eliminar los %(object_name)s \"%(object)s\"? Se "
-"eliminarán los siguientes objetos relacionados:"
+"¿Está seguro de que quiere eliminar los %(object_name)s \"%(escaped_object)s"
+"\"? Se eliminarán los siguientes objetos relacionados:"
#: contrib/admin/templates/admin/delete_confirmation.html:26
msgid "Yes, I'm sure"
@@ -1172,6 +1266,30 @@ msgstr ""
"tablas de la misma hayan sido creadas, y asegúrese de que el usuario "
"apropiado tenga permisos de escritura en la base de datos."
+#: 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 ""
+"Primero, ingrese un nombre de usuario y una contraseña. Luego podrá "
+"configurar opciones adicionales."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Nombre de usuario:"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "Contraseña:"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "Contraseña (de nuevo)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "Para verificación, ingrese la misma contraseña que ingresó arriba."
+
#: 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
@@ -1359,26 +1477,6 @@ msgid "As above, but opens the admin page in a new window."
msgstr ""
"Como antes, pero abre la página de administración en una nueva ventana."
-#: utils/translation.py:363
-msgid "DATE_FORMAT"
-msgstr "j N Y"
-
-#: utils/translation.py:364
-msgid "DATETIME_FORMAT"
-msgstr "j N Y P"
-
-#: utils/translation.py:365
-msgid "TIME_FORMAT"
-msgstr "P"
-
-#: utils/translation.py:381
-msgid "YEAR_MONTH_FORMAT"
-msgstr "F Y"
-
-#: utils/translation.py:382
-msgid "MONTH_DAY_FORMAT"
-msgstr "j \\de F"
-
#: utils/dates.py:6
msgid "Monday"
msgstr "Lunes"
@@ -1567,115 +1665,143 @@ msgid_plural "minutes"
msgstr[0] "minuto"
msgstr[1] "minutos"
-#: conf/global_settings.py:37
+#: utils/translation/trans_real.py:362
+msgid "DATE_FORMAT"
+msgstr "j N Y"
+
+#: utils/translation/trans_real.py:363
+msgid "DATETIME_FORMAT"
+msgstr "j N 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 "j \\de F"
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Árabe"
+
+#: conf/global_settings.py:40
msgid "Bengali"
msgstr "Bengalí"
-#: conf/global_settings.py:38
+#: conf/global_settings.py:41
msgid "Czech"
msgstr "Checo"
-#: conf/global_settings.py:39
+#: conf/global_settings.py:42
msgid "Welsh"
msgstr "Galés"
-#: conf/global_settings.py:40
+#: conf/global_settings.py:43
msgid "Danish"
msgstr "Danés"
-#: conf/global_settings.py:41
+#: conf/global_settings.py:44
msgid "German"
msgstr "Alemán"
-#: conf/global_settings.py:42
+#: conf/global_settings.py:45
msgid "Greek"
msgstr "Griego"
-#: conf/global_settings.py:43
+#: conf/global_settings.py:46
msgid "English"
msgstr "Inglés"
-#: conf/global_settings.py:44
+#: conf/global_settings.py:47
msgid "Spanish"
msgstr "Español"
-#: conf/global_settings.py:45
+#: conf/global_settings.py:48
msgid "Argentinean Spanish"
msgstr "Español Argentino"
-#: conf/global_settings.py:46
+#: conf/global_settings.py:49
msgid "French"
msgstr "Francés"
-#: conf/global_settings.py:47
+#: conf/global_settings.py:50
msgid "Galician"
msgstr "Gallego"
-#: conf/global_settings.py:48
+#: conf/global_settings.py:51
msgid "Hungarian"
msgstr "Húngaro"
-#: conf/global_settings.py:49
+#: conf/global_settings.py:52
msgid "Hebrew"
msgstr "Hebreo"
-#: conf/global_settings.py:50
+#: conf/global_settings.py:53
msgid "Icelandic"
msgstr "Islandés"
-#: conf/global_settings.py:51
+#: conf/global_settings.py:54
msgid "Italian"
msgstr "Italiano"
-#: conf/global_settings.py:52
+#: conf/global_settings.py:55
msgid "Japanese"
msgstr "Japonés"
-#: conf/global_settings.py:53
+#: conf/global_settings.py:56
msgid "Dutch"
msgstr "Holandés"
-#: conf/global_settings.py:54
+#: conf/global_settings.py:57
msgid "Norwegian"
msgstr "Noruego"
-#: conf/global_settings.py:55
+#: conf/global_settings.py:58
msgid "Brazilian"
msgstr "Brasileño"
-#: conf/global_settings.py:56
+#: conf/global_settings.py:59
msgid "Romanian"
msgstr "Rumano"
-#: conf/global_settings.py:57
+#: conf/global_settings.py:60
msgid "Russian"
msgstr "Ruso"
-#: conf/global_settings.py:58
+#: conf/global_settings.py:61
msgid "Slovak"
msgstr "Eslovaco"
-#: conf/global_settings.py:59
+#: conf/global_settings.py:62
msgid "Slovenian"
msgstr "Esloveno"
-#: conf/global_settings.py:60
+#: conf/global_settings.py:63
msgid "Serbian"
msgstr "Serbio"
-#: conf/global_settings.py:61
+#: conf/global_settings.py:64
msgid "Swedish"
msgstr "Sueco"
-#: conf/global_settings.py:62
+#: conf/global_settings.py:65
+msgid "Tamil"
+msgstr "Tamil"
+
+#: conf/global_settings.py:66
msgid "Ukrainian"
msgstr "Ucraniano"
-#: conf/global_settings.py:63
+#: conf/global_settings.py:67
msgid "Simplified Chinese"
msgstr "Chino simplificado"
-#: conf/global_settings.py:64
+#: conf/global_settings.py:68
msgid "Traditional Chinese"
msgstr "Chino tradicional"
@@ -1691,47 +1817,51 @@ msgid "%(optname)s with this %(fieldname)s already exists."
msgstr "Ya existe %(optname)s con este %(fieldname)s."
#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
-#: db/models/fields/__init__.py:545 db/models/fields/__init__.py:556
+#: db/models/fields/__init__.py:551 db/models/fields/__init__.py:562
#: forms/__init__.py:346
msgid "This field is required."
msgstr "Este campo es obligatorio."
-#: db/models/fields/__init__.py:337
+#: db/models/fields/__init__.py:340
msgid "This value must be an integer."
msgstr "Este valor debe ser un número entero."
-#: db/models/fields/__init__.py:369
+#: db/models/fields/__init__.py:372
msgid "This value must be either True or False."
msgstr "Este valor debe ser True o False."
-#: db/models/fields/__init__.py:385
+#: db/models/fields/__init__.py:388
msgid "This field cannot be null."
msgstr "Este campo no puede ser nulo."
-#: db/models/fields/__init__.py:471 core/validators.py:135
+#: db/models/fields/__init__.py:415 core/validators.py:127
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Introduzca una fecha válida en formato AAAA-MM-DD."
+
+#: db/models/fields/__init__.py:477 core/validators.py:135
msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
msgstr "Introduzca una fecha/hora válida en formato YYYY-MM-DD HH:MM."
-#: db/models/fields/__init__.py:565
+#: db/models/fields/__init__.py:571
msgid "Enter a valid filename."
msgstr "Introduzca un nombre de achivo válido"
-#: db/models/fields/related.py:43
+#: db/models/fields/related.py:51
#, python-format
msgid "Please enter a valid %s."
msgstr "Por favor, introduzca un %s válido."
-#: db/models/fields/related.py:579
+#: db/models/fields/related.py:618
msgid "Separate multiple IDs with commas."
msgstr " Separe múltiples IDs con comas."
-#: db/models/fields/related.py:581
+#: db/models/fields/related.py:620
msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr ""
"Pulse \"Control\", o \"Command\" en un Mac, para seleccionar más de uno."
-#: db/models/fields/related.py:625
+#: db/models/fields/related.py:664
#, python-format
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
msgid_plural ""
@@ -1754,29 +1884,29 @@ msgstr[1] "Asegúrese de que su texto tiene menos de %s caracteres."
msgid "Line breaks are not allowed here."
msgstr "No se permiten saltos de línea."
-#: forms/__init__.py:485 forms/__init__.py:558 forms/__init__.py:597
+#: 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 una opción válida; '%(data)s' no está en %(choices)s."
-#: forms/__init__.py:659 core/validators.py:151 core/validators.py:379
+#: forms/__init__.py:661 core/validators.py:151 core/validators.py:379
msgid "No file was submitted. Check the encoding type on the form."
msgstr ""
"No se envió un archivo. Verifique el tipo de codificación en el formulario."
-#: forms/__init__.py:661
+#: forms/__init__.py:663
msgid "The submitted file is empty."
msgstr "El archivo enviado está vacío."
-#: forms/__init__.py:717
+#: forms/__init__.py:719
msgid "Enter a whole number between -32,768 and 32,767."
msgstr "Introduzca un número entero entre -32,768 y 32,767."
-#: forms/__init__.py:727
+#: forms/__init__.py:729
msgid "Enter a positive number."
msgstr "Introduzca un número positivo."
-#: forms/__init__.py:737
+#: forms/__init__.py:739
msgid "Enter a whole number between 0 and 32,767."
msgstr "Introduzca un número entero entre 0 y 32,767."
@@ -1832,10 +1962,6 @@ msgstr "Introduzca un número entero."
msgid "Only alphabetical characters are allowed here."
msgstr "Sólo se admiten caracteres alfabéticos."
-#: core/validators.py:127
-msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr "Introduzca una fecha válida en formato AAAA-MM-DD."
-
#: core/validators.py:131
msgid "Enter a valid time in HH:MM format."
msgstr "Introduzca una hora válida en formato HH:MM."
@@ -2066,18 +2192,28 @@ msgstr ""
"El atributo \"%(attr)s\" de la línea %(line)s tiene un valor que no es "
"válido. (La línea empieza por \"%(start)s\".)"
-#: template/defaultfilters.py:389
+#: template/defaultfilters.py:401
msgid "yes,no,maybe"
msgstr "si,no,tal vez"
-#, fuzzy
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "Se creó con éxito el %(verbose_name)."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "Se actualizó con éxito el %(verbose_name)s."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "Se eliminó el %(verbose_name)s."
+
#~ msgid "%(content_type_name)s"
#~ msgstr "tipos de contenido"
-#, fuzzy
-#~ msgid "%(myname)s"
-#~ msgstr "Agregar %(name)s"
-
#~ msgid "%(result_count)s result"
#~ msgid_plural "%(counter)s results"
#~ msgstr[0] "un resultado"
diff --git a/django/conf/locale/fi/LC_MESSAGES/django.mo b/django/conf/locale/fi/LC_MESSAGES/django.mo
new file mode 100644
index 0000000000..1e690716fd
--- /dev/null
+++ b/django/conf/locale/fi/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/fi/LC_MESSAGES/django.po b/django/conf/locale/fi/LC_MESSAGES/django.po
new file mode 100644
index 0000000000..9b91982e6b
--- /dev/null
+++ b/django/conf/locale/fi/LC_MESSAGES/django.po
@@ -0,0 +1,2031 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-08-05 14:41+0300\n"
+"PO-Revision-Date: 2006-08-12 23:41+0300\n"
+"Last-Translator: Antti Kaihola <antti.kaihola@ambitone.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+
+#: db/models/fields/related.py:51
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Syöttämäsi %s ei kelpaa."
+
+#: db/models/fields/related.py:618
+msgid "Separate multiple IDs with commas."
+msgstr "Erottele tunnisteet pilkuilla."
+
+#: db/models/fields/related.py:620
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+" Pidä \"Ctrl\"-näppäin (tai Macin \"Command\") pohjassa valitaksesi useita "
+"vaihtoehtoja."
+
+#: 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] "Syöttämäsi %(self)s-tunniste %(value)r ei kelpaa."
+msgstr[1] "Syöttämäsi %(self)s-tunnisteet %(value)r eivät kelpaa."
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s, jolla on tämä %(fieldname)s, on jo olemassa."
+
+#: 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 "Tämä kenttä vaaditaan."
+
+#: db/models/fields/__init__.py:340
+msgid "This value must be an integer."
+msgstr "Tarvitaan kokonaisluku."
+
+#: db/models/fields/__init__.py:372
+msgid "This value must be either True or False."
+msgstr "Tarvitaan tosi (True) tai epätosi (False)."
+
+#: db/models/fields/__init__.py:388
+msgid "This field cannot be null."
+msgstr "Tämän kentän arvo ei voi olla \"null\"."
+
+#: db/models/fields/__init__.py:415 core/validators.py:127
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Päivämäärän pitää olla muodossa VVVV-KK-PP."
+
+#: db/models/fields/__init__.py:477 core/validators.py:135
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Ajankohdan pitää olla muodossa VVVV-KK-PP TT:MM."
+
+#: db/models/fields/__init__.py:571
+msgid "Enter a valid filename."
+msgstr "Tiedostonimi ei kelpaa."
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "arabia"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "bengali"
+
+#: conf/global_settings.py:41
+msgid "Czech"
+msgstr "tšekki"
+
+#: conf/global_settings.py:42
+msgid "Welsh"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "Danish"
+msgstr "tanska"
+
+#: conf/global_settings.py:44
+msgid "German"
+msgstr "saksa"
+
+#: conf/global_settings.py:45
+msgid "Greek"
+msgstr "kreikka"
+
+#: conf/global_settings.py:46
+msgid "English"
+msgstr "englanti"
+
+#: conf/global_settings.py:47
+msgid "Spanish"
+msgstr "espanja"
+
+#: conf/global_settings.py:48
+msgid "Argentinean Spanish"
+msgstr "Argentiinan espanja"
+
+#: conf/global_settings.py:49
+msgid "French"
+msgstr "ranska"
+
+#: conf/global_settings.py:50
+msgid "Galician"
+msgstr ""
+
+#: conf/global_settings.py:51
+msgid "Hungarian"
+msgstr "unkari"
+
+#: conf/global_settings.py:52
+msgid "Hebrew"
+msgstr "heprea"
+
+#: conf/global_settings.py:53
+msgid "Icelandic"
+msgstr "islanti"
+
+#: conf/global_settings.py:54
+msgid "Italian"
+msgstr "italia"
+
+#: conf/global_settings.py:55
+msgid "Japanese"
+msgstr "japani"
+
+#: conf/global_settings.py:56
+msgid "Dutch"
+msgstr "hollanti"
+
+#: conf/global_settings.py:57
+msgid "Norwegian"
+msgstr "norja"
+
+#: conf/global_settings.py:58
+msgid "Brazilian"
+msgstr ""
+
+#: conf/global_settings.py:59
+msgid "Romanian"
+msgstr "romania"
+
+#: conf/global_settings.py:60
+msgid "Russian"
+msgstr "venäjä"
+
+#: conf/global_settings.py:61
+msgid "Slovak"
+msgstr ""
+
+#: conf/global_settings.py:62
+msgid "Slovenian"
+msgstr ""
+
+#: conf/global_settings.py:63
+msgid "Serbian"
+msgstr ""
+
+#: conf/global_settings.py:64
+msgid "Swedish"
+msgstr "ruotsi"
+
+#: conf/global_settings.py:65
+msgid "Tamil"
+msgstr ""
+
+#: conf/global_settings.py:66
+msgid "Ukrainian"
+msgstr ""
+
+#: conf/global_settings.py:67
+msgid "Simplified Chinese"
+msgstr ""
+
+#: conf/global_settings.py:68
+msgid "Traditional Chinese"
+msgstr ""
+
+#: core/validators.py:63
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Tässä voidaan käyttää vain kirjaimia (a-z), numeroita (0-9) ja alaviivoja (_)."
+
+#: core/validators.py:67
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "Tässä voidaan käyttää vain kirjaimia (a-z), numeroita (0-9) sekä ala-, tavu- ja kauttaviivoja (_ - /)."
+
+#: core/validators.py:75
+msgid "Uppercase letters are not allowed here."
+msgstr "Versaalit (ABC) eivät kelpaa tässä."
+
+#: core/validators.py:79
+msgid "Lowercase letters are not allowed here."
+msgstr "Pienet kirjaimet (abc) eivät kelpaa tässä."
+
+#: core/validators.py:86
+msgid "Enter only digits separated by commas."
+msgstr "Vain pilkulla erotetut luvut kelpaavat tässä."
+
+#: core/validators.py:98
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Syötä sähköpostiosoitteita pilkuilla erotettuina."
+
+#: core/validators.py:102
+msgid "Please enter a valid IP address."
+msgstr "IP-osoite ei kelpaa."
+
+#: core/validators.py:106
+msgid "Empty values are not allowed here."
+msgstr "Tätä kohtaa ei voi jättää tyhjäksi."
+
+#: core/validators.py:110
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Vain numerot (0-9) kelpaavat tässä."
+
+#: core/validators.py:114
+msgid "This value can't be comprised solely of digits."
+msgstr "Tarvitaan vähintään yksi merkki, joka ei ole numero (0-9)."
+
+#: core/validators.py:119
+msgid "Enter a whole number."
+msgstr "Syötä kokonaisluku."
+
+#: core/validators.py:123
+msgid "Only alphabetical characters are allowed here."
+msgstr "Vain kirjaimet kelpaavat tässä."
+
+#: core/validators.py:131
+msgid "Enter a valid time in HH:MM format."
+msgstr "Ajan täytyy olla muodossa TT:MM."
+
+#: core/validators.py:139
+msgid "Enter a valid e-mail address."
+msgstr "Syötä kelvollinen sähköpostiosoite."
+
+#: core/validators.py:151 core/validators.py:379 forms/__init__.py:661
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Tiedostoa ei lähetetty. Tarkista lomakkeen koodaus (encoding)."
+
+#: core/validators.py:155
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr "Kuva ei kelpaa. Lähettämäsi tiedosto ei ole kuva, tai tiedosto on vioittunut."
+
+#: core/validators.py:162
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "Osoittessa %s ei ole kelpaavaa kuvaa."
+
+#: core/validators.py:166
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Puhelinnumeron tulee olla muodossa XXX-XXX-XXXX. \"%s\" ei kelpaa."
+
+#: core/validators.py:174
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "Osoitteessa %s ei ole kelpaavaa QuickTime-videota."
+
+#: core/validators.py:178
+msgid "A valid URL is required."
+msgstr "URL-osoite ei kelpaa."
+
+#: core/validators.py:192
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"HTML-koodi ei kelpaa. Virheilmoitus on:\n"
+"%s"
+
+#: core/validators.py:199
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Vääränmuotoinen XML: %s"
+
+#: core/validators.py:209
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL-osoite %s ei kelpaa."
+
+#: core/validators.py:213 core/validators.py:215
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Osoite %s on katkennut linkki."
+
+#: core/validators.py:221
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Syötä USA:n osavaltion lyhenne."
+
+#: core/validators.py:236
+#, 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] "Sanaa \"%s\" ei saa käyttää tässä."
+msgstr[1] "Sanoja \"%s\" ei saa käyttää tässä."
+
+#: core/validators.py:243
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr ""
+
+#: core/validators.py:262
+msgid "Please enter something for at least one field."
+msgstr "Täytä ainakin yksi kenttä."
+
+#: core/validators.py:271 core/validators.py:282
+msgid "Please enter both fields or leave them both empty."
+msgstr "Täytä tai jätä tyhjäksi kummatkin kentät."
+
+#: core/validators.py:289
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Tämä kenttä pitää täyttää, jos %(field)s on %(value)s."
+
+#: core/validators.py:301
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Tämä kenttä pitää täyttää, jos %(field)s ei ole %(value)s."
+
+#: core/validators.py:320
+msgid "Duplicate values are not allowed."
+msgstr "Samaa arvoa ei voi käyttää kahdesti."
+
+#: core/validators.py:343
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Tämän luvun on oltava %s:n potenssi."
+
+#: core/validators.py:354
+msgid "Please enter a valid decimal number."
+msgstr "Desimaaliluku ei kelpaa."
+
+#: core/validators.py:356
+#, 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] "Desimaaliluvussa saa tässä olla yhteensä vain %s merkitsevä numero. Huomaa, että desimaalierottimena käytetään pilkun (,) sijasta pistettä (.)."
+msgstr[1] "Desimaaliluvussa saa tässä olla yhteensä vain %s merkitsevää numeroa. Huomaa, että desimaalierottimena käytetään pilkun (,) sijasta pistettä (.)."
+
+#: core/validators.py:359
+#, 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] "Desimaaliluvun kokonaisosassa saa tässä olla vain %s numero. Huomaa, että desimaalierottimena käytetään pilkun (,) sijasta pistettä (.)."
+msgstr[1] "Desimaaliluvun kokonaisosassa saa tässä olla vain %s numeroa. Huomaa, että desimaalierottimena käytetään pilkun (,) sijasta pistettä (.)."
+
+#: core/validators.py:362
+#, 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] "Tässä saa olla vain %s desimaali. Huomaa, että desimaalierottimena käytetään pilkun (,) sijasta pistettä (.)."
+msgstr[1] "Tässä saa olla vain %s desimaalia. Huomaa, että desimaalierottimena käytetään pilkun (,) sijasta pistettä (.)."
+
+#: core/validators.py:372
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Lähetä vähintään %s tavun kokoinen tiedosto."
+
+#: core/validators.py:373
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Lähetä enintään %s tavun kokoinen tiedosto."
+
+#: core/validators.py:390
+msgid "The format for this field is wrong."
+msgstr "Muoto ei kelpaa."
+
+#: core/validators.py:405
+msgid "This field is invalid."
+msgstr "Tämä arvo ei kelpaa."
+
+#: core/validators.py:441
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr ""
+
+#: core/validators.py:444
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "Osoitteesta %(url)s saatiin virheellinen Content-Type '%(contenttype)s'."
+
+#: core/validators.py:477
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr "Rivillä %(line)s oleva tagi %(tag)s pitää sulkea. (Rivi alkaa \"%(start)s\")"
+
+#: core/validators.py:481
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr "Rivillä %(line)s on tekstiä, joka ei kelpaa tässä yhteydessä. (Rivi alkaa \"%(start)s\")"
+
+#: core/validators.py:486
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr "Rivillä %(line)s attribuutti %(attr)s ei kelpaa. (Rivi alkaa \"%(start)s\")"
+
+#: core/validators.py:491
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr "Rivillä %(line)s tagi \"<%(tag)s>\" ei kelpaa. (Rivi alkaa \"%(start)s\")"
+
+#: core/validators.py:495
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr "Rivillä %(line)s yhdestä tagista puuttuu yksi tai useampi attribuutti. (Rivi alkaa \"%(start)s\")"
+
+#: core/validators.py:500
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr "Rivillä %(line)s attribuutin %(attr)s arvo ei kelpaa. (Rivi alkaa \"%(start)s\")"
+
+#: contrib/auth/forms.py:52
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr "Selaimesi ei salli evästeitä. Sisäänkirjautuminen vaatii evästeen."
+
+#: contrib/auth/forms.py:59 contrib/admin/views/decorators.py:10
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr "Käyttäjätunnus tai salasana ei kelpaa. Huomaa, että isot ja pienet kirjaimet ovat merkitseviä."
+
+#: contrib/auth/forms.py:61
+msgid "This account is inactive."
+msgstr "Tämä käyttäjätili ei ole voimassa."
+
+#: contrib/auth/models.py:38 contrib/auth/models.py:57
+msgid "name"
+msgstr "nimi"
+
+#: contrib/auth/models.py:40
+msgid "codename"
+msgstr "koodinimi"
+
+#: contrib/auth/models.py:42
+msgid "permission"
+msgstr "oikeus"
+
+#: contrib/auth/models.py:43 contrib/auth/models.py:58
+msgid "permissions"
+msgstr "oikeudet"
+
+#: contrib/auth/models.py:60
+msgid "group"
+msgstr "ryhmä"
+
+#: contrib/auth/models.py:61 contrib/auth/models.py:100
+msgid "groups"
+msgstr "ryhmät"
+
+#: contrib/auth/models.py:90
+msgid "username"
+msgstr "tunnus"
+
+#: contrib/auth/models.py:90
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr " Vaaditaan. Enintään 30 kirjanta (a-z), numeroa (0-9) tai alaviivaa (_)."
+
+#: contrib/auth/models.py:91
+msgid "first name"
+msgstr "etunimi"
+
+#: contrib/auth/models.py:92
+msgid "last name"
+msgstr "sukunimi"
+
+#: contrib/auth/models.py:93
+msgid "e-mail address"
+msgstr "sähköposti"
+
+#: contrib/auth/models.py:94
+msgid "password"
+msgstr "salasana"
+
+#: contrib/auth/models.py:94
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "(Salasanaa ei näytetä selväkielisenä)"
+
+#: contrib/auth/models.py:95
+msgid "staff status"
+msgstr "ylläpitäjä"
+
+#: contrib/auth/models.py:95
+msgid "Designates whether the user can log into this admin site."
+msgstr "Ylläpitäjillä on pääsy tähän sivuston ylläpito-osioon."
+
+#: contrib/auth/models.py:96
+msgid "active"
+msgstr "voimassa"
+
+#: contrib/auth/models.py:96
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr "Määrää, voiko käyttäjä kirjautua sisään. Tällä voi estää käyttäjätilin käytön poistamatta sitä."
+
+#: contrib/auth/models.py:97
+msgid "superuser status"
+msgstr "pääkäyttäjä"
+
+#: contrib/auth/models.py:97
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "Antaa käyttäjälle kaikki oikeudet ilman, että niitä täytyy erikseen luetella."
+
+#: contrib/auth/models.py:98
+msgid "last login"
+msgstr "viimeksi kirjautunut"
+
+#: contrib/auth/models.py:99
+msgid "date joined"
+msgstr "liittynyt"
+
+#: 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 ""
+"Tässä valittujen oikeuksien lisäksi käyttäjä saa myös kaikki niiden ryhmien "
+"oikeudet, joiden jäsen hän on."
+
+#: contrib/auth/models.py:102
+msgid "user permissions"
+msgstr "käyttäjän oikeudet"
+
+#: contrib/auth/models.py:105
+msgid "user"
+msgstr "käyttäjä"
+
+#: contrib/auth/models.py:106
+msgid "users"
+msgstr "käyttäjät"
+
+#: contrib/auth/models.py:111
+msgid "Personal info"
+msgstr "Henkilökohtaiset tiedot"
+
+#: contrib/auth/models.py:112
+msgid "Permissions"
+msgstr "Oikeudet"
+
+#: contrib/auth/models.py:113
+msgid "Important dates"
+msgstr "Tärkeät päivämäärät"
+
+#: contrib/auth/models.py:114
+msgid "Groups"
+msgstr "Ryhmät"
+
+#: contrib/auth/models.py:256
+msgid "message"
+msgstr "viesti"
+
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "Kirjautunut ulos"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "tapahtumahetki"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "kohteen tunniste"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "kohteen tiedot"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "tapahtumatyyppi"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "selitys"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "lokimerkintä"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "lokimerkinnät"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Yksi %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
+msgid "All"
+msgstr "Kaikki"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Mikä tahansa päivä"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Tänään"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Viimeiset 7 päivää"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Tässä kuussa"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Tänä vuonna"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Kyllä"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Ei"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Tuntematon"
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Kirjaudu sisään"
+
+#: 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 "Kirjaudu uudelleen sisään, koska istuntosi on mennyt umpeen. Muutoksesi ovat silti tallessa."
+
+#: 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 "Selaimesi ei salli evästeitä. Muuta asetukset sallimaan evästeet, lataa tämä sivu uudelleen ja yritä toistamiseen."
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "Käyttäjätunnuksessa ei saa olla '@'-merkkiä."
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Käyttäjätunnus ei ole sama kuin sähköpostiosoite. Kokeile '%s'."
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "Sivuston ylläpito"
+
+#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:14
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" on nyt lisätty."
+
+#: contrib/admin/views/main.py:261 contrib/admin/views/main.py:345
+#: contrib/admin/views/auth.py:19
+msgid "You may edit it again below."
+msgstr "Voit muokata sitä uudelleen alla."
+
+#: contrib/admin/views/main.py:269 contrib/admin/views/main.py:354
+#, python-format
+msgid "You may add another %s below."
+msgstr "Uusi %s on lisättävissä alla."
+
+#: contrib/admin/views/main.py:287
+#, python-format
+msgid "Add %s"
+msgstr "Uusi %s"
+
+#: contrib/admin/views/main.py:333
+#, python-format
+msgid "Added %s."
+msgstr "Lisätty %s."
+
+#: contrib/admin/views/main.py:333 contrib/admin/views/main.py:335
+#: contrib/admin/views/main.py:337
+msgid "and"
+msgstr "ja"
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Changed %s."
+msgstr "Muokattu: %s."
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Deleted %s."
+msgstr "Poistettu %s."
+
+#: contrib/admin/views/main.py:340
+msgid "No fields changed."
+msgstr "Ei muutoksia kenttiin."
+
+#: contrib/admin/views/main.py:343
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" on nyt muutettu."
+
+#: contrib/admin/views/main.py:351
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" on nyt lisätty. Voit muokata sitä uudelleen alla."
+
+#: contrib/admin/views/main.py:389
+#, python-format
+msgid "Change %s"
+msgstr "Muokkaa: %s"
+
+#: contrib/admin/views/main.py:471
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Yksi tai useampi %(fieldname)s kohteessa %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:476
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Yksi tai useampi %(fieldname)s kohteessa %(name)s:"
+
+#: contrib/admin/views/main.py:509
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" on poistettu."
+
+#: contrib/admin/views/main.py:512
+msgid "Are you sure?"
+msgstr "Oletko varma?"
+
+#: contrib/admin/views/main.py:534
+#, python-format
+msgid "Change history: %s"
+msgstr "Muokkaushistoria: %s"
+
+#: contrib/admin/views/main.py:568
+#, python-format
+msgid "Select %s"
+msgstr "Valitse %s"
+
+#: contrib/admin/views/main.py:568
+#, python-format
+msgid "Select %s to change"
+msgstr "Valitse muokattava %s"
+
+#: contrib/admin/views/main.py:744
+msgid "Database error"
+msgstr "Tietokantavirhe"
+
+#: 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 "Kokonaisluku"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "Totuusarvo: joko tosi (True) tai epätosi (False)"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Merkkijono (enintään %(maxlength)s merkkiä)"
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "Pilkulla erotetut kokonaisluvut"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "Päivämäärä"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "Päivämäärä ja kellonaika"
+
+#: contrib/admin/views/doc.py:297
+msgid "E-mail address"
+msgstr "Sähköpostios."
+
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
+msgid "File path"
+msgstr "Tiedostopolku"
+
+#: contrib/admin/views/doc.py:300
+msgid "Decimal number"
+msgstr "Desimaaliluku"
+
+#: contrib/admin/views/doc.py:304 contrib/comments/models.py:85
+msgid "IP address"
+msgstr "IP-osoite"
+
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "Totuusarvo: joko tosi (True), epätosi (False) tai ei mikään (None)"
+
+#: contrib/admin/views/doc.py:307
+msgid "Relation to parent model"
+msgstr "Relaatio emomalliin"
+
+#: contrib/admin/views/doc.py:308
+msgid "Phone number"
+msgstr "Puhelinnumero"
+
+#: contrib/admin/views/doc.py:313
+msgid "Text"
+msgstr "Tekstiä"
+
+#: contrib/admin/views/doc.py:314
+msgid "Time"
+msgstr "Kellonaika"
+
+#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL-osoite"
+
+#: contrib/admin/views/doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "USA:n osavaltio (kaksikirjaiminen versaalein)"
+
+#: contrib/admin/views/doc.py:317
+msgid "XML text"
+msgstr "XML-teksti"
+
+#: contrib/admin/views/auth.py:25
+msgid "Add user"
+msgstr "Uusi käyttäjä"
+
+#: contrib/admin/templatetags/admin_list.py:230
+msgid "All dates"
+msgstr "Kaikki päivät"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Näytä kaikki"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/base.html:24
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+msgid "Documentation"
+msgstr "Ohjeita"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/base.html:24
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+msgid "Change password"
+msgstr "Vaihda salasana"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/base.html:24
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Kirjaudu ulos"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/base.html:29
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: 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/registration/password_change_done.html:4
+msgid "Home"
+msgstr "Etusivu"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Poista"
+
+#: 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 "Kohteen '%(escaped_object)s' (%(object_name)s) poisto poistaisi myös siihen liittyviä kohteita, mutta sinulla ei ole oikeutta näiden kohteiden poistamiseen:"
+
+#: 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 "Haluatko varmasti poistaa kohteen \"%(escaped_object)s\" (%(object_name)s)? Myös seuraavat kohteet poistettaisiin samalla:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Kyllä, olen varma"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Sivua ei löydy"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Pahoittelemme, pyydettyä sivua ei voitu löytää."
+
+#: contrib/admin/templates/admin/change_form.html:15
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "Lisää uusi"
+
+#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Muokkaushistoria"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Näytä lopputulos"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Korjaa virhe."
+msgstr[1] "Korjaa virheet."
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Järjestys"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Järjestysnumero:"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " %(filter_title)s:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Talleta uutena"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Talleta ja lisää seuraava"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Talleta välillä ja jatka muokkaamista"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Talleta ja poistu"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Lisää uusi %(name)s"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Sovelluksen %(name)s mallit."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Muokkaa"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Sinulla ei ole oikeutta muokata mitään."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Viimeisimmät muutokset"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Sinun tekemäsi muutokset"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Ei yhtään"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django-sivuston ylläpito"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Djangon ylläpito"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Pvm/klo"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Käyttäjä"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Toiminto"
+
+#: 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 "Tällä kohteella ei ole muutoshistoriaa. Sitä ei ole lisätty tämän ylläpitosivun avulla."
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Palvelinvirhe"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Palvelinvirhe (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Palvelinvirhe <em>(500)</em>"
+
+#: 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 "Tietokanta-asennuksessasi on jotain vialla. Varmistu, että sopivat taulut on luotu ja että oikea käyttäjä voi lukea tietokantaa."
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Etsi"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 hakutulas"
+msgstr[1] "%(counter)s hakutulosta"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "yhteensä %(full_result_count)s"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Suodatin"
+
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Käyttäjätunnus"
+
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Salasana:"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Oletko <a href=\"/password_reset\">unohtanut salasanasi</a>?"
+
+#: contrib/admin/templates/admin/base.html:24
+msgid "Welcome,"
+msgstr "Tervetuloa,"
+
+#: 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 "Syötä ensin käyttäjätunnus ja salasana. Sen jälkeen voit muokata muita käyttäjän tietoja."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Käyttäjätunnus"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "Salasana:"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "Salasana toistamiseen"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "Syötä sama salasana tarkistuksen vuoksi toistamiseen."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Kirjanmerkkiset"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Ohjeiden kirjanmerkkiset"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">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\").</p>\n"
+msgstr "\n<p class=\"help\">Asenna kirjanmerkkinen raahaamalla linkki kirjanmerkkien työkalupalkkiin tai napsauttamalla linkkiä oikeanpuoleisella hiiren painikkeella ja valitsemalla kirjanmerkkeihin lisäämisen. Sen jälkeen voit valita kirjanmerkkisen miltä tahansa sivuston sivulta. Huomaa, että jotkin näistä kirjanmerkkisistä toimivat vain, jos selaat sivustoa \"paikalliseksi\" määritellyltä tietokoneelta (kysy lisätietoja verkkonne ylläpitäjältä).</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Tämän sivun ohjeita"
+
+#: 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 "Vie avoinna olevan sivun luoneen näkymän ohjeisiin."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Näytä kohteen tunniste"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr "Näyttää yksittäistä kohdetta vastaavilla sivuilla kohteen tyypin ja tunnisteen."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Muokkaa tätä kohdetta (tässä ikkunassa)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Siirtyy yksittäistä kohdetta vastaavalta sivulta kohteen ylläpitosivulle."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Muokkaa tätä kohdetta (uudessa ikkunassa)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Kuten yllä, mutta avaa ylläpitosivun uuteen ikkunaan."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Pvm:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Klo:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Tällä hetkellä:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Muokkaa:"
+
+#: 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 "Salasanan nollaus"
+
+#: 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 ""
+"Unohditko salasanasi? Syötä alle sähköpostiosoitteesi, niin \n"
+"lähetämme sinulle uuden salasanan."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Sähköpostiosoite:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Nollaa salasana"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Sait tämän viestin, koska pyysit uutta salasanaa"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "sivuston %(site_name)s käyttäjätilillesi"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Uusi salasanasi on: %(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 "Voit vaihtaa salasanan sivulla:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Käyttäjätunnuksesi siltä varalta, että olet unohtanut sen:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Kiitos vierailustasi sivuillemme!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s ylläpitäjät"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Kiitos sivuillamme viettämästäsi ajasta."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Kirjaudu uudelleen sisään"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Salasanan nollaus onnistui"
+
+#: 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 ""
+"Uusi salasanasi on lähetetty antamaasi sähköpostiosoitteeseen.\n"
+"Se saapuu tuota pikaa."
+
+#: 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 "Salasanan muuttaminen"
+
+#: 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 ""
+"Syötä vanha salasanasi varmistukseksi, ja syötä sitten uusi salasanasi\n"
+"kaksi kertaa, jotta se tulee varmasti oikein."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Vanha salasana:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Uusi salasana:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Varmista uusi salasana:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Vaihda salasana"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Salasanan muuttaminen onnistui"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Salasanasi on muutettu."
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "domain-nimi"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "näyttönimi"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "sivusto"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "sivustot"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Esimerkki: '/tietoja/yhteystiedot/'. Varmista, että sekä alussa että lopussa "
+"on kauttaviiva."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "otsikko"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "sisältö"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "salli kommentit"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "mallipohjan nimi"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr "Esimerkiksi: 'flatpages/yhteydenotto.html'. Jos tämä jätetään tyhjäksi, käytetään oletuspohjaa 'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "vaaditaan rekisteröityminen"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Jos tämä kohta on valittu, vain sisäänkirjautuneet käyttäjät näkevät sivun."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "tekstisivu"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "tekstisivut"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "ohjaa osoitteesta"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Tässä on käytettävä absoluuttista polkua ilman verkkotunnusta. Esimerkki: "
+"'\\\n"
+"events/search/'"
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "ohjaa osoitteeseen"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Tässä on käytettävä joko absoluuttista polkua (kuten yllä) tai täydellistä "
+"'http://'-alkuista URL-osoitetta."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "edelleenohjaus"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "edelleenohjaukset"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "kohteen tunniste"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "otsikko"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "kommentti"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "1. pisteytys"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "2. pisteytys"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "3. pisteytys"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "4. pisteytys"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "5. pisteytys"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "6. pisteytys"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "7. pisteytys"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "8. pisteytys"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "on sallittu pisteytys"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "lähetyshetki"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "on julkinen"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "on poistettu"
+
+#: 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 ""
+"Rastita jos kommentti on asiaankuulumaton. Kommentin tilalla näytetään\n"
+"viesti \"Tämä kommentti on poistettu\"."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "kommentit"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Kommentoitu kohde"
+
+#: 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 ""
+" Kirjoittanut %(user)s, pvm %(date)s\\n\n"
+" \\n\n"
+" %(comment)s\\n\n"
+" \\n\n"
+" http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "henkilön nimi"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "IP-osoite"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "ylläpidon hyväksymä"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "vapaa kommentti"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "vapaat kommentit"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "pisteet"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "pisteytyspäivä"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "karma-pisteytys"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "karma-pisteytykset"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d pistettä käyttäjältä %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+" %(user)s on merkinnyt tämän kommentin:\\n\n"
+" \\n\n"
+" %(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "merkintäpäivä"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "käyttäjän merkki"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "käyttäjien merkit"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Käyttäjän %r merkki"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "poistamispäivä"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "valvojan poisto"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "valvojien poistot"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Valvojan %r poisto"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Anonyymit käyttäjät eivät voi äänestää"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Kommentin tunniste on virheellinen"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Itseään ei voi äänestää"
+
+#: contrib/comments/views/comments.py:27
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Tämä pisteytys on annettava, koska olet syöttänyt ainakin yhden muunkin pisteytyksen."
+
+#: 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] ""
+msgstr[1] ""
+
+# Mitä "sketchy user" tarkoittaa?
+#: contrib/comments/views/comments.py:116
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Tämä on \"sketchy\"-käyttäjän kirjoittama kommentti:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Vain POST-kutsut sallittu"
+
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Yksi tai useampi vaadittu kenttä on jäänyt täyttämättä"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Kommenttilomaketta on käpälöity (turvallisuusrike)"
+
+#: 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 "Kommenttilomakkeen 'target'-parametri ei kelpaa -- kohteen ID oli virheellinen"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Kommenttilomake ei pyytänyt esikatselua tai lähettämistä"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Unohditko salasanasi?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Pisteytykset"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Vaaditaan"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Vapaavalintainen"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Lähetä valokuva"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Kommentti:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Esikatsele kommenttia"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Nimesi:"
+
+#: contrib/sessions/models.py:51
+msgid "session key"
+msgstr "istunnon avain"
+
+#: contrib/sessions/models.py:52
+msgid "session data"
+msgstr "istunnon tiedot"
+
+#: contrib/sessions/models.py:53
+msgid "expire date"
+msgstr "vanhenee"
+
+#: contrib/sessions/models.py:57
+msgid "session"
+msgstr "istunto"
+
+#: contrib/sessions/models.py:58
+msgid "sessions"
+msgstr "istunnot"
+
+#: contrib/contenttypes/models.py:20
+msgid "python model class name"
+msgstr "mallin python-luokan nimi"
+
+#: contrib/contenttypes/models.py:23
+msgid "content type"
+msgstr "sisältötyyppi"
+
+#: contrib/contenttypes/models.py:24
+msgid "content types"
+msgstr "sisältötyypit"
+
+#: 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] "Varmista, että tekstin pituus on vähemmän kuin %s merkki."
+msgstr[1] "Varmista, että teksti pituus on vähemmän kuin %s merkkiä."
+
+#: forms/__init__.py:386
+msgid "Line breaks are not allowed here."
+msgstr "Rivinvaihtoja ei voi käyttää."
+
+#: 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 "Valinta ei kelpaa; '%(data)s' ei löydy vaihtoehtojen %(choices)s joukosta."
+
+#: forms/__init__.py:663
+msgid "The submitted file is empty."
+msgstr "Lähetetty tiedosto on tyhjä."
+
+#: forms/__init__.py:719
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Syötä kokonaisluku väliltä -32768 ja 32767."
+
+#: forms/__init__.py:729
+msgid "Enter a positive number."
+msgstr "Syötä positiivinen kokonaisluku."
+
+#: forms/__init__.py:739
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Syötä kokonaisluku väliltä 0 ja 32767."
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "maanantai"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "tiistai"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "keskiviikko"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "torstai"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "perjantai"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "lauantai"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "sunnuntai"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "tammikuu"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "helmikuu"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "maaliskuu"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "huhtikuu"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "toukokuu"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "kesäkuu"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "heinäkuu"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "elokuu"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "syyskuu"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "lokakuu"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "marraskuu"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "joulukuu"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "tam"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "hel"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "maa"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "huh"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "tou"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "kes"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "hei"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "elo"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "syy"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "lok"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "mar"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "jou"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "tammi"
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "helmi"
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "elo"
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "syys"
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "loka"
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "marras"
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "joulu"
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/translation/trans_real.py:362
+msgid "DATE_FORMAT"
+msgstr "j.n.Y"
+
+#: utils/translation/trans_real.py:363
+msgid "DATETIME_FORMAT"
+msgstr "j.n.Y G:i"
+
+#: utils/translation/trans_real.py:364
+msgid "TIME_FORMAT"
+msgstr "G:i"
+
+#: utils/translation/trans_real.py:380
+msgid "YEAR_MONTH_FORMAT"
+msgstr "N j, Y"
+
+#: utils/translation/trans_real.py:381
+#, fuzzy
+msgid "MONTH_DAY_FORMAT"
+msgstr "N j, Y"
+
+#: template/defaultfilters.py:401
+msgid "yes,no,maybe"
+msgstr "kyllä,ei,ehkä"
diff --git a/django/conf/locale/fi/LC_MESSAGES/djangojs.mo b/django/conf/locale/fi/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000000..34b397e4ba
--- /dev/null
+++ b/django/conf/locale/fi/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/fi/LC_MESSAGES/djangojs.po b/django/conf/locale/fi/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000000..35aa82e893
--- /dev/null
+++ b/django/conf/locale/fi/LC_MESSAGES/djangojs.po
@@ -0,0 +1,110 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2006-08-05 15:27+0300\n"
+"Last-Translator: Antti Kaihola <akaihola@ambitone.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Mahdolliset %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Valitse kaikki"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Lisää uusi"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Poista"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Valitut %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Valitse vasemmalta ja napsauta "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Tyhjennä kaikki"
+
+#: 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 ""
+"Tammikuu Helmikuu Maaliskuu Huhtikuu Toukokuu Kesäkuu Heinäkuu Elokuu "
+"Syyskuu Lokakuu Marraskuu Joulukuu"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Sunnuntai Maanantai Tiistai Keskiviikko Torstai Perjantai Lauantai"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "S M T K T P L"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Nyt"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Kello"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Valitse kellonaika"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "24"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "06"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "12"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Peruuta"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Tänään"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Kalenteri"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Eilen"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Huomenna"
diff --git a/django/conf/locale/no/LC_MESSAGES/django.mo b/django/conf/locale/no/LC_MESSAGES/django.mo
index 4f55637235..ee2152b5e1 100644
--- a/django/conf/locale/no/LC_MESSAGES/django.mo
+++ b/django/conf/locale/no/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/no/LC_MESSAGES/django.po b/django/conf/locale/no/LC_MESSAGES/django.po
index 9b3099046d..427879a8f3 100644
--- a/django/conf/locale/no/LC_MESSAGES/django.po
+++ b/django/conf/locale/no/LC_MESSAGES/django.po
@@ -264,7 +264,7 @@ msgstr "Bare POST er tillatt"
#: contrib/comments/views/comments.py:193
#: contrib/comments/views/comments.py:284
msgid "One or more of the required fields wasn't submitted"
-msgstr "En eller flere av feltene som er krevd ble ikke sendt."
+msgstr "En eller flere av feltene som er påkrevd ble ikke sendt."
#: contrib/comments/views/comments.py:197
#: contrib/comments/views/comments.py:286
@@ -371,35 +371,32 @@ msgid "All"
msgstr "Alle"
#: contrib/admin/filterspecs.py:109
-#, fuzzy
msgid "Any date"
-msgstr "Alle datoer"
+msgstr "NÃ¥r som helst"
#: contrib/admin/filterspecs.py:110
-#, fuzzy
msgid "Today"
-msgstr "Mondag"
+msgstr "I dag"
#: contrib/admin/filterspecs.py:113
msgid "Past 7 days"
-msgstr ""
+msgstr "Siste 7 dager"
#: contrib/admin/filterspecs.py:115
msgid "This month"
-msgstr ""
+msgstr "Denne måneden"
#: contrib/admin/filterspecs.py:117
msgid "This year"
-msgstr ""
+msgstr "I år"
#: contrib/admin/filterspecs.py:143
msgid "Yes"
-msgstr ""
+msgstr "Ja"
#: contrib/admin/filterspecs.py:143
-#, fuzzy
msgid "No"
-msgstr "Nov."
+msgstr "Nei"
#: contrib/admin/filterspecs.py:150
msgid "Unknown"
@@ -443,11 +440,13 @@ msgid ""
"Please enter a correct username and password. Note that both fields are case-"
"sensitive."
msgstr ""
+"Vær snill å angi korrekt brukernavn og passord. La merke til at små og "
+"store bokstaver er betraktet ulik."
#: contrib/admin/views/decorators.py:23
#: contrib/admin/templates/admin/login.html:25
msgid "Log in"
-msgstr "Log inn"
+msgstr "Logg inn"
#: contrib/admin/views/decorators.py:61
msgid ""
@@ -473,12 +472,11 @@ msgstr "Brukernavnet kan ikke inneholde '@'"
#: contrib/admin/views/decorators.py:84
#, python-format
msgid "Your e-mail address is not your username. Try '%s' instead."
-msgstr "Epost adressen din er ikke brukernavnet ditt, prøv '%s' i stede."
+msgstr "E-post adressen din er ikke brukernavnet ditt, prøv '%s' i stede."
#: contrib/admin/views/main.py:226
-#, fuzzy
msgid "Site administration"
-msgstr "Django administrasjon"
+msgstr "Nettsted administrasjon"
#: contrib/admin/views/main.py:260
#, python-format
@@ -502,7 +500,7 @@ msgstr "Ny %s"
#: contrib/admin/views/main.py:336
#, python-format
msgid "Added %s."
-msgstr "La til %s"
+msgstr "Lagt til %s"
#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
#: contrib/admin/views/main.py:340
@@ -559,7 +557,7 @@ msgid "Are you sure?"
msgstr "Er du sikker?"
#: contrib/admin/views/main.py:533
-#, fuzzy, python-format
+#, python-format
msgid "Change history: %s"
msgstr "Endre historien: %s"
@@ -580,7 +578,6 @@ msgid "Integer"
msgstr "Heltall"
#: contrib/admin/views/doc.py:278
-#, fuzzy
msgid "Boolean (Either True or False)"
msgstr "Boolean (Enten \"True\" eller \"False\")"
@@ -603,7 +600,7 @@ msgstr "Dato/tid"
#: contrib/admin/views/doc.py:283
msgid "E-mail address"
-msgstr "Epost adresse"
+msgstr "E-post adresse"
#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
msgid "File path"
@@ -614,13 +611,12 @@ msgid "Decimal number"
msgstr "Desimal tall"
#: contrib/admin/views/doc.py:291
-#, fuzzy
msgid "Boolean (Either True, False or None)"
msgstr "Boolean (enten \"True\", \"False\" eller \"None\")"
#: contrib/admin/views/doc.py:292
msgid "Relation to parent model"
-msgstr ""
+msgstr "Relasjon til forelder modell"
#: contrib/admin/views/doc.py:293
msgid "Phone number"
@@ -636,7 +632,7 @@ msgstr "Tid"
#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
msgid "URL"
-msgstr "Internettadresse"
+msgstr "URL"
#: contrib/admin/views/doc.py:301
msgid "U.S. state (two uppercase letters)"
@@ -756,12 +752,12 @@ msgstr "Fant ikke siden"
#: contrib/admin/templates/admin/404.html:10
msgid "We're sorry, but the requested page could not be found."
-msgstr "Beklager, men siden du spør etter finnest ikke."
+msgstr "Beklager, men siden du spør etter finnes ikke."
#: contrib/admin/templates/admin/index.html:17
#, python-format
msgid "Models available in the %(name)s application."
-msgstr ""
+msgstr "Modeller fra applikasjonen %(name)s."
#: contrib/admin/templates/admin/index.html:28
#: contrib/admin/templates/admin/change_form.html:15
@@ -813,7 +809,7 @@ msgid ""
"objects, but your account doesn't have permission to delete the following "
"types of objects:"
msgstr ""
-"Vist du sletter %(object_name)s '%(object)s' vill du også slette relaterte "
+"Hivs du sletter %(object_name)s '%(object)s' vil du også slette relaterte "
"objekter, men du har ikke tillatelse til å slette de følgende objektene:"
#: contrib/admin/templates/admin/delete_confirmation.html:21
@@ -836,11 +832,11 @@ msgstr "Av %(title)s "
#: contrib/admin/templates/admin/search_form.html:8
msgid "Go"
-msgstr ""
+msgstr "GÃ¥"
#: contrib/admin/templates/admin/change_form.html:21
msgid "View on site"
-msgstr "Vis på siden"
+msgstr "Vis på nettsted"
#: contrib/admin/templates/admin/change_form.html:30
msgid "Please correct the error below."
@@ -900,12 +896,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 ""
-"Har du glemt passordet ditt? Skriv inn epost adressen din under, så sender "
-"vi deg et nytt passord via epost."
+"Har du glemt passordet ditt? Skriv inn e-post adressen din under, så sender "
+"vi deg et nytt passord via e-post."
#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "E-mail address:"
-msgstr "Epost adresse:"
+msgstr "E-post adresse:"
#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "Reset my password"
@@ -917,7 +913,7 @@ msgstr "Takk for å bruke tid på internett siden i dag."
#: contrib/admin/templates/registration/logged_out.html:10
msgid "Log in again"
-msgstr "Log inn igjen"
+msgstr "Logg inn igjen"
#: contrib/admin/templates/registration/password_reset_done.html:6
#: contrib/admin/templates/registration/password_reset_done.html:10
@@ -929,7 +925,7 @@ msgid ""
"We've e-mailed a new password to the e-mail address you submitted. You "
"should be receiving it shortly."
msgstr ""
-"Vi sender deg et nytt passord til epost adressen du oppgav. Du villmotta det "
+"Vi sender deg et nytt passord til e-post adressen du oppgav. Du villmotta det "
"snart."
#: contrib/admin/templates/registration/password_change_form.html:12
@@ -959,7 +955,7 @@ msgstr "Endre passord"
#: contrib/admin/templates/registration/password_reset_email.html:2
msgid "You're receiving this e-mail because you requested a password reset"
msgstr ""
-"Du har mottatt denne epost-en fordi du ba om å tilbakestille passordet ditt"
+"Du har mottatt denne e-posten fordi du ba om å tilbakestille passordet ditt"
#: contrib/admin/templates/registration/password_reset_email.html:3
#, python-format
@@ -1036,10 +1032,9 @@ msgid "Edit this object (current window)"
msgstr "Endre dette objektet (Ã¥pnes i dette vinduet)"
#: contrib/admin/templates/admin_doc/bookmarklets.html:26
-#, fuzzy
msgid "Jumps to the admin page for pages that represent a single object."
msgstr ""
-"Hopp til administrasjonsiden for siden som representerer et enkelt objekt."
+"Hopp til administrasjonsiden for sidene som representerer et enkelt objekt."
#: contrib/admin/templates/admin_doc/bookmarklets.html:28
msgid "Edit this object (new window)"
@@ -1051,21 +1046,19 @@ msgstr "Samme som over, men åpner administrasjonsiden i et nytt vindu."
#: contrib/admin/templates/widget/date_time.html:3
msgid "Date:"
-msgstr ""
+msgstr "Dato:"
#: contrib/admin/templates/widget/date_time.html:4
-#, fuzzy
msgid "Time:"
-msgstr "Tid"
+msgstr "Tid:"
#: contrib/admin/templates/widget/file.html:2
msgid "Currently:"
-msgstr ""
+msgstr "NÃ¥:"
#: contrib/admin/templates/widget/file.html:3
-#, fuzzy
msgid "Change:"
-msgstr "Endre"
+msgstr "Endre:"
#: contrib/redirects/models.py:7
msgid "redirect from"
@@ -1126,7 +1119,7 @@ msgid ""
"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
"use 'flatpages/default'."
msgstr ""
-"Eksempel: 'flatfiler/kontakt_side'. Vist denne ikke denne er gitt, vill "
+"Eksempel: 'flatfiler/kontakt_side'. Hvis denne ikke denne er gitt, vill "
"'flatfiles/default' bli brukt."
#: contrib/flatpages/models.py:14
@@ -1136,7 +1129,7 @@ msgstr "registrering kreves"
#: contrib/flatpages/models.py:14
msgid "If this is checked, only logged-in users will be able to view the page."
msgstr ""
-"Vist denne er krysset av er det bare brukere som er logget inn som kan se "
+"Hvis denne er krysset av er det bare brukere som er logget inn som kan se "
"siden."
#: contrib/flatpages/models.py:18
@@ -1156,24 +1149,20 @@ msgid "codename"
msgstr "kodenavn"
#: contrib/auth/models.py:17
-#, fuzzy
msgid "permission"
-msgstr "Rettighet"
+msgstr "rettighet"
#: contrib/auth/models.py:18 contrib/auth/models.py:27
-#, fuzzy
msgid "permissions"
-msgstr "Rettigheter"
+msgstr "rettigheter"
#: contrib/auth/models.py:29
-#, fuzzy
msgid "group"
-msgstr "Gruppe"
+msgstr "gruppe"
#: contrib/auth/models.py:30 contrib/auth/models.py:65
-#, fuzzy
msgid "groups"
-msgstr "Grupper"
+msgstr "grupper"
#: contrib/auth/models.py:55
msgid "username"
@@ -1205,7 +1194,7 @@ msgstr "administrasjons status"
#: contrib/auth/models.py:60
msgid "Designates whether the user can log into this admin site."
-msgstr "Bestemmer om brukeren kan logge inn på denne administrasjons siden."
+msgstr "Bestemmer om brukeren kan logge inn på dette administrasjons sted."
#: contrib/auth/models.py:61
msgid "active"
@@ -1217,7 +1206,7 @@ msgstr "super bruker"
#: contrib/auth/models.py:63
msgid "last login"
-msgstr "liste logg inn"
+msgstr "siste logg inn"
#: contrib/auth/models.py:64
msgid "date joined"
@@ -1232,19 +1221,16 @@ msgstr ""
"tilgang til gruppene han/hun er i."
#: contrib/auth/models.py:67
-#, fuzzy
msgid "user permissions"
msgstr "Rettigheter"
#: contrib/auth/models.py:70
-#, fuzzy
msgid "user"
-msgstr "Bruker"
+msgstr "bruker"
#: contrib/auth/models.py:71
-#, fuzzy
msgid "users"
-msgstr "Brukere"
+msgstr "brukere"
#: contrib/auth/models.py:76
msgid "Personal info"
@@ -1263,9 +1249,8 @@ msgid "Groups"
msgstr "Grupper"
#: contrib/auth/models.py:219
-#, fuzzy
msgid "message"
-msgstr "Meldinger"
+msgstr "Melding"
#: contrib/auth/forms.py:30
msgid ""
@@ -1274,9 +1259,8 @@ msgid ""
msgstr ""
#: contrib/contenttypes/models.py:25
-#, fuzzy
msgid "python model class name"
-msgstr "python modul navn"
+msgstr "python modell klasse navn"
#: contrib/contenttypes/models.py:28
msgid "content type"
@@ -1312,23 +1296,23 @@ msgstr "domene navn"
#: contrib/sites/models.py:11
msgid "display name"
-msgstr "vist navn"
+msgstr "vise navn"
#: contrib/sites/models.py:15
msgid "site"
-msgstr "side"
+msgstr "nettsted"
#: contrib/sites/models.py:16
msgid "sites"
-msgstr "sider"
+msgstr "nettsteder"
#: utils/translation.py:360
msgid "DATE_FORMAT"
-msgstr "j. M U"
+msgstr "j. M Y"
#: utils/translation.py:361
msgid "DATETIME_FORMAT"
-msgstr "j. M U - h:i"
+msgstr "j. M Y - h:i"
#: utils/translation.py:362
msgid "TIME_FORMAT"
@@ -1336,7 +1320,7 @@ msgstr "h:i"
#: utils/dates.py:6
msgid "Monday"
-msgstr "Mondag"
+msgstr "Mandag"
#: utils/dates.py:6
msgid "Tuesday"
@@ -1411,54 +1395,52 @@ msgid "December"
msgstr "Desember"
#: utils/dates.py:19
-#, fuzzy
msgid "jan"
-msgstr "og"
+msgstr "jan"
#: utils/dates.py:19
msgid "feb"
-msgstr ""
+msgstr "feb"
#: utils/dates.py:19
msgid "mar"
-msgstr ""
+msgstr "mar"
#: utils/dates.py:19
msgid "apr"
-msgstr ""
+msgstr "apr"
#: utils/dates.py:19
-#, fuzzy
msgid "may"
-msgstr "Mai"
+msgstr "mai"
#: utils/dates.py:19
msgid "jun"
-msgstr ""
+msgstr "jun"
#: utils/dates.py:20
msgid "jul"
-msgstr ""
+msgstr "jul"
#: utils/dates.py:20
msgid "aug"
-msgstr ""
+msgstr "aug"
#: utils/dates.py:20
msgid "sep"
-msgstr ""
+msgstr "sep"
#: utils/dates.py:20
msgid "oct"
-msgstr ""
+msgstr "okt"
#: utils/dates.py:20
msgid "nov"
-msgstr ""
+msgstr "nov"
#: utils/dates.py:20
msgid "dec"
-msgstr ""
+msgstr "des"
#: utils/dates.py:27
msgid "Jan."
@@ -1466,7 +1448,7 @@ msgstr "Jan."
#: utils/dates.py:27
msgid "Feb."
-msgstr "Fef."
+msgstr "Feb."
#: utils/dates.py:28
msgid "Aug."
@@ -1491,40 +1473,38 @@ msgstr "Des."
#: utils/timesince.py:12
msgid "year"
msgid_plural "years"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Ã¥r"
+msgstr[1] "Ã¥r"
#: utils/timesince.py:13
msgid "month"
msgid_plural "months"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "måned"
+msgstr[1] "måndeder"
#: utils/timesince.py:14
msgid "week"
msgid_plural "weeks"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "uke"
+msgstr[1] "uker"
#: utils/timesince.py:15
-#, fuzzy
msgid "day"
msgid_plural "days"
-msgstr[0] "Mai"
-msgstr[1] "Mai"
+msgstr[0] "dag"
+msgstr[1] "dager"
#: utils/timesince.py:16
msgid "hour"
msgid_plural "hours"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "time"
+msgstr[1] "timer"
#: utils/timesince.py:17
-#, fuzzy
msgid "minute"
msgid_plural "minutes"
-msgstr[0] "side"
-msgstr[1] "side"
+msgstr[0] "minutt"
+msgstr[1] "minutter"
#: conf/global_settings.py:37
msgid "Bengali"
@@ -1548,7 +1528,7 @@ msgstr "Tysk"
#: conf/global_settings.py:42
msgid "Greek"
-msgstr ""
+msgstr "Gresk"
#: conf/global_settings.py:43
msgid "English"
@@ -1568,11 +1548,11 @@ msgstr "Galisisk"
#: conf/global_settings.py:47
msgid "Hungarian"
-msgstr ""
+msgstr "Ungarsk"
#: conf/global_settings.py:48
msgid "Hebrew"
-msgstr ""
+msgstr "Hebraiske"
#: conf/global_settings.py:49
msgid "Icelandic"
@@ -1584,11 +1564,11 @@ msgstr "Italiensk"
#: conf/global_settings.py:51
msgid "Japanese"
-msgstr ""
+msgstr "Japansk"
#: conf/global_settings.py:52
msgid "Dutch"
-msgstr ""
+msgstr "Nederlandsk"
#: conf/global_settings.py:53
msgid "Norwegian"
@@ -1600,7 +1580,7 @@ msgstr "Brasiliansk"
#: conf/global_settings.py:55
msgid "Romanian"
-msgstr "Romansk"
+msgstr "Rumensk"
#: conf/global_settings.py:56
msgid "Russian"
@@ -1611,9 +1591,8 @@ msgid "Slovak"
msgstr "Slovakisk"
#: conf/global_settings.py:58
-#, fuzzy
msgid "Slovenian"
-msgstr "Slovakisk"
+msgstr "Slovensk"
#: conf/global_settings.py:59
msgid "Serbian"
@@ -1624,9 +1603,8 @@ msgid "Swedish"
msgstr "Svensk"
#: conf/global_settings.py:61
-#, fuzzy
msgid "Ukrainian"
-msgstr "Brasiliansk"
+msgstr "Ukrainsk"
#: conf/global_settings.py:62
msgid "Simplified Chinese"
@@ -1634,14 +1612,13 @@ msgstr "Simplifisert Kinesisk"
#: conf/global_settings.py:63
msgid "Traditional Chinese"
-msgstr ""
+msgstr "Tradisjonell Kinesisk"
#: core/validators.py:60
msgid "This value must contain only letters, numbers and underscores."
msgstr "Dette feltet må bare inneholde bokstaver, nummer og understreker."
#: core/validators.py:64
-#, fuzzy
msgid ""
"This value must contain only letters, numbers, underscores, dashes or "
"slashes."
@@ -1651,7 +1628,7 @@ msgstr ""
#: core/validators.py:72
msgid "Uppercase letters are not allowed here."
-msgstr "Tor skrift er ikke tillatt her."
+msgstr "Stor bokstaver er ikke tillatt her."
#: core/validators.py:76
msgid "Lowercase letters are not allowed here."
@@ -1687,19 +1664,19 @@ msgstr "Skriv inn et helt nummer."
#: core/validators.py:120
msgid "Only alphabetical characters are allowed here."
-msgstr "Bare alfabetiske bokstaber er tillatt her."
+msgstr "Bare alfabetiske bokstaver er tillatt her."
#: core/validators.py:124
msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr "Skriv inn en dato i Ã…Ã…Ã…Ã…-MM-DD formatet."
+msgstr "Skriv inn en dato i Ã…Ã…Ã…Ã…-MM-DD format."
#: core/validators.py:128
msgid "Enter a valid time in HH:MM format."
-msgstr "Skriv inn tiden i TT:MM formatet."
+msgstr "Skriv inn tiden i TT:MM format."
#: core/validators.py:132 db/models/fields/__init__.py:468
msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
-msgstr "Skriv inn dato og tid i Ã…Ã…Ã…Ã…-MM-DD TT:MM formatet."
+msgstr "Skriv inn dato og tid i Ã…Ã…Ã…Ã…-MM-DD TT:MM format."
#: core/validators.py:136
msgid "Enter a valid e-mail address."
@@ -1722,7 +1699,7 @@ msgstr "Internettadressen %s peker ikke til et godkjent bilde."
#, python-format
msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
msgstr ""
-"Telefon nummeret må være i XXX-XXX-XXXX formatet. \"%s\" er ikke godkjent."
+"Telefon nummeret må være i XXX-XXX-XXXX format. \"%s\" er ikke godkjent."
#: core/validators.py:167
#, python-format
@@ -1731,7 +1708,7 @@ msgstr "Internettadressen %s peker ikke til en godkjent QuickTime film."
#: core/validators.py:171
msgid "A valid URL is required."
-msgstr "En godkjent internettadresse er påbudt."
+msgstr "En godkjent internettadresse er påkrevd."
#: core/validators.py:185
#, python-format
@@ -1739,7 +1716,7 @@ msgid ""
"Valid HTML is required. Specific errors are:\n"
"%s"
msgstr ""
-"Godkjent HTML er påbudt. Feilene var:\n"
+"Godkjent HTML er påkrevd. Feilene var:\n"
"%s"
#: core/validators.py:192
@@ -1750,7 +1727,7 @@ msgstr "Ikke godkjent XML: %s"
#: core/validators.py:202
#, python-format
msgid "Invalid URL: %s"
-msgstr "Ikke godkjent internettadresse: %s"
+msgstr "Ikke godkjent URL: %s"
#: core/validators.py:206 core/validators.py:208
#, python-format
@@ -1759,7 +1736,7 @@ msgstr "Internettadresse fører til en side som ikke virker."
#: core/validators.py:214
msgid "Enter a valid U.S. state abbreviation."
-msgstr "Skriv inn en godkjent amerikansk stats forkortelse."
+msgstr "Skriv inn en godkjent amerikansk delstat forkortelse."
#: core/validators.py:229
#, python-format
@@ -1771,7 +1748,7 @@ msgstr[1] "Pass munnen din! Ordene %s er ikke tillatt her."
#: core/validators.py:236
#, python-format
msgid "This field must match the '%s' field."
-msgstr "Dette felte må være det samme som i '%s' feltet."
+msgstr "Dette feltet må være det samme som i '%s' feltet."
#: core/validators.py:255
msgid "Please enter something for at least one field."
@@ -1784,12 +1761,12 @@ msgstr "Vennligst skriv inn noe i begge felta, eller la dem stå blanke."
#: core/validators.py:282
#, python-format
msgid "This field must be given if %(field)s is %(value)s"
-msgstr "Dette feltet må bare brukes vist %(field)s er lik %(value)s"
+msgstr "Dette feltet må bare brukes hvis %(field)s er lik %(value)s"
#: core/validators.py:294
#, python-format
msgid "This field must be given if %(field)s is not %(value)s"
-msgstr "Dette feltet må bare brukes vist %(field)s ikke er lik %(value)s"
+msgstr "Dette feltet må bare brukes hvis %(field)s ikke er lik %(value)s"
#: core/validators.py:313
msgid "Duplicate values are not allowed."
@@ -1824,13 +1801,13 @@ msgstr[1] "Skriv inn et desimal tall med maksimum %s tall bak komma. "
#, python-format
msgid "Make sure your uploaded file is at least %s bytes big."
msgstr ""
-"Er du sikker på at fila du prøver å laste opp er minimum %s bytes stor?"
+"Vær sikker på at fila du prøver å laste opp er minimum %s bytes stor."
#: core/validators.py:363
#, python-format
msgid "Make sure your uploaded file is at most %s bytes big."
msgstr ""
-"Er du sikker på at fila du prøver å laste opp er maksimum %s bytes stor?"
+"Vær sikker på at fila du prøver å laste opp er maksimum %s bytes stor."
#: core/validators.py:376
msgid "The format for this field is wrong."
@@ -1850,7 +1827,7 @@ msgstr "Klarte ikke å motta noe fra %s."
msgid ""
"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
msgstr ""
-"Tnternettadressen %(url)s returnerte en ikke godkjent Content-Type '%"
+"Internettadressen %(url)s returnerte en ikke godkjent Content-Type '%"
"(contenttype)s'."
#: core/validators.py:462
@@ -1859,7 +1836,7 @@ msgid ""
"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
"\"%(start)s\".)"
msgstr ""
-"Vennligst lukk taggen %(tag)s på linje %(line)s. (Linja starer med \"%(start)"
+"Vennligst lukk taggen %(tag)s på linje %(line)s. (Linjen starer med \"%(start)"
"s\".)"
#: core/validators.py:466
@@ -1868,7 +1845,7 @@ msgid ""
"Some text starting on line %(line)s is not allowed in that context. (Line "
"starts with \"%(start)s\".)"
msgstr ""
-"Noe av teksten som starter på linje %(line)s er ikke tillatt. (Linja starter "
+"Noe av teksten som starter på linje %(line)s er ikke tillatt. (Linjen starter "
"med \"%(start)s\".)"
#: core/validators.py:471
@@ -1877,7 +1854,7 @@ msgid ""
"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
"(start)s\".)"
msgstr ""
-"\"%(attr)s\" på linje %(line)s er ikke en godkjent tillegg. (Linja starter "
+"\"%(attr)s\" på linje %(line)s er ikke en godkjent tillegg. (Linjen starter "
"med \"%(start)s\".)"
#: core/validators.py:476
@@ -1886,7 +1863,7 @@ msgid ""
"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
"(start)s\".)"
msgstr ""
-"\"<%(tag)s>\" på linje %(line)s er ikke en godkjent tag. (linja starter med "
+"\"<%(tag)s>\" på linje %(line)s er ikke en godkjent tag. (linjen starter med "
"\"%(start)s\".)"
#: core/validators.py:480
@@ -1895,7 +1872,7 @@ msgid ""
"A tag on line %(line)s is missing one or more required attributes. (Line "
"starts with \"%(start)s\".)"
msgstr ""
-"En tag på linje %(line)s mangler en av de påbydte tillegga. (linja starter "
+"En tag på linje %(line)s mangler en av de påkrevde attributtene. (linjen starter "
"med \"%(start)s\".)"
#: core/validators.py:485
@@ -1904,13 +1881,13 @@ msgid ""
"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
"starts with \"%(start)s\".)"
msgstr ""
-"\"%(attr)s\" tillegg på linje $(line)s har en ikke godkjent verdi. (Linja "
+"\"%(attr)s\" tillegg på linje $(line)s har en ikke godkjent verdi. (Linjen "
"starter med \"%(start)s\".)"
#: db/models/manipulators.py:302
-#, fuzzy, python-format
+#, python-format
msgid "%(object)s with this %(type)s already exists for the given %(field)s."
-msgstr "$(optname)s med %(fieldname)s finnes allerede."
+msgstr "%(object)s med %(type)s finnes allerede for angitt %(field)s."
#: db/models/fields/__init__.py:40
#, python-format
@@ -1924,37 +1901,31 @@ msgid "This field is required."
msgstr "Dette feltet er påkrevd."
#: db/models/fields/__init__.py:337
-#, fuzzy
msgid "This value must be an integer."
-msgstr "Denne verdien må være 'power' av %s."
+msgstr "Denne verdien må være et heltall."
#: db/models/fields/__init__.py:369
-#, fuzzy
msgid "This value must be either True or False."
-msgstr "Denne verdien må være 'power' av %s."
+msgstr "Denne verdien må være enten \"True\" eller \"False\"."
#: db/models/fields/__init__.py:385
-#, fuzzy
msgid "This field cannot be null."
-msgstr "Dette feltet er feil."
+msgstr "Dette feltet kan ikke være null/tom."
#: db/models/fields/__init__.py:562
-#, fuzzy
msgid "Enter a valid filename."
-msgstr "Skriv inn en godkjent e-post adresse."
+msgstr "Skriv inn et godkjent fil navn."
#: db/models/fields/related.py:43
-#, fuzzy, python-format
+#, python-format
msgid "Please enter a valid %s."
-msgstr "Vennligst skriv inn en godkjent IP adresse."
+msgstr "Vennligst skriv inn en/et gyldig %s."
#: db/models/fields/related.py:579
-#, fuzzy
msgid "Separate multiple IDs with commas."
msgstr "Separer Id-ene med kommaer."
#: db/models/fields/related.py:581
-#, fuzzy
msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr ""
@@ -1965,14 +1936,14 @@ msgstr ""
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
msgid_plural ""
"Please enter valid %(self)s IDs. The values %(value)r are invalid."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Skriv inn gyldige %(self)s ID-er. Verdien %(value)r er ikke gyldig."
+msgstr[1] "Skriv inn gyldige %(self)s ID-er. Verdiene %(value)r er ikke gyldige."
#: forms/__init__.py:380
-#, fuzzy, python-format
+#, python-format
msgid "Ensure your text is less than %s character."
msgid_plural "Ensure your text is less than %s characters."
-msgstr[0] "Sjekk at teksten er kortere enn %s bokstaver"
+msgstr[0] "Sjekk at teksten er kortere enn %s bokstav"
msgstr[1] "Sjekk at teksten er kortere enn %s bokstaver"
#: forms/__init__.py:385
@@ -1982,7 +1953,7 @@ msgstr "Det er ikke tillatt med flere linjer her."
#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
#, python-format
msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
-msgstr "Velg et av valga; '%(data)s' er ikke i %(choices)s."
+msgstr "Velg et gyldig valg; '%(data)s' er ikke i %(choices)s."
#: forms/__init__.py:645
msgid "The submitted file is empty."
@@ -2002,7 +1973,7 @@ msgstr "Skriv inn et heltall mellom 0 og 32767."
#: template/defaultfilters.py:379
msgid "yes,no,maybe"
-msgstr ""
+msgstr "ja,nei,kanskje"
#, fuzzy
#~ msgid "Comments"
diff --git a/django/conf/locale/no/LC_MESSAGES/djangojs.mo b/django/conf/locale/no/LC_MESSAGES/djangojs.mo
index acdc98a7ef..4b23aba4e0 100644
--- a/django/conf/locale/no/LC_MESSAGES/djangojs.mo
+++ b/django/conf/locale/no/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/no/LC_MESSAGES/djangojs.po b/django/conf/locale/no/LC_MESSAGES/djangojs.po
index befc101881..c6087646e0 100644
--- a/django/conf/locale/no/LC_MESSAGES/djangojs.po
+++ b/django/conf/locale/no/LC_MESSAGES/djangojs.po
@@ -61,6 +61,15 @@ msgstr "Søndag Mandag Tirsdag Onsdag Torsdag Fredag Lørdag"
msgid "S M T W T F S"
msgstr "S M T O T F L"
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Vis"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Skjul"
+
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
msgid "Now"
@@ -80,7 +89,7 @@ msgstr "24.00"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
msgid "6 a.m."
-msgstr "18.00"
+msgstr "06.00"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
msgid "Noon"
diff --git a/django/conf/locale/pl/LC_MESSAGES/django.mo b/django/conf/locale/pl/LC_MESSAGES/django.mo
index f7fad56339..d132fc114e 100644
--- a/django/conf/locale/pl/LC_MESSAGES/django.mo
+++ b/django/conf/locale/pl/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/pl/LC_MESSAGES/django.po b/django/conf/locale/pl/LC_MESSAGES/django.po
index b6449e22b0..61fc4d0a90 100644
--- a/django/conf/locale/pl/LC_MESSAGES/django.po
+++ b/django/conf/locale/pl/LC_MESSAGES/django.po
@@ -126,12 +126,10 @@ msgid "approved by staff"
msgstr "zaakceptowano"
#: contrib/comments/models.py:176
-#, fuzzy
msgid "free comment"
msgstr "wolny komentarz"
#: contrib/comments/models.py:177
-#, fuzzy
msgid "free comments"
msgstr "wolne komentarze"
@@ -144,7 +142,6 @@ msgid "score date"
msgstr "data przyznania punktów"
#: contrib/comments/models.py:237
-#, fuzzy
msgid "karma score"
msgstr "ilość punktów"
@@ -243,6 +240,9 @@ msgid ""
"\n"
"%(text)s"
msgstr ""
+"Ten komentarze został dodany przez użytkownika::\n"
+"\n"
+"%(text)s"
#: contrib/comments/views/comments.py:189
#: contrib/comments/views/comments.py:280
@@ -257,19 +257,20 @@ msgstr "Jedno lub więcej wymaganych pól nie zostało wypełnionych"
#: contrib/comments/views/comments.py:197
#: contrib/comments/views/comments.py:286
msgid "Somebody tampered with the comment form (security violation)"
-msgstr ""
+msgstr "Ktoś próbował obejść zabezpieczenia formularza komentarzy"
#: contrib/comments/views/comments.py:207
#: contrib/comments/views/comments.py:292
msgid ""
"The comment form had an invalid 'target' parameter -- the object ID was "
"invalid"
-msgstr ""
+msgstr "Formularz komentarza miał niepoprawny parametr 'target' -- ID obiektu było "
+"niepoprawne"
#: 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 "Formularz komentarza nie zapewnił obiektów 'preview' ani 'post'"
#: contrib/comments/templates/comments/form.html:6
#: contrib/comments/templates/comments/form.html:8
@@ -600,7 +601,7 @@ msgstr "Wartość logiczna (True, False, None - prawda, fałsz lub nic)"
#: contrib/admin/views/doc.py:292
msgid "Relation to parent model"
-msgstr ""
+msgstr "Relacja do modelu rodzica"
#: contrib/admin/views/doc.py:293
msgid "Phone number"
@@ -794,6 +795,9 @@ msgid ""
"objects, but your account doesn't have permission to delete the following "
"types of objects:"
msgstr ""
+"Skasowanie %(object_name)s '%(object)s' spowoduje kasację zależnych "
+"obiektów, lecz twoje uprawnienia nie pozwalają na usunięcie następujących "
+"typów obiektów:"
#: contrib/admin/templates/admin/delete_confirmation.html:21
#, python-format
@@ -801,6 +805,8 @@ msgid ""
"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
"the following related items will be deleted:"
msgstr ""
+"Czy chcesz skasować %(object_name)s \"%(object)s\"? Wszystkie "
+"zależne obiekty zostaną skasowane:"
#: contrib/admin/templates/admin/delete_confirmation.html:26
msgid "Yes, I'm sure"
@@ -820,11 +826,10 @@ msgid "View on site"
msgstr "Pokaż na stronie"
#: contrib/admin/templates/admin/change_form.html:30
-#, fuzzy
msgid "Please correct the error below."
msgid_plural "Please correct the errors below."
msgstr[0] "Proszę popraw poniższy błąd"
-msgstr[1] "Proszę popraw poniższy błąd"
+msgstr[1] "Proszę popraw poniższe błędy"
#: contrib/admin/templates/admin/change_form.html:48
msgid "Ordering"
@@ -965,11 +970,11 @@ msgstr "Zespół %(site_name)s"
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
msgid "Bookmarklets"
-msgstr ""
+msgstr "Zakładki"
#: contrib/admin/templates/admin_doc/bookmarklets.html:5
msgid "Documentation bookmarklets"
-msgstr ""
+msgstr "Zakładki Dokumentacji"
#: contrib/admin/templates/admin_doc/bookmarklets.html:9
msgid ""
@@ -1094,6 +1099,8 @@ msgid ""
"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
"use 'flatpages/default'."
msgstr ""
+"Przykład: 'flatpages/contact_page'. Jeżeli nie podane system użyje "
+"'flatpages/default'."
#: contrib/flatpages/models.py:14
msgid "registration required"
@@ -1105,11 +1112,11 @@ msgstr "Jeżeli zaznaczone - tylko zalogowani użytkownicy bÄ™dÄ… mogli zobaczyÄ
#: contrib/flatpages/models.py:18
msgid "flat page"
-msgstr ""
+msgstr "strona statyczna"
#: contrib/flatpages/models.py:19
msgid "flat pages"
-msgstr ""
+msgstr "strony statyczne"
#: contrib/auth/models.py:13 contrib/auth/models.py:26
msgid "name"
@@ -1117,7 +1124,7 @@ msgstr "nazwa"
#: contrib/auth/models.py:15
msgid "codename"
-msgstr ""
+msgstr "nazwa kodowa"
#: contrib/auth/models.py:17
msgid "permission"
@@ -1161,11 +1168,11 @@ msgstr "Użyj '[algo]$[salt]$[hexdigest]'"
#: contrib/auth/models.py:60
msgid "staff status"
-msgstr "stan w zespole"
+msgstr "w zespole"
#: contrib/auth/models.py:60
msgid "Designates whether the user can log into this admin site."
-msgstr "Oznaczy czy użytkownik może zalogować się do panelu admina."
+msgstr "Oznacza czy użytkownik może zalogować się do panelu admina."
#: contrib/auth/models.py:61
msgid "active"
@@ -1195,15 +1202,14 @@ msgstr ""
msgid "user permissions"
msgstr "uprawnienia użytkownika"
+#kurwa
#: contrib/auth/models.py:70
-#, fuzzy
msgid "user"
-msgstr "Użytkownik"
+msgstr "użytkownik"
#: contrib/auth/models.py:71
-#, fuzzy
msgid "users"
-msgstr "Uzytkownicy"
+msgstr "użytkownicy"
#: contrib/auth/models.py:76
msgid "Personal info"
@@ -1222,7 +1228,6 @@ msgid "Groups"
msgstr "Grupy"
#: contrib/auth/models.py:219
-#, fuzzy
msgid "message"
msgstr "wiadomość"
@@ -1371,7 +1376,6 @@ msgid "December"
msgstr "Grudzień"
#: utils/dates.py:19
-#, fuzzy
msgid "jan"
msgstr "sty"
@@ -1472,11 +1476,10 @@ msgstr[0] "dzień"
msgstr[1] "dni"
#: utils/timesince.py:16
-#, fuzzy
msgid "hour"
msgid_plural "hours"
msgstr[0] "godzina"
-msgstr[1] "godzina"
+msgstr[1] "godzin"
#: utils/timesince.py:17
msgid "minute"
@@ -1569,7 +1572,6 @@ msgid "Slovak"
msgstr "SÅ‚owacki"
#: conf/global_settings.py:58
-#, fuzzy
msgid "Slovenian"
msgstr "SÅ‚owacki"
@@ -1582,9 +1584,8 @@ msgid "Swedish"
msgstr "Szwedzki"
#: conf/global_settings.py:61
-#, fuzzy
msgid "Ukrainian"
-msgstr "Brazylijski"
+msgstr "Ukraiński"
#: conf/global_settings.py:62
msgid "Simplified Chinese"
@@ -1715,14 +1716,14 @@ msgstr "Odnośnik %s jest nieprawidłowy."
#: core/validators.py:214
msgid "Enter a valid U.S. state abbreviation."
-msgstr "Wpisz poprawny kod stanu U.S."
+msgstr "Wpisz poprawny kod stanu U.S.A."
#: core/validators.py:229
-#, fuzzy, python-format
+#, 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] "Nie wolno przeklinać! Słowo %s jest niedozwolone."
-msgstr[1] "Nie wolno przeklinać! Słowo %s jest niedozwolone."
+msgstr[1] "Nie wolno przeklinać! Słowa %s są niedozwolone."
#: core/validators.py:236
#, python-format
@@ -1745,11 +1746,11 @@ msgstr "To pole musi być uzupełnione jeśli %(field)s jest %(value)s"
#: core/validators.py:294
#, python-format
msgid "This field must be given if %(field)s is not %(value)s"
-msgstr ""
+msgstr "To pole musi być wypełnione jeżeli %(field)s nie jest %(value)s"
#: core/validators.py:313
msgid "Duplicate values are not allowed."
-msgstr ""
+msgstr "Duplikaty sÄ… niedozwolone."
#: core/validators.py:336
#, python-format
@@ -1761,20 +1762,20 @@ msgid "Please enter a valid decimal number."
msgstr "Proszę wpisać poprawną liczbę dziesiętną."
#: core/validators.py:349
-#, fuzzy, python-format
+#, 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] "Proszę wpisać poprawną liczbę dziesiętną."
-msgstr[1] "Proszę wpisać poprawną liczbę dziesiętną."
+msgstr[0] "Proszę wpisać poprawną liczbę dziesiętną zawierającą nie więcej niż %s cyfry."
+msgstr[1] "Proszę wpisać poprawną liczbę dziesiętną zawierającą nie więcej niż %s cyfr."
#: core/validators.py:352
-#, fuzzy, python-format
+#, 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] "Proszę wpisać poprawną liczbę dziesiętną."
-msgstr[1] "Proszę wpisać poprawną liczbę dziesiętną."
+msgstr[0] "Proszę wpisać poprawną liczbę dziesiętną z dokładnością do %s miejsca po przecinku."
+msgstr[1] "Proszę wpisać poprawną liczbę dziesiętną z dokładnością do %s miejsc po przecinku."
#: core/validators.py:362
#, python-format
@@ -1797,13 +1798,14 @@ msgstr "To pole jest nieprawidłowe."
#: core/validators.py:426
#, python-format
msgid "Could not retrieve anything from %s."
-msgstr "Nie można otrzymać nic z %s."
+msgstr "Nie można nic pobrać z %s."
#: core/validators.py:429
#, python-format
msgid ""
"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
msgstr ""
+"URL %(url)s zwrócił niepoprawny Content-Type header '%(contenttype)s'."
#: core/validators.py:462
@@ -1866,17 +1868,15 @@ msgstr "To pole jest wymagane"
#: db/models/fields/__init__.py:337
msgid "This value must be an integer."
-msgstr ""
+msgstr "Ta wartość musi być liczbą całkowitą"
#: db/models/fields/__init__.py:369
-#, fuzzy
msgid "This value must be either True or False."
-msgstr "Wartość logiczna (True, False - prawda lub fałsz)"
+msgstr "Ta wartość musi być logiczna (True, False - prawda lub fałsz)."
#: db/models/fields/__init__.py:385
-#, fuzzy
msgid "This field cannot be null."
-msgstr "To pole jest nieprawidłowe."
+msgstr "To pole nie może być puste."
#: db/models/fields/__init__.py:562
msgid "Enter a valid filename."
@@ -1888,12 +1888,10 @@ msgid "Please enter a valid %s."
msgstr "Proszę wpisać poprawne %s."
#: db/models/fields/related.py:579
-#, fuzzy
msgid "Separate multiple IDs with commas."
msgstr "Oddziel kilka pól ID przecinkami."
#: db/models/fields/related.py:581
-#, fuzzy
msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr ""
@@ -1909,11 +1907,11 @@ msgstr[0] ""
msgstr[1] ""
#: forms/__init__.py:380
-#, fuzzy, python-format
+#, python-format
msgid "Ensure your text is less than %s character."
msgid_plural "Ensure your text is less than %s characters."
-msgstr[0] "Upewnij się, że jest mniej niż %s znaków."
-msgstr[1] "Upewnij się, że jest mniej niż %s znaków."
+msgstr[0] "Upewnij się, że tekst ma mniej niż %s znak."
+msgstr[1] "Upewnij się, że tekst ma mniej niż %s znaków."
#: forms/__init__.py:385
msgid "Line breaks are not allowed here."
diff --git a/django/conf/locale/ru/LC_MESSAGES/django.mo b/django/conf/locale/ru/LC_MESSAGES/django.mo
index 467c8ddb62..12e240529f 100644
--- a/django/conf/locale/ru/LC_MESSAGES/django.mo
+++ b/django/conf/locale/ru/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/ru/LC_MESSAGES/django.po b/django/conf/locale/ru/LC_MESSAGES/django.po
index ca204d2ddf..f329efe24f 100644
--- a/django/conf/locale/ru/LC_MESSAGES/django.po
+++ b/django/conf/locale/ru/LC_MESSAGES/django.po
@@ -8,12 +8,13 @@ msgstr ""
"Project-Id-Version: django 0.95\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-05-16 10:11+0200\n"
-"PO-Revision-Date: 2006-08-14 18:08+0300\n"
-"Last-Translator: Grigory Fateyev <greg@dial.com.ru>\n"
+"PO-Revision-Date: 2006-09-07 15:28+0300\n"
+"Last-Translator: Alexander Yakovlev <AYakovlev@rambler.ru>\n"
"Language-Team: Dialcom Services <greg@dial.com.ru>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Poedit-Language: Russian\n"
"X-Poedit-Country: RUSSIAN FEDERATION\n"
"X-Poedit-SourceCharset: utf-8\n"
@@ -25,81 +26,81 @@ msgstr "ID объекта"
#: contrib/comments/models.py:68
msgid "headline"
-msgstr "заголовок"
+msgstr "Заголовок"
#: contrib/comments/models.py:69
#: contrib/comments/models.py:90
#: contrib/comments/models.py:167
msgid "comment"
-msgstr "комментарий"
+msgstr "Комментарий"
#: contrib/comments/models.py:70
msgid "rating #1"
-msgstr "рейтинг #1"
+msgstr "рейтинг №1"
#: contrib/comments/models.py:71
msgid "rating #2"
-msgstr "рейтинг #2"
+msgstr "рейтинг №2"
#: contrib/comments/models.py:72
msgid "rating #3"
-msgstr "рейтинг #3"
+msgstr "рейтинг №3"
#: contrib/comments/models.py:73
msgid "rating #4"
-msgstr "рейтинг #4"
+msgstr "рейтинг №4"
#: contrib/comments/models.py:74
msgid "rating #5"
-msgstr "рейтинг #5"
+msgstr "рейтинг №5"
#: contrib/comments/models.py:75
msgid "rating #6"
-msgstr "рейтинг #6"
+msgstr "рейтинг №6"
#: contrib/comments/models.py:76
msgid "rating #7"
-msgstr "рейтинг #7"
+msgstr "рейтинг №7"
#: contrib/comments/models.py:77
msgid "rating #8"
-msgstr "рейтинг #8"
+msgstr "рейтинг №8"
#: contrib/comments/models.py:82
msgid "is valid rating"
-msgstr "доÑтупный рейтинг"
+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 "публичный"
+msgstr "Публичный"
#: contrib/comments/models.py:85
#: contrib/admin/views/doc.py:289
msgid "IP address"
-msgstr "IP адреÑ"
+msgstr "IP-адреÑ"
#: contrib/comments/models.py:86
msgid "is removed"
-msgstr "удален"
+msgstr "Удален"
#: 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 "Отметте, еÑли комментарий нежелателен. Сообщение \"Этот комментарий был удалён\" будет показано взамен."
+msgstr "Отметьте, еÑли комментарий нежелателен. Сообщение \"Этот комментарий был удалён\" будет показано взамен."
#: contrib/comments/models.py:91
msgid "comments"
-msgstr "комментарии"
+msgstr "Комментарии"
#: contrib/comments/models.py:131
#: contrib/comments/models.py:207
msgid "Content object"
-msgstr "Объект наполнениÑ"
+msgstr "Объект Ñодержимого"
#: contrib/comments/models.py:159
#, python-format
@@ -110,7 +111,7 @@ msgid ""
"\n"
"http://%(domain)s%(url)s"
msgstr ""
-"Добавил %(user)s %(date)s\n"
+"Добавил %(user)s %(date)s\n"
"\n"
"%(comment)s\n"
"\n"
@@ -118,15 +119,15 @@ msgstr ""
#: contrib/comments/models.py:168
msgid "person's name"
-msgstr "Ð¸Ð¼Ñ Ñ‡ÐµÐ»Ð¾Ð²ÐµÐºÐ°"
+msgstr "Ð˜Ð¼Ñ Ñ‡ÐµÐ»Ð¾Ð²ÐµÐºÐ°"
#: contrib/comments/models.py:171
msgid "ip address"
-msgstr "ip адреÑ:"
+msgstr "IP-адреÑ:"
#: contrib/comments/models.py:173
msgid "approved by staff"
-msgstr "одобрено админиÑтрацией"
+msgstr "Одобрено админиÑтрацией"
#: contrib/comments/models.py:176
msgid "free comment"
@@ -138,24 +139,24 @@ 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"
-msgstr "Карма Ñчёт"
+msgstr "КармичеÑкий Ñчёт"
#: contrib/comments/models.py:238
msgid "karma scores"
-msgstr "Карма Ñчета"
+msgstr "КармичеÑкие Ñчета"
#: contrib/comments/models.py:242
#, python-format
msgid "%(score)d rating by %(user)s"
-msgstr "%(score)d рейтинг %(user)s"
+msgstr "%(score)d рейтинг Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %(user)s"
#: contrib/comments/models.py:258
#, python-format
@@ -164,21 +165,21 @@ msgid ""
"\n"
"%(text)s"
msgstr ""
-"Этот комментарий был отмечен %(user)s:\n"
+"Этот комментарий был отмечен пользователем %(user)s:\n"
"\n"
"%(text)s"
#: contrib/comments/models.py:265
msgid "flag date"
-msgstr "отметка даты"
+msgstr "Дата отметки"
#: contrib/comments/models.py:268
msgid "user flag"
-msgstr "Признак пользователÑ"
+msgstr "Отметка пользователÑ"
#: contrib/comments/models.py:269
msgid "user flags"
-msgstr "Признаки пользователÑ"
+msgstr "Отметки пользователÑ"
#: contrib/comments/models.py:273
#, python-format
@@ -187,11 +188,11 @@ msgstr "Отмечен %r"
#: contrib/comments/models.py:278
msgid "deletion date"
-msgstr "дата удалениÑ"
+msgstr "Дата удалениÑ"
#: contrib/comments/models.py:280
msgid "moderator deletion"
-msgstr "Удаленно модератором"
+msgstr "Удаление модератором"
#: contrib/comments/models.py:281
msgid "moderator deletions"
@@ -216,7 +217,7 @@ msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð³Ð¾Ð»Ð¾Ñовать за ÑебÑ"
#: contrib/comments/views/comments.py:28
msgid "This rating is required because you've entered at least one other rating."
-msgstr "Этот рейтинг необходим, так как вы входили хоть однажды в другие рейтинги."
+msgstr "Этот рейтинг обÑзателен, так как вы уже ввели как минимум еще один рейтинг."
#: contrib/comments/views/comments.py:112
#, python-format
@@ -229,7 +230,17 @@ msgid_plural ""
"\n"
"%(text)s"
msgstr[0] ""
+"Этот комментарий Ñделан пользователем, который отправил меньше %(count)s комментариÑ:\n"
+"\n"
+"%(text)s"
msgstr[1] ""
+"Этот комментарий Ñделан пользователем, который отправил меньше %(count)s комментариев:\n"
+"\n"
+"%(text)s"
+msgstr[2] ""
+"Этот комментарий Ñделан пользователем, который отправил меньше %(count)s комментариев:\n"
+"\n"
+"%(text)s"
#: contrib/comments/views/comments.py:117
#, python-format
@@ -238,14 +249,14 @@ msgid ""
"\n"
"%(text)s"
msgstr ""
-"Коментарий был добавлен ндоверенным пользователем:\n"
+"Коментарий был добавлен недоверенным пользователем:\n"
"\n"
"%(text)s"
#: contrib/comments/views/comments.py:189
#: contrib/comments/views/comments.py:280
msgid "Only POSTs are allowed"
-msgstr "Только POSTы разрешены"
+msgstr "Разрешены только POSTы"
#: contrib/comments/views/comments.py:193
#: contrib/comments/views/comments.py:284
@@ -255,17 +266,17 @@ msgstr "Одно или больше обÑзательных полей не б
#: contrib/comments/views/comments.py:197
#: 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:292
msgid "The comment form had an invalid 'target' parameter -- the object ID was invalid"
-msgstr "Форма ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸Ñ Ð¸Ð¼ÐµÐµÑ‚ неверный 'target' параметр -- ID объекта неверно"
+msgstr "Форма ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸Ñ Ð¸Ð¼ÐµÐ»Ð° неверный параметр 'target' -- 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 "Форма ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸Ñ Ð½Ðµ обеÑпечивает и 'preview' или 'post'"
+msgstr "Форма ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸Ñ Ð½Ðµ предоÑтавила ни 'предпроÑмотр', ни 'отправить'"
#: contrib/comments/templates/comments/form.html:6
#: contrib/comments/templates/comments/form.html:8
@@ -310,7 +321,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
@@ -329,11 +340,11 @@ msgstr "Комментарий:"
#: contrib/comments/templates/comments/form.html:32
#: contrib/comments/templates/comments/freeform.html:9
msgid "Preview comment"
-msgstr "ПроÑмотр комментариÑ"
+msgstr "ПредпроÑмотр комментариÑ"
#: contrib/comments/templates/comments/freeform.html:4
msgid "Your name:"
-msgstr "Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ:"
+msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ:"
#: contrib/admin/filterspecs.py:40
#, python-format
@@ -341,7 +352,7 @@ msgid ""
"<h3>By %s:</h3>\n"
"<ul>\n"
msgstr ""
-"<h3>К %s:</h3>\n"
+"<h3>По %s:</h3>\n"
"<ul>\n"
#: contrib/admin/filterspecs.py:70
@@ -384,7 +395,7 @@ msgstr "ÐеизвеÑтно"
#: contrib/admin/models.py:16
msgid "action time"
-msgstr "Ð²Ñ€ÐµÐ¼Ñ Ð´ÐµÐ¹ÑтвиÑ"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð´ÐµÐ¹ÑтвиÑ"
#: contrib/admin/models.py:19
msgid "object id"
@@ -392,23 +403,23 @@ msgstr "id обьекта"
#: contrib/admin/models.py:20
msgid "object repr"
-msgstr "предÑтавление обьекта"
+msgstr "ПредÑтавление обьекта"
#: contrib/admin/models.py:21
msgid "action flag"
-msgstr "отметка дейÑтвиÑ"
+msgstr "Отметка дейÑтвиÑ"
#: contrib/admin/models.py:22
msgid "change message"
-msgstr "изменить Ñообщение"
+msgstr "Изменить Ñообщение"
#: contrib/admin/models.py:25
msgid "log entry"
-msgstr "Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ"
+msgstr "Ð–ÑƒÑ€Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ"
#: contrib/admin/models.py:26
msgid "log entries"
-msgstr "журнальные запиÑи"
+msgstr "Журнальные запиÑи"
#: contrib/admin/templatetags/admin_list.py:228
msgid "All dates"
@@ -418,7 +429,7 @@ msgstr "Ð’Ñе даты"
#: contrib/auth/forms.py:36
#: contrib/auth/forms.py:41
msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
-msgstr "ПожалуйÑта, вводите верные данные Ð¸Ð¼ÐµÐ½Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль. Помните, оба Ð¿Ð¾Ð»Ñ Ñ‡ÑƒÐ²Ñтвительны к региÑтру."
+msgstr "ПожалуйÑта, введите верные Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль. Помните, оба Ð¿Ð¾Ð»Ñ Ñ‡ÑƒÐ²Ñтвительны к региÑтру."
#: contrib/admin/views/decorators.py:23
#: contrib/admin/templates/admin/login.html:25
@@ -427,11 +438,11 @@ msgstr "Вход"
#: contrib/admin/views/decorators.py:61
msgid "Please log in again, because your session has expired. Don't worry: Your submission has been saved."
-msgstr "ПожалуйÑта войдите Ñнова, поÑколькук ваша ÑеÑÑÐ¸Ñ ÑƒÑтарела. Ðе беÑпокойтеÑÑŒ:введенные вами данные Ñохранены."
+msgstr "ПожалуйÑта, войдите Ñнова, поÑкольку ваша ÑеÑÑÐ¸Ñ ÑƒÑтарела. Ðе беÑпокойтеÑÑŒ: введенные вами данные Ñохранены."
#: contrib/admin/views/decorators.py:68
msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again."
-msgstr "Похоже, что ваш броузер не наÑтроен на прием cookies. ПожалуйÑтва включите cookie, перезагрузите Ñтраницу и попытайтеÑÑŒ Ñнова. "
+msgstr "Похоже, ваш броузер не наÑтроен на прием cookies. ПожалуйÑтва, включите cookie, перезагрузите Ñтраницу и попытайтеÑÑŒ Ñнова."
#: contrib/admin/views/decorators.py:82
msgid "Usernames cannot contain the '@' character."
@@ -440,7 +451,7 @@ msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ может включать ÑимÐ
#: contrib/admin/views/decorators.py:84
#, python-format
msgid "Your e-mail address is not your username. Try '%s' instead."
-msgstr "Ваш e-mail Ð°Ð´Ñ€ÐµÑ Ð½Ðµ ваше имÑ. Попробуйте '%s' в замен."
+msgstr "Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты не ÑвлÑетÑÑ Ð²Ð°ÑˆÐ¸Ð¼ именем пользователÑ. Попробуйте '%s' взамен."
#: contrib/admin/views/main.py:226
msgid "Site administration"
@@ -449,12 +460,12 @@ msgstr "ÐдминиÑтрирование Ñайта"
#: contrib/admin/views/main.py:260
#, python-format
msgid "The %(name)s \"%(obj)s\" was added successfully."
-msgstr "%(name)s \"%(obj)s\" были уÑпешно добавлены."
+msgstr "%(name)s \"%(obj)s\" был уÑпешно добавлен."
#: contrib/admin/views/main.py:264
#: contrib/admin/views/main.py:348
msgid "You may edit it again below."
-msgstr "Ð’Ñ‹ Ñнова можете редактировать их внизу"
+msgstr "Ðиже можно Ñнова редактировать его"
#: contrib/admin/views/main.py:272
#: contrib/admin/views/main.py:357
@@ -470,7 +481,7 @@ msgstr "Добавить %s"
#: contrib/admin/views/main.py:336
#, python-format
msgid "Added %s."
-msgstr "Добавлено %s"
+msgstr "Добавлен %s."
#: contrib/admin/views/main.py:336
#: contrib/admin/views/main.py:338
@@ -481,12 +492,12 @@ msgstr "и"
#: contrib/admin/views/main.py:338
#, python-format
msgid "Changed %s."
-msgstr "Изменено %s."
+msgstr "Изменен %s."
#: contrib/admin/views/main.py:340
#, python-format
msgid "Deleted %s."
-msgstr "Удалено %s."
+msgstr "Удален %s."
#: contrib/admin/views/main.py:343
msgid "No fields changed."
@@ -495,12 +506,12 @@ msgstr "Ðи одно поле не изменено."
#: contrib/admin/views/main.py:346
#, python-format
msgid "The %(name)s \"%(obj)s\" was changed successfully."
-msgstr "%(name)s \"%(obj)s\" было уÑпешно изменено"
+msgstr "%(name)s \"%(obj)s\" был уÑпешно изменен."
#: contrib/admin/views/main.py:354
#, python-format
msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
-msgstr "%(name)s \"%(obj)s\" было уÑпешно изменено. Ð’Ñ‹ можете редактировать его Ñнова."
+msgstr "%(name)s \"%(obj)s\" был уÑпешно добавлен. Ðиже можно Ñнова редактировать его."
#: contrib/admin/views/main.py:392
#, python-format
@@ -510,17 +521,17 @@ msgstr "Изменить %s"
#: contrib/admin/views/main.py:470
#, python-format
msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
-msgstr "Одно или более %(fieldname)s в %(name)s: %(obj)s"
+msgstr "Один или более %(fieldname)s в %(name)s: %(obj)s"
#: contrib/admin/views/main.py:475
#, python-format
msgid "One or more %(fieldname)s in %(name)s:"
-msgstr "Одно или более %(fieldname)s в %(name)s:"
+msgstr "Один или более %(fieldname)s в %(name)s:"
#: contrib/admin/views/main.py:508
#, python-format
msgid "The %(name)s \"%(obj)s\" was deleted successfully."
-msgstr "%(name)s \"%(obj)s\" было уÑпешно удалено."
+msgstr "%(name)s \"%(obj)s\" был уÑпешно удален."
#: contrib/admin/views/main.py:511
msgid "Are you sure?"
@@ -529,7 +540,7 @@ msgstr "Вы уверены?"
#: contrib/admin/views/main.py:533
#, python-format
msgid "Change history: %s"
-msgstr "Измени иÑторию: %s"
+msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹: %s"
#: contrib/admin/views/main.py:565
#, python-format
@@ -574,7 +585,7 @@ msgstr "Дата (Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸ÐµÐ¼ времени)"
#: contrib/admin/views/doc.py:283
msgid "E-mail address"
-msgstr "E-mail адреÑ"
+msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты"
#: contrib/admin/views/doc.py:284
#: contrib/admin/views/doc.py:287
@@ -591,7 +602,7 @@ msgstr "ЛогичеÑкое (True, False или None)"
#: contrib/admin/views/doc.py:292
msgid "Relation to parent model"
-msgstr "ЗавиÑимоÑÑ‚ÑŒ на родительÑкую модель."
+msgstr "СвÑзь Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкой моделью"
#: contrib/admin/views/doc.py:293
msgid "Phone number"
@@ -612,11 +623,11 @@ msgstr "URL"
#: contrib/admin/views/doc.py:301
msgid "U.S. state (two uppercase letters)"
-msgstr "Штат СШР(два заглавных Ñимвола)"
+msgstr "Штат СШР(две заглавные буквы)"
#: contrib/admin/views/doc.py:302
msgid "XML text"
-msgstr "XML текÑÑ‚"
+msgstr "ТекÑÑ‚ XML"
#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
@@ -683,11 +694,11 @@ msgstr "ДейÑтвие"
#: contrib/admin/templates/admin/object_history.html:26
msgid "DATE_WITH_TIME_FULL"
-msgstr "j. N Y, H:i"
+msgstr "j N Y H:i"
#: 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 "Данный обьект не имеет иÑтории изменениÑ. Возможно он не был добавлен через данный админиÑтративный Ñайт."
+msgstr "Данный обьект не имеет иÑтории изменений. Возможно, он был добавлен не через данный админиÑтративный Ñайт."
#: contrib/admin/templates/admin/base_site.html:4
msgid "Django site admin"
@@ -711,7 +722,7 @@ msgstr "Ошибка Ñервера <em>(500)</em>"
#: 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 "Произошла ошибка. Отчет об ошибке отправлен админиÑтраторам Ñайта по e-mailи она должна быть вÑкоре иÑправлена. Благодарим Ð²Ð°Ñ Ð½Ð° терпение и помощь."
+msgstr "Произошла ошибка. Отчет об ошибке отправлен админиÑтраторам Ñайта по Ñлектронной почте, ошибка должна быть вÑкоре иÑправлена. Благодарим Ð²Ð°Ñ Ð½Ð° терпение и помощь."
#: contrib/admin/templates/admin/404.html:4
#: contrib/admin/templates/admin/404.html:8
@@ -725,7 +736,7 @@ msgstr "К Ñожалению, Ð·Ð°Ð¿Ñ€Ð°ÑˆÐ¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð²Ð°Ð¼Ð¸ ÑтраниÑ
#: contrib/admin/templates/admin/index.html:17
#, python-format
msgid "Models available in the %(name)s application."
-msgstr "Модели доÑтупны в %(name)s приложении."
+msgstr "Модели доÑтупны в приложении %(name)s."
#: contrib/admin/templates/admin/index.html:28
#: contrib/admin/templates/admin/change_form.html:15
@@ -742,11 +753,11 @@ msgstr "ÐедоÑтаточно прав Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ."
#: contrib/admin/templates/admin/index.html:52
msgid "Recent Actions"
-msgstr "ПоÑледние ДейÑтвиÑ"
+msgstr "ПоÑледние дейÑтвиÑ"
#: contrib/admin/templates/admin/index.html:53
msgid "My Actions"
-msgstr "Мои ДейÑтвиÑ"
+msgstr "Мои дейÑтвиÑ"
#: contrib/admin/templates/admin/index.html:57
msgid "None available"
@@ -773,12 +784,12 @@ msgstr "Удалить"
#: contrib/admin/templates/admin/delete_confirmation.html:14
#, python-format
msgid "Deleting the %(object_name)s '%(object)s' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:"
-msgstr "Удаление объекта %(object_name)s '%(object)s' приведет к удалению завиÑимых Ñлементов, но предоÑтавленных вам прав недоÑтаточно Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñледующих типов объектов:"
+msgstr "Удаление объекта %(object_name)s '%(object)s' привело бы к удалению ÑвÑзанных Ñлементов, но предоÑтавленных вам прав недоÑтаточно Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñледующих типов объектов:"
#: contrib/admin/templates/admin/delete_confirmation.html:21
#, python-format
msgid "Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of the following related items will be deleted:"
-msgstr "Ð’Ñ‹ уверены, что хотите удалить %(object_name)s \"%(object)s\"? Ð’Ñе Ñледующие объекты также будут удалены:"
+msgstr "Ð’Ñ‹ уверены, что хотите удалить %(object_name)s \"%(object)s\"? Ð’Ñе Ñледующие ÑвÑзанные объекты также будут удалены:"
#: contrib/admin/templates/admin/delete_confirmation.html:26
msgid "Yes, I'm sure"
@@ -787,12 +798,24 @@ msgstr "Да, Ñ ÑƒÐ²ÐµÑ€ÐµÐ½"
#: contrib/admin/templates/admin/filter.html:2
#, python-format
msgid " By %(title)s "
-msgstr "К%(title)s "
+msgstr " По %(title)s "
#: contrib/admin/templates/admin/search_form.html:8
msgid "Go"
msgstr "Вперёд"
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 результат"
+msgstr[1] "%(counter)s результата"
+msgstr[2] "%(counter)s результатов"
+
+#: contrib/admin/templates/admin/search_form.html:10
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s вÑего"
+
#: contrib/admin/templates/admin/change_form.html:21
msgid "View on site"
msgstr "Смотреть Ñайт"
@@ -800,8 +823,9 @@ msgstr "Смотреть Ñайт"
#: contrib/admin/templates/admin/change_form.html:30
msgid "Please correct the error below."
msgid_plural "Please correct the errors below."
-msgstr[0] "ПожалуйÑта иÑправьте ошибку ниже."
-msgstr[1] "ПожалуйÑта иÑправьте ошибки ниже."
+msgstr[0] "ПожалуйÑта, иÑправьте ошибку ниже."
+msgstr[1] "ПожалуйÑта, иÑправьте ошибки ниже."
+msgstr[2] "ПожалуйÑта, иÑправьте ошибки ниже."
#: contrib/admin/templates/admin/change_form.html:48
msgid "Ordering"
@@ -852,11 +876,11 @@ msgstr "Ð¡Ð±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ"
#: 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 "Забыли пароль? Введите ваш e-mail Ð°Ð´Ñ€ÐµÑ Ð½Ð¸Ð¶Ðµ и мы очиÑтим ваш Ñтарый пароль, и вышлем вам по e-mail новый."
+msgstr "Забыли пароль? Введите Ñвой Ð°Ð´Ñ€ÐµÑ Ñлектронной почты ниже, мы очиÑтим ваш Ñтарый пароль и вышлем вам по e-mail новый."
#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "E-mail address:"
-msgstr "E-mail адреÑ:"
+msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты:"
#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "Reset my password"
@@ -877,11 +901,11 @@ msgstr "УÑÐ¿ÐµÑˆÐ½Ð°Ñ Ð¾Ñ‡Ð¸Ñтка паролÑ"
#: 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 "Мы отправили новый пароль по указанному вами адреÑу Ñлектронной почты. Ð’Ñ‹ должны его вÑкоре получить."
+msgstr "Мы отправили новый пароль по указанному вами адреÑу Ñлектронной почты. Ð’Ñкоре вы его получите."
#: 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 "Ð’ целÑÑ… безопаÑноÑти, пожалуйÑта, введите ваш Ñтарый пароль, затем - новый пароль дважды, Ñ Ñ‚ÐµÐ¼, чтобы мы могли убедитьÑÑ Ð² правильноÑти напиÑаниÑ."
+msgstr "Ð’ целÑÑ… безопаÑноÑти, пожалуйÑта, введите Ñвой Ñтарый пароль, затем - новый пароль дважды, Ñ Ñ‚ÐµÐ¼, чтобы мы могли убедитьÑÑ Ð² правильноÑти напиÑаниÑ."
#: contrib/admin/templates/registration/password_change_form.html:17
msgid "Old password:"
@@ -901,12 +925,12 @@ msgstr "Изменение паролÑ"
#: contrib/admin/templates/registration/password_reset_email.html:2
msgid "You're receiving this e-mail because you requested a password reset"
-msgstr "Ð’Ñ‹ получили Ñто Ñообщение потому что была запрошена очиÑтка паролÑ"
+msgstr "Ð’Ñ‹ получили Ñто Ñообщение, потому что была запрошена очиÑтка паролÑ"
#: contrib/admin/templates/registration/password_reset_email.html:3
#, python-format
msgid "for your user account at %(site_name)s"
-msgstr "Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ пользовательÑкого аккаунта на %(site_name)s"
+msgstr "Ð”Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑи на %(site_name)s"
#: contrib/admin/templates/registration/password_reset_email.html:5
#, python-format
@@ -915,7 +939,7 @@ msgstr "Ваш новый пароль: %(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 "Ð’Ñ‹ вÑегда можете изменить Ñтот пароль Ð¿ÐµÑ€ÐµÐ¹Ð´Ñ Ð½Ð° Ñтраницу:"
+msgstr "Ð’Ñ‹ вÑегда можете изменить Ñтот пароль, Ð¿ÐµÑ€ÐµÐ¹Ð´Ñ Ð½Ð° Ñтраницу:"
#: contrib/admin/templates/registration/password_reset_email.html:11
msgid "Your username, in case you've forgotten:"
@@ -936,7 +960,7 @@ msgstr "Закладки"
#: contrib/admin/templates/admin_doc/bookmarklets.html:5
msgid "Documentation bookmarklets"
-msgstr "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¿Ð¾ bookmarklets"
+msgstr "Закладки документации"
#: contrib/admin/templates/admin_doc/bookmarklets.html:9
msgid ""
@@ -948,6 +972,13 @@ msgid ""
"as \"internal\" (talk to your system administrator if you aren't sure if\n"
"your computer is \"internal\").</p>\n"
msgstr ""
+"\n"
+"<p class=\"help\">Ð”Ð»Ñ ÑƒÑтановки закладок перетащите ÑÑылку к Ñебе на панель\n"
+"закладок или щелкните правой кнопкой мыши по ÑÑылке и добавьте ее в закладки. Теперь у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ возможноÑÑ‚ÑŒ\n"
+"выбрать закладку Ñ Ð»ÑŽÐ±Ð¾Ð¹ Ñтраницы Ñайта. Обратите внимание: некоторые из Ñтих\n"
+"закладок требуют, чтобы вы проÑматривали Ñайт Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð°, определенного\n"
+"как \"внутренний\" (уточните у Ñвоего ÑиÑтемного админиÑтратора, еÑли не уверены, ÑвлÑетÑÑ Ð»Ð¸\n"
+"ваш компьютер \"внутренним\").</p>\n"
#: contrib/admin/templates/admin_doc/bookmarklets.html:19
msgid "Documentation for this page"
@@ -955,7 +986,7 @@ msgstr "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¿Ð¾ данной Ñтранице"
#: 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 "Перенаправит Ð²Ð°Ñ Ñ Ð»ÑŽÐ±Ð¾Ð¹ Ñтраницы к проÑмотру документа, который генерирует Ñту Ñтраницу."
+msgstr "ПеренаправлÑет Ð²Ð°Ñ Ñ Ð»ÑŽÐ±Ð¾Ð¹ Ñтраницы к документации view, который генерирует Ñту Ñтраницу."
#: contrib/admin/templates/admin_doc/bookmarklets.html:22
msgid "Show object ID"
@@ -963,7 +994,7 @@ msgstr "Показать ID обьекта"
#: contrib/admin/templates/admin_doc/bookmarklets.html:23
msgid "Shows the content-type and unique ID for pages that represent a single object."
-msgstr "Показывает тип Ð½Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¸ уникальный ID Ð´Ð»Ñ Ñтраниц, которые означают одинокий объект."
+msgstr "Показывает тип Ð½Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¸ уникальный ID Ð´Ð»Ñ Ñтраниц, предÑтавлÑющих один объект."
#: contrib/admin/templates/admin_doc/bookmarklets.html:25
msgid "Edit this object (current window)"
@@ -971,7 +1002,7 @@ msgstr "Редактировать данный обьект (в текущем
#: contrib/admin/templates/admin_doc/bookmarklets.html:26
msgid "Jumps to the admin page for pages that represent a single object."
-msgstr "Перейти на Ñтраницу админиÑтратор Ð´Ð»Ñ Ñтраниц предÑтавлÑющих один объект."
+msgstr "Перейдет на админиÑтративную Ñтраницу Ð´Ð»Ñ Ñтраниц, предÑтавлÑющих один объект."
#: contrib/admin/templates/admin_doc/bookmarklets.html:28
msgid "Edit this object (new window)"
@@ -979,7 +1010,7 @@ msgstr "Редактировать данный обьект (в новом ок
#: contrib/admin/templates/admin_doc/bookmarklets.html:29
msgid "As above, but opens the admin page in a new window."
-msgstr "То же что и выше, но откроет админиÑтративную Ñтраницу в новом окне"
+msgstr "То же что и выше, но откроет админиÑтративную Ñтраницу в новом окне."
#: contrib/admin/templates/widget/date_time.html:3
msgid "Date:"
@@ -999,27 +1030,27 @@ msgstr "Изменить:"
#: contrib/redirects/models.py:7
msgid "redirect from"
-msgstr "перенаправить из"
+msgstr "Перенаправить из"
#: contrib/redirects/models.py:8
msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'."
-msgstr "Это должен быть абÑолютный путь, иÑÐºÐ»ÑŽÑ‡Ð°Ñ Ð´Ð¾Ð¼ÐµÐ½Ð½Ð¾Ðµ имÑ. Пример: '/events/search/'."
+msgstr "Это должен быть абÑолютный путь без доменного имени. Пример: '/events/search/'."
#: contrib/redirects/models.py:9
msgid "redirect to"
-msgstr "перенаправить на"
+msgstr "Перенаправить на"
#: contrib/redirects/models.py:10
msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'."
-msgstr "Это должен быть, либо абÑолютный путь (как выше) или полный URL начинающийÑÑ Ñ 'http://'."
+msgstr "Это должен быть абÑолютный путь (как выше) или полный URL, начинающийÑÑ Ñ 'http://'."
#: contrib/redirects/models.py:12
msgid "redirect"
-msgstr "перенаправить"
+msgstr "Перенаправление"
#: contrib/redirects/models.py:13
msgid "redirects"
-msgstr "перенаправлениÑ"
+msgstr "ПеренаправлениÑ"
#: contrib/flatpages/models.py:8
msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
@@ -1027,19 +1058,19 @@ msgstr "Пример: '/about/contact/'. Будьте уверенны, что Ð
#: contrib/flatpages/models.py:9
msgid "title"
-msgstr "заголовок"
+msgstr "Заголовок"
#: contrib/flatpages/models.py:10
msgid "content"
-msgstr "наполнение"
+msgstr "Содержимое"
#: contrib/flatpages/models.py:11
msgid "enable comments"
-msgstr "активировать комментарии"
+msgstr "Ðктивировать комментарии"
#: contrib/flatpages/models.py:12
msgid "template name"
-msgstr "Ð¸Ð¼Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð°"
+msgstr "Ð˜Ð¼Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð°"
#: contrib/flatpages/models.py:13
msgid "Example: 'flatpages/contact_page'. If this isn't provided, the system will use 'flatpages/default'."
@@ -1047,7 +1078,7 @@ msgstr "Пример: 'flatpages/contact_page'. ЕÑли Ñтот файл не
#: contrib/flatpages/models.py:14
msgid "registration required"
-msgstr "региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¾Ð±Ñзательна"
+msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¾Ð±Ñзательна"
#: contrib/flatpages/models.py:14
msgid "If this is checked, only logged-in users will be able to view the page."
@@ -1055,24 +1086,24 @@ msgstr "ЕÑли отмечено, только вошедшие пользовÐ
#: contrib/flatpages/models.py:18
msgid "flat page"
-msgstr "проÑÑ‚Ð°Ñ Ñтраница"
+msgstr "ПроÑÑ‚Ð°Ñ Ñтраница"
#: contrib/flatpages/models.py:19
msgid "flat pages"
-msgstr "проÑтые Ñтраницы"
+msgstr "ПроÑтые Ñтраницы"
#: contrib/auth/models.py:13
#: contrib/auth/models.py:26
msgid "name"
-msgstr "имÑ"
+msgstr "ИмÑ"
#: contrib/auth/models.py:15
msgid "codename"
-msgstr "код"
+msgstr "Кодовое название"
#: contrib/auth/models.py:17
msgid "permission"
-msgstr "Права"
+msgstr "Право"
#: contrib/auth/models.py:18
#: contrib/auth/models.py:27
@@ -1090,23 +1121,23 @@ msgstr "Группы"
#: contrib/auth/models.py:55
msgid "username"
-msgstr "Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
+msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
#: contrib/auth/models.py:56
msgid "first name"
-msgstr "имÑ"
+msgstr "ИмÑ"
#: contrib/auth/models.py:57
msgid "last name"
-msgstr "фамилиÑ"
+msgstr "ФамилиÑ"
#: contrib/auth/models.py:58
msgid "e-mail address"
-msgstr "e-mail адреÑ"
+msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты"
#: contrib/auth/models.py:59
msgid "password"
-msgstr "пароль"
+msgstr "Пароль"
#: contrib/auth/models.py:59
msgid "Use '[algo]$[salt]$[hexdigest]'"
@@ -1114,7 +1145,7 @@ msgstr "ИÑпользуйте '[algo]$[salt]$[hexdigest]'"
#: contrib/auth/models.py:60
msgid "staff status"
-msgstr "ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¿ÐµÑ€Ñонала"
+msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿ÐµÑ€Ñонала"
#: contrib/auth/models.py:60
msgid "Designates whether the user can log into this admin site."
@@ -1122,27 +1153,27 @@ msgstr "Отметьте, еÑли пользователь может входÐ
#: contrib/auth/models.py:61
msgid "active"
-msgstr "активен"
+msgstr "Ðктивный"
#: contrib/auth/models.py:62
msgid "superuser status"
-msgstr "ÑÑ‚Ð°Ñ‚ÑƒÑ Ð°Ð´Ð¼Ð¸Ð½Ð°"
+msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ ÑуперпользователÑ"
#: contrib/auth/models.py:63
msgid "last login"
-msgstr "поÑледний вход"
+msgstr "ПоÑледний вход"
#: contrib/auth/models.py:64
msgid "date joined"
-msgstr "дата региÑтрации"
+msgstr "Дата региÑтрации"
#: contrib/auth/models.py:66
msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."
-msgstr "К добавлению к перавам выбрнанным вуручную, Ñтот пользователь может получить вÑе права группы, к которой он принадлежит."
+msgstr "Ð’ добавление к правам, приÑвоенным вручную, Ñтот пользователь получит вÑе права групп, к которым он принадлежит."
#: contrib/auth/models.py:67
msgid "user permissions"
-msgstr "Права пользователÑ"
+msgstr "права пользователÑ"
#: contrib/auth/models.py:70
msgid "user"
@@ -1182,59 +1213,59 @@ msgstr "Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа python модулÑ"
#: contrib/contenttypes/models.py:28
msgid "content type"
-msgstr "тип наполнениÑ"
+msgstr "Тип Ñодержимого"
#: contrib/contenttypes/models.py:29
msgid "content types"
-msgstr "типы наполнениÑ"
+msgstr "Типы Ñодержимого"
#: contrib/sessions/models.py:35
msgid "session key"
-msgstr "ключ ÑеÑÑии"
+msgstr "Ключ ÑеÑÑии"
#: contrib/sessions/models.py:36
msgid "session data"
-msgstr "данные ÑеÑÑии"
+msgstr "Данные ÑеÑÑии"
#: contrib/sessions/models.py:37
msgid "expire date"
-msgstr "дата окончаниÑ"
+msgstr "Дата окончаниÑ"
#: contrib/sessions/models.py:41
msgid "session"
-msgstr "ÑеÑÑиÑ"
+msgstr "СеÑÑиÑ"
#: contrib/sessions/models.py:42
msgid "sessions"
-msgstr "ÑеÑÑии"
+msgstr "СеÑÑии"
#: contrib/sites/models.py:10
msgid "domain name"
-msgstr "домен"
+msgstr "Доменное имÑ"
#: contrib/sites/models.py:11
msgid "display name"
-msgstr "выводимое имÑ"
+msgstr "Выводимое имÑ"
#: contrib/sites/models.py:15
msgid "site"
-msgstr "Ñайт"
+msgstr "Сайт"
#: contrib/sites/models.py:16
msgid "sites"
-msgstr "Ñайты"
+msgstr "Сайты"
#: utils/translation.py:360
msgid "DATE_FORMAT"
-msgstr ""
+msgstr "d.m.Y"
#: utils/translation.py:361
msgid "DATETIME_FORMAT"
-msgstr ""
+msgstr "d.m.Y H:i"
#: utils/translation.py:362
msgid "TIME_FORMAT"
-msgstr ""
+msgstr "H:i"
#: utils/dates.py:6
msgid "Monday"
@@ -1307,7 +1338,7 @@ msgstr "СентÑбрь"
#: utils/dates.py:15
msgid "October"
-msgstr "ОÑÑ‚Ñбрь"
+msgstr "ОктÑбрь"
#: utils/dates.py:15
msgid "November"
@@ -1367,143 +1398,149 @@ msgstr "дек"
#: utils/dates.py:27
msgid "Jan."
-msgstr "Янв."
+msgstr "Ñнв."
#: utils/dates.py:27
msgid "Feb."
-msgstr "Фев."
+msgstr "фев."
#: utils/dates.py:28
msgid "Aug."
-msgstr "Ðвг."
+msgstr "авг."
#: utils/dates.py:28
msgid "Sept."
-msgstr "Сен."
+msgstr "Ñен."
#: utils/dates.py:28
msgid "Oct."
-msgstr "Окт."
+msgstr "окт."
#: utils/dates.py:28
msgid "Nov."
-msgstr "ÐоÑб."
+msgstr "ноÑб."
#: utils/dates.py:28
msgid "Dec."
-msgstr "Дек."
+msgstr "дек."
#: utils/timesince.py:12
msgid "year"
msgid_plural "years"
msgstr[0] "год"
-msgstr[1] "лет"
+msgstr[1] "года"
+msgstr[2] "лет"
#: utils/timesince.py:13
msgid "month"
msgid_plural "months"
msgstr[0] "меÑÑц"
-msgstr[1] "меÑÑцев"
+msgstr[1] "меÑÑца"
+msgstr[2] "меÑÑцев"
#: utils/timesince.py:14
msgid "week"
msgid_plural "weeks"
msgstr[0] "неделÑ"
-msgstr[1] "недель"
+msgstr[1] "недели"
+msgstr[2] "недель"
#: utils/timesince.py:15
msgid "day"
msgid_plural "days"
msgstr[0] "день"
-msgstr[1] "дней"
+msgstr[1] "днÑ"
+msgstr[2] "дней"
#: utils/timesince.py:16
msgid "hour"
msgid_plural "hours"
msgstr[0] "чаÑ"
-msgstr[1] "чаÑов"
+msgstr[1] "чаÑа"
+msgstr[2] "чаÑов"
#: utils/timesince.py:17
msgid "minute"
msgid_plural "minutes"
msgstr[0] "минута"
-msgstr[1] "минут"
+msgstr[1] "минуты"
+msgstr[2] "минут"
#: conf/global_settings.py:37
msgid "Bengali"
-msgstr ""
+msgstr "БенгальÑкий"
#: conf/global_settings.py:38
msgid "Czech"
-msgstr ""
+msgstr "ЧешÑкий"
#: conf/global_settings.py:39
msgid "Welsh"
-msgstr ""
+msgstr "УÑльÑкий"
#: conf/global_settings.py:40
msgid "Danish"
-msgstr ""
+msgstr "ДатÑкий"
#: conf/global_settings.py:41
msgid "German"
-msgstr ""
+msgstr "Ðемецкий"
#: conf/global_settings.py:42
msgid "Greek"
-msgstr ""
+msgstr "ГречеÑкий"
#: conf/global_settings.py:43
msgid "English"
-msgstr ""
+msgstr "ÐнглийÑкий"
#: conf/global_settings.py:44
msgid "Spanish"
-msgstr ""
+msgstr "ИÑпанÑкий"
#: conf/global_settings.py:45
msgid "French"
-msgstr ""
+msgstr "ФранцузÑкий"
#: conf/global_settings.py:46
msgid "Galician"
-msgstr ""
+msgstr "ГалльÑкий"
#: conf/global_settings.py:47
msgid "Hungarian"
-msgstr ""
+msgstr "ВенгерÑкий"
#: conf/global_settings.py:48
msgid "Hebrew"
-msgstr ""
+msgstr "Иврит"
#: conf/global_settings.py:49
msgid "Icelandic"
-msgstr ""
+msgstr "ИÑландÑкий"
#: conf/global_settings.py:50
msgid "Italian"
-msgstr ""
+msgstr "ИтальÑнÑкий"
#: conf/global_settings.py:51
msgid "Japanese"
-msgstr ""
+msgstr "ЯпонÑкий"
#: conf/global_settings.py:52
msgid "Dutch"
-msgstr ""
+msgstr "ГолландÑкий"
#: conf/global_settings.py:53
msgid "Norwegian"
-msgstr ""
+msgstr "ÐорвежÑкий"
#: conf/global_settings.py:54
msgid "Brazilian"
-msgstr ""
+msgstr "БразильÑкий"
#: conf/global_settings.py:55
msgid "Romanian"
-msgstr ""
+msgstr "РумынÑкий"
#: conf/global_settings.py:56
msgid "Russian"
@@ -1511,100 +1548,100 @@ msgstr "РуÑÑкий"
#: conf/global_settings.py:57
msgid "Slovak"
-msgstr ""
+msgstr "Словацкий"
#: conf/global_settings.py:58
msgid "Slovenian"
-msgstr ""
+msgstr "СловенÑкий"
#: conf/global_settings.py:59
msgid "Serbian"
-msgstr ""
+msgstr "СербÑкий"
#: conf/global_settings.py:60
msgid "Swedish"
-msgstr ""
+msgstr "ШведÑкий"
#: conf/global_settings.py:61
msgid "Ukrainian"
-msgstr ""
+msgstr "УкраинÑкий"
#: conf/global_settings.py:62
msgid "Simplified Chinese"
-msgstr ""
+msgstr "Упрощенный китайÑкий"
#: conf/global_settings.py:63
msgid "Traditional Chinese"
-msgstr ""
+msgstr "Традиционный китайÑкий"
#: core/validators.py:60
msgid "This value must contain only letters, numbers and underscores."
-msgstr "Значение может Ñодержать только буквы, цифры и подчеркиваниÑ."
+msgstr "Значение должно ÑоÑтоÑÑ‚ÑŒ только из букв, цифр и знаков подчеркиваниÑ."
#: core/validators.py:64
msgid "This value must contain only letters, numbers, underscores, dashes or slashes."
-msgstr "Значение может Ñодержать только буквы, цифры, подчеркиваниÑ, дифиÑÑ‹ или тере."
+msgstr "Значение должно ÑоÑтоÑÑ‚ÑŒ только из букв, цифр, знаков подчеркиваниÑ, тире или наклонной черты вправо."
#: core/validators.py:72
msgid "Uppercase letters are not allowed here."
-msgstr "Заглавные буквы не разрешены"
+msgstr "Заглавные буквы недопуÑтимы."
#: core/validators.py:76
msgid "Lowercase letters are not allowed here."
-msgstr "Строчные буквы не разрешены"
+msgstr "Строчные буквы здеÑÑŒ недопуÑтимы."
#: core/validators.py:83
msgid "Enter only digits separated by commas."
-msgstr "Вводите только цифры разделённые запÑтыми"
+msgstr "Введите цифры, разделённые запÑтыми."
#: core/validators.py:95
msgid "Enter valid e-mail addresses separated by commas."
-msgstr "Вводите реальные e-mail адреÑа разделённые запÑтыми"
+msgstr "Введите правильные адреÑа Ñлектронной почты, разделённые запÑтыми."
#: core/validators.py:99
msgid "Please enter a valid IP address."
-msgstr "ПожалуйÑта, вводите реальный IP адреÑ"
+msgstr "ПожалуйÑта, введите правильный IP-адреÑ."
#: core/validators.py:103
msgid "Empty values are not allowed here."
-msgstr "ПуÑтое значение не разрешено"
+msgstr "ПуÑтое значение здеÑÑŒ недопуÑтимо."
#: core/validators.py:107
msgid "Non-numeric characters aren't allowed here."
-msgstr "Ðе цифровые Ñимволы не рназрешены"
+msgstr "Ðецифровые Ñимволы здеÑÑŒ недопуÑтимы."
#: core/validators.py:111
msgid "This value can't be comprised solely of digits."
-msgstr ""
+msgstr "Это значение не может быть ÑоÑтавлено только из цифр."
#: core/validators.py:116
msgid "Enter a whole number."
-msgstr "Введите номер"
+msgstr "Введите целое чиÑло."
#: core/validators.py:120
msgid "Only alphabetical characters are allowed here."
-msgstr "Только буквы можно иÑпользовать"
+msgstr "ЗдеÑÑŒ разрешены только алфавитные Ñимволы."
#: core/validators.py:124
msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr "Вводите реальную дату в формате YYYY-MM-DD."
+msgstr "Вводите правильную дату в формате YYYY-MM-DD."
#: core/validators.py:128
msgid "Enter a valid time in HH:MM format."
-msgstr "Вводите реальное Ð²Ñ€ÐµÐ¼Ñ Ð² формате HH:MM."
+msgstr "Введите правильное Ð²Ñ€ÐµÐ¼Ñ Ð² формате HH:MM."
#: core/validators.py:132
#: db/models/fields/__init__.py:468
msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
-msgstr "Вводите реальные дата/Ð²Ñ€ÐµÐ¼Ñ Ð² формате YYYY-MM-DD HH:MM."
+msgstr "Введите правильные дату/Ð²Ñ€ÐµÐ¼Ñ Ð² формате YYYY-MM-DD HH:MM."
#: core/validators.py:136
msgid "Enter a valid e-mail address."
-msgstr "Укажите реальный e-mail адреÑ."
+msgstr "Укажите правильный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты."
#: core/validators.py:148
msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
-msgstr "Загрузите реальное изображение. Файл, который вы загружали, не был изображением или был поврежден."
+msgstr "Загрузите реальное изображение. Файл, который вы загрузили, не ÑвлÑетÑÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÐ¼ или был поврежден."
#: core/validators.py:155
#, python-format
@@ -1614,7 +1651,7 @@ msgstr "URL %s не указывает на реальное изображенÐ
#: core/validators.py:159
#, python-format
msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
-msgstr "Телефонный номер должен быть в формате XXX-XXX-XXXX. \"%s\" не верен."
+msgstr "Телефонные номера должен быть в формате XXX-XXX-XXXX. \"%s\" неверен."
#: core/validators.py:167
#, python-format
@@ -1623,7 +1660,7 @@ msgstr "URL %s не указывает на реальное видео QuickTim
#: core/validators.py:171
msgid "A valid URL is required."
-msgstr "Реальный URL обÑзателен."
+msgstr "Правильный URL обÑзателен."
#: core/validators.py:185
#, python-format
@@ -1631,7 +1668,7 @@ msgid ""
"Valid HTML is required. Specific errors are:\n"
"%s"
msgstr ""
-"Реальный HTML обÑзателен. Специфичные ошибки:\n"
+"Правильный HTML обÑзателен. Специфичные ошибки:\n"
"%s"
#: core/validators.py:192
@@ -1648,11 +1685,11 @@ msgstr "Ðеверный URL: %s"
#: core/validators.py:208
#, python-format
msgid "The URL %s is a broken link."
-msgstr "URL %s ÑÐ»Ð¾Ð¼Ð°Ð½Ð½Ð°Ñ ÑÑылка."
+msgstr "URL %s - ÑÐ»Ð¾Ð¼Ð°Ð½Ð½Ð°Ñ ÑÑылка."
#: core/validators.py:214
msgid "Enter a valid U.S. state abbreviation."
-msgstr "Вводите реальную абревиатуру штатов СШÐ."
+msgstr "Введите правильную аббревиатуру штата СШÐ."
#: core/validators.py:229
#, python-format
@@ -1660,6 +1697,7 @@ msgid "Watch your mouth! The word %s is not allowed here."
msgid_plural "Watch your mouth! The words %s are not allowed here."
msgstr[0] "Следите за Ñвоими Ñловами! Слово %s здеÑÑŒ запрещено."
msgstr[1] "Следите за Ñвоими Ñловами! Слова %s здеÑÑŒ запрещены."
+msgstr[2] "Следите за Ñвоими Ñловами! Слова %s здеÑÑŒ запрещены."
#: core/validators.py:236
#, python-format
@@ -1673,58 +1711,60 @@ msgstr "ПожалуйÑта, заполните Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ одно поле
#: core/validators.py:264
#: core/validators.py:275
msgid "Please enter both fields or leave them both empty."
-msgstr "ПожалуйÑта, заполните оба Ð¿Ð¾Ð»Ñ Ð»Ð¸Ð±Ð¾ оÑтавьте их пуÑтыми."
+msgstr "ПожалуйÑта, заполните оба Ð¿Ð¾Ð»Ñ Ð¸Ð»Ð¸ оÑтавьте их оба пуÑтыми."
#: core/validators.py:282
#, python-format
msgid "This field must be given if %(field)s is %(value)s"
-msgstr "Это поле должно быть заполнено еÑли %(field)s равно %(value)s"
+msgstr "Это поле должно быть заполнено, еÑли %(field)s равно %(value)s"
#: core/validators.py:294
#, python-format
msgid "This field must be given if %(field)s is not %(value)s"
-msgstr "Это поле должно быть заполнено еÑли %(field)s не равно %(value)s"
+msgstr "Это поле должно быть заполнено, еÑли %(field)s не равно %(value)s"
#: core/validators.py:313
msgid "Duplicate values are not allowed."
-msgstr "Двойные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‰ÐµÐ½Ð½Ñ‹."
+msgstr "Двойные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‰ÐµÐ½Ñ‹."
#: core/validators.py:336
#, python-format
msgid "This value must be a power of %s."
-msgstr ""
+msgstr "Это значение должно быть Ñтепенью %s."
#: core/validators.py:347
msgid "Please enter a valid decimal number."
-msgstr "ПожалуйÑта, вводите корректное деÑÑтичное чиÑло."
+msgstr "ПожалуйÑта, введите корректное деÑÑтичное чиÑло."
#: core/validators.py:349
#, python-format
msgid "Please enter a valid decimal number with at most %s total digit."
msgid_plural "Please enter a valid decimal number with at most %s total digits."
-msgstr[0] "ПожалуйÑта, вводите корректное деÑÑтичное чиÑло Ñ Ð¼Ð°ÐºÑимальным количеÑтвом знаков %s."
-msgstr[1] "ПожалуйÑта, вводите корректное деÑÑтичное чиÑло Ñ Ð¼Ð°ÐºÑимальным количеÑтвом знаков %s."
+msgstr[0] "ПожалуйÑта, введите корректное деÑÑтичное чиÑло макÑимально Ñ %s знаком."
+msgstr[1] "ПожалуйÑта, введите корректное деÑÑтичное чиÑло макÑимально Ñ %s знаками."
+msgstr[2] "ПожалуйÑта, введите корректное деÑÑтичное чиÑло макÑимально Ñ %s знаками."
#: core/validators.py:352
#, python-format
msgid "Please enter a valid decimal number with at most %s decimal place."
msgid_plural "Please enter a valid decimal number with at most %s decimal places."
-msgstr[0] "ПожалуйÑта, вводите корректное деÑÑтичное чиÑло Ñ Ð¼Ð°ÐºÑимальным количеÑтвом знаков поÑле запÑтой %s."
-msgstr[1] "ПожалуйÑта, вводите корректное деÑÑтичное чиÑло Ñ Ð¼Ð°ÐºÑимальным количеÑтвом знаков поÑле запÑтой %s."
+msgstr[0] "ПожалуйÑта, введите корректное деÑÑтичное чиÑло макÑимально Ñ %s знаком поÑле запÑтой."
+msgstr[1] "ПожалуйÑта, введите корректное деÑÑтичное чиÑло макÑимально Ñ %s знаками поÑле запÑтой."
+msgstr[2] "ПожалуйÑта, введите корректное деÑÑтичное чиÑло макÑимально Ñ %s знаками поÑле запÑтой."
#: core/validators.py:362
#, python-format
msgid "Make sure your uploaded file is at least %s bytes big."
-msgstr "УбедитеÑÑŒ, что загруженный файл по крайней мере не меньше %s байт."
+msgstr "УбедитеÑÑŒ, что загруженный файл не меньше %s байт."
#: core/validators.py:363
#, python-format
msgid "Make sure your uploaded file is at most %s bytes big."
-msgstr "УбедитеÑÑŒ, что загруженный файл больше чем %s байт."
+msgstr "УбедитеÑÑŒ, что загруженный файл не больше %s байт."
#: core/validators.py:376
msgid "The format for this field is wrong."
-msgstr "Формат Ñтого Ð¿Ð¾Ð»Ñ Ð½ÐµÐ²ÐµÑ€ÐµÐ½"
+msgstr "Формат Ñтого Ð¿Ð¾Ð»Ñ Ð½ÐµÐ²ÐµÑ€ÐµÐ½."
#: core/validators.py:391
msgid "This field is invalid."
@@ -1733,7 +1773,7 @@ msgstr "Это поле неверно."
#: core/validators.py:426
#, python-format
msgid "Could not retrieve anything from %s."
-msgstr "Ðевозможно получить что-либо Ñ %s."
+msgstr "Ðевозможно получить ничего Ñ %s."
#: core/validators.py:429
#, python-format
@@ -1743,42 +1783,42 @@ msgstr "URL %(url)s вернул неверный заголовок Content-Typ
#: core/validators.py:462
#, python-format
msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)"
-msgstr ""
+msgstr "ПожалуйÑта, закройте незакрытый Ñ‚Ñг %(tag)s на Ñтроке %(line)s. (Строка начинаетÑÑ Ñ \"%(start)s\".)"
#: core/validators.py:466
#, python-format
msgid "Some text starting on line %(line)s is not allowed in that context. (Line starts with \"%(start)s\".)"
-msgstr ""
+msgstr "Что-то из текÑта, начинающегоÑÑ Ð½Ð° Ñтроке %(line)s, недопуÑтимо в том контекÑте. (Строка начинаетÑÑ Ñ \"%(start)s\".)"
#: core/validators.py:471
#, python-format
msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)"
-msgstr ""
+msgstr "\"%(attr)s\" на Ñтроке %(line)s - неправильный атрибут. (Строка начинаетÑÑ Ñ \"%(start)s\".)"
#: core/validators.py:476
#, python-format
msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)"
-msgstr ""
+msgstr "\"<%(tag)s>\" на Ñтроке %(line)s - неправильный тег. (Строка начинаетÑÑ Ñ \"%(start)s\".)"
#: core/validators.py:480
#, python-format
msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)"
-msgstr ""
+msgstr "Ð’ теге на Ñтроке %(line)s не хватает одного или более обÑзательных атрибутов. (Строка начинаетÑÑ Ñ \"%(start)s\".)"
#: core/validators.py:485
#, python-format
msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)"
-msgstr ""
+msgstr "Ðтрибут \"%(attr)s\" на Ñтроке %(line)s имеет недопуÑтимое значение. (Строка начинаетÑÑ Ñ \"%(start)s\".)"
#: db/models/manipulators.py:302
#, python-format
msgid "%(object)s with this %(type)s already exists for the given %(field)s."
-msgstr ""
+msgstr "%(object)s Ñ Ñ‚Ð¸Ð¿Ð¾Ð¼ %(type)s уже ÑущеÑтвует Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ %(field)s."
#: db/models/fields/__init__.py:40
#, python-format
msgid "%(optname)s with this %(fieldname)s already exists."
-msgstr ""
+msgstr "%(optname)s Ñ %(fieldname)s уже ÑущеÑтвует."
#: db/models/fields/__init__.py:114
#: db/models/fields/__init__.py:265
@@ -1790,11 +1830,11 @@ msgstr "ОбÑзательное поле."
#: db/models/fields/__init__.py:337
msgid "This value must be an integer."
-msgstr ""
+msgstr "Это значение должно быть целым чиÑлом."
#: db/models/fields/__init__.py:369
msgid "This value must be either True or False."
-msgstr "Значение должно либо True либо False."
+msgstr "Значение должно либо True, либо False."
#: db/models/fields/__init__.py:385
msgid "This field cannot be null."
@@ -1807,48 +1847,50 @@ msgstr "Укажите правильное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°."
#: db/models/fields/related.py:43
#, python-format
msgid "Please enter a valid %s."
-msgstr ""
+msgstr "ПожалуйÑта, введите правильный %s."
#: db/models/fields/related.py:579
msgid "Separate multiple IDs with commas."
-msgstr "ÐеÑколько значений ID разделÑйте запÑтыми."
+msgstr "ÐеÑколько значений ID разделите запÑтыми."
#: db/models/fields/related.py:581
msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
-msgstr " Удерживайте \"Control\", или \"Command\" на Макинтош, Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° больше чем одного."
+msgstr "Удерживайте \"Control\" (или \"Command\" на Mac) Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° неÑкольких."
#: db/models/fields/related.py:625
#, python-format
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "ПожалуйÑта, введите корректный ID Ð´Ð»Ñ %(self)s. Значение %(value)r недопуÑтимо."
+msgstr[1] "ПожалуйÑта, введите корректные ID Ð´Ð»Ñ %(self)s. Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ %(value)r недопуÑтимы."
+msgstr[2] "ПожалуйÑта, введите корректные ID Ð´Ð»Ñ %(self)s. Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ %(value)r недопуÑтимы."
#: forms/__init__.py:380
#, python-format
msgid "Ensure your text is less than %s character."
msgid_plural "Ensure your text is less than %s characters."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "УбедитеÑÑŒ, что длина вашего текÑта меньше %s Ñимвола."
+msgstr[1] "УбедитеÑÑŒ, что длина вашего текÑта меньше %s Ñимволов."
+msgstr[2] "УбедитеÑÑŒ, что длина вашего текÑта меньше %s Ñимволов."
#: forms/__init__.py:385
msgid "Line breaks are not allowed here."
-msgstr "ПереноÑÑ‹ Ñтрок не допуÑкаютÑÑ Ð·Ð´ÐµÑÑŒ."
+msgstr "ПереноÑÑ‹ Ñтрок здеÑÑŒ не допуÑкаютÑÑ."
#: forms/__init__.py:480
#: forms/__init__.py:551
#: forms/__init__.py:589
#, python-format
msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
-msgstr ""
+msgstr "Выберите корректный вариант; '%(data)s' нет в %(choices)s."
#: forms/__init__.py:645
msgid "The submitted file is empty."
-msgstr "Указанный файл - пуÑÑ‚."
+msgstr "Указанный файл пуÑÑ‚."
#: forms/__init__.py:699
msgid "Enter a whole number between -32,768 and 32,767."
-msgstr ""
+msgstr "Введите целое чиÑло в диапазоне от -32768 до 32767."
#: forms/__init__.py:708
msgid "Enter a positive number."
diff --git a/django/contrib/admin/media/js/admin/DateTimeShortcuts.js b/django/contrib/admin/media/js/admin/DateTimeShortcuts.js
index 3f6fb67bc7..77c536b865 100644
--- a/django/contrib/admin/media/js/admin/DateTimeShortcuts.js
+++ b/django/contrib/admin/media/js/admin/DateTimeShortcuts.js
@@ -171,7 +171,6 @@ var DateTimeShortcuts = {
cal_nav_prev.className = 'calendarnav-previous';
var cal_nav_next = quickElement('a', cal_nav, '>', 'href', 'javascript:DateTimeShortcuts.drawNext('+num+');');
cal_nav_next.className = 'calendarnav-next';
- cal_box.appendChild(cal_nav);
// main box
var cal_main = quickElement('div', cal_box, '', 'id', DateTimeShortcuts.calendarDivName2 + num);
diff --git a/django/contrib/admin/templatetags/admin_modify.py b/django/contrib/admin/templatetags/admin_modify.py
index 8a6012f21d..0bf3995eb6 100644
--- a/django/contrib/admin/templatetags/admin_modify.py
+++ b/django/contrib/admin/templatetags/admin_modify.py
@@ -161,8 +161,10 @@ class EditInlineNode(template.Node):
context.push()
if relation.field.rel.edit_inline == models.TABULAR:
bound_related_object_class = TabularBoundRelatedObject
- else:
+ elif relation.field.rel.edit_inline == models.STACKED:
bound_related_object_class = StackedBoundRelatedObject
+ else:
+ bound_related_object_class = relation.field.rel.edit_inline
original = context.get('original', None)
bound_related_object = relation.bind(context['form'], original, bound_related_object_class)
context['bound_related_object'] = bound_related_object
diff --git a/django/contrib/admin/templatetags/row_level_permission.py b/django/contrib/admin/templatetags/row_level_permission.py
index 6b8e8b1d3c..768d747c6f 100644
--- a/django/contrib/admin/templatetags/row_level_permission.py
+++ b/django/contrib/admin/templatetags/row_level_permission.py
@@ -41,7 +41,6 @@ def paginator(context, adjacent_pages=2):
page_numbers = [n for n in \
range(context["page"] - adjacent_pages, context["page"] + adjacent_pages + 1) \
if n > 0 and n <= context["pages"]]
- print page_numbers
return {
"hits": context["hits"],
"results_per_page": context["results_per_page"],
diff --git a/django/contrib/admin/views/auth.py b/django/contrib/admin/views/auth.py
index 4df4eda847..3a1fb11964 100644
--- a/django/contrib/admin/views/auth.py
+++ b/django/contrib/admin/views/auth.py
@@ -1,3 +1,4 @@
+from django.contrib.admin.views.decorators import staff_member_required
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django import forms, template
@@ -5,6 +6,8 @@ from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
def user_add_stage(request):
+ if not request.user.has_perm('auth.change_user'):
+ raise PermissionDenied
manipulator = UserCreationForm()
if request.method == 'POST':
new_data = request.POST.copy()
@@ -38,3 +41,4 @@ def user_add_stage(request):
'opts': User._meta,
'username_help_text': User._meta.get_field('username').help_text,
}, context_instance=template.RequestContext(request))
+user_add_stage = staff_member_required(user_add_stage)
diff --git a/django/contrib/admin/views/main.py b/django/contrib/admin/views/main.py
index f387de60df..386967eac5 100644
--- a/django/contrib/admin/views/main.py
+++ b/django/contrib/admin/views/main.py
@@ -757,6 +757,8 @@ class ChangeList(object):
for bit in self.query.split():
or_queries = [models.Q(**{construct_search(field_name): bit}) for field_name in self.lookup_opts.admin.search_fields]
other_qs = QuerySet(self.model)
+ if qs._select_related:
+ other_qs = other_qs.select_related()
other_qs = other_qs.filter(reduce(operator.or_, or_queries))
qs = qs & other_qs
diff --git a/django/contrib/auth/decorators.py b/django/contrib/auth/decorators.py
index 0102496a33..8164d8314e 100644
--- a/django/contrib/auth/decorators.py
+++ b/django/contrib/auth/decorators.py
@@ -26,3 +26,11 @@ login_required.__doc__ = (
to the log-in page if necessary.
"""
)
+
+def permission_required(perm, login_url=LOGIN_URL):
+ """
+ Decorator for views that checks if a user has a particular permission
+ enabled, redirectiing to the log-in page if necessary.
+ """
+ return user_passes_test(lambda u: u.has_perm(perm), login_url=login_url)
+
diff --git a/django/contrib/auth/handlers/modpython.py b/django/contrib/auth/handlers/modpython.py
index e6719794a1..c7d921313d 100644
--- a/django/contrib/auth/handlers/modpython.py
+++ b/django/contrib/auth/handlers/modpython.py
@@ -22,6 +22,8 @@ def authenhandler(req, **kwargs):
os.environ['DJANGO_SETTINGS_MODULE'] = settings_module
from django.contrib.auth.models import User
+ from django import db
+ db.reset_queries()
# check that the username is valid
kwargs = {'username': req.user, 'is_active': True}
@@ -30,18 +32,21 @@ def authenhandler(req, **kwargs):
if superuser_only:
kwargs['is_superuser'] = True
try:
- user = User.objects.get(**kwargs)
- except User.DoesNotExist:
- return apache.HTTP_UNAUTHORIZED
-
- # check the password and any permission given
- if user.check_password(req.get_basic_auth_pw()):
- if permission_name:
- if user.has_perm(permission_name):
- return apache.OK
+ try:
+ user = User.objects.get(**kwargs)
+ except User.DoesNotExist:
+ return apache.HTTP_UNAUTHORIZED
+
+ # check the password and any permission given
+ if user.check_password(req.get_basic_auth_pw()):
+ if permission_name:
+ if user.has_perm(permission_name):
+ return apache.OK
+ else:
+ return apache.HTTP_UNAUTHORIZED
else:
- return apache.HTTP_UNAUTHORIZED
+ return apache.OK
else:
- return apache.OK
- else:
- return apache.HTTP_UNAUTHORIZED
+ return apache.HTTP_UNAUTHORIZED
+ finally:
+ db.connection.close()
diff --git a/django/contrib/auth/middleware.py b/django/contrib/auth/middleware.py
index a6a60780a7..42dc15a366 100644
--- a/django/contrib/auth/middleware.py
+++ b/django/contrib/auth/middleware.py
@@ -1,12 +1,9 @@
class LazyUser(object):
- def __init__(self):
- self._user = None
-
def __get__(self, request, obj_type=None):
- if self._user is None:
+ if not hasattr(request, '_cached_user'):
from django.contrib.auth import get_user
- self._user = get_user(request)
- return self._user
+ request._cached_user = get_user(request)
+ return request._cached_user
class AuthenticationMiddleware(object):
def process_request(self, request):
diff --git a/django/contrib/auth/templatetags/auth.py b/django/contrib/auth/templatetags/auth.py
index e40425d64a..31b95bf714 100644
--- a/django/contrib/auth/templatetags/auth.py
+++ b/django/contrib/auth/templatetags/auth.py
@@ -1,5 +1,6 @@
from django import template
from django.template import loader
+from django.conf import settings
register = template.Library()
@@ -28,28 +29,28 @@ def if_has_perm(parser, token):
else:
nodelist_false = template.NodeList()
- object = None
+ object_var = None
not_flag = False
if tokens[1] is "not":
not_flag = True
permission=tokens[2]
if len(tokens)>3:
- object=tokens[3]
+ object_var = parser.compile_filter(tokens[3])
else:
permission=tokens[1]
if len(tokens)>2:
- object=tokens[2]
+ object_var = parser.compile_filter(tokens[2])
if not (permission[0] == permission[-1] and permission[0] in ('"', "'")):
raise template.TemplateSyntaxError, "%r tag's argument should be in quotes" % tokens[0]
-
- return HasPermNode(permission[1:-1], not_flag, object, nodelist_true, nodelist_false)
+
+ return HasPermNode(permission[1:-1], not_flag, object_var, nodelist_true, nodelist_false)
class HasPermNode(template.Node):
- def __init__(self, permission, not_flag, object, nodelist_true, nodelist_false):
+ def __init__(self, permission, not_flag, object_var, nodelist_true, nodelist_false):
self.permission = permission
self.not_flag = not_flag
- self.object_name = object
+ self.object_var = object_var
self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false
def __repr__(self):
@@ -70,21 +71,20 @@ class HasPermNode(template.Node):
return nodes
def render(self, context):
- if self.object_name:
+ if self.object_var:
try:
- object = template.resolve_variable(self.object_name, context)
+ object = self.object_var.resolve(context)
except template.VariableDoesNotExist:
- return ''
+ object = None
else:
object=None
try:
user = template.resolve_variable("user", context)
except template.VariableDoesNotExist:
- return ''
+ return settings.TEMPLATE_STRING_IF_INVALID
bool_perm = user.has_perm(self.permission, object=object)
-
if (self.not_flag and not bool_perm) or (not self.not_flag and bool_perm):
return self.nodelist_true.render(context)
if (self.not_flag and bool_perm) or (not self.not_flag and not bool_perm):
diff --git a/django/core/context_processors.py b/django/core/context_processors.py
index 2ae9a6d972..f4b288dfc4 100644
--- a/django/core/context_processors.py
+++ b/django/core/context_processors.py
@@ -51,15 +51,19 @@ def request(request):
class PermLookupDict(object):
def __init__(self, user, module_name):
self.user, self.module_name = user, module_name
+
def __repr__(self):
- return str(self.user.get_permission_list())
+ return str(self.user.get_all_permissions())
+
def __getitem__(self, perm_name):
return self.user.has_perm("%s.%s" % (self.module_name, perm_name))
+
def __nonzero__(self):
return self.user.has_module_perms(self.module_name)
class PermWrapper(object):
def __init__(self, user):
self.user = user
+
def __getitem__(self, module_name):
return PermLookupDict(self.user, module_name)
diff --git a/django/core/handlers/modpython.py b/django/core/handlers/modpython.py
index 07c98e3b59..db3c33147b 100644
--- a/django/core/handlers/modpython.py
+++ b/django/core/handlers/modpython.py
@@ -155,8 +155,11 @@ def populate_apache_request(http_response, mod_python_req):
for c in http_response.cookies.values():
mod_python_req.headers_out.add('Set-Cookie', c.output(header=''))
mod_python_req.status = http_response.status_code
- for chunk in http_response.iterator:
- mod_python_req.write(chunk)
+ try:
+ for chunk in http_response:
+ mod_python_req.write(chunk)
+ finally:
+ http_response.close()
def handler(req):
# mod_python hooks into this function.
diff --git a/django/core/handlers/wsgi.py b/django/core/handlers/wsgi.py
index 5c48c9dace..87e67e9c5b 100644
--- a/django/core/handlers/wsgi.py
+++ b/django/core/handlers/wsgi.py
@@ -4,6 +4,11 @@ from django.dispatch import dispatcher
from django.utils import datastructures
from django import http
from pprint import pformat
+from shutil import copyfileobj
+try:
+ from cStringIO import StringIO
+except ImportError:
+ from StringIO import StringIO
# See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
STATUS_CODE_TEXT = {
@@ -50,6 +55,21 @@ STATUS_CODE_TEXT = {
505: 'HTTP VERSION NOT SUPPORTED',
}
+def safe_copyfileobj(fsrc, fdst, length=16*1024, size=0):
+ """
+ A version of shutil.copyfileobj that will not read more than 'size' bytes.
+ This makes it safe from clients sending more than CONTENT_LENGTH bytes of
+ data in the body.
+ """
+ if not size:
+ return copyfileobj(fsrc, fdst, length)
+ while size > 0:
+ buf = fsrc.read(min(length, size))
+ if not buf:
+ break
+ fdst.write(buf)
+ size -= len(buf)
+
class WSGIRequest(http.HttpRequest):
def __init__(self, environ):
self.environ = environ
@@ -119,7 +139,11 @@ class WSGIRequest(http.HttpRequest):
try:
return self._raw_post_data
except AttributeError:
- self._raw_post_data = self.environ['wsgi.input'].read(int(self.environ["CONTENT_LENGTH"]))
+ buf = StringIO()
+ content_length = int(self.environ['CONTENT_LENGTH'])
+ safe_copyfileobj(self.environ['wsgi.input'], buf, size=content_length)
+ self._raw_post_data = buf.getvalue()
+ buf.close()
return self._raw_post_data
GET = property(_get_get, _set_get)
@@ -163,4 +187,4 @@ class WSGIHandler(BaseHandler):
for c in response.cookies.values():
response_headers.append(('Set-Cookie', c.output(header='')))
start_response(status, response_headers)
- return response.iterator
+ return response
diff --git a/django/core/management.py b/django/core/management.py
index 799ec30d2c..6274d81b1b 100644
--- a/django/core/management.py
+++ b/django/core/management.py
@@ -492,7 +492,7 @@ def syncdb(verbosity=2, interactive=True):
# to do at this point.
for app in models.get_apps():
dispatcher.send(signal=signals.post_syncdb, sender=app,
- app=app, created_models=created_models,
+ app=app, created_models=created_models,
verbosity=verbosity, interactive=interactive)
# Install initial data for the app (but only if this is a model we've
@@ -552,7 +552,7 @@ def diffsettings():
# Inspired by Postfix's "postconf -n".
from django.conf import settings, global_settings
- user_settings = _module_to_dict(settings)
+ user_settings = _module_to_dict(settings._target)
default_settings = _module_to_dict(global_settings)
output = []
@@ -903,27 +903,32 @@ def get_validation_errors(outfile, app=None):
rel_name = RelatedObject(f.rel.to, cls, f).get_accessor_name()
rel_query_name = f.related_query_name()
- for r in rel_opts.fields:
- if r.name == rel_name:
- e.add(opts, "Accessor for m2m field '%s' clashes with field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
- if r.name == rel_query_name:
- e.add(opts, "Reverse query name for m2m field '%s' clashes with field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
- for r in rel_opts.many_to_many:
- if r.name == rel_name:
- e.add(opts, "Accessor for m2m field '%s' clashes with m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
- if r.name == rel_query_name:
- e.add(opts, "Reverse query name for m2m field '%s' clashes with m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
- for r in rel_opts.get_all_related_many_to_many_objects():
- if r.field is not f:
+ # If rel_name is none, there is no reverse accessor.
+ # (This only occurs for symmetrical m2m relations to self).
+ # If this is the case, there are no clashes to check for this field, as
+ # there are no reverse descriptors for this field.
+ if rel_name is not None:
+ for r in rel_opts.fields:
+ if r.name == rel_name:
+ e.add(opts, "Accessor for m2m field '%s' clashes with field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
+ if r.name == rel_query_name:
+ e.add(opts, "Reverse query name for m2m field '%s' clashes with field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
+ for r in rel_opts.many_to_many:
+ if r.name == rel_name:
+ e.add(opts, "Accessor for m2m field '%s' clashes with m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
+ if r.name == rel_query_name:
+ e.add(opts, "Reverse query name for m2m field '%s' clashes with m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
+ for r in rel_opts.get_all_related_many_to_many_objects():
+ if r.field is not f:
+ if r.get_accessor_name() == rel_name:
+ e.add(opts, "Accessor for m2m field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
+ if r.get_accessor_name() == rel_query_name:
+ e.add(opts, "Reverse query name for m2m field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
+ for r in rel_opts.get_all_related_objects():
if r.get_accessor_name() == rel_name:
- e.add(opts, "Accessor for m2m field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
+ e.add(opts, "Accessor for m2m field '%s' clashes with related field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
if r.get_accessor_name() == rel_query_name:
- e.add(opts, "Reverse query name for m2m field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
- for r in rel_opts.get_all_related_objects():
- if r.get_accessor_name() == rel_name:
- e.add(opts, "Accessor for m2m field '%s' clashes with related field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
- if r.get_accessor_name() == rel_query_name:
- e.add(opts, "Reverse query name for m2m field '%s' clashes with related field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
+ e.add(opts, "Reverse query name for m2m field '%s' clashes with related field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
# Check admin attribute.
if opts.admin is not None:
@@ -953,7 +958,8 @@ def get_validation_errors(outfile, app=None):
try:
f = opts.get_field(fn)
except models.FieldDoesNotExist:
- e.add(opts, '"admin.list_filter" refers to %r, which isn\'t a field.' % fn)
+ if not hasattr(cls, fn):
+ e.add(opts, '"admin.list_display_links" refers to %r, which isn\'t an attribute, method or property.' % fn)
if fn not in opts.admin.list_display:
e.add(opts, '"admin.list_display_links" refers to %r, which is not defined in "admin.list_display".' % fn)
# list_filter
@@ -1011,10 +1017,12 @@ def get_validation_errors(outfile, app=None):
return len(e.errors)
-def validate(outfile=sys.stdout):
+def validate(outfile=sys.stdout, silent_success=False):
"Validates all installed models."
try:
num_errors = get_validation_errors(outfile)
+ if silent_success and num_errors == 0:
+ return
outfile.write('%s error%s found.\n' % (num_errors, num_errors != 1 and 's' or ''))
except ImproperlyConfigured:
outfile.write("Skipping validation because things aren't configured properly.")
@@ -1167,7 +1175,7 @@ def test(verbosity, app_labels):
app_list = get_apps()
else:
app_list = [get_app(app_label) for app_label in app_labels]
-
+
test_path = settings.TEST_RUNNER.split('.')
# Allow for Python 2.5 relative paths
if len(test_path) > 1:
@@ -1176,7 +1184,7 @@ def test(verbosity, app_labels):
test_module_name = '.'
test_module = __import__(test_module_name, [],[],test_path[-1])
test_runner = getattr(test_module, test_path[-1])
-
+
test_runner(app_list, verbosity)
test.help_doc = 'Runs the test suite for the specified applications, or the entire site if no apps are specified'
test.args = '[--verbosity] ' + APP_ARGS
@@ -1331,6 +1339,7 @@ def execute_from_command_line(action_mapping=DEFAULT_ACTION_MAPPING, argv=None):
action_mapping[action](args[1:])
else:
from django.db import models
+ validate(silent_success=True)
try:
mod_list = [models.get_app(app_label) for app_label in args[1:]]
except ImportError, e:
diff --git a/django/core/serializers/json.py b/django/core/serializers/json.py
index 72234a624b..15770f160e 100644
--- a/django/core/serializers/json.py
+++ b/django/core/serializers/json.py
@@ -16,7 +16,7 @@ class Serializer(PythonSerializer):
Convert a queryset to JSON.
"""
def end_serialization(self):
- simplejson.dump(self.objects, self.stream, cls=DateTimeAwareJSONEncoder)
+ simplejson.dump(self.objects, self.stream, cls=DateTimeAwareJSONEncoder, **self.options)
def getvalue(self):
return self.stream.getvalue()
diff --git a/django/core/servers/fastcgi.py b/django/core/servers/fastcgi.py
index dedc1f8ba1..c6507fe173 100644
--- a/django/core/servers/fastcgi.py
+++ b/django/core/servers/fastcgi.py
@@ -74,8 +74,9 @@ def fastcgi_help(message=None):
print message
return False
-def runfastcgi(argset):
+def runfastcgi(argset=[], **kwargs):
options = FASTCGI_OPTIONS.copy()
+ options.update(kwargs)
for x in argset:
if "=" in x:
k, v = x.split('=', 1)
diff --git a/django/core/validators.py b/django/core/validators.py
index 8f40ceb51a..705425ea18 100644
--- a/django/core/validators.py
+++ b/django/core/validators.py
@@ -227,9 +227,8 @@ def hasNoProfanities(field_data, all_data):
catch 'motherfucker' as well. Raises a ValidationError such as:
Watch your mouth! The words "f--k" and "s--t" are not allowed here.
"""
- bad_words = ['asshat', 'asshead', 'asshole', 'cunt', 'fuck', 'gook', 'nigger', 'shit'] # all in lower case
field_data = field_data.lower() # normalize
- words_seen = [w for w in bad_words if field_data.find(w) > -1]
+ words_seen = [w for w in settings.PROFANITIES_LIST if field_data.find(w) > -1]
if words_seen:
from django.utils.text import get_text_list
plural = len(words_seen) > 1
@@ -352,10 +351,12 @@ class IsValidFloat(object):
float(data)
except ValueError:
raise ValidationError, gettext("Please enter a valid decimal number.")
- if len(data) > (self.max_digits + 1):
+ # Negative floats require more space to input.
+ max_allowed_length = data.startswith('-') and (self.max_digits + 2) or (self.max_digits + 1)
+ if len(data) > max_allowed_length:
raise ValidationError, ngettext("Please enter a valid decimal number with at most %s total digit.",
"Please enter a valid decimal number with at most %s total digits.", self.max_digits) % self.max_digits
- if (not '.' in data and len(data) > (self.max_digits - self.decimal_places)) or ('.' in data and len(data) > (self.max_digits - (self.decimal_places - len(data.split('.')[1])) + 1)):
+ if (not '.' in data and len(data) > (max_allowed_length - self.decimal_places)) or ('.' in data and len(data) > (self.max_digits - (self.decimal_places - len(data.split('.')[1])) + 1)):
raise ValidationError, ngettext( "Please enter a valid decimal number with a whole part of at most %s digit.",
"Please enter a valid decimal number with a whole part of at most %s digits.", str(self.max_digits-self.decimal_places)) % str(self.max_digits-self.decimal_places)
if '.' in data and len(data.split('.')[1]) > self.decimal_places:
diff --git a/django/core/xheaders.py b/django/core/xheaders.py
index e173bcbca8..69f6115839 100644
--- a/django/core/xheaders.py
+++ b/django/core/xheaders.py
@@ -13,9 +13,10 @@ def populate_xheaders(request, response, model, object_id):
"""
Adds the "X-Object-Type" and "X-Object-Id" headers to the given
HttpResponse according to the given model and object_id -- but only if the
- given HttpRequest object has an IP address within the INTERNAL_IPS setting.
+ given HttpRequest object has an IP address within the INTERNAL_IPS setting
+ or if the request is from a logged in staff member.
"""
from django.conf import settings
- if request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS:
+ if request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS or (request.user.is_authenticated() and request.user.is_staff):
response['X-Object-Type'] = "%s.%s" % (model._meta.app_label, model._meta.object_name.lower())
response['X-Object-Id'] = str(object_id)
diff --git a/django/db/backends/mysql/introspection.py b/django/db/backends/mysql/introspection.py
index 2c77f76ee3..7829457fa9 100644
--- a/django/db/backends/mysql/introspection.py
+++ b/django/db/backends/mysql/introspection.py
@@ -36,13 +36,14 @@ def get_relations(cursor, table_name):
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" % table_name)
+ cursor.execute("SHOW CREATE TABLE %s" % quote_name(table_name))
for row in cursor.fetchall():
pos = 0
while True:
diff --git a/django/db/backends/util.py b/django/db/backends/util.py
index 88318941c8..3ec1b41485 100644
--- a/django/db/backends/util.py
+++ b/django/db/backends/util.py
@@ -110,9 +110,11 @@ def dictfetchone(cursor):
def dictfetchmany(cursor, number):
"Returns a certain number of rows from a cursor as a dict"
desc = cursor.description
- return [_dict_helper(desc, row) for row in cursor.fetchmany(number)]
+ for row in cursor.fetchmany(number):
+ yield _dict_helper(desc, row)
def dictfetchall(cursor):
"Returns all rows from a cursor as a dict"
desc = cursor.description
- return [_dict_helper(desc, row) for row in cursor.fetchall()]
+ for row in cursor.fetchall():
+ yield _dict_helper(desc, row)
diff --git a/django/db/models/related.py b/django/db/models/related.py
index ee3b916cf4..ac1ec50ca2 100644
--- a/django/db/models/related.py
+++ b/django/db/models/related.py
@@ -131,6 +131,9 @@ class RelatedObject(object):
# many-to-many objects. It uses the lower-cased object_name + "_set",
# but this can be overridden with the "related_name" option.
if self.field.rel.multiple:
+ # If this is a symmetrical m2m relation on self, there is no reverse accessor.
+ if getattr(self.field.rel, 'symmetrical', False) and self.model == self.parent_model:
+ return None
return self.field.rel.related_name or (self.opts.object_name.lower() + '_set')
else:
return self.field.rel.related_name or (self.opts.object_name.lower())
diff --git a/django/forms/__init__.py b/django/forms/__init__.py
index 730f7a54da..537a109527 100644
--- a/django/forms/__init__.py
+++ b/django/forms/__init__.py
@@ -434,11 +434,11 @@ class HiddenField(FormField):
(self.get_id(), self.field_name, escape(data))
class CheckboxField(FormField):
- def __init__(self, field_name, checked_by_default=False, validator_list=None):
+ def __init__(self, field_name, checked_by_default=False, validator_list=None, is_required=False):
if validator_list is None: validator_list = []
self.field_name = field_name
self.checked_by_default = checked_by_default
- self.is_required = False # because the validator looks for these
+ self.is_required = is_required
self.validator_list = validator_list[:]
def render(self, data):
@@ -639,8 +639,8 @@ class CheckboxSelectMultipleField(SelectMultipleField):
checked_html = ' checked="checked"'
field_name = '%s%s' % (self.field_name, value)
output.append('<li><input type="checkbox" id="%s" class="v%s" name="%s"%s /> <label for="%s">%s</label></li>' % \
- (self.get_id() + value , self.__class__.__name__, field_name, checked_html,
- self.get_id() + value, choice))
+ (self.get_id() + escape(value), self.__class__.__name__, field_name, checked_html,
+ self.get_id() + escape(value), choice))
output.append('</ul>')
return '\n'.join(output)
@@ -743,7 +743,7 @@ class FloatField(TextField):
if validator_list is None: validator_list = []
self.max_digits, self.decimal_places = max_digits, decimal_places
validator_list = [self.isValidFloat] + validator_list
- TextField.__init__(self, field_name, max_digits+1, max_digits+1, is_required, validator_list)
+ TextField.__init__(self, field_name, max_digits+2, max_digits+2, is_required, validator_list)
def isValidFloat(self, field_data, all_data):
v = validators.IsValidFloat(self.max_digits, self.decimal_places)
@@ -952,10 +952,7 @@ class USStateField(TextField):
raise validators.CriticalValidationError, e.messages
def html2python(data):
- if data:
- return data.upper() # Should always be stored in upper case
- else:
- return None
+ return data.upper() # Should always be stored in upper case
html2python = staticmethod(html2python)
class CommaSeparatedIntegerField(TextField):
@@ -972,9 +969,19 @@ class CommaSeparatedIntegerField(TextField):
except validators.ValidationError, e:
raise validators.CriticalValidationError, e.messages
+ def render(self, data):
+ if data is None:
+ data = ''
+ elif isinstance(data, (list, tuple)):
+ data = ','.join(data)
+ return super(CommaSeparatedIntegerField, self).render(data)
+
class RawIdAdminField(CommaSeparatedIntegerField):
def html2python(data):
- return data.split(',')
+ if data:
+ return data.split(',')
+ else:
+ return []
html2python = staticmethod(html2python)
class XMLLargeTextField(LargeTextField):
diff --git a/django/http/__init__.py b/django/http/__init__.py
index c4ac302ec5..bb0e973aae 100644
--- a/django/http/__init__.py
+++ b/django/http/__init__.py
@@ -161,10 +161,10 @@ class HttpResponse(object):
if not mimetype:
mimetype = "%s; charset=%s" % (settings.DEFAULT_CONTENT_TYPE, settings.DEFAULT_CHARSET)
if hasattr(content, '__iter__'):
- self._iterator = content
+ self._container = content
self._is_string = False
else:
- self._iterator = [content]
+ self._container = [content]
self._is_string = True
self.headers = {'Content-Type': mimetype}
self.cookies = SimpleCookie()
@@ -213,32 +213,37 @@ class HttpResponse(object):
self.cookies[key]['max-age'] = 0
def _get_content(self):
- content = ''.join(self._iterator)
+ content = ''.join(self._container)
if isinstance(content, unicode):
content = content.encode(self._charset)
return content
def _set_content(self, value):
- self._iterator = [value]
+ self._container = [value]
self._is_string = True
content = property(_get_content, _set_content)
- def _get_iterator(self):
- "Output iterator. Converts data into client charset if necessary."
- for chunk in self._iterator:
- if isinstance(chunk, unicode):
- chunk = chunk.encode(self._charset)
- yield chunk
+ def __iter__(self):
+ self._iterator = self._container.__iter__()
+ return self
- iterator = property(_get_iterator)
+ def next(self):
+ chunk = self._iterator.next()
+ if isinstance(chunk, unicode):
+ chunk = chunk.encode(self._charset)
+ return chunk
+
+ def close(self):
+ if hasattr(self._container, 'close'):
+ self._container.close()
# The remaining methods partially implement the file-like object interface.
# See http://docs.python.org/lib/bltin-file-objects.html
def write(self, content):
if not self._is_string:
raise Exception, "This %s instance is not writable" % self.__class__
- self._iterator.append(content)
+ self._container.append(content)
def flush(self):
pass
@@ -246,7 +251,7 @@ class HttpResponse(object):
def tell(self):
if not self._is_string:
raise Exception, "This %s instance cannot tell its position" % self.__class__
- return sum([len(chunk) for chunk in self._iterator])
+ return sum([len(chunk) for chunk in self._container])
class HttpResponseRedirect(HttpResponse):
def __init__(self, redirect_to):
diff --git a/django/middleware/common.py b/django/middleware/common.py
index d63b71fed7..4f060b8590 100644
--- a/django/middleware/common.py
+++ b/django/middleware/common.py
@@ -64,8 +64,9 @@ class CommonMiddleware(object):
is_internal = referer and (domain in referer)
path = request.get_full_path()
if referer and not _is_ignorable_404(path) and (is_internal or '?' not in referer):
+ ua = request.META.get('HTTP_USER_AGENT','<none>')
mail_managers("Broken %slink on %s" % ((is_internal and 'INTERNAL ' or ''), domain),
- "Referrer: %s\nRequested URL: %s\n" % (referer, request.get_full_path()))
+ "Referrer: %s\nRequested URL: %s\nUser Agent: %s\n" % (referer, request.get_full_path(), ua))
return response
# Use ETags, if requested.
diff --git a/django/middleware/doc.py b/django/middleware/doc.py
index 6600e588cd..48c155c392 100644
--- a/django/middleware/doc.py
+++ b/django/middleware/doc.py
@@ -7,11 +7,12 @@ class XViewMiddleware(object):
"""
def process_view(self, request, view_func, view_args, view_kwargs):
"""
- If the request method is HEAD and the IP is internal, quickly return
- with an x-header indicating the view function. This is used by the
- documentation module to lookup the view function for an arbitrary page.
+ If the request method is HEAD and either the IP is internal or the
+ user is a logged-in staff member, quickly return with an x-header
+ indicating the view function. This is used by the documentation module
+ to lookup the view function for an arbitrary page.
"""
- if request.method == 'HEAD' and request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS:
+ if request.method == 'HEAD' and (request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS or (request.user.is_authenticated() and request.user.is_staff)):
response = http.HttpResponse()
response['X-View'] = "%s.%s" % (view_func.__module__, view_func.__name__)
return response
diff --git a/django/template/defaultfilters.py b/django/template/defaultfilters.py
index a2e9d2f405..cf1d3d5f6d 100644
--- a/django/template/defaultfilters.py
+++ b/django/template/defaultfilters.py
@@ -15,7 +15,7 @@ register = Library()
def addslashes(value):
"Adds slashes - useful for passing strings to JavaScript, for example."
- return value.replace('"', '\\"').replace("'", "\\'")
+ return value.replace('\\', '\\\\').replace('"', '\\"').replace("'", "\\'")
def capfirst(value):
"Capitalizes the first character of the value"
diff --git a/django/template/defaulttags.py b/django/template/defaulttags.py
index 691b40f332..07e579bf9d 100644
--- a/django/template/defaulttags.py
+++ b/django/template/defaulttags.py
@@ -13,14 +13,18 @@ class CommentNode(Node):
return ''
class CycleNode(Node):
- def __init__(self, cyclevars):
+ def __init__(self, cyclevars, variable_name=None):
self.cyclevars = cyclevars
self.cyclevars_len = len(cyclevars)
self.counter = -1
+ self.variable_name = variable_name
def render(self, context):
self.counter += 1
- return self.cyclevars[self.counter % self.cyclevars_len]
+ value = self.cyclevars[self.counter % self.cyclevars_len]
+ if self.variable_name:
+ context[self.variable_name] = value
+ return value
class DebugNode(Node):
def render(self, context):
@@ -125,6 +129,8 @@ class IfChangedNode(Node):
self._last_seen = None
def render(self, context):
+ if context.has_key('forloop') and context['forloop']['first']:
+ self._last_seen = None
content = self.nodelist.render(context)
if content != self._last_seen:
firstloop = (self._last_seen == None)
@@ -385,7 +391,7 @@ def cycle(parser, token):
raise TemplateSyntaxError("Second 'cycle' argument must be 'as'")
cyclevars = [v for v in args[1].split(",") if v] # split and kill blanks
name = args[3]
- node = CycleNode(cyclevars)
+ node = CycleNode(cyclevars, name)
if not hasattr(parser, '_namedCycleNodes'):
parser._namedCycleNodes = {}
diff --git a/django/test/simple.py b/django/test/simple.py
index 043787414e..628fa464d2 100644
--- a/django/test/simple.py
+++ b/django/test/simple.py
@@ -38,10 +38,23 @@ def build_suite(app_module):
except ValueError:
# No doc tests in tests.py
pass
- except ImportError:
- # No tests.py file for application
- pass
-
+ except ImportError, e:
+ # Couldn't import tests.py. Was it due to a missing file, or
+ # due to an import error in a tests.py that actually exists?
+ import os.path
+ from imp import find_module
+ try:
+ mod = find_module(TEST_MODULE, [os.path.dirname(app_module.__file__)])
+ except ImportError:
+ # 'tests' module doesn't exist. Move on.
+ pass
+ else:
+ # The module exists, so there must be an import error in the
+ # test module itself. We don't need the module; close the file
+ # handle returned by find_module.
+ mod[0].close()
+ raise
+
return suite
def run_tests(module_list, verbosity=1, extra_tests=[]):
diff --git a/django/utils/datastructures.py b/django/utils/datastructures.py
index 6aef313d35..cecb4da170 100644
--- a/django/utils/datastructures.py
+++ b/django/utils/datastructures.py
@@ -14,6 +14,9 @@ class MergeDict(object):
pass
raise KeyError
+ def __contains__(self, key):
+ return self.has_key(key)
+
def get(self, key, default):
try:
return self[key]
diff --git a/django/utils/functional.py b/django/utils/functional.py
index d1514d5728..e3c0a3c76b 100644
--- a/django/utils/functional.py
+++ b/django/utils/functional.py
@@ -1,6 +1,6 @@
-def curry(*args, **kwargs):
+def curry(_curried_func, *args, **kwargs):
def _curried(*moreargs, **morekwargs):
- return args[0](*(args[1:]+moreargs), **dict(kwargs.items() + morekwargs.items()))
+ return _curried_func(*(args+moreargs), **dict(kwargs, **morekwargs))
return _curried
class Promise:
diff --git a/django/utils/text.py b/django/utils/text.py
index 7df9bc03b7..9e7bb3b6c4 100644
--- a/django/utils/text.py
+++ b/django/utils/text.py
@@ -94,7 +94,8 @@ def compress_string(s):
return zbuf.getvalue()
ustring_re = re.compile(u"([\u0080-\uffff])")
-def javascript_quote(s):
+
+def javascript_quote(s, quote_double_quotes=False):
def fix(match):
return r"\u%04x" % ord(match.group(1))
@@ -104,9 +105,12 @@ def javascript_quote(s):
elif type(s) != unicode:
raise TypeError, s
s = s.replace('\\', '\\\\')
+ s = s.replace('\r', '\\r')
s = s.replace('\n', '\\n')
s = s.replace('\t', '\\t')
s = s.replace("'", "\\'")
+ if quote_double_quotes:
+ s = s.replace('"', '&quot;')
return str(ustring_re.sub(fix, s))
smart_split_re = re.compile('("(?:[^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'(?:[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'|[^\\s]+)')
diff --git a/docs/authentication.txt b/docs/authentication.txt
index d10dda28ef..31a894512a 100644
--- a/docs/authentication.txt
+++ b/docs/authentication.txt
@@ -82,14 +82,14 @@ Methods
``user_permissions``. ``User`` objects can access their related
objects in the same way as any other `Django model`_::
- myuser.objects.groups = [group_list]
- myuser.objects.groups.add(group, group,...)
- myuser.objects.groups.remove(group, group,...)
- myuser.objects.groups.clear()
- myuser.objects.permissions = [permission_list]
- myuser.objects.permissions.add(permission, permission, ...)
- myuser.objects.permissions.remove(permission, permission, ...]
- myuser.objects.permissions.clear()
+ myuser.groups = [group_list]
+ myuser.groups.add(group, group,...)
+ myuser.groups.remove(group, group,...)
+ myuser.groups.clear()
+ myuser.permissions = [permission_list]
+ myuser.permissions.add(permission, permission, ...)
+ myuser.permissions.remove(permission, permission, ...]
+ myuser.permissions.clear()
In addition to those automatic API methods, ``User`` objects have the following
custom methods:
@@ -456,6 +456,10 @@ As a shortcut, you can use the convenient ``user_passes_test`` decorator::
# ...
my_view = user_passes_test(lambda u: u.has_perm('polls.can_vote'))(my_view)
+We are using this particular test as a relatively simple example, however be
+aware that if you just want to test if a permission is available to a user,
+you can use the ``permission_required()`` decorator described below.
+
Here's the same thing, using Python 2.4's decorator syntax::
from django.contrib.auth.decorators import user_passes_test
@@ -488,6 +492,24 @@ Example in Python 2.4 syntax::
def my_view(request):
# ...
+The permission_required decorator
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Since checking whether a user has a particular permission available to them is a
+relatively common operation, Django provides a shortcut for that particular
+case: the ``permission_required()`` decorator. Using this decorator, the
+earlier example can be written as::
+
+ from django.contrib.auth.decorators import permission_required
+
+ def my_view(request):
+ # ...
+
+ my_view = permission_required('polls.can_vote')(my_view)
+
+Note that ``permission_required()`` also takes an optional ``login_url``
+parameter.
+
Limiting access to generic views
--------------------------------
@@ -677,7 +699,7 @@ timestamps.
Messages are used by the Django admin after successful actions. For example,
``"The poll Foo was created successfully."`` is a message.
-The API is simple::
+The API is simple:
* To create a new message, use
``user_obj.message_set.create(message='message_text')``.
diff --git a/docs/contributing.txt b/docs/contributing.txt
index 3d101c3241..7ecda7425c 100644
--- a/docs/contributing.txt
+++ b/docs/contributing.txt
@@ -247,18 +247,23 @@ Django tarball. It's our policy to make sure all tests pass at all times.
The tests cover:
- * Models and the database API (``tests/testapp/models``).
- * The cache system (``tests/otherthests/cache.py``).
- * The ``django.utils.dateformat`` module (``tests/othertests/dateformat.py``).
- * Database typecasts (``tests/othertests/db_typecasts.py``).
- * The template system (``tests/othertests/templates.py`` and
- ``tests/othertests/defaultfilters.py``).
- * ``QueryDict`` objects (``tests/othertests/httpwrappers.py``).
- * Markup template tags (``tests/othertests/markup.py``).
- * The ``django.utils.timesince`` module (``tests/othertests/timesince.py``).
+ * Models and the database API (``tests/modeltests/``).
+ * The cache system (``tests/regressiontests/cache.py``).
+ * The ``django.utils.dateformat`` module (``tests/regressiontests/dateformat/``).
+ * Database typecasts (``tests/regressiontests/db_typecasts/``).
+ * The template system (``tests/regressiontests/templates/`` and
+ ``tests/regressiontests/defaultfilters/``).
+ * ``QueryDict`` objects (``tests/regressiontests/httpwrappers/``).
+ * Markup template tags (``tests/regressiontests/markup/``).
We appreciate any and all contributions to the test suite!
+The Django tests all use the testing infrastructure that ships with Django for
+testing applications. See `Testing Django Applications`_ for an explanation of
+how to write new tests.
+
+.. _Testing Django Applications: http://www.djangoproject.com/documentation/testing/
+
Running the unit tests
----------------------
@@ -268,10 +273,14 @@ To run the tests, ``cd`` to the ``tests/`` directory and type::
Yes, the unit tests need a settings module, but only for database connection
info -- the ``DATABASE_ENGINE``, ``DATABASE_USER`` and ``DATABASE_PASSWORD``.
-
-The unit tests will not touch your database; they create a new database, called
-``django_test_db``, which is deleted when the tests are finished. This means
-your user account needs permission to execute ``CREATE DATABASE``.
+You will also need a ``ROOT_URLCONF`` setting (it's value is ignored; it just
+needs to be present) and a ``SITE_ID`` setting (any integer value will do) in
+order for all the tests to pass.
+
+The unit tests will not touch your existing databases; they create a new
+database, called ``django_test_db``, which is deleted when the tests are
+finished. This means your user account needs permission to execute ``CREATE
+DATABASE``.
Requesting features
===================
diff --git a/docs/db-api.txt b/docs/db-api.txt
index bd178dbd7d..7800ff324a 100644
--- a/docs/db-api.txt
+++ b/docs/db-api.txt
@@ -1511,7 +1511,7 @@ Many-to-many relationships
--------------------------
Both ends of a many-to-many relationship get automatic API access to the other
-end. The API works just as a "backward" one-to-many relationship. See _Backward
+end. The API works just as a "backward" one-to-many relationship. See Backward_
above.
The only difference is in the attribute naming: The model that defines the
diff --git a/docs/django-admin.txt b/docs/django-admin.txt
index 672200c5e7..ffafc83972 100644
--- a/docs/django-admin.txt
+++ b/docs/django-admin.txt
@@ -295,6 +295,8 @@ give you the option of creating a superuser immediately.
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/
@@ -348,6 +350,8 @@ options.
--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.
@@ -369,6 +373,8 @@ Example output::
--verbosity
-----------
+**New in Django development version**
+
Example usage::
django-admin.py syncdb --verbosity=2
diff --git a/docs/fastcgi.txt b/docs/fastcgi.txt
index 41d50d97a1..e2f4e933b4 100644
--- a/docs/fastcgi.txt
+++ b/docs/fastcgi.txt
@@ -270,7 +270,7 @@ In your Web root directory, add this to a file named ``.htaccess`` ::
AddHandler fastcgi-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
- RewriteRule ^/(.*)$ /mysite.fcgi/$1 [QSA,L]
+ RewriteRule ^(.*)$ mysite.fcgi/$1 [QSA,L]
Then, create a small script that tells Apache how to spawn your FastCGI
program. Create a file ``mysite.fcgi`` and place it in your Web directory, and
@@ -289,7 +289,7 @@ be sure to make it executable ::
os.environ['DJANGO_SETTINGS_MODULE'] = "myproject.settings"
from django.core.servers.fastcgi import runfastcgi
- runfastcgi(["method=threaded", "daemonize=false"])
+ runfastcgi(method="threaded", daemonize="false")
Restarting the spawned server
-----------------------------
diff --git a/docs/forms.txt b/docs/forms.txt
index 67408f3c5d..0ffb0bdcb7 100644
--- a/docs/forms.txt
+++ b/docs/forms.txt
@@ -136,7 +136,7 @@ template::
{% endblock %}
Before we get back to the problems with these naive set of views, let's go over
-some salient points of the above template::
+some salient points of the above template:
* Field "widgets" are handled for you: ``{{ form.field }}`` automatically
creates the "right" type of widget for the form, as you can see with the
@@ -148,8 +148,8 @@ some salient points of the above template::
If you must use tables, use tables. If you're a semantic purist, you can
probably find better HTML than in the above template.
- * To avoid name conflicts, the ``id``s of form elements take the form
- "id_*fieldname*".
+ * To avoid name conflicts, the ``id`` values of form elements take the
+ form "id_*fieldname*".
By creating a creation form we've solved problem number 3 above, but we still
don't have any validation. Let's revise the validation issue by writing a new
@@ -321,7 +321,7 @@ about editing an existing one? It's shockingly similar to creating a new one::
else:
errors = {}
# This makes sure the form accurate represents the fields of the place.
- new_data = place.__dict__
+ new_data = manipulator.flatten_data()
form = forms.FormWrapper(manipulator, new_data, errors)
return render_to_response('places/edit_form.html', {'form': form, 'place': place})
@@ -336,10 +336,10 @@ The only real differences are:
* ``ChangeManipulator.original_object`` stores the instance of the
object being edited.
- * We set ``new_data`` to the original object's ``__dict__``. This makes
- sure the form fields contain the current values of the object.
- ``FormWrapper`` does not modify ``new_data`` in any way, and templates
- cannot, so this is perfectly safe.
+ * We set ``new_data`` based upon ``flatten_data()`` from the manipulator.
+ ``flatten_data()`` takes the data from the original object under
+ manipulation, and converts it into a data dictionary that can be used
+ to populate form elements with the existing values for the object.
* The above example uses a different template, so create and edit can be
"skinned" differently if needed, but the form chunk itself is completely
@@ -481,6 +481,33 @@ the data being validated.
Also, because consistency in user interfaces is important, we strongly urge you
to put punctuation at the end of your validation messages.
+When Are Validators Called?
+---------------------------
+
+After a form has been submitted, Django first checks to see that all the
+required fields are present and non-empty. For each field that passes that
+test *and if the form submission contained data* for that field, all the
+validators for that field are called in turn. The emphasised portion in the
+last sentence is important: if a form field is not submitted (because it
+contains no data -- which is normal HTML behaviour), the validators are not
+run against the field.
+
+This feature is particularly important for models using
+``models.BooleanField`` or custom manipulators using things like
+``forms.CheckBoxField``. If the checkbox is not selected, it will not
+contribute to the form submission.
+
+If you would like your validator to *always* run, regardless of whether the
+field it is attached to contains any data, set the ``always_test`` attribute
+on the validator function. For example::
+
+ def my_custom_validator(field_data, all_data):
+ # ...
+
+ my_custom_validator.always_test = True
+
+This validator will always be executed for any field it is attached to.
+
Ready-made Validators
---------------------
diff --git a/docs/model-api.txt b/docs/model-api.txt
index b46a11c463..c6c4200239 100644
--- a/docs/model-api.txt
+++ b/docs/model-api.txt
@@ -543,7 +543,9 @@ The default value for the field.
``editable``
~~~~~~~~~~~~
-If ``False``, the field will not be editable in the admin. Default is ``True``.
+If ``False``, the field will not be editable in the admin or via form
+processing using the object's ``AddManipulator`` or ``ChangeManipulator``
+classes. Default is ``True``.
``help_text``
~~~~~~~~~~~~~
diff --git a/docs/serialization.txt b/docs/serialization.txt
index 25199e7a50..694e2d25db 100644
--- a/docs/serialization.txt
+++ b/docs/serialization.txt
@@ -96,6 +96,21 @@ Django "ships" with a few included serializers:
.. _json: http://json.org/
.. _simplejson: http://undefined.org/python/#simplejson
+Notes For Specific Serialization Formats
+----------------------------------------
+
+json
+~~~~
+
+If you are using UTF-8 (or any other non-ASCII encoding) data with the JSON
+serializer, you must pass ``ensure_ascii=False`` as a parameter to the
+``serialize()`` call. Otherwise the output will not be encoded correctly.
+
+For example::
+
+ json_serializer = serializers.get_serializer("json")
+ json_serializer.serialize(queryset, ensure_ascii=False, stream=response)
+
Writing custom serializers
``````````````````````````
diff --git a/docs/settings.txt b/docs/settings.txt
index b927b62ca7..65113b3c30 100644
--- a/docs/settings.txt
+++ b/docs/settings.txt
@@ -596,6 +596,12 @@ Whether to prepend the "www." subdomain to URLs that don't have it. This is
only used if ``CommonMiddleware`` is installed (see the `middleware docs`_).
See also ``APPEND_SLASH``.
+PROFANITIES_LIST
+----------------
+
+A list of profanities that will trigger a validation error when the
+``hasNoProfanities`` validator is called.
+
ROOT_URLCONF
------------
diff --git a/docs/templates_python.txt b/docs/templates_python.txt
index 950b122339..bc05d769ad 100644
--- a/docs/templates_python.txt
+++ b/docs/templates_python.txt
@@ -763,17 +763,17 @@ will use the function's name as the tag name.
Shortcut for simple tags
~~~~~~~~~~~~~~~~~~~~~~~~
-Many template tags take a single argument -- a string or a template variable
-reference -- and return a string after doing some processing based solely on
+Many template tags take a number of arguments -- strings or a template variables
+-- and return a string after doing some processing based solely on
the input argument and some external information. For example, the
``current_time`` tag we wrote above is of this variety: we give it a format
string, it returns the time as a string.
To ease the creation of the types of tags, Django provides a helper function,
``simple_tag``. This function, which is a method of
-``django.template.Library``, takes a function that accepts one argument, wraps
-it in a ``render`` function and the other necessary bits mentioned above and
-registers it with the template system.
+``django.template.Library``, takes a function that accepts any number of
+arguments, wraps it in a ``render`` function and the other necessary bits
+mentioned above and registers it with the template system.
Our earlier ``current_time`` function could thus be written like this::
@@ -789,11 +789,16 @@ In Python 2.4, the decorator syntax also works::
...
A couple of things to note about the ``simple_tag`` helper function:
- * Only the (single) argument is passed into our function.
* Checking for the required number of arguments, etc, has already been
done by the time our function is called, so we don't need to do that.
* The quotes around the argument (if any) have already been stripped away,
so we just receive a plain string.
+ * If the argument was a template variable, our function is passed the
+ current value of the variable, not the variable itself.
+
+When your template tag does not need access to the current context, writing a
+function to work with the input values and using the ``simple_tag`` helper is
+the easiest way to create a new tag.
Inclusion tags
~~~~~~~~~~~~~~
diff --git a/docs/testing.txt b/docs/testing.txt
index f8158a0001..b1ede3e4cc 100644
--- a/docs/testing.txt
+++ b/docs/testing.txt
@@ -92,7 +92,8 @@ Writing unittests
Like doctests, Django's unit tests use a standard library module: unittest_.
As with doctests, Django's test runner looks for any unit test cases defined
-in ``models.py``, or in a ``tests.py`` file in your application directory.
+in ``models.py``, or in a ``tests.py`` file stored in the application
+directory.
An equivalent unittest test case for the above example would look like::
@@ -110,8 +111,9 @@ An equivalent unittest test case for the above example would look like::
self.assertEquals(self.cat.speak(), 'The cat says "meow"')
When you `run your tests`_, the test utility will find all the test cases
-(that is, subclasses of ``unittest.TestCase``) in ``tests.py``, automatically
-build a test suite out of those test cases, and run that suite.
+(that is, subclasses of ``unittest.TestCase``) in ``models.py`` and
+``tests.py``, automatically build a test suite out of those test cases,
+and run that suite.
For more details about ``unittest``, see the `standard library unittest
documentation`_.
@@ -197,10 +199,10 @@ used as test conditions.
.. _Selenium: http://www.openqa.org/selenium/
The Test Client is stateful; if a cookie is returned as part of a response,
-that cookie is provided as part of the next request. Expiry policies for these
-cookies are not followed; if you want a cookie to expire, either delete it
-manually from ``client.cookies``, or create a new Client instance (which will
-effectively delete all cookies).
+that cookie is provided as part of the next request issued to that Client
+instance. Expiry policies for these cookies are not followed; if you want
+a cookie to expire, either delete it manually from ``client.cookies``, or
+create a new Client instance (which will effectively delete all cookies).
Making requests
~~~~~~~~~~~~~~~
@@ -210,7 +212,6 @@ no arguments at time of construction. Once constructed, the following methods
can be invoked on the ``Client`` instance.
``get(path, data={})``
-
Make a GET request on the provided ``path``. The key-value pairs in the
data dictionary will be used to create a GET data payload. For example::
@@ -222,7 +223,6 @@ can be invoked on the ``Client`` instance.
http://yoursite.com/customers/details/?name='fred'&age=7
``post(path, data={})``
-
Make a POST request on the provided ``path``. The key-value pairs in the
data dictionary will be used to create the POST data payload. This payload
will be transmitted with the mimetype ``multipart/form-data``.
@@ -243,7 +243,6 @@ can be invoked on the ``Client`` instance.
need to manually close the file after it has been provided to the POST.
``login(path, username, password)``
-
In a production site, it is likely that some views will be protected with
the @login_required URL provided by ``django.contrib.auth``. Interacting
with a URL that has been login protected is a slightly complex operation,
@@ -307,9 +306,12 @@ The following is a simple unit test using the Test Client::
# Every test needs a client
self.client = Client()
def test_details(self):
+ # Issue a GET request
response = self.client.get('/customer/details/')
+ # Check that the respose is 200 OK
self.failUnlessEqual(response.status_code, 200)
+ # Check that the rendered context contains 5 customers
self.failUnlessEqual(len(response.context['customers']), 5)
Fixtures
diff --git a/tests/modeltests/invalid_models/models.py b/tests/modeltests/invalid_models/models.py
index 5540c1bd5f..2299cd85e6 100644
--- a/tests/modeltests/invalid_models/models.py
+++ b/tests/modeltests/invalid_models/models.py
@@ -68,15 +68,34 @@ class SelfClashForeign(models.Model):
foreign_1 = models.ForeignKey("SelfClashForeign", related_name='id')
foreign_2 = models.ForeignKey("SelfClashForeign", related_name='src_safe')
+class ValidM2M(models.Model):
+ src_safe = models.CharField(maxlength=10)
+ validm2m = models.CharField(maxlength=10)
+
+ # M2M fields are symmetrical by default. Symmetrical M2M fields
+ # on self don't require a related accessor, so many potential
+ # clashes are avoided.
+ validm2m_set = models.ManyToManyField("ValidM2M")
+
+ m2m_1 = models.ManyToManyField("ValidM2M", related_name='id')
+ m2m_2 = models.ManyToManyField("ValidM2M", related_name='src_safe')
+
+ m2m_3 = models.ManyToManyField('self')
+ m2m_4 = models.ManyToManyField('self')
+
class SelfClashM2M(models.Model):
src_safe = models.CharField(maxlength=10)
selfclashm2m = models.CharField(maxlength=10)
- selfclashm2m_set = models.ManyToManyField("SelfClashM2M")
- m2m_1 = models.ManyToManyField("SelfClashM2M", related_name='id')
- m2m_2 = models.ManyToManyField("SelfClashM2M", related_name='src_safe')
-
+ # Non-symmetrical M2M fields _do_ have related accessors, so
+ # there is potential for clashes.
+ selfclashm2m_set = models.ManyToManyField("SelfClashM2M", symmetrical=False)
+
+ m2m_1 = models.ManyToManyField("SelfClashM2M", related_name='id', symmetrical=False)
+ m2m_2 = models.ManyToManyField("SelfClashM2M", related_name='src_safe', symmetrical=False)
+ m2m_3 = models.ManyToManyField('self', symmetrical=False)
+ m2m_4 = models.ManyToManyField('self', symmetrical=False)
model_errors = """invalid_models.fielderrors: "charfield": CharFields require a "maxlength" attribute.
invalid_models.fielderrors: "floatfield": FloatFields require a "decimal_places" attribute.
@@ -147,9 +166,17 @@ invalid_models.selfclashforeign: Accessor for field 'foreign_2' clashes with fie
invalid_models.selfclashforeign: Reverse query name for field 'foreign_2' clashes with field 'SelfClashForeign.src_safe'. Add a related_name argument to the definition for 'foreign_2'.
invalid_models.selfclashm2m: Accessor for m2m field 'selfclashm2m_set' clashes with m2m field 'SelfClashM2M.selfclashm2m_set'. Add a related_name argument to the definition for 'selfclashm2m_set'.
invalid_models.selfclashm2m: Reverse query name for m2m field 'selfclashm2m_set' clashes with field 'SelfClashM2M.selfclashm2m'. Add a related_name argument to the definition for 'selfclashm2m_set'.
+invalid_models.selfclashm2m: Accessor for m2m field 'selfclashm2m_set' clashes with related m2m field 'SelfClashM2M.selfclashm2m_set'. Add a related_name argument to the definition for 'selfclashm2m_set'.
invalid_models.selfclashm2m: Accessor for m2m field 'm2m_1' clashes with field 'SelfClashM2M.id'. Add a related_name argument to the definition for 'm2m_1'.
invalid_models.selfclashm2m: Accessor for m2m field 'm2m_2' clashes with field 'SelfClashM2M.src_safe'. Add a related_name argument to the definition for 'm2m_2'.
invalid_models.selfclashm2m: Reverse query name for m2m field 'm2m_1' clashes with field 'SelfClashM2M.id'. Add a related_name argument to the definition for 'm2m_1'.
invalid_models.selfclashm2m: Reverse query name for m2m field 'm2m_2' clashes with field 'SelfClashM2M.src_safe'. Add a related_name argument to the definition for 'm2m_2'.
+invalid_models.selfclashm2m: Accessor for m2m field 'm2m_3' clashes with m2m field 'SelfClashM2M.selfclashm2m_set'. Add a related_name argument to the definition for 'm2m_3'.
+invalid_models.selfclashm2m: Accessor for m2m field 'm2m_3' clashes with related m2m field 'SelfClashM2M.selfclashm2m_set'. Add a related_name argument to the definition for 'm2m_3'.
+invalid_models.selfclashm2m: Accessor for m2m field 'm2m_3' clashes with related m2m field 'SelfClashM2M.selfclashm2m_set'. Add a related_name argument to the definition for 'm2m_3'.
+invalid_models.selfclashm2m: Accessor for m2m field 'm2m_4' clashes with m2m field 'SelfClashM2M.selfclashm2m_set'. Add a related_name argument to the definition for 'm2m_4'.
+invalid_models.selfclashm2m: Accessor for m2m field 'm2m_4' clashes with related m2m field 'SelfClashM2M.selfclashm2m_set'. Add a related_name argument to the definition for 'm2m_4'.
+invalid_models.selfclashm2m: Accessor for m2m field 'm2m_4' clashes with related m2m field 'SelfClashM2M.selfclashm2m_set'. Add a related_name argument to the definition for 'm2m_4'.
+invalid_models.selfclashm2m: Reverse query name for m2m field 'm2m_3' clashes with field 'SelfClashM2M.selfclashm2m'. Add a related_name argument to the definition for 'm2m_3'.
+invalid_models.selfclashm2m: Reverse query name for m2m field 'm2m_4' clashes with field 'SelfClashM2M.selfclashm2m'. Add a related_name argument to the definition for 'm2m_4'.
"""
-
diff --git a/tests/regressiontests/defaultfilters/tests.py b/tests/regressiontests/defaultfilters/tests.py
index 9b1cfda833..32d6ef5202 100644
--- a/tests/regressiontests/defaultfilters/tests.py
+++ b/tests/regressiontests/defaultfilters/tests.py
@@ -15,6 +15,9 @@ r"""
>>> addslashes('"double quotes" and \'single quotes\'')
'\\"double quotes\\" and \\\'single quotes\\\''
+>>> addslashes(r'\ : backslashes, too')
+'\\\\ : backslashes, too'
+
>>> capfirst('hello world')
'Hello world'
diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py
index 5a8dd2d6a2..368a46b8fb 100644
--- a/tests/regressiontests/templates/tests.py
+++ b/tests/regressiontests/templates/tests.py
@@ -187,6 +187,7 @@ class Templates(unittest.TestCase):
'cycle05': ('{% cycle %}', {}, template.TemplateSyntaxError),
'cycle06': ('{% cycle a %}', {}, template.TemplateSyntaxError),
'cycle07': ('{% cycle a,b,c as foo %}{% cycle bar %}', {}, template.TemplateSyntaxError),
+ 'cycle08': ('{% cycle a,b,c as foo %}{% cycle foo %}{{ foo }}{{ foo }}{% cycle foo %}{{ foo }}', {}, 'abbbcc'),
### EXCEPTIONS ############################################################
@@ -304,6 +305,10 @@ class Templates(unittest.TestCase):
'ifchanged01': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% endfor %}', { 'num': (1,2,3) }, '123'),
'ifchanged02': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% endfor %}', { 'num': (1,1,3) }, '13'),
'ifchanged03': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% endfor %}', { 'num': (1,1,1) }, '1'),
+ 'ifchanged04': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% for x in numx %}{% ifchanged %}{{ x }}{% endifchanged %}{% endfor %}{% endfor %}', { 'num': (1, 2, 3), 'numx': (2, 2, 2)}, '122232'),
+ 'ifchanged05': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% for x in numx %}{% ifchanged %}{{ x }}{% endifchanged %}{% endfor %}{% endfor %}', { 'num': (1, 1, 1), 'numx': (1, 2, 3)}, '1123123123'),
+ 'ifchanged06': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% for x in numx %}{% ifchanged %}{{ x }}{% endifchanged %}{% endfor %}{% endfor %}', { 'num': (1, 1, 1), 'numx': (2, 2, 2)}, '1222'),
+ 'ifchanged07': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% for x in numx %}{% ifchanged %}{{ x }}{% endifchanged %}{% for y in numy %}{% ifchanged %}{{ y }}{% endifchanged %}{% endfor %}{% endfor %}{% endfor %}', { 'num': (1, 1, 1), 'numx': (2, 2, 2), 'numy': (3, 3, 3)}, '1233323332333'),
### IFEQUAL TAG ###########################################################
'ifequal01': ("{% ifequal a b %}yes{% endifequal %}", {"a": 1, "b": 2}, ""),