1
0
mirror of https://github.com/django/django.git synced 2025-07-04 17:59:13 +00:00

[soc2010/app-loading] merged trunk

git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2010/app-loading@13818 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Arthur Koziel 2010-09-13 00:04:27 +00:00
parent c9b188c4ec
commit dd49269c7d
470 changed files with 19998 additions and 9613 deletions

32
AUTHORS
View File

@ -29,7 +29,6 @@ answer newbie questions, and generally made Django that much better:
Gisle Aas <gisle@aas.no> Gisle Aas <gisle@aas.no>
ajs <adi@sieker.info> ajs <adi@sieker.info>
alang@bright-green.com alang@bright-green.com
Alcides Fonseca
Andi Albrecht <albrecht.andi@gmail.com> Andi Albrecht <albrecht.andi@gmail.com>
Marty Alchin <gulopine@gamemusic.org> Marty Alchin <gulopine@gamemusic.org>
Ahmad Alhashemi <trans@ahmadh.com> Ahmad Alhashemi <trans@ahmadh.com>
@ -39,7 +38,6 @@ answer newbie questions, and generally made Django that much better:
AgarFu <heaven@croasanaso.sytes.net> AgarFu <heaven@croasanaso.sytes.net>
Dagur Páll Ammendrup <dagurp@gmail.com> Dagur Páll Ammendrup <dagurp@gmail.com>
Collin Anderson <cmawebsite@gmail.com> Collin Anderson <cmawebsite@gmail.com>
Nicolas Lara <nicolaslara@gmail.com>
Jeff Anderson <jefferya@programmerq.net> Jeff Anderson <jefferya@programmerq.net>
Marian Andre <django@andre.sk> Marian Andre <django@andre.sk>
Andreas Andreas
@ -85,19 +83,19 @@ answer newbie questions, and generally made Django that much better:
Sean Brant Sean Brant
Andrew Brehaut <http://brehaut.net/blog> Andrew Brehaut <http://brehaut.net/blog>
brut.alll@gmail.com brut.alll@gmail.com
bthomas
btoll@bestweb.net btoll@bestweb.net
Jonathan Buchanan <jonathan.buchanan@gmail.com> Jonathan Buchanan <jonathan.buchanan@gmail.com>
Keith Bussell <kbussell@gmail.com> Keith Bussell <kbussell@gmail.com>
C8E
Chris Cahoon <chris.cahoon@gmail.com> Chris Cahoon <chris.cahoon@gmail.com>
Juan Manuel Caicedo <juan.manuel.caicedo@gmail.com> Juan Manuel Caicedo <juan.manuel.caicedo@gmail.com>
Trevor Caira <trevor@caira.com> Trevor Caira <trevor@caira.com>
Brett Cannon <brett@python.org> Brett Cannon <brett@python.org>
Ricardo Javier Cárdenes Medina <ricardo.cardenes@gmail.com> Ricardo Javier Cárdenes Medina <ricardo.cardenes@gmail.com>
Jeremy Carbaugh <jcarbaugh@gmail.com> Jeremy Carbaugh <jcarbaugh@gmail.com>
Carl Meyer <carl@dirtcircle.com>
Graham Carlyle <graham.carlyle@maplecroft.net> Graham Carlyle <graham.carlyle@maplecroft.net>
Antonio Cavedoni <http://cavedoni.com/> Antonio Cavedoni <http://cavedoni.com/>
C8E
cedric@terramater.net cedric@terramater.net
Chris Chamberlin <dja@cdc.msbx.net> Chris Chamberlin <dja@cdc.msbx.net>
Amit Chakradeo <http://amit.chakradeo.net/> Amit Chakradeo <http://amit.chakradeo.net/>
@ -110,6 +108,7 @@ answer newbie questions, and generally made Django that much better:
Michal Chruszcz <troll@pld-linux.org> Michal Chruszcz <troll@pld-linux.org>
Can Burak Çilingir <canburak@cs.bilgi.edu.tr> Can Burak Çilingir <canburak@cs.bilgi.edu.tr>
Ian Clelland <clelland@gmail.com> Ian Clelland <clelland@gmail.com>
Travis Cline <travis.cline@gmail.com>
Russell Cloran <russell@rucus.net> Russell Cloran <russell@rucus.net>
colin@owlfish.com colin@owlfish.com
crankycoder@gmail.com crankycoder@gmail.com
@ -137,6 +136,7 @@ answer newbie questions, and generally made Django that much better:
Rajesh Dhawan <rajesh.dhawan@gmail.com> Rajesh Dhawan <rajesh.dhawan@gmail.com>
Sander Dijkhuis <sander.dijkhuis@gmail.com> Sander Dijkhuis <sander.dijkhuis@gmail.com>
Jordan Dimov <s3x3y1@gmail.com> Jordan Dimov <s3x3y1@gmail.com>
Nebojša Dorđević
dne@mayonnaise.net dne@mayonnaise.net
dready <wil@mojipage.com> dready <wil@mojipage.com>
Maximillian Dornseif <md@hudora.de> Maximillian Dornseif <md@hudora.de>
@ -167,7 +167,6 @@ answer newbie questions, and generally made Django that much better:
Liang Feng <hutuworm@gmail.com> Liang Feng <hutuworm@gmail.com>
Bill Fenner <fenner@gmail.com> Bill Fenner <fenner@gmail.com>
Stefane Fermgier <sf@fermigier.com> Stefane Fermgier <sf@fermigier.com>
Afonso Fernández Nogueira <fonzzo.django@gmail.com>
J. Pablo Fernandez <pupeno@pupeno.com> J. Pablo Fernandez <pupeno@pupeno.com>
Maciej Fijalkowski Maciej Fijalkowski
Ben Firshman <ben@firshman.co.uk> Ben Firshman <ben@firshman.co.uk>
@ -175,6 +174,7 @@ answer newbie questions, and generally made Django that much better:
Eric Floehr <eric@intellovations.com> Eric Floehr <eric@intellovations.com>
Eric Florenzano <floguy@gmail.com> Eric Florenzano <floguy@gmail.com>
Vincent Foley <vfoleybourgon@yahoo.ca> Vincent Foley <vfoleybourgon@yahoo.ca>
Alcides Fonseca
Rudolph Froger <rfroger@estrate.nl> Rudolph Froger <rfroger@estrate.nl>
Jorge Gajon <gajon@gajon.org> Jorge Gajon <gajon@gajon.org>
gandalf@owca.info gandalf@owca.info
@ -184,11 +184,13 @@ answer newbie questions, and generally made Django that much better:
Idan Gazit Idan Gazit
geber@datacollect.com geber@datacollect.com
Baishampayan Ghose Baishampayan Ghose
Joshua Ginsberg <jag@flowtheory.net>
Dimitris Glezos <dimitris@glezos.com> Dimitris Glezos <dimitris@glezos.com>
glin@seznam.cz glin@seznam.cz
martin.glueck@gmail.com martin.glueck@gmail.com
Artyom Gnilov <boobsd@gmail.com> Artyom Gnilov <boobsd@gmail.com>
Ben Godfrey <http://aftnn.org> Ben Godfrey <http://aftnn.org>
Andrew Godwin <andrew@aeracode.org>
GomoX <gomo@datafull.com> GomoX <gomo@datafull.com>
Guilherme Mesquita Gondim <semente@taurinus.org> Guilherme Mesquita Gondim <semente@taurinus.org>
Mario Gonzalez <gonzalemario@gmail.com> Mario Gonzalez <gonzalemario@gmail.com>
@ -220,6 +222,7 @@ answer newbie questions, and generally made Django that much better:
Kieran Holland <http://www.kieranholland.com> Kieran Holland <http://www.kieranholland.com>
Sung-Jin Hong <serialx.net@gmail.com> Sung-Jin Hong <serialx.net@gmail.com>
Leo "hylje" Honkanen <sealage@gmail.com> Leo "hylje" Honkanen <sealage@gmail.com>
Matt Hoskins <skaffenuk@googlemail.com>
Tareque Hossain <http://www.codexn.com> Tareque Hossain <http://www.codexn.com>
Richard House <Richard.House@i-logue.com> Richard House <Richard.House@i-logue.com>
Robert Rock Howard <http://djangomojo.com/> Robert Rock Howard <http://djangomojo.com/>
@ -235,6 +238,7 @@ answer newbie questions, and generally made Django that much better:
jcrasta@gmail.com jcrasta@gmail.com
jdetaeye jdetaeye
jhenry <jhenry@theonion.com> jhenry <jhenry@theonion.com>
john@calixto.net
Zak Johnson <zakj@nox.cx> Zak Johnson <zakj@nox.cx>
Nis Jørgensen <nis@superlativ.dk> Nis Jørgensen <nis@superlativ.dk>
Michael Josephson <http://www.sdjournal.com/> Michael Josephson <http://www.sdjournal.com/>
@ -275,11 +279,11 @@ answer newbie questions, and generally made Django that much better:
kurtiss@meetro.com kurtiss@meetro.com
Denis Kuzmichyov <kuzmichyov@gmail.com> Denis Kuzmichyov <kuzmichyov@gmail.com>
Panos Laganakos <panos.laganakos@gmail.com> Panos Laganakos <panos.laganakos@gmail.com>
Lakin Wecker <lakin@structuredabstraction.com>
Nick Lane <nick.lane.au@gmail.com> Nick Lane <nick.lane.au@gmail.com>
Stuart Langridge <http://www.kryogenix.org/> Stuart Langridge <http://www.kryogenix.org/>
Paul Lanier <planier@google.com> Paul Lanier <planier@google.com>
David Larlet <http://david.larlet.fr> David Larlet <http://david.larlet.fr>
Nicolas Lara <nicolaslara@gmail.com>
Nicola Larosa <nico@teknico.net> Nicola Larosa <nico@teknico.net>
Finn Gruwier Larsen <finn@gruwier.dk> Finn Gruwier Larsen <finn@gruwier.dk>
Lau Bech Lauritzen Lau Bech Lauritzen
@ -300,7 +304,6 @@ answer newbie questions, and generally made Django that much better:
Simon Litchfield <simon@quo.com.au> Simon Litchfield <simon@quo.com.au>
Daniel Lindsley <polarcowz@gmail.com> Daniel Lindsley <polarcowz@gmail.com>
Trey Long <trey@ktrl.com> Trey Long <trey@ktrl.com>
msaelices <msaelices@gmail.com>
Martin Mahner <http://www.mahner.org/> Martin Mahner <http://www.mahner.org/>
Matt McClanahan <http://mmcc.cx/> Matt McClanahan <http://mmcc.cx/>
Stanislaus Madueke Stanislaus Madueke
@ -313,20 +316,21 @@ answer newbie questions, and generally made Django that much better:
Petr Marhoun <petr.marhoun@gmail.com> Petr Marhoun <petr.marhoun@gmail.com>
Petar Marić <http://www.petarmaric.com/> Petar Marić <http://www.petarmaric.com/>
Nuno Mariz <nmariz@gmail.com> Nuno Mariz <nmariz@gmail.com>
Marijn Vriens <marijn@metronomo.cl>
mark@junklight.com mark@junklight.com
Orestis Markou <orestis@orestis.gr> Orestis Markou <orestis@orestis.gr>
Takashi Matsuo <matsuo.takashi@gmail.com> Takashi Matsuo <matsuo.takashi@gmail.com>
Yasushi Masuda <whosaysni@gmail.com> Yasushi Masuda <whosaysni@gmail.com>
mattycakes@gmail.com mattycakes@gmail.com
Glenn Maynard <glenn@zewt.org>
Jason McBrayer <http://www.carcosa.net/jason/> Jason McBrayer <http://www.carcosa.net/jason/>
Kevin McConnell <kevin.mcconnell@gmail.com> Kevin McConnell <kevin.mcconnell@gmail.com>
mccutchen@gmail.com mccutchen@gmail.com
michael.mcewan@gmail.com
Paul McLanahan <paul@mclanahan.net> Paul McLanahan <paul@mclanahan.net>
Tobias McNulty <http://www.caktusgroup.com/blog> Tobias McNulty <http://www.caktusgroup.com/blog>
Zain Memon Zain Memon
Christian Metts Christian Metts
michael.mcewan@gmail.com Carl Meyer <carl@dirtcircle.com>
michal@plovarna.cz michal@plovarna.cz
Slawek Mikula <slawek dot mikula at gmail dot com> Slawek Mikula <slawek dot mikula at gmail dot com>
mitakummaa@gmail.com mitakummaa@gmail.com
@ -336,12 +340,14 @@ answer newbie questions, and generally made Django that much better:
Aljosa Mohorovic <aljosa.mohorovic@gmail.com> Aljosa Mohorovic <aljosa.mohorovic@gmail.com>
Ramiro Morales <rm0@gmx.net> Ramiro Morales <rm0@gmx.net>
Eric Moritz <http://eric.themoritzfamily.com/> Eric Moritz <http://eric.themoritzfamily.com/>
msaelices <msaelices@gmail.com>
Gregor Müllegger <gregor@muellegger.de>
Robin Munn <http://www.geekforgod.com/> Robin Munn <http://www.geekforgod.com/>
James Murty James Murty
msundstr msundstr
Robert Myers <myer0052@gmail.com> Robert Myers <myer0052@gmail.com>
Aaron T. Myers <atmyers@gmail.com>
Alexander Myodov <alex@myodov.com> Alexander Myodov <alex@myodov.com>
Nebojša Dorđević
Doug Napoleone <doug@dougma.com> Doug Napoleone <doug@dougma.com>
Gopal Narayanan <gopastro@gmail.com> Gopal Narayanan <gopastro@gmail.com>
Fraser Nevett <mail@nevett.org> Fraser Nevett <mail@nevett.org>
@ -369,7 +375,6 @@ answer newbie questions, and generally made Django that much better:
phil.h.smith@gmail.com phil.h.smith@gmail.com
Gustavo Picon Gustavo Picon
Michael Placentra II <someone@michaelplacentra2.net> Michael Placentra II <someone@michaelplacentra2.net>
Luke Plant <http://lukeplant.me.uk/>
plisk plisk
Daniel Poelzleithner <http://poelzi.org/> Daniel Poelzleithner <http://poelzi.org/>
polpak@yahoo.com polpak@yahoo.com
@ -400,7 +405,6 @@ answer newbie questions, and generally made Django that much better:
Henrique Romano <onaiort@gmail.com> Henrique Romano <onaiort@gmail.com>
Armin Ronacher Armin Ronacher
Daniel Roseman <http://roseman.org.uk/> Daniel Roseman <http://roseman.org.uk/>
Brian Rosner <brosner@gmail.com>
Rozza <ross.lawley@gmail.com> Rozza <ross.lawley@gmail.com>
Oliver Rutherfurd <http://rutherfurd.net/> Oliver Rutherfurd <http://rutherfurd.net/>
ryankanno ryankanno
@ -479,6 +483,7 @@ answer newbie questions, and generally made Django that much better:
George Vilches <gav@thataddress.com> George Vilches <gav@thataddress.com>
Vlado <vlado@labath.org> Vlado <vlado@labath.org>
Zachary Voase <zacharyvoase@gmail.com> Zachary Voase <zacharyvoase@gmail.com>
Marijn Vriens <marijn@metronomo.cl>
Milton Waddams Milton Waddams
Chris Wagner <cw264701@ohio.edu> Chris Wagner <cw264701@ohio.edu>
Rick Wagner <rwagner@physics.ucsd.edu> Rick Wagner <rwagner@physics.ucsd.edu>
@ -487,6 +492,7 @@ answer newbie questions, and generally made Django that much better:
Filip Wasilewski <filip.wasilewski@gmail.com> Filip Wasilewski <filip.wasilewski@gmail.com>
Dan Watson <http://theidioteque.net/> Dan Watson <http://theidioteque.net/>
Joel Watts <joel@joelwatts.com> Joel Watts <joel@joelwatts.com>
Lakin Wecker <lakin@structuredabstraction.com>
Chris Wesseling <Chris.Wesseling@cwi.nl> Chris Wesseling <Chris.Wesseling@cwi.nl>
James Wheare <django@sparemint.com> James Wheare <django@sparemint.com>
Mike Wiacek <mjwiacek@google.com> Mike Wiacek <mjwiacek@google.com>
@ -508,8 +514,6 @@ answer newbie questions, and generally made Django that much better:
Gasper Zejn <zejn@kiberpipa.org> Gasper Zejn <zejn@kiberpipa.org>
Jarek Zgoda <jarek.zgoda@gmail.com> Jarek Zgoda <jarek.zgoda@gmail.com>
Cheng Zhang Cheng Zhang
Glenn Maynard <glenn@zewt.org>
bthomas
A big THANK YOU goes to: A big THANK YOU goes to:

View File

@ -3,12 +3,12 @@ include AUTHORS
include INSTALL include INSTALL
include LICENSE include LICENSE
include MANIFEST.in include MANIFEST.in
include django/utils/simplejson/LICENSE.txt
include django/contrib/gis/gdal/LICENSE include django/contrib/gis/gdal/LICENSE
include django/contrib/gis/geos/LICENSE include django/contrib/gis/geos/LICENSE
include django/dispatch/license.txt
include django/utils/simplejson/LICENSE.txt
recursive-include docs * recursive-include docs *
recursive-include scripts * recursive-include scripts *
recursive-include examples *
recursive-include extras * recursive-include extras *
recursive-include tests * recursive-include tests *
recursive-include django/conf/locale * recursive-include django/conf/locale *
@ -20,6 +20,8 @@ recursive-include django/contrib/auth/tests/templates *
recursive-include django/contrib/comments/templates * recursive-include django/contrib/comments/templates *
recursive-include django/contrib/databrowse/templates * recursive-include django/contrib/databrowse/templates *
recursive-include django/contrib/formtools/templates * recursive-include django/contrib/formtools/templates *
recursive-include django/contrib/flatpages/fixtures *
recursive-include django/contrib/flatpages/tests/templates *
recursive-include django/contrib/gis/templates * recursive-include django/contrib/gis/templates *
recursive-include django/contrib/gis/tests/data * recursive-include django/contrib/gis/tests/data *
recursive-include django/contrib/gis/tests/geoapp/fixtures * recursive-include django/contrib/gis/tests/geoapp/fixtures *

View File

@ -1,4 +1,4 @@
VERSION = (1, 2, 1, 'final', 0) VERSION = (1, 3, 0, 'alpha', 0)
def get_version(): def get_version():
version = '%s.%s' % (VERSION[0], VERSION[1]) version = '%s.%s' % (VERSION[0], VERSION[1])

View File

@ -103,6 +103,12 @@ class Settings(object):
self.INSTALLED_APPS = new_installed_apps self.INSTALLED_APPS = new_installed_apps
if hasattr(time, 'tzset') and getattr(self, 'TIME_ZONE'): if hasattr(time, 'tzset') and getattr(self, 'TIME_ZONE'):
# When we can, attempt to validate the timezone. If we can't find
# this file, no check happens and it's harmless.
zoneinfo_root = '/usr/share/zoneinfo'
if (os.path.exists(zoneinfo_root) and not
os.path.exists(os.path.join(zoneinfo_root, *(self.TIME_ZONE.split('/'))))):
raise ValueError("Incorrect timezone setting: %s" % self.TIME_ZONE)
# Move the time zone info into os.environ. See ticket #2315 for why # Move the time zone info into os.environ. See ticket #2315 for why
# we don't do this unconditionally (breaks Windows). # we don't do this unconditionally (breaks Windows).
os.environ['TZ'] = self.TIME_ZONE os.environ['TZ'] = self.TIME_ZONE

View File

@ -54,7 +54,7 @@ LANGUAGES = (
('en', gettext_noop('English')), ('en', gettext_noop('English')),
('en-gb', gettext_noop('British English')), ('en-gb', gettext_noop('British English')),
('es', gettext_noop('Spanish')), ('es', gettext_noop('Spanish')),
('es-ar', gettext_noop('Argentinean Spanish')), ('es-ar', gettext_noop('Argentinian Spanish')),
('et', gettext_noop('Estonian')), ('et', gettext_noop('Estonian')),
('eu', gettext_noop('Basque')), ('eu', gettext_noop('Basque')),
('fa', gettext_noop('Persian')), ('fa', gettext_noop('Persian')),
@ -78,6 +78,7 @@ LANGUAGES = (
('lt', gettext_noop('Lithuanian')), ('lt', gettext_noop('Lithuanian')),
('lv', gettext_noop('Latvian')), ('lv', gettext_noop('Latvian')),
('mk', gettext_noop('Macedonian')), ('mk', gettext_noop('Macedonian')),
('ml', gettext_noop('Malayalam')),
('mn', gettext_noop('Mongolian')), ('mn', gettext_noop('Mongolian')),
('nl', gettext_noop('Dutch')), ('nl', gettext_noop('Dutch')),
('no', gettext_noop('Norwegian')), ('no', gettext_noop('Norwegian')),
@ -372,8 +373,8 @@ DECIMAL_SEPARATOR = '.'
# Boolean that sets whether to add thousand separator when formatting numbers # Boolean that sets whether to add thousand separator when formatting numbers
USE_THOUSAND_SEPARATOR = False USE_THOUSAND_SEPARATOR = False
# Number of digits that will be togheter, when spliting them by THOUSAND_SEPARATOR # Number of digits that will be together, when spliting them by
# 0 means no grouping, 3 means splitting by thousands... # THOUSAND_SEPARATOR. 0 means no grouping, 3 means splitting by thousands...
NUMBER_GROUPING = 0 NUMBER_GROUPING = 0
# Thousand separator symbol # Thousand separator symbol

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django\n" "Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2007-02-15 01:00+0200\n" "POT-Creation-Date: 2010-06-04 21:59+0200\n"
"PO-Revision-Date: 2008-03-25 18:54+0100\n" "PO-Revision-Date: 2008-03-25 18:54+0100\n"
"Last-Translator: Django Catalan Group <django-cat@googlegroups.com>\n" "Last-Translator: Django Catalan Group <django-cat@googlegroups.com>\n"
"Language-Team: Catalan <ca@li.org>\n" "Language-Team: Catalan <ca@li.org>\n"
@ -14,102 +14,144 @@ msgstr ""
"X-Generator: VIM 7.1\n" "X-Generator: VIM 7.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: contrib/admin/media/js/SelectFilter2.js:33 #: .\contrib\admin\media\js\SelectFilter2.js.py:37
#, perl-format #, perl-format
msgid "Available %s" msgid "Available %s"
msgstr "%s Disponibles" msgstr "%s Disponibles"
#: contrib/admin/media/js/SelectFilter2.js:41 #: .\contrib\admin\media\js\SelectFilter2.js.py:45
msgid "Choose all" msgid "Choose all"
msgstr "Seleccionar tots" msgstr "Seleccionar tots"
#: contrib/admin/media/js/SelectFilter2.js:46 #: .\contrib\admin\media\js\SelectFilter2.js.py:50
msgid "Add" msgid "Add"
msgstr "Afegir" msgstr "Afegir"
#: contrib/admin/media/js/SelectFilter2.js:48 #: .\contrib\admin\media\js\SelectFilter2.js.py:52
msgid "Remove" msgid "Remove"
msgstr "Eliminar" msgstr "Eliminar"
#: contrib/admin/media/js/SelectFilter2.js:53 #: .\contrib\admin\media\js\SelectFilter2.js.py:57
#, perl-format #, perl-format
msgid "Chosen %s" msgid "Chosen %s"
msgstr "%s Escollits" msgstr "%s Escollits"
#: contrib/admin/media/js/SelectFilter2.js:54 #: .\contrib\admin\media\js\SelectFilter2.js.py:58
msgid "Select your choice(s) and click " msgid "Select your choice(s) and click "
msgstr "Faci les seves seleccions i faci click a" msgstr "Faci les seves seleccions i faci click a"
#: contrib/admin/media/js/SelectFilter2.js:59 #: .\contrib\admin\media\js\SelectFilter2.js.py:63
msgid "Clear all" msgid "Clear all"
msgstr "Deseleccionar tots" msgstr "Deseleccionar tots"
#: contrib/admin/media/js/dateparse.js:32 #: .\contrib\admin\media\js\actions.js.py:18
#: contrib/admin/media/js/calendar.js:24 #: .\contrib\admin\media\js\actions.min.js.py:1
msgid "January February March April May June July August September October November December" msgid "%(sel)s of %(cnt)s selected"
msgstr "Gener Febrer Març Abril Maig Juny Juliol Agost Setembre Octubre Novembre Desembre" msgid_plural "%(sel)s of %(cnt)s selected"
msgstr[0] "%(sel)s de %(cnt)s seleccionat"
msgstr[1] "%(sel)s of %(cnt)s seleccionats"
#: contrib/admin/media/js/dateparse.js:33 #: .\contrib\admin\media\js\actions.js.py:109
msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday" #: .\contrib\admin\media\js\actions.min.js.py:5
msgstr "Diumenge Dilluns Dimarts Dimecres Dijous Divendres Dissabte" msgid ""
"You have unsaved changes on individual editable fields. If you run an "
"action, your unsaved changes will be lost."
msgstr ""
"Teniu canvis sense desar a camps editables individuals. Si executeu "
"una acció, es perdran aquests canvis no desats."
#: contrib/admin/media/js/calendar.js:25 #: .\contrib\admin\media\js\actions.js.py:121
#: .\contrib\admin\media\js\actions.min.js.py:6
msgid ""
"You have selected an action, but you haven't saved your changes to "
"individual fields yet. Please click OK to save. You'll need to re-run the "
"action."
msgstr ""
"Heu seleccionat una acció, però encara no heu desat els vostres canvis a "
"camps individuals. Si us plau premeu OK per desar. Haureu de tornar a "
"executar l'acció."
#: .\contrib\admin\media\js\actions.js.py:123
#: .\contrib\admin\media\js\actions.min.js.py:6
msgid ""
"You have selected an action, and you haven't made any changes on individual "
"fields. You're probably looking for the Go button rather than the Save "
"button."
msgstr ""
"Heu seleccionat una acció i no heu fet cap canvi a camps individuals. "
"Probablement esteu cercant el botó 'Anar' enlloc de 'Desar'."
#: .\contrib\admin\media\js\calendar.js.py:24
#: .\contrib\admin\media\js\dateparse.js.py:32
msgid ""
"January February March April May June July August September October November "
"December"
msgstr ""
"Gener Febrer Març Abril Maig Juny Juliol Agost Setembre Octubre Novembre "
"Desembre"
#: .\contrib\admin\media\js\calendar.js.py:25
msgid "S M T W T F S" msgid "S M T W T F S"
msgstr "Dg Dl Dt Dc Dj Dv Ds" msgstr "dg dl dt dc dj dv ds"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47 #: .\contrib\admin\media\js\collapse.js.py:9
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81 #: .\contrib\admin\media\js\collapse.js.py:21
msgid "Now" #: .\contrib\admin\media\js\collapse.min.js.py:1
msgstr "Ara"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
msgid "Clock"
msgstr "Rellotje"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
msgid "Choose a time"
msgstr "Esculli una hora"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
msgid "Midnight"
msgstr "Mitja nit"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
msgid "6 a.m."
msgstr "6 a.m."
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
msgid "Noon"
msgstr "Migdia"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
msgid "Cancel"
msgstr "Cancel·lar"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
msgid "Today"
msgstr "Avui"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
msgid "Calendar"
msgstr "Calendari"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
msgid "Yesterday"
msgstr "Ahir"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
msgid "Tomorrow"
msgstr "Demà"
#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
msgid "Show" msgid "Show"
msgstr "Mostrar" msgstr "Mostrar"
#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63 #: .\contrib\admin\media\js\collapse.js.py:16
#: .\contrib\admin\media\js\collapse.min.js.py:1
msgid "Hide" msgid "Hide"
msgstr "Ocultar" msgstr "Ocultar"
#: .\contrib\admin\media\js\dateparse.js.py:33
msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
msgstr "Diumenge Dilluns Dimarts Dimecres Dijous Divendres Dissabte"
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:48
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:83
msgid "Now"
msgstr "Ara"
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:52
msgid "Clock"
msgstr "Rellotge"
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:79
msgid "Choose a time"
msgstr "Esculli una hora"
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:84
msgid "Midnight"
msgstr "Mitjanit"
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:85
msgid "6 a.m."
msgstr "6 a.m."
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:86
msgid "Noon"
msgstr "Migdia"
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:90
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:187
msgid "Cancel"
msgstr "Cancel·lar"
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:132
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:181
msgid "Today"
msgstr "Avui"
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:136
msgid "Calendar"
msgstr "Calendari"
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:179
msgid "Yesterday"
msgstr "Ahir"
#: .\contrib\admin\media\js\admin\DateTimeShortcuts.js.py:183
msgid "Tomorrow"
msgstr "Demà"

View File

@ -8,8 +8,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django\n" "Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-05-09 14:26+0200\n" "POT-Creation-Date: 2010-08-06 18:35+0200\n"
"PO-Revision-Date: 2010-05-09 14:09+0100\n" "PO-Revision-Date: 2010-08-06 18:33+0100\n"
"Last-Translator: Vlada Macek <macek@sandbox.cz>\n" "Last-Translator: Vlada Macek <macek@sandbox.cz>\n"
"Language-Team: Czech\n" "Language-Team: Czech\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -70,7 +70,7 @@ msgid "Spanish"
msgstr "španělsky" msgstr "španělsky"
#: conf/global_settings.py:57 #: conf/global_settings.py:57
msgid "Argentinean Spanish" msgid "Argentinian Spanish"
msgstr "španělsky (Argentina)" msgstr "španělsky (Argentina)"
#: conf/global_settings.py:58 #: conf/global_settings.py:58
@ -122,138 +122,146 @@ msgid "Hungarian"
msgstr "maďarsky" msgstr "maďarsky"
#: conf/global_settings.py:70 #: conf/global_settings.py:70
msgid "Indonesian"
msgstr "indonésky"
#: conf/global_settings.py:71
msgid "Icelandic" msgid "Icelandic"
msgstr "islandsky" msgstr "islandsky"
#: conf/global_settings.py:71 #: conf/global_settings.py:72
msgid "Italian" msgid "Italian"
msgstr "italsky" msgstr "italsky"
#: conf/global_settings.py:72 #: conf/global_settings.py:73
msgid "Japanese" msgid "Japanese"
msgstr "japonsky" msgstr "japonsky"
#: conf/global_settings.py:73 #: conf/global_settings.py:74
msgid "Georgian" msgid "Georgian"
msgstr "gruzínsky" msgstr "gruzínsky"
#: conf/global_settings.py:74 #: conf/global_settings.py:75
msgid "Khmer" msgid "Khmer"
msgstr "khmersky" msgstr "khmersky"
#: conf/global_settings.py:75 #: conf/global_settings.py:76
msgid "Kannada" msgid "Kannada"
msgstr "kannadsky" msgstr "kannadsky"
#: conf/global_settings.py:76 #: conf/global_settings.py:77
msgid "Korean" msgid "Korean"
msgstr "korejsky" msgstr "korejsky"
#: conf/global_settings.py:77 #: conf/global_settings.py:78
msgid "Lithuanian" msgid "Lithuanian"
msgstr "litevsky" msgstr "litevsky"
#: conf/global_settings.py:78 #: conf/global_settings.py:79
msgid "Latvian" msgid "Latvian"
msgstr "lotyšsky" msgstr "lotyšsky"
#: conf/global_settings.py:79 #: conf/global_settings.py:80
msgid "Macedonian" msgid "Macedonian"
msgstr "makedonsky" msgstr "makedonsky"
#: conf/global_settings.py:80 #: conf/global_settings.py:81
msgid "Malayalam"
msgstr "malajálamsky"
#: conf/global_settings.py:82
msgid "Mongolian" msgid "Mongolian"
msgstr "mongolsky" msgstr "mongolsky"
#: conf/global_settings.py:81 #: conf/global_settings.py:83
msgid "Dutch" msgid "Dutch"
msgstr "holandsky" msgstr "holandsky"
#: conf/global_settings.py:82 #: conf/global_settings.py:84
msgid "Norwegian" msgid "Norwegian"
msgstr "norsky" msgstr "norsky"
#: conf/global_settings.py:83 #: conf/global_settings.py:85
msgid "Norwegian Bokmal" msgid "Norwegian Bokmal"
msgstr "norsky (Bokmål)" msgstr "norsky (Bokmål)"
#: conf/global_settings.py:84 #: conf/global_settings.py:86
msgid "Norwegian Nynorsk" msgid "Norwegian Nynorsk"
msgstr "norsky (Nynorsk)" msgstr "norsky (Nynorsk)"
#: conf/global_settings.py:85 #: conf/global_settings.py:87
msgid "Polish" msgid "Polish"
msgstr "polsky" msgstr "polsky"
#: conf/global_settings.py:86 #: conf/global_settings.py:88
msgid "Portuguese" msgid "Portuguese"
msgstr "portugalsky" msgstr "portugalsky"
#: conf/global_settings.py:87 #: conf/global_settings.py:89
msgid "Brazilian Portuguese" msgid "Brazilian Portuguese"
msgstr "portugalsky (Brazílie)" msgstr "portugalsky (Brazílie)"
#: conf/global_settings.py:88 #: conf/global_settings.py:90
msgid "Romanian" msgid "Romanian"
msgstr "rumunsky" msgstr "rumunsky"
#: conf/global_settings.py:89 #: conf/global_settings.py:91
msgid "Russian" msgid "Russian"
msgstr "rusky" msgstr "rusky"
#: conf/global_settings.py:90 #: conf/global_settings.py:92
msgid "Slovak" msgid "Slovak"
msgstr "slovensky" msgstr "slovensky"
#: conf/global_settings.py:91 #: conf/global_settings.py:93
msgid "Slovenian" msgid "Slovenian"
msgstr "slovinsky" msgstr "slovinsky"
#: conf/global_settings.py:92 #: conf/global_settings.py:94
msgid "Albanian" msgid "Albanian"
msgstr "albánsky" msgstr "albánsky"
#: conf/global_settings.py:93 #: conf/global_settings.py:95
msgid "Serbian" msgid "Serbian"
msgstr "srbsky" msgstr "srbsky"
#: conf/global_settings.py:94 #: conf/global_settings.py:96
msgid "Serbian Latin" msgid "Serbian Latin"
msgstr "srbsky (latinkou)" msgstr "srbsky (latinkou)"
#: conf/global_settings.py:95 #: conf/global_settings.py:97
msgid "Swedish" msgid "Swedish"
msgstr "švédsky" msgstr "švédsky"
#: conf/global_settings.py:96 #: conf/global_settings.py:98
msgid "Tamil" msgid "Tamil"
msgstr "tamilsky" msgstr "tamilsky"
#: conf/global_settings.py:97 #: conf/global_settings.py:99
msgid "Telugu" msgid "Telugu"
msgstr "telužsky" msgstr "telužsky"
#: conf/global_settings.py:98 #: conf/global_settings.py:100
msgid "Thai" msgid "Thai"
msgstr "thajsky" msgstr "thajsky"
#: conf/global_settings.py:99 #: conf/global_settings.py:101
msgid "Turkish" msgid "Turkish"
msgstr "turecky" msgstr "turecky"
#: conf/global_settings.py:100 #: conf/global_settings.py:102
msgid "Ukrainian" msgid "Ukrainian"
msgstr "ukrajinsky" msgstr "ukrajinsky"
#: conf/global_settings.py:101 #: conf/global_settings.py:103
msgid "Vietnamese" msgid "Vietnamese"
msgstr "vietnamsky" msgstr "vietnamsky"
#: conf/global_settings.py:102 #: conf/global_settings.py:104
msgid "Simplified Chinese" msgid "Simplified Chinese"
msgstr "čínsky (zjednodušeně)" msgstr "čínsky (zjednodušeně)"
#: conf/global_settings.py:103 #: conf/global_settings.py:105
msgid "Traditional Chinese" msgid "Traditional Chinese"
msgstr "čínsky (tradičně)" msgstr "čínsky (tradičně)"
@ -305,15 +313,15 @@ msgstr "Tento měsíc"
msgid "This year" msgid "This year"
msgstr "Tento rok" msgstr "Tento rok"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469 #: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "Yes" msgid "Yes"
msgstr "Ano" msgstr "Ano"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469 #: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "No" msgid "No"
msgstr "Ne" msgstr "Ne"
#: contrib/admin/filterspecs.py:154 forms/widgets.py:469 #: contrib/admin/filterspecs.py:154 forms/widgets.py:478
msgid "Unknown" msgid "Unknown"
msgstr "Neznámé" msgstr "Neznámé"
@ -359,7 +367,7 @@ msgid "Changed %s."
msgstr "Změněno: %s" msgstr "Změněno: %s"
#: contrib/admin/options.py:559 contrib/admin/options.py:569 #: contrib/admin/options.py:559 contrib/admin/options.py:569
#: contrib/comments/templates/comments/preview.html:16 db/models/base.py:844 #: contrib/comments/templates/comments/preview.html:16 db/models/base.py:845
#: forms/models.py:568 #: forms/models.py:568
msgid "and" msgid "and"
msgstr "a" msgstr "a"
@ -853,7 +861,7 @@ msgstr "Uložit a přidat další položku"
msgid "Save and continue editing" msgid "Save and continue editing"
msgstr "Uložit a pokračovat v úpravách" msgstr "Uložit a pokračovat v úpravách"
#: contrib/admin/templates/admin/auth/user/add_form.html:5 #: contrib/admin/templates/admin/auth/user/add_form.html:6
msgid "" msgid ""
"First, enter a username and password. Then, you'll be able to edit more user " "First, enter a username and password. Then, you'll be able to edit more user "
"options." "options."
@ -861,6 +869,10 @@ msgstr ""
"Nejdříve vložte uživatelské jméno a heslo. Poté budete moci upravovat více " "Nejdříve vložte uživatelské jméno a heslo. Poté budete moci upravovat více "
"uživatelských nastavení." "uživatelských nastavení."
#: contrib/admin/templates/admin/auth/user/add_form.html:8
msgid "Enter a username and password."
msgstr "Vložte uživatelské jméno a heslo."
#: contrib/admin/templates/admin/auth/user/change_password.html:28 #: contrib/admin/templates/admin/auth/user/change_password.html:28
#, python-format #, python-format
msgid "Enter a new password for the user <strong>%(username)s</strong>." msgid "Enter a new password for the user <strong>%(username)s</strong>."
@ -1418,8 +1430,8 @@ msgstr "zpráva"
msgid "Logged out" msgid "Logged out"
msgstr "Odhlášeno" msgstr "Odhlášeno"
#: contrib/auth/management/commands/createsuperuser.py:23 #: contrib/auth/management/commands/createsuperuser.py:24
#: core/validators.py:120 forms/fields.py:428 #: core/validators.py:120 forms/fields.py:427
msgid "Enter a valid e-mail address." msgid "Enter a valid e-mail address."
msgstr "Vložte platnou e-mailovou adresu." msgstr "Vložte platnou e-mailovou adresu."
@ -1491,7 +1503,7 @@ msgid "Email address"
msgstr "E-mailová adresa" msgstr "E-mailová adresa"
#: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8 #: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8
#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1101 #: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1109
msgid "URL" msgid "URL"
msgstr "URL" msgstr "URL"
@ -1541,7 +1553,7 @@ msgstr "komentář"
msgid "date/time submitted" msgid "date/time submitted"
msgstr "datum a čas byly zaslané" msgstr "datum a čas byly zaslané"
#: contrib/comments/models.py:60 db/models/fields/__init__.py:896 #: contrib/comments/models.py:60 db/models/fields/__init__.py:904
msgid "IP address" msgid "IP address"
msgstr "Adresa IP" msgstr "Adresa IP"
@ -4473,22 +4485,22 @@ msgstr "weby"
msgid "Enter a valid value." msgid "Enter a valid value."
msgstr "Vložte platnou hodnotu." msgstr "Vložte platnou hodnotu."
#: core/validators.py:87 forms/fields.py:529 #: core/validators.py:87 forms/fields.py:528
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "Vložte platnou adresu URL." msgstr "Vložte platnou adresu URL."
#: core/validators.py:89 forms/fields.py:530 #: core/validators.py:89 forms/fields.py:529
msgid "This URL appears to be a broken link." msgid "This URL appears to be a broken link."
msgstr "Tato adresa URL je zřejmě neplatný odkaz." msgstr "Tato adresa URL je zřejmě neplatný odkaz."
#: core/validators.py:123 forms/fields.py:873 #: core/validators.py:123 forms/fields.py:877
msgid "" msgid ""
"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
msgstr "" msgstr ""
"Vložte platný identifikátor složený pouze z písmen, čísel, podtržítek a " "Vložte platný identifikátor složený pouze z písmen, čísel, podtržítek a "
"pomlček." "pomlček."
#: core/validators.py:126 forms/fields.py:866 #: core/validators.py:126 forms/fields.py:870
msgid "Enter a valid IPv4 address." msgid "Enter a valid IPv4 address."
msgstr "Vložte platnou adresu typu IPv4." msgstr "Vložte platnou adresu typu IPv4."
@ -4501,12 +4513,12 @@ msgstr "Vložte pouze číslice oddělené čárkami."
msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
msgstr "Hodnota musí být %(limit_value)s (nyní je %(show_value)s)." msgstr "Hodnota musí být %(limit_value)s (nyní je %(show_value)s)."
#: core/validators.py:153 forms/fields.py:205 forms/fields.py:257 #: core/validators.py:153 forms/fields.py:204 forms/fields.py:256
#, python-format #, python-format
msgid "Ensure this value is less than or equal to %(limit_value)s." msgid "Ensure this value is less than or equal to %(limit_value)s."
msgstr "Hodnota musí být menší nebo rovna %(limit_value)s." msgstr "Hodnota musí být menší nebo rovna %(limit_value)s."
#: core/validators.py:158 forms/fields.py:206 forms/fields.py:258 #: core/validators.py:158 forms/fields.py:205 forms/fields.py:257
#, python-format #, python-format
msgid "Ensure this value is greater than or equal to %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s."
msgstr "Hodnota musí být větší nebo rovna %(limit_value)s." msgstr "Hodnota musí být větší nebo rovna %(limit_value)s."
@ -4529,13 +4541,13 @@ msgstr ""
"Hodnota smí mít nejvýše %(limit_value)d znaků, ale nyní jich má %(show_value)" "Hodnota smí mít nejvýše %(limit_value)d znaků, ale nyní jich má %(show_value)"
"d." "d."
#: db/models/base.py:822 #: db/models/base.py:823
#, python-format #, python-format
msgid "%(field_name)s must be unique for %(date_field)s %(lookup)s." msgid "%(field_name)s must be unique for %(date_field)s %(lookup)s."
msgstr "" msgstr ""
"Pole %(field_name)s musí být unikátní testem %(lookup)s pole %(date_field)s." "Pole %(field_name)s musí být unikátní testem %(lookup)s pole %(date_field)s."
#: db/models/base.py:837 db/models/base.py:845 #: db/models/base.py:838 db/models/base.py:846
#, python-format #, python-format
msgid "%(model_name)s with this %(field_label)s already exists." msgid "%(model_name)s with this %(field_label)s already exists."
msgstr "" msgstr ""
@ -4559,13 +4571,13 @@ msgstr "Pole nemůže být prázdné."
msgid "Field of type: %(field_type)s" msgid "Field of type: %(field_type)s"
msgstr "Pole typu: %(field_type)s" msgstr "Pole typu: %(field_type)s"
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:852 #: db/models/fields/__init__.py:451 db/models/fields/__init__.py:860
#: db/models/fields/__init__.py:961 db/models/fields/__init__.py:972 #: db/models/fields/__init__.py:969 db/models/fields/__init__.py:980
#: db/models/fields/__init__.py:999 #: db/models/fields/__init__.py:1007
msgid "Integer" msgid "Integer"
msgstr "Celé číslo" msgstr "Celé číslo"
#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:850 #: db/models/fields/__init__.py:455 db/models/fields/__init__.py:858
msgid "This value must be an integer." msgid "This value must be an integer."
msgstr "Hodnota musí být celé číslo." msgstr "Hodnota musí být celé číslo."
@ -4577,7 +4589,7 @@ msgstr "Hodnota musí být buď Ano (True) nebo Ne (False)."
msgid "Boolean (Either True or False)" msgid "Boolean (Either True or False)"
msgstr "Pravdivost (buď Ano (True), nebo Ne (False))" msgstr "Pravdivost (buď Ano (True), nebo Ne (False))"
#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:982 #: db/models/fields/__init__.py:539 db/models/fields/__init__.py:990
#, python-format #, python-format
msgid "String (up to %(max_length)s)" msgid "String (up to %(max_length)s)"
msgstr "Řetězec (max. %(max_length)s znaků)" msgstr "Řetězec (max. %(max_length)s znaků)"
@ -4619,44 +4631,44 @@ msgstr "Desetinné číslo"
msgid "E-mail address" msgid "E-mail address"
msgstr "E-mailová adresa" msgstr "E-mailová adresa"
#: db/models/fields/__init__.py:799 db/models/fields/files.py:220 #: db/models/fields/__init__.py:807 db/models/fields/files.py:220
#: db/models/fields/files.py:331 #: db/models/fields/files.py:331
msgid "File path" msgid "File path"
msgstr "Cesta k souboru" msgstr "Cesta k souboru"
#: db/models/fields/__init__.py:822 #: db/models/fields/__init__.py:830
msgid "This value must be a float." msgid "This value must be a float."
msgstr "Hodnota musí být desetinné číslo." msgstr "Hodnota musí být desetinné číslo."
#: db/models/fields/__init__.py:824 #: db/models/fields/__init__.py:832
msgid "Floating point number" msgid "Floating point number"
msgstr "Číslo s pohyblivou řádovou čárkou" msgstr "Číslo s pohyblivou řádovou čárkou"
#: db/models/fields/__init__.py:883 #: db/models/fields/__init__.py:891
msgid "Big (8 byte) integer" msgid "Big (8 byte) integer"
msgstr "Velké číslo (8 bajtů)" msgstr "Velké číslo (8 bajtů)"
#: db/models/fields/__init__.py:912 #: db/models/fields/__init__.py:920
msgid "This value must be either None, True or False." msgid "This value must be either None, True or False."
msgstr "Hodnota musí být buď Nic (None), Ano (True) nebo Ne (False)." msgstr "Hodnota musí být buď Nic (None), Ano (True) nebo Ne (False)."
#: db/models/fields/__init__.py:914 #: db/models/fields/__init__.py:922
msgid "Boolean (Either True, False or None)" msgid "Boolean (Either True, False or None)"
msgstr "Pravdivost (buď Ano (True), Ne (False) nebo Nic (None))" msgstr "Pravdivost (buď Ano (True), Ne (False) nebo Nic (None))"
#: db/models/fields/__init__.py:1005 #: db/models/fields/__init__.py:1013
msgid "Text" msgid "Text"
msgstr "Text" msgstr "Text"
#: db/models/fields/__init__.py:1021 #: db/models/fields/__init__.py:1029
msgid "Time" msgid "Time"
msgstr "Čas" msgstr "Čas"
#: db/models/fields/__init__.py:1025 #: db/models/fields/__init__.py:1033
msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format." msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
msgstr "Vložte platný čas ve tvaru HH:MM[:ss[.uuuuuu]]" msgstr "Vložte platný čas ve tvaru HH:MM[:ss[.uuuuuu]]"
#: db/models/fields/__init__.py:1109 #: db/models/fields/__init__.py:1125
msgid "XML text" msgid "XML text"
msgstr "XML text" msgstr "XML text"
@ -4669,22 +4681,22 @@ msgstr "Položka typu %(model)s s primárním klíčem %(pk)r neexistuje."
msgid "Foreign Key (type determined by related field)" msgid "Foreign Key (type determined by related field)"
msgstr "Cizí klíč (typ určen pomocí souvisejícího pole)" msgstr "Cizí klíč (typ určen pomocí souvisejícího pole)"
#: db/models/fields/related.py:918 #: db/models/fields/related.py:919
msgid "One-to-one relationship" msgid "One-to-one relationship"
msgstr "Vazba jedna-jedna" msgstr "Vazba jedna-jedna"
#: db/models/fields/related.py:980 #: db/models/fields/related.py:981
msgid "Many-to-many relationship" msgid "Many-to-many relationship"
msgstr "Vazba mnoho-mnoho" msgstr "Vazba mnoho-mnoho"
#: db/models/fields/related.py:1000 #: db/models/fields/related.py:1001
msgid "" msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr "" msgstr ""
"Výběr více než jedné položky je možný přidržením klávesy \"Control\" (nebo " "Výběr více než jedné položky je možný přidržením klávesy \"Control\" (nebo "
"\"Command\" na Macu)." "\"Command\" na Macu)."
#: db/models/fields/related.py:1061 #: db/models/fields/related.py:1062
#, python-format #, python-format
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
msgid_plural "" msgid_plural ""
@ -4697,74 +4709,74 @@ msgstr[2] "Vložte platné ID položky %(self)s. Hodnoty %(value)r jsou neplatn
msgid "This field is required." msgid "This field is required."
msgstr "Pole je povinné." msgstr "Pole je povinné."
#: forms/fields.py:204 #: forms/fields.py:203
msgid "Enter a whole number." msgid "Enter a whole number."
msgstr "Vložte celé číslo." msgstr "Vložte celé číslo."
#: forms/fields.py:235 forms/fields.py:256 #: forms/fields.py:234 forms/fields.py:255
msgid "Enter a number." msgid "Enter a number."
msgstr "Vložte číslo." msgstr "Vložte číslo."
#: forms/fields.py:259 #: forms/fields.py:258
#, python-format #, python-format
msgid "Ensure that there are no more than %s digits in total." msgid "Ensure that there are no more than %s digits in total."
msgstr "Hodnota nesmí celkem mít více než %s cifer." msgstr "Hodnota nesmí celkem mít více než %s cifer."
#: forms/fields.py:260 #: forms/fields.py:259
#, python-format #, python-format
msgid "Ensure that there are no more than %s decimal places." msgid "Ensure that there are no more than %s decimal places."
msgstr "Hodnota nesmí mít za desetinnou čárkou více než %s cifer." msgstr "Hodnota nesmí mít za desetinnou čárkou více než %s cifer."
#: forms/fields.py:261 #: forms/fields.py:260
#, python-format #, python-format
msgid "Ensure that there are no more than %s digits before the decimal point." msgid "Ensure that there are no more than %s digits before the decimal point."
msgstr "Hodnota nesmí mít před desetinnou čárkou více než %s cifer." msgstr "Hodnota nesmí mít před desetinnou čárkou více než %s cifer."
#: forms/fields.py:323 forms/fields.py:838 #: forms/fields.py:322 forms/fields.py:837
msgid "Enter a valid date." msgid "Enter a valid date."
msgstr "Vložte platné datum." msgstr "Vložte platné datum."
#: forms/fields.py:351 forms/fields.py:839 #: forms/fields.py:350 forms/fields.py:838
msgid "Enter a valid time." msgid "Enter a valid time."
msgstr "Vložte platný čas." msgstr "Vložte platný čas."
#: forms/fields.py:377 #: forms/fields.py:376
msgid "Enter a valid date/time." msgid "Enter a valid date/time."
msgstr "Vložte platné datum a čas." msgstr "Vložte platné datum a čas."
#: forms/fields.py:435 #: forms/fields.py:434
msgid "No file was submitted. Check the encoding type on the form." msgid "No file was submitted. Check the encoding type on the form."
msgstr "" msgstr ""
"Soubor nebyl odeslán. Zkontrolujte parametr \"encoding type\" formuláře." "Soubor nebyl odeslán. Zkontrolujte parametr \"encoding type\" formuláře."
#: forms/fields.py:436 #: forms/fields.py:435
msgid "No file was submitted." msgid "No file was submitted."
msgstr "Žádný soubor nebyl odeslán." msgstr "Žádný soubor nebyl odeslán."
#: forms/fields.py:437 #: forms/fields.py:436
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "Odeslaný soubor je prázdný." msgstr "Odeslaný soubor je prázdný."
#: forms/fields.py:438 #: forms/fields.py:437
#, python-format #, python-format
msgid "" msgid ""
"Ensure this filename has at most %(max)d characters (it has %(length)d)." "Ensure this filename has at most %(max)d characters (it has %(length)d)."
msgstr "" msgstr ""
"Délka názvu souboru má být nejvýše %(max)d znaků, ale nyní je %(length)d." "Délka názvu souboru má být nejvýše %(max)d znaků, ale nyní je %(length)d."
#: forms/fields.py:473 #: forms/fields.py:472
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
msgstr "" msgstr ""
"Nahrajte platný obrázek. Odeslaný soubor buď nebyl obrázek nebo byl poškozen." "Nahrajte platný obrázek. Odeslaný soubor buď nebyl obrázek nebo byl poškozen."
#: forms/fields.py:596 forms/fields.py:671 #: forms/fields.py:595 forms/fields.py:670
#, python-format #, python-format
msgid "Select a valid choice. %(value)s is not one of the available choices." msgid "Select a valid choice. %(value)s is not one of the available choices."
msgstr "Vyberte platnou možnost, \"%(value)s\" není k dispozici." msgstr "Vyberte platnou možnost, \"%(value)s\" není k dispozici."
#: forms/fields.py:672 forms/fields.py:734 forms/models.py:1002 #: forms/fields.py:671 forms/fields.py:733 forms/models.py:1002
msgid "Enter a list of values." msgid "Enter a list of values."
msgstr "Vložte seznam hodnot." msgstr "Vložte seznam hodnot."

View File

@ -8,8 +8,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django\n" "Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-05-09 14:30+0200\n" "POT-Creation-Date: 2010-08-06 18:35+0200\n"
"PO-Revision-Date: 2010-05-09 14:04+0100\n" "PO-Revision-Date: 2010-08-06 18:34+0100\n"
"Last-Translator: Vlada Macek <macek@sandbox.cz>\n" "Last-Translator: Vlada Macek <macek@sandbox.cz>\n"
"Language-Team: Czech\n" "Language-Team: Czech\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@ -6,9 +6,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django\n" "Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-04-26 15:49+0200\n" "POT-Creation-Date: 2010-08-07 11:57+0200\n"
"PO-Revision-Date: 2008-08-13 22:00+0200\n" "PO-Revision-Date: 2010-08-07 22:00+0200\n"
"Last-Translator: Finn Gruwier Larsen<finn@gruwier.dk>\n" "Last-Translator: Finn Gruwier Larsen<finngruwierlarsen@gmail.com>\n"
"Language-Team: \n" "Language-Team: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -44,13 +44,42 @@ msgstr "Foretag dit/dine valg og klik "
msgid "Clear all" msgid "Clear all"
msgstr "Fravælg alle" msgstr "Fravælg alle"
#: contrib/admin/media/js/actions.js:17 #: contrib/admin/media/js/actions.js:18
#: contrib/admin/media/js/actions.min.js:1 #: contrib/admin/media/js/actions.min.js:1
msgid "%(sel)s of %(cnt)s selected" msgid "%(sel)s of %(cnt)s selected"
msgid_plural "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected"
msgstr[0] "%(sel)s af %(cnt)s valgt" msgstr[0] "%(sel)s af %(cnt)s valgt"
msgstr[1] "%(sel)s af %(cnt)s valgt" msgstr[1] "%(sel)s af %(cnt)s valgt"
#: contrib/admin/media/js/actions.js:109
#: contrib/admin/media/js/actions.min.js:5
msgid ""
"You have unsaved changes on individual editable fields. If you run an "
"action, your unsaved changes will be lost."
msgstr ""
"Du har ugemte ændringer af et eller flere redigerbare felter. Hvis du "
"udfører en handling fra drop-down-menuen, vil du miste disse ændringer."
#: contrib/admin/media/js/actions.js:121
#: contrib/admin/media/js/actions.min.js:6
msgid ""
"You have selected an action, but you haven't saved your changes to "
"individual fields yet. Please click OK to save. You'll need to re-run the "
"action."
msgstr ""
"Du har valgt en handling, men du har ikke gemt dine ændringer til et eller "
"flere felter. Klik venligst OK for at gemme og vælg dernæst handlingen igen."
#: contrib/admin/media/js/actions.js:123
#: contrib/admin/media/js/actions.min.js:6
msgid ""
"You have selected an action, and you haven't made any changes on individual "
"fields. You're probably looking for the Go button rather than the Save "
"button."
msgstr ""
"Du har valgt en handling, og du har ikke udført nogen ændringer på felter. "
"Det, du søger er formentlig Udfør-knappen i stedet for Gem-knappen."
#: contrib/admin/media/js/calendar.js:24 #: contrib/admin/media/js/calendar.js:24
#: contrib/admin/media/js/dateparse.js:32 #: contrib/admin/media/js/dateparse.js:32
msgid "" msgid ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django\n" "Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-05-13 15:30+0200\n" "POT-Creation-Date: 2010-08-06 18:53+0200\n"
"PO-Revision-Date: 2010-04-26 13:53+0100\n" "PO-Revision-Date: 2010-04-26 13:53+0100\n"
"Last-Translator: Jannis Leidel <jannis@leidel.info>\n" "Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
"Language-Team: \n" "Language-Team: \n"
@ -72,7 +72,7 @@ msgid "Spanish"
msgstr "Spanisch" msgstr "Spanisch"
#: conf/global_settings.py:57 #: conf/global_settings.py:57
msgid "Argentinean Spanish" msgid "Argentinian Spanish"
msgstr "Argentinisches Spanisch" msgstr "Argentinisches Spanisch"
#: conf/global_settings.py:58 #: conf/global_settings.py:58
@ -168,98 +168,102 @@ msgid "Macedonian"
msgstr "Mazedonisch" msgstr "Mazedonisch"
#: conf/global_settings.py:81 #: conf/global_settings.py:81
msgid "Malayalam"
msgstr "Malayalam"
#: conf/global_settings.py:82
msgid "Mongolian" msgid "Mongolian"
msgstr "Mongolisch" msgstr "Mongolisch"
#: conf/global_settings.py:82 #: conf/global_settings.py:83
msgid "Dutch" msgid "Dutch"
msgstr "Holländisch" msgstr "Holländisch"
#: conf/global_settings.py:83 #: conf/global_settings.py:84
msgid "Norwegian" msgid "Norwegian"
msgstr "Norwegisch" msgstr "Norwegisch"
#: conf/global_settings.py:84 #: conf/global_settings.py:85
msgid "Norwegian Bokmal" msgid "Norwegian Bokmal"
msgstr "Norwegisch (Bokmål)" msgstr "Norwegisch (Bokmål)"
#: conf/global_settings.py:85 #: conf/global_settings.py:86
msgid "Norwegian Nynorsk" msgid "Norwegian Nynorsk"
msgstr "Norwegisch (Nynorsk)" msgstr "Norwegisch (Nynorsk)"
#: conf/global_settings.py:86 #: conf/global_settings.py:87
msgid "Polish" msgid "Polish"
msgstr "Polnisch" msgstr "Polnisch"
#: conf/global_settings.py:87 #: conf/global_settings.py:88
msgid "Portuguese" msgid "Portuguese"
msgstr "Portugiesisch" msgstr "Portugiesisch"
#: conf/global_settings.py:88 #: conf/global_settings.py:89
msgid "Brazilian Portuguese" msgid "Brazilian Portuguese"
msgstr "Brasilianisches Portugiesisch" msgstr "Brasilianisches Portugiesisch"
#: conf/global_settings.py:89 #: conf/global_settings.py:90
msgid "Romanian" msgid "Romanian"
msgstr "Rumänisch" msgstr "Rumänisch"
#: conf/global_settings.py:90 #: conf/global_settings.py:91
msgid "Russian" msgid "Russian"
msgstr "Russisch" msgstr "Russisch"
#: conf/global_settings.py:91 #: conf/global_settings.py:92
msgid "Slovak" msgid "Slovak"
msgstr "Slowakisch" msgstr "Slowakisch"
#: conf/global_settings.py:92 #: conf/global_settings.py:93
msgid "Slovenian" msgid "Slovenian"
msgstr "Slowenisch" msgstr "Slowenisch"
#: conf/global_settings.py:93 #: conf/global_settings.py:94
msgid "Albanian" msgid "Albanian"
msgstr "Albanisch" msgstr "Albanisch"
#: conf/global_settings.py:94 #: conf/global_settings.py:95
msgid "Serbian" msgid "Serbian"
msgstr "Serbisch" msgstr "Serbisch"
#: conf/global_settings.py:95 #: conf/global_settings.py:96
msgid "Serbian Latin" msgid "Serbian Latin"
msgstr "Serbisch (Latein)" msgstr "Serbisch (Latein)"
#: conf/global_settings.py:96 #: conf/global_settings.py:97
msgid "Swedish" msgid "Swedish"
msgstr "Schwedisch" msgstr "Schwedisch"
#: conf/global_settings.py:97 #: conf/global_settings.py:98
msgid "Tamil" msgid "Tamil"
msgstr "Tamilisch" msgstr "Tamilisch"
#: conf/global_settings.py:98 #: conf/global_settings.py:99
msgid "Telugu" msgid "Telugu"
msgstr "Telugisch" msgstr "Telugisch"
#: conf/global_settings.py:99 #: conf/global_settings.py:100
msgid "Thai" msgid "Thai"
msgstr "Thailändisch" msgstr "Thailändisch"
#: conf/global_settings.py:100 #: conf/global_settings.py:101
msgid "Turkish" msgid "Turkish"
msgstr "Türkisch" msgstr "Türkisch"
#: conf/global_settings.py:101 #: conf/global_settings.py:102
msgid "Ukrainian" msgid "Ukrainian"
msgstr "Ukrainisch" msgstr "Ukrainisch"
#: conf/global_settings.py:102 #: conf/global_settings.py:103
msgid "Vietnamese" msgid "Vietnamese"
msgstr "Vietnamesisch" msgstr "Vietnamesisch"
#: conf/global_settings.py:103 #: conf/global_settings.py:104
msgid "Simplified Chinese" msgid "Simplified Chinese"
msgstr "Vereinfachtes Chinesisch" msgstr "Vereinfachtes Chinesisch"
#: conf/global_settings.py:104 #: conf/global_settings.py:105
msgid "Traditional Chinese" msgid "Traditional Chinese"
msgstr "Traditionelles Chinesisch" msgstr "Traditionelles Chinesisch"
@ -311,15 +315,15 @@ msgstr "Diesen Monat"
msgid "This year" msgid "This year"
msgstr "Dieses Jahr" msgstr "Dieses Jahr"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469 #: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "Yes" msgid "Yes"
msgstr "Ja" msgstr "Ja"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469 #: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "No" msgid "No"
msgstr "Nein" msgstr "Nein"
#: contrib/admin/filterspecs.py:154 forms/widgets.py:469 #: contrib/admin/filterspecs.py:154 forms/widgets.py:478
msgid "Unknown" msgid "Unknown"
msgstr "Unbekannt" msgstr "Unbekannt"
@ -696,7 +700,7 @@ msgid "Filter"
msgstr "Filter" msgstr "Filter"
#: contrib/admin/templates/admin/delete_confirmation.html:10 #: contrib/admin/templates/admin/delete_confirmation.html:10
#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:302 #: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:300
msgid "Delete" msgid "Delete"
msgstr "Löschen" msgstr "Löschen"
@ -859,7 +863,7 @@ msgstr "Sichern und neu hinzufügen"
msgid "Save and continue editing" msgid "Save and continue editing"
msgstr "Sichern und weiter bearbeiten" msgstr "Sichern und weiter bearbeiten"
#: contrib/admin/templates/admin/auth/user/add_form.html:5 #: contrib/admin/templates/admin/auth/user/add_form.html:6
msgid "" msgid ""
"First, enter a username and password. Then, you'll be able to edit more user " "First, enter a username and password. Then, you'll be able to edit more user "
"options." "options."
@ -867,6 +871,10 @@ msgstr ""
"Zuerst einen Benutzer und ein Passwort eingeben. Danach können weitere " "Zuerst einen Benutzer und ein Passwort eingeben. Danach können weitere "
"Optionen für den Benutzer geändert werden." "Optionen für den Benutzer geändert werden."
#: contrib/admin/templates/admin/auth/user/add_form.html:8
msgid "Enter a username and password."
msgstr "Bitte einen Benutzernamen und ein Passwort eingeben."
#: contrib/admin/templates/admin/auth/user/change_password.html:28 #: contrib/admin/templates/admin/auth/user/change_password.html:28
#, python-format #, python-format
msgid "Enter a new password for the user <strong>%(username)s</strong>." msgid "Enter a new password for the user <strong>%(username)s</strong>."
@ -1437,8 +1445,8 @@ msgstr "Mitteilung"
msgid "Logged out" msgid "Logged out"
msgstr "Abgemeldet" msgstr "Abgemeldet"
#: contrib/auth/management/commands/createsuperuser.py:23 #: contrib/auth/management/commands/createsuperuser.py:24
#: core/validators.py:120 forms/fields.py:428 #: core/validators.py:120 forms/fields.py:427
msgid "Enter a valid e-mail address." msgid "Enter a valid e-mail address."
msgstr "Bitte eine gültige E-Mail-Adresse eingeben." msgstr "Bitte eine gültige E-Mail-Adresse eingeben."
@ -1506,7 +1514,7 @@ msgid "Email address"
msgstr "E-Mail-Adresse" msgstr "E-Mail-Adresse"
#: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8 #: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8
#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1101 #: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1109
msgid "URL" msgid "URL"
msgstr "Adresse (URL)" msgstr "Adresse (URL)"
@ -1557,7 +1565,7 @@ msgstr "Kommentar"
msgid "date/time submitted" msgid "date/time submitted"
msgstr "Datum/Zeit Erstellung" msgstr "Datum/Zeit Erstellung"
#: contrib/comments/models.py:60 db/models/fields/__init__.py:896 #: contrib/comments/models.py:60 db/models/fields/__init__.py:904
msgid "IP address" msgid "IP address"
msgstr "IP-Adresse" msgstr "IP-Adresse"
@ -4509,22 +4517,22 @@ msgstr "Sites"
msgid "Enter a valid value." msgid "Enter a valid value."
msgstr "Bitte einen gültigen Wert eingeben." msgstr "Bitte einen gültigen Wert eingeben."
#: core/validators.py:87 forms/fields.py:529 #: core/validators.py:87 forms/fields.py:528
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "Bitte eine gültige Adresse eingeben." msgstr "Bitte eine gültige Adresse eingeben."
#: core/validators.py:89 forms/fields.py:530 #: core/validators.py:89 forms/fields.py:529
msgid "This URL appears to be a broken link." msgid "This URL appears to be a broken link."
msgstr "Diese Adresse scheint nicht gültig zu sein." msgstr "Diese Adresse scheint nicht gültig zu sein."
#: core/validators.py:123 forms/fields.py:873 #: core/validators.py:123 forms/fields.py:877
msgid "" msgid ""
"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
msgstr "" msgstr ""
"Bitte ein gültiges Kürzel, bestehend aus Buchstaben, Ziffern, Unterstrichen " "Bitte ein gültiges Kürzel, bestehend aus Buchstaben, Ziffern, Unterstrichen "
"und Bindestrichen, eingeben." "und Bindestrichen, eingeben."
#: core/validators.py:126 forms/fields.py:866 #: core/validators.py:126 forms/fields.py:870
msgid "Enter a valid IPv4 address." msgid "Enter a valid IPv4 address."
msgstr "Bitte eine gültige IPv4-Adresse eingeben." msgstr "Bitte eine gültige IPv4-Adresse eingeben."
@ -4539,12 +4547,12 @@ msgstr ""
"Bitte sicherstellen, dass der Wert %(limit_value)s ist. (Er ist %(show_value)" "Bitte sicherstellen, dass der Wert %(limit_value)s ist. (Er ist %(show_value)"
"s)" "s)"
#: core/validators.py:153 forms/fields.py:205 forms/fields.py:257 #: core/validators.py:153 forms/fields.py:204 forms/fields.py:256
#, python-format #, python-format
msgid "Ensure this value is less than or equal to %(limit_value)s." msgid "Ensure this value is less than or equal to %(limit_value)s."
msgstr "Dieser Wert muss kleiner oder gleich %(limit_value)s sein." msgstr "Dieser Wert muss kleiner oder gleich %(limit_value)s sein."
#: core/validators.py:158 forms/fields.py:206 forms/fields.py:258 #: core/validators.py:158 forms/fields.py:205 forms/fields.py:257
#, python-format #, python-format
msgid "Ensure this value is greater than or equal to %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s."
msgstr "Dieser Wert muss größer oder gleich %(limit_value)s sein." msgstr "Dieser Wert muss größer oder gleich %(limit_value)s sein."
@ -4595,13 +4603,13 @@ msgstr "Dieses Feld darf nicht leer sein."
msgid "Field of type: %(field_type)s" msgid "Field of type: %(field_type)s"
msgstr "Feldtyp: %(field_type)s" msgstr "Feldtyp: %(field_type)s"
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:852 #: db/models/fields/__init__.py:451 db/models/fields/__init__.py:860
#: db/models/fields/__init__.py:961 db/models/fields/__init__.py:972 #: db/models/fields/__init__.py:969 db/models/fields/__init__.py:980
#: db/models/fields/__init__.py:999 #: db/models/fields/__init__.py:1007
msgid "Integer" msgid "Integer"
msgstr "Ganzzahl" msgstr "Ganzzahl"
#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:850 #: db/models/fields/__init__.py:455 db/models/fields/__init__.py:858
msgid "This value must be an integer." msgid "This value must be an integer."
msgstr "Dieser Wert muss eine Ganzzahl sein." msgstr "Dieser Wert muss eine Ganzzahl sein."
@ -4613,7 +4621,7 @@ msgstr "Dieser Wert muss True oder False sein."
msgid "Boolean (Either True or False)" msgid "Boolean (Either True or False)"
msgstr "Boolescher Wert (True oder False)" msgstr "Boolescher Wert (True oder False)"
#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:982 #: db/models/fields/__init__.py:539 db/models/fields/__init__.py:990
#, python-format #, python-format
msgid "String (up to %(max_length)s)" msgid "String (up to %(max_length)s)"
msgstr "Zeichenkette (bis zu %(max_length)s Zeichen)" msgstr "Zeichenkette (bis zu %(max_length)s Zeichen)"
@ -4657,44 +4665,44 @@ msgstr "Dezimalzahl"
msgid "E-mail address" msgid "E-mail address"
msgstr "E-Mail-Adresse" msgstr "E-Mail-Adresse"
#: db/models/fields/__init__.py:799 db/models/fields/files.py:220 #: db/models/fields/__init__.py:807 db/models/fields/files.py:220
#: db/models/fields/files.py:331 #: db/models/fields/files.py:331
msgid "File path" msgid "File path"
msgstr "Dateipfad" msgstr "Dateipfad"
#: db/models/fields/__init__.py:822 #: db/models/fields/__init__.py:830
msgid "This value must be a float." msgid "This value must be a float."
msgstr "Dieser Wert muss eine Gleitkommazahl sein." msgstr "Dieser Wert muss eine Gleitkommazahl sein."
#: db/models/fields/__init__.py:824 #: db/models/fields/__init__.py:832
msgid "Floating point number" msgid "Floating point number"
msgstr "Gleitkommazahl" msgstr "Gleitkommazahl"
#: db/models/fields/__init__.py:883 #: db/models/fields/__init__.py:891
msgid "Big (8 byte) integer" msgid "Big (8 byte) integer"
msgstr "Große Ganzzahl (8 Byte)" msgstr "Große Ganzzahl (8 Byte)"
#: db/models/fields/__init__.py:912 #: db/models/fields/__init__.py:920
msgid "This value must be either None, True or False." msgid "This value must be either None, True or False."
msgstr "Dieser Wert muss None, True oder False sein." msgstr "Dieser Wert muss None, True oder False sein."
#: db/models/fields/__init__.py:914 #: db/models/fields/__init__.py:922
msgid "Boolean (Either True, False or None)" msgid "Boolean (Either True, False or None)"
msgstr "Boolescher Wert (True, False oder None)" msgstr "Boolescher Wert (True, False oder None)"
#: db/models/fields/__init__.py:1005 #: db/models/fields/__init__.py:1013
msgid "Text" msgid "Text"
msgstr "Text" msgstr "Text"
#: db/models/fields/__init__.py:1021 #: db/models/fields/__init__.py:1029
msgid "Time" msgid "Time"
msgstr "Zeit" msgstr "Zeit"
#: db/models/fields/__init__.py:1025 #: db/models/fields/__init__.py:1033
msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format." msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
msgstr "Bitte eine gültige Zeit im Format HH:MM[:ss[.uuuuuu]] eingeben." msgstr "Bitte eine gültige Zeit im Format HH:MM[:ss[.uuuuuu]] eingeben."
#: db/models/fields/__init__.py:1109 #: db/models/fields/__init__.py:1125
msgid "XML text" msgid "XML text"
msgstr "XML-Text" msgstr "XML-Text"
@ -4707,22 +4715,22 @@ msgstr "Modell %(model)s mit dem Primärschlüssel %(pk)r ist nicht vorhanden."
msgid "Foreign Key (type determined by related field)" msgid "Foreign Key (type determined by related field)"
msgstr "Fremdschlüssel (Typ definiert durch verknüpftes Feld)" msgstr "Fremdschlüssel (Typ definiert durch verknüpftes Feld)"
#: db/models/fields/related.py:918 #: db/models/fields/related.py:919
msgid "One-to-one relationship" msgid "One-to-one relationship"
msgstr "One-to-one-Beziehung" msgstr "One-to-one-Beziehung"
#: db/models/fields/related.py:980 #: db/models/fields/related.py:981
msgid "Many-to-many relationship" msgid "Many-to-many relationship"
msgstr "Many-to-many-Beziehung" msgstr "Many-to-many-Beziehung"
#: db/models/fields/related.py:1000 #: db/models/fields/related.py:1001
msgid "" msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr "" msgstr ""
"Halten Sie die Strg-Taste (⌘ für Mac) während des Klickens gedrückt, um " "Halten Sie die Strg-Taste (⌘ für Mac) während des Klickens gedrückt, um "
"mehrere Einträge auszuwählen." "mehrere Einträge auszuwählen."
#: db/models/fields/related.py:1061 #: db/models/fields/related.py:1062
#, python-format #, python-format
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
msgid_plural "" msgid_plural ""
@ -4736,55 +4744,55 @@ msgstr[1] ""
msgid "This field is required." msgid "This field is required."
msgstr "Dieses Feld ist zwingend erforderlich." msgstr "Dieses Feld ist zwingend erforderlich."
#: forms/fields.py:204 #: forms/fields.py:203
msgid "Enter a whole number." msgid "Enter a whole number."
msgstr "Bitte eine ganze Zahl eingeben." msgstr "Bitte eine ganze Zahl eingeben."
#: forms/fields.py:235 forms/fields.py:256 #: forms/fields.py:234 forms/fields.py:255
msgid "Enter a number." msgid "Enter a number."
msgstr "Bitte eine Zahl eingeben." msgstr "Bitte eine Zahl eingeben."
#: forms/fields.py:259 #: forms/fields.py:258
#, python-format #, python-format
msgid "Ensure that there are no more than %s digits in total." msgid "Ensure that there are no more than %s digits in total."
msgstr "Bitte geben Sie nicht mehr als insgesamt %s Ziffern ein." msgstr "Bitte geben Sie nicht mehr als insgesamt %s Ziffern ein."
#: forms/fields.py:260 #: forms/fields.py:259
#, python-format #, python-format
msgid "Ensure that there are no more than %s decimal places." msgid "Ensure that there are no more than %s decimal places."
msgstr "Bitte geben Sie nicht mehr als %s Dezimalstellen ein." msgstr "Bitte geben Sie nicht mehr als %s Dezimalstellen ein."
#: forms/fields.py:261 #: forms/fields.py:260
#, python-format #, python-format
msgid "Ensure that there are no more than %s digits before the decimal point." msgid "Ensure that there are no more than %s digits before the decimal point."
msgstr "Bitte geben Sie nicht mehr als %s Ziffern vor dem Komma ein." msgstr "Bitte geben Sie nicht mehr als %s Ziffern vor dem Komma ein."
#: forms/fields.py:323 forms/fields.py:838 #: forms/fields.py:322 forms/fields.py:837
msgid "Enter a valid date." msgid "Enter a valid date."
msgstr "Bitte ein gültiges Datum eingeben." msgstr "Bitte ein gültiges Datum eingeben."
#: forms/fields.py:351 forms/fields.py:839 #: forms/fields.py:350 forms/fields.py:838
msgid "Enter a valid time." msgid "Enter a valid time."
msgstr "Bitte eine gültige Uhrzeit eingeben." msgstr "Bitte eine gültige Uhrzeit eingeben."
#: forms/fields.py:377 #: forms/fields.py:376
msgid "Enter a valid date/time." msgid "Enter a valid date/time."
msgstr "Bitte ein gültiges Datum und Uhrzeit eingeben." msgstr "Bitte ein gültiges Datum und Uhrzeit eingeben."
#: forms/fields.py:435 #: forms/fields.py:434
msgid "No file was submitted. Check the encoding type on the form." msgid "No file was submitted. Check the encoding type on the form."
msgstr "" msgstr ""
"Es wurde keine Datei übermittelt. Überprüfen Sie das Encoding des Formulars." "Es wurde keine Datei übermittelt. Überprüfen Sie das Encoding des Formulars."
#: forms/fields.py:436 #: forms/fields.py:435
msgid "No file was submitted." msgid "No file was submitted."
msgstr "Es wurde keine Datei übertragen." msgstr "Es wurde keine Datei übertragen."
#: forms/fields.py:437 #: forms/fields.py:436
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "Die ausgewählte Datei ist leer." msgstr "Die ausgewählte Datei ist leer."
#: forms/fields.py:438 #: forms/fields.py:437
#, python-format #, python-format
msgid "" msgid ""
"Ensure this filename has at most %(max)d characters (it has %(length)d)." "Ensure this filename has at most %(max)d characters (it has %(length)d)."
@ -4792,7 +4800,7 @@ msgstr ""
"Bitte sicherstellen, dass der Dateiname maximal %(max)d Zeichen hat. (Er hat " "Bitte sicherstellen, dass der Dateiname maximal %(max)d Zeichen hat. (Er hat "
"%(length)d)." "%(length)d)."
#: forms/fields.py:473 #: forms/fields.py:472
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
@ -4800,17 +4808,17 @@ msgstr ""
"Bitte ein Bild hochladen. Die hochgeladene Datei ist kein Bild oder ist " "Bitte ein Bild hochladen. Die hochgeladene Datei ist kein Bild oder ist "
"defekt." "defekt."
#: forms/fields.py:596 forms/fields.py:671 #: forms/fields.py:595 forms/fields.py:670
#, python-format #, python-format
msgid "Select a valid choice. %(value)s is not one of the available choices." msgid "Select a valid choice. %(value)s is not one of the available choices."
msgstr "" msgstr ""
"Bitte eine gültige Auswahl treffen. %(value)s ist keine gültige Auswahl." "Bitte eine gültige Auswahl treffen. %(value)s ist keine gültige Auswahl."
#: forms/fields.py:672 forms/fields.py:734 forms/models.py:1002 #: forms/fields.py:671 forms/fields.py:733 forms/models.py:1002
msgid "Enter a list of values." msgid "Enter a list of values."
msgstr "Bitte eine Liste mit Werten eingeben." msgstr "Bitte eine Liste mit Werten eingeben."
#: forms/formsets.py:298 forms/formsets.py:300 #: forms/formsets.py:296 forms/formsets.py:298
msgid "Order" msgid "Order"
msgstr "Reihenfolge" msgstr "Reihenfolge"

View File

@ -6,8 +6,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django\n" "Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-05-11 08:35-0300\n" "POT-Creation-Date: 2010-08-06 15:38-0300\n"
"PO-Revision-Date: 2010-05-17 10:52-0300\n" "PO-Revision-Date: 2010-08-11 09:00-0300\n"
"Last-Translator: Ramiro <rm0@gmx.net>\n" "Last-Translator: Ramiro <rm0@gmx.net>\n"
"Language-Team: Django-I18N <django-i18n@googlegroups.com>\n" "Language-Team: Django-I18N <django-i18n@googlegroups.com>\n"
"Language: es_AR\n" "Language: es_AR\n"
@ -70,7 +70,7 @@ msgid "Spanish"
msgstr "español" msgstr "español"
#: conf/global_settings.py:57 #: conf/global_settings.py:57
msgid "Argentinean Spanish" msgid "Argentinian Spanish"
msgstr "español de Argentina" msgstr "español de Argentina"
#: conf/global_settings.py:58 #: conf/global_settings.py:58
@ -166,98 +166,102 @@ msgid "Macedonian"
msgstr "macedonio" msgstr "macedonio"
#: conf/global_settings.py:81 #: conf/global_settings.py:81
msgid "Malayalam"
msgstr "Malayalam"
#: conf/global_settings.py:82
msgid "Mongolian" msgid "Mongolian"
msgstr "mongol" msgstr "mongol"
#: conf/global_settings.py:82 #: conf/global_settings.py:83
msgid "Dutch" msgid "Dutch"
msgstr "holandés" msgstr "holandés"
#: conf/global_settings.py:83 #: conf/global_settings.py:84
msgid "Norwegian" msgid "Norwegian"
msgstr "noruego" msgstr "noruego"
#: conf/global_settings.py:84 #: conf/global_settings.py:85
msgid "Norwegian Bokmal" msgid "Norwegian Bokmal"
msgstr "bokmål" msgstr "bokmål"
#: conf/global_settings.py:85 #: conf/global_settings.py:86
msgid "Norwegian Nynorsk" msgid "Norwegian Nynorsk"
msgstr "nynorsk" msgstr "nynorsk"
#: conf/global_settings.py:86 #: conf/global_settings.py:87
msgid "Polish" msgid "Polish"
msgstr "polaco" msgstr "polaco"
#: conf/global_settings.py:87 #: conf/global_settings.py:88
msgid "Portuguese" msgid "Portuguese"
msgstr "portugués" msgstr "portugués"
#: conf/global_settings.py:88 #: conf/global_settings.py:89
msgid "Brazilian Portuguese" msgid "Brazilian Portuguese"
msgstr "portugués de Brasil" msgstr "portugués de Brasil"
#: conf/global_settings.py:89 #: conf/global_settings.py:90
msgid "Romanian" msgid "Romanian"
msgstr "rumano" msgstr "rumano"
#: conf/global_settings.py:90 #: conf/global_settings.py:91
msgid "Russian" msgid "Russian"
msgstr "ruso" msgstr "ruso"
#: conf/global_settings.py:91 #: conf/global_settings.py:92
msgid "Slovak" msgid "Slovak"
msgstr "eslovaco" msgstr "eslovaco"
#: conf/global_settings.py:92 #: conf/global_settings.py:93
msgid "Slovenian" msgid "Slovenian"
msgstr "esloveno" msgstr "esloveno"
#: conf/global_settings.py:93 #: conf/global_settings.py:94
msgid "Albanian" msgid "Albanian"
msgstr "albanés" msgstr "albanés"
#: conf/global_settings.py:94 #: conf/global_settings.py:95
msgid "Serbian" msgid "Serbian"
msgstr "serbio" msgstr "serbio"
#: conf/global_settings.py:95 #: conf/global_settings.py:96
msgid "Serbian Latin" msgid "Serbian Latin"
msgstr "Latín de Serbia" msgstr "Latín de Serbia"
#: conf/global_settings.py:96 #: conf/global_settings.py:97
msgid "Swedish" msgid "Swedish"
msgstr "sueco" msgstr "sueco"
#: conf/global_settings.py:97 #: conf/global_settings.py:98
msgid "Tamil" msgid "Tamil"
msgstr "tamil" msgstr "tamil"
#: conf/global_settings.py:98 #: conf/global_settings.py:99
msgid "Telugu" msgid "Telugu"
msgstr "telugu" msgstr "telugu"
#: conf/global_settings.py:99 #: conf/global_settings.py:100
msgid "Thai" msgid "Thai"
msgstr "tailandés" msgstr "tailandés"
#: conf/global_settings.py:100 #: conf/global_settings.py:101
msgid "Turkish" msgid "Turkish"
msgstr "turco" msgstr "turco"
#: conf/global_settings.py:101 #: conf/global_settings.py:102
msgid "Ukrainian" msgid "Ukrainian"
msgstr "ucraniano" msgstr "ucraniano"
#: conf/global_settings.py:102 #: conf/global_settings.py:103
msgid "Vietnamese" msgid "Vietnamese"
msgstr "vietnamita" msgstr "vietnamita"
#: conf/global_settings.py:103 #: conf/global_settings.py:104
msgid "Simplified Chinese" msgid "Simplified Chinese"
msgstr "chino simplificado" msgstr "chino simplificado"
#: conf/global_settings.py:104 #: conf/global_settings.py:105
msgid "Traditional Chinese" msgid "Traditional Chinese"
msgstr "chino tradicional" msgstr "chino tradicional"
@ -309,15 +313,15 @@ msgstr "Este mes"
msgid "This year" msgid "This year"
msgstr "Este año" msgstr "Este año"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469 #: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "Yes" msgid "Yes"
msgstr "Sí" msgstr "Sí"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469 #: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "No" msgid "No"
msgstr "No" msgstr "No"
#: contrib/admin/filterspecs.py:154 forms/widgets.py:469 #: contrib/admin/filterspecs.py:154 forms/widgets.py:478
msgid "Unknown" msgid "Unknown"
msgstr "Desconocido" msgstr "Desconocido"
@ -363,7 +367,7 @@ msgid "Changed %s."
msgstr "Modifica %s." msgstr "Modifica %s."
#: contrib/admin/options.py:559 contrib/admin/options.py:569 #: contrib/admin/options.py:559 contrib/admin/options.py:569
#: contrib/comments/templates/comments/preview.html:16 db/models/base.py:844 #: contrib/comments/templates/comments/preview.html:16 db/models/base.py:845
#: forms/models.py:568 #: forms/models.py:568
msgid "and" msgid "and"
msgstr "y" msgstr "y"
@ -692,7 +696,7 @@ msgid "Filter"
msgstr "Filtrar" msgstr "Filtrar"
#: contrib/admin/templates/admin/delete_confirmation.html:10 #: contrib/admin/templates/admin/delete_confirmation.html:10
#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:302 #: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:300
msgid "Delete" msgid "Delete"
msgstr "Eliminar" msgstr "Eliminar"
@ -855,13 +859,17 @@ msgstr "Guardar y agregar otro"
msgid "Save and continue editing" msgid "Save and continue editing"
msgstr "Guardar y continuar editando" msgstr "Guardar y continuar editando"
#: contrib/admin/templates/admin/auth/user/add_form.html:5 #: contrib/admin/templates/admin/auth/user/add_form.html:6
msgid "" msgid ""
"First, enter a username and password. Then, you'll be able to edit more user " "First, enter a username and password. Then, you'll be able to edit more user "
"options." "options."
msgstr "" msgstr ""
"Primero, introduzca un nombre de usuario y una contraseña. Luego podrá " "Primero introduzca un nombre de usuario y una contraseña. Luego podrá "
"configurar opciones adicionales." "configurar opciones adicionales acerca del usuario."
#: contrib/admin/templates/admin/auth/user/add_form.html:8
msgid "Enter a username and password."
msgstr "Introduzca un nombre de usuario y una contraseña."
#: contrib/admin/templates/admin/auth/user/change_password.html:28 #: contrib/admin/templates/admin/auth/user/change_password.html:28
#, python-format #, python-format
@ -873,7 +881,7 @@ msgstr ""
#: contrib/admin/templates/admin/auth/user/change_password.html:35 #: contrib/admin/templates/admin/auth/user/change_password.html:35
#: contrib/auth/forms.py:17 contrib/auth/forms.py:61 contrib/auth/forms.py:186 #: contrib/auth/forms.py:17 contrib/auth/forms.py:61 contrib/auth/forms.py:186
msgid "Password" msgid "Password"
msgstr "Contraseña:" msgstr "Contraseña"
#: contrib/admin/templates/admin/auth/user/change_password.html:41 #: contrib/admin/templates/admin/auth/user/change_password.html:41
#: contrib/admin/templates/registration/password_change_form.html:37 #: contrib/admin/templates/registration/password_change_form.html:37
@ -1243,7 +1251,7 @@ msgstr "Cambiar contraseña: %s"
#: contrib/auth/forms.py:14 contrib/auth/forms.py:48 contrib/auth/forms.py:60 #: contrib/auth/forms.py:14 contrib/auth/forms.py:48 contrib/auth/forms.py:60
msgid "Username" msgid "Username"
msgstr "Nombre de usuario:" msgstr "Nombre de usuario"
#: contrib/auth/forms.py:15 contrib/auth/forms.py:49 #: contrib/auth/forms.py:15 contrib/auth/forms.py:49
msgid "Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only." msgid "Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only."
@ -1435,8 +1443,8 @@ msgstr "mensaje"
msgid "Logged out" msgid "Logged out"
msgstr "Sesión cerrada" msgstr "Sesión cerrada"
#: contrib/auth/management/commands/createsuperuser.py:23 #: contrib/auth/management/commands/createsuperuser.py:24
#: core/validators.py:120 forms/fields.py:428 #: core/validators.py:120 forms/fields.py:427
msgid "Enter a valid e-mail address." msgid "Enter a valid e-mail address."
msgstr "Introduzca una dirección de correo electrónico válida" msgstr "Introduzca una dirección de correo electrónico válida"
@ -1504,7 +1512,7 @@ msgid "Email address"
msgstr "Dirección de correo electrónico" msgstr "Dirección de correo electrónico"
#: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8 #: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8
#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1101 #: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1109
msgid "URL" msgid "URL"
msgstr "URL" msgstr "URL"
@ -1553,7 +1561,7 @@ msgstr "comentario"
msgid "date/time submitted" msgid "date/time submitted"
msgstr "fecha/hora de envío" msgstr "fecha/hora de envío"
#: contrib/comments/models.py:60 db/models/fields/__init__.py:896 #: contrib/comments/models.py:60 db/models/fields/__init__.py:904
msgid "IP address" msgid "IP address"
msgstr "Dirección IP" msgstr "Dirección IP"
@ -4503,20 +4511,20 @@ msgstr "sitios"
msgid "Enter a valid value." msgid "Enter a valid value."
msgstr "Introduzca un valor válido." msgstr "Introduzca un valor válido."
#: core/validators.py:87 forms/fields.py:529 #: core/validators.py:87 forms/fields.py:528
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "Introduzca una URL válida." msgstr "Introduzca una URL válida."
#: core/validators.py:89 forms/fields.py:530 #: core/validators.py:89 forms/fields.py:529
msgid "This URL appears to be a broken link." msgid "This URL appears to be a broken link."
msgstr "La URL parece ser un enlace roto." msgstr "La URL parece ser un enlace roto."
#: core/validators.py:123 forms/fields.py:873 #: core/validators.py:123 forms/fields.py:877
msgid "" msgid ""
"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
msgstr "Introduzca un 'slug' válido consistente de letras, números o guiones." msgstr "Introduzca un 'slug' válido consistente de letras, números o guiones."
#: core/validators.py:126 forms/fields.py:866 #: core/validators.py:126 forms/fields.py:870
msgid "Enter a valid IPv4 address." msgid "Enter a valid IPv4 address."
msgstr "Introduzca una dirección IPv4 válida" msgstr "Introduzca una dirección IPv4 válida"
@ -4528,15 +4536,15 @@ msgstr "Introduzca sólo dígitos separados por comas."
#, python-format #, python-format
msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
msgstr "" msgstr ""
"Asegúrese de que este valor sea %(limit_value)s (actualmente es %(show_value)" "Asegúrese de que este valor sea %(limit_value)s (actualmente es "
"s)." "%(show_value)s)."
#: core/validators.py:153 forms/fields.py:205 forms/fields.py:257 #: core/validators.py:153 forms/fields.py:204 forms/fields.py:256
#, python-format #, python-format
msgid "Ensure this value is less than or equal to %(limit_value)s." msgid "Ensure this value is less than or equal to %(limit_value)s."
msgstr "Asegúrese de que este valor sea menor o igual a %(limit_value)s." msgstr "Asegúrese de que este valor sea menor o igual a %(limit_value)s."
#: core/validators.py:158 forms/fields.py:206 forms/fields.py:258 #: core/validators.py:158 forms/fields.py:205 forms/fields.py:257
#, python-format #, python-format
msgid "Ensure this value is greater than or equal to %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s."
msgstr "Asegúrese de que este valor sea mayor o igual a %(limit_value)s." msgstr "Asegúrese de que este valor sea mayor o igual a %(limit_value)s."
@ -4544,8 +4552,8 @@ msgstr "Asegúrese de que este valor sea mayor o igual a %(limit_value)s."
#: core/validators.py:164 #: core/validators.py:164
#, python-format #, python-format
msgid "" msgid ""
"Ensure this value has at least %(limit_value)d characters (it has %" "Ensure this value has at least %(limit_value)d characters (it has "
"(show_value)d)." "%(show_value)d)."
msgstr "" msgstr ""
"Asegúrese de que este valor tenga al menos %(limit_value)d caracteres (tiene " "Asegúrese de que este valor tenga al menos %(limit_value)d caracteres (tiene "
"%(show_value)d)." "%(show_value)d)."
@ -4553,20 +4561,20 @@ msgstr ""
#: core/validators.py:170 #: core/validators.py:170
#, python-format #, python-format
msgid "" msgid ""
"Ensure this value has at most %(limit_value)d characters (it has %" "Ensure this value has at most %(limit_value)d characters (it has "
"(show_value)d)." "%(show_value)d)."
msgstr "" msgstr ""
"Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres " "Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres "
"(tiene %(show_value)d)." "(tiene %(show_value)d)."
#: db/models/base.py:822 #: db/models/base.py:823
#, python-format #, python-format
msgid "%(field_name)s must be unique for %(date_field)s %(lookup)s." msgid "%(field_name)s must be unique for %(date_field)s %(lookup)s."
msgstr "" msgstr ""
"%(field_name)s debe ser único/a para un %(lookup)s %(date_field)s " "%(field_name)s debe ser único/a para un %(lookup)s %(date_field)s "
"determinado." "determinado."
#: db/models/base.py:837 db/models/base.py:845 #: db/models/base.py:838 db/models/base.py:846
#, python-format #, python-format
msgid "%(model_name)s with this %(field_label)s already exists." msgid "%(model_name)s with this %(field_label)s already exists."
msgstr "Ya existe un/a %(model_name)s con este/a %(field_label)s." msgstr "Ya existe un/a %(model_name)s con este/a %(field_label)s."
@ -4589,13 +4597,13 @@ msgstr "Este campo no puede estar en blanco."
msgid "Field of type: %(field_type)s" msgid "Field of type: %(field_type)s"
msgstr "Campo tipo: %(field_type)s" msgstr "Campo tipo: %(field_type)s"
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:852 #: db/models/fields/__init__.py:451 db/models/fields/__init__.py:860
#: db/models/fields/__init__.py:961 db/models/fields/__init__.py:972 #: db/models/fields/__init__.py:969 db/models/fields/__init__.py:980
#: db/models/fields/__init__.py:999 #: db/models/fields/__init__.py:1007
msgid "Integer" msgid "Integer"
msgstr "Entero" msgstr "Entero"
#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:850 #: db/models/fields/__init__.py:455 db/models/fields/__init__.py:858
msgid "This value must be an integer." msgid "This value must be an integer."
msgstr "Este valor debe ser un número entero." msgstr "Este valor debe ser un número entero."
@ -4607,7 +4615,7 @@ msgstr "Este valor debe ser True o False."
msgid "Boolean (Either True or False)" msgid "Boolean (Either True or False)"
msgstr "Booleano (Verdadero o Falso)" msgstr "Booleano (Verdadero o Falso)"
#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:982 #: db/models/fields/__init__.py:539 db/models/fields/__init__.py:990
#, python-format #, python-format
msgid "String (up to %(max_length)s)" msgid "String (up to %(max_length)s)"
msgstr "Cadena (máximo %(max_length)s)" msgstr "Cadena (máximo %(max_length)s)"
@ -4651,44 +4659,44 @@ msgstr "Número decimal"
msgid "E-mail address" msgid "E-mail address"
msgstr "Dirección de correo electrónico" msgstr "Dirección de correo electrónico"
#: db/models/fields/__init__.py:799 db/models/fields/files.py:220 #: db/models/fields/__init__.py:807 db/models/fields/files.py:220
#: db/models/fields/files.py:331 #: db/models/fields/files.py:331
msgid "File path" msgid "File path"
msgstr "Ruta de archivo" msgstr "Ruta de archivo"
#: db/models/fields/__init__.py:822 #: db/models/fields/__init__.py:830
msgid "This value must be a float." msgid "This value must be a float."
msgstr "Este valor debe ser un valor en representación de punto flotante." msgstr "Este valor debe ser un valor en representación de punto flotante."
#: db/models/fields/__init__.py:824 #: db/models/fields/__init__.py:832
msgid "Floating point number" msgid "Floating point number"
msgstr "Número de punto flotante" msgstr "Número de punto flotante"
#: db/models/fields/__init__.py:883 #: db/models/fields/__init__.py:891
msgid "Big (8 byte) integer" msgid "Big (8 byte) integer"
msgstr "Entero grande (8 bytes)" msgstr "Entero grande (8 bytes)"
#: db/models/fields/__init__.py:912 #: db/models/fields/__init__.py:920
msgid "This value must be either None, True or False." msgid "This value must be either None, True or False."
msgstr "Este valor debe ser None, True o False." msgstr "Este valor debe ser None, True o False."
#: db/models/fields/__init__.py:914 #: db/models/fields/__init__.py:922
msgid "Boolean (Either True, False or None)" msgid "Boolean (Either True, False or None)"
msgstr "Booleano (Verdadero, Falso o Nulo)" msgstr "Booleano (Verdadero, Falso o Nulo)"
#: db/models/fields/__init__.py:1005 #: db/models/fields/__init__.py:1013
msgid "Text" msgid "Text"
msgstr "Texto" msgstr "Texto"
#: db/models/fields/__init__.py:1021 #: db/models/fields/__init__.py:1029
msgid "Time" msgid "Time"
msgstr "Hora" msgstr "Hora"
#: db/models/fields/__init__.py:1025 #: db/models/fields/__init__.py:1033
msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format." msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
msgstr "Introduzca un valor de hora válido en formato HH:MM[:ss[.uuuuuu]]." msgstr "Introduzca un valor de hora válido en formato HH:MM[:ss[.uuuuuu]]."
#: db/models/fields/__init__.py:1109 #: db/models/fields/__init__.py:1125
msgid "XML text" msgid "XML text"
msgstr "Texto XML" msgstr "Texto XML"
@ -4701,22 +4709,22 @@ msgstr "No existe un modelo %(model)s con una clave primaria %(pk)r."
msgid "Foreign Key (type determined by related field)" msgid "Foreign Key (type determined by related field)"
msgstr "Clave foránea (el tipo está determinado por el campo relacionado)" msgstr "Clave foránea (el tipo está determinado por el campo relacionado)"
#: db/models/fields/related.py:918 #: db/models/fields/related.py:919
msgid "One-to-one relationship" msgid "One-to-one relationship"
msgstr "Relación uno-a-uno" msgstr "Relación uno-a-uno"
#: db/models/fields/related.py:980 #: db/models/fields/related.py:981
msgid "Many-to-many relationship" msgid "Many-to-many relationship"
msgstr "Relación muchos-a-muchos" msgstr "Relación muchos-a-muchos"
#: db/models/fields/related.py:1000 #: db/models/fields/related.py:1001
msgid "" msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr "" msgstr ""
"Mantenga presionada \"Control\" (\"Command\" en una Mac) para seleccionar " "Mantenga presionada \"Control\" (\"Command\" en una Mac) para seleccionar "
"más de uno." "más de uno."
#: db/models/fields/related.py:1061 #: db/models/fields/related.py:1062
#, python-format #, python-format
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
msgid_plural "" msgid_plural ""
@ -4732,55 +4740,55 @@ msgstr[1] ""
msgid "This field is required." msgid "This field is required."
msgstr "Este campo es obligatorio." msgstr "Este campo es obligatorio."
#: forms/fields.py:204 #: forms/fields.py:203
msgid "Enter a whole number." msgid "Enter a whole number."
msgstr "Introduzca un número entero." msgstr "Introduzca un número entero."
#: forms/fields.py:235 forms/fields.py:256 #: forms/fields.py:234 forms/fields.py:255
msgid "Enter a number." msgid "Enter a number."
msgstr "Introduzca un número." msgstr "Introduzca un número."
#: forms/fields.py:259 #: forms/fields.py:258
#, python-format #, python-format
msgid "Ensure that there are no more than %s digits in total." msgid "Ensure that there are no more than %s digits in total."
msgstr "Asegúrese de que no existan en total mas de %s dígitos." msgstr "Asegúrese de que no existan en total mas de %s dígitos."
#: forms/fields.py:260 #: forms/fields.py:259
#, python-format #, python-format
msgid "Ensure that there are no more than %s decimal places." msgid "Ensure that there are no more than %s decimal places."
msgstr "Asegúrese de que no existan mas de %s lugares decimales." msgstr "Asegúrese de que no existan mas de %s lugares decimales."
#: forms/fields.py:261 #: forms/fields.py:260
#, python-format #, python-format
msgid "Ensure that there are no more than %s digits before the decimal point." msgid "Ensure that there are no more than %s digits before the decimal point."
msgstr "Asegúrese de que no existan mas de %s dígitos antes del punto decimal." msgstr "Asegúrese de que no existan mas de %s dígitos antes del punto decimal."
#: forms/fields.py:323 forms/fields.py:838 #: forms/fields.py:322 forms/fields.py:837
msgid "Enter a valid date." msgid "Enter a valid date."
msgstr "Introduzca una fecha válida." msgstr "Introduzca una fecha válida."
#: forms/fields.py:351 forms/fields.py:839 #: forms/fields.py:350 forms/fields.py:838
msgid "Enter a valid time." msgid "Enter a valid time."
msgstr "Introduzca un valor de hora válido." msgstr "Introduzca un valor de hora válido."
#: forms/fields.py:377 #: forms/fields.py:376
msgid "Enter a valid date/time." msgid "Enter a valid date/time."
msgstr "Introduzca un valor de fecha/hora válido." msgstr "Introduzca un valor de fecha/hora válido."
#: forms/fields.py:435 #: forms/fields.py:434
msgid "No file was submitted. Check the encoding type on the form." msgid "No file was submitted. Check the encoding type on the form."
msgstr "" msgstr ""
"No se envió un archivo. Verifique el tipo de codificación en el formulario." "No se envió un archivo. Verifique el tipo de codificación en el formulario."
#: forms/fields.py:436 #: forms/fields.py:435
msgid "No file was submitted." msgid "No file was submitted."
msgstr "No se envió ningún archivo." msgstr "No se envió ningún archivo."
#: forms/fields.py:437 #: forms/fields.py:436
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "El archivo enviado está vacío." msgstr "El archivo enviado está vacío."
#: forms/fields.py:438 #: forms/fields.py:437
#, python-format #, python-format
msgid "" msgid ""
"Ensure this filename has at most %(max)d characters (it has %(length)d)." "Ensure this filename has at most %(max)d characters (it has %(length)d)."
@ -4788,7 +4796,7 @@ msgstr ""
"Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracteres " "Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracteres "
"(tiene %(length)d)." "(tiene %(length)d)."
#: forms/fields.py:473 #: forms/fields.py:472
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
@ -4796,18 +4804,18 @@ msgstr ""
"Seleccione una imagen válida. El archivo que ha seleccionado no es una " "Seleccione una imagen válida. El archivo que ha seleccionado no es una "
"imagen o es un un archivo de imagen corrupto." "imagen o es un un archivo de imagen corrupto."
#: forms/fields.py:596 forms/fields.py:671 #: forms/fields.py:595 forms/fields.py:670
#, python-format #, python-format
msgid "Select a valid choice. %(value)s is not one of the available choices." msgid "Select a valid choice. %(value)s is not one of the available choices."
msgstr "" msgstr ""
"Seleccione una opción válida. %(value)s no es una de las opciones " "Seleccione una opción válida. %(value)s no es una de las opciones "
"disponibles." "disponibles."
#: forms/fields.py:672 forms/fields.py:734 forms/models.py:1002 #: forms/fields.py:671 forms/fields.py:733 forms/models.py:1002
msgid "Enter a list of values." msgid "Enter a list of values."
msgstr "Introduzca una lista de valores." msgstr "Introduzca una lista de valores."
#: forms/formsets.py:298 forms/formsets.py:300 #: forms/formsets.py:296 forms/formsets.py:298
msgid "Order" msgid "Order"
msgstr "Ordenar" msgstr "Ordenar"

View File

@ -6,8 +6,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django\n" "Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-05-04 22:01-0300\n" "POT-Creation-Date: 2010-08-06 15:47-0300\n"
"PO-Revision-Date: 2010-05-04 22:10-0300\n" "PO-Revision-Date: 2010-08-06 15:52-0300\n"
"Last-Translator: Ramiro Morales <rm0@gmx.net>\n" "Last-Translator: Ramiro Morales <rm0@gmx.net>\n"
"Language-Team: Django-I18N <django-i18n@googlegroups.com>\n" "Language-Team: Django-I18N <django-i18n@googlegroups.com>\n"
"Language: es_AR\n" "Language: es_AR\n"
@ -17,45 +17,17 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Pootle 2.0.1\n" "X-Generator: Pootle 2.0.1\n"
#: contrib/admin/media/js/SelectFilter2.js:37
#, perl-format
msgid "Available %s"
msgstr "%s disponibles"
#: contrib/admin/media/js/SelectFilter2.js:45
msgid "Choose all"
msgstr "Seleccionar todos"
#: contrib/admin/media/js/SelectFilter2.js:50
msgid "Add"
msgstr "Agregar"
#: contrib/admin/media/js/SelectFilter2.js:52
msgid "Remove"
msgstr "Eliminar"
#: contrib/admin/media/js/SelectFilter2.js:57
#, perl-format
msgid "Chosen %s"
msgstr "%s elegidos"
#: contrib/admin/media/js/SelectFilter2.js:58
msgid "Select your choice(s) and click "
msgstr "Seleccione los items a agregar y haga click en "
#: contrib/admin/media/js/SelectFilter2.js:63 #: contrib/admin/media/js/SelectFilter2.js:63
msgid "Clear all" msgid "Clear all"
msgstr "Eliminar todos" msgstr "Eliminar todos"
#: contrib/admin/media/js/actions.js:18 #: contrib/admin/media/js/actions.js:18
#: contrib/admin/media/js/actions.min.js:1
msgid "%(sel)s of %(cnt)s selected" msgid "%(sel)s of %(cnt)s selected"
msgid_plural "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected"
msgstr[0] "%(sel)s de %(cnt)s seleccionado/a" msgstr[0] "%(sel)s de %(cnt)s seleccionado/a"
msgstr[1] "%(sel)s de %(cnt)s seleccionados/as" msgstr[1] "%(sel)s de %(cnt)s seleccionados/as"
#: contrib/admin/media/js/actions.js:109 #: contrib/admin/media/js/actions.js:109
#: contrib/admin/media/js/actions.min.js:5
msgid "" msgid ""
"You have unsaved changes on individual editable fields. If you run an " "You have unsaved changes on individual editable fields. If you run an "
"action, your unsaved changes will be lost." "action, your unsaved changes will be lost."

File diff suppressed because it is too large Load Diff

View File

@ -10,9 +10,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django\n" "Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-05-14 11:01+0200\n" "POT-Creation-Date: 2010-08-09 12:11+0200\n"
"PO-Revision-Date: 2010-04-17 00:18+0200\n" "PO-Revision-Date: 2010-08-09 14:38+0200\n"
"Last-Translator: David Larlet <http://larlet.fr>\n" "Last-Translator: Stéphane Raimbault <stephane.raimbault@gmail.com>\n"
"Language-Team: French <http://django-fr.org>\n" "Language-Team: French <http://django-fr.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -72,7 +72,7 @@ msgid "Spanish"
msgstr "Espagnol" msgstr "Espagnol"
#: conf/global_settings.py:57 #: conf/global_settings.py:57
msgid "Argentinean Spanish" msgid "Argentinian Spanish"
msgstr "Espagnol argentin" msgstr "Espagnol argentin"
#: conf/global_settings.py:58 #: conf/global_settings.py:58
@ -168,98 +168,102 @@ msgid "Macedonian"
msgstr "Macédonien" msgstr "Macédonien"
#: conf/global_settings.py:81 #: conf/global_settings.py:81
msgid "Malayalam"
msgstr "Malayâlam"
#: conf/global_settings.py:82
msgid "Mongolian" msgid "Mongolian"
msgstr "Mongole" msgstr "Mongole"
#: conf/global_settings.py:82 #: conf/global_settings.py:83
msgid "Dutch" msgid "Dutch"
msgstr "Hollandais" msgstr "Hollandais"
#: conf/global_settings.py:83 #: conf/global_settings.py:84
msgid "Norwegian" msgid "Norwegian"
msgstr "Norvégien" msgstr "Norvégien"
#: conf/global_settings.py:84 #: conf/global_settings.py:85
msgid "Norwegian Bokmal" msgid "Norwegian Bokmal"
msgstr "Norvégien Bokmal" msgstr "Norvégien Bokmal"
#: conf/global_settings.py:85 #: conf/global_settings.py:86
msgid "Norwegian Nynorsk" msgid "Norwegian Nynorsk"
msgstr "Norvégien Nynorsk" msgstr "Norvégien Nynorsk"
#: conf/global_settings.py:86 #: conf/global_settings.py:87
msgid "Polish" msgid "Polish"
msgstr "Polonais" msgstr "Polonais"
#: conf/global_settings.py:87 #: conf/global_settings.py:88
msgid "Portuguese" msgid "Portuguese"
msgstr "Portugais" msgstr "Portugais"
#: conf/global_settings.py:88 #: conf/global_settings.py:89
msgid "Brazilian Portuguese" msgid "Brazilian Portuguese"
msgstr "Portugais brésilien" msgstr "Portugais brésilien"
#: conf/global_settings.py:89 #: conf/global_settings.py:90
msgid "Romanian" msgid "Romanian"
msgstr "Roumain" msgstr "Roumain"
#: conf/global_settings.py:90 #: conf/global_settings.py:91
msgid "Russian" msgid "Russian"
msgstr "Russe" msgstr "Russe"
#: conf/global_settings.py:91 #: conf/global_settings.py:92
msgid "Slovak" msgid "Slovak"
msgstr "Slovaque" msgstr "Slovaque"
#: conf/global_settings.py:92 #: conf/global_settings.py:93
msgid "Slovenian" msgid "Slovenian"
msgstr "Slovène" msgstr "Slovène"
#: conf/global_settings.py:93 #: conf/global_settings.py:94
msgid "Albanian" msgid "Albanian"
msgstr "Albanais" msgstr "Albanais"
#: conf/global_settings.py:94 #: conf/global_settings.py:95
msgid "Serbian" msgid "Serbian"
msgstr "Serbe" msgstr "Serbe"
#: conf/global_settings.py:95 #: conf/global_settings.py:96
msgid "Serbian Latin" msgid "Serbian Latin"
msgstr "Serbe latin" msgstr "Serbe latin"
#: conf/global_settings.py:96 #: conf/global_settings.py:97
msgid "Swedish" msgid "Swedish"
msgstr "Suédois" msgstr "Suédois"
#: conf/global_settings.py:97 #: conf/global_settings.py:98
msgid "Tamil" msgid "Tamil"
msgstr "Tamoul" msgstr "Tamoul"
#: conf/global_settings.py:98 #: conf/global_settings.py:99
msgid "Telugu" msgid "Telugu"
msgstr "Télougou" msgstr "Télougou"
#: conf/global_settings.py:99 #: conf/global_settings.py:100
msgid "Thai" msgid "Thai"
msgstr "Thaï" msgstr "Thaï"
#: conf/global_settings.py:100 #: conf/global_settings.py:101
msgid "Turkish" msgid "Turkish"
msgstr "Turc" msgstr "Turc"
#: conf/global_settings.py:101 #: conf/global_settings.py:102
msgid "Ukrainian" msgid "Ukrainian"
msgstr "Ukrainien" msgstr "Ukrainien"
#: conf/global_settings.py:102 #: conf/global_settings.py:103
msgid "Vietnamese" msgid "Vietnamese"
msgstr "Vietnamien" msgstr "Vietnamien"
#: conf/global_settings.py:103 #: conf/global_settings.py:104
msgid "Simplified Chinese" msgid "Simplified Chinese"
msgstr "Chinois simplifié" msgstr "Chinois simplifié"
#: conf/global_settings.py:104 #: conf/global_settings.py:105
msgid "Traditional Chinese" msgid "Traditional Chinese"
msgstr "Chinois traditionnel" msgstr "Chinois traditionnel"
@ -311,15 +315,15 @@ msgstr "Ce mois-ci"
msgid "This year" msgid "This year"
msgstr "Cette année" msgstr "Cette année"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469 #: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "Yes" msgid "Yes"
msgstr "Oui" msgstr "Oui"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469 #: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "No" msgid "No"
msgstr "Non" msgstr "Non"
#: contrib/admin/filterspecs.py:154 forms/widgets.py:469 #: contrib/admin/filterspecs.py:154 forms/widgets.py:478
msgid "Unknown" msgid "Unknown"
msgstr "Inconnu" msgstr "Inconnu"
@ -697,7 +701,7 @@ msgid "Filter"
msgstr "Filtre" msgstr "Filtre"
#: contrib/admin/templates/admin/delete_confirmation.html:10 #: contrib/admin/templates/admin/delete_confirmation.html:10
#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:302 #: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:300
msgid "Delete" msgid "Delete"
msgstr "Supprimer" msgstr "Supprimer"
@ -796,7 +800,7 @@ msgstr ""
#: contrib/admin/templates/admin/login.html:19 #: contrib/admin/templates/admin/login.html:19
msgid "Username:" msgid "Username:"
msgstr "Nom d'utilisateur :" msgstr "Nom d'utilisateur :"
#: contrib/admin/templates/admin/login.html:22 #: contrib/admin/templates/admin/login.html:22
msgid "Password:" msgid "Password:"
@ -859,7 +863,7 @@ msgstr "Enregistrer et ajouter un nouveau"
msgid "Save and continue editing" msgid "Save and continue editing"
msgstr "Enregistrer et continuer les modifications" msgstr "Enregistrer et continuer les modifications"
#: contrib/admin/templates/admin/auth/user/add_form.html:5 #: contrib/admin/templates/admin/auth/user/add_form.html:6
msgid "" msgid ""
"First, enter a username and password. Then, you'll be able to edit more user " "First, enter a username and password. Then, you'll be able to edit more user "
"options." "options."
@ -867,6 +871,10 @@ msgstr ""
"Saisissez tout d'abord un nom d'utilisateur et un mot de passe. Vous pourrez " "Saisissez tout d'abord un nom d'utilisateur et un mot de passe. Vous pourrez "
"ensuite modifier plus d'options." "ensuite modifier plus d'options."
#: contrib/admin/templates/admin/auth/user/add_form.html:8
msgid "Enter a username and password."
msgstr "Saisissez un nom d'utilisateur et un mot de passe."
#: contrib/admin/templates/admin/auth/user/change_password.html:28 #: contrib/admin/templates/admin/auth/user/change_password.html:28
#, python-format #, python-format
msgid "Enter a new password for the user <strong>%(username)s</strong>." msgid "Enter a new password for the user <strong>%(username)s</strong>."
@ -1441,8 +1449,8 @@ msgstr "message"
msgid "Logged out" msgid "Logged out"
msgstr "Déconnecté" msgstr "Déconnecté"
#: contrib/auth/management/commands/createsuperuser.py:23 #: contrib/auth/management/commands/createsuperuser.py:24
#: core/validators.py:120 forms/fields.py:428 #: core/validators.py:120 forms/fields.py:427
msgid "Enter a valid e-mail address." msgid "Enter a valid e-mail address."
msgstr "Entrez une adresse de courriel valide." msgstr "Entrez une adresse de courriel valide."
@ -1511,7 +1519,7 @@ msgid "Email address"
msgstr "Adresse électronique" msgstr "Adresse électronique"
#: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8 #: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8
#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1101 #: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1112
msgid "URL" msgid "URL"
msgstr "URL" msgstr "URL"
@ -1563,7 +1571,7 @@ msgstr "commentaire"
msgid "date/time submitted" msgid "date/time submitted"
msgstr "date et heure soumises" msgstr "date et heure soumises"
#: contrib/comments/models.py:60 db/models/fields/__init__.py:896 #: contrib/comments/models.py:60 db/models/fields/__init__.py:907
msgid "IP address" msgid "IP address"
msgstr "adresse IP" msgstr "adresse IP"
@ -4513,26 +4521,26 @@ msgstr "sites"
msgid "Enter a valid value." msgid "Enter a valid value."
msgstr "Saisissez une valeur valide." msgstr "Saisissez une valeur valide."
#: core/validators.py:87 forms/fields.py:529 #: core/validators.py:87 forms/fields.py:528
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "Saisissez une URL valide." msgstr "Saisissez une URL valide."
#: core/validators.py:89 forms/fields.py:530 #: core/validators.py:89 forms/fields.py:529
msgid "This URL appears to be a broken link." msgid "This URL appears to be a broken link."
msgstr "Cette URL semble être cassée." msgstr "Cette URL semble être cassée."
#: core/validators.py:123 forms/fields.py:873 #: core/validators.py:123 forms/fields.py:877
msgid "" msgid ""
"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
msgstr "" msgstr ""
"Ce champ ne doit contenir que des lettres, des nombres, des tirets bas _ et " "Ce champ ne doit contenir que des lettres, des nombres, des tirets bas _ et "
"des traits d'union." "des traits d'union."
#: core/validators.py:126 forms/fields.py:866 #: core/validators.py:126 forms/fields.py:870
msgid "Enter a valid IPv4 address." msgid "Enter a valid IPv4 address."
msgstr "Saisissez une adresse IPv4 valide." msgstr "Saisissez une adresse IPv4 valide."
#: core/validators.py:129 db/models/fields/__init__.py:572 #: core/validators.py:129 db/models/fields/__init__.py:575
msgid "Enter only digits separated by commas." msgid "Enter only digits separated by commas."
msgstr "Saisissez uniquement des chiffres séparés par des virgules." msgstr "Saisissez uniquement des chiffres séparés par des virgules."
@ -4543,13 +4551,13 @@ msgstr ""
"Assurez-vous que cette valeur est %(limit_value)s (actuellement %(show_value)" "Assurez-vous que cette valeur est %(limit_value)s (actuellement %(show_value)"
"s)." "s)."
#: core/validators.py:153 forms/fields.py:205 forms/fields.py:257 #: core/validators.py:153 forms/fields.py:204 forms/fields.py:256
#, python-format #, python-format
msgid "Ensure this value is less than or equal to %(limit_value)s." msgid "Ensure this value is less than or equal to %(limit_value)s."
msgstr "" msgstr ""
"Assurez-vous que cette valeur est inférieure ou égale à %(limit_value)s." "Assurez-vous que cette valeur est inférieure ou égale à %(limit_value)s."
#: core/validators.py:158 forms/fields.py:206 forms/fields.py:258 #: core/validators.py:158 forms/fields.py:205 forms/fields.py:257
#, python-format #, python-format
msgid "Ensure this value is greater than or equal to %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s."
msgstr "" msgstr ""
@ -4602,134 +4610,134 @@ msgstr "Ce champ ne peut pas être vide."
msgid "Field of type: %(field_type)s" msgid "Field of type: %(field_type)s"
msgstr "Champ de type : %(field_type)s" msgstr "Champ de type : %(field_type)s"
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:852 #: db/models/fields/__init__.py:451 db/models/fields/__init__.py:863
#: db/models/fields/__init__.py:961 db/models/fields/__init__.py:972 #: db/models/fields/__init__.py:972 db/models/fields/__init__.py:983
#: db/models/fields/__init__.py:999 #: db/models/fields/__init__.py:1010
msgid "Integer" msgid "Integer"
msgstr "Entier" msgstr "Entier"
#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:850 #: db/models/fields/__init__.py:455 db/models/fields/__init__.py:861
msgid "This value must be an integer." msgid "This value must be an integer."
msgstr "Cette valeur doit être un entier." msgstr "Cette valeur doit être un entier."
#: db/models/fields/__init__.py:490 #: db/models/fields/__init__.py:493
msgid "This value must be either True or False." msgid "This value must be either True or False."
msgstr "Cette valeur doit être soit vraie (True) soit fausse (False)." msgstr "Cette valeur doit être soit vraie (True) soit fausse (False)."
#: db/models/fields/__init__.py:492 #: db/models/fields/__init__.py:495
msgid "Boolean (Either True or False)" msgid "Boolean (Either True or False)"
msgstr "Booléen (soit vrai ou faux)" msgstr "Booléen (soit vrai ou faux)"
#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:982 #: db/models/fields/__init__.py:542 db/models/fields/__init__.py:993
#, python-format #, python-format
msgid "String (up to %(max_length)s)" msgid "String (up to %(max_length)s)"
msgstr "Chaîne de caractère (jusqu'à %(max_length)s)" msgstr "Chaîne de caractère (jusqu'à %(max_length)s)"
#: db/models/fields/__init__.py:567 #: db/models/fields/__init__.py:570
msgid "Comma-separated integers" msgid "Comma-separated integers"
msgstr "Des entiers séparés par une virgule" msgstr "Des entiers séparés par une virgule"
#: db/models/fields/__init__.py:581 #: db/models/fields/__init__.py:584
msgid "Date (without time)" msgid "Date (without time)"
msgstr "Date (sans l'heure)" msgstr "Date (sans l'heure)"
#: db/models/fields/__init__.py:585 #: db/models/fields/__init__.py:588
msgid "Enter a valid date in YYYY-MM-DD format." msgid "Enter a valid date in YYYY-MM-DD format."
msgstr "Saisissez une date valide au format AAAA-MM-JJ." msgstr "Saisissez une date valide au format AAAA-MM-JJ."
#: db/models/fields/__init__.py:586 #: db/models/fields/__init__.py:589
#, python-format #, python-format
msgid "Invalid date: %s" msgid "Invalid date: %s"
msgstr "Date non valide : %s" msgstr "Date non valide : %s"
#: db/models/fields/__init__.py:667 #: db/models/fields/__init__.py:670
msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format." msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format."
msgstr "" msgstr ""
"Saisissez une date et une heure valides au format AAAA-MM-JJ HH:MM[:ss[." "Saisissez une date et une heure valides au format AAAA-MM-JJ HH:MM[:ss[."
"uuuuuu]]." "uuuuuu]]."
#: db/models/fields/__init__.py:669 #: db/models/fields/__init__.py:672
msgid "Date (with time)" msgid "Date (with time)"
msgstr "Date (avec l'heure)" msgstr "Date (avec l'heure)"
#: db/models/fields/__init__.py:735 #: db/models/fields/__init__.py:738
msgid "This value must be a decimal number." msgid "This value must be a decimal number."
msgstr "Cette valeur doit être un nombre décimal." msgstr "Cette valeur doit être un nombre décimal."
#: db/models/fields/__init__.py:737 #: db/models/fields/__init__.py:740
msgid "Decimal number" msgid "Decimal number"
msgstr "Nombre décimal" msgstr "Nombre décimal"
#: db/models/fields/__init__.py:792 #: db/models/fields/__init__.py:795
msgid "E-mail address" msgid "E-mail address"
msgstr "Adresse électronique" msgstr "Adresse électronique"
#: db/models/fields/__init__.py:799 db/models/fields/files.py:220 #: db/models/fields/__init__.py:810 db/models/fields/files.py:220
#: db/models/fields/files.py:331 #: db/models/fields/files.py:331
msgid "File path" msgid "File path"
msgstr "Chemin vers le fichier" msgstr "Chemin vers le fichier"
#: db/models/fields/__init__.py:822 #: db/models/fields/__init__.py:833
msgid "This value must be a float." msgid "This value must be a float."
msgstr "Cette valeur doit être un nombre réel." msgstr "Cette valeur doit être un nombre réel."
#: db/models/fields/__init__.py:824 #: db/models/fields/__init__.py:835
msgid "Floating point number" msgid "Floating point number"
msgstr "Nombre à virgule flottante" msgstr "Nombre à virgule flottante"
#: db/models/fields/__init__.py:883 #: db/models/fields/__init__.py:894
msgid "Big (8 byte) integer" msgid "Big (8 byte) integer"
msgstr "Grand entier (8 octets)" msgstr "Grand entier (8 octets)"
#: db/models/fields/__init__.py:912 #: db/models/fields/__init__.py:923
msgid "This value must be either None, True or False." msgid "This value must be either None, True or False."
msgstr "Cette valeur doit être nulle (None), vraie (True) ou fausse (False)." msgstr "Cette valeur doit être nulle (None), vraie (True) ou fausse (False)."
#: db/models/fields/__init__.py:914 #: db/models/fields/__init__.py:925
msgid "Boolean (Either True, False or None)" msgid "Boolean (Either True, False or None)"
msgstr "Booléen (soit vrai, faux ou nul)" msgstr "Booléen (soit vrai, faux ou nul)"
#: db/models/fields/__init__.py:1005 #: db/models/fields/__init__.py:1016
msgid "Text" msgid "Text"
msgstr "Texte" msgstr "Texte"
#: db/models/fields/__init__.py:1021 #: db/models/fields/__init__.py:1032
msgid "Time" msgid "Time"
msgstr "Heure" msgstr "Heure"
#: db/models/fields/__init__.py:1025 #: db/models/fields/__init__.py:1036
msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format." msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
msgstr "Saisissez une heure valide au format HH:MM[:ss[.uuuuuu]]." msgstr "Saisissez une heure valide au format HH:MM[:ss[.uuuuuu]]."
#: db/models/fields/__init__.py:1109 #: db/models/fields/__init__.py:1128
msgid "XML text" msgid "XML text"
msgstr "Texte XML" msgstr "Texte XML"
#: db/models/fields/related.py:799 #: db/models/fields/related.py:801
#, python-format #, python-format
msgid "Model %(model)s with pk %(pk)r does not exist." msgid "Model %(model)s with pk %(pk)r does not exist."
msgstr "Le modèle %(model)s avec la clef primaire %(pk)r n'existe pas." msgstr "Le modèle %(model)s avec la clef primaire %(pk)r n'existe pas."
#: db/models/fields/related.py:801 #: db/models/fields/related.py:803
msgid "Foreign Key (type determined by related field)" msgid "Foreign Key (type determined by related field)"
msgstr "Clé étrangère (type défini par le champ lié)" msgstr "Clé étrangère (type défini par le champ lié)"
#: db/models/fields/related.py:918 #: db/models/fields/related.py:921
msgid "One-to-one relationship" msgid "One-to-one relationship"
msgstr "Relation un à un" msgstr "Relation un à un"
#: db/models/fields/related.py:980 #: db/models/fields/related.py:983
msgid "Many-to-many relationship" msgid "Many-to-many relationship"
msgstr "Relation plusieurs à plusieurs" msgstr "Relation plusieurs à plusieurs"
#: db/models/fields/related.py:1000 #: db/models/fields/related.py:1003
msgid "" msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr "" msgstr ""
"Maintenez appuyé « Ctrl », ou « Commande (touche pomme) » sur un Mac, pour en " "Maintenez appuyé « Ctrl », ou « Commande (touche pomme) » sur un Mac, pour en "
"sélectionner plusieurs." "sélectionner plusieurs."
#: db/models/fields/related.py:1061 #: db/models/fields/related.py:1064
#, python-format #, python-format
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
msgid_plural "" msgid_plural ""
@ -4743,55 +4751,55 @@ msgstr[1] ""
msgid "This field is required." msgid "This field is required."
msgstr "Ce champ est obligatoire." msgstr "Ce champ est obligatoire."
#: forms/fields.py:204 #: forms/fields.py:203
msgid "Enter a whole number." msgid "Enter a whole number."
msgstr "Saisissez un nombre entier." msgstr "Saisissez un nombre entier."
#: forms/fields.py:235 forms/fields.py:256 #: forms/fields.py:234 forms/fields.py:255
msgid "Enter a number." msgid "Enter a number."
msgstr "Saisissez un nombre." msgstr "Saisissez un nombre."
#: forms/fields.py:259 #: forms/fields.py:258
#, python-format #, python-format
msgid "Ensure that there are no more than %s digits in total." msgid "Ensure that there are no more than %s digits in total."
msgstr "Assurez-vous qu'il n'y a pas plus de %s chiffres au total." msgstr "Assurez-vous qu'il n'y a pas plus de %s chiffres au total."
#: forms/fields.py:260 #: forms/fields.py:259
#, python-format #, python-format
msgid "Ensure that there are no more than %s decimal places." msgid "Ensure that there are no more than %s decimal places."
msgstr "Assurez-vous qu'il n'y a pas plus de %s chiffres après la virgule." msgstr "Assurez-vous qu'il n'y a pas plus de %s chiffres après la virgule."
#: forms/fields.py:261 #: forms/fields.py:260
#, python-format #, python-format
msgid "Ensure that there are no more than %s digits before the decimal point." msgid "Ensure that there are no more than %s digits before the decimal point."
msgstr "Assurez-vous qu'il n'y a pas plus de %s chiffres avant la virgule." msgstr "Assurez-vous qu'il n'y a pas plus de %s chiffres avant la virgule."
#: forms/fields.py:323 forms/fields.py:838 #: forms/fields.py:322 forms/fields.py:837
msgid "Enter a valid date." msgid "Enter a valid date."
msgstr "Saisissez une date valide." msgstr "Saisissez une date valide."
#: forms/fields.py:351 forms/fields.py:839 #: forms/fields.py:350 forms/fields.py:838
msgid "Enter a valid time." msgid "Enter a valid time."
msgstr "Saisissez une heure valide." msgstr "Saisissez une heure valide."
#: forms/fields.py:377 #: forms/fields.py:376
msgid "Enter a valid date/time." msgid "Enter a valid date/time."
msgstr "Saisissez une date et une heure valides." msgstr "Saisissez une date et une heure valides."
#: forms/fields.py:435 #: forms/fields.py:434
msgid "No file was submitted. Check the encoding type on the form." msgid "No file was submitted. Check the encoding type on the form."
msgstr "" msgstr ""
"Aucun fichier n'a été soumis. Vérifiez le type d'encodage du formulaire." "Aucun fichier n'a été soumis. Vérifiez le type d'encodage du formulaire."
#: forms/fields.py:436 #: forms/fields.py:435
msgid "No file was submitted." msgid "No file was submitted."
msgstr "Aucun fichier n'a été soumis." msgstr "Aucun fichier n'a été soumis."
#: forms/fields.py:437 #: forms/fields.py:436
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "Le fichier soumis est vide." msgstr "Le fichier soumis est vide."
#: forms/fields.py:438 #: forms/fields.py:437
#, python-format #, python-format
msgid "" msgid ""
"Ensure this filename has at most %(max)d characters (it has %(length)d)." "Ensure this filename has at most %(max)d characters (it has %(length)d)."
@ -4799,7 +4807,7 @@ msgstr ""
"Assurez-vous que ce nom de fichier ne contient pas plus de %(max)d " "Assurez-vous que ce nom de fichier ne contient pas plus de %(max)d "
"caractères (actuellement %(length)d caractères)." "caractères (actuellement %(length)d caractères)."
#: forms/fields.py:473 #: forms/fields.py:472
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
@ -4807,17 +4815,17 @@ msgstr ""
"Téléversez une image valide. Le fichier que vous avez transféré n'est pas " "Téléversez une image valide. Le fichier que vous avez transféré n'est pas "
"une image ou bien est corrompu." "une image ou bien est corrompu."
#: forms/fields.py:596 forms/fields.py:671 #: forms/fields.py:595 forms/fields.py:670
#, python-format #, python-format
msgid "Select a valid choice. %(value)s is not one of the available choices." msgid "Select a valid choice. %(value)s is not one of the available choices."
msgstr "Sélectionnez un choix valide. %(value)s n'en fait pas partie." msgstr "Sélectionnez un choix valide. %(value)s n'en fait pas partie."
#: forms/fields.py:672 forms/fields.py:734 forms/models.py:1002 #: forms/fields.py:671 forms/fields.py:733 forms/models.py:1002
msgid "Enter a list of values." msgid "Enter a list of values."
msgstr "Saisissez une liste de valeurs." msgstr "Saisissez une liste de valeurs."
# Si « : » est requis, créer un ticket # Si « : » est requis, créer un ticket
#: forms/formsets.py:298 forms/formsets.py:300 #: forms/formsets.py:296 forms/formsets.py:298
msgid "Order" msgid "Order"
msgstr "Ordre" msgstr "Ordre"
@ -4868,28 +4876,28 @@ msgstr "Sélectionnez un choix valide ; %s n'en fait pas partie."
msgid "\"%s\" is not a valid value for a primary key." msgid "\"%s\" is not a valid value for a primary key."
msgstr "« %s » n'est pas une valeur correcte pour une clé primaire." msgstr "« %s » n'est pas une valeur correcte pour une clé primaire."
#: template/defaultfilters.py:776 #: template/defaultfilters.py:780
msgid "yes,no,maybe" msgid "yes,no,maybe"
msgstr "oui, non, peut-être" msgstr "oui, non, peut-être"
#: template/defaultfilters.py:807 #: template/defaultfilters.py:811
#, python-format #, python-format
msgid "%(size)d byte" msgid "%(size)d byte"
msgid_plural "%(size)d bytes" msgid_plural "%(size)d bytes"
msgstr[0] "%(size)d octet" msgstr[0] "%(size)d octet"
msgstr[1] "%(size)d octets" msgstr[1] "%(size)d octets"
#: template/defaultfilters.py:809 #: template/defaultfilters.py:813
#, python-format #, python-format
msgid "%.1f KB" msgid "%.1f KB"
msgstr "%.1f Ko" msgstr "%.1f Ko"
#: template/defaultfilters.py:811 #: template/defaultfilters.py:815
#, python-format #, python-format
msgid "%.1f MB" msgid "%.1f MB"
msgstr "%.1f Mo" msgstr "%.1f Mo"
#: template/defaultfilters.py:812 #: template/defaultfilters.py:816
#, python-format #, python-format
msgid "%.1f GB" msgid "%.1f GB"
msgstr "%.1f Go" msgstr "%.1f Go"
@ -5100,7 +5108,7 @@ msgstr "nov."
msgid "Dec." msgid "Dec."
msgstr "déc." msgstr "déc."
#: utils/text.py:130 #: utils/text.py:136
msgid "or" msgid "or"
msgstr "ou" msgstr "ou"

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -0,0 +1,156 @@
# Translation of Django Js files to malayalam.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Rajeesh Nair <rajeeshrnair@gmail.com>, 2010.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Django SVN\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-05-28 15:32+0530\n"
"PO-Revision-Date: 2010-05-28 15:45+0530\n"
"Last-Translator: Rajeesh Nair <rajeeshrnair@gmail.com>\n"
"Language-Team: Malayalam <ml@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Poedit-Language: Malayalam\n"
"X-Poedit-Country: INDIA\n"
#: contrib/admin/media/js/SelectFilter2.js:37
#, perl-format
msgid "Available %s"
msgstr "ലഭ്യമായ %s"
#: contrib/admin/media/js/SelectFilter2.js:45
msgid "Choose all"
msgstr "എല്ലാം തെരഞ്ഞെടുക്കുക"
#: contrib/admin/media/js/SelectFilter2.js:50
msgid "Add"
msgstr "പുതിയത് ചേര്‍ക്കൂ"
#: contrib/admin/media/js/SelectFilter2.js:52
msgid "Remove"
msgstr "നീക്കം ചെയ്യൂ"
#: contrib/admin/media/js/SelectFilter2.js:57
#, perl-format
msgid "Chosen %s"
msgstr "തെരഞ്ഞെടുത്ത %s"
#: contrib/admin/media/js/SelectFilter2.js:58
msgid "Select your choice(s) and click "
msgstr "ഉചിതമായത് തെരഞ്ഞെടുത്ത ശേഷം ക്ളിക് ചെയ്യൂ"
#: contrib/admin/media/js/SelectFilter2.js:63
msgid "Clear all"
msgstr "എല്ലാം ക്ളിയര്‍ ചെയ്യൂ"
#: contrib/admin/media/js/actions.js:18
#: contrib/admin/media/js/actions.min.js:1
msgid "%(sel)s of %(cnt)s selected"
msgid_plural "%(sel)s of %(cnt)s selected"
msgstr[0] "%(cnt)sല് %(sel)s തെരഞ്ഞെടുത്തു"
msgstr[1] "%(cnt)sല് %(sel)s എണ്ണം തെരഞ്ഞെടുത്തു"
#: contrib/admin/media/js/actions.js:109
#: contrib/admin/media/js/actions.min.js:5
msgid ""
"You have unsaved changes on individual editable fields. If you run an "
"action, your unsaved changes will be lost."
msgstr "വരുത്തിയ മാറ്റങ്ങള്‍ സേവ് ചെയ്തിട്ടില്ല. ഒരു ആക്ഷന്‍ പ്രയോഗിച്ചാല്‍ സേവ് ചെയ്യാത്ത "
"മാറ്റങ്ങളെല്ലാം നഷ്ടപ്പെടും."
#: contrib/admin/media/js/actions.js:121
#: contrib/admin/media/js/actions.min.js:6
msgid ""
"You have selected an action, but you haven't saved your changes to "
"individual fields yet. Please click OK to save. You'll need to re-run the "
"action."
msgstr ""
"നിങ്ങള്‍ ഒരു ആക്ഷന്‍ തെരഞ്ഞെടുത്തിട്ടുണ്ട്. പക്ഷേ, കളങ്ങളിലെ മാറ്റങ്ങള്‍ ഇനിയും സേവ് ചെയ്യാനുണ്ട്. ആദ്യം സേവ്"
"ചെയ്യാനായി OK ക്ലിക് ചെയ്യുക. അതിനു ശേഷം ആക്ഷന്‍ ഒന്നു കൂടി പ്രയോഗിക്കേണ്ടി വരും."
#: contrib/admin/media/js/actions.js:123
#: contrib/admin/media/js/actions.min.js:6
msgid ""
"You have selected an action, and you haven't made any changes on individual "
"fields. You're probably looking for the Go button rather than the Save "
"button."
msgstr ""
"നിങ്ങള്‍ ഒരു ആക്ഷന്‍ തെരഞ്ഞെടുത്തിട്ടുണ്ട്. കളങ്ങളില്‍ സേവ് ചെയ്യാത്ത മാറ്റങ്ങള്‍ ഇല്ല. നിങ്ങള്‍"
"സേവ് ബട്ടണ്‍ തന്നെയാണോ അതോ ഗോ ബട്ടണാണോ ഉദ്ദേശിച്ചത്."
#: contrib/admin/media/js/calendar.js:24
#: contrib/admin/media/js/dateparse.js:32
msgid ""
"January February March April May June July August September October November "
"December"
msgstr "ജനുവരി ഫെബൃവരി മാര്‍ച്ച് ഏപ്രില്‍ മെയ് ജൂണ്‍ ജൂലൈ ആഗസ്ത് സെപ്തംബര്‍ ഒക്ടോബര്‍ നവംബര്‍ ഡിസംബര്‍"
#: contrib/admin/media/js/calendar.js:25
msgid "S M T W T F S"
msgstr "ഞാ തി ചൊ ബു വ്യാ വെ ശ"
#: contrib/admin/media/js/collapse.js:9 contrib/admin/media/js/collapse.js:21
#: contrib/admin/media/js/collapse.min.js:1
msgid "Show"
msgstr "കാണട്ടെ"
#: contrib/admin/media/js/collapse.js:16
#: contrib/admin/media/js/collapse.min.js:1
msgid "Hide"
msgstr "മറയട്ടെ"
#: contrib/admin/media/js/dateparse.js:33
msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
msgstr "ഞായര്‍ തിങ്കള്‍ ചൊവ്വ ബുധന്‍ വ്യാഴം വെള്ളി ശനി"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
msgid "Now"
msgstr "ഇപ്പോള്‍"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:52
msgid "Clock"
msgstr "ഘടികാരം (ക്ലോക്ക്)"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:79
msgid "Choose a time"
msgstr "സമയം തെരഞ്ഞെടുക്കൂ"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
msgid "Midnight"
msgstr "അര്‍ധരാത്രി"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:85
msgid "6 a.m."
msgstr "6 a.m."
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:86
msgid "Noon"
msgstr "ഉച്ച"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:90
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:187
msgid "Cancel"
msgstr "റദ്ദാക്കൂ"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:181
msgid "Today"
msgstr "ഇന്ന്"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:136
msgid "Calendar"
msgstr "കലണ്ടര്‍"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
msgid "Yesterday"
msgstr "ഇന്നലെ"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
msgid "Tomorrow"
msgstr "നാളെ"

View File

View File

@ -0,0 +1,38 @@
# -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package.
#
DATE_FORMAT = 'N j, Y'
TIME_FORMAT = 'P'
DATETIME_FORMAT = 'N j, Y, P'
YEAR_MONTH_FORMAT = 'F Y'
MONTH_DAY_FORMAT = 'F j'
SHORT_DATE_FORMAT = 'm/d/Y'
SHORT_DATETIME_FORMAT = 'm/d/Y P'
FIRST_DAY_OF_WEEK = 0 # Sunday
DATE_INPUT_FORMATS = (
'%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06'
# '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006'
# '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006'
# '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006'
# '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006'
)
TIME_INPUT_FORMATS = (
'%H:%M:%S', # '14:30:59'
'%H:%M', # '14:30'
)
DATETIME_INPUT_FORMATS = (
'%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
'%Y-%m-%d %H:%M', # '2006-10-25 14:30'
'%Y-%m-%d', # '2006-10-25'
'%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59'
'%m/%d/%Y %H:%M', # '10/25/2006 14:30'
'%m/%d/%Y', # '10/25/2006'
'%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59'
'%m/%d/%y %H:%M', # '10/25/06 14:30'
'%m/%d/%y', # '10/25/06'
)
DECIMAL_SEPARATOR = '.'
THOUSAND_SEPARATOR = ','
NUMBER_GROUPING = 3

View File

@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django\n" "Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-05-16 22:39+0200\n" "POT-Creation-Date: 2010-08-07 21:14+0200\n"
"PO-Revision-Date: 2010-03-04 12:13+0200\n" "PO-Revision-Date: 2010-03-04 12:13+0200\n"
"Last-Translator: Håvard Grimelid\n" "Last-Translator: Håvard Grimelid\n"
"Language-Team: Norsk nynorsk <nn@li.org>\n" "Language-Team: Norsk nynorsk <nn@li.org>\n"
@ -67,7 +67,7 @@ msgid "Spanish"
msgstr "Spansk" msgstr "Spansk"
#: conf/global_settings.py:57 #: conf/global_settings.py:57
msgid "Argentinean Spanish" msgid "Argentinian Spanish"
msgstr "Argentinsk spansk" msgstr "Argentinsk spansk"
#: conf/global_settings.py:58 #: conf/global_settings.py:58
@ -163,98 +163,102 @@ msgid "Macedonian"
msgstr "Makedonsk" msgstr "Makedonsk"
#: conf/global_settings.py:81 #: conf/global_settings.py:81
msgid "Malayalam"
msgstr "Malayalam"
#: conf/global_settings.py:82
msgid "Mongolian" msgid "Mongolian"
msgstr "Mongolsk" msgstr "Mongolsk"
#: conf/global_settings.py:82 #: conf/global_settings.py:83
msgid "Dutch" msgid "Dutch"
msgstr "Nederlandsk" msgstr "Nederlandsk"
#: conf/global_settings.py:83 #: conf/global_settings.py:84
msgid "Norwegian" msgid "Norwegian"
msgstr "Norsk" msgstr "Norsk"
#: conf/global_settings.py:84 #: conf/global_settings.py:85
msgid "Norwegian Bokmal" msgid "Norwegian Bokmal"
msgstr "Norsk (bokmål)" msgstr "Norsk (bokmål)"
#: conf/global_settings.py:85 #: conf/global_settings.py:86
msgid "Norwegian Nynorsk" msgid "Norwegian Nynorsk"
msgstr "Norsk (nynorsk)" msgstr "Norsk (nynorsk)"
#: conf/global_settings.py:86 #: conf/global_settings.py:87
msgid "Polish" msgid "Polish"
msgstr "Polsk" msgstr "Polsk"
#: conf/global_settings.py:87 #: conf/global_settings.py:88
msgid "Portuguese" msgid "Portuguese"
msgstr "Portugisisk" msgstr "Portugisisk"
#: conf/global_settings.py:88 #: conf/global_settings.py:89
msgid "Brazilian Portuguese" msgid "Brazilian Portuguese"
msgstr "Brasiliansk portugisisk" msgstr "Brasiliansk portugisisk"
#: conf/global_settings.py:89 #: conf/global_settings.py:90
msgid "Romanian" msgid "Romanian"
msgstr "Rumensk" msgstr "Rumensk"
#: conf/global_settings.py:90 #: conf/global_settings.py:91
msgid "Russian" msgid "Russian"
msgstr "Russisk" msgstr "Russisk"
#: conf/global_settings.py:91 #: conf/global_settings.py:92
msgid "Slovak" msgid "Slovak"
msgstr "Slovakisk" msgstr "Slovakisk"
#: conf/global_settings.py:92 #: conf/global_settings.py:93
msgid "Slovenian" msgid "Slovenian"
msgstr "Slovensk" msgstr "Slovensk"
#: conf/global_settings.py:93 #: conf/global_settings.py:94
msgid "Albanian" msgid "Albanian"
msgstr "Albansk" msgstr "Albansk"
#: conf/global_settings.py:94 #: conf/global_settings.py:95
msgid "Serbian" msgid "Serbian"
msgstr "Serbisk" msgstr "Serbisk"
#: conf/global_settings.py:95 #: conf/global_settings.py:96
msgid "Serbian Latin" msgid "Serbian Latin"
msgstr "Serbisk latin" msgstr "Serbisk latin"
#: conf/global_settings.py:96 #: conf/global_settings.py:97
msgid "Swedish" msgid "Swedish"
msgstr "Svensk" msgstr "Svensk"
#: conf/global_settings.py:97 #: conf/global_settings.py:98
msgid "Tamil" msgid "Tamil"
msgstr "Tamil" msgstr "Tamil"
#: conf/global_settings.py:98 #: conf/global_settings.py:99
msgid "Telugu" msgid "Telugu"
msgstr "Telugu" msgstr "Telugu"
#: conf/global_settings.py:99 #: conf/global_settings.py:100
msgid "Thai" msgid "Thai"
msgstr "Thai" msgstr "Thai"
#: conf/global_settings.py:100 #: conf/global_settings.py:101
msgid "Turkish" msgid "Turkish"
msgstr "Tyrkisk" msgstr "Tyrkisk"
#: conf/global_settings.py:101 #: conf/global_settings.py:102
msgid "Ukrainian" msgid "Ukrainian"
msgstr "Ukrainsk" msgstr "Ukrainsk"
#: conf/global_settings.py:102 #: conf/global_settings.py:103
msgid "Vietnamese" msgid "Vietnamese"
msgstr "Vietnamesisk" msgstr "Vietnamesisk"
#: conf/global_settings.py:103 #: conf/global_settings.py:104
msgid "Simplified Chinese" msgid "Simplified Chinese"
msgstr "Simplifisert kinesisk" msgstr "Simplifisert kinesisk"
#: conf/global_settings.py:104 #: conf/global_settings.py:105
msgid "Traditional Chinese" msgid "Traditional Chinese"
msgstr "Tradisjonell kinesisk" msgstr "Tradisjonell kinesisk"
@ -306,15 +310,15 @@ msgstr "Denne månaden"
msgid "This year" msgid "This year"
msgstr "I år" msgstr "I år"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469 #: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "Yes" msgid "Yes"
msgstr "Ja" msgstr "Ja"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469 #: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "No" msgid "No"
msgstr "Nei" msgstr "Nei"
#: contrib/admin/filterspecs.py:154 forms/widgets.py:469 #: contrib/admin/filterspecs.py:154 forms/widgets.py:478
msgid "Unknown" msgid "Unknown"
msgstr "Ukjend" msgstr "Ukjend"
@ -451,8 +455,8 @@ msgstr[1] "%(count)s %(name)s vart endra."
#, python-format #, python-format
msgid "%(total_count)s selected" msgid "%(total_count)s selected"
msgid_plural "All %(total_count)s selected" msgid_plural "All %(total_count)s selected"
msgstr[0] "" msgstr[0] "%(total_count)s valde"
msgstr[1] "" msgstr[1] "Alle %(total_count)s valde"
#: contrib/admin/options.py:1071 #: contrib/admin/options.py:1071
#, python-format #, python-format
@ -684,7 +688,7 @@ msgid "Filter"
msgstr "Filtrering" msgstr "Filtrering"
#: contrib/admin/templates/admin/delete_confirmation.html:10 #: contrib/admin/templates/admin/delete_confirmation.html:10
#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:302 #: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:300
msgid "Delete" msgid "Delete"
msgstr "Slett" msgstr "Slett"
@ -843,7 +847,7 @@ msgstr "Lagre og opprett ny"
msgid "Save and continue editing" msgid "Save and continue editing"
msgstr "Lagre og hald fram å redigere" msgstr "Lagre og hald fram å redigere"
#: contrib/admin/templates/admin/auth/user/add_form.html:5 #: contrib/admin/templates/admin/auth/user/add_form.html:6
msgid "" msgid ""
"First, enter a username and password. Then, you'll be able to edit more user " "First, enter a username and password. Then, you'll be able to edit more user "
"options." "options."
@ -851,6 +855,10 @@ msgstr ""
"Skriv først inn brukernamn og passord. Deretter vil du få høve til å endre " "Skriv først inn brukernamn og passord. Deretter vil du få høve til å endre "
"fleire brukarinnstillingar." "fleire brukarinnstillingar."
#: contrib/admin/templates/admin/auth/user/add_form.html:8
msgid "Enter a username and password."
msgstr "Skriv inn nytt brukarnamn og passord."
#: contrib/admin/templates/admin/auth/user/change_password.html:28 #: contrib/admin/templates/admin/auth/user/change_password.html:28
#, python-format #, python-format
msgid "Enter a new password for the user <strong>%(username)s</strong>." msgid "Enter a new password for the user <strong>%(username)s</strong>."
@ -1407,8 +1415,8 @@ msgstr "melding"
msgid "Logged out" msgid "Logged out"
msgstr "Logga ut" msgstr "Logga ut"
#: contrib/auth/management/commands/createsuperuser.py:23 #: contrib/auth/management/commands/createsuperuser.py:24
#: core/validators.py:120 forms/fields.py:428 #: core/validators.py:120 forms/fields.py:427
msgid "Enter a valid e-mail address." msgid "Enter a valid e-mail address."
msgstr "Oppgje ei gyldig e-postadresse." msgstr "Oppgje ei gyldig e-postadresse."
@ -1476,7 +1484,7 @@ msgid "Email address"
msgstr "E-postadresse" msgstr "E-postadresse"
#: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8 #: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8
#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1101 #: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1112
msgid "URL" msgid "URL"
msgstr "Nettadresse" msgstr "Nettadresse"
@ -1526,7 +1534,7 @@ msgstr "kommentar"
msgid "date/time submitted" msgid "date/time submitted"
msgstr "dato/tid for innsending" msgstr "dato/tid for innsending"
#: contrib/comments/models.py:60 db/models/fields/__init__.py:896 #: contrib/comments/models.py:60 db/models/fields/__init__.py:907
msgid "IP address" msgid "IP address"
msgstr "IP-adresse" msgstr "IP-adresse"
@ -4453,26 +4461,26 @@ msgstr "nettstader"
msgid "Enter a valid value." msgid "Enter a valid value."
msgstr "Oppgje ein gyldig verdi." msgstr "Oppgje ein gyldig verdi."
#: core/validators.py:87 forms/fields.py:529 #: core/validators.py:87 forms/fields.py:528
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "Oppgje ei gyldig nettadresse." msgstr "Oppgje ei gyldig nettadresse."
#: core/validators.py:89 forms/fields.py:530 #: core/validators.py:89 forms/fields.py:529
msgid "This URL appears to be a broken link." msgid "This URL appears to be a broken link."
msgstr "Nettadressa fører til ei side som ikkje eksisterar." msgstr "Nettadressa fører til ei side som ikkje eksisterar."
#: core/validators.py:123 forms/fields.py:873 #: core/validators.py:123 forms/fields.py:877
msgid "" msgid ""
"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
msgstr "" msgstr ""
"Oppgje ein gyldig 'slug' som består av bokstavar, nummer, understrekar eller " "Oppgje ein gyldig 'slug' som består av bokstavar, nummer, understrekar eller "
"bindestrekar." "bindestrekar."
#: core/validators.py:126 forms/fields.py:866 #: core/validators.py:126 forms/fields.py:870
msgid "Enter a valid IPv4 address." msgid "Enter a valid IPv4 address."
msgstr "Oppgje ei gyldig IPv4-adresse." msgstr "Oppgje ei gyldig IPv4-adresse."
#: core/validators.py:129 db/models/fields/__init__.py:572 #: core/validators.py:129 db/models/fields/__init__.py:575
msgid "Enter only digits separated by commas." msgid "Enter only digits separated by commas."
msgstr "Oppgje berre tall skild med komma." msgstr "Oppgje berre tall skild med komma."
@ -4481,12 +4489,12 @@ msgstr "Oppgje berre tall skild med komma."
msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
msgstr "Verdien må minimum ha %(limit_value)s teikn (den er %(show_value)s)." msgstr "Verdien må minimum ha %(limit_value)s teikn (den er %(show_value)s)."
#: core/validators.py:153 forms/fields.py:205 forms/fields.py:257 #: core/validators.py:153 forms/fields.py:204 forms/fields.py:256
#, python-format #, python-format
msgid "Ensure this value is less than or equal to %(limit_value)s." msgid "Ensure this value is less than or equal to %(limit_value)s."
msgstr "Verdien må vere mindre enn eller lik %(limit_value)s." msgstr "Verdien må vere mindre enn eller lik %(limit_value)s."
#: core/validators.py:158 forms/fields.py:206 forms/fields.py:258 #: core/validators.py:158 forms/fields.py:205 forms/fields.py:257
#, python-format #, python-format
msgid "Ensure this value is greater than or equal to %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s."
msgstr "Verdien må vere større enn eller lik %(limit_value)s." msgstr "Verdien må vere større enn eller lik %(limit_value)s."
@ -4534,132 +4542,132 @@ msgstr "Feltet kan ikkje vere tomt."
msgid "Field of type: %(field_type)s" msgid "Field of type: %(field_type)s"
msgstr "Felt av typen: %(field_type)s" msgstr "Felt av typen: %(field_type)s"
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:852 #: db/models/fields/__init__.py:451 db/models/fields/__init__.py:863
#: db/models/fields/__init__.py:961 db/models/fields/__init__.py:972 #: db/models/fields/__init__.py:972 db/models/fields/__init__.py:983
#: db/models/fields/__init__.py:999 #: db/models/fields/__init__.py:1010
msgid "Integer" msgid "Integer"
msgstr "Heiltal" msgstr "Heiltal"
#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:850 #: db/models/fields/__init__.py:455 db/models/fields/__init__.py:861
msgid "This value must be an integer." msgid "This value must be an integer."
msgstr "Verdien må vere eit heltall." msgstr "Verdien må vere eit heltall."
#: db/models/fields/__init__.py:490 #: db/models/fields/__init__.py:493
msgid "This value must be either True or False." msgid "This value must be either True or False."
msgstr "Verdien må vere True eller False." msgstr "Verdien må vere True eller False."
#: db/models/fields/__init__.py:492 #: db/models/fields/__init__.py:495
msgid "Boolean (Either True or False)" msgid "Boolean (Either True or False)"
msgstr "Boolsk (True eller False)" msgstr "Boolsk (True eller False)"
#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:982 #: db/models/fields/__init__.py:542 db/models/fields/__init__.py:993
#, python-format #, python-format
msgid "String (up to %(max_length)s)" msgid "String (up to %(max_length)s)"
msgstr "Tekst (opp til %(max_length)s teikn)" msgstr "Tekst (opp til %(max_length)s teikn)"
#: db/models/fields/__init__.py:567 #: db/models/fields/__init__.py:570
msgid "Comma-separated integers" msgid "Comma-separated integers"
msgstr "Heiltal skild med komma" msgstr "Heiltal skild med komma"
#: db/models/fields/__init__.py:581 #: db/models/fields/__init__.py:584
msgid "Date (without time)" msgid "Date (without time)"
msgstr "Dato (utan tid)" msgstr "Dato (utan tid)"
#: db/models/fields/__init__.py:585 #: db/models/fields/__init__.py:588
msgid "Enter a valid date in YYYY-MM-DD format." msgid "Enter a valid date in YYYY-MM-DD format."
msgstr "Oppgje ein gyldig dato på forma ÅÅÅÅ-MM-DD." msgstr "Oppgje ein gyldig dato på forma ÅÅÅÅ-MM-DD."
#: db/models/fields/__init__.py:586 #: db/models/fields/__init__.py:589
#, python-format #, python-format
msgid "Invalid date: %s" msgid "Invalid date: %s"
msgstr "Ugyldig dato: %s" msgstr "Ugyldig dato: %s"
#: db/models/fields/__init__.py:667 #: db/models/fields/__init__.py:670
msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format." msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format."
msgstr "Oppgje dato og tid på forma ÅÅÅÅ-MM-DD TT:MM[:ss[.uuuuuu]]." msgstr "Oppgje dato og tid på forma ÅÅÅÅ-MM-DD TT:MM[:ss[.uuuuuu]]."
#: db/models/fields/__init__.py:669 #: db/models/fields/__init__.py:672
msgid "Date (with time)" msgid "Date (with time)"
msgstr "Dato (med tid)" msgstr "Dato (med tid)"
#: db/models/fields/__init__.py:735 #: db/models/fields/__init__.py:738
msgid "This value must be a decimal number." msgid "This value must be a decimal number."
msgstr "Verdien må vere eit desimaltall." msgstr "Verdien må vere eit desimaltall."
#: db/models/fields/__init__.py:737 #: db/models/fields/__init__.py:740
msgid "Decimal number" msgid "Decimal number"
msgstr "Desimaltall" msgstr "Desimaltall"
#: db/models/fields/__init__.py:792 #: db/models/fields/__init__.py:795
msgid "E-mail address" msgid "E-mail address"
msgstr "E-postadresse" msgstr "E-postadresse"
#: db/models/fields/__init__.py:799 db/models/fields/files.py:220 #: db/models/fields/__init__.py:810 db/models/fields/files.py:220
#: db/models/fields/files.py:331 #: db/models/fields/files.py:331
msgid "File path" msgid "File path"
msgstr "Filsti" msgstr "Filsti"
#: db/models/fields/__init__.py:822 #: db/models/fields/__init__.py:833
msgid "This value must be a float." msgid "This value must be a float."
msgstr "Verdien må vere eit flyttall." msgstr "Verdien må vere eit flyttall."
#: db/models/fields/__init__.py:824 #: db/models/fields/__init__.py:835
msgid "Floating point number" msgid "Floating point number"
msgstr "Flyttall" msgstr "Flyttall"
#: db/models/fields/__init__.py:883 #: db/models/fields/__init__.py:894
msgid "Big (8 byte) integer" msgid "Big (8 byte) integer"
msgstr "" msgstr ""
#: db/models/fields/__init__.py:912 #: db/models/fields/__init__.py:923
msgid "This value must be either None, True or False." msgid "This value must be either None, True or False."
msgstr "Verdien må vere None, True eller False." msgstr "Verdien må vere None, True eller False."
#: db/models/fields/__init__.py:914 #: db/models/fields/__init__.py:925
msgid "Boolean (Either True, False or None)" msgid "Boolean (Either True, False or None)"
msgstr "Boolsk (True, False eller None)" msgstr "Boolsk (True, False eller None)"
#: db/models/fields/__init__.py:1005 #: db/models/fields/__init__.py:1016
msgid "Text" msgid "Text"
msgstr "Tekst" msgstr "Tekst"
#: db/models/fields/__init__.py:1021 #: db/models/fields/__init__.py:1032
msgid "Time" msgid "Time"
msgstr "Tid" msgstr "Tid"
#: db/models/fields/__init__.py:1025 #: db/models/fields/__init__.py:1036
msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format." msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
msgstr "Oppgje tida på forma TT:MM[:ss[.uuuuuu]]." msgstr "Oppgje tida på forma TT:MM[:ss[.uuuuuu]]."
#: db/models/fields/__init__.py:1109 #: db/models/fields/__init__.py:1128
msgid "XML text" msgid "XML text"
msgstr "XML-tekst" msgstr "XML-tekst"
#: db/models/fields/related.py:799 #: db/models/fields/related.py:801
#, python-format #, python-format
msgid "Model %(model)s with pk %(pk)r does not exist." msgid "Model %(model)s with pk %(pk)r does not exist."
msgstr "Modellen %(model)s med primærnøkkelen %(pk)r eksisterer ikkje." msgstr "Modellen %(model)s med primærnøkkelen %(pk)r eksisterer ikkje."
#: db/models/fields/related.py:801 #: db/models/fields/related.py:803
msgid "Foreign Key (type determined by related field)" msgid "Foreign Key (type determined by related field)"
msgstr "Primærnøkkel (type bestemt av relatert felt)" msgstr "Primærnøkkel (type bestemt av relatert felt)"
#: db/models/fields/related.py:918 #: db/models/fields/related.py:921
msgid "One-to-one relationship" msgid "One-to-one relationship"
msgstr "Ein-til-ein-forhold" msgstr "Ein-til-ein-forhold"
#: db/models/fields/related.py:980 #: db/models/fields/related.py:983
msgid "Many-to-many relationship" msgid "Many-to-many relationship"
msgstr "Mange-til-mange-forhold" msgstr "Mange-til-mange-forhold"
#: db/models/fields/related.py:1000 #: db/models/fields/related.py:1003
msgid "" msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr "" msgstr ""
"Hald nede \"Control\", eller \"Command\" på ein Mac, for å velge meir enn " "Hald nede \"Control\", eller \"Command\" på ein Mac, for å velge meir enn "
"éin." "éin."
#: db/models/fields/related.py:1061 #: db/models/fields/related.py:1064
#, python-format #, python-format
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
msgid_plural "" msgid_plural ""
@ -4671,60 +4679,60 @@ msgstr[1] "Oppgje gyldige %(self)s-ID-ar. Verdiane %(value)r er ugyldige."
msgid "This field is required." msgid "This field is required."
msgstr "Feltet er påkravd." msgstr "Feltet er påkravd."
#: forms/fields.py:204 #: forms/fields.py:203
msgid "Enter a whole number." msgid "Enter a whole number."
msgstr "Oppgje eit heiltall." msgstr "Oppgje eit heiltall."
#: forms/fields.py:235 forms/fields.py:256 #: forms/fields.py:234 forms/fields.py:255
msgid "Enter a number." msgid "Enter a number."
msgstr "Oppgje eit tall." msgstr "Oppgje eit tall."
#: forms/fields.py:259 #: forms/fields.py:258
#, python-format #, python-format
msgid "Ensure that there are no more than %s digits in total." msgid "Ensure that there are no more than %s digits in total."
msgstr "Verdien kan ikkje ha meir enn %s siffer totalt." msgstr "Verdien kan ikkje ha meir enn %s siffer totalt."
#: forms/fields.py:260 #: forms/fields.py:259
#, python-format #, python-format
msgid "Ensure that there are no more than %s decimal places." msgid "Ensure that there are no more than %s decimal places."
msgstr "Verdien kan ikkie ha meir enn %s desimalar." msgstr "Verdien kan ikkie ha meir enn %s desimalar."
#: forms/fields.py:261 #: forms/fields.py:260
#, python-format #, python-format
msgid "Ensure that there are no more than %s digits before the decimal point." msgid "Ensure that there are no more than %s digits before the decimal point."
msgstr "Verdien kan ikkje ha meir enn %s siffer framfor komma." msgstr "Verdien kan ikkje ha meir enn %s siffer framfor komma."
#: forms/fields.py:323 forms/fields.py:838 #: forms/fields.py:322 forms/fields.py:837
msgid "Enter a valid date." msgid "Enter a valid date."
msgstr "Oppgje ein gyldig dato." msgstr "Oppgje ein gyldig dato."
#: forms/fields.py:351 forms/fields.py:839 #: forms/fields.py:350 forms/fields.py:838
msgid "Enter a valid time." msgid "Enter a valid time."
msgstr "Oppgje eit gyldig tidspunkt." msgstr "Oppgje eit gyldig tidspunkt."
#: forms/fields.py:377 #: forms/fields.py:376
msgid "Enter a valid date/time." msgid "Enter a valid date/time."
msgstr "Oppgje gyldig dato og tidspunkt." msgstr "Oppgje gyldig dato og tidspunkt."
#: forms/fields.py:435 #: forms/fields.py:434
msgid "No file was submitted. Check the encoding type on the form." msgid "No file was submitted. Check the encoding type on the form."
msgstr "Inga fil vart sendt. Sjekk \"encoding\"-typen på skjemaet." msgstr "Inga fil vart sendt. Sjekk \"encoding\"-typen på skjemaet."
#: forms/fields.py:436 #: forms/fields.py:435
msgid "No file was submitted." msgid "No file was submitted."
msgstr "Inga fil vart sendt." msgstr "Inga fil vart sendt."
#: forms/fields.py:437 #: forms/fields.py:436
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "Fila er tom." msgstr "Fila er tom."
#: forms/fields.py:438 #: forms/fields.py:437
#, python-format #, python-format
msgid "" msgid ""
"Ensure this filename has at most %(max)d characters (it has %(length)d)." "Ensure this filename has at most %(max)d characters (it has %(length)d)."
msgstr "Filnamnet kan maksimalt ha %(max)d teikn (det har %(length)d)." msgstr "Filnamnet kan maksimalt ha %(max)d teikn (det har %(length)d)."
#: forms/fields.py:473 #: forms/fields.py:472
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
@ -4732,17 +4740,17 @@ msgstr ""
"Last opp eit gyldig bilete. Fila du lasta opp var ødelagt eller ikkje eit " "Last opp eit gyldig bilete. Fila du lasta opp var ødelagt eller ikkje eit "
"bilete." "bilete."
#: forms/fields.py:596 forms/fields.py:671 #: forms/fields.py:595 forms/fields.py:670
#, python-format #, python-format
msgid "Select a valid choice. %(value)s is not one of the available choices." msgid "Select a valid choice. %(value)s is not one of the available choices."
msgstr "" msgstr ""
"Velg eit gyldig valg. %(value)s er ikkje eit av dei tilgjengelege valga." "Velg eit gyldig valg. %(value)s er ikkje eit av dei tilgjengelege valga."
#: forms/fields.py:672 forms/fields.py:734 forms/models.py:1002 #: forms/fields.py:671 forms/fields.py:733 forms/models.py:1002
msgid "Enter a list of values." msgid "Enter a list of values."
msgstr "Oppgje ei liste med verdiar." msgstr "Oppgje ei liste med verdiar."
#: forms/formsets.py:298 forms/formsets.py:300 #: forms/formsets.py:296 forms/formsets.py:298
msgid "Order" msgid "Order"
msgstr "Rekkefølge" msgstr "Rekkefølge"
@ -4788,28 +4796,28 @@ msgstr "Velg eit gyldig valg. %s er ikkje eit av dei tilgjengelege valga."
msgid "\"%s\" is not a valid value for a primary key." msgid "\"%s\" is not a valid value for a primary key."
msgstr "\"%s\" er ikkje ein gyldig verdi for ein primærnøkkel." msgstr "\"%s\" er ikkje ein gyldig verdi for ein primærnøkkel."
#: template/defaultfilters.py:776 #: template/defaultfilters.py:780
msgid "yes,no,maybe" msgid "yes,no,maybe"
msgstr "ja,nei,kanskje" msgstr "ja,nei,kanskje"
#: template/defaultfilters.py:807 #: template/defaultfilters.py:811
#, python-format #, python-format
msgid "%(size)d byte" msgid "%(size)d byte"
msgid_plural "%(size)d bytes" msgid_plural "%(size)d bytes"
msgstr[0] "%(size)d byte" msgstr[0] "%(size)d byte"
msgstr[1] "%(size)d bytes" msgstr[1] "%(size)d bytes"
#: template/defaultfilters.py:809 #: template/defaultfilters.py:813
#, python-format #, python-format
msgid "%.1f KB" msgid "%.1f KB"
msgstr "%.1f KB" msgstr "%.1f KB"
#: template/defaultfilters.py:811 #: template/defaultfilters.py:815
#, python-format #, python-format
msgid "%.1f MB" msgid "%.1f MB"
msgstr "%.1f MB" msgstr "%.1f MB"
#: template/defaultfilters.py:812 #: template/defaultfilters.py:816
#, python-format #, python-format
msgid "%.1f GB" msgid "%.1f GB"
msgstr "%.1f GB" msgstr "%.1f GB"
@ -4880,7 +4888,7 @@ msgstr "ons"
#: utils/dates.py:10 #: utils/dates.py:10
msgid "Thu" msgid "Thu"
msgstr "tors" msgstr "tor"
#: utils/dates.py:10 #: utils/dates.py:10
msgid "Fri" msgid "Fri"
@ -4888,7 +4896,7 @@ msgstr "fre"
#: utils/dates.py:11 #: utils/dates.py:11
msgid "Sat" msgid "Sat"
msgstr "laur" msgstr "lau"
#: utils/dates.py:11 #: utils/dates.py:11
msgid "Sun" msgid "Sun"
@ -5018,7 +5026,7 @@ msgstr "nov."
msgid "Dec." msgid "Dec."
msgstr "des." msgstr "des."
#: utils/text.py:130 #: utils/text.py:136
msgid "or" msgid "or"
msgstr "eller" msgstr "eller"

View File

@ -28,5 +28,5 @@ DATETIME_INPUT_FORMATS = (
'%Y-%m-%d', # '2006-10-25' '%Y-%m-%d', # '2006-10-25'
) )
DECIMAL_SEPARATOR = ',' DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = '.' THOUSAND_SEPARATOR = ' '
NUMBER_GROUPING = 3 NUMBER_GROUPING = 3

View File

@ -4,17 +4,18 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django\n" "Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-05-07 20:44+0200\n" "POT-Creation-Date: 2010-08-06 19:53+0200\n"
"PO-Revision-Date: 2010-03-23 23:39+0100\n" "PO-Revision-Date: 2010-08-06 19:47+0100\n"
"Last-Translator: Janos Guljas <janos@janos.in.rs>\n" "Last-Translator: Janos Guljas <janos@janos.in.rs>\n"
"Language-Team: Branko Vukelic <bg.branko@gmail.com> & Janos Guljas " "Language-Team: Branko Vukelic <bg.branko@gmail.com> & Janos Guljas "
"<janos@janos.in.rs> & Nesh <djnesh@gmail.com> & Petar <petar.maric@gmail." "<janos@janos.in.rs> & Nesh <djnesh@gmail.com> & Petar <petar.maric@gmail."
"com>\n" "com>\n"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && 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" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
#: conf/global_settings.py:44 #: conf/global_settings.py:44
msgid "Arabic" msgid "Arabic"
@ -69,7 +70,7 @@ msgid "Spanish"
msgstr "шпански" msgstr "шпански"
#: conf/global_settings.py:57 #: conf/global_settings.py:57
msgid "Argentinean Spanish" msgid "Argentinian Spanish"
msgstr "аргентински шпански" msgstr "аргентински шпански"
#: conf/global_settings.py:58 #: conf/global_settings.py:58
@ -121,138 +122,146 @@ msgid "Hungarian"
msgstr "мађарски" msgstr "мађарски"
#: conf/global_settings.py:70 #: conf/global_settings.py:70
msgid "Indonesian"
msgstr "индонежански"
#: conf/global_settings.py:71
msgid "Icelandic" msgid "Icelandic"
msgstr "исландски" msgstr "исландски"
#: conf/global_settings.py:71 #: conf/global_settings.py:72
msgid "Italian" msgid "Italian"
msgstr "италијански" msgstr "италијански"
#: conf/global_settings.py:72 #: conf/global_settings.py:73
msgid "Japanese" msgid "Japanese"
msgstr "јапански" msgstr "јапански"
#: conf/global_settings.py:73 #: conf/global_settings.py:74
msgid "Georgian" msgid "Georgian"
msgstr "грузијски" msgstr "грузијски"
#: conf/global_settings.py:74 #: conf/global_settings.py:75
msgid "Khmer" msgid "Khmer"
msgstr "камбодијски" msgstr "камбодијски"
#: conf/global_settings.py:75 #: conf/global_settings.py:76
msgid "Kannada" msgid "Kannada"
msgstr "канада" msgstr "канада"
#: conf/global_settings.py:76 #: conf/global_settings.py:77
msgid "Korean" msgid "Korean"
msgstr "корејски" msgstr "корејски"
#: conf/global_settings.py:77 #: conf/global_settings.py:78
msgid "Lithuanian" msgid "Lithuanian"
msgstr "литвански" msgstr "литвански"
#: conf/global_settings.py:78 #: conf/global_settings.py:79
msgid "Latvian" msgid "Latvian"
msgstr "латвијски" msgstr "латвијски"
#: conf/global_settings.py:79 #: conf/global_settings.py:80
msgid "Macedonian" msgid "Macedonian"
msgstr "македонски" msgstr "македонски"
#: conf/global_settings.py:80 #: conf/global_settings.py:81
msgid "Malayalam"
msgstr "малајаламски"
#: conf/global_settings.py:82
msgid "Mongolian" msgid "Mongolian"
msgstr "монголски" msgstr "монголски"
#: conf/global_settings.py:81 #: conf/global_settings.py:83
msgid "Dutch" msgid "Dutch"
msgstr "холандски" msgstr "холандски"
#: conf/global_settings.py:82 #: conf/global_settings.py:84
msgid "Norwegian" msgid "Norwegian"
msgstr "норвешки" msgstr "норвешки"
#: conf/global_settings.py:83 #: conf/global_settings.py:85
msgid "Norwegian Bokmal" msgid "Norwegian Bokmal"
msgstr "норвешки кнјжевни" msgstr "норвешки кнјжевни"
#: conf/global_settings.py:84 #: conf/global_settings.py:86
msgid "Norwegian Nynorsk" msgid "Norwegian Nynorsk"
msgstr "норвешки нови" msgstr "норвешки нови"
#: conf/global_settings.py:85 #: conf/global_settings.py:87
msgid "Polish" msgid "Polish"
msgstr "пољски" msgstr "пољски"
#: conf/global_settings.py:86 #: conf/global_settings.py:88
msgid "Portuguese" msgid "Portuguese"
msgstr "португалски" msgstr "португалски"
#: conf/global_settings.py:87 #: conf/global_settings.py:89
msgid "Brazilian Portuguese" msgid "Brazilian Portuguese"
msgstr "бразилски португалски" msgstr "бразилски португалски"
#: conf/global_settings.py:88 #: conf/global_settings.py:90
msgid "Romanian" msgid "Romanian"
msgstr "румунски" msgstr "румунски"
#: conf/global_settings.py:89 #: conf/global_settings.py:91
msgid "Russian" msgid "Russian"
msgstr "руски" msgstr "руски"
#: conf/global_settings.py:90 #: conf/global_settings.py:92
msgid "Slovak" msgid "Slovak"
msgstr "словачки" msgstr "словачки"
#: conf/global_settings.py:91 #: conf/global_settings.py:93
msgid "Slovenian" msgid "Slovenian"
msgstr "словеначки" msgstr "словеначки"
#: conf/global_settings.py:92 #: conf/global_settings.py:94
msgid "Albanian" msgid "Albanian"
msgstr "албански" msgstr "албански"
#: conf/global_settings.py:93 #: conf/global_settings.py:95
msgid "Serbian" msgid "Serbian"
msgstr "српски" msgstr "српски"
#: conf/global_settings.py:94 #: conf/global_settings.py:96
msgid "Serbian Latin" msgid "Serbian Latin"
msgstr "српски (латиница)" msgstr "српски (латиница)"
#: conf/global_settings.py:95 #: conf/global_settings.py:97
msgid "Swedish" msgid "Swedish"
msgstr "шведски" msgstr "шведски"
#: conf/global_settings.py:96 #: conf/global_settings.py:98
msgid "Tamil" msgid "Tamil"
msgstr "тамилски" msgstr "тамилски"
#: conf/global_settings.py:97 #: conf/global_settings.py:99
msgid "Telugu" msgid "Telugu"
msgstr "телугу" msgstr "телугу"
#: conf/global_settings.py:98 #: conf/global_settings.py:100
msgid "Thai" msgid "Thai"
msgstr "тајландски" msgstr "тајландски"
#: conf/global_settings.py:99 #: conf/global_settings.py:101
msgid "Turkish" msgid "Turkish"
msgstr "турски" msgstr "турски"
#: conf/global_settings.py:100 #: conf/global_settings.py:102
msgid "Ukrainian" msgid "Ukrainian"
msgstr "украјински" msgstr "украјински"
#: conf/global_settings.py:101 #: conf/global_settings.py:103
msgid "Vietnamese" msgid "Vietnamese"
msgstr "вијетнамски" msgstr "вијетнамски"
#: conf/global_settings.py:102 #: conf/global_settings.py:104
msgid "Simplified Chinese" msgid "Simplified Chinese"
msgstr "новокинески" msgstr "новокинески"
#: conf/global_settings.py:103 #: conf/global_settings.py:105
msgid "Traditional Chinese" msgid "Traditional Chinese"
msgstr "старокинески" msgstr "старокинески"
@ -304,15 +313,15 @@ msgstr "Овај месец"
msgid "This year" msgid "This year"
msgstr "Ова година" msgstr "Ова година"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469 #: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "Yes" msgid "Yes"
msgstr "Да" msgstr "Да"
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469 #: contrib/admin/filterspecs.py:147 forms/widgets.py:478
msgid "No" msgid "No"
msgstr "Не" msgstr "Не"
#: contrib/admin/filterspecs.py:154 forms/widgets.py:469 #: contrib/admin/filterspecs.py:154 forms/widgets.py:478
msgid "Unknown" msgid "Unknown"
msgstr "Непознато" msgstr "Непознато"
@ -358,7 +367,7 @@ msgid "Changed %s."
msgstr "Измењена поља %s" msgstr "Измењена поља %s"
#: contrib/admin/options.py:559 contrib/admin/options.py:569 #: contrib/admin/options.py:559 contrib/admin/options.py:569
#: contrib/comments/templates/comments/preview.html:16 db/models/base.py:844 #: contrib/comments/templates/comments/preview.html:16 db/models/base.py:845
#: forms/models.py:568 #: forms/models.py:568
msgid "and" msgid "and"
msgstr "и" msgstr "и"
@ -457,9 +466,9 @@ msgstr[1] "%(total_count)s изабрано"
msgstr[2] "%(total_count)s изабраних" msgstr[2] "%(total_count)s изабраних"
#: contrib/admin/options.py:1071 #: contrib/admin/options.py:1071
#, fuzzy, python-format #, python-format
msgid "0 of %(cnt)s selected" msgid "0 of %(cnt)s selected"
msgstr "0 од %(cnt)d изабрано" msgstr "0 од %(cnt)s изабрано"
#: contrib/admin/options.py:1118 #: contrib/admin/options.py:1118
#, python-format #, python-format
@ -687,7 +696,7 @@ msgid "Filter"
msgstr "Филтер" msgstr "Филтер"
#: contrib/admin/templates/admin/delete_confirmation.html:10 #: contrib/admin/templates/admin/delete_confirmation.html:10
#: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:302 #: contrib/admin/templates/admin/submit_line.html:4 forms/formsets.py:300
msgid "Delete" msgid "Delete"
msgstr "Обриши" msgstr "Обриши"
@ -849,7 +858,7 @@ msgstr "Сачувај и додај следећи"
msgid "Save and continue editing" msgid "Save and continue editing"
msgstr "Сачувај и настави са изменама" msgstr "Сачувај и настави са изменама"
#: contrib/admin/templates/admin/auth/user/add_form.html:5 #: contrib/admin/templates/admin/auth/user/add_form.html:6
msgid "" msgid ""
"First, enter a username and password. Then, you'll be able to edit more user " "First, enter a username and password. Then, you'll be able to edit more user "
"options." "options."
@ -857,6 +866,10 @@ msgstr ""
"Прво унесите корисничко име и лозинку. Потом ћете моћи да мењате још " "Прво унесите корисничко име и лозинку. Потом ћете моћи да мењате још "
"корисничких подешавања." "корисничких подешавања."
#: contrib/admin/templates/admin/auth/user/add_form.html:8
msgid "Enter a username and password."
msgstr "Унесите корисничко име и лозинку"
#: contrib/admin/templates/admin/auth/user/change_password.html:28 #: contrib/admin/templates/admin/auth/user/change_password.html:28
#, python-format #, python-format
msgid "Enter a new password for the user <strong>%(username)s</strong>." msgid "Enter a new password for the user <strong>%(username)s</strong>."
@ -1050,7 +1063,7 @@ msgstr "Имејл адреса:"
msgid "Reset my password" msgid "Reset my password"
msgstr "Ресетуј моју лозинку" msgstr "Ресетуј моју лозинку"
#: contrib/admin/templatetags/admin_list.py:239 #: contrib/admin/templatetags/admin_list.py:257
msgid "All dates" msgid "All dates"
msgstr "Сви датуми" msgstr "Сви датуми"
@ -1424,8 +1437,8 @@ msgstr "порука"
msgid "Logged out" msgid "Logged out"
msgstr "Одјављен" msgstr "Одјављен"
#: contrib/auth/management/commands/createsuperuser.py:23 #: contrib/auth/management/commands/createsuperuser.py:24
#: core/validators.py:120 forms/fields.py:428 #: core/validators.py:120 forms/fields.py:427
msgid "Enter a valid e-mail address." msgid "Enter a valid e-mail address."
msgstr "Унесите важећу имејл адресу." msgstr "Унесите важећу имејл адресу."
@ -1497,7 +1510,7 @@ msgid "Email address"
msgstr "Имејл адреса" msgstr "Имејл адреса"
#: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8 #: contrib/comments/forms.py:95 contrib/flatpages/admin.py:8
#: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1101 #: contrib/flatpages/models.py:7 db/models/fields/__init__.py:1109
msgid "URL" msgid "URL"
msgstr "URL" msgstr "URL"
@ -1547,7 +1560,7 @@ msgstr "коментар"
msgid "date/time submitted" msgid "date/time submitted"
msgstr "датум/време постављања" msgstr "датум/време постављања"
#: contrib/comments/models.py:60 db/models/fields/__init__.py:896 #: contrib/comments/models.py:60 db/models/fields/__init__.py:904
msgid "IP address" msgid "IP address"
msgstr "IP адреса" msgstr "IP адреса"
@ -4471,22 +4484,22 @@ msgstr "сајтови"
msgid "Enter a valid value." msgid "Enter a valid value."
msgstr "Унесите исправну вредност." msgstr "Унесите исправну вредност."
#: core/validators.py:87 forms/fields.py:529 #: core/validators.py:87 forms/fields.py:528
msgid "Enter a valid URL." msgid "Enter a valid URL."
msgstr "Унесите исправан URL." msgstr "Унесите исправан URL."
#: core/validators.py:89 forms/fields.py:530 #: core/validators.py:89 forms/fields.py:529
msgid "This URL appears to be a broken link." msgid "This URL appears to be a broken link."
msgstr "Овај URL изгледа не води никуда." msgstr "Овај URL изгледа не води никуда."
#: core/validators.py:123 forms/fields.py:873 #: core/validators.py:123 forms/fields.py:877
msgid "" msgid ""
"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
msgstr "" msgstr ""
"Унесите исрпаван „слаг“, који се састоји од слова, бројки, доњих црта или " "Унесите исрпаван „слаг“, који се састоји од слова, бројки, доњих црта или "
"циртица." "циртица."
#: core/validators.py:126 forms/fields.py:866 #: core/validators.py:126 forms/fields.py:870
msgid "Enter a valid IPv4 address." msgid "Enter a valid IPv4 address."
msgstr "Унесите исправну IPv4 адресу." msgstr "Унесите исправну IPv4 адресу."
@ -4499,12 +4512,12 @@ msgstr "Унесите само бројке раздвојене запетам
msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
msgstr "Ово поље мора да буде %(limit_value)s (тренутно има %(show_value)s)." msgstr "Ово поље мора да буде %(limit_value)s (тренутно има %(show_value)s)."
#: core/validators.py:153 forms/fields.py:205 forms/fields.py:257 #: core/validators.py:153 forms/fields.py:204 forms/fields.py:256
#, python-format #, python-format
msgid "Ensure this value is less than or equal to %(limit_value)s." msgid "Ensure this value is less than or equal to %(limit_value)s."
msgstr "Ова вредност мора да буде мања од %(limit_value)s. или тачно толико." msgstr "Ова вредност мора да буде мања од %(limit_value)s. или тачно толико."
#: core/validators.py:158 forms/fields.py:206 forms/fields.py:258 #: core/validators.py:158 forms/fields.py:205 forms/fields.py:257
#, python-format #, python-format
msgid "Ensure this value is greater than or equal to %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s."
msgstr "Ова вредност мора бити већа од %(limit_value)s или тачно толико." msgstr "Ова вредност мора бити већа од %(limit_value)s или тачно толико."
@ -4512,27 +4525,27 @@ msgstr "Ова вредност мора бити већа од %(limit_value)s
#: core/validators.py:164 #: core/validators.py:164
#, python-format #, python-format
msgid "" msgid ""
"Ensure this value has at least %(limit_value)d characters (it has %" "Ensure this value has at least %(limit_value)d characters (it has "
"(show_value)d)." "%(show_value)d)."
msgstr "" msgstr ""
"Ово поље мора да садржи најмање %(limit_value)d словних места (тренутно има %" "Ово поље мора да садржи најмање %(limit_value)d словних места (тренутно има "
"(show_value)d)." "%(show_value)d)."
#: core/validators.py:170 #: core/validators.py:170
#, python-format #, python-format
msgid "" msgid ""
"Ensure this value has at most %(limit_value)d characters (it has %" "Ensure this value has at most %(limit_value)d characters (it has "
"(show_value)d)." "%(show_value)d)."
msgstr "" msgstr ""
"Ово поље мора да садржи највише %(limit_value)d словних места (тренутно има %" "Ово поље мора да садржи највише %(limit_value)d словних места (тренутно има "
"(show_value)d)." "%(show_value)d)."
#: db/models/base.py:822 #: db/models/base.py:823
#, python-format #, python-format
msgid "%(field_name)s must be unique for %(date_field)s %(lookup)s." msgid "%(field_name)s must be unique for %(date_field)s %(lookup)s."
msgstr "%(field_name)s мора да буде јединствен за %(date_field)s %(lookup)s." msgstr "%(field_name)s мора да буде јединствен за %(date_field)s %(lookup)s."
#: db/models/base.py:837 db/models/base.py:845 #: db/models/base.py:838 db/models/base.py:846
#, python-format #, python-format
msgid "%(model_name)s with this %(field_label)s already exists." msgid "%(model_name)s with this %(field_label)s already exists."
msgstr "%(model_name)s са овом вредношћу %(field_label)s већ постоји." msgstr "%(model_name)s са овом вредношћу %(field_label)s већ постоји."
@ -4555,13 +4568,13 @@ msgstr "Ово поље не може да остане празно."
msgid "Field of type: %(field_type)s" msgid "Field of type: %(field_type)s"
msgstr "Поње типа: %(field_type)s" msgstr "Поње типа: %(field_type)s"
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:852 #: db/models/fields/__init__.py:451 db/models/fields/__init__.py:860
#: db/models/fields/__init__.py:961 db/models/fields/__init__.py:972 #: db/models/fields/__init__.py:969 db/models/fields/__init__.py:980
#: db/models/fields/__init__.py:999 #: db/models/fields/__init__.py:1007
msgid "Integer" msgid "Integer"
msgstr "Цео број" msgstr "Цео број"
#: db/models/fields/__init__.py:455 db/models/fields/__init__.py:850 #: db/models/fields/__init__.py:455 db/models/fields/__init__.py:858
msgid "This value must be an integer." msgid "This value must be an integer."
msgstr "Ова вредност мора бити целобројна." msgstr "Ова вредност мора бити целобројна."
@ -4573,7 +4586,7 @@ msgstr "Ова вредност мора бити True или False."
msgid "Boolean (Either True or False)" msgid "Boolean (Either True or False)"
msgstr "Булова вредност (True или False)" msgstr "Булова вредност (True или False)"
#: db/models/fields/__init__.py:539 db/models/fields/__init__.py:982 #: db/models/fields/__init__.py:539 db/models/fields/__init__.py:990
#, python-format #, python-format
msgid "String (up to %(max_length)s)" msgid "String (up to %(max_length)s)"
msgstr "Стринг (највише %(max_length)s знакова)" msgstr "Стринг (највише %(max_length)s знакова)"
@ -4615,44 +4628,44 @@ msgstr "Децимални број"
msgid "E-mail address" msgid "E-mail address"
msgstr "Имејл адреса" msgstr "Имејл адреса"
#: db/models/fields/__init__.py:799 db/models/fields/files.py:220 #: db/models/fields/__init__.py:807 db/models/fields/files.py:220
#: db/models/fields/files.py:331 #: db/models/fields/files.py:331
msgid "File path" msgid "File path"
msgstr "Путања фајла" msgstr "Путања фајла"
#: db/models/fields/__init__.py:822 #: db/models/fields/__init__.py:830
msgid "This value must be a float." msgid "This value must be a float."
msgstr "Ова вредност мора бити број са клизећом запетом" msgstr "Ова вредност мора бити број са клизећом запетом"
#: db/models/fields/__init__.py:824 #: db/models/fields/__init__.py:832
msgid "Floating point number" msgid "Floating point number"
msgstr "Број са покреном запетом" msgstr "Број са покреном запетом"
#: db/models/fields/__init__.py:883 #: db/models/fields/__init__.py:891
msgid "Big (8 byte) integer" msgid "Big (8 byte) integer"
msgstr "Велики цео број" msgstr "Велики цео број"
#: db/models/fields/__init__.py:912 #: db/models/fields/__init__.py:920
msgid "This value must be either None, True or False." msgid "This value must be either None, True or False."
msgstr "Ова вредност мора бити или None, или True, или False." msgstr "Ова вредност мора бити или None, или True, или False."
#: db/models/fields/__init__.py:914 #: db/models/fields/__init__.py:922
msgid "Boolean (Either True, False or None)" msgid "Boolean (Either True, False or None)"
msgstr "Булова вредност (True, False или None)" msgstr "Булова вредност (True, False или None)"
#: db/models/fields/__init__.py:1005 #: db/models/fields/__init__.py:1013
msgid "Text" msgid "Text"
msgstr "Текст" msgstr "Текст"
#: db/models/fields/__init__.py:1021 #: db/models/fields/__init__.py:1029
msgid "Time" msgid "Time"
msgstr "Време" msgstr "Време"
#: db/models/fields/__init__.py:1025 #: db/models/fields/__init__.py:1033
msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format." msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
msgstr "Унесите исправно време у формату ЧЧ:ММ[:сс[.уууууу]]." msgstr "Унесите исправно време у формату ЧЧ:ММ[:сс[.уууууу]]."
#: db/models/fields/__init__.py:1109 #: db/models/fields/__init__.py:1125
msgid "XML text" msgid "XML text"
msgstr "XML текст" msgstr "XML текст"
@ -4665,22 +4678,22 @@ msgstr "Објекат класе %(model)s са примарним кључем
msgid "Foreign Key (type determined by related field)" msgid "Foreign Key (type determined by related field)"
msgstr "Страни кључ (тип одређује референтно поље)" msgstr "Страни кључ (тип одређује референтно поље)"
#: db/models/fields/related.py:918 #: db/models/fields/related.py:919
msgid "One-to-one relationship" msgid "One-to-one relationship"
msgstr "Релација један на један" msgstr "Релација један на један"
#: db/models/fields/related.py:980 #: db/models/fields/related.py:981
msgid "Many-to-many relationship" msgid "Many-to-many relationship"
msgstr "Релација више на више" msgstr "Релација више на више"
#: db/models/fields/related.py:1000 #: db/models/fields/related.py:1001
msgid "" msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr "" msgstr ""
"Држите „Control“, или „Command“ на Mac-у да бисте обележили више од једне " "Држите „Control“, или „Command“ на Mac-у да бисте обележили више од једне "
"ставке." "ставке."
#: db/models/fields/related.py:1061 #: db/models/fields/related.py:1062
#, python-format #, python-format
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
msgid_plural "" msgid_plural ""
@ -4693,62 +4706,62 @@ msgstr[2] "Унесите исправан %(self)s IDs. Вредности %(va
msgid "This field is required." msgid "This field is required."
msgstr "Ово поље се мора попунити." msgstr "Ово поље се мора попунити."
#: forms/fields.py:204 #: forms/fields.py:203
msgid "Enter a whole number." msgid "Enter a whole number."
msgstr "Унесите цео број." msgstr "Унесите цео број."
#: forms/fields.py:235 forms/fields.py:256 #: forms/fields.py:234 forms/fields.py:255
msgid "Enter a number." msgid "Enter a number."
msgstr "Унесите број." msgstr "Унесите број."
#: forms/fields.py:259 #: forms/fields.py:258
#, python-format #, python-format
msgid "Ensure that there are no more than %s digits in total." msgid "Ensure that there are no more than %s digits in total."
msgstr "Не сме бити укупно више од %s цифара. Проверите." msgstr "Не сме бити укупно више од %s цифара. Проверите."
#: forms/fields.py:260 #: forms/fields.py:259
#, python-format #, python-format
msgid "Ensure that there are no more than %s decimal places." msgid "Ensure that there are no more than %s decimal places."
msgstr "Не сме бити укупно више од %s децималних места. Проверите." msgstr "Не сме бити укупно више од %s децималних места. Проверите."
#: forms/fields.py:261 #: forms/fields.py:260
#, python-format #, python-format
msgid "Ensure that there are no more than %s digits before the decimal point." msgid "Ensure that there are no more than %s digits before the decimal point."
msgstr "Не сме бити укупно више од %s цифара пре запете. Проверите." msgstr "Не сме бити укупно више од %s цифара пре запете. Проверите."
#: forms/fields.py:323 forms/fields.py:838 #: forms/fields.py:322 forms/fields.py:837
msgid "Enter a valid date." msgid "Enter a valid date."
msgstr "Унесите исправан датум." msgstr "Унесите исправан датум."
#: forms/fields.py:351 forms/fields.py:839 #: forms/fields.py:350 forms/fields.py:838
msgid "Enter a valid time." msgid "Enter a valid time."
msgstr "Унесите исправно време" msgstr "Унесите исправно време"
#: forms/fields.py:377 #: forms/fields.py:376
msgid "Enter a valid date/time." msgid "Enter a valid date/time."
msgstr "Унесите исправан датум/време." msgstr "Унесите исправан датум/време."
#: forms/fields.py:435 #: forms/fields.py:434
msgid "No file was submitted. Check the encoding type on the form." msgid "No file was submitted. Check the encoding type on the form."
msgstr "Фајл није пребачен. Проверите тип енкодирања формулара." msgstr "Фајл није пребачен. Проверите тип енкодирања формулара."
#: forms/fields.py:436 #: forms/fields.py:435
msgid "No file was submitted." msgid "No file was submitted."
msgstr "Фајл није пребачен." msgstr "Фајл није пребачен."
#: forms/fields.py:437 #: forms/fields.py:436
msgid "The submitted file is empty." msgid "The submitted file is empty."
msgstr "Пребачен фајл је празан." msgstr "Пребачен фајл је празан."
#: forms/fields.py:438 #: forms/fields.py:437
#, python-format #, python-format
msgid "" msgid ""
"Ensure this filename has at most %(max)d characters (it has %(length)d)." "Ensure this filename has at most %(max)d characters (it has %(length)d)."
msgstr "" msgstr ""
"Назив фајла мора да садржи бар %(max)d словних места (тренутно има %(length)" "Назив фајла мора да садржи бар %(max)d словних места (тренутно има "
"d)." "%(length)d)."
#: forms/fields.py:473 #: forms/fields.py:472
msgid "" msgid ""
"Upload a valid image. The file you uploaded was either not an image or a " "Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image." "corrupted image."
@ -4756,17 +4769,17 @@ msgstr ""
"Пребаците исправан фајл. Фајл који је пребачен или није слика, или је " "Пребаците исправан фајл. Фајл који је пребачен или није слика, или је "
"оштећен." "оштећен."
#: forms/fields.py:596 forms/fields.py:671 #: forms/fields.py:595 forms/fields.py:670
#, python-format #, python-format
msgid "Select a valid choice. %(value)s is not one of the available choices." msgid "Select a valid choice. %(value)s is not one of the available choices."
msgstr "" msgstr ""
"%(value)s није међу понуђеним вредностима. Одаберите једну од понуђених." "%(value)s није међу понуђеним вредностима. Одаберите једну од понуђених."
#: forms/fields.py:672 forms/fields.py:734 forms/models.py:1002 #: forms/fields.py:671 forms/fields.py:733 forms/models.py:1002
msgid "Enter a list of values." msgid "Enter a list of values."
msgstr "Унесите листу вредности." msgstr "Унесите листу вредности."
#: forms/formsets.py:298 forms/formsets.py:300 #: forms/formsets.py:296 forms/formsets.py:298
msgid "Order" msgid "Order"
msgstr "Редослед" msgstr "Редослед"
@ -5103,23 +5116,23 @@ msgstr "%(number)d %(type)s"
msgid ", %(number)d %(type)s" msgid ", %(number)d %(type)s"
msgstr ", %(number)d %(type)s" msgstr ", %(number)d %(type)s"
#: utils/translation/trans_real.py:518 #: utils/translation/trans_real.py:519
msgid "DATE_FORMAT" msgid "DATE_FORMAT"
msgstr "j. F Y." msgstr "j. F Y."
#: utils/translation/trans_real.py:519 #: utils/translation/trans_real.py:520
msgid "DATETIME_FORMAT" msgid "DATETIME_FORMAT"
msgstr "j. F Y. H:i Т" msgstr "j. F Y. H:i Т"
#: utils/translation/trans_real.py:520 #: utils/translation/trans_real.py:521
msgid "TIME_FORMAT" msgid "TIME_FORMAT"
msgstr "G:i" msgstr "G:i"
#: utils/translation/trans_real.py:541 #: utils/translation/trans_real.py:542
msgid "YEAR_MONTH_FORMAT" msgid "YEAR_MONTH_FORMAT"
msgstr "F Y." msgstr "F Y."
#: utils/translation/trans_real.py:542 #: utils/translation/trans_real.py:543
msgid "MONTH_DAY_FORMAT" msgid "MONTH_DAY_FORMAT"
msgstr "j. F" msgstr "j. F"

View File

@ -4,50 +4,24 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Django\n" "Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-05-07 20:46+0200\n" "POT-Creation-Date: 2010-08-06 19:53+0200\n"
"PO-Revision-Date: 2009-03-30 14:04+0200\n" "PO-Revision-Date: 2009-03-30 14:04+0200\n"
"Last-Translator: Janos Guljas <janos@janos.in.rs>\n" "Last-Translator: Janos Guljas <janos@janos.in.rs>\n"
"Language-Team: Branko Vukelic <bg.branko@gmail.com> & Janos Guljas " "Language-Team: Branko Vukelic <bg.branko@gmail.com> & Janos Guljas "
"<janos@janos.in.rs> & Nesh <djnesh@gmail.com> & Petar <petar.maric@gmail." "<janos@janos.in.rs> & Nesh <djnesh@gmail.com> & Petar <petar.maric@gmail."
"com>\n" "com>\n"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && 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" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
#: contrib/admin/media/js/SelectFilter2.js:37
#, perl-format
msgid "Available %s"
msgstr "Доступни %s"
#: contrib/admin/media/js/SelectFilter2.js:45
msgid "Choose all"
msgstr "Додај све"
#: contrib/admin/media/js/SelectFilter2.js:50
msgid "Add"
msgstr "Додај"
#: contrib/admin/media/js/SelectFilter2.js:52
msgid "Remove"
msgstr "Уклони"
#: contrib/admin/media/js/SelectFilter2.js:57
#, perl-format
msgid "Chosen %s"
msgstr "Одабрани %s"
#: contrib/admin/media/js/SelectFilter2.js:58
msgid "Select your choice(s) and click "
msgstr "Направите избор и кликните "
#: contrib/admin/media/js/SelectFilter2.js:63 #: contrib/admin/media/js/SelectFilter2.js:63
msgid "Clear all" msgid "Clear all"
msgstr "Врати све" msgstr "Врати све"
#: contrib/admin/media/js/actions.js:18 #: contrib/admin/media/js/actions.js:18
#: contrib/admin/media/js/actions.min.js:1
msgid "%(sel)s of %(cnt)s selected" msgid "%(sel)s of %(cnt)s selected"
msgid_plural "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected"
msgstr[0] "%(sel)s од %(cnt)s изабран" msgstr[0] "%(sel)s од %(cnt)s изабран"
@ -55,7 +29,6 @@ msgstr[1] "%(sel)s од %(cnt)s изабрано"
msgstr[2] "%(sel)s од %(cnt)s изабраних" msgstr[2] "%(sel)s од %(cnt)s изабраних"
#: contrib/admin/media/js/actions.js:109 #: contrib/admin/media/js/actions.js:109
#: contrib/admin/media/js/actions.min.js:5
msgid "" msgid ""
"You have unsaved changes on individual editable fields. If you run an " "You have unsaved changes on individual editable fields. If you run an "
"action, your unsaved changes will be lost." "action, your unsaved changes will be lost."
@ -151,3 +124,21 @@ msgstr "Јуче"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:184 #: contrib/admin/media/js/admin/DateTimeShortcuts.js:184
msgid "Tomorrow" msgid "Tomorrow"
msgstr "Сутра" msgstr "Сутра"
#~ msgid "Available %s"
#~ msgstr "Доступни %s"
#~ msgid "Choose all"
#~ msgstr "Додај све"
#~ msgid "Add"
#~ msgstr "Додај"
#~ msgid "Remove"
#~ msgstr "Уклони"
#~ msgid "Chosen %s"
#~ msgstr "Одабрани %s"
#~ msgid "Select your choice(s) and click "
#~ msgstr "Направите избор и кликните "

View File

@ -11,9 +11,9 @@ SHORT_DATE_FORMAT = 'j.m.Y.'
SHORT_DATETIME_FORMAT = 'j.m.Y. H:i' SHORT_DATETIME_FORMAT = 'j.m.Y. H:i'
FIRST_DAY_OF_WEEK = 1 FIRST_DAY_OF_WEEK = 1
DATE_INPUT_FORMATS = ( DATE_INPUT_FORMATS = (
'%d.%m.%Y.', '%d.%m.%y.', # '25.10.2006.', '25.10.06.'
'%d. %m. %Y.', '%d. %m. %y.', # '25. 10. 2006.', '25. 10. 06.'
'%Y-%m-%d', # '2006-10-25' '%Y-%m-%d', # '2006-10-25'
'%d.%m.%Y.', '%d.%m.%y.', # '25.10.2006.', '25.10.06.'
'%d. %m. %Y.', '%d. %m. %y.', # '25. 10. 2006.', '25. 10. 06.'
# '%d. %b %y.', '%d. %B %y.', # '25. Oct 06.', '25. October 06.' # '%d. %b %y.', '%d. %B %y.', # '25. Oct 06.', '25. October 06.'
# '%d. %b \'%y.', '%d. %B \'%y.', # '25. Oct '06.', '25. October '06.' # '%d. %b \'%y.', '%d. %B \'%y.', # '25. Oct '06.', '25. October '06.'
# '%d. %b %Y.', '%d. %B %Y.', # '25. Oct 2006.', '25. October 2006.' # '%d. %b %Y.', '%d. %B %Y.', # '25. Oct 2006.', '25. October 2006.'
@ -23,22 +23,22 @@ TIME_INPUT_FORMATS = (
'%H:%M', # '14:30' '%H:%M', # '14:30'
) )
DATETIME_INPUT_FORMATS = ( DATETIME_INPUT_FORMATS = (
'%d.%m.%Y. %H:%M:%S', # '25.10.2006. 14:30:59'
'%d.%m.%Y. %H:%M', # '25.10.2006. 14:30'
'%d.%m.%Y.', # '25.10.2006.'
'%d.%m.%y. %H:%M:%S', # '25.10.06. 14:30:59'
'%d.%m.%y. %H:%M', # '25.10.06. 14:30'
'%d.%m.%y.', # '25.10.06.'
'%d. %m. %Y. %H:%M:%S', # '25. 10. 2006. 14:30:59'
'%d. %m. %Y. %H:%M', # '25. 10. 2006. 14:30'
'%d. %m. %Y.', # '25. 10. 2006.'
'%d. %m. %y. %H:%M:%S', # '25. 10. 06. 14:30:59'
'%d. %m. %y. %H:%M', # '25. 10. 06. 14:30'
'%d. %m. %y.', # '25. 10. 06.'
'%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
'%Y-%m-%d %H:%M', # '2006-10-25 14:30' '%Y-%m-%d %H:%M', # '2006-10-25 14:30'
'%Y-%m-%d', # '2006-10-25' '%Y-%m-%d', # '2006-10-25'
'%d.%m.%Y. %H:%M:%S', # '25.10.2006. 14:30:59'
'%d.%m.%Y. %H:%M', # '25.10.2006. 14:30'
'%d.%m.%Y.', # '25.10.2006.'
'%d.%m.%y. %H:%M:%S', # '25.10.06. 14:30:59'
'%d.%m.%y. %H:%M', # '25.10.06. 14:30'
'%d.%m.%y.', # '25.10.06.'
'%d. %m. %Y. %H:%M:%S', # '25. 10. 2006. 14:30:59'
'%d. %m. %Y. %H:%M', # '25. 10. 2006. 14:30'
'%d. %m. %Y.', # '25. 10. 2006.'
'%d. %m. %y. %H:%M:%S', # '25. 10. 06. 14:30:59'
'%d. %m. %y. %H:%M', # '25. 10. 06. 14:30'
'%d. %m. %y.', # '25. 10. 06.'
) )
DECIMAL_SEPARATOR = '.' DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = ',' THOUSAND_SEPARATOR = '.'
NUMBER_GROUPING = 3 NUMBER_GROUPING = 3

File diff suppressed because it is too large Load Diff

View File

@ -11,9 +11,9 @@ SHORT_DATE_FORMAT = 'j.m.Y.'
SHORT_DATETIME_FORMAT = 'j.m.Y. H:i' SHORT_DATETIME_FORMAT = 'j.m.Y. H:i'
FIRST_DAY_OF_WEEK = 1 FIRST_DAY_OF_WEEK = 1
DATE_INPUT_FORMATS = ( DATE_INPUT_FORMATS = (
'%d.%m.%Y.', '%d.%m.%y.', # '25.10.2006.', '25.10.06.'
'%d. %m. %Y.', '%d. %m. %y.', # '25. 10. 2006.', '25. 10. 06.'
'%Y-%m-%d', # '2006-10-25' '%Y-%m-%d', # '2006-10-25'
'%d.%m.%Y.', '%d.%m.%y.', # '25.10.2006.', '25.10.06.'
'%d. %m. %Y.', '%d. %m. %y.', # '25. 10. 2006.', '25. 10. 06.'
# '%d. %b %y.', '%d. %B %y.', # '25. Oct 06.', '25. October 06.' # '%d. %b %y.', '%d. %B %y.', # '25. Oct 06.', '25. October 06.'
# '%d. %b \'%y.', '%d. %B \'%y.', # '25. Oct '06.', '25. October '06.' # '%d. %b \'%y.', '%d. %B \'%y.', # '25. Oct '06.', '25. October '06.'
# '%d. %b %Y.', '%d. %B %Y.', # '25. Oct 2006.', '25. October 2006.' # '%d. %b %Y.', '%d. %B %Y.', # '25. Oct 2006.', '25. October 2006.'
@ -23,22 +23,22 @@ TIME_INPUT_FORMATS = (
'%H:%M', # '14:30' '%H:%M', # '14:30'
) )
DATETIME_INPUT_FORMATS = ( DATETIME_INPUT_FORMATS = (
'%d.%m.%Y. %H:%M:%S', # '25.10.2006. 14:30:59'
'%d.%m.%Y. %H:%M', # '25.10.2006. 14:30'
'%d.%m.%Y.', # '25.10.2006.'
'%d.%m.%y. %H:%M:%S', # '25.10.06. 14:30:59'
'%d.%m.%y. %H:%M', # '25.10.06. 14:30'
'%d.%m.%y.', # '25.10.06.'
'%d. %m. %Y. %H:%M:%S', # '25. 10. 2006. 14:30:59'
'%d. %m. %Y. %H:%M', # '25. 10. 2006. 14:30'
'%d. %m. %Y.', # '25. 10. 2006.'
'%d. %m. %y. %H:%M:%S', # '25. 10. 06. 14:30:59'
'%d. %m. %y. %H:%M', # '25. 10. 06. 14:30'
'%d. %m. %y.', # '25. 10. 06.'
'%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
'%Y-%m-%d %H:%M', # '2006-10-25 14:30' '%Y-%m-%d %H:%M', # '2006-10-25 14:30'
'%Y-%m-%d', # '2006-10-25' '%Y-%m-%d', # '2006-10-25'
'%d.%m.%Y. %H:%M:%S', # '25.10.2006. 14:30:59'
'%d.%m.%Y. %H:%M', # '25.10.2006. 14:30'
'%d.%m.%Y.', # '25.10.2006.'
'%d.%m.%y. %H:%M:%S', # '25.10.06. 14:30:59'
'%d.%m.%y. %H:%M', # '25.10.06. 14:30'
'%d.%m.%y.', # '25.10.06.'
'%d. %m. %Y. %H:%M:%S', # '25. 10. 2006. 14:30:59'
'%d. %m. %Y. %H:%M', # '25. 10. 2006. 14:30'
'%d. %m. %Y.', # '25. 10. 2006.'
'%d. %m. %y. %H:%M:%S', # '25. 10. 06. 14:30:59'
'%d. %m. %y. %H:%M', # '25. 10. 06. 14:30'
'%d. %m. %y.', # '25. 10. 06.'
) )
DECIMAL_SEPARATOR = '.' DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = ',' THOUSAND_SEPARATOR = '.'
NUMBER_GROUPING = 3 NUMBER_GROUPING = 3

View File

@ -91,4 +91,6 @@ INSTALLED_APPS = (
'django.contrib.messages', 'django.contrib.messages',
# Uncomment the next line to enable the admin: # Uncomment the next line to enable the admin:
# 'django.contrib.admin', # 'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
) )

View File

@ -8,8 +8,7 @@ urlpatterns = patterns('',
# Example: # Example:
# (r'^{{ project_name }}/', include('{{ project_name }}.foo.urls')), # (r'^{{ project_name }}/', include('{{ project_name }}.foo.urls')),
# Uncomment the admin/doc line below and add 'django.contrib.admindocs' # Uncomment the admin/doc line below to enable admin documentation:
# to INSTALLED_APPS to enable admin documentation:
# (r'^admin/doc/', include('django.contrib.admindocs.urls')), # (r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin: # Uncomment the next line to enable the admin:

View File

@ -445,6 +445,14 @@ ul.messagelist li {
background: #ffc url(../img/admin/icon_success.gif) 5px .3em no-repeat; background: #ffc url(../img/admin/icon_success.gif) 5px .3em no-repeat;
} }
ul.messagelist li.warning{
background-image: url(../img/admin/icon_alert.gif);
}
ul.messagelist li.error{
background-image: url(../img/admin/icon_error.gif);
}
.errornote { .errornote {
font-size: 12px !important; font-size: 12px !important;
display: block; display: block;
@ -470,6 +478,11 @@ ul.errorlist {
background: red url(../img/admin/icon_alert.gif) 5px .3em no-repeat; background: red url(../img/admin/icon_alert.gif) 5px .3em no-repeat;
} }
.errorlist li a {
color: white;
text-decoration: underline;
}
td ul.errorlist { td ul.errorlist {
margin: 0 !important; margin: 0 !important;
padding: 0 !important; padding: 0 !important;

View File

@ -9,6 +9,8 @@
width: 100%; width: 100%;
} }
.change-list .hiddenfields { display:none; }
.change-list .filtered table { .change-list .filtered table {
border-right: 1px solid #ddd; border-right: 1px solid #ddd;
} }
@ -21,7 +23,7 @@
background: white url(../img/admin/changelist-bg.gif) top right repeat-y !important; background: white url(../img/admin/changelist-bg.gif) top right repeat-y !important;
} }
.change-list .filtered table, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull { .change-list .filtered .results, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull {
margin-right: 160px !important; margin-right: 160px !important;
width: auto !important; width: auto !important;
} }

View File

@ -100,8 +100,9 @@ var dateParsePatterns = [
{ re: /^(\d{1,2})(?:st|nd|rd|th)? (\w+)$/i, { re: /^(\d{1,2})(?:st|nd|rd|th)? (\w+)$/i,
handler: function(bits) { handler: function(bits) {
var d = new Date(); var d = new Date();
d.setDate(parseInt(bits[1], 10)); d.setDate(1);
d.setMonth(parseMonth(bits[2])); d.setMonth(parseMonth(bits[2]));
d.setDate(parseInt(bits[1], 10));
return d; return d;
} }
}, },
@ -109,9 +110,10 @@ var dateParsePatterns = [
{ re: /^(\d{1,2})(?:st|nd|rd|th)? (\w+),? (\d{4})$/i, { re: /^(\d{1,2})(?:st|nd|rd|th)? (\w+),? (\d{4})$/i,
handler: function(bits) { handler: function(bits) {
var d = new Date(); var d = new Date();
d.setDate(parseInt(bits[1], 10)); d.setDate(1);
d.setMonth(parseMonth(bits[2]));
d.setYear(bits[3]); d.setYear(bits[3]);
d.setMonth(parseMonth(bits[2]));
d.setDate(parseInt(bits[1], 10));
return d; return d;
} }
}, },
@ -119,8 +121,9 @@ var dateParsePatterns = [
{ re: /^(\w+) (\d{1,2})(?:st|nd|rd|th)?$/i, { re: /^(\w+) (\d{1,2})(?:st|nd|rd|th)?$/i,
handler: function(bits) { handler: function(bits) {
var d = new Date(); var d = new Date();
d.setDate(parseInt(bits[2], 10)); d.setDate(1);
d.setMonth(parseMonth(bits[1])); d.setMonth(parseMonth(bits[1]));
d.setDate(parseInt(bits[2], 10));
return d; return d;
} }
}, },
@ -128,9 +131,10 @@ var dateParsePatterns = [
{ re: /^(\w+) (\d{1,2})(?:st|nd|rd|th)?,? (\d{4})$/i, { re: /^(\w+) (\d{1,2})(?:st|nd|rd|th)?,? (\d{4})$/i,
handler: function(bits) { handler: function(bits) {
var d = new Date(); var d = new Date();
d.setDate(parseInt(bits[2], 10)); d.setDate(1);
d.setMonth(parseMonth(bits[1]));
d.setYear(bits[3]); d.setYear(bits[3]);
d.setMonth(parseMonth(bits[1]));
d.setDate(parseInt(bits[2], 10));
return d; return d;
} }
}, },
@ -158,9 +162,10 @@ var dateParsePatterns = [
{ re: /(\d{1,2})\/(\d{1,2})\/(\d{4})/, { re: /(\d{1,2})\/(\d{1,2})\/(\d{4})/,
handler: function(bits) { handler: function(bits) {
var d = new Date(); var d = new Date();
d.setDate(1);
d.setYear(bits[3]); d.setYear(bits[3]);
d.setDate(parseInt(bits[2], 10));
d.setMonth(parseInt(bits[1], 10) - 1); // Because months indexed from 0 d.setMonth(parseInt(bits[1], 10) - 1); // Because months indexed from 0
d.setDate(parseInt(bits[2], 10));
return d; return d;
} }
}, },
@ -168,6 +173,7 @@ var dateParsePatterns = [
{ re: /(\d{4})-(\d{1,2})-(\d{1,2})/, { re: /(\d{4})-(\d{1,2})-(\d{1,2})/,
handler: function(bits) { handler: function(bits) {
var d = new Date(); var d = new Date();
d.setDate(1);
d.setYear(parseInt(bits[1])); d.setYear(parseInt(bits[1]));
d.setMonth(parseInt(bits[2], 10) - 1); d.setMonth(parseInt(bits[2], 10) - 1);
d.setDate(parseInt(bits[3], 10)); d.setDate(parseInt(bits[3], 10));

View File

@ -108,7 +108,13 @@ class BaseModelAdmin(object):
# rendered output. formfield can be None if it came from a # rendered output. formfield can be None if it came from a
# OneToOneField with parent_link=True or a M2M intermediary. # OneToOneField with parent_link=True or a M2M intermediary.
if formfield and db_field.name not in self.raw_id_fields: if formfield and db_field.name not in self.raw_id_fields:
formfield.widget = widgets.RelatedFieldWidgetWrapper(formfield.widget, db_field.rel, self.admin_site) related_modeladmin = self.admin_site._registry.get(
db_field.rel.to)
can_add_related = bool(related_modeladmin and
related_modeladmin.has_add_permission(request))
formfield.widget = widgets.RelatedFieldWidgetWrapper(
formfield.widget, db_field.rel, self.admin_site,
can_add_related=can_add_related)
return formfield return formfield
@ -502,7 +508,7 @@ class ModelAdmin(BaseModelAdmin):
# Convert the actions into a SortedDict keyed by name # Convert the actions into a SortedDict keyed by name
# and sorted by description. # and sorted by description.
actions.sort(lambda a,b: cmp(a[2].lower(), b[2].lower())) actions.sort(key=lambda k: k[2].lower())
actions = SortedDict([ actions = SortedDict([
(name, (func, name, desc)) (name, (func, name, desc))
for func, name, desc in actions for func, name, desc in actions
@ -755,7 +761,7 @@ class ModelAdmin(BaseModelAdmin):
if isinstance(response, HttpResponse): if isinstance(response, HttpResponse):
return response return response
else: else:
return HttpResponseRedirect(".") return HttpResponseRedirect(request.get_full_path())
else: else:
msg = _("No action selected.") msg = _("No action selected.")
self.message_user(request, msg) self.message_user(request, msg)

View File

@ -380,11 +380,11 @@ class AdminSite(object):
# Sort the apps alphabetically. # Sort the apps alphabetically.
app_list = app_dict.values() app_list = app_dict.values()
app_list.sort(lambda x, y: cmp(x['name'], y['name'])) app_list.sort(key=lambda x: x['name'])
# Sort the models alphabetically within each app. # Sort the models alphabetically within each app.
for app in app_list: for app in app_list:
app['models'].sort(lambda x, y: cmp(x['name'], y['name'])) app['models'].sort(key=lambda x: x['name'])
context = { context = {
'title': _('Site administration'), 'title': _('Site administration'),
@ -445,7 +445,7 @@ class AdminSite(object):
if not app_dict: if not app_dict:
raise http.Http404('The requested admin page does not exist.') raise http.Http404('The requested admin page does not exist.')
# Sort the models alphabetically within each app. # Sort the models alphabetically within each app.
app_dict['models'].sort(lambda x, y: cmp(x['name'], y['name'])) app_dict['models'].sort(key=lambda x: x['name'])
context = { context = {
'title': _('%s administration') % app_instance.verbose_name, 'title': _('%s administration') % app_instance.verbose_name,
'app_list': [app_dict], 'app_list': [app_dict],

View File

@ -2,8 +2,11 @@
{% load i18n %} {% load i18n %}
{% block form_top %} {% block form_top %}
{% if not is_popup %}
<p>{% trans "First, enter a username and password. Then, you'll be able to edit more user options." %}</p> <p>{% trans "First, enter a username and password. Then, you'll be able to edit more user options." %}</p>
<input type="hidden" name="_continue" value="1" /> {% else %}
<p>{% trans "Enter a username and password." %}</p>
{% endif %}
{% endblock %} {% endblock %}
{% block after_field_sets %} {% block after_field_sets %}

View File

@ -56,7 +56,9 @@
{% endif %} {% endif %}
{% if messages %} {% if messages %}
<ul class="messagelist">{% for message in messages %}<li>{{ message }}</li>{% endfor %}</ul> <ul class="messagelist">{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}</ul>
{% endif %} {% endif %}
<!-- Content --> <!-- Content -->

View File

@ -1,4 +1,10 @@
{% if result_hidden_fields %}
<div class="hiddenfields"> {# DIV for HTML validation #}
{% for item in result_hidden_fields %}{{ item }}{% endfor %}
</div>
{% endif %}
{% if results %} {% if results %}
<div class="results">
<table cellspacing="0" id="result_list"> <table cellspacing="0" id="result_list">
<thead> <thead>
<tr> <tr>
@ -14,4 +20,5 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
</div>
{% endif %} {% endif %}

View File

@ -189,7 +189,7 @@ def items_for_result(cl, result, form):
else: else:
result_repr = conditional_escape(result_repr) result_repr = conditional_escape(result_repr)
yield mark_safe(u'<td%s>%s</td>' % (row_class, result_repr)) yield mark_safe(u'<td%s>%s</td>' % (row_class, result_repr))
if form: if form and not form[cl.model._meta.pk.name].is_hidden:
yield mark_safe(u'<td>%s</td>' % force_unicode(form[cl.model._meta.pk.name])) yield mark_safe(u'<td>%s</td>' % force_unicode(form[cl.model._meta.pk.name]))
def results(cl): def results(cl):
@ -200,11 +200,18 @@ def results(cl):
for res in cl.result_list: for res in cl.result_list:
yield list(items_for_result(cl, res, None)) yield list(items_for_result(cl, res, None))
def result_hidden_fields(cl):
if cl.formset:
for res, form in zip(cl.result_list, cl.formset.forms):
if form[cl.model._meta.pk.name].is_hidden:
yield mark_safe(force_unicode(form[cl.model._meta.pk.name]))
def result_list(cl): def result_list(cl):
""" """
Displays the headers and data list together Displays the headers and data list together
""" """
return {'cl': cl, return {'cl': cl,
'result_hidden_fields': list(result_hidden_fields(cl)),
'result_headers': list(result_headers(cl)), 'result_headers': list(result_headers(cl)),
'results': list(results(cl))} 'results': list(results(cl))}
result_list = register.inclusion_tag("admin/change_list_results.html")(result_list) result_list = register.inclusion_tag("admin/change_list_results.html")(result_list)

View File

@ -154,9 +154,9 @@ class ForeignKeyRawIdWidget(forms.TextInput):
key = self.rel.get_related_field().name key = self.rel.get_related_field().name
try: try:
obj = self.rel.to._default_manager.using(self.db).get(**{key: value}) obj = self.rel.to._default_manager.using(self.db).get(**{key: value})
except self.rel.to.DoesNotExist:
return ''
return '&nbsp;<strong>%s</strong>' % escape(truncate_words(obj, 14)) return '&nbsp;<strong>%s</strong>' % escape(truncate_words(obj, 14))
except (ValueError, self.rel.to.DoesNotExist):
return ''
class ManyToManyRawIdWidget(ForeignKeyRawIdWidget): class ManyToManyRawIdWidget(ForeignKeyRawIdWidget):
""" """
@ -169,7 +169,7 @@ class ManyToManyRawIdWidget(ForeignKeyRawIdWidget):
def render(self, name, value, attrs=None): def render(self, name, value, attrs=None):
attrs['class'] = 'vManyToManyRawIdAdminField' attrs['class'] = 'vManyToManyRawIdAdminField'
if value: if value:
value = ','.join([str(v) for v in value]) value = ','.join([force_unicode(v) for v in value])
else: else:
value = '' value = ''
return super(ManyToManyRawIdWidget, self).render(name, value, attrs) return super(ManyToManyRawIdWidget, self).render(name, value, attrs)
@ -205,13 +205,18 @@ class RelatedFieldWidgetWrapper(forms.Widget):
This class is a wrapper to a given widget to add the add icon for the This class is a wrapper to a given widget to add the add icon for the
admin interface. admin interface.
""" """
def __init__(self, widget, rel, admin_site): def __init__(self, widget, rel, admin_site, can_add_related=None):
self.is_hidden = widget.is_hidden self.is_hidden = widget.is_hidden
self.needs_multipart_form = widget.needs_multipart_form self.needs_multipart_form = widget.needs_multipart_form
self.attrs = widget.attrs self.attrs = widget.attrs
self.choices = widget.choices self.choices = widget.choices
self.widget = widget self.widget = widget
self.rel = rel self.rel = rel
# Backwards compatible check for whether a user can add related
# objects.
if can_add_related is None:
can_add_related = rel_to in self.admin_site._registry
self.can_add_related = can_add_related
# so we can check if the related object is registered with this AdminSite # so we can check if the related object is registered with this AdminSite
self.admin_site = admin_site self.admin_site = admin_site
@ -236,7 +241,7 @@ class RelatedFieldWidgetWrapper(forms.Widget):
related_url = '%s%s/%s/add/' % info related_url = '%s%s/%s/add/' % info
self.widget.choices = self.choices self.widget.choices = self.choices
output = [self.widget.render(name, value, *args, **kwargs)] output = [self.widget.render(name, value, *args, **kwargs)]
if rel_to in self.admin_site._registry: # If the related object has an admin interface: if self.can_add_related:
# TODO: "id_" is hard-coded here. This should instead use the correct # TODO: "id_" is hard-coded here. This should instead use the correct
# API to determine the ID dynamically. # API to determine the ID dynamically.
output.append(u'<a href="%s" class="add-another" id="add_id_%s" onclick="return showAddAnotherPopup(this);"> ' % \ output.append(u'<a href="%s" class="add-another" id="add_id_%s" onclick="return showAddAnotherPopup(this);"> ' % \

View File

@ -15,7 +15,7 @@
<h2>{% firstof library.grouper "Built-in filters" %}</h2> <h2>{% firstof library.grouper "Built-in filters" %}</h2>
{% if library.grouper %}<p class="small quiet">To use these filters, put <code>{% templatetag openblock %} load {{ library.grouper }} {% templatetag closeblock %}</code> in your template before using the filter.</p><hr />{% endif %} {% if library.grouper %}<p class="small quiet">To use these filters, put <code>{% templatetag openblock %} load {{ library.grouper }} {% templatetag closeblock %}</code> in your template before using the filter.</p><hr />{% endif %}
{% for filter in library.list|dictsort:"name" %} {% for filter in library.list|dictsort:"name" %}
<h3 id="{{ filter.name }}">{{ filter.name }}</h3> <h3 id="{{ library.grouper|default_if_none:"built_in" }}-{{ filter.name }}">{{ filter.name }}</h3>
<p>{{ filter.title }}</p> <p>{{ filter.title }}</p>
<p>{{ filter.body }}</p> <p>{{ filter.body }}</p>
{% if not forloop.last %}<hr />{% endif %} {% if not forloop.last %}<hr />{% endif %}
@ -36,7 +36,7 @@
<h2>{% firstof library.grouper "Built-in filters" %}</h2> <h2>{% firstof library.grouper "Built-in filters" %}</h2>
<ul> <ul>
{% for filter in library.list|dictsort:"name" %} {% for filter in library.list|dictsort:"name" %}
<li><a href="#{{ filter.name }}">{{ filter.name }}</a></li> <li><a href="#{{ library.grouper|default_if_none:"built_in" }}-{{ filter.name }}">{{ filter.name }}</a></li>
{% endfor %} {% endfor %}
</ul> </ul>
</div> </div>

View File

@ -15,7 +15,7 @@
<h2>{% firstof library.grouper "Built-in tags" %}</h2> <h2>{% firstof library.grouper "Built-in tags" %}</h2>
{% if library.grouper %}<p class="small quiet">To use these tags, put <code>{% templatetag openblock %} load {{ library.grouper }} {% templatetag closeblock %}</code> in your template before using the tag.</p><hr />{% endif %} {% if library.grouper %}<p class="small quiet">To use these tags, put <code>{% templatetag openblock %} load {{ library.grouper }} {% templatetag closeblock %}</code> in your template before using the tag.</p><hr />{% endif %}
{% for tag in library.list|dictsort:"name" %} {% for tag in library.list|dictsort:"name" %}
<h3 id="{{ tag.name }}">{{ tag.name }}</h3> <h3 id="{{ library.grouper|default_if_none:"built_in" }}-{{ tag.name }}">{{ tag.name }}</h3>
<h4>{{ tag.title }}</h4> <h4>{{ tag.title }}</h4>
<p>{{ tag.body }}</p> <p>{{ tag.body }}</p>
{% if not forloop.last %}<hr />{% endif %} {% if not forloop.last %}<hr />{% endif %}
@ -36,7 +36,7 @@
<h2>{% firstof library.grouper "Built-in tags" %}</h2> <h2>{% firstof library.grouper "Built-in tags" %}</h2>
<ul> <ul>
{% for tag in library.list|dictsort:"name" %} {% for tag in library.list|dictsort:"name" %}
<li><a href="#{{ tag.name }}">{{ tag.name }}</a></li> <li><a href="#{{ library.grouper|default_if_none:"built_in" }}-{{ tag.name }}">{{ tag.name }}</a></li>
{% endfor %} {% endfor %}
</ul> </ul>
</div> </div>

View File

@ -54,7 +54,9 @@ def template_tag_index(request):
load_all_installed_template_libraries() load_all_installed_template_libraries()
tags = [] tags = []
for module_name, library in template.libraries.items(): app_libs = template.libraries.items()
builtin_libs = [(None, lib) for lib in template.builtins]
for module_name, library in builtin_libs + app_libs:
for tag_name, tag_func in library.tags.items(): for tag_name, tag_func in library.tags.items():
title, body, metadata = utils.parse_docstring(tag_func.__doc__) title, body, metadata = utils.parse_docstring(tag_func.__doc__)
if title: if title:
@ -87,7 +89,9 @@ def template_filter_index(request):
load_all_installed_template_libraries() load_all_installed_template_libraries()
filters = [] filters = []
for module_name, library in template.libraries.items(): app_libs = template.libraries.items()
builtin_libs = [(None, lib) for lib in template.builtins]
for module_name, library in builtin_libs + app_libs:
for filter_name, filter_func in library.filters.items(): for filter_name, filter_func in library.filters.items():
title, body, metadata = utils.parse_docstring(filter_func.__doc__) title, body, metadata = utils.parse_docstring(filter_func.__doc__)
if title: if title:

View File

@ -30,13 +30,14 @@ def user_passes_test(test_func, login_url=None, redirect_field_name=REDIRECT_FIE
return decorator return decorator
def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME): def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None):
""" """
Decorator for views that checks that the user is logged in, redirecting Decorator for views that checks that the user is logged in, redirecting
to the log-in page if necessary. to the log-in page if necessary.
""" """
actual_decorator = user_passes_test( actual_decorator = user_passes_test(
lambda u: u.is_authenticated(), lambda u: u.is_authenticated(),
login_url=login_url,
redirect_field_name=redirect_field_name redirect_field_name=redirect_field_name
) )
if function: if function:

View File

@ -52,6 +52,12 @@ class UserChangeForm(forms.ModelForm):
class Meta: class Meta:
model = User model = User
def __init__(self, *args, **kwargs):
super(UserChangeForm, self).__init__(*args, **kwargs)
f = self.fields.get('user_permissions', None)
if f is not None:
f.queryset = f.queryset.select_related('content_type')
class AuthenticationForm(forms.Form): class AuthenticationForm(forms.Form):
""" """
Base class for authenticating users. Extend this to get a form that accepts Base class for authenticating users. Extend this to get a form that accepts
@ -111,7 +117,7 @@ class PasswordResetForm(forms.Form):
return email return email
def save(self, domain_override=None, email_template_name='registration/password_reset_email.html', def save(self, domain_override=None, email_template_name='registration/password_reset_email.html',
use_https=False, token_generator=default_token_generator): use_https=False, token_generator=default_token_generator, from_email=None):
""" """
Generates a one-use only link for resetting password and sends to the user Generates a one-use only link for resetting password and sends to the user
""" """
@ -134,7 +140,7 @@ class PasswordResetForm(forms.Form):
'protocol': use_https and 'https' or 'http', 'protocol': use_https and 'https' or 'http',
} }
send_mail(_("Password reset on %s") % site_name, send_mail(_("Password reset on %s") % site_name,
t.render(Context(c)), None, [user.email]) t.render(Context(c)), from_email, [user.email])
class SetPasswordForm(forms.Form): class SetPasswordForm(forms.Form):
""" """

View File

@ -1,7 +1,7 @@
from django.contrib.auth.tests.auth_backends import BackendTest, RowlevelBackendTest, AnonymousUserBackendTest, NoAnonymousUserBackendTest from django.contrib.auth.tests.auth_backends import BackendTest, RowlevelBackendTest, AnonymousUserBackendTest, NoAnonymousUserBackendTest
from django.contrib.auth.tests.basic import BASIC_TESTS from django.contrib.auth.tests.basic import BASIC_TESTS
from django.contrib.auth.tests.decorators import LoginRequiredTestCase from django.contrib.auth.tests.decorators import LoginRequiredTestCase
from django.contrib.auth.tests.forms import FORM_TESTS from django.contrib.auth.tests.forms import UserCreationFormTest, AuthenticationFormTest, SetPasswordFormTest, PasswordChangeFormTest, UserChangeFormTest, PasswordResetFormTest
from django.contrib.auth.tests.remote_user \ from django.contrib.auth.tests.remote_user \
import RemoteUserTest, RemoteUserNoCreateTest, RemoteUserCustomTest import RemoteUserTest, RemoteUserNoCreateTest, RemoteUserCustomTest
from django.contrib.auth.tests.models import ProfileTestCase from django.contrib.auth.tests.models import ProfileTestCase
@ -13,6 +13,5 @@ from django.contrib.auth.tests.views \
__test__ = { __test__ = {
'BASIC_TESTS': BASIC_TESTS, 'BASIC_TESTS': BASIC_TESTS,
'FORM_TESTS': FORM_TESTS,
'TOKEN_GENERATOR_TESTS': TOKEN_GENERATOR_TESTS, 'TOKEN_GENERATOR_TESTS': TOKEN_GENERATOR_TESTS,
} }

View File

@ -1,12 +1,12 @@
from unittest import TestCase
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.contrib.auth.tests.views import AuthViewsTestCase
class LoginRequiredTestCase(AuthViewsTestCase):
class LoginRequiredTestCase(TestCase):
""" """
Tests the login_required decorators Tests the login_required decorators
""" """
urls = 'django.contrib.auth.tests.urls'
def testCallable(self): def testCallable(self):
""" """
Check that login_required is assignable to callable objects. Check that login_required is assignable to callable objects.
@ -23,3 +23,23 @@ class LoginRequiredTestCase(TestCase):
def normal_view(request): def normal_view(request):
pass pass
login_required(normal_view) login_required(normal_view)
def testLoginRequired(self, view_url='/login_required/', login_url='/login/'):
"""
Check that login_required works on a simple view wrapped in a
login_required decorator.
"""
response = self.client.get(view_url)
self.assertEqual(response.status_code, 302)
self.assert_(login_url in response['Location'])
self.login()
response = self.client.get(view_url)
self.assertEqual(response.status_code, 200)
def testLoginRequiredNextUrl(self):
"""
Check that login_required works on a simple view wrapped in a
login_required decorator with a login_url set.
"""
self.testLoginRequired(view_url='/login_required_login_url/',
login_url='/somewhere/')

View File

@ -1,231 +1,252 @@
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm, PasswordChangeForm, SetPasswordForm, UserChangeForm, PasswordResetForm
from django.test import TestCase
FORM_TESTS = """
>>> from django.contrib.auth.models import User
>>> from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
>>> from django.contrib.auth.forms import PasswordChangeForm, SetPasswordForm
# The user already exists. class UserCreationFormTest(TestCase):
>>> user = User.objects.create_user("jsmith", "jsmith@example.com", "test123") fixtures = ['authtestdata.json']
>>> data = {
... 'username': 'jsmith',
... 'password1': 'test123',
... 'password2': 'test123',
... }
>>> form = UserCreationForm(data)
>>> form.is_valid()
False
>>> form["username"].errors
[u'A user with that username already exists.']
# The username contains invalid data. def test_user_already_exists(self):
data = {
'username': 'testclient',
'password1': 'test123',
'password2': 'test123',
}
form = UserCreationForm(data)
self.assertFalse(form.is_valid())
self.assertEqual(form["username"].errors,
[u'A user with that username already exists.'])
>>> data = { def test_invalid_data(self):
... 'username': 'jsmith!', data = {
... 'password1': 'test123', 'username': 'jsmith!',
... 'password2': 'test123', 'password1': 'test123',
... } 'password2': 'test123',
>>> form = UserCreationForm(data) }
>>> form.is_valid() form = UserCreationForm(data)
False self.assertFalse(form.is_valid())
>>> form["username"].errors self.assertEqual(form["username"].errors,
[u'This value may contain only letters, numbers and @/./+/-/_ characters.'] [u'This value may contain only letters, numbers and @/./+/-/_ characters.'])
def test_password_verification(self):
# The verification password is incorrect. # The verification password is incorrect.
data = {
'username': 'jsmith',
'password1': 'test123',
'password2': 'test',
}
form = UserCreationForm(data)
self.assertFalse(form.is_valid())
self.assertEqual(form["password2"].errors,
[u"The two password fields didn't match."])
>>> data = {
... 'username': 'jsmith2',
... 'password1': 'test123',
... 'password2': 'test',
... }
>>> form = UserCreationForm(data)
>>> form.is_valid()
False
>>> form["password2"].errors
[u"The two password fields didn't match."]
def test_both_passwords(self):
# One (or both) passwords weren't given # One (or both) passwords weren't given
data = {'username': 'jsmith'}
form = UserCreationForm(data)
self.assertFalse(form.is_valid())
self.assertEqual(form['password1'].errors,
[u'This field is required.'])
self.assertEqual(form['password2'].errors,
[u'This field is required.'])
>>> data = {'username': 'jsmith2'}
>>> form = UserCreationForm(data)
>>> form.is_valid()
False
>>> form['password1'].errors
[u'This field is required.']
>>> form['password2'].errors
[u'This field is required.']
>>> data['password2'] = 'test123' data['password2'] = 'test123'
>>> form = UserCreationForm(data) form = UserCreationForm(data)
>>> form.is_valid() self.assertFalse(form.is_valid())
False self.assertEqual(form['password1'].errors,
>>> form['password1'].errors [u'This field is required.'])
[u'This field is required.']
def test_success(self):
# The success case. # The success case.
>>> data = { data = {
... 'username': 'jsmith2@example.com', 'username': 'jsmith@example.com',
... 'password1': 'test123', 'password1': 'test123',
... 'password2': 'test123', 'password2': 'test123',
... } }
>>> form = UserCreationForm(data) form = UserCreationForm(data)
>>> form.is_valid() self.assertTrue(form.is_valid())
True u = form.save()
>>> form.save() self.assertEqual(repr(u), '<User: jsmith@example.com>')
<User: jsmith2@example.com>
class AuthenticationFormTest(TestCase):
fixtures = ['authtestdata.json']
def test_invalid_username(self):
# The user submits an invalid username. # The user submits an invalid username.
>>> data = { data = {
... 'username': 'jsmith_does_not_exist', 'username': 'jsmith_does_not_exist',
... 'password': 'test123', 'password': 'test123',
... } }
form = AuthenticationForm(None, data)
>>> form = AuthenticationForm(None, data) self.assertFalse(form.is_valid())
>>> form.is_valid() self.assertEqual(form.non_field_errors(),
False [u'Please enter a correct username and password. Note that both fields are case-sensitive.'])
>>> form.non_field_errors()
[u'Please enter a correct username and password. Note that both fields are case-sensitive.']
def test_inactive_user(self):
# The user is inactive. # The user is inactive.
data = {
'username': 'inactive',
'password': 'password',
}
form = AuthenticationForm(None, data)
self.assertFalse(form.is_valid())
self.assertEqual(form.non_field_errors(),
[u'This account is inactive.'])
>>> data = {
... 'username': 'jsmith',
... 'password': 'test123',
... }
>>> user.is_active = False
>>> user.save()
>>> form = AuthenticationForm(None, data)
>>> form.is_valid()
False
>>> form.non_field_errors()
[u'This account is inactive.']
>>> user.is_active = True
>>> user.save()
def test_success(self):
# The success case # The success case
data = {
'username': 'testclient',
'password': 'password',
}
form = AuthenticationForm(None, data)
self.assertTrue(form.is_valid())
self.assertEqual(form.non_field_errors(), [])
>>> form = AuthenticationForm(None, data)
>>> form.is_valid()
True
>>> form.non_field_errors()
[]
### SetPasswordForm: class SetPasswordFormTest(TestCase):
fixtures = ['authtestdata.json']
def test_password_verification(self):
# The two new passwords do not match. # The two new passwords do not match.
user = User.objects.get(username='testclient')
data = {
'new_password1': 'abc123',
'new_password2': 'abc',
}
form = SetPasswordForm(user, data)
self.assertFalse(form.is_valid())
self.assertEqual(form["new_password2"].errors,
[u"The two password fields didn't match."])
>>> data = { def test_success(self):
... 'new_password1': 'abc123', user = User.objects.get(username='testclient')
... 'new_password2': 'abc', data = {
... } 'new_password1': 'abc123',
>>> form = SetPasswordForm(user, data) 'new_password2': 'abc123',
>>> form.is_valid() }
False form = SetPasswordForm(user, data)
>>> form["new_password2"].errors self.assertTrue(form.is_valid())
[u"The two password fields didn't match."]
# The success case.
>>> data = { class PasswordChangeFormTest(TestCase):
... 'new_password1': 'abc123',
... 'new_password2': 'abc123',
... }
>>> form = SetPasswordForm(user, data)
>>> form.is_valid()
True
### PasswordChangeForm: fixtures = ['authtestdata.json']
The old password is incorrect. def test_incorrect_password(self):
user = User.objects.get(username='testclient')
data = {
'old_password': 'test',
'new_password1': 'abc123',
'new_password2': 'abc123',
}
form = PasswordChangeForm(user, data)
self.assertFalse(form.is_valid())
self.assertEqual(form["old_password"].errors,
[u'Your old password was entered incorrectly. Please enter it again.'])
>>> data = {
... 'old_password': 'test',
... 'new_password1': 'abc123',
... 'new_password2': 'abc123',
... }
>>> form = PasswordChangeForm(user, data)
>>> form.is_valid()
False
>>> form["old_password"].errors
[u'Your old password was entered incorrectly. Please enter it again.']
def test_password_verification(self):
# The two new passwords do not match. # The two new passwords do not match.
user = User.objects.get(username='testclient')
data = {
'old_password': 'password',
'new_password1': 'abc123',
'new_password2': 'abc',
}
form = PasswordChangeForm(user, data)
self.assertFalse(form.is_valid())
self.assertEqual(form["new_password2"].errors,
[u"The two password fields didn't match."])
>>> data = {
... 'old_password': 'test123',
... 'new_password1': 'abc123',
... 'new_password2': 'abc',
... }
>>> form = PasswordChangeForm(user, data)
>>> form.is_valid()
False
>>> form["new_password2"].errors
[u"The two password fields didn't match."]
def test_success(self):
# The success case. # The success case.
user = User.objects.get(username='testclient')
data = {
'old_password': 'password',
'new_password1': 'abc123',
'new_password2': 'abc123',
}
form = PasswordChangeForm(user, data)
self.assertTrue(form.is_valid())
>>> data = { def test_field_order(self):
... 'old_password': 'test123',
... 'new_password1': 'abc123',
... 'new_password2': 'abc123',
... }
>>> form = PasswordChangeForm(user, data)
>>> form.is_valid()
True
# Regression test - check the order of fields: # Regression test - check the order of fields:
user = User.objects.get(username='testclient')
self.assertEqual(PasswordChangeForm(user, {}).fields.keys(),
['old_password', 'new_password1', 'new_password2'])
>>> PasswordChangeForm(user, {}).fields.keys() class UserChangeFormTest(TestCase):
['old_password', 'new_password1', 'new_password2']
### UserChangeForm fixtures = ['authtestdata.json']
>>> from django.contrib.auth.forms import UserChangeForm def test_username_validity(self):
>>> data = {'username': 'not valid'} user = User.objects.get(username='testclient')
>>> form = UserChangeForm(data, instance=user) data = {'username': 'not valid'}
>>> form.is_valid() form = UserChangeForm(data, instance=user)
False self.assertFalse(form.is_valid())
>>> form['username'].errors self.assertEqual(form['username'].errors,
[u'This value may contain only letters, numbers and @/./+/-/_ characters.'] [u'This value may contain only letters, numbers and @/./+/-/_ characters.'])
def test_bug_14242(self):
# A regression test, introduce by adding an optimization for the
# UserChangeForm.
class MyUserForm(UserChangeForm):
def __init__(self, *args, **kwargs):
super(MyUserForm, self).__init__(*args, **kwargs)
self.fields['groups'].help_text = 'These groups give users different permissions'
class Meta(UserChangeForm.Meta):
fields = ('groups',)
# Just check we can create it
form = MyUserForm({})
### PasswordResetForm class PasswordResetFormTest(TestCase):
>>> from django.contrib.auth.forms import PasswordResetForm fixtures = ['authtestdata.json']
>>> data = {'email':'not valid'}
>>> form = PasswordResetForm(data)
>>> form.is_valid()
False
>>> form['email'].errors
[u'Enter a valid e-mail address.']
def test_invalid_email(self):
data = {'email':'not valid'}
form = PasswordResetForm(data)
self.assertFalse(form.is_valid())
self.assertEqual(form['email'].errors,
[u'Enter a valid e-mail address.'])
def test_nonexistant_email(self):
# Test nonexistant email address # Test nonexistant email address
>>> data = {'email':'foo@bar.com'} data = {'email':'foo@bar.com'}
>>> form = PasswordResetForm(data) form = PasswordResetForm(data)
>>> form.is_valid() self.assertFalse(form.is_valid())
False self.assertEqual(form.errors,
>>> form.errors {'email': [u"That e-mail address doesn't have an associated user account. Are you sure you've registered?"]})
{'email': [u"That e-mail address doesn't have an associated user account. Are you sure you've registered?"]}
# Test cleaned_data bug fix def test_cleaned_data(self):
>>> user = User.objects.create_user("jsmith3", "jsmith3@example.com", "test123") # Regression test
>>> data = {'email':'jsmith3@example.com'} user = User.objects.create_user("jsmith3", "jsmith3@example.com", "test123")
>>> form = PasswordResetForm(data) data = {'email':'jsmith3@example.com'}
>>> form.is_valid() form = PasswordResetForm(data)
True self.assertTrue(form.is_valid())
>>> form.cleaned_data['email'] self.assertEqual(form.cleaned_data['email'], u'jsmith3@example.com')
u'jsmith3@example.com'
# bug #5605, preserve the case of the user name (before the @ in the email address)
# when creating a user.
>>> user = User.objects.create_user('forms_test2', 'tesT@EXAMple.com', 'test')
>>> user.email
'tesT@example.com'
>>> user = User.objects.create_user('forms_test3', 'tesT', 'test')
>>> user.email
'tesT'
""" def test_bug_5605(self):
# bug #5605, preserve the case of the user name (before the @ in the
# email address) when creating a user.
user = User.objects.create_user('forms_test2', 'tesT@EXAMple.com', 'test')
self.assertEqual(user.email, 'tesT@example.com')
user = User.objects.create_user('forms_test3', 'tesT', 'test')
self.assertEqual(user.email, 'tesT')

View File

@ -1,5 +1,7 @@
from django.conf.urls.defaults import patterns from django.conf.urls.defaults import patterns
from django.contrib.auth.urls import urlpatterns from django.contrib.auth.urls import urlpatterns
from django.contrib.auth.views import password_reset
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse from django.http import HttpResponse
from django.template import Template, RequestContext from django.template import Template, RequestContext
@ -14,5 +16,8 @@ urlpatterns += patterns('',
(r'^logout/custom_query/$', 'django.contrib.auth.views.logout', dict(redirect_field_name='follow')), (r'^logout/custom_query/$', 'django.contrib.auth.views.logout', dict(redirect_field_name='follow')),
(r'^logout/next_page/$', 'django.contrib.auth.views.logout', dict(next_page='/somewhere/')), (r'^logout/next_page/$', 'django.contrib.auth.views.logout', dict(next_page='/somewhere/')),
(r'^remote_user/$', remote_user_auth_view), (r'^remote_user/$', remote_user_auth_view),
(r'^password_reset_from_email/$', 'django.contrib.auth.views.password_reset', dict(from_email='staffmember@example.com')),
(r'^login_required/$', login_required(password_reset)),
(r'^login_required_login_url/$', login_required(password_reset, login_url='/somewhere/')),
) )

View File

@ -36,6 +36,16 @@ class AuthViewsTestCase(TestCase):
settings.LANGUAGE_CODE = self.old_LANGUAGE_CODE settings.LANGUAGE_CODE = self.old_LANGUAGE_CODE
settings.TEMPLATE_DIRS = self.old_TEMPLATE_DIRS settings.TEMPLATE_DIRS = self.old_TEMPLATE_DIRS
def login(self, password='password'):
response = self.client.post('/login/', {
'username': 'testclient',
'password': password
}
)
self.assertEquals(response.status_code, 302)
self.assert_(response['Location'].endswith(settings.LOGIN_REDIRECT_URL))
self.assert_(SESSION_KEY in self.client.session)
class PasswordResetTest(AuthViewsTestCase): class PasswordResetTest(AuthViewsTestCase):
def test_email_not_found(self): def test_email_not_found(self):
@ -52,6 +62,14 @@ class PasswordResetTest(AuthViewsTestCase):
self.assertEquals(response.status_code, 302) self.assertEquals(response.status_code, 302)
self.assertEquals(len(mail.outbox), 1) self.assertEquals(len(mail.outbox), 1)
self.assert_("http://" in mail.outbox[0].body) self.assert_("http://" in mail.outbox[0].body)
self.assertEquals(settings.DEFAULT_FROM_EMAIL, mail.outbox[0].from_email)
def test_email_found_custom_from(self):
"Email is sent if a valid email address is provided for password reset when a custom from_email is provided."
response = self.client.post('/password_reset_from_email/', {'email': 'staffmember@example.com'})
self.assertEquals(response.status_code, 302)
self.assertEquals(len(mail.outbox), 1)
self.assertEquals("staffmember@example.com", mail.outbox[0].from_email)
def _test_confirm_start(self): def _test_confirm_start(self):
# Start by creating the email # Start by creating the email
@ -118,15 +136,6 @@ class PasswordResetTest(AuthViewsTestCase):
class ChangePasswordTest(AuthViewsTestCase): class ChangePasswordTest(AuthViewsTestCase):
def login(self, password='password'):
response = self.client.post('/login/', {
'username': 'testclient',
'password': password
}
)
self.assertEquals(response.status_code, 302)
self.assert_(response['Location'].endswith(settings.LOGIN_REDIRECT_URL))
def fail_login(self, password='password'): def fail_login(self, password='password'):
response = self.client.post('/login/', { response = self.client.post('/login/', {
'username': 'testclient', 'username': 'testclient',
@ -228,16 +237,6 @@ class LoginTest(AuthViewsTestCase):
class LogoutTest(AuthViewsTestCase): class LogoutTest(AuthViewsTestCase):
urls = 'django.contrib.auth.tests.urls' urls = 'django.contrib.auth.tests.urls'
def login(self, password='password'):
response = self.client.post('/login/', {
'username': 'testclient',
'password': password
}
)
self.assertEquals(response.status_code, 302)
self.assert_(response['Location'].endswith(settings.LOGIN_REDIRECT_URL))
self.assert_(SESSION_KEY in self.client.session)
def confirm_logged_out(self): def confirm_logged_out(self):
self.assert_(SESSION_KEY not in self.client.session) self.assert_(SESSION_KEY not in self.client.session)

View File

@ -105,7 +105,7 @@ def redirect_to_login(next, login_url=None, redirect_field_name=REDIRECT_FIELD_N
def password_reset(request, is_admin_site=False, template_name='registration/password_reset_form.html', def password_reset(request, is_admin_site=False, template_name='registration/password_reset_form.html',
email_template_name='registration/password_reset_email.html', email_template_name='registration/password_reset_email.html',
password_reset_form=PasswordResetForm, token_generator=default_token_generator, password_reset_form=PasswordResetForm, token_generator=default_token_generator,
post_reset_redirect=None): post_reset_redirect=None, from_email=None):
if post_reset_redirect is None: if post_reset_redirect is None:
post_reset_redirect = reverse('django.contrib.auth.views.password_reset_done') post_reset_redirect = reverse('django.contrib.auth.views.password_reset_done')
if request.method == "POST": if request.method == "POST":
@ -114,6 +114,7 @@ def password_reset(request, is_admin_site=False, template_name='registration/pas
opts = {} opts = {}
opts['use_https'] = request.is_secure() opts['use_https'] = request.is_secure()
opts['token_generator'] = token_generator opts['token_generator'] = token_generator
opts['from_email'] = from_email
if is_admin_site: if is_admin_site:
opts['domain_override'] = request.META['HTTP_HOST'] opts['domain_override'] = request.META['HTTP_HOST']
else: else:

View File

@ -60,7 +60,7 @@ class CalendarPlugin(DatabrowsePlugin):
def homepage_view(self, request): def homepage_view(self, request):
easy_model = EasyModel(self.site, self.model) easy_model = EasyModel(self.site, self.model)
field_list = self.fields.values() field_list = self.fields.values()
field_list.sort(lambda x, y: cmp(x.verbose_name, y.verbose_name)) field_list.sort(key=lambda k:k.verbose_name)
return render_to_response('databrowse/calendar_homepage.html', {'root_url': self.site.root_url, 'model': easy_model, 'field_list': field_list}) return render_to_response('databrowse/calendar_homepage.html', {'root_url': self.site.root_url, 'model': easy_model, 'field_list': field_list})
def calendar_view(self, request, field, year=None, month=None, day=None): def calendar_view(self, request, field, year=None, month=None, day=None):

View File

@ -61,7 +61,7 @@ class FieldChoicePlugin(DatabrowsePlugin):
def homepage_view(self, request): def homepage_view(self, request):
easy_model = EasyModel(self.site, self.model) easy_model = EasyModel(self.site, self.model)
field_list = self.fields.values() field_list = self.fields.values()
field_list.sort(lambda x, y: cmp(x.verbose_name, y.verbose_name)) field_list.sort(key=lambda k: k.verbose_name)
return render_to_response('databrowse/fieldchoice_homepage.html', {'root_url': self.site.root_url, 'model': easy_model, 'field_list': field_list}) return render_to_response('databrowse/fieldchoice_homepage.html', {'root_url': self.site.root_url, 'model': easy_model, 'field_list': field_list})
def field_view(self, request, field, value=None): def field_view(self, request, field, value=None):

View File

@ -5,11 +5,11 @@ from django.utils.translation import ugettext_lazy as _
class FlatpageForm(forms.ModelForm): class FlatpageForm(forms.ModelForm):
url = forms.RegexField(label=_("URL"), max_length=100, regex=r'^[-\w/]+$', url = forms.RegexField(label=_("URL"), max_length=100, regex=r'^[-\w/\.~]+$',
help_text = _("Example: '/about/contact/'. Make sure to have leading" help_text = _("Example: '/about/contact/'. Make sure to have leading"
" and trailing slashes."), " and trailing slashes."),
error_message = _("This value must contain only letters, numbers," error_message = _("This value must contain only letters, numbers,"
" underscores, dashes or slashes.")) " dots, underscores, dashes, slashes or tildes."))
class Meta: class Meta:
model = FlatPage model = FlatPage

View File

@ -0,0 +1,63 @@
[
{
"pk": 1,
"model": "flatpages.flatpage",
"fields": {
"registration_required": false,
"title": "A Flatpage",
"url": "/flatpage/",
"template_name": "",
"sites": [
1
],
"content": "Isn't it flat!",
"enable_comments": false
}
},
{
"pk": 2,
"model": "flatpages.flatpage",
"fields": {
"registration_required": false,
"title": "A Nested Flatpage",
"url": "/location/flatpage/",
"template_name": "",
"sites": [
1
],
"content": "Isn't it flat and deep!",
"enable_comments": false
}
},
{
"pk": 101,
"model": "flatpages.flatpage",
"fields": {
"registration_required": true,
"title": "Sekrit Flatpage",
"url": "/sekrit/",
"template_name": "",
"sites": [
1
],
"content": "Isn't it sekrit!",
"enable_comments": false
}
},
{
"pk": 102,
"model": "flatpages.flatpage",
"fields": {
"registration_required": true,
"title": "Sekrit Nested Flatpage",
"url": "/location/sekrit/",
"template_name": "",
"sites": [
1
],
"content": "Isn't it sekrit and deep!",
"enable_comments": false
}
}
]

View File

@ -0,0 +1,99 @@
from django import template
from django.contrib.flatpages.models import FlatPage
from django.utils.translation import ugettext as _
from django.conf import settings
register = template.Library()
class FlatpageNode(template.Node):
def __init__(self, context_name, starts_with=None, user=None):
self.context_name = context_name
if starts_with:
self.starts_with = template.Variable(starts_with)
else:
self.starts_with = None
if user:
self.user = template.Variable(user)
else:
self.user = None
def render(self, context):
flatpages = FlatPage.objects.filter(sites__id=settings.SITE_ID)
# If a prefix was specified, add a filter
if self.starts_with:
flatpages = flatpages.filter(
url__startswith=self.starts_with.resolve(context))
# If the provided user is not authenticated, or no user
# was provided, filter the list to only public flatpages.
if self.user:
user = self.user.resolve(context)
if not user.is_authenticated():
flatpages = flatpages.filter(registration_required=False)
else:
flatpages = flatpages.filter(registration_required=False)
context[self.context_name] = flatpages
return ''
def get_flatpages(parser, token):
"""
Retrieves all flatpage objects available for the current site and
visible to the specific user (or visible to all users if no user is
specified). Populates the template context with them in a variable
whose name is defined by the ``as`` clause.
An optional ``for`` clause can be used to control the user whose
permissions are to be used in determining which flatpages are visible.
An optional argument, ``starts_with``, can be applied to limit the
returned flatpages to those beginning with a particular base URL.
This argument can be passed as a variable or a string, as it resolves
from the template context.
Syntax::
{% get_flatpages ['url_starts_with'] [for user] as context_name %}
Example usage::
{% get_flatpages as flatpages %}
{% get_flatpages for someuser as flatpages %}
{% get_flatpages '/about/' as about_pages %}
{% get_flatpages prefix as about_pages %}
{% get_flatpages '/about/' for someuser as about_pages %}
"""
bits = token.split_contents()
syntax_message = _("%(tag_name)s expects a syntax of %(tag_name)s "
"['url_starts_with'] [for user] as context_name" %
dict(tag_name=bits[0]))
# Must have at 3-6 bits in the tag
if len(bits) >= 3 and len(bits) <= 6:
# If there's an even number of bits, there's no prefix
if len(bits) % 2 == 0:
prefix = bits[1]
else:
prefix = None
# The very last bit must be the context name
if bits[-2] != 'as':
raise template.TemplateSyntaxError(syntax_message)
context_name = bits[-1]
# If there are 5 or 6 bits, there is a user defined
if len(bits) >= 5:
if bits[-4] != 'for':
raise template.TemplateSyntaxError(syntax_message)
user = bits[-3]
else:
user = None
return FlatpageNode(context_name, starts_with=prefix, user=user)
else:
raise template.TemplateSyntaxError(syntax_message)
register.tag('get_flatpages', get_flatpages)

View File

@ -0,0 +1,5 @@
from django.contrib.flatpages.tests.csrf import *
from django.contrib.flatpages.tests.forms import *
from django.contrib.flatpages.tests.middleware import *
from django.contrib.flatpages.tests.templatetags import *
from django.contrib.flatpages.tests.views import *

View File

@ -0,0 +1,76 @@
import os
from django.conf import settings
from django.contrib.auth.models import User
from django.test import TestCase, Client
class FlatpageCSRFTests(TestCase):
fixtures = ['sample_flatpages']
urls = 'django.contrib.flatpages.tests.urls'
def setUp(self):
self.client = Client(enforce_csrf_checks=True)
self.old_MIDDLEWARE_CLASSES = settings.MIDDLEWARE_CLASSES
flatpage_middleware_class = 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'
csrf_middleware_class = 'django.middleware.csrf.CsrfViewMiddleware'
if csrf_middleware_class not in settings.MIDDLEWARE_CLASSES:
settings.MIDDLEWARE_CLASSES += (csrf_middleware_class,)
if flatpage_middleware_class not in settings.MIDDLEWARE_CLASSES:
settings.MIDDLEWARE_CLASSES += (flatpage_middleware_class,)
self.old_TEMPLATE_DIRS = settings.TEMPLATE_DIRS
settings.TEMPLATE_DIRS = (
os.path.join(
os.path.dirname(__file__),
'templates'
),
)
def tearDown(self):
settings.MIDDLEWARE_CLASSES = self.old_MIDDLEWARE_CLASSES
settings.TEMPLATE_DIRS = self.old_TEMPLATE_DIRS
def test_view_flatpage(self):
"A flatpage can be served through a view, even when the middleware is in use"
response = self.client.get('/flatpage_root/flatpage/')
self.assertEquals(response.status_code, 200)
self.assertContains(response, "<p>Isn't it flat!</p>")
def test_view_non_existent_flatpage(self):
"A non-existent flatpage raises 404 when served through a view, even when the middleware is in use"
response = self.client.get('/flatpage_root/no_such_flatpage/')
self.assertEquals(response.status_code, 404)
def test_view_authenticated_flatpage(self):
"A flatpage served through a view can require authentication"
response = self.client.get('/flatpage_root/sekrit/')
self.assertRedirects(response, '/accounts/login/?next=/flatpage_root/sekrit/')
User.objects.create_user('testuser', 'test@example.com', 's3krit')
self.client.login(username='testuser',password='s3krit')
response = self.client.get('/flatpage_root/sekrit/')
self.assertEquals(response.status_code, 200)
self.assertContains(response, "<p>Isn't it sekrit!</p>")
def test_fallback_flatpage(self):
"A flatpage can be served by the fallback middlware"
response = self.client.get('/flatpage/')
self.assertEquals(response.status_code, 200)
self.assertContains(response, "<p>Isn't it flat!</p>")
def test_fallback_non_existent_flatpage(self):
"A non-existent flatpage raises a 404 when served by the fallback middlware"
response = self.client.get('/no_such_flatpage/')
self.assertEquals(response.status_code, 404)
def test_post_view_flatpage(self):
"POSTing to a flatpage served through a view will raise a CSRF error if no token is provided (Refs #14156)"
response = self.client.post('/flatpage_root/flatpage/')
self.assertEquals(response.status_code, 403)
def test_post_fallback_flatpage(self):
"POSTing to a flatpage served by the middleware will raise a CSRF error if no token is provided (Refs #14156)"
response = self.client.post('/flatpage/')
self.assertEquals(response.status_code, 403)
def test_post_unknown_page(self):
"POSTing to an unknown page isn't caught as a 403 CSRF error"
response = self.client.post('/no_such_page/')
self.assertEquals(response.status_code, 404)

View File

@ -0,0 +1,22 @@
from django.contrib.flatpages.admin import FlatpageForm
from django.test import TestCase
class FlatpageAdminFormTests(TestCase):
def setUp(self):
self.form_data = {
'title': "A test page",
'content': "This is a test",
'sites': [1],
}
def test_flatpage_admin_form_url_validation(self):
"The flatpage admin form validates correctly validates urls"
self.assertTrue(FlatpageForm(data=dict(url='/new_flatpage/', **self.form_data)).is_valid())
self.assertTrue(FlatpageForm(data=dict(url='/some.special~chars/', **self.form_data)).is_valid())
self.assertTrue(FlatpageForm(data=dict(url='/some.very_special~chars-here/', **self.form_data)).is_valid())
self.assertFalse(FlatpageForm(data=dict(url='/a space/', **self.form_data)).is_valid())
self.assertFalse(FlatpageForm(data=dict(url='/a % char/', **self.form_data)).is_valid())
self.assertFalse(FlatpageForm(data=dict(url='/a ! char/', **self.form_data)).is_valid())
self.assertFalse(FlatpageForm(data=dict(url='/a & char/', **self.form_data)).is_valid())
self.assertFalse(FlatpageForm(data=dict(url='/a ? char/', **self.form_data)).is_valid())

View File

@ -0,0 +1,67 @@
import os
from django.conf import settings
from django.contrib.auth.models import User
from django.test import TestCase
class FlatpageMiddlewareTests(TestCase):
fixtures = ['sample_flatpages']
urls = 'django.contrib.flatpages.tests.urls'
def setUp(self):
self.old_MIDDLEWARE_CLASSES = settings.MIDDLEWARE_CLASSES
flatpage_middleware_class = 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'
if flatpage_middleware_class not in settings.MIDDLEWARE_CLASSES:
settings.MIDDLEWARE_CLASSES += (flatpage_middleware_class,)
self.old_TEMPLATE_DIRS = settings.TEMPLATE_DIRS
settings.TEMPLATE_DIRS = (
os.path.join(
os.path.dirname(__file__),
'templates'
),
)
def tearDown(self):
settings.MIDDLEWARE_CLASSES = self.old_MIDDLEWARE_CLASSES
settings.TEMPLATE_DIRS = self.old_TEMPLATE_DIRS
def test_view_flatpage(self):
"A flatpage can be served through a view, even when the middleware is in use"
response = self.client.get('/flatpage_root/flatpage/')
self.assertEquals(response.status_code, 200)
self.assertContains(response, "<p>Isn't it flat!</p>")
def test_view_non_existent_flatpage(self):
"A non-existent flatpage raises 404 when served through a view, even when the middleware is in use"
response = self.client.get('/flatpage_root/no_such_flatpage/')
self.assertEquals(response.status_code, 404)
def test_view_authenticated_flatpage(self):
"A flatpage served through a view can require authentication"
response = self.client.get('/flatpage_root/sekrit/')
self.assertRedirects(response, '/accounts/login/?next=/flatpage_root/sekrit/')
User.objects.create_user('testuser', 'test@example.com', 's3krit')
self.client.login(username='testuser',password='s3krit')
response = self.client.get('/flatpage_root/sekrit/')
self.assertEquals(response.status_code, 200)
self.assertContains(response, "<p>Isn't it sekrit!</p>")
def test_fallback_flatpage(self):
"A flatpage can be served by the fallback middlware"
response = self.client.get('/flatpage/')
self.assertEquals(response.status_code, 200)
self.assertContains(response, "<p>Isn't it flat!</p>")
def test_fallback_non_existent_flatpage(self):
"A non-existent flatpage raises a 404 when served by the fallback middlware"
response = self.client.get('/no_such_flatpage/')
self.assertEquals(response.status_code, 404)
def test_fallback_authenticated_flatpage(self):
"A flatpage served by the middleware can require authentication"
response = self.client.get('/sekrit/')
self.assertRedirects(response, '/accounts/login/?next=/sekrit/')
User.objects.create_user('testuser', 'test@example.com', 's3krit')
self.client.login(username='testuser',password='s3krit')
response = self.client.get('/sekrit/')
self.assertEquals(response.status_code, 200)
self.assertContains(response, "<p>Isn't it sekrit!</p>")

View File

@ -0,0 +1 @@
<h1>Oh Noes!</h1>

View File

@ -0,0 +1,10 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
<p>{{ flatpage.content }}</p>
</body>
</html>

View File

@ -0,0 +1,134 @@
import os
from django.conf import settings
from django.contrib.auth.models import AnonymousUser, User
from django.template import Template, Context, TemplateSyntaxError
from django.test import TestCase
class FlatpageTemplateTagTests(TestCase):
fixtures = ['sample_flatpages']
urls = 'django.contrib.flatpages.tests.urls'
def setUp(self):
self.old_MIDDLEWARE_CLASSES = settings.MIDDLEWARE_CLASSES
flatpage_middleware_class = 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'
if flatpage_middleware_class not in settings.MIDDLEWARE_CLASSES:
settings.MIDDLEWARE_CLASSES += (flatpage_middleware_class,)
self.old_TEMPLATE_DIRS = settings.TEMPLATE_DIRS
settings.TEMPLATE_DIRS = (
os.path.join(
os.path.dirname(__file__),
'templates'
),
)
self.me = User.objects.create_user('testuser', 'test@example.com', 's3krit')
def tearDown(self):
settings.MIDDLEWARE_CLASSES = self.old_MIDDLEWARE_CLASSES
settings.TEMPLATE_DIRS = self.old_TEMPLATE_DIRS
def test_get_flatpages_tag(self):
"The flatpage template tag retrives unregistered prefixed flatpages by default"
out = Template(
"{% load flatpages %}"
"{% get_flatpages as flatpages %}"
"{% for page in flatpages %}"
"{{ page.title }},"
"{% endfor %}"
).render(Context())
self.assertEquals(out, "A Flatpage,A Nested Flatpage,")
def test_get_flatpages_tag_for_anon_user(self):
"The flatpage template tag retrives unregistered flatpages for an anonymous user"
out = Template(
"{% load flatpages %}"
"{% get_flatpages for anonuser as flatpages %}"
"{% for page in flatpages %}"
"{{ page.title }},"
"{% endfor %}"
).render(Context({
'anonuser': AnonymousUser()
}))
self.assertEquals(out, "A Flatpage,A Nested Flatpage,")
def test_get_flatpages_tag_for_user(self):
"The flatpage template tag retrives all flatpages for an authenticated user"
out = Template(
"{% load flatpages %}"
"{% get_flatpages for me as flatpages %}"
"{% for page in flatpages %}"
"{{ page.title }},"
"{% endfor %}"
).render(Context({
'me': self.me
}))
self.assertEquals(out, "A Flatpage,A Nested Flatpage,Sekrit Nested Flatpage,Sekrit Flatpage,")
def test_get_flatpages_with_prefix(self):
"The flatpage template tag retrives unregistered prefixed flatpages by default"
out = Template(
"{% load flatpages %}"
"{% get_flatpages '/location/' as location_flatpages %}"
"{% for page in location_flatpages %}"
"{{ page.title }},"
"{% endfor %}"
).render(Context())
self.assertEquals(out, "A Nested Flatpage,")
def test_get_flatpages_with_prefix_for_anon_user(self):
"The flatpage template tag retrives unregistered prefixed flatpages for an anonymous user"
out = Template(
"{% load flatpages %}"
"{% get_flatpages '/location/' for anonuser as location_flatpages %}"
"{% for page in location_flatpages %}"
"{{ page.title }},"
"{% endfor %}"
).render(Context({
'anonuser': AnonymousUser()
}))
self.assertEquals(out, "A Nested Flatpage,")
def test_get_flatpages_with_prefix_for_user(self):
"The flatpage template tag retrive prefixed flatpages for an authenticated user"
out = Template(
"{% load flatpages %}"
"{% get_flatpages '/location/' for me as location_flatpages %}"
"{% for page in location_flatpages %}"
"{{ page.title }},"
"{% endfor %}"
).render(Context({
'me': self.me
}))
self.assertEquals(out, "A Nested Flatpage,Sekrit Nested Flatpage,")
def test_get_flatpages_with_variable_prefix(self):
"The prefix for the flatpage template tag can be a template variable"
out = Template(
"{% load flatpages %}"
"{% get_flatpages location_prefix as location_flatpages %}"
"{% for page in location_flatpages %}"
"{{ page.title }},"
"{% endfor %}"
).render(Context({
'location_prefix': '/location/'
}))
self.assertEquals(out, "A Nested Flatpage,")
def test_parsing_errors(self):
"There are various ways that the flatpages template tag won't parse"
render = lambda t: Template(t).render(Context())
self.assertRaises(TemplateSyntaxError, render,
"{% load flatpages %}{% get_flatpages %}")
self.assertRaises(TemplateSyntaxError, render,
"{% load flatpages %}{% get_flatpages as %}")
self.assertRaises(TemplateSyntaxError, render,
"{% load flatpages %}{% get_flatpages cheesecake flatpages %}")
self.assertRaises(TemplateSyntaxError, render,
"{% load flatpages %}{% get_flatpages as flatpages asdf%}")
self.assertRaises(TemplateSyntaxError, render,
"{% load flatpages %}{% get_flatpages cheesecake user as flatpages %}")
self.assertRaises(TemplateSyntaxError, render,
"{% load flatpages %}{% get_flatpages for user as flatpages asdf%}")
self.assertRaises(TemplateSyntaxError, render,
"{% load flatpages %}{% get_flatpages prefix for user as flatpages asdf%}")

View File

@ -0,0 +1,8 @@
from django.conf.urls.defaults import *
# special urls for flatpage test cases
urlpatterns = patterns('',
(r'^flatpage_root', include('django.contrib.flatpages.urls')),
(r'^accounts/', include('django.contrib.auth.urls')),
)

View File

@ -0,0 +1,72 @@
import os
from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.flatpages.models import FlatPage
from django.test import TestCase
class FlatpageViewTests(TestCase):
fixtures = ['sample_flatpages']
urls = 'django.contrib.flatpages.tests.urls'
def setUp(self):
self.old_MIDDLEWARE_CLASSES = settings.MIDDLEWARE_CLASSES
flatpage_middleware_class = 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'
if flatpage_middleware_class in settings.MIDDLEWARE_CLASSES:
settings.MIDDLEWARE_CLASSES = tuple(m for m in settings.MIDDLEWARE_CLASSES if m != flatpage_middleware_class)
self.old_TEMPLATE_DIRS = settings.TEMPLATE_DIRS
settings.TEMPLATE_DIRS = (
os.path.join(
os.path.dirname(__file__),
'templates'
),
)
def tearDown(self):
settings.MIDDLEWARE_CLASSES = self.old_MIDDLEWARE_CLASSES
settings.TEMPLATE_DIRS = self.old_TEMPLATE_DIRS
def test_view_flatpage(self):
"A flatpage can be served through a view"
response = self.client.get('/flatpage_root/flatpage/')
self.assertEquals(response.status_code, 200)
self.assertContains(response, "<p>Isn't it flat!</p>")
def test_view_non_existent_flatpage(self):
"A non-existent flatpage raises 404 when served through a view"
response = self.client.get('/flatpage_root/no_such_flatpage/')
self.assertEquals(response.status_code, 404)
def test_view_authenticated_flatpage(self):
"A flatpage served through a view can require authentication"
response = self.client.get('/flatpage_root/sekrit/')
self.assertRedirects(response, '/accounts/login/?next=/flatpage_root/sekrit/')
User.objects.create_user('testuser', 'test@example.com', 's3krit')
self.client.login(username='testuser',password='s3krit')
response = self.client.get('/flatpage_root/sekrit/')
self.assertEquals(response.status_code, 200)
self.assertContains(response, "<p>Isn't it sekrit!</p>")
def test_fallback_flatpage(self):
"A fallback flatpage won't be served if the middleware is disabled"
response = self.client.get('/flatpage/')
self.assertEquals(response.status_code, 404)
def test_fallback_non_existent_flatpage(self):
"A non-existent flatpage won't be served if the fallback middlware is disabled"
response = self.client.get('/no_such_flatpage/')
self.assertEquals(response.status_code, 404)
def test_view_flatpage_special_chars(self):
"A flatpage with special chars in the URL can be served through a view"
fp = FlatPage.objects.create(
url="/some.very_special~chars-here/",
title="A very special page",
content="Isn't it special!",
enable_comments=False,
registration_required=False,
)
fp.sites.add(1)
response = self.client.get('/flatpage_root/some.very_special~chars-here/')
self.assertEquals(response.status_code, 200)
self.assertContains(response, "<p>Isn't it special!</p>")

View File

@ -13,10 +13,13 @@ DEFAULT_TEMPLATE = 'flatpages/default.html'
# when a 404 is raised, which often means CsrfViewMiddleware.process_view # when a 404 is raised, which often means CsrfViewMiddleware.process_view
# has not been called even if CsrfViewMiddleware is installed. So we need # has not been called even if CsrfViewMiddleware is installed. So we need
# to use @csrf_protect, in case the template needs {% csrf_token %}. # to use @csrf_protect, in case the template needs {% csrf_token %}.
@csrf_protect # However, we can't just wrap this view; if no matching flatpage exists,
# or a redirect is required for authentication, the 404 needs to be returned
# without any CSRF checks. Therefore, we only
# CSRF protect the internal implementation.
def flatpage(request, url): def flatpage(request, url):
""" """
Flat page view. Public interface to the flat page view.
Models: `flatpages.flatpages` Models: `flatpages.flatpages`
Templates: Uses the template defined by the ``template_name`` field, Templates: Uses the template defined by the ``template_name`` field,
@ -30,6 +33,13 @@ def flatpage(request, url):
if not url.startswith('/'): if not url.startswith('/'):
url = "/" + url url = "/" + url
f = get_object_or_404(FlatPage, url__exact=url, sites__id__exact=settings.SITE_ID) f = get_object_or_404(FlatPage, url__exact=url, sites__id__exact=settings.SITE_ID)
return render_flatpage(request, f)
@csrf_protect
def render_flatpage(request, f):
"""
Internal interface to the flat page view.
"""
# If registration is required for accessing this page, and the user isn't # If registration is required for accessing this page, and the user isn't
# logged in, redirect to the login page. # logged in, redirect to the login page.
if f.registration_required and not request.user.is_authenticated(): if f.registration_required and not request.user.is_authenticated():

View File

@ -48,7 +48,7 @@ class FormWizard(object):
def num_steps(self): def num_steps(self):
"Helper method that returns the number of steps." "Helper method that returns the number of steps."
# You might think we should just set "self.form_list = len(form_list)" # You might think we should just set "self.num_steps = len(form_list)"
# in __init__(), but this calculation needs to be dynamic, because some # in __init__(), but this calculation needs to be dynamic, because some
# hook methods might alter self.form_list. # hook methods might alter self.form_list.
return len(self.form_list) return len(self.form_list)

View File

@ -6,7 +6,7 @@ class MySQLCreation(DatabaseCreation):
from django.contrib.gis.db.models.fields import GeometryField from django.contrib.gis.db.models.fields import GeometryField
output = super(MySQLCreation, self).sql_indexes_for_field(model, f, style) output = super(MySQLCreation, self).sql_indexes_for_field(model, f, style)
if isinstance(f, GeometryField): if isinstance(f, GeometryField) and f.spatial_index:
qn = self.connection.ops.quote_name qn = self.connection.ops.quote_name
db_table = model._meta.db_table db_table = model._meta.db_table
idx_name = '%s_%s_id' % (db_table, f.column) idx_name = '%s_%s_id' % (db_table, f.column)

View File

@ -233,8 +233,6 @@ class PostGISOperations(DatabaseOperations, BaseSpatialOperations):
}) })
self.geography_operators = { self.geography_operators = {
'bboverlaps' : PostGISOperator('&&'), 'bboverlaps' : PostGISOperator('&&'),
'exact' : PostGISOperator('~='),
'same_as' : PostGISOperator('~='),
} }
# Creating a dictionary lookup of all GIS terms for PostGIS. # Creating a dictionary lookup of all GIS terms for PostGIS.

View File

@ -51,7 +51,7 @@ class DatabaseWrapper(SqliteDatabaseWrapper):
self.connection.create_function("django_extract", 2, _sqlite_extract) self.connection.create_function("django_extract", 2, _sqlite_extract)
self.connection.create_function("django_date_trunc", 2, _sqlite_date_trunc) self.connection.create_function("django_date_trunc", 2, _sqlite_date_trunc)
self.connection.create_function("regexp", 2, _sqlite_regexp) self.connection.create_function("regexp", 2, _sqlite_regexp)
connection_created.send(sender=self.__class__) connection_created.send(sender=self.__class__, connection=self)
## From here on, customized for GeoDjango ## ## From here on, customized for GeoDjango ##

View File

@ -95,7 +95,7 @@ class GeoSQLCompiler(compiler.SQLCompiler):
return result return result
def get_default_columns(self, with_aliases=False, col_aliases=None, def get_default_columns(self, with_aliases=False, col_aliases=None,
start_alias=None, opts=None, as_pairs=False): start_alias=None, opts=None, as_pairs=False, local_only=False):
""" """
Computes the default columns for selecting every field in the base Computes the default columns for selecting every field in the base
model. Will sometimes be called to pull in related models (e.g. via model. Will sometimes be called to pull in related models (e.g. via
@ -121,6 +121,8 @@ class GeoSQLCompiler(compiler.SQLCompiler):
if start_alias: if start_alias:
seen = {None: start_alias} seen = {None: start_alias}
for field, model in opts.get_fields_with_model(): for field, model in opts.get_fields_with_model():
if local_only and model is not None:
continue
if start_alias: if start_alias:
try: try:
alias = seen[model] alias = seen[model]

View File

@ -14,10 +14,10 @@ if lib_path:
lib_names = None lib_names = None
elif os.name == 'nt': elif os.name == 'nt':
# Windows NT shared library # Windows NT shared library
lib_names = ['gdal16', 'gdal15'] lib_names = ['gdal17', 'gdal16', 'gdal15']
elif os.name == 'posix': elif os.name == 'posix':
# *NIX library names. # *NIX library names.
lib_names = ['gdal', 'GDAL', 'gdal1.6.0', 'gdal1.5.0', 'gdal1.4.0'] lib_names = ['gdal', 'GDAL', 'gdal1.7.0', 'gdal1.6.0', 'gdal1.5.0', 'gdal1.4.0']
else: else:
raise OGRException('Unsupported OS "%s"' % os.name) raise OGRException('Unsupported OS "%s"' % os.name)

View File

@ -1,115 +1,108 @@
import sys import sys
import unittest
from django.conf import settings
from django.db.models import get_app
from django.test.simple import build_suite, DjangoTestSuiteRunner
def run_tests(*args, **kwargs): def run_tests(*args, **kwargs):
from django.test.simple import run_tests as base_run_tests from django.test.simple import run_tests as base_run_tests
return base_run_tests(*args, **kwargs) return base_run_tests(*args, **kwargs)
def geo_suite(): def run_gis_tests(test_labels, verbosity=1, interactive=True, failfast=False, extra_tests=None):
""" import warnings
Builds a test suite for the GIS package. This is not named warnings.warn(
`suite` so it will not interfere with the Django test suite (since 'The run_gis_tests() test runner has been deprecated in favor of GeoDjangoTestSuiteRunner.',
spatial database tables are required to execute these tests on PendingDeprecationWarning
some backends). )
""" test_runner = GeoDjangoTestSuiteRunner(verbosity=verbosity, interactive=interactive, failfast=failfast)
from django.conf import settings return test_runner.run_tests(test_labels, extra_tests=extra_tests)
class GeoDjangoTestSuiteRunner(DjangoTestSuiteRunner):
def setup_test_environment(self, **kwargs):
super(GeoDjangoTestSuiteRunner, self).setup_test_environment(**kwargs)
from django.db import connection
from django.contrib.gis.geos import GEOS_PREPARE from django.contrib.gis.geos import GEOS_PREPARE
from django.contrib.gis.gdal import HAS_GDAL from django.contrib.gis.gdal import HAS_GDAL
from django.contrib.gis.utils import HAS_GEOIP
from django.contrib.gis.tests.utils import postgis, mysql
from django.db import connection
from django.utils.importlib import import_module
gis_tests = [] # Getting and storing the original values of INSTALLED_APPS and
# the ROOT_URLCONF.
# Adding the GEOS tests. self.old_installed = settings.INSTALLED_APPS
from django.contrib.gis.geos import tests as geos_tests self.old_root_urlconf = settings.ROOT_URLCONF
gis_tests.append(geos_tests.suite())
# Tests that require use of a spatial database (e.g., creation of models) # Tests that require use of a spatial database (e.g., creation of models)
test_apps = ['geoapp', 'relatedapp'] self.geo_apps = ['geoapp', 'relatedapp']
if postgis and connection.ops.geography: if connection.ops.postgis and connection.ops.geography:
# Test geography support with PostGIS 1.5+. # Test geography support with PostGIS 1.5+.
test_apps.append('geogapp') self.geo_apps.append('geogapp')
# Tests that do not require setting up and tearing down a spatial database.
test_suite_names = [
'test_measure',
]
if HAS_GDAL: if HAS_GDAL:
# These tests require GDAL. # The following GeoDjango test apps depend on GDAL support.
if not mysql: if not connection.ops.mysql:
test_apps.append('distapp') self.geo_apps.append('distapp')
# Only PostGIS using GEOS 3.1+ can support 3D so far. # 3D apps use LayerMapping, which uses GDAL.
if postgis and GEOS_PREPARE: if connection.ops.postgis and GEOS_PREPARE:
test_apps.append('geo3d') self.geo_apps.append('geo3d')
test_suite_names.extend(['test_spatialrefsys', 'test_geoforms']) self.geo_apps.append('layermap')
test_apps.append('layermap')
# Adding the GDAL tests. # Constructing the new INSTALLED_APPS, and including applications
from django.contrib.gis.gdal import tests as gdal_tests # within the GeoDjango test namespace (`self.geo_apps`).
gis_tests.append(gdal_tests.suite())
else:
print >>sys.stderr, "GDAL not available - no tests requiring GDAL will be run."
if HAS_GEOIP and hasattr(settings, 'GEOIP_PATH'):
test_suite_names.append('test_geoip')
# Adding the rest of the suites from the modules specified
# in the `test_suite_names`.
for suite_name in test_suite_names:
tsuite = import_module('django.contrib.gis.tests.' + suite_name)
gis_tests.append(tsuite.suite())
return gis_tests, test_apps
def run_gis_tests(test_labels, **kwargs):
"""
Use this routine as the TEST_RUNNER in your settings in order to run the
GeoDjango test suite. This must be done as a database superuser for
PostGIS, so read the docstring in `run_test()` below for more details.
"""
from django.conf import settings
from django.db.models import loading
from django.contrib.gis.tests.utils import mysql
# Getting initial values.
old_installed = settings.INSTALLED_APPS
old_root_urlconf = settings.ROOT_URLCONF
# Overridding the INSTALLED_APPS with only what we need,
# to prevent unnecessary database table creation.
new_installed = ['django.contrib.sites', new_installed = ['django.contrib.sites',
'django.contrib.sitemaps', 'django.contrib.sitemaps',
'django.contrib.gis', 'django.contrib.gis',
] ]
new_installed.extend(['django.contrib.gis.tests.%s' % app
for app in self.geo_apps])
settings.INSTALLED_APPS = new_installed
# Setting the URLs. # Setting the URLs.
settings.ROOT_URLCONF = 'django.contrib.gis.tests.urls' settings.ROOT_URLCONF = 'django.contrib.gis.tests.urls'
# Creating the test suite, adding the test models to INSTALLED_APPS def teardown_test_environment(self, **kwargs):
# so they will be tested. super(GeoDjangoTestSuiteRunner, self).teardown_test_environment(**kwargs)
gis_tests, test_apps = geo_suite() settings.INSTALLED_APPS = self.old_installed
for test_model in test_apps: settings.ROOT_URLCONF = self.old_root_urlconf
module_name = 'django.contrib.gis.tests.%s' % test_model
new_installed.append(module_name)
# Resetting the loaded flag to take into account what we appended to def build_suite(self, test_labels, extra_tests=None, **kwargs):
# the INSTALLED_APPS (since this routine is invoked through """
# django/core/management, it caches the apps; this ensures that syncdb This method is overridden to construct a suite consisting only of tests
# will see our appended models) for GeoDjango.
settings.INSTALLED_APPS = new_installed """
loading.cache.loaded = False suite = unittest.TestSuite()
kwargs['extra_tests'] = gis_tests # Adding the GEOS tests.
from django.contrib.gis.geos import tests as geos_tests
suite.addTest(geos_tests.suite())
# Running the tests using the GIS test runner. # Adding the measurment tests.
result = run_tests(test_labels, **kwargs) from django.contrib.gis.tests import test_measure
suite.addTest(test_measure.suite())
# Restoring modified settings. # Adding GDAL tests, and any test suite that depends on GDAL, to the
settings.INSTALLED_APPS = old_installed # suite if GDAL is available.
settings.ROOT_URLCONF = old_root_urlconf from django.contrib.gis.gdal import HAS_GDAL
if HAS_GDAL:
from django.contrib.gis.gdal import tests as gdal_tests
suite.addTest(gdal_tests.suite())
return result from django.contrib.gis.tests import test_spatialrefsys, test_geoforms
suite.addTest(test_spatialrefsys.suite())
suite.addTest(test_geoforms.suite())
else:
sys.stderr.write('GDAL not available - no tests requiring GDAL will be run.\n')
# Add GeoIP tests to the suite, if the library and data is available.
from django.contrib.gis.utils import HAS_GEOIP
if HAS_GEOIP and hasattr(settings, 'GEOIP_PATH'):
from django.contrib.gis.tests import test_geoip
suite.addTest(test_geoip.suite())
# Finally, adding the suites for each of the GeoDjango test apps.
for app_name in self.geo_apps:
suite.addTest(build_suite(get_app(app_name)))
return suite

View File

@ -44,6 +44,10 @@ class GeographyTest(TestCase):
# `@` operator not available. # `@` operator not available.
self.assertRaises(ValueError, City.objects.filter(point__contained=z.poly).count) self.assertRaises(ValueError, City.objects.filter(point__contained=z.poly).count)
# Regression test for #14060, `~=` was never really implemented for PostGIS.
htown = City.objects.get(name='Houston')
self.assertRaises(ValueError, City.objects.get, point__exact=htown.point)
def test05_geography_layermapping(self): def test05_geography_layermapping(self):
"Testing LayerMapping support on models with geography fields." "Testing LayerMapping support on models with geography fields."
# There is a similar test in `layermap` that uses the same data set, # There is a similar test in `layermap` that uses the same data set,

View File

@ -38,6 +38,11 @@ class Author(models.Model):
name = models.CharField(max_length=100) name = models.CharField(max_length=100)
objects = models.GeoManager() objects = models.GeoManager()
class Article(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author, unique=True)
objects = models.GeoManager()
class Book(models.Model): class Book(models.Model):
title = models.CharField(max_length=100) title = models.CharField(max_length=100)
author = models.ForeignKey(Author, related_name='books', null=True) author = models.ForeignKey(Author, related_name='books', null=True)

View File

@ -4,7 +4,7 @@ from django.contrib.gis.db.models import Collect, Count, Extent, F, Union
from django.contrib.gis.geometry.backend import Geometry from django.contrib.gis.geometry.backend import Geometry
from django.contrib.gis.tests.utils import mysql, oracle, postgis, spatialite, no_mysql, no_oracle, no_spatialite from django.contrib.gis.tests.utils import mysql, oracle, postgis, spatialite, no_mysql, no_oracle, no_spatialite
from django.conf import settings from django.conf import settings
from models import City, Location, DirectoryEntry, Parcel, Book, Author from models import City, Location, DirectoryEntry, Parcel, Book, Author, Article
cities = (('Aurora', 'TX', -97.516111, 33.058333), cities = (('Aurora', 'TX', -97.516111, 33.058333),
('Roswell', 'NM', -104.528056, 33.387222), ('Roswell', 'NM', -104.528056, 33.387222),
@ -291,6 +291,14 @@ class RelatedGeoModelTest(unittest.TestCase):
self.assertEqual(4, len(coll)) self.assertEqual(4, len(coll))
self.assertEqual(ref_geom, coll) self.assertEqual(ref_geom, coll)
def test15_invalid_select_related(self):
"Testing doing select_related on the related name manager of a unique FK. See #13934."
qs = Article.objects.select_related('author__article')
# This triggers TypeError when `get_default_columns` has no `local_only`
# keyword. The TypeError is swallowed if QuerySet is actually
# evaluated as list generation swallows TypeError in CPython.
sql = str(qs.query)
# TODO: Related tests for KML, GML, and distance lookups. # TODO: Related tests for KML, GML, and distance lookups.
def suite(): def suite():

View File

@ -7,43 +7,43 @@ when explicitly needed.
""" """
STATE_CHOICES = ( STATE_CHOICES = (
'KA', 'Karnataka', ('KA', 'Karnataka'),
'AP', 'Andhra Pradesh', ('AP', 'Andhra Pradesh'),
'KL', 'Kerala', ('KL', 'Kerala'),
'TN', 'Tamil Nadu', ('TN', 'Tamil Nadu'),
'MH', 'Maharashtra', ('MH', 'Maharashtra'),
'UP', 'Uttar Pradesh', ('UP', 'Uttar Pradesh'),
'GA', 'Goa', ('GA', 'Goa'),
'GJ', 'Gujarat', ('GJ', 'Gujarat'),
'RJ', 'Rajasthan', ('RJ', 'Rajasthan'),
'HP', 'Himachal Pradesh', ('HP', 'Himachal Pradesh'),
'JK', 'Jammu and Kashmir', ('JK', 'Jammu and Kashmir'),
'AR', 'Arunachal Pradesh', ('AR', 'Arunachal Pradesh'),
'AS', 'Assam', ('AS', 'Assam'),
'BR', 'Bihar', ('BR', 'Bihar'),
'CG', 'Chattisgarh', ('CG', 'Chattisgarh'),
'HR', 'Haryana', ('HR', 'Haryana'),
'JH', 'Jharkhand', ('JH', 'Jharkhand'),
'MP', 'Madhya Pradesh', ('MP', 'Madhya Pradesh'),
'MN', 'Manipur', ('MN', 'Manipur'),
'ML', 'Meghalaya', ('ML', 'Meghalaya'),
'MZ', 'Mizoram', ('MZ', 'Mizoram'),
'NL', 'Nagaland', ('NL', 'Nagaland'),
'OR', 'Orissa', ('OR', 'Orissa'),
'PB', 'Punjab', ('PB', 'Punjab'),
'SK', 'Sikkim', ('SK', 'Sikkim'),
'TR', 'Tripura', ('TR', 'Tripura'),
'UA', 'Uttarakhand', ('UA', 'Uttarakhand'),
'WB', 'West Bengal', ('WB', 'West Bengal'),
# Union Territories # Union Territories
'AN', 'Andaman and Nicobar', ('AN', 'Andaman and Nicobar'),
'CH', 'Chandigarh', ('CH', 'Chandigarh'),
'DN', 'Dadra and Nagar Haveli', ('DN', 'Dadra and Nagar Haveli'),
'DD', 'Daman and Diu', ('DD', 'Daman and Diu'),
'DL', 'Delhi', ('DL', 'Delhi'),
'LD', 'Lakshadweep', ('LD', 'Lakshadweep'),
'PY', 'Pondicherry', ('PY', 'Pondicherry'),
) )
STATES_NORMALIZED = { STATES_NORMALIZED = {

View File

@ -22,7 +22,7 @@ Paragraph 2 with "quotes" and @code@"""
t = Template("{{ textile_content|textile }}") t = Template("{{ textile_content|textile }}")
rendered = t.render(Context(locals())).strip() rendered = t.render(Context(locals())).strip()
if textile: if textile:
self.assertEqual(rendered, """<p>Paragraph 1</p> self.assertEqual(rendered.replace('\t', ''), """<p>Paragraph 1</p>
<p>Paragraph 2 with &#8220;quotes&#8221; and <code>code</code></p>""") <p>Paragraph 2 with &#8220;quotes&#8221; and <code>code</code></p>""")
else: else:

View File

@ -58,7 +58,7 @@ class SessionStore(SessionBase):
finally: finally:
session_file.close() session_file.close()
except IOError: except IOError:
pass self.create()
return session_data return session_data
def create(self): def create(self):

View File

@ -1,388 +1,273 @@
r""" from datetime import datetime, timedelta
from django.conf import settings
from django.contrib.sessions.backends.db import SessionStore as DatabaseSession
from django.contrib.sessions.backends.cache import SessionStore as CacheSession
from django.contrib.sessions.backends.cached_db import SessionStore as CacheDBSession
from django.contrib.sessions.backends.file import SessionStore as FileSession
from django.contrib.sessions.backends.base import SessionBase
from django.contrib.sessions.models import Session
from django.core.exceptions import ImproperlyConfigured
from django.test import TestCase
import shutil
import tempfile
import unittest
>>> from django.conf import settings
>>> from django.contrib.sessions.backends.db import SessionStore as DatabaseSession
>>> from django.contrib.sessions.backends.cache import SessionStore as CacheSession
>>> from django.contrib.sessions.backends.cached_db import SessionStore as CacheDBSession
>>> from django.contrib.sessions.backends.file import SessionStore as FileSession
>>> from django.contrib.sessions.backends.base import SessionBase
>>> from django.contrib.sessions.models import Session
>>> db_session = DatabaseSession() class SessionTestsMixin(object):
>>> db_session.modified # This does not inherit from TestCase to avoid any tests being run with this
False # class, which wouldn't work, and to allow different TestCase subclasses to
>>> db_session.get('cat') # be used.
>>> db_session['cat'] = "dog"
>>> db_session.modified
True
>>> db_session.pop('cat')
'dog'
>>> db_session.pop('some key', 'does not exist')
'does not exist'
>>> db_session.save()
>>> db_session.exists(db_session.session_key)
True
>>> db_session.delete(db_session.session_key)
>>> db_session.exists(db_session.session_key)
False
>>> db_session['foo'] = 'bar' backend = None # subclasses must specify
>>> db_session.save()
>>> db_session.exists(db_session.session_key)
True
>>> prev_key = db_session.session_key
>>> db_session.flush()
>>> db_session.exists(prev_key)
False
>>> db_session.session_key == prev_key
False
>>> db_session.modified, db_session.accessed
(True, True)
>>> db_session['a'], db_session['b'] = 'c', 'd'
>>> db_session.save()
>>> prev_key = db_session.session_key
>>> prev_data = db_session.items()
>>> db_session.cycle_key()
>>> db_session.session_key == prev_key
False
>>> db_session.items() == prev_data
True
def setUp(self):
self.session = self.backend()
def tearDown(self):
# NB: be careful to delete any sessions created; stale sessions fill up
# the /tmp (with some backends) and eventually overwhelm it after lots
# of runs (think buildbots)
self.session.delete()
def test_new_session(self):
self.assertFalse(self.session.modified)
self.assertFalse(self.session.accessed)
def test_get_empty(self):
self.assertEqual(self.session.get('cat'), None)
def test_store(self):
self.session['cat'] = "dog"
self.assertTrue(self.session.modified)
self.assertEqual(self.session.pop('cat'), 'dog')
def test_pop(self):
self.session['some key'] = 'exists'
# Need to reset these to pretend we haven't accessed it:
self.accessed = False
self.modified = False
self.assertEqual(self.session.pop('some key'), 'exists')
self.assertTrue(self.session.accessed)
self.assertTrue(self.session.modified)
self.assertEqual(self.session.get('some key'), None)
def test_pop_default(self):
self.assertEqual(self.session.pop('some key', 'does not exist'),
'does not exist')
self.assertTrue(self.session.accessed)
self.assertFalse(self.session.modified)
def test_setdefault(self):
self.assertEqual(self.session.setdefault('foo', 'bar'), 'bar')
self.assertEqual(self.session.setdefault('foo', 'baz'), 'bar')
self.assertTrue(self.session.accessed)
self.assertTrue(self.session.modified)
def test_update(self):
self.session.update({'update key': 1})
self.assertTrue(self.session.accessed)
self.assertTrue(self.session.modified)
self.assertEqual(self.session.get('update key', None), 1)
def test_has_key(self):
self.session['some key'] = 1
self.session.modified = False
self.session.accessed = False
self.assertTrue(self.session.has_key('some key'))
self.assertTrue(self.session.accessed)
self.assertFalse(self.session.modified)
def test_values(self):
self.assertEqual(self.session.values(), [])
self.assertTrue(self.session.accessed)
self.session['some key'] = 1
self.assertEqual(self.session.values(), [1])
def test_iterkeys(self):
self.session['x'] = 1
self.session.modified = False
self.session.accessed = False
i = self.session.iterkeys()
self.assertTrue(hasattr(i, '__iter__'))
self.assertTrue(self.session.accessed)
self.assertFalse(self.session.modified)
self.assertEqual(list(i), ['x'])
def test_iterkeys(self):
self.session['x'] = 1
self.session.modified = False
self.session.accessed = False
i = self.session.itervalues()
self.assertTrue(hasattr(i, '__iter__'))
self.assertTrue(self.session.accessed)
self.assertFalse(self.session.modified)
self.assertEqual(list(i), [1])
def test_iteritems(self):
self.session['x'] = 1
self.session.modified = False
self.session.accessed = False
i = self.session.iteritems()
self.assertTrue(hasattr(i, '__iter__'))
self.assertTrue(self.session.accessed)
self.assertFalse(self.session.modified)
self.assertEqual(list(i), [('x',1)])
def test_clear(self):
self.session['x'] = 1
self.session.modified = False
self.session.accessed = False
self.assertEqual(self.session.items(), [('x',1)])
self.session.clear()
self.assertEqual(self.session.items(), [])
self.assertTrue(self.session.accessed)
self.assertTrue(self.session.modified)
def test_save(self):
self.session.save()
self.assertTrue(self.session.exists(self.session.session_key))
def test_delete(self):
self.session.delete(self.session.session_key)
self.assertFalse(self.session.exists(self.session.session_key))
def test_flush(self):
self.session['foo'] = 'bar'
self.session.save()
prev_key = self.session.session_key
self.session.flush()
self.assertFalse(self.session.exists(prev_key))
self.assertNotEqual(self.session.session_key, prev_key)
self.assertTrue(self.session.modified)
self.assertTrue(self.session.accessed)
def test_cycle(self):
self.session['a'], self.session['b'] = 'c', 'd'
self.session.save()
prev_key = self.session.session_key
prev_data = self.session.items()
self.session.cycle_key()
self.assertNotEqual(self.session.session_key, prev_key)
self.assertEqual(self.session.items(), prev_data)
def test_invalid_key(self):
# Submitting an invalid session key (either by guessing, or if the db has # Submitting an invalid session key (either by guessing, or if the db has
# removed the key) results in a new key being generated. # removed the key) results in a new key being generated.
>>> Session.objects.filter(pk=db_session.session_key).delete() session = self.backend('1')
>>> db_session = DatabaseSession(db_session.session_key) session.save()
>>> db_session.save() self.assertNotEqual(session.session_key, '1')
>>> DatabaseSession('1').get('cat') self.assertEqual(session.get('cat'), None)
session.delete()
#
# Cached DB session tests
#
>>> cdb_session = CacheDBSession()
>>> cdb_session.modified
False
>>> cdb_session['cat'] = "dog"
>>> cdb_session.modified
True
>>> cdb_session.pop('cat')
'dog'
>>> cdb_session.pop('some key', 'does not exist')
'does not exist'
>>> cdb_session.save()
>>> cdb_session.exists(cdb_session.session_key)
True
>>> cdb_session.delete(cdb_session.session_key)
>>> cdb_session.exists(cdb_session.session_key)
False
#
# File session tests.
#
# Do file session tests in an isolated directory, and kill it after we're done.
>>> original_session_file_path = settings.SESSION_FILE_PATH
>>> import tempfile
>>> temp_session_store = settings.SESSION_FILE_PATH = tempfile.mkdtemp()
>>> file_session = FileSession()
>>> file_session.modified
False
>>> file_session['cat'] = "dog"
>>> file_session.modified
True
>>> file_session.pop('cat')
'dog'
>>> file_session.pop('some key', 'does not exist')
'does not exist'
>>> file_session.save()
>>> file_session.exists(file_session.session_key)
True
>>> file_session.delete(file_session.session_key)
>>> file_session.exists(file_session.session_key)
False
>>> FileSession('1').get('cat')
>>> file_session['foo'] = 'bar'
>>> file_session.save()
>>> file_session.exists(file_session.session_key)
True
>>> prev_key = file_session.session_key
>>> file_session.flush()
>>> file_session.exists(prev_key)
False
>>> file_session.session_key == prev_key
False
>>> file_session.modified, file_session.accessed
(True, True)
>>> file_session['a'], file_session['b'] = 'c', 'd'
>>> file_session.save()
>>> prev_key = file_session.session_key
>>> prev_data = file_session.items()
>>> file_session.cycle_key()
>>> file_session.session_key == prev_key
False
>>> file_session.items() == prev_data
True
>>> Session.objects.filter(pk=file_session.session_key).delete()
>>> file_session = FileSession(file_session.session_key)
>>> file_session.save()
# Make sure the file backend checks for a good storage dir
>>> settings.SESSION_FILE_PATH = "/if/this/directory/exists/you/have/a/weird/computer"
>>> FileSession()
Traceback (innermost last):
...
ImproperlyConfigured: The session storage path '/if/this/directory/exists/you/have/a/weird/computer' doesn't exist. Please set your SESSION_FILE_PATH setting to an existing directory in which Django can store session data.
# Clean up after the file tests
>>> settings.SESSION_FILE_PATH = original_session_file_path
>>> import shutil
>>> shutil.rmtree(temp_session_store)
#
# Cache-based tests
# NB: be careful to delete any sessions created; stale sessions fill up the
# /tmp and eventually overwhelm it after lots of runs (think buildbots)
#
>>> cache_session = CacheSession()
>>> cache_session.modified
False
>>> cache_session['cat'] = "dog"
>>> cache_session.modified
True
>>> cache_session.pop('cat')
'dog'
>>> cache_session.pop('some key', 'does not exist')
'does not exist'
>>> cache_session.save()
>>> cache_session.delete(cache_session.session_key)
>>> cache_session.exists(cache_session.session_key)
False
>>> cache_session['foo'] = 'bar'
>>> cache_session.save()
>>> cache_session.exists(cache_session.session_key)
True
>>> prev_key = cache_session.session_key
>>> cache_session.flush()
>>> cache_session.exists(prev_key)
False
>>> cache_session.session_key == prev_key
False
>>> cache_session.modified, cache_session.accessed
(True, True)
>>> cache_session['a'], cache_session['b'] = 'c', 'd'
>>> cache_session.save()
>>> prev_key = cache_session.session_key
>>> prev_data = cache_session.items()
>>> cache_session.cycle_key()
>>> cache_session.session_key == prev_key
False
>>> cache_session.items() == prev_data
True
>>> cache_session = CacheSession()
>>> cache_session.save()
>>> key = cache_session.session_key
>>> cache_session.exists(key)
True
>>> Session.objects.filter(pk=cache_session.session_key).delete()
>>> cache_session = CacheSession(cache_session.session_key)
>>> cache_session.save()
>>> cache_session.delete(cache_session.session_key)
>>> s = SessionBase()
>>> s._session['some key'] = 'exists' # Pre-populate the session with some data
>>> s.accessed = False # Reset to pretend this wasn't accessed previously
>>> s.accessed, s.modified
(False, False)
>>> s.pop('non existant key', 'does not exist')
'does not exist'
>>> s.accessed, s.modified
(True, False)
>>> s.setdefault('foo', 'bar')
'bar'
>>> s.setdefault('foo', 'baz')
'bar'
>>> s.accessed = False # Reset the accessed flag
>>> s.pop('some key')
'exists'
>>> s.accessed, s.modified
(True, True)
>>> s.pop('some key', 'does not exist')
'does not exist'
>>> s.get('update key', None)
# test .update()
>>> s.modified = s.accessed = False # Reset to pretend this wasn't accessed previously
>>> s.update({'update key':1})
>>> s.accessed, s.modified
(True, True)
>>> s.get('update key', None)
1
# test .has_key()
>>> s.modified = s.accessed = False # Reset to pretend this wasn't accessed previously
>>> s.has_key('update key')
True
>>> s.accessed, s.modified
(True, False)
# test .values()
>>> s = SessionBase()
>>> s.values()
[]
>>> s.accessed
True
>>> s['x'] = 1
>>> s.values()
[1]
# test .iterkeys()
>>> s.accessed = False
>>> i = s.iterkeys()
>>> hasattr(i,'__iter__')
True
>>> s.accessed
True
>>> list(i)
['x']
# test .itervalues()
>>> s.accessed = False
>>> i = s.itervalues()
>>> hasattr(i,'__iter__')
True
>>> s.accessed
True
>>> list(i)
[1]
# test .iteritems()
>>> s.accessed = False
>>> i = s.iteritems()
>>> hasattr(i,'__iter__')
True
>>> s.accessed
True
>>> list(i)
[('x', 1)]
# test .clear()
>>> s.modified = s.accessed = False
>>> s.items()
[('x', 1)]
>>> s.clear()
>>> s.items()
[]
>>> s.accessed, s.modified
(True, True)
#########################
# Custom session expiry #
#########################
>>> from django.conf import settings
>>> from datetime import datetime, timedelta
>>> td10 = timedelta(seconds=10)
# Custom session expiry
def test_default_expiry(self):
# A normal session has a max age equal to settings # A normal session has a max age equal to settings
>>> s.get_expiry_age() == settings.SESSION_COOKIE_AGE self.assertEqual(self.session.get_expiry_age(), settings.SESSION_COOKIE_AGE)
True
# So does a custom session with an idle expiration time of 0 (but it'll expire # So does a custom session with an idle expiration time of 0 (but it'll
# at browser close) # expire at browser close)
>>> s.set_expiry(0) self.session.set_expiry(0)
>>> s.get_expiry_age() == settings.SESSION_COOKIE_AGE self.assertEqual(self.session.get_expiry_age(), settings.SESSION_COOKIE_AGE)
True
# Custom session idle expiration time def test_custom_expiry_seconds(self):
>>> s.set_expiry(10) # Using seconds
>>> delta = s.get_expiry_date() - datetime.now() self.session.set_expiry(10)
>>> delta.seconds in (9, 10) delta = self.session.get_expiry_date() - datetime.now()
True self.assertTrue(delta.seconds in (9, 10))
>>> age = s.get_expiry_age()
>>> age in (9, 10)
True
# Custom session fixed expiry date (timedelta) age = self.session.get_expiry_age()
>>> s.set_expiry(td10) self.assertTrue(age in (9, 10))
>>> delta = s.get_expiry_date() - datetime.now()
>>> delta.seconds in (9, 10)
True
>>> age = s.get_expiry_age()
>>> age in (9, 10)
True
# Custom session fixed expiry date (fixed datetime) def test_custom_expiry_timedelta(self):
>>> s.set_expiry(datetime.now() + td10) # Using timedelta
>>> delta = s.get_expiry_date() - datetime.now() self.session.set_expiry(timedelta(seconds=10))
>>> delta.seconds in (9, 10) delta = self.session.get_expiry_date() - datetime.now()
True self.assertTrue(delta.seconds in (9, 10))
>>> age = s.get_expiry_age()
>>> age in (9, 10)
True
# Set back to default session age age = self.session.get_expiry_age()
>>> s.set_expiry(None) self.assertTrue(age in (9, 10))
>>> s.get_expiry_age() == settings.SESSION_COOKIE_AGE
True
# Allow to set back to default session age even if no alternate has been set def test_custom_expiry_timedelta(self):
>>> s.set_expiry(None) # Using timedelta
self.session.set_expiry(datetime.now() + timedelta(seconds=10))
delta = self.session.get_expiry_date() - datetime.now()
self.assertTrue(delta.seconds in (9, 10))
age = self.session.get_expiry_age()
self.assertTrue(age in (9, 10))
def test_custom_expiry_reset(self):
self.session.set_expiry(None)
self.session.set_expiry(10)
self.session.set_expiry(None)
self.assertEqual(self.session.get_expiry_age(), settings.SESSION_COOKIE_AGE)
def test_get_expire_at_browser_close(self):
# Tests get_expire_at_browser_close with different settings and different
# set_expiry calls
try:
try:
original_expire_at_browser_close = settings.SESSION_EXPIRE_AT_BROWSER_CLOSE
settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = False
self.session.set_expiry(10)
self.assertFalse(self.session.get_expire_at_browser_close())
self.session.set_expiry(0)
self.assertTrue(self.session.get_expire_at_browser_close())
self.session.set_expiry(None)
self.assertFalse(self.session.get_expire_at_browser_close())
settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = True
self.session.set_expiry(10)
self.assertFalse(self.session.get_expire_at_browser_close())
self.session.set_expiry(0)
self.assertTrue(self.session.get_expire_at_browser_close())
self.session.set_expiry(None)
self.assertTrue(self.session.get_expire_at_browser_close())
except:
raise
finally:
settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = original_expire_at_browser_close
# We're changing the setting then reverting back to the original setting at the class DatabaseSessionTests(SessionTestsMixin, TestCase):
# end of these tests.
>>> original_expire_at_browser_close = settings.SESSION_EXPIRE_AT_BROWSER_CLOSE
>>> settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = False
# Custom session age backend = DatabaseSession
>>> s.set_expiry(10)
>>> s.get_expire_at_browser_close()
False
# Custom expire-at-browser-close
>>> s.set_expiry(0)
>>> s.get_expire_at_browser_close()
True
# Default session age class CacheDBSessionTests(SessionTestsMixin, TestCase):
>>> s.set_expiry(None)
>>> s.get_expire_at_browser_close()
False
>>> settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = True backend = CacheDBSession
# Custom session age # Don't need DB flushing for these tests, so can use unittest.TestCase as base class
>>> s.set_expiry(10) class FileSessionTests(SessionTestsMixin, unittest.TestCase):
>>> s.get_expire_at_browser_close()
False
# Custom expire-at-browser-close backend = FileSession
>>> s.set_expiry(0)
>>> s.get_expire_at_browser_close()
True
# Default session age def setUp(self):
>>> s.set_expiry(None) super(FileSessionTests, self).setUp()
>>> s.get_expire_at_browser_close() # Do file session tests in an isolated directory, and kill it after we're done.
True self.original_session_file_path = settings.SESSION_FILE_PATH
self.temp_session_store = settings.SESSION_FILE_PATH = tempfile.mkdtemp()
>>> settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = original_expire_at_browser_close def tearDown(self):
""" settings.SESSION_FILE_PATH = self.original_session_file_path
shutil.rmtree(self.temp_session_store)
super(FileSessionTests, self).tearDown()
if __name__ == '__main__': def test_configuration_check(self):
import doctest # Make sure the file backend checks for a good storage dir
doctest.testmod() settings.SESSION_FILE_PATH = "/if/this/directory/exists/you/have/a/weird/computer"
self.assertRaises(ImproperlyConfigured, self.backend)
class CacheSessionTests(SessionTestsMixin, unittest.TestCase):
backend = CacheSession

View File

@ -65,11 +65,12 @@ class Sitemap(object):
urls = [] urls = []
for item in self.paginator.page(page).object_list: for item in self.paginator.page(page).object_list:
loc = "http://%s%s" % (current_site.domain, self.__get('location', item)) loc = "http://%s%s" % (current_site.domain, self.__get('location', item))
priority = self.__get('priority', item, None)
url_info = { url_info = {
'location': loc, 'location': loc,
'lastmod': self.__get('lastmod', item, None), 'lastmod': self.__get('lastmod', item, None),
'changefreq': self.__get('changefreq', item, None), 'changefreq': self.__get('changefreq', item, None),
'priority': self.__get('priority', item, None) 'priority': str(priority is not None and priority or '')
} }
urls.append(url_info) urls.append(url_info)
return urls return urls
@ -78,7 +79,7 @@ class FlatPageSitemap(Sitemap):
def items(self): def items(self):
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
current_site = Site.objects.get_current() current_site = Site.objects.get_current()
return current_site.flatpage_set.all() return current_site.flatpage_set.filter(registration_required=False)
class GenericSitemap(Sitemap): class GenericSitemap(Sitemap):
priority = None priority = None

View File

@ -0,0 +1 @@
# This file intentionally left blank

View File

@ -0,0 +1 @@
from django.contrib.sitemaps.tests.basic import *

View File

@ -0,0 +1,77 @@
from datetime import date
from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.flatpages.models import FlatPage
from django.test import TestCase
from django.utils.formats import localize
from django.utils.translation import activate
class SitemapTests(TestCase):
urls = 'django.contrib.sitemaps.tests.urls'
def setUp(self):
self.old_USE_L10N = settings.USE_L10N
# Create a user that will double as sitemap content
User.objects.create_user('testuser', 'test@example.com', 's3krit')
def tearDown(self):
settings.USE_L10N = self.old_USE_L10N
def test_simple_sitemap(self):
"A simple sitemap can be rendered"
# Retrieve the sitemap.
response = self.client.get('/simple/sitemap.xml')
# Check for all the important bits:
self.assertEquals(response.content, """<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>http://example.com/location/</loc><lastmod>%s</lastmod><changefreq>never</changefreq><priority>0.5</priority></url>
</urlset>
""" % date.today().strftime('%Y-%m-%d'))
def test_localized_priority(self):
"The priority value should not be localized (Refs #14164)"
# Localization should be active
settings.USE_L10N = True
activate('fr')
self.assertEqual(u'0,3', localize(0.3))
# Retrieve the sitemap. Check that priorities
# haven't been rendered in localized format
response = self.client.get('/simple/sitemap.xml')
self.assertContains(response, '<priority>0.5</priority>')
self.assertContains(response, '<lastmod>%s</lastmod>' % date.today().strftime('%Y-%m-%d'))
def test_generic_sitemap(self):
"A minimal generic sitemap can be rendered"
# Retrieve the sitemap.
response = self.client.get('/generic/sitemap.xml')
# Check for all the important bits:
self.assertEquals(response.content, """<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>http://example.com/users/testuser/</loc></url>
</urlset>
""")
def test_flatpage_sitemap(self):
"Basic FlatPage sitemap test"
public = FlatPage.objects.create(
url=u'/public/',
title=u'Public Page',
enable_comments=True,
registration_required=False,
)
public.sites.add(settings.SITE_ID)
private = FlatPage.objects.create(
url=u'/private/',
title=u'Public Page',
enable_comments=True,
registration_required=True
)
private.sites.add(settings.SITE_ID)
response = self.client.get('/flatpages/sitemap.xml')
# Public flatpage should be in the sitemap
self.assertContains(response, '<loc>http://example.com%s</loc>' % public.url)
# Private flatpage should not be in the sitemap
self.assertNotContains(response, '<loc>http://example.com%s</loc>' % private.url)

Some files were not shown because too many files have changed in this diff Show More