mirror of
https://github.com/django/django.git
synced 2025-07-04 01:39:20 +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:
parent
c9b188c4ec
commit
dd49269c7d
32
AUTHORS
32
AUTHORS
@ -29,7 +29,6 @@ answer newbie questions, and generally made Django that much better:
|
||||
Gisle Aas <gisle@aas.no>
|
||||
ajs <adi@sieker.info>
|
||||
alang@bright-green.com
|
||||
Alcides Fonseca
|
||||
Andi Albrecht <albrecht.andi@gmail.com>
|
||||
Marty Alchin <gulopine@gamemusic.org>
|
||||
Ahmad Alhashemi <trans@ahmadh.com>
|
||||
@ -39,7 +38,6 @@ answer newbie questions, and generally made Django that much better:
|
||||
AgarFu <heaven@croasanaso.sytes.net>
|
||||
Dagur Páll Ammendrup <dagurp@gmail.com>
|
||||
Collin Anderson <cmawebsite@gmail.com>
|
||||
Nicolas Lara <nicolaslara@gmail.com>
|
||||
Jeff Anderson <jefferya@programmerq.net>
|
||||
Marian Andre <django@andre.sk>
|
||||
Andreas
|
||||
@ -85,19 +83,19 @@ answer newbie questions, and generally made Django that much better:
|
||||
Sean Brant
|
||||
Andrew Brehaut <http://brehaut.net/blog>
|
||||
brut.alll@gmail.com
|
||||
bthomas
|
||||
btoll@bestweb.net
|
||||
Jonathan Buchanan <jonathan.buchanan@gmail.com>
|
||||
Keith Bussell <kbussell@gmail.com>
|
||||
C8E
|
||||
Chris Cahoon <chris.cahoon@gmail.com>
|
||||
Juan Manuel Caicedo <juan.manuel.caicedo@gmail.com>
|
||||
Trevor Caira <trevor@caira.com>
|
||||
Brett Cannon <brett@python.org>
|
||||
Ricardo Javier Cárdenes Medina <ricardo.cardenes@gmail.com>
|
||||
Jeremy Carbaugh <jcarbaugh@gmail.com>
|
||||
Carl Meyer <carl@dirtcircle.com>
|
||||
Graham Carlyle <graham.carlyle@maplecroft.net>
|
||||
Antonio Cavedoni <http://cavedoni.com/>
|
||||
C8E
|
||||
cedric@terramater.net
|
||||
Chris Chamberlin <dja@cdc.msbx.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>
|
||||
Can Burak Çilingir <canburak@cs.bilgi.edu.tr>
|
||||
Ian Clelland <clelland@gmail.com>
|
||||
Travis Cline <travis.cline@gmail.com>
|
||||
Russell Cloran <russell@rucus.net>
|
||||
colin@owlfish.com
|
||||
crankycoder@gmail.com
|
||||
@ -137,6 +136,7 @@ answer newbie questions, and generally made Django that much better:
|
||||
Rajesh Dhawan <rajesh.dhawan@gmail.com>
|
||||
Sander Dijkhuis <sander.dijkhuis@gmail.com>
|
||||
Jordan Dimov <s3x3y1@gmail.com>
|
||||
Nebojša Dorđević
|
||||
dne@mayonnaise.net
|
||||
dready <wil@mojipage.com>
|
||||
Maximillian Dornseif <md@hudora.de>
|
||||
@ -167,7 +167,6 @@ answer newbie questions, and generally made Django that much better:
|
||||
Liang Feng <hutuworm@gmail.com>
|
||||
Bill Fenner <fenner@gmail.com>
|
||||
Stefane Fermgier <sf@fermigier.com>
|
||||
Afonso Fernández Nogueira <fonzzo.django@gmail.com>
|
||||
J. Pablo Fernandez <pupeno@pupeno.com>
|
||||
Maciej Fijalkowski
|
||||
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 Florenzano <floguy@gmail.com>
|
||||
Vincent Foley <vfoleybourgon@yahoo.ca>
|
||||
Alcides Fonseca
|
||||
Rudolph Froger <rfroger@estrate.nl>
|
||||
Jorge Gajon <gajon@gajon.org>
|
||||
gandalf@owca.info
|
||||
@ -184,11 +184,13 @@ answer newbie questions, and generally made Django that much better:
|
||||
Idan Gazit
|
||||
geber@datacollect.com
|
||||
Baishampayan Ghose
|
||||
Joshua Ginsberg <jag@flowtheory.net>
|
||||
Dimitris Glezos <dimitris@glezos.com>
|
||||
glin@seznam.cz
|
||||
martin.glueck@gmail.com
|
||||
Artyom Gnilov <boobsd@gmail.com>
|
||||
Ben Godfrey <http://aftnn.org>
|
||||
Andrew Godwin <andrew@aeracode.org>
|
||||
GomoX <gomo@datafull.com>
|
||||
Guilherme Mesquita Gondim <semente@taurinus.org>
|
||||
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>
|
||||
Sung-Jin Hong <serialx.net@gmail.com>
|
||||
Leo "hylje" Honkanen <sealage@gmail.com>
|
||||
Matt Hoskins <skaffenuk@googlemail.com>
|
||||
Tareque Hossain <http://www.codexn.com>
|
||||
Richard House <Richard.House@i-logue.com>
|
||||
Robert Rock Howard <http://djangomojo.com/>
|
||||
@ -235,6 +238,7 @@ answer newbie questions, and generally made Django that much better:
|
||||
jcrasta@gmail.com
|
||||
jdetaeye
|
||||
jhenry <jhenry@theonion.com>
|
||||
john@calixto.net
|
||||
Zak Johnson <zakj@nox.cx>
|
||||
Nis Jørgensen <nis@superlativ.dk>
|
||||
Michael Josephson <http://www.sdjournal.com/>
|
||||
@ -275,11 +279,11 @@ answer newbie questions, and generally made Django that much better:
|
||||
kurtiss@meetro.com
|
||||
Denis Kuzmichyov <kuzmichyov@gmail.com>
|
||||
Panos Laganakos <panos.laganakos@gmail.com>
|
||||
Lakin Wecker <lakin@structuredabstraction.com>
|
||||
Nick Lane <nick.lane.au@gmail.com>
|
||||
Stuart Langridge <http://www.kryogenix.org/>
|
||||
Paul Lanier <planier@google.com>
|
||||
David Larlet <http://david.larlet.fr>
|
||||
Nicolas Lara <nicolaslara@gmail.com>
|
||||
Nicola Larosa <nico@teknico.net>
|
||||
Finn Gruwier Larsen <finn@gruwier.dk>
|
||||
Lau Bech Lauritzen
|
||||
@ -300,7 +304,6 @@ answer newbie questions, and generally made Django that much better:
|
||||
Simon Litchfield <simon@quo.com.au>
|
||||
Daniel Lindsley <polarcowz@gmail.com>
|
||||
Trey Long <trey@ktrl.com>
|
||||
msaelices <msaelices@gmail.com>
|
||||
Martin Mahner <http://www.mahner.org/>
|
||||
Matt McClanahan <http://mmcc.cx/>
|
||||
Stanislaus Madueke
|
||||
@ -313,20 +316,21 @@ answer newbie questions, and generally made Django that much better:
|
||||
Petr Marhoun <petr.marhoun@gmail.com>
|
||||
Petar Marić <http://www.petarmaric.com/>
|
||||
Nuno Mariz <nmariz@gmail.com>
|
||||
Marijn Vriens <marijn@metronomo.cl>
|
||||
mark@junklight.com
|
||||
Orestis Markou <orestis@orestis.gr>
|
||||
Takashi Matsuo <matsuo.takashi@gmail.com>
|
||||
Yasushi Masuda <whosaysni@gmail.com>
|
||||
mattycakes@gmail.com
|
||||
Glenn Maynard <glenn@zewt.org>
|
||||
Jason McBrayer <http://www.carcosa.net/jason/>
|
||||
Kevin McConnell <kevin.mcconnell@gmail.com>
|
||||
mccutchen@gmail.com
|
||||
michael.mcewan@gmail.com
|
||||
Paul McLanahan <paul@mclanahan.net>
|
||||
Tobias McNulty <http://www.caktusgroup.com/blog>
|
||||
Zain Memon
|
||||
Christian Metts
|
||||
michael.mcewan@gmail.com
|
||||
Carl Meyer <carl@dirtcircle.com>
|
||||
michal@plovarna.cz
|
||||
Slawek Mikula <slawek dot mikula at gmail dot com>
|
||||
mitakummaa@gmail.com
|
||||
@ -336,12 +340,14 @@ answer newbie questions, and generally made Django that much better:
|
||||
Aljosa Mohorovic <aljosa.mohorovic@gmail.com>
|
||||
Ramiro Morales <rm0@gmx.net>
|
||||
Eric Moritz <http://eric.themoritzfamily.com/>
|
||||
msaelices <msaelices@gmail.com>
|
||||
Gregor Müllegger <gregor@muellegger.de>
|
||||
Robin Munn <http://www.geekforgod.com/>
|
||||
James Murty
|
||||
msundstr
|
||||
Robert Myers <myer0052@gmail.com>
|
||||
Aaron T. Myers <atmyers@gmail.com>
|
||||
Alexander Myodov <alex@myodov.com>
|
||||
Nebojša Dorđević
|
||||
Doug Napoleone <doug@dougma.com>
|
||||
Gopal Narayanan <gopastro@gmail.com>
|
||||
Fraser Nevett <mail@nevett.org>
|
||||
@ -369,7 +375,6 @@ answer newbie questions, and generally made Django that much better:
|
||||
phil.h.smith@gmail.com
|
||||
Gustavo Picon
|
||||
Michael Placentra II <someone@michaelplacentra2.net>
|
||||
Luke Plant <http://lukeplant.me.uk/>
|
||||
plisk
|
||||
Daniel Poelzleithner <http://poelzi.org/>
|
||||
polpak@yahoo.com
|
||||
@ -400,7 +405,6 @@ answer newbie questions, and generally made Django that much better:
|
||||
Henrique Romano <onaiort@gmail.com>
|
||||
Armin Ronacher
|
||||
Daniel Roseman <http://roseman.org.uk/>
|
||||
Brian Rosner <brosner@gmail.com>
|
||||
Rozza <ross.lawley@gmail.com>
|
||||
Oliver Rutherfurd <http://rutherfurd.net/>
|
||||
ryankanno
|
||||
@ -479,6 +483,7 @@ answer newbie questions, and generally made Django that much better:
|
||||
George Vilches <gav@thataddress.com>
|
||||
Vlado <vlado@labath.org>
|
||||
Zachary Voase <zacharyvoase@gmail.com>
|
||||
Marijn Vriens <marijn@metronomo.cl>
|
||||
Milton Waddams
|
||||
Chris Wagner <cw264701@ohio.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>
|
||||
Dan Watson <http://theidioteque.net/>
|
||||
Joel Watts <joel@joelwatts.com>
|
||||
Lakin Wecker <lakin@structuredabstraction.com>
|
||||
Chris Wesseling <Chris.Wesseling@cwi.nl>
|
||||
James Wheare <django@sparemint.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>
|
||||
Jarek Zgoda <jarek.zgoda@gmail.com>
|
||||
Cheng Zhang
|
||||
Glenn Maynard <glenn@zewt.org>
|
||||
bthomas
|
||||
|
||||
A big THANK YOU goes to:
|
||||
|
||||
|
@ -3,12 +3,12 @@ include AUTHORS
|
||||
include INSTALL
|
||||
include LICENSE
|
||||
include MANIFEST.in
|
||||
include django/utils/simplejson/LICENSE.txt
|
||||
include django/contrib/gis/gdal/LICENSE
|
||||
include django/contrib/gis/geos/LICENSE
|
||||
include django/dispatch/license.txt
|
||||
include django/utils/simplejson/LICENSE.txt
|
||||
recursive-include docs *
|
||||
recursive-include scripts *
|
||||
recursive-include examples *
|
||||
recursive-include extras *
|
||||
recursive-include tests *
|
||||
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/databrowse/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/tests/data *
|
||||
recursive-include django/contrib/gis/tests/geoapp/fixtures *
|
||||
|
@ -1,4 +1,4 @@
|
||||
VERSION = (1, 2, 1, 'final', 0)
|
||||
VERSION = (1, 3, 0, 'alpha', 0)
|
||||
|
||||
def get_version():
|
||||
version = '%s.%s' % (VERSION[0], VERSION[1])
|
||||
|
@ -103,6 +103,12 @@ class Settings(object):
|
||||
self.INSTALLED_APPS = new_installed_apps
|
||||
|
||||
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
|
||||
# we don't do this unconditionally (breaks Windows).
|
||||
os.environ['TZ'] = self.TIME_ZONE
|
||||
|
@ -54,7 +54,7 @@ LANGUAGES = (
|
||||
('en', gettext_noop('English')),
|
||||
('en-gb', gettext_noop('British English')),
|
||||
('es', gettext_noop('Spanish')),
|
||||
('es-ar', gettext_noop('Argentinean Spanish')),
|
||||
('es-ar', gettext_noop('Argentinian Spanish')),
|
||||
('et', gettext_noop('Estonian')),
|
||||
('eu', gettext_noop('Basque')),
|
||||
('fa', gettext_noop('Persian')),
|
||||
@ -78,6 +78,7 @@ LANGUAGES = (
|
||||
('lt', gettext_noop('Lithuanian')),
|
||||
('lv', gettext_noop('Latvian')),
|
||||
('mk', gettext_noop('Macedonian')),
|
||||
('ml', gettext_noop('Malayalam')),
|
||||
('mn', gettext_noop('Mongolian')),
|
||||
('nl', gettext_noop('Dutch')),
|
||||
('no', gettext_noop('Norwegian')),
|
||||
@ -372,8 +373,8 @@ DECIMAL_SEPARATOR = '.'
|
||||
# Boolean that sets whether to add thousand separator when formatting numbers
|
||||
USE_THOUSAND_SEPARATOR = False
|
||||
|
||||
# Number of digits that will be togheter, when spliting them by THOUSAND_SEPARATOR
|
||||
# 0 means no grouping, 3 means splitting by thousands...
|
||||
# Number of digits that will be together, when spliting them by
|
||||
# THOUSAND_SEPARATOR. 0 means no grouping, 3 means splitting by thousands...
|
||||
NUMBER_GROUPING = 0
|
||||
|
||||
# Thousand separator symbol
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -4,7 +4,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Django\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"
|
||||
"Last-Translator: Django Catalan Group <django-cat@googlegroups.com>\n"
|
||||
"Language-Team: Catalan <ca@li.org>\n"
|
||||
@ -14,102 +14,144 @@ msgstr ""
|
||||
"X-Generator: VIM 7.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
|
||||
msgid "Available %s"
|
||||
msgstr "%s Disponibles"
|
||||
|
||||
#: contrib/admin/media/js/SelectFilter2.js:41
|
||||
#: .\contrib\admin\media\js\SelectFilter2.js.py:45
|
||||
msgid "Choose all"
|
||||
msgstr "Seleccionar tots"
|
||||
|
||||
#: contrib/admin/media/js/SelectFilter2.js:46
|
||||
#: .\contrib\admin\media\js\SelectFilter2.js.py:50
|
||||
msgid "Add"
|
||||
msgstr "Afegir"
|
||||
|
||||
#: contrib/admin/media/js/SelectFilter2.js:48
|
||||
#: .\contrib\admin\media\js\SelectFilter2.js.py:52
|
||||
msgid "Remove"
|
||||
msgstr "Eliminar"
|
||||
|
||||
#: contrib/admin/media/js/SelectFilter2.js:53
|
||||
#: .\contrib\admin\media\js\SelectFilter2.js.py:57
|
||||
#, perl-format
|
||||
msgid "Chosen %s"
|
||||
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 "
|
||||
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"
|
||||
msgstr "Deseleccionar tots"
|
||||
|
||||
#: contrib/admin/media/js/dateparse.js:32
|
||||
#: contrib/admin/media/js/calendar.js:24
|
||||
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\actions.js.py:18
|
||||
#: .\contrib\admin\media\js\actions.min.js.py:1
|
||||
msgid "%(sel)s of %(cnt)s selected"
|
||||
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
|
||||
msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
|
||||
msgstr "Diumenge Dilluns Dimarts Dimecres Dijous Divendres Dissabte"
|
||||
#: .\contrib\admin\media\js\actions.js.py:109
|
||||
#: .\contrib\admin\media\js\actions.min.js.py:5
|
||||
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"
|
||||
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/admin/DateTimeShortcuts.js:81
|
||||
msgid "Now"
|
||||
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
|
||||
#: .\contrib\admin\media\js\collapse.js.py:9
|
||||
#: .\contrib\admin\media\js\collapse.js.py:21
|
||||
#: .\contrib\admin\media\js\collapse.min.js.py:1
|
||||
msgid "Show"
|
||||
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"
|
||||
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à"
|
||||
|
Binary file not shown.
@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Django\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-05-09 14:26+0200\n"
|
||||
"PO-Revision-Date: 2010-05-09 14:09+0100\n"
|
||||
"POT-Creation-Date: 2010-08-06 18:35+0200\n"
|
||||
"PO-Revision-Date: 2010-08-06 18:33+0100\n"
|
||||
"Last-Translator: Vlada Macek <macek@sandbox.cz>\n"
|
||||
"Language-Team: Czech\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -70,7 +70,7 @@ msgid "Spanish"
|
||||
msgstr "španělsky"
|
||||
|
||||
#: conf/global_settings.py:57
|
||||
msgid "Argentinean Spanish"
|
||||
msgid "Argentinian Spanish"
|
||||
msgstr "španělsky (Argentina)"
|
||||
|
||||
#: conf/global_settings.py:58
|
||||
@ -122,138 +122,146 @@ msgid "Hungarian"
|
||||
msgstr "maďarsky"
|
||||
|
||||
#: conf/global_settings.py:70
|
||||
msgid "Indonesian"
|
||||
msgstr "indonésky"
|
||||
|
||||
#: conf/global_settings.py:71
|
||||
msgid "Icelandic"
|
||||
msgstr "islandsky"
|
||||
|
||||
#: conf/global_settings.py:71
|
||||
#: conf/global_settings.py:72
|
||||
msgid "Italian"
|
||||
msgstr "italsky"
|
||||
|
||||
#: conf/global_settings.py:72
|
||||
#: conf/global_settings.py:73
|
||||
msgid "Japanese"
|
||||
msgstr "japonsky"
|
||||
|
||||
#: conf/global_settings.py:73
|
||||
#: conf/global_settings.py:74
|
||||
msgid "Georgian"
|
||||
msgstr "gruzínsky"
|
||||
|
||||
#: conf/global_settings.py:74
|
||||
#: conf/global_settings.py:75
|
||||
msgid "Khmer"
|
||||
msgstr "khmersky"
|
||||
|
||||
#: conf/global_settings.py:75
|
||||
#: conf/global_settings.py:76
|
||||
msgid "Kannada"
|
||||
msgstr "kannadsky"
|
||||
|
||||
#: conf/global_settings.py:76
|
||||
#: conf/global_settings.py:77
|
||||
msgid "Korean"
|
||||
msgstr "korejsky"
|
||||
|
||||
#: conf/global_settings.py:77
|
||||
#: conf/global_settings.py:78
|
||||
msgid "Lithuanian"
|
||||
msgstr "litevsky"
|
||||
|
||||
#: conf/global_settings.py:78
|
||||
#: conf/global_settings.py:79
|
||||
msgid "Latvian"
|
||||
msgstr "lotyšsky"
|
||||
|
||||
#: conf/global_settings.py:79
|
||||
#: conf/global_settings.py:80
|
||||
msgid "Macedonian"
|
||||
msgstr "makedonsky"
|
||||
|
||||
#: conf/global_settings.py:80
|
||||
#: conf/global_settings.py:81
|
||||
msgid "Malayalam"
|
||||
msgstr "malajálamsky"
|
||||
|
||||
#: conf/global_settings.py:82
|
||||
msgid "Mongolian"
|
||||
msgstr "mongolsky"
|
||||
|
||||
#: conf/global_settings.py:81
|
||||
#: conf/global_settings.py:83
|
||||
msgid "Dutch"
|
||||
msgstr "holandsky"
|
||||
|
||||
#: conf/global_settings.py:82
|
||||
#: conf/global_settings.py:84
|
||||
msgid "Norwegian"
|
||||
msgstr "norsky"
|
||||
|
||||
#: conf/global_settings.py:83
|
||||
#: conf/global_settings.py:85
|
||||
msgid "Norwegian Bokmal"
|
||||
msgstr "norsky (Bokmål)"
|
||||
|
||||
#: conf/global_settings.py:84
|
||||
#: conf/global_settings.py:86
|
||||
msgid "Norwegian Nynorsk"
|
||||
msgstr "norsky (Nynorsk)"
|
||||
|
||||
#: conf/global_settings.py:85
|
||||
#: conf/global_settings.py:87
|
||||
msgid "Polish"
|
||||
msgstr "polsky"
|
||||
|
||||
#: conf/global_settings.py:86
|
||||
#: conf/global_settings.py:88
|
||||
msgid "Portuguese"
|
||||
msgstr "portugalsky"
|
||||
|
||||
#: conf/global_settings.py:87
|
||||
#: conf/global_settings.py:89
|
||||
msgid "Brazilian Portuguese"
|
||||
msgstr "portugalsky (Brazílie)"
|
||||
|
||||
#: conf/global_settings.py:88
|
||||
#: conf/global_settings.py:90
|
||||
msgid "Romanian"
|
||||
msgstr "rumunsky"
|
||||
|
||||
#: conf/global_settings.py:89
|
||||
#: conf/global_settings.py:91
|
||||
msgid "Russian"
|
||||
msgstr "rusky"
|
||||
|
||||
#: conf/global_settings.py:90
|
||||
#: conf/global_settings.py:92
|
||||
msgid "Slovak"
|
||||
msgstr "slovensky"
|
||||
|
||||
#: conf/global_settings.py:91
|
||||
#: conf/global_settings.py:93
|
||||
msgid "Slovenian"
|
||||
msgstr "slovinsky"
|
||||
|
||||
#: conf/global_settings.py:92
|
||||
#: conf/global_settings.py:94
|
||||
msgid "Albanian"
|
||||
msgstr "albánsky"
|
||||
|
||||
#: conf/global_settings.py:93
|
||||
#: conf/global_settings.py:95
|
||||
msgid "Serbian"
|
||||
msgstr "srbsky"
|
||||
|
||||
#: conf/global_settings.py:94
|
||||
#: conf/global_settings.py:96
|
||||
msgid "Serbian Latin"
|
||||
msgstr "srbsky (latinkou)"
|
||||
|
||||
#: conf/global_settings.py:95
|
||||
#: conf/global_settings.py:97
|
||||
msgid "Swedish"
|
||||
msgstr "švédsky"
|
||||
|
||||
#: conf/global_settings.py:96
|
||||
#: conf/global_settings.py:98
|
||||
msgid "Tamil"
|
||||
msgstr "tamilsky"
|
||||
|
||||
#: conf/global_settings.py:97
|
||||
#: conf/global_settings.py:99
|
||||
msgid "Telugu"
|
||||
msgstr "telužsky"
|
||||
|
||||
#: conf/global_settings.py:98
|
||||
#: conf/global_settings.py:100
|
||||
msgid "Thai"
|
||||
msgstr "thajsky"
|
||||
|
||||
#: conf/global_settings.py:99
|
||||
#: conf/global_settings.py:101
|
||||
msgid "Turkish"
|
||||
msgstr "turecky"
|
||||
|
||||
#: conf/global_settings.py:100
|
||||
#: conf/global_settings.py:102
|
||||
msgid "Ukrainian"
|
||||
msgstr "ukrajinsky"
|
||||
|
||||
#: conf/global_settings.py:101
|
||||
#: conf/global_settings.py:103
|
||||
msgid "Vietnamese"
|
||||
msgstr "vietnamsky"
|
||||
|
||||
#: conf/global_settings.py:102
|
||||
#: conf/global_settings.py:104
|
||||
msgid "Simplified Chinese"
|
||||
msgstr "čínsky (zjednodušeně)"
|
||||
|
||||
#: conf/global_settings.py:103
|
||||
#: conf/global_settings.py:105
|
||||
msgid "Traditional Chinese"
|
||||
msgstr "čínsky (tradičně)"
|
||||
|
||||
@ -305,15 +313,15 @@ msgstr "Tento měsíc"
|
||||
msgid "This year"
|
||||
msgstr "Tento rok"
|
||||
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
|
||||
msgid "Yes"
|
||||
msgstr "Ano"
|
||||
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
|
||||
msgid "No"
|
||||
msgstr "Ne"
|
||||
|
||||
#: contrib/admin/filterspecs.py:154 forms/widgets.py:469
|
||||
#: contrib/admin/filterspecs.py:154 forms/widgets.py:478
|
||||
msgid "Unknown"
|
||||
msgstr "Neznámé"
|
||||
|
||||
@ -359,7 +367,7 @@ msgid "Changed %s."
|
||||
msgstr "Změněno: %s"
|
||||
|
||||
#: 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
|
||||
msgid "and"
|
||||
msgstr "a"
|
||||
@ -853,7 +861,7 @@ msgstr "Uložit a přidat další položku"
|
||||
msgid "Save and continue editing"
|
||||
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 ""
|
||||
"First, enter a username and password. Then, you'll be able to edit more user "
|
||||
"options."
|
||||
@ -861,6 +869,10 @@ msgstr ""
|
||||
"Nejdříve vložte uživatelské jméno a heslo. Poté budete moci upravovat více "
|
||||
"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
|
||||
#, python-format
|
||||
msgid "Enter a new password for the user <strong>%(username)s</strong>."
|
||||
@ -1418,8 +1430,8 @@ msgstr "zpráva"
|
||||
msgid "Logged out"
|
||||
msgstr "Odhlášeno"
|
||||
|
||||
#: contrib/auth/management/commands/createsuperuser.py:23
|
||||
#: core/validators.py:120 forms/fields.py:428
|
||||
#: contrib/auth/management/commands/createsuperuser.py:24
|
||||
#: core/validators.py:120 forms/fields.py:427
|
||||
msgid "Enter a valid e-mail address."
|
||||
msgstr "Vložte platnou e-mailovou adresu."
|
||||
|
||||
@ -1491,7 +1503,7 @@ msgid "Email address"
|
||||
msgstr "E-mailová adresa"
|
||||
|
||||
#: 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"
|
||||
msgstr "URL"
|
||||
|
||||
@ -1541,7 +1553,7 @@ msgstr "komentář"
|
||||
msgid "date/time submitted"
|
||||
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"
|
||||
msgstr "Adresa IP"
|
||||
|
||||
@ -4473,22 +4485,22 @@ msgstr "weby"
|
||||
msgid "Enter a valid value."
|
||||
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."
|
||||
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."
|
||||
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 ""
|
||||
"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
|
||||
msgstr ""
|
||||
"Vložte platný identifikátor složený pouze z písmen, čísel, podtržítek a "
|
||||
"pomlček."
|
||||
|
||||
#: core/validators.py:126 forms/fields.py:866
|
||||
#: core/validators.py:126 forms/fields.py:870
|
||||
msgid "Enter a valid IPv4 address."
|
||||
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)."
|
||||
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
|
||||
msgid "Ensure this value is less than or equal to %(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
|
||||
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."
|
||||
@ -4529,13 +4541,13 @@ msgstr ""
|
||||
"Hodnota smí mít nejvýše %(limit_value)d znaků, ale nyní jich má %(show_value)"
|
||||
"d."
|
||||
|
||||
#: db/models/base.py:822
|
||||
#: db/models/base.py:823
|
||||
#, python-format
|
||||
msgid "%(field_name)s must be unique for %(date_field)s %(lookup)s."
|
||||
msgstr ""
|
||||
"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
|
||||
msgid "%(model_name)s with this %(field_label)s already exists."
|
||||
msgstr ""
|
||||
@ -4559,13 +4571,13 @@ msgstr "Pole nemůže být prázdné."
|
||||
msgid "Field of type: %(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:961 db/models/fields/__init__.py:972
|
||||
#: db/models/fields/__init__.py:999
|
||||
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:860
|
||||
#: db/models/fields/__init__.py:969 db/models/fields/__init__.py:980
|
||||
#: db/models/fields/__init__.py:1007
|
||||
msgid "Integer"
|
||||
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."
|
||||
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)"
|
||||
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
|
||||
msgid "String (up to %(max_length)s)"
|
||||
msgstr "Řetězec (max. %(max_length)s znaků)"
|
||||
@ -4619,44 +4631,44 @@ msgstr "Desetinné číslo"
|
||||
msgid "E-mail address"
|
||||
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
|
||||
msgid "File path"
|
||||
msgstr "Cesta k souboru"
|
||||
|
||||
#: db/models/fields/__init__.py:822
|
||||
#: db/models/fields/__init__.py:830
|
||||
msgid "This value must be a float."
|
||||
msgstr "Hodnota musí být desetinné číslo."
|
||||
|
||||
#: db/models/fields/__init__.py:824
|
||||
#: db/models/fields/__init__.py:832
|
||||
msgid "Floating point number"
|
||||
msgstr "Číslo s pohyblivou řádovou čárkou"
|
||||
|
||||
#: db/models/fields/__init__.py:883
|
||||
#: db/models/fields/__init__.py:891
|
||||
msgid "Big (8 byte) integer"
|
||||
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."
|
||||
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)"
|
||||
msgstr "Pravdivost (buď Ano (True), Ne (False) nebo Nic (None))"
|
||||
|
||||
#: db/models/fields/__init__.py:1005
|
||||
#: db/models/fields/__init__.py:1013
|
||||
msgid "Text"
|
||||
msgstr "Text"
|
||||
|
||||
#: db/models/fields/__init__.py:1021
|
||||
#: db/models/fields/__init__.py:1029
|
||||
msgid "Time"
|
||||
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."
|
||||
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"
|
||||
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)"
|
||||
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"
|
||||
msgstr "Vazba jedna-jedna"
|
||||
|
||||
#: db/models/fields/related.py:980
|
||||
#: db/models/fields/related.py:981
|
||||
msgid "Many-to-many relationship"
|
||||
msgstr "Vazba mnoho-mnoho"
|
||||
|
||||
#: db/models/fields/related.py:1000
|
||||
#: db/models/fields/related.py:1001
|
||||
msgid ""
|
||||
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
|
||||
msgstr ""
|
||||
"Výběr více než jedné položky je možný přidržením klávesy \"Control\" (nebo "
|
||||
"\"Command\" na Macu)."
|
||||
|
||||
#: db/models/fields/related.py:1061
|
||||
#: db/models/fields/related.py:1062
|
||||
#, python-format
|
||||
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
|
||||
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."
|
||||
msgstr "Pole je povinné."
|
||||
|
||||
#: forms/fields.py:204
|
||||
#: forms/fields.py:203
|
||||
msgid "Enter a whole number."
|
||||
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."
|
||||
msgstr "Vložte číslo."
|
||||
|
||||
#: forms/fields.py:259
|
||||
#: forms/fields.py:258
|
||||
#, python-format
|
||||
msgid "Ensure that there are no more than %s digits in total."
|
||||
msgstr "Hodnota nesmí celkem mít více než %s cifer."
|
||||
|
||||
#: forms/fields.py:260
|
||||
#: forms/fields.py:259
|
||||
#, python-format
|
||||
msgid "Ensure that there are no more than %s decimal places."
|
||||
msgstr "Hodnota nesmí mít za desetinnou čárkou více než %s cifer."
|
||||
|
||||
#: forms/fields.py:261
|
||||
#: forms/fields.py:260
|
||||
#, python-format
|
||||
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."
|
||||
|
||||
#: forms/fields.py:323 forms/fields.py:838
|
||||
#: forms/fields.py:322 forms/fields.py:837
|
||||
msgid "Enter a valid date."
|
||||
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."
|
||||
msgstr "Vložte platný čas."
|
||||
|
||||
#: forms/fields.py:377
|
||||
#: forms/fields.py:376
|
||||
msgid "Enter a valid date/time."
|
||||
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."
|
||||
msgstr ""
|
||||
"Soubor nebyl odeslán. Zkontrolujte parametr \"encoding type\" formuláře."
|
||||
|
||||
#: forms/fields.py:436
|
||||
#: forms/fields.py:435
|
||||
msgid "No file was submitted."
|
||||
msgstr "Žádný soubor nebyl odeslán."
|
||||
|
||||
#: forms/fields.py:437
|
||||
#: forms/fields.py:436
|
||||
msgid "The submitted file is empty."
|
||||
msgstr "Odeslaný soubor je prázdný."
|
||||
|
||||
#: forms/fields.py:438
|
||||
#: forms/fields.py:437
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Ensure this filename has at most %(max)d characters (it has %(length)d)."
|
||||
msgstr ""
|
||||
"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 ""
|
||||
"Upload a valid image. The file you uploaded was either not an image or a "
|
||||
"corrupted image."
|
||||
msgstr ""
|
||||
"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
|
||||
msgid "Select a valid choice. %(value)s is not one of the available choices."
|
||||
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."
|
||||
msgstr "Vložte seznam hodnot."
|
||||
|
||||
|
Binary file not shown.
@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Django\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-05-09 14:30+0200\n"
|
||||
"PO-Revision-Date: 2010-05-09 14:04+0100\n"
|
||||
"POT-Creation-Date: 2010-08-06 18:35+0200\n"
|
||||
"PO-Revision-Date: 2010-08-06 18:34+0100\n"
|
||||
"Last-Translator: Vlada Macek <macek@sandbox.cz>\n"
|
||||
"Language-Team: Czech\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
Binary file not shown.
@ -6,9 +6,9 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Django\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-04-26 15:49+0200\n"
|
||||
"PO-Revision-Date: 2008-08-13 22:00+0200\n"
|
||||
"Last-Translator: Finn Gruwier Larsen<finn@gruwier.dk>\n"
|
||||
"POT-Creation-Date: 2010-08-07 11:57+0200\n"
|
||||
"PO-Revision-Date: 2010-08-07 22:00+0200\n"
|
||||
"Last-Translator: Finn Gruwier Larsen<finngruwierlarsen@gmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@ -44,13 +44,42 @@ msgstr "Foretag dit/dine valg og klik "
|
||||
msgid "Clear all"
|
||||
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
|
||||
msgid "%(sel)s of %(cnt)s selected"
|
||||
msgid_plural "%(sel)s of %(cnt)s selected"
|
||||
msgstr[0] "%(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/dateparse.js:32
|
||||
msgid ""
|
||||
|
Binary file not shown.
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Django\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"
|
||||
"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
|
||||
"Language-Team: \n"
|
||||
@ -72,7 +72,7 @@ msgid "Spanish"
|
||||
msgstr "Spanisch"
|
||||
|
||||
#: conf/global_settings.py:57
|
||||
msgid "Argentinean Spanish"
|
||||
msgid "Argentinian Spanish"
|
||||
msgstr "Argentinisches Spanisch"
|
||||
|
||||
#: conf/global_settings.py:58
|
||||
@ -168,98 +168,102 @@ msgid "Macedonian"
|
||||
msgstr "Mazedonisch"
|
||||
|
||||
#: conf/global_settings.py:81
|
||||
msgid "Malayalam"
|
||||
msgstr "Malayalam"
|
||||
|
||||
#: conf/global_settings.py:82
|
||||
msgid "Mongolian"
|
||||
msgstr "Mongolisch"
|
||||
|
||||
#: conf/global_settings.py:82
|
||||
#: conf/global_settings.py:83
|
||||
msgid "Dutch"
|
||||
msgstr "Holländisch"
|
||||
|
||||
#: conf/global_settings.py:83
|
||||
#: conf/global_settings.py:84
|
||||
msgid "Norwegian"
|
||||
msgstr "Norwegisch"
|
||||
|
||||
#: conf/global_settings.py:84
|
||||
#: conf/global_settings.py:85
|
||||
msgid "Norwegian Bokmal"
|
||||
msgstr "Norwegisch (Bokmål)"
|
||||
|
||||
#: conf/global_settings.py:85
|
||||
#: conf/global_settings.py:86
|
||||
msgid "Norwegian Nynorsk"
|
||||
msgstr "Norwegisch (Nynorsk)"
|
||||
|
||||
#: conf/global_settings.py:86
|
||||
#: conf/global_settings.py:87
|
||||
msgid "Polish"
|
||||
msgstr "Polnisch"
|
||||
|
||||
#: conf/global_settings.py:87
|
||||
#: conf/global_settings.py:88
|
||||
msgid "Portuguese"
|
||||
msgstr "Portugiesisch"
|
||||
|
||||
#: conf/global_settings.py:88
|
||||
#: conf/global_settings.py:89
|
||||
msgid "Brazilian Portuguese"
|
||||
msgstr "Brasilianisches Portugiesisch"
|
||||
|
||||
#: conf/global_settings.py:89
|
||||
#: conf/global_settings.py:90
|
||||
msgid "Romanian"
|
||||
msgstr "Rumänisch"
|
||||
|
||||
#: conf/global_settings.py:90
|
||||
#: conf/global_settings.py:91
|
||||
msgid "Russian"
|
||||
msgstr "Russisch"
|
||||
|
||||
#: conf/global_settings.py:91
|
||||
#: conf/global_settings.py:92
|
||||
msgid "Slovak"
|
||||
msgstr "Slowakisch"
|
||||
|
||||
#: conf/global_settings.py:92
|
||||
#: conf/global_settings.py:93
|
||||
msgid "Slovenian"
|
||||
msgstr "Slowenisch"
|
||||
|
||||
#: conf/global_settings.py:93
|
||||
#: conf/global_settings.py:94
|
||||
msgid "Albanian"
|
||||
msgstr "Albanisch"
|
||||
|
||||
#: conf/global_settings.py:94
|
||||
#: conf/global_settings.py:95
|
||||
msgid "Serbian"
|
||||
msgstr "Serbisch"
|
||||
|
||||
#: conf/global_settings.py:95
|
||||
#: conf/global_settings.py:96
|
||||
msgid "Serbian Latin"
|
||||
msgstr "Serbisch (Latein)"
|
||||
|
||||
#: conf/global_settings.py:96
|
||||
#: conf/global_settings.py:97
|
||||
msgid "Swedish"
|
||||
msgstr "Schwedisch"
|
||||
|
||||
#: conf/global_settings.py:97
|
||||
#: conf/global_settings.py:98
|
||||
msgid "Tamil"
|
||||
msgstr "Tamilisch"
|
||||
|
||||
#: conf/global_settings.py:98
|
||||
#: conf/global_settings.py:99
|
||||
msgid "Telugu"
|
||||
msgstr "Telugisch"
|
||||
|
||||
#: conf/global_settings.py:99
|
||||
#: conf/global_settings.py:100
|
||||
msgid "Thai"
|
||||
msgstr "Thailändisch"
|
||||
|
||||
#: conf/global_settings.py:100
|
||||
#: conf/global_settings.py:101
|
||||
msgid "Turkish"
|
||||
msgstr "Türkisch"
|
||||
|
||||
#: conf/global_settings.py:101
|
||||
#: conf/global_settings.py:102
|
||||
msgid "Ukrainian"
|
||||
msgstr "Ukrainisch"
|
||||
|
||||
#: conf/global_settings.py:102
|
||||
#: conf/global_settings.py:103
|
||||
msgid "Vietnamese"
|
||||
msgstr "Vietnamesisch"
|
||||
|
||||
#: conf/global_settings.py:103
|
||||
#: conf/global_settings.py:104
|
||||
msgid "Simplified Chinese"
|
||||
msgstr "Vereinfachtes Chinesisch"
|
||||
|
||||
#: conf/global_settings.py:104
|
||||
#: conf/global_settings.py:105
|
||||
msgid "Traditional Chinese"
|
||||
msgstr "Traditionelles Chinesisch"
|
||||
|
||||
@ -311,15 +315,15 @@ msgstr "Diesen Monat"
|
||||
msgid "This year"
|
||||
msgstr "Dieses Jahr"
|
||||
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
|
||||
msgid "Yes"
|
||||
msgstr "Ja"
|
||||
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
|
||||
msgid "No"
|
||||
msgstr "Nein"
|
||||
|
||||
#: contrib/admin/filterspecs.py:154 forms/widgets.py:469
|
||||
#: contrib/admin/filterspecs.py:154 forms/widgets.py:478
|
||||
msgid "Unknown"
|
||||
msgstr "Unbekannt"
|
||||
|
||||
@ -696,7 +700,7 @@ msgid "Filter"
|
||||
msgstr "Filter"
|
||||
|
||||
#: 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"
|
||||
msgstr "Löschen"
|
||||
|
||||
@ -859,7 +863,7 @@ msgstr "Sichern und neu hinzufügen"
|
||||
msgid "Save and continue editing"
|
||||
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 ""
|
||||
"First, enter a username and password. Then, you'll be able to edit more user "
|
||||
"options."
|
||||
@ -867,6 +871,10 @@ msgstr ""
|
||||
"Zuerst einen Benutzer und ein Passwort eingeben. Danach können weitere "
|
||||
"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
|
||||
#, python-format
|
||||
msgid "Enter a new password for the user <strong>%(username)s</strong>."
|
||||
@ -1437,8 +1445,8 @@ msgstr "Mitteilung"
|
||||
msgid "Logged out"
|
||||
msgstr "Abgemeldet"
|
||||
|
||||
#: contrib/auth/management/commands/createsuperuser.py:23
|
||||
#: core/validators.py:120 forms/fields.py:428
|
||||
#: contrib/auth/management/commands/createsuperuser.py:24
|
||||
#: core/validators.py:120 forms/fields.py:427
|
||||
msgid "Enter a valid e-mail address."
|
||||
msgstr "Bitte eine gültige E-Mail-Adresse eingeben."
|
||||
|
||||
@ -1506,7 +1514,7 @@ msgid "Email address"
|
||||
msgstr "E-Mail-Adresse"
|
||||
|
||||
#: 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"
|
||||
msgstr "Adresse (URL)"
|
||||
|
||||
@ -1557,7 +1565,7 @@ msgstr "Kommentar"
|
||||
msgid "date/time submitted"
|
||||
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"
|
||||
msgstr "IP-Adresse"
|
||||
|
||||
@ -4509,22 +4517,22 @@ msgstr "Sites"
|
||||
msgid "Enter a valid value."
|
||||
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."
|
||||
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."
|
||||
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 ""
|
||||
"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
|
||||
msgstr ""
|
||||
"Bitte ein gültiges Kürzel, bestehend aus Buchstaben, Ziffern, Unterstrichen "
|
||||
"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."
|
||||
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)"
|
||||
"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
|
||||
msgid "Ensure this value is less than or equal to %(limit_value)s."
|
||||
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
|
||||
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."
|
||||
@ -4595,13 +4603,13 @@ msgstr "Dieses Feld darf nicht leer sein."
|
||||
msgid "Field of type: %(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:961 db/models/fields/__init__.py:972
|
||||
#: db/models/fields/__init__.py:999
|
||||
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:860
|
||||
#: db/models/fields/__init__.py:969 db/models/fields/__init__.py:980
|
||||
#: db/models/fields/__init__.py:1007
|
||||
msgid "Integer"
|
||||
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."
|
||||
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)"
|
||||
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
|
||||
msgid "String (up to %(max_length)s)"
|
||||
msgstr "Zeichenkette (bis zu %(max_length)s Zeichen)"
|
||||
@ -4657,44 +4665,44 @@ msgstr "Dezimalzahl"
|
||||
msgid "E-mail address"
|
||||
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
|
||||
msgid "File path"
|
||||
msgstr "Dateipfad"
|
||||
|
||||
#: db/models/fields/__init__.py:822
|
||||
#: db/models/fields/__init__.py:830
|
||||
msgid "This value must be a float."
|
||||
msgstr "Dieser Wert muss eine Gleitkommazahl sein."
|
||||
|
||||
#: db/models/fields/__init__.py:824
|
||||
#: db/models/fields/__init__.py:832
|
||||
msgid "Floating point number"
|
||||
msgstr "Gleitkommazahl"
|
||||
|
||||
#: db/models/fields/__init__.py:883
|
||||
#: db/models/fields/__init__.py:891
|
||||
msgid "Big (8 byte) integer"
|
||||
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."
|
||||
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)"
|
||||
msgstr "Boolescher Wert (True, False oder None)"
|
||||
|
||||
#: db/models/fields/__init__.py:1005
|
||||
#: db/models/fields/__init__.py:1013
|
||||
msgid "Text"
|
||||
msgstr "Text"
|
||||
|
||||
#: db/models/fields/__init__.py:1021
|
||||
#: db/models/fields/__init__.py:1029
|
||||
msgid "Time"
|
||||
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."
|
||||
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"
|
||||
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)"
|
||||
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"
|
||||
msgstr "One-to-one-Beziehung"
|
||||
|
||||
#: db/models/fields/related.py:980
|
||||
#: db/models/fields/related.py:981
|
||||
msgid "Many-to-many relationship"
|
||||
msgstr "Many-to-many-Beziehung"
|
||||
|
||||
#: db/models/fields/related.py:1000
|
||||
#: db/models/fields/related.py:1001
|
||||
msgid ""
|
||||
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
|
||||
msgstr ""
|
||||
"Halten Sie die Strg-Taste (⌘ für Mac) während des Klickens gedrückt, um "
|
||||
"mehrere Einträge auszuwählen."
|
||||
|
||||
#: db/models/fields/related.py:1061
|
||||
#: db/models/fields/related.py:1062
|
||||
#, python-format
|
||||
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
|
||||
msgid_plural ""
|
||||
@ -4736,55 +4744,55 @@ msgstr[1] ""
|
||||
msgid "This field is required."
|
||||
msgstr "Dieses Feld ist zwingend erforderlich."
|
||||
|
||||
#: forms/fields.py:204
|
||||
#: forms/fields.py:203
|
||||
msgid "Enter a whole number."
|
||||
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."
|
||||
msgstr "Bitte eine Zahl eingeben."
|
||||
|
||||
#: forms/fields.py:259
|
||||
#: forms/fields.py:258
|
||||
#, python-format
|
||||
msgid "Ensure that there are no more than %s digits in total."
|
||||
msgstr "Bitte geben Sie nicht mehr als insgesamt %s Ziffern ein."
|
||||
|
||||
#: forms/fields.py:260
|
||||
#: forms/fields.py:259
|
||||
#, python-format
|
||||
msgid "Ensure that there are no more than %s decimal places."
|
||||
msgstr "Bitte geben Sie nicht mehr als %s Dezimalstellen ein."
|
||||
|
||||
#: forms/fields.py:261
|
||||
#: forms/fields.py:260
|
||||
#, python-format
|
||||
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."
|
||||
|
||||
#: forms/fields.py:323 forms/fields.py:838
|
||||
#: forms/fields.py:322 forms/fields.py:837
|
||||
msgid "Enter a valid date."
|
||||
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."
|
||||
msgstr "Bitte eine gültige Uhrzeit eingeben."
|
||||
|
||||
#: forms/fields.py:377
|
||||
#: forms/fields.py:376
|
||||
msgid "Enter a valid date/time."
|
||||
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."
|
||||
msgstr ""
|
||||
"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."
|
||||
msgstr "Es wurde keine Datei übertragen."
|
||||
|
||||
#: forms/fields.py:437
|
||||
#: forms/fields.py:436
|
||||
msgid "The submitted file is empty."
|
||||
msgstr "Die ausgewählte Datei ist leer."
|
||||
|
||||
#: forms/fields.py:438
|
||||
#: forms/fields.py:437
|
||||
#, python-format
|
||||
msgid ""
|
||||
"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 "
|
||||
"%(length)d)."
|
||||
|
||||
#: forms/fields.py:473
|
||||
#: forms/fields.py:472
|
||||
msgid ""
|
||||
"Upload a valid image. The file you uploaded was either not an image or a "
|
||||
"corrupted image."
|
||||
@ -4800,17 +4808,17 @@ msgstr ""
|
||||
"Bitte ein Bild hochladen. Die hochgeladene Datei ist kein Bild oder ist "
|
||||
"defekt."
|
||||
|
||||
#: forms/fields.py:596 forms/fields.py:671
|
||||
#: forms/fields.py:595 forms/fields.py:670
|
||||
#, python-format
|
||||
msgid "Select a valid choice. %(value)s is not one of the available choices."
|
||||
msgstr ""
|
||||
"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."
|
||||
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"
|
||||
msgstr "Reihenfolge"
|
||||
|
||||
|
Binary file not shown.
@ -6,8 +6,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Django\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-05-11 08:35-0300\n"
|
||||
"PO-Revision-Date: 2010-05-17 10:52-0300\n"
|
||||
"POT-Creation-Date: 2010-08-06 15:38-0300\n"
|
||||
"PO-Revision-Date: 2010-08-11 09:00-0300\n"
|
||||
"Last-Translator: Ramiro <rm0@gmx.net>\n"
|
||||
"Language-Team: Django-I18N <django-i18n@googlegroups.com>\n"
|
||||
"Language: es_AR\n"
|
||||
@ -70,7 +70,7 @@ msgid "Spanish"
|
||||
msgstr "español"
|
||||
|
||||
#: conf/global_settings.py:57
|
||||
msgid "Argentinean Spanish"
|
||||
msgid "Argentinian Spanish"
|
||||
msgstr "español de Argentina"
|
||||
|
||||
#: conf/global_settings.py:58
|
||||
@ -166,98 +166,102 @@ msgid "Macedonian"
|
||||
msgstr "macedonio"
|
||||
|
||||
#: conf/global_settings.py:81
|
||||
msgid "Malayalam"
|
||||
msgstr "Malayalam"
|
||||
|
||||
#: conf/global_settings.py:82
|
||||
msgid "Mongolian"
|
||||
msgstr "mongol"
|
||||
|
||||
#: conf/global_settings.py:82
|
||||
#: conf/global_settings.py:83
|
||||
msgid "Dutch"
|
||||
msgstr "holandés"
|
||||
|
||||
#: conf/global_settings.py:83
|
||||
#: conf/global_settings.py:84
|
||||
msgid "Norwegian"
|
||||
msgstr "noruego"
|
||||
|
||||
#: conf/global_settings.py:84
|
||||
#: conf/global_settings.py:85
|
||||
msgid "Norwegian Bokmal"
|
||||
msgstr "bokmål"
|
||||
|
||||
#: conf/global_settings.py:85
|
||||
#: conf/global_settings.py:86
|
||||
msgid "Norwegian Nynorsk"
|
||||
msgstr "nynorsk"
|
||||
|
||||
#: conf/global_settings.py:86
|
||||
#: conf/global_settings.py:87
|
||||
msgid "Polish"
|
||||
msgstr "polaco"
|
||||
|
||||
#: conf/global_settings.py:87
|
||||
#: conf/global_settings.py:88
|
||||
msgid "Portuguese"
|
||||
msgstr "portugués"
|
||||
|
||||
#: conf/global_settings.py:88
|
||||
#: conf/global_settings.py:89
|
||||
msgid "Brazilian Portuguese"
|
||||
msgstr "portugués de Brasil"
|
||||
|
||||
#: conf/global_settings.py:89
|
||||
#: conf/global_settings.py:90
|
||||
msgid "Romanian"
|
||||
msgstr "rumano"
|
||||
|
||||
#: conf/global_settings.py:90
|
||||
#: conf/global_settings.py:91
|
||||
msgid "Russian"
|
||||
msgstr "ruso"
|
||||
|
||||
#: conf/global_settings.py:91
|
||||
#: conf/global_settings.py:92
|
||||
msgid "Slovak"
|
||||
msgstr "eslovaco"
|
||||
|
||||
#: conf/global_settings.py:92
|
||||
#: conf/global_settings.py:93
|
||||
msgid "Slovenian"
|
||||
msgstr "esloveno"
|
||||
|
||||
#: conf/global_settings.py:93
|
||||
#: conf/global_settings.py:94
|
||||
msgid "Albanian"
|
||||
msgstr "albanés"
|
||||
|
||||
#: conf/global_settings.py:94
|
||||
#: conf/global_settings.py:95
|
||||
msgid "Serbian"
|
||||
msgstr "serbio"
|
||||
|
||||
#: conf/global_settings.py:95
|
||||
#: conf/global_settings.py:96
|
||||
msgid "Serbian Latin"
|
||||
msgstr "Latín de Serbia"
|
||||
|
||||
#: conf/global_settings.py:96
|
||||
#: conf/global_settings.py:97
|
||||
msgid "Swedish"
|
||||
msgstr "sueco"
|
||||
|
||||
#: conf/global_settings.py:97
|
||||
#: conf/global_settings.py:98
|
||||
msgid "Tamil"
|
||||
msgstr "tamil"
|
||||
|
||||
#: conf/global_settings.py:98
|
||||
#: conf/global_settings.py:99
|
||||
msgid "Telugu"
|
||||
msgstr "telugu"
|
||||
|
||||
#: conf/global_settings.py:99
|
||||
#: conf/global_settings.py:100
|
||||
msgid "Thai"
|
||||
msgstr "tailandés"
|
||||
|
||||
#: conf/global_settings.py:100
|
||||
#: conf/global_settings.py:101
|
||||
msgid "Turkish"
|
||||
msgstr "turco"
|
||||
|
||||
#: conf/global_settings.py:101
|
||||
#: conf/global_settings.py:102
|
||||
msgid "Ukrainian"
|
||||
msgstr "ucraniano"
|
||||
|
||||
#: conf/global_settings.py:102
|
||||
#: conf/global_settings.py:103
|
||||
msgid "Vietnamese"
|
||||
msgstr "vietnamita"
|
||||
|
||||
#: conf/global_settings.py:103
|
||||
#: conf/global_settings.py:104
|
||||
msgid "Simplified Chinese"
|
||||
msgstr "chino simplificado"
|
||||
|
||||
#: conf/global_settings.py:104
|
||||
#: conf/global_settings.py:105
|
||||
msgid "Traditional Chinese"
|
||||
msgstr "chino tradicional"
|
||||
|
||||
@ -309,15 +313,15 @@ msgstr "Este mes"
|
||||
msgid "This year"
|
||||
msgstr "Este año"
|
||||
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
|
||||
msgid "Yes"
|
||||
msgstr "Sí"
|
||||
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
|
||||
msgid "No"
|
||||
msgstr "No"
|
||||
|
||||
#: contrib/admin/filterspecs.py:154 forms/widgets.py:469
|
||||
#: contrib/admin/filterspecs.py:154 forms/widgets.py:478
|
||||
msgid "Unknown"
|
||||
msgstr "Desconocido"
|
||||
|
||||
@ -363,7 +367,7 @@ msgid "Changed %s."
|
||||
msgstr "Modifica %s."
|
||||
|
||||
#: 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
|
||||
msgid "and"
|
||||
msgstr "y"
|
||||
@ -692,7 +696,7 @@ msgid "Filter"
|
||||
msgstr "Filtrar"
|
||||
|
||||
#: 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"
|
||||
msgstr "Eliminar"
|
||||
|
||||
@ -855,13 +859,17 @@ msgstr "Guardar y agregar otro"
|
||||
msgid "Save and continue editing"
|
||||
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 ""
|
||||
"First, enter a username and password. Then, you'll be able to edit more user "
|
||||
"options."
|
||||
msgstr ""
|
||||
"Primero, introduzca un nombre de usuario y una contraseña. Luego podrá "
|
||||
"configurar opciones adicionales."
|
||||
"Primero introduzca un nombre de usuario y una contraseña. Luego podrá "
|
||||
"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
|
||||
#, python-format
|
||||
@ -873,7 +881,7 @@ msgstr ""
|
||||
#: 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
|
||||
msgid "Password"
|
||||
msgstr "Contraseña:"
|
||||
msgstr "Contraseña"
|
||||
|
||||
#: contrib/admin/templates/admin/auth/user/change_password.html:41
|
||||
#: 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
|
||||
msgid "Username"
|
||||
msgstr "Nombre de usuario:"
|
||||
msgstr "Nombre de usuario"
|
||||
|
||||
#: contrib/auth/forms.py:15 contrib/auth/forms.py:49
|
||||
msgid "Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only."
|
||||
@ -1435,8 +1443,8 @@ msgstr "mensaje"
|
||||
msgid "Logged out"
|
||||
msgstr "Sesión cerrada"
|
||||
|
||||
#: contrib/auth/management/commands/createsuperuser.py:23
|
||||
#: core/validators.py:120 forms/fields.py:428
|
||||
#: contrib/auth/management/commands/createsuperuser.py:24
|
||||
#: core/validators.py:120 forms/fields.py:427
|
||||
msgid "Enter a valid e-mail address."
|
||||
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"
|
||||
|
||||
#: 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"
|
||||
msgstr "URL"
|
||||
|
||||
@ -1553,7 +1561,7 @@ msgstr "comentario"
|
||||
msgid "date/time submitted"
|
||||
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"
|
||||
msgstr "Dirección IP"
|
||||
|
||||
@ -4503,20 +4511,20 @@ msgstr "sitios"
|
||||
msgid "Enter a valid value."
|
||||
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."
|
||||
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."
|
||||
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 ""
|
||||
"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
|
||||
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."
|
||||
msgstr "Introduzca una dirección IPv4 válida"
|
||||
|
||||
@ -4528,15 +4536,15 @@ msgstr "Introduzca sólo dígitos separados por comas."
|
||||
#, python-format
|
||||
msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)."
|
||||
msgstr ""
|
||||
"Asegúrese de que este valor sea %(limit_value)s (actualmente es %(show_value)"
|
||||
"s)."
|
||||
"Asegúrese de que este valor sea %(limit_value)s (actualmente es "
|
||||
"%(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
|
||||
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."
|
||||
|
||||
#: 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
|
||||
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."
|
||||
@ -4544,8 +4552,8 @@ msgstr "Asegúrese de que este valor sea mayor o igual a %(limit_value)s."
|
||||
#: core/validators.py:164
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Ensure this value has at least %(limit_value)d characters (it has %"
|
||||
"(show_value)d)."
|
||||
"Ensure this value has at least %(limit_value)d characters (it has "
|
||||
"%(show_value)d)."
|
||||
msgstr ""
|
||||
"Asegúrese de que este valor tenga al menos %(limit_value)d caracteres (tiene "
|
||||
"%(show_value)d)."
|
||||
@ -4553,20 +4561,20 @@ msgstr ""
|
||||
#: core/validators.py:170
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Ensure this value has at most %(limit_value)d characters (it has %"
|
||||
"(show_value)d)."
|
||||
"Ensure this value has at most %(limit_value)d characters (it has "
|
||||
"%(show_value)d)."
|
||||
msgstr ""
|
||||
"Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres "
|
||||
"(tiene %(show_value)d)."
|
||||
|
||||
#: db/models/base.py:822
|
||||
#: db/models/base.py:823
|
||||
#, python-format
|
||||
msgid "%(field_name)s must be unique for %(date_field)s %(lookup)s."
|
||||
msgstr ""
|
||||
"%(field_name)s debe ser único/a para un %(lookup)s %(date_field)s "
|
||||
"determinado."
|
||||
|
||||
#: db/models/base.py:837 db/models/base.py:845
|
||||
#: db/models/base.py:838 db/models/base.py:846
|
||||
#, python-format
|
||||
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."
|
||||
@ -4589,13 +4597,13 @@ msgstr "Este campo no puede estar en blanco."
|
||||
msgid "Field of type: %(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:961 db/models/fields/__init__.py:972
|
||||
#: db/models/fields/__init__.py:999
|
||||
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:860
|
||||
#: db/models/fields/__init__.py:969 db/models/fields/__init__.py:980
|
||||
#: db/models/fields/__init__.py:1007
|
||||
msgid "Integer"
|
||||
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."
|
||||
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)"
|
||||
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
|
||||
msgid "String (up to %(max_length)s)"
|
||||
msgstr "Cadena (máximo %(max_length)s)"
|
||||
@ -4651,44 +4659,44 @@ msgstr "Número decimal"
|
||||
msgid "E-mail address"
|
||||
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
|
||||
msgid "File path"
|
||||
msgstr "Ruta de archivo"
|
||||
|
||||
#: db/models/fields/__init__.py:822
|
||||
#: db/models/fields/__init__.py:830
|
||||
msgid "This value must be a float."
|
||||
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"
|
||||
msgstr "Número de punto flotante"
|
||||
|
||||
#: db/models/fields/__init__.py:883
|
||||
#: db/models/fields/__init__.py:891
|
||||
msgid "Big (8 byte) integer"
|
||||
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."
|
||||
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)"
|
||||
msgstr "Booleano (Verdadero, Falso o Nulo)"
|
||||
|
||||
#: db/models/fields/__init__.py:1005
|
||||
#: db/models/fields/__init__.py:1013
|
||||
msgid "Text"
|
||||
msgstr "Texto"
|
||||
|
||||
#: db/models/fields/__init__.py:1021
|
||||
#: db/models/fields/__init__.py:1029
|
||||
msgid "Time"
|
||||
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."
|
||||
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"
|
||||
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)"
|
||||
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"
|
||||
msgstr "Relación uno-a-uno"
|
||||
|
||||
#: db/models/fields/related.py:980
|
||||
#: db/models/fields/related.py:981
|
||||
msgid "Many-to-many relationship"
|
||||
msgstr "Relación muchos-a-muchos"
|
||||
|
||||
#: db/models/fields/related.py:1000
|
||||
#: db/models/fields/related.py:1001
|
||||
msgid ""
|
||||
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
|
||||
msgstr ""
|
||||
"Mantenga presionada \"Control\" (\"Command\" en una Mac) para seleccionar "
|
||||
"más de uno."
|
||||
|
||||
#: db/models/fields/related.py:1061
|
||||
#: db/models/fields/related.py:1062
|
||||
#, python-format
|
||||
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
|
||||
msgid_plural ""
|
||||
@ -4732,55 +4740,55 @@ msgstr[1] ""
|
||||
msgid "This field is required."
|
||||
msgstr "Este campo es obligatorio."
|
||||
|
||||
#: forms/fields.py:204
|
||||
#: forms/fields.py:203
|
||||
msgid "Enter a whole number."
|
||||
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."
|
||||
msgstr "Introduzca un número."
|
||||
|
||||
#: forms/fields.py:259
|
||||
#: forms/fields.py:258
|
||||
#, python-format
|
||||
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."
|
||||
|
||||
#: forms/fields.py:260
|
||||
#: forms/fields.py:259
|
||||
#, python-format
|
||||
msgid "Ensure that there are no more than %s decimal places."
|
||||
msgstr "Asegúrese de que no existan mas de %s lugares decimales."
|
||||
|
||||
#: forms/fields.py:261
|
||||
#: forms/fields.py:260
|
||||
#, python-format
|
||||
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."
|
||||
|
||||
#: forms/fields.py:323 forms/fields.py:838
|
||||
#: forms/fields.py:322 forms/fields.py:837
|
||||
msgid "Enter a valid date."
|
||||
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."
|
||||
msgstr "Introduzca un valor de hora válido."
|
||||
|
||||
#: forms/fields.py:377
|
||||
#: forms/fields.py:376
|
||||
msgid "Enter a valid date/time."
|
||||
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."
|
||||
msgstr ""
|
||||
"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."
|
||||
msgstr "No se envió ningún archivo."
|
||||
|
||||
#: forms/fields.py:437
|
||||
#: forms/fields.py:436
|
||||
msgid "The submitted file is empty."
|
||||
msgstr "El archivo enviado está vacío."
|
||||
|
||||
#: forms/fields.py:438
|
||||
#: forms/fields.py:437
|
||||
#, python-format
|
||||
msgid ""
|
||||
"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 "
|
||||
"(tiene %(length)d)."
|
||||
|
||||
#: forms/fields.py:473
|
||||
#: forms/fields.py:472
|
||||
msgid ""
|
||||
"Upload a valid image. The file you uploaded was either not an image or a "
|
||||
"corrupted image."
|
||||
@ -4796,18 +4804,18 @@ msgstr ""
|
||||
"Seleccione una imagen válida. El archivo que ha seleccionado no es una "
|
||||
"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
|
||||
msgid "Select a valid choice. %(value)s is not one of the available choices."
|
||||
msgstr ""
|
||||
"Seleccione una opción válida. %(value)s no es una de las opciones "
|
||||
"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."
|
||||
msgstr "Introduzca una lista de valores."
|
||||
|
||||
#: forms/formsets.py:298 forms/formsets.py:300
|
||||
#: forms/formsets.py:296 forms/formsets.py:298
|
||||
msgid "Order"
|
||||
msgstr "Ordenar"
|
||||
|
||||
|
Binary file not shown.
@ -6,8 +6,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Django\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-05-04 22:01-0300\n"
|
||||
"PO-Revision-Date: 2010-05-04 22:10-0300\n"
|
||||
"POT-Creation-Date: 2010-08-06 15:47-0300\n"
|
||||
"PO-Revision-Date: 2010-08-06 15:52-0300\n"
|
||||
"Last-Translator: Ramiro Morales <rm0@gmx.net>\n"
|
||||
"Language-Team: Django-I18N <django-i18n@googlegroups.com>\n"
|
||||
"Language: es_AR\n"
|
||||
@ -17,45 +17,17 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n != 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
|
||||
msgid "Clear all"
|
||||
msgstr "Eliminar todos"
|
||||
|
||||
#: 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] "%(sel)s de %(cnt)s seleccionado/a"
|
||||
msgstr[1] "%(sel)s de %(cnt)s seleccionados/as"
|
||||
|
||||
#: 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."
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -10,9 +10,9 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Django\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-05-14 11:01+0200\n"
|
||||
"PO-Revision-Date: 2010-04-17 00:18+0200\n"
|
||||
"Last-Translator: David Larlet <http://larlet.fr>\n"
|
||||
"POT-Creation-Date: 2010-08-09 12:11+0200\n"
|
||||
"PO-Revision-Date: 2010-08-09 14:38+0200\n"
|
||||
"Last-Translator: Stéphane Raimbault <stephane.raimbault@gmail.com>\n"
|
||||
"Language-Team: French <http://django-fr.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@ -72,7 +72,7 @@ msgid "Spanish"
|
||||
msgstr "Espagnol"
|
||||
|
||||
#: conf/global_settings.py:57
|
||||
msgid "Argentinean Spanish"
|
||||
msgid "Argentinian Spanish"
|
||||
msgstr "Espagnol argentin"
|
||||
|
||||
#: conf/global_settings.py:58
|
||||
@ -168,98 +168,102 @@ msgid "Macedonian"
|
||||
msgstr "Macédonien"
|
||||
|
||||
#: conf/global_settings.py:81
|
||||
msgid "Malayalam"
|
||||
msgstr "Malayâlam"
|
||||
|
||||
#: conf/global_settings.py:82
|
||||
msgid "Mongolian"
|
||||
msgstr "Mongole"
|
||||
|
||||
#: conf/global_settings.py:82
|
||||
#: conf/global_settings.py:83
|
||||
msgid "Dutch"
|
||||
msgstr "Hollandais"
|
||||
|
||||
#: conf/global_settings.py:83
|
||||
#: conf/global_settings.py:84
|
||||
msgid "Norwegian"
|
||||
msgstr "Norvégien"
|
||||
|
||||
#: conf/global_settings.py:84
|
||||
#: conf/global_settings.py:85
|
||||
msgid "Norwegian Bokmal"
|
||||
msgstr "Norvégien Bokmal"
|
||||
|
||||
#: conf/global_settings.py:85
|
||||
#: conf/global_settings.py:86
|
||||
msgid "Norwegian Nynorsk"
|
||||
msgstr "Norvégien Nynorsk"
|
||||
|
||||
#: conf/global_settings.py:86
|
||||
#: conf/global_settings.py:87
|
||||
msgid "Polish"
|
||||
msgstr "Polonais"
|
||||
|
||||
#: conf/global_settings.py:87
|
||||
#: conf/global_settings.py:88
|
||||
msgid "Portuguese"
|
||||
msgstr "Portugais"
|
||||
|
||||
#: conf/global_settings.py:88
|
||||
#: conf/global_settings.py:89
|
||||
msgid "Brazilian Portuguese"
|
||||
msgstr "Portugais brésilien"
|
||||
|
||||
#: conf/global_settings.py:89
|
||||
#: conf/global_settings.py:90
|
||||
msgid "Romanian"
|
||||
msgstr "Roumain"
|
||||
|
||||
#: conf/global_settings.py:90
|
||||
#: conf/global_settings.py:91
|
||||
msgid "Russian"
|
||||
msgstr "Russe"
|
||||
|
||||
#: conf/global_settings.py:91
|
||||
#: conf/global_settings.py:92
|
||||
msgid "Slovak"
|
||||
msgstr "Slovaque"
|
||||
|
||||
#: conf/global_settings.py:92
|
||||
#: conf/global_settings.py:93
|
||||
msgid "Slovenian"
|
||||
msgstr "Slovène"
|
||||
|
||||
#: conf/global_settings.py:93
|
||||
#: conf/global_settings.py:94
|
||||
msgid "Albanian"
|
||||
msgstr "Albanais"
|
||||
|
||||
#: conf/global_settings.py:94
|
||||
#: conf/global_settings.py:95
|
||||
msgid "Serbian"
|
||||
msgstr "Serbe"
|
||||
|
||||
#: conf/global_settings.py:95
|
||||
#: conf/global_settings.py:96
|
||||
msgid "Serbian Latin"
|
||||
msgstr "Serbe latin"
|
||||
|
||||
#: conf/global_settings.py:96
|
||||
#: conf/global_settings.py:97
|
||||
msgid "Swedish"
|
||||
msgstr "Suédois"
|
||||
|
||||
#: conf/global_settings.py:97
|
||||
#: conf/global_settings.py:98
|
||||
msgid "Tamil"
|
||||
msgstr "Tamoul"
|
||||
|
||||
#: conf/global_settings.py:98
|
||||
#: conf/global_settings.py:99
|
||||
msgid "Telugu"
|
||||
msgstr "Télougou"
|
||||
|
||||
#: conf/global_settings.py:99
|
||||
#: conf/global_settings.py:100
|
||||
msgid "Thai"
|
||||
msgstr "Thaï"
|
||||
|
||||
#: conf/global_settings.py:100
|
||||
#: conf/global_settings.py:101
|
||||
msgid "Turkish"
|
||||
msgstr "Turc"
|
||||
|
||||
#: conf/global_settings.py:101
|
||||
#: conf/global_settings.py:102
|
||||
msgid "Ukrainian"
|
||||
msgstr "Ukrainien"
|
||||
|
||||
#: conf/global_settings.py:102
|
||||
#: conf/global_settings.py:103
|
||||
msgid "Vietnamese"
|
||||
msgstr "Vietnamien"
|
||||
|
||||
#: conf/global_settings.py:103
|
||||
#: conf/global_settings.py:104
|
||||
msgid "Simplified Chinese"
|
||||
msgstr "Chinois simplifié"
|
||||
|
||||
#: conf/global_settings.py:104
|
||||
#: conf/global_settings.py:105
|
||||
msgid "Traditional Chinese"
|
||||
msgstr "Chinois traditionnel"
|
||||
|
||||
@ -311,15 +315,15 @@ msgstr "Ce mois-ci"
|
||||
msgid "This year"
|
||||
msgstr "Cette année"
|
||||
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
|
||||
msgid "Yes"
|
||||
msgstr "Oui"
|
||||
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
|
||||
msgid "No"
|
||||
msgstr "Non"
|
||||
|
||||
#: contrib/admin/filterspecs.py:154 forms/widgets.py:469
|
||||
#: contrib/admin/filterspecs.py:154 forms/widgets.py:478
|
||||
msgid "Unknown"
|
||||
msgstr "Inconnu"
|
||||
|
||||
@ -697,7 +701,7 @@ msgid "Filter"
|
||||
msgstr "Filtre"
|
||||
|
||||
#: 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"
|
||||
msgstr "Supprimer"
|
||||
|
||||
@ -796,7 +800,7 @@ msgstr ""
|
||||
|
||||
#: contrib/admin/templates/admin/login.html:19
|
||||
msgid "Username:"
|
||||
msgstr "Nom d'utilisateur :"
|
||||
msgstr "Nom d'utilisateur :"
|
||||
|
||||
#: contrib/admin/templates/admin/login.html:22
|
||||
msgid "Password:"
|
||||
@ -859,7 +863,7 @@ msgstr "Enregistrer et ajouter un nouveau"
|
||||
msgid "Save and continue editing"
|
||||
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 ""
|
||||
"First, enter a username and password. Then, you'll be able to edit more user "
|
||||
"options."
|
||||
@ -867,6 +871,10 @@ msgstr ""
|
||||
"Saisissez tout d'abord un nom d'utilisateur et un mot de passe. Vous pourrez "
|
||||
"ensuite modifier plus d'options."
|
||||
|
||||
#: contrib/admin/templates/admin/auth/user/add_form.html: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
|
||||
#, python-format
|
||||
msgid "Enter a new password for the user <strong>%(username)s</strong>."
|
||||
@ -1441,8 +1449,8 @@ msgstr "message"
|
||||
msgid "Logged out"
|
||||
msgstr "Déconnecté"
|
||||
|
||||
#: contrib/auth/management/commands/createsuperuser.py:23
|
||||
#: core/validators.py:120 forms/fields.py:428
|
||||
#: contrib/auth/management/commands/createsuperuser.py:24
|
||||
#: core/validators.py:120 forms/fields.py:427
|
||||
msgid "Enter a valid e-mail address."
|
||||
msgstr "Entrez une adresse de courriel valide."
|
||||
|
||||
@ -1511,7 +1519,7 @@ msgid "Email address"
|
||||
msgstr "Adresse électronique"
|
||||
|
||||
#: 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"
|
||||
msgstr "URL"
|
||||
|
||||
@ -1563,7 +1571,7 @@ msgstr "commentaire"
|
||||
msgid "date/time submitted"
|
||||
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"
|
||||
msgstr "adresse IP"
|
||||
|
||||
@ -4513,26 +4521,26 @@ msgstr "sites"
|
||||
msgid "Enter a valid value."
|
||||
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."
|
||||
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."
|
||||
msgstr "Cette URL semble être cassée."
|
||||
|
||||
#: core/validators.py:123 forms/fields.py:873
|
||||
#: core/validators.py:123 forms/fields.py:877
|
||||
msgid ""
|
||||
"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
|
||||
msgstr ""
|
||||
"Ce champ ne doit contenir que des lettres, des nombres, des tirets bas _ et "
|
||||
"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."
|
||||
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."
|
||||
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)"
|
||||
"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
|
||||
msgid "Ensure this value is less than or equal to %(limit_value)s."
|
||||
msgstr ""
|
||||
"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
|
||||
msgid "Ensure this value is greater than or equal to %(limit_value)s."
|
||||
msgstr ""
|
||||
@ -4602,134 +4610,134 @@ msgstr "Ce champ ne peut pas être vide."
|
||||
msgid "Field of 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:961 db/models/fields/__init__.py:972
|
||||
#: db/models/fields/__init__.py:999
|
||||
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:863
|
||||
#: db/models/fields/__init__.py:972 db/models/fields/__init__.py:983
|
||||
#: db/models/fields/__init__.py:1010
|
||||
msgid "Integer"
|
||||
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."
|
||||
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."
|
||||
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)"
|
||||
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
|
||||
msgid "String (up to %(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"
|
||||
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)"
|
||||
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."
|
||||
msgstr "Saisissez une date valide au format AAAA-MM-JJ."
|
||||
|
||||
#: db/models/fields/__init__.py:586
|
||||
#: db/models/fields/__init__.py:589
|
||||
#, python-format
|
||||
msgid "Invalid date: %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."
|
||||
msgstr ""
|
||||
"Saisissez une date et une heure valides au format AAAA-MM-JJ HH:MM[:ss[."
|
||||
"uuuuuu]]."
|
||||
|
||||
#: db/models/fields/__init__.py:669
|
||||
#: db/models/fields/__init__.py:672
|
||||
msgid "Date (with time)"
|
||||
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."
|
||||
msgstr "Cette valeur doit être un nombre décimal."
|
||||
|
||||
#: db/models/fields/__init__.py:737
|
||||
#: db/models/fields/__init__.py:740
|
||||
msgid "Decimal number"
|
||||
msgstr "Nombre décimal"
|
||||
|
||||
#: db/models/fields/__init__.py:792
|
||||
#: db/models/fields/__init__.py:795
|
||||
msgid "E-mail address"
|
||||
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
|
||||
msgid "File path"
|
||||
msgstr "Chemin vers le fichier"
|
||||
|
||||
#: db/models/fields/__init__.py:822
|
||||
#: db/models/fields/__init__.py:833
|
||||
msgid "This value must be a float."
|
||||
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"
|
||||
msgstr "Nombre à virgule flottante"
|
||||
|
||||
#: db/models/fields/__init__.py:883
|
||||
#: db/models/fields/__init__.py:894
|
||||
msgid "Big (8 byte) integer"
|
||||
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."
|
||||
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)"
|
||||
msgstr "Booléen (soit vrai, faux ou nul)"
|
||||
|
||||
#: db/models/fields/__init__.py:1005
|
||||
#: db/models/fields/__init__.py:1016
|
||||
msgid "Text"
|
||||
msgstr "Texte"
|
||||
|
||||
#: db/models/fields/__init__.py:1021
|
||||
#: db/models/fields/__init__.py:1032
|
||||
msgid "Time"
|
||||
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."
|
||||
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"
|
||||
msgstr "Texte XML"
|
||||
|
||||
#: db/models/fields/related.py:799
|
||||
#: db/models/fields/related.py:801
|
||||
#, python-format
|
||||
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."
|
||||
|
||||
#: db/models/fields/related.py:801
|
||||
#: db/models/fields/related.py:803
|
||||
msgid "Foreign Key (type determined by related field)"
|
||||
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"
|
||||
msgstr "Relation un à un"
|
||||
|
||||
#: db/models/fields/related.py:980
|
||||
#: db/models/fields/related.py:983
|
||||
msgid "Many-to-many relationship"
|
||||
msgstr "Relation plusieurs à plusieurs"
|
||||
|
||||
#: db/models/fields/related.py:1000
|
||||
#: db/models/fields/related.py:1003
|
||||
msgid ""
|
||||
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
|
||||
msgstr ""
|
||||
"Maintenez appuyé « Ctrl », ou « Commande (touche pomme) » sur un Mac, pour en "
|
||||
"sélectionner plusieurs."
|
||||
|
||||
#: db/models/fields/related.py:1061
|
||||
#: db/models/fields/related.py:1064
|
||||
#, python-format
|
||||
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
|
||||
msgid_plural ""
|
||||
@ -4743,55 +4751,55 @@ msgstr[1] ""
|
||||
msgid "This field is required."
|
||||
msgstr "Ce champ est obligatoire."
|
||||
|
||||
#: forms/fields.py:204
|
||||
#: forms/fields.py:203
|
||||
msgid "Enter a whole number."
|
||||
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."
|
||||
msgstr "Saisissez un nombre."
|
||||
|
||||
#: forms/fields.py:259
|
||||
#: forms/fields.py:258
|
||||
#, python-format
|
||||
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."
|
||||
|
||||
#: forms/fields.py:260
|
||||
#: forms/fields.py:259
|
||||
#, python-format
|
||||
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."
|
||||
|
||||
#: forms/fields.py:261
|
||||
#: forms/fields.py:260
|
||||
#, python-format
|
||||
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."
|
||||
|
||||
#: forms/fields.py:323 forms/fields.py:838
|
||||
#: forms/fields.py:322 forms/fields.py:837
|
||||
msgid "Enter a valid date."
|
||||
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."
|
||||
msgstr "Saisissez une heure valide."
|
||||
|
||||
#: forms/fields.py:377
|
||||
#: forms/fields.py:376
|
||||
msgid "Enter a valid date/time."
|
||||
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."
|
||||
msgstr ""
|
||||
"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."
|
||||
msgstr "Aucun fichier n'a été soumis."
|
||||
|
||||
#: forms/fields.py:437
|
||||
#: forms/fields.py:436
|
||||
msgid "The submitted file is empty."
|
||||
msgstr "Le fichier soumis est vide."
|
||||
|
||||
#: forms/fields.py:438
|
||||
#: forms/fields.py:437
|
||||
#, python-format
|
||||
msgid ""
|
||||
"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 "
|
||||
"caractères (actuellement %(length)d caractères)."
|
||||
|
||||
#: forms/fields.py:473
|
||||
#: forms/fields.py:472
|
||||
msgid ""
|
||||
"Upload a valid image. The file you uploaded was either not an image or a "
|
||||
"corrupted image."
|
||||
@ -4807,17 +4815,17 @@ msgstr ""
|
||||
"Téléversez une image valide. Le fichier que vous avez transféré n'est pas "
|
||||
"une image ou bien est corrompu."
|
||||
|
||||
#: forms/fields.py:596 forms/fields.py:671
|
||||
#: forms/fields.py:595 forms/fields.py:670
|
||||
#, python-format
|
||||
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."
|
||||
|
||||
#: 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."
|
||||
msgstr "Saisissez une liste de valeurs."
|
||||
|
||||
# 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"
|
||||
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."
|
||||
msgstr "« %s » n'est pas une valeur correcte pour une clé primaire."
|
||||
|
||||
#: template/defaultfilters.py:776
|
||||
#: template/defaultfilters.py:780
|
||||
msgid "yes,no,maybe"
|
||||
msgstr "oui, non, peut-être"
|
||||
|
||||
#: template/defaultfilters.py:807
|
||||
#: template/defaultfilters.py:811
|
||||
#, python-format
|
||||
msgid "%(size)d byte"
|
||||
msgid_plural "%(size)d bytes"
|
||||
msgstr[0] "%(size)d octet"
|
||||
msgstr[1] "%(size)d octets"
|
||||
|
||||
#: template/defaultfilters.py:809
|
||||
#: template/defaultfilters.py:813
|
||||
#, python-format
|
||||
msgid "%.1f KB"
|
||||
msgstr "%.1f Ko"
|
||||
|
||||
#: template/defaultfilters.py:811
|
||||
#: template/defaultfilters.py:815
|
||||
#, python-format
|
||||
msgid "%.1f MB"
|
||||
msgstr "%.1f Mo"
|
||||
|
||||
#: template/defaultfilters.py:812
|
||||
#: template/defaultfilters.py:816
|
||||
#, python-format
|
||||
msgid "%.1f GB"
|
||||
msgstr "%.1f Go"
|
||||
@ -5100,7 +5108,7 @@ msgstr "nov."
|
||||
msgid "Dec."
|
||||
msgstr "déc."
|
||||
|
||||
#: utils/text.py:130
|
||||
#: utils/text.py:136
|
||||
msgid "or"
|
||||
msgstr "ou"
|
||||
|
||||
|
BIN
django/conf/locale/ml/LC_MESSAGES/django.mo
Normal file
BIN
django/conf/locale/ml/LC_MESSAGES/django.mo
Normal file
Binary file not shown.
5044
django/conf/locale/ml/LC_MESSAGES/django.po
Normal file
5044
django/conf/locale/ml/LC_MESSAGES/django.po
Normal file
File diff suppressed because it is too large
Load Diff
BIN
django/conf/locale/ml/LC_MESSAGES/djangojs.mo
Normal file
BIN
django/conf/locale/ml/LC_MESSAGES/djangojs.mo
Normal file
Binary file not shown.
156
django/conf/locale/ml/LC_MESSAGES/djangojs.po
Normal file
156
django/conf/locale/ml/LC_MESSAGES/djangojs.po
Normal 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 "നാളെ"
|
0
django/conf/locale/ml/__init__.py
Normal file
0
django/conf/locale/ml/__init__.py
Normal file
38
django/conf/locale/ml/formats.py
Normal file
38
django/conf/locale/ml/formats.py
Normal 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
|
||||
|
Binary file not shown.
@ -6,7 +6,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Django\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"
|
||||
"Last-Translator: Håvard Grimelid\n"
|
||||
"Language-Team: Norsk nynorsk <nn@li.org>\n"
|
||||
@ -67,7 +67,7 @@ msgid "Spanish"
|
||||
msgstr "Spansk"
|
||||
|
||||
#: conf/global_settings.py:57
|
||||
msgid "Argentinean Spanish"
|
||||
msgid "Argentinian Spanish"
|
||||
msgstr "Argentinsk spansk"
|
||||
|
||||
#: conf/global_settings.py:58
|
||||
@ -163,98 +163,102 @@ msgid "Macedonian"
|
||||
msgstr "Makedonsk"
|
||||
|
||||
#: conf/global_settings.py:81
|
||||
msgid "Malayalam"
|
||||
msgstr "Malayalam"
|
||||
|
||||
#: conf/global_settings.py:82
|
||||
msgid "Mongolian"
|
||||
msgstr "Mongolsk"
|
||||
|
||||
#: conf/global_settings.py:82
|
||||
#: conf/global_settings.py:83
|
||||
msgid "Dutch"
|
||||
msgstr "Nederlandsk"
|
||||
|
||||
#: conf/global_settings.py:83
|
||||
#: conf/global_settings.py:84
|
||||
msgid "Norwegian"
|
||||
msgstr "Norsk"
|
||||
|
||||
#: conf/global_settings.py:84
|
||||
#: conf/global_settings.py:85
|
||||
msgid "Norwegian Bokmal"
|
||||
msgstr "Norsk (bokmål)"
|
||||
|
||||
#: conf/global_settings.py:85
|
||||
#: conf/global_settings.py:86
|
||||
msgid "Norwegian Nynorsk"
|
||||
msgstr "Norsk (nynorsk)"
|
||||
|
||||
#: conf/global_settings.py:86
|
||||
#: conf/global_settings.py:87
|
||||
msgid "Polish"
|
||||
msgstr "Polsk"
|
||||
|
||||
#: conf/global_settings.py:87
|
||||
#: conf/global_settings.py:88
|
||||
msgid "Portuguese"
|
||||
msgstr "Portugisisk"
|
||||
|
||||
#: conf/global_settings.py:88
|
||||
#: conf/global_settings.py:89
|
||||
msgid "Brazilian Portuguese"
|
||||
msgstr "Brasiliansk portugisisk"
|
||||
|
||||
#: conf/global_settings.py:89
|
||||
#: conf/global_settings.py:90
|
||||
msgid "Romanian"
|
||||
msgstr "Rumensk"
|
||||
|
||||
#: conf/global_settings.py:90
|
||||
#: conf/global_settings.py:91
|
||||
msgid "Russian"
|
||||
msgstr "Russisk"
|
||||
|
||||
#: conf/global_settings.py:91
|
||||
#: conf/global_settings.py:92
|
||||
msgid "Slovak"
|
||||
msgstr "Slovakisk"
|
||||
|
||||
#: conf/global_settings.py:92
|
||||
#: conf/global_settings.py:93
|
||||
msgid "Slovenian"
|
||||
msgstr "Slovensk"
|
||||
|
||||
#: conf/global_settings.py:93
|
||||
#: conf/global_settings.py:94
|
||||
msgid "Albanian"
|
||||
msgstr "Albansk"
|
||||
|
||||
#: conf/global_settings.py:94
|
||||
#: conf/global_settings.py:95
|
||||
msgid "Serbian"
|
||||
msgstr "Serbisk"
|
||||
|
||||
#: conf/global_settings.py:95
|
||||
#: conf/global_settings.py:96
|
||||
msgid "Serbian Latin"
|
||||
msgstr "Serbisk latin"
|
||||
|
||||
#: conf/global_settings.py:96
|
||||
#: conf/global_settings.py:97
|
||||
msgid "Swedish"
|
||||
msgstr "Svensk"
|
||||
|
||||
#: conf/global_settings.py:97
|
||||
#: conf/global_settings.py:98
|
||||
msgid "Tamil"
|
||||
msgstr "Tamil"
|
||||
|
||||
#: conf/global_settings.py:98
|
||||
#: conf/global_settings.py:99
|
||||
msgid "Telugu"
|
||||
msgstr "Telugu"
|
||||
|
||||
#: conf/global_settings.py:99
|
||||
#: conf/global_settings.py:100
|
||||
msgid "Thai"
|
||||
msgstr "Thai"
|
||||
|
||||
#: conf/global_settings.py:100
|
||||
#: conf/global_settings.py:101
|
||||
msgid "Turkish"
|
||||
msgstr "Tyrkisk"
|
||||
|
||||
#: conf/global_settings.py:101
|
||||
#: conf/global_settings.py:102
|
||||
msgid "Ukrainian"
|
||||
msgstr "Ukrainsk"
|
||||
|
||||
#: conf/global_settings.py:102
|
||||
#: conf/global_settings.py:103
|
||||
msgid "Vietnamese"
|
||||
msgstr "Vietnamesisk"
|
||||
|
||||
#: conf/global_settings.py:103
|
||||
#: conf/global_settings.py:104
|
||||
msgid "Simplified Chinese"
|
||||
msgstr "Simplifisert kinesisk"
|
||||
|
||||
#: conf/global_settings.py:104
|
||||
#: conf/global_settings.py:105
|
||||
msgid "Traditional Chinese"
|
||||
msgstr "Tradisjonell kinesisk"
|
||||
|
||||
@ -306,15 +310,15 @@ msgstr "Denne månaden"
|
||||
msgid "This year"
|
||||
msgstr "I år"
|
||||
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
|
||||
msgid "Yes"
|
||||
msgstr "Ja"
|
||||
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
|
||||
msgid "No"
|
||||
msgstr "Nei"
|
||||
|
||||
#: contrib/admin/filterspecs.py:154 forms/widgets.py:469
|
||||
#: contrib/admin/filterspecs.py:154 forms/widgets.py:478
|
||||
msgid "Unknown"
|
||||
msgstr "Ukjend"
|
||||
|
||||
@ -451,8 +455,8 @@ msgstr[1] "%(count)s %(name)s vart endra."
|
||||
#, python-format
|
||||
msgid "%(total_count)s selected"
|
||||
msgid_plural "All %(total_count)s selected"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
msgstr[0] "%(total_count)s valde"
|
||||
msgstr[1] "Alle %(total_count)s valde"
|
||||
|
||||
#: contrib/admin/options.py:1071
|
||||
#, python-format
|
||||
@ -684,7 +688,7 @@ msgid "Filter"
|
||||
msgstr "Filtrering"
|
||||
|
||||
#: 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"
|
||||
msgstr "Slett"
|
||||
|
||||
@ -843,7 +847,7 @@ msgstr "Lagre og opprett ny"
|
||||
msgid "Save and continue editing"
|
||||
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 ""
|
||||
"First, enter a username and password. Then, you'll be able to edit more user "
|
||||
"options."
|
||||
@ -851,6 +855,10 @@ msgstr ""
|
||||
"Skriv først inn brukernamn og passord. Deretter vil du få høve til å endre "
|
||||
"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
|
||||
#, python-format
|
||||
msgid "Enter a new password for the user <strong>%(username)s</strong>."
|
||||
@ -1407,8 +1415,8 @@ msgstr "melding"
|
||||
msgid "Logged out"
|
||||
msgstr "Logga ut"
|
||||
|
||||
#: contrib/auth/management/commands/createsuperuser.py:23
|
||||
#: core/validators.py:120 forms/fields.py:428
|
||||
#: contrib/auth/management/commands/createsuperuser.py:24
|
||||
#: core/validators.py:120 forms/fields.py:427
|
||||
msgid "Enter a valid e-mail address."
|
||||
msgstr "Oppgje ei gyldig e-postadresse."
|
||||
|
||||
@ -1476,7 +1484,7 @@ msgid "Email address"
|
||||
msgstr "E-postadresse"
|
||||
|
||||
#: 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"
|
||||
msgstr "Nettadresse"
|
||||
|
||||
@ -1526,7 +1534,7 @@ msgstr "kommentar"
|
||||
msgid "date/time submitted"
|
||||
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"
|
||||
msgstr "IP-adresse"
|
||||
|
||||
@ -4453,26 +4461,26 @@ msgstr "nettstader"
|
||||
msgid "Enter a valid value."
|
||||
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."
|
||||
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."
|
||||
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 ""
|
||||
"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
|
||||
msgstr ""
|
||||
"Oppgje ein gyldig 'slug' som består av bokstavar, nummer, understrekar eller "
|
||||
"bindestrekar."
|
||||
|
||||
#: core/validators.py:126 forms/fields.py:866
|
||||
#: core/validators.py:126 forms/fields.py:870
|
||||
msgid "Enter a valid IPv4 address."
|
||||
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."
|
||||
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)."
|
||||
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
|
||||
msgid "Ensure this value is less than or equal to %(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
|
||||
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."
|
||||
@ -4534,132 +4542,132 @@ msgstr "Feltet kan ikkje vere tomt."
|
||||
msgid "Field of type: %(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:961 db/models/fields/__init__.py:972
|
||||
#: db/models/fields/__init__.py:999
|
||||
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:863
|
||||
#: db/models/fields/__init__.py:972 db/models/fields/__init__.py:983
|
||||
#: db/models/fields/__init__.py:1010
|
||||
msgid "Integer"
|
||||
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."
|
||||
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."
|
||||
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)"
|
||||
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
|
||||
msgid "String (up to %(max_length)s)"
|
||||
msgstr "Tekst (opp til %(max_length)s teikn)"
|
||||
|
||||
#: db/models/fields/__init__.py:567
|
||||
#: db/models/fields/__init__.py:570
|
||||
msgid "Comma-separated integers"
|
||||
msgstr "Heiltal skild med komma"
|
||||
|
||||
#: db/models/fields/__init__.py:581
|
||||
#: db/models/fields/__init__.py:584
|
||||
msgid "Date (without time)"
|
||||
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."
|
||||
msgstr "Oppgje ein gyldig dato på forma ÅÅÅÅ-MM-DD."
|
||||
|
||||
#: db/models/fields/__init__.py:586
|
||||
#: db/models/fields/__init__.py:589
|
||||
#, python-format
|
||||
msgid "Invalid date: %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."
|
||||
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)"
|
||||
msgstr "Dato (med tid)"
|
||||
|
||||
#: db/models/fields/__init__.py:735
|
||||
#: db/models/fields/__init__.py:738
|
||||
msgid "This value must be a decimal number."
|
||||
msgstr "Verdien må vere eit desimaltall."
|
||||
|
||||
#: db/models/fields/__init__.py:737
|
||||
#: db/models/fields/__init__.py:740
|
||||
msgid "Decimal number"
|
||||
msgstr "Desimaltall"
|
||||
|
||||
#: db/models/fields/__init__.py:792
|
||||
#: db/models/fields/__init__.py:795
|
||||
msgid "E-mail address"
|
||||
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
|
||||
msgid "File path"
|
||||
msgstr "Filsti"
|
||||
|
||||
#: db/models/fields/__init__.py:822
|
||||
#: db/models/fields/__init__.py:833
|
||||
msgid "This value must be a float."
|
||||
msgstr "Verdien må vere eit flyttall."
|
||||
|
||||
#: db/models/fields/__init__.py:824
|
||||
#: db/models/fields/__init__.py:835
|
||||
msgid "Floating point number"
|
||||
msgstr "Flyttall"
|
||||
|
||||
#: db/models/fields/__init__.py:883
|
||||
#: db/models/fields/__init__.py:894
|
||||
msgid "Big (8 byte) integer"
|
||||
msgstr ""
|
||||
|
||||
#: db/models/fields/__init__.py:912
|
||||
#: db/models/fields/__init__.py:923
|
||||
msgid "This value must be either None, True or 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)"
|
||||
msgstr "Boolsk (True, False eller None)"
|
||||
|
||||
#: db/models/fields/__init__.py:1005
|
||||
#: db/models/fields/__init__.py:1016
|
||||
msgid "Text"
|
||||
msgstr "Tekst"
|
||||
|
||||
#: db/models/fields/__init__.py:1021
|
||||
#: db/models/fields/__init__.py:1032
|
||||
msgid "Time"
|
||||
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."
|
||||
msgstr "Oppgje tida på forma TT:MM[:ss[.uuuuuu]]."
|
||||
|
||||
#: db/models/fields/__init__.py:1109
|
||||
#: db/models/fields/__init__.py:1128
|
||||
msgid "XML text"
|
||||
msgstr "XML-tekst"
|
||||
|
||||
#: db/models/fields/related.py:799
|
||||
#: db/models/fields/related.py:801
|
||||
#, python-format
|
||||
msgid "Model %(model)s with pk %(pk)r does not exist."
|
||||
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)"
|
||||
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"
|
||||
msgstr "Ein-til-ein-forhold"
|
||||
|
||||
#: db/models/fields/related.py:980
|
||||
#: db/models/fields/related.py:983
|
||||
msgid "Many-to-many relationship"
|
||||
msgstr "Mange-til-mange-forhold"
|
||||
|
||||
#: db/models/fields/related.py:1000
|
||||
#: db/models/fields/related.py:1003
|
||||
msgid ""
|
||||
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
|
||||
msgstr ""
|
||||
"Hald nede \"Control\", eller \"Command\" på ein Mac, for å velge meir enn "
|
||||
"éin."
|
||||
|
||||
#: db/models/fields/related.py:1061
|
||||
#: db/models/fields/related.py:1064
|
||||
#, python-format
|
||||
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
|
||||
msgid_plural ""
|
||||
@ -4671,60 +4679,60 @@ msgstr[1] "Oppgje gyldige %(self)s-ID-ar. Verdiane %(value)r er ugyldige."
|
||||
msgid "This field is required."
|
||||
msgstr "Feltet er påkravd."
|
||||
|
||||
#: forms/fields.py:204
|
||||
#: forms/fields.py:203
|
||||
msgid "Enter a whole number."
|
||||
msgstr "Oppgje eit heiltall."
|
||||
|
||||
#: forms/fields.py:235 forms/fields.py:256
|
||||
#: forms/fields.py:234 forms/fields.py:255
|
||||
msgid "Enter a number."
|
||||
msgstr "Oppgje eit tall."
|
||||
|
||||
#: forms/fields.py:259
|
||||
#: forms/fields.py:258
|
||||
#, python-format
|
||||
msgid "Ensure that there are no more than %s digits in total."
|
||||
msgstr "Verdien kan ikkje ha meir enn %s siffer totalt."
|
||||
|
||||
#: forms/fields.py:260
|
||||
#: forms/fields.py:259
|
||||
#, python-format
|
||||
msgid "Ensure that there are no more than %s decimal places."
|
||||
msgstr "Verdien kan ikkie ha meir enn %s desimalar."
|
||||
|
||||
#: forms/fields.py:261
|
||||
#: forms/fields.py:260
|
||||
#, python-format
|
||||
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."
|
||||
|
||||
#: forms/fields.py:323 forms/fields.py:838
|
||||
#: forms/fields.py:322 forms/fields.py:837
|
||||
msgid "Enter a valid date."
|
||||
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."
|
||||
msgstr "Oppgje eit gyldig tidspunkt."
|
||||
|
||||
#: forms/fields.py:377
|
||||
#: forms/fields.py:376
|
||||
msgid "Enter a valid date/time."
|
||||
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."
|
||||
msgstr "Inga fil vart sendt. Sjekk \"encoding\"-typen på skjemaet."
|
||||
|
||||
#: forms/fields.py:436
|
||||
#: forms/fields.py:435
|
||||
msgid "No file was submitted."
|
||||
msgstr "Inga fil vart sendt."
|
||||
|
||||
#: forms/fields.py:437
|
||||
#: forms/fields.py:436
|
||||
msgid "The submitted file is empty."
|
||||
msgstr "Fila er tom."
|
||||
|
||||
#: forms/fields.py:438
|
||||
#: forms/fields.py:437
|
||||
#, python-format
|
||||
msgid ""
|
||||
"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)."
|
||||
|
||||
#: forms/fields.py:473
|
||||
#: forms/fields.py:472
|
||||
msgid ""
|
||||
"Upload a valid image. The file you uploaded was either not an image or a "
|
||||
"corrupted image."
|
||||
@ -4732,17 +4740,17 @@ msgstr ""
|
||||
"Last opp eit gyldig bilete. Fila du lasta opp var ødelagt eller ikkje eit "
|
||||
"bilete."
|
||||
|
||||
#: forms/fields.py:596 forms/fields.py:671
|
||||
#: forms/fields.py:595 forms/fields.py:670
|
||||
#, python-format
|
||||
msgid "Select a valid choice. %(value)s is not one of the available choices."
|
||||
msgstr ""
|
||||
"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."
|
||||
msgstr "Oppgje ei liste med verdiar."
|
||||
|
||||
#: forms/formsets.py:298 forms/formsets.py:300
|
||||
#: forms/formsets.py:296 forms/formsets.py:298
|
||||
msgid "Order"
|
||||
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."
|
||||
msgstr "\"%s\" er ikkje ein gyldig verdi for ein primærnøkkel."
|
||||
|
||||
#: template/defaultfilters.py:776
|
||||
#: template/defaultfilters.py:780
|
||||
msgid "yes,no,maybe"
|
||||
msgstr "ja,nei,kanskje"
|
||||
|
||||
#: template/defaultfilters.py:807
|
||||
#: template/defaultfilters.py:811
|
||||
#, python-format
|
||||
msgid "%(size)d byte"
|
||||
msgid_plural "%(size)d bytes"
|
||||
msgstr[0] "%(size)d byte"
|
||||
msgstr[1] "%(size)d bytes"
|
||||
|
||||
#: template/defaultfilters.py:809
|
||||
#: template/defaultfilters.py:813
|
||||
#, python-format
|
||||
msgid "%.1f KB"
|
||||
msgstr "%.1f KB"
|
||||
|
||||
#: template/defaultfilters.py:811
|
||||
#: template/defaultfilters.py:815
|
||||
#, python-format
|
||||
msgid "%.1f MB"
|
||||
msgstr "%.1f MB"
|
||||
|
||||
#: template/defaultfilters.py:812
|
||||
#: template/defaultfilters.py:816
|
||||
#, python-format
|
||||
msgid "%.1f GB"
|
||||
msgstr "%.1f GB"
|
||||
@ -4880,7 +4888,7 @@ msgstr "ons"
|
||||
|
||||
#: utils/dates.py:10
|
||||
msgid "Thu"
|
||||
msgstr "tors"
|
||||
msgstr "tor"
|
||||
|
||||
#: utils/dates.py:10
|
||||
msgid "Fri"
|
||||
@ -4888,7 +4896,7 @@ msgstr "fre"
|
||||
|
||||
#: utils/dates.py:11
|
||||
msgid "Sat"
|
||||
msgstr "laur"
|
||||
msgstr "lau"
|
||||
|
||||
#: utils/dates.py:11
|
||||
msgid "Sun"
|
||||
@ -5018,7 +5026,7 @@ msgstr "nov."
|
||||
msgid "Dec."
|
||||
msgstr "des."
|
||||
|
||||
#: utils/text.py:130
|
||||
#: utils/text.py:136
|
||||
msgid "or"
|
||||
msgstr "eller"
|
||||
|
||||
|
@ -28,5 +28,5 @@ DATETIME_INPUT_FORMATS = (
|
||||
'%Y-%m-%d', # '2006-10-25'
|
||||
)
|
||||
DECIMAL_SEPARATOR = ','
|
||||
THOUSAND_SEPARATOR = '.'
|
||||
NUMBER_GROUPING = 3
|
||||
THOUSAND_SEPARATOR = ' '
|
||||
NUMBER_GROUPING = 3
|
||||
|
Binary file not shown.
@ -4,17 +4,18 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Django\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-05-07 20:44+0200\n"
|
||||
"PO-Revision-Date: 2010-03-23 23:39+0100\n"
|
||||
"POT-Creation-Date: 2010-08-06 19:53+0200\n"
|
||||
"PO-Revision-Date: 2010-08-06 19:47+0100\n"
|
||||
"Last-Translator: Janos Guljas <janos@janos.in.rs>\n"
|
||||
"Language-Team: Branko Vukelic <bg.branko@gmail.com> & Janos Guljas "
|
||||
"<janos@janos.in.rs> & Nesh <djnesh@gmail.com> & Petar <petar.maric@gmail."
|
||||
"com>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
|
||||
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"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"
|
||||
|
||||
#: conf/global_settings.py:44
|
||||
msgid "Arabic"
|
||||
@ -69,7 +70,7 @@ msgid "Spanish"
|
||||
msgstr "шпански"
|
||||
|
||||
#: conf/global_settings.py:57
|
||||
msgid "Argentinean Spanish"
|
||||
msgid "Argentinian Spanish"
|
||||
msgstr "аргентински шпански"
|
||||
|
||||
#: conf/global_settings.py:58
|
||||
@ -121,138 +122,146 @@ msgid "Hungarian"
|
||||
msgstr "мађарски"
|
||||
|
||||
#: conf/global_settings.py:70
|
||||
msgid "Indonesian"
|
||||
msgstr "индонежански"
|
||||
|
||||
#: conf/global_settings.py:71
|
||||
msgid "Icelandic"
|
||||
msgstr "исландски"
|
||||
|
||||
#: conf/global_settings.py:71
|
||||
#: conf/global_settings.py:72
|
||||
msgid "Italian"
|
||||
msgstr "италијански"
|
||||
|
||||
#: conf/global_settings.py:72
|
||||
#: conf/global_settings.py:73
|
||||
msgid "Japanese"
|
||||
msgstr "јапански"
|
||||
|
||||
#: conf/global_settings.py:73
|
||||
#: conf/global_settings.py:74
|
||||
msgid "Georgian"
|
||||
msgstr "грузијски"
|
||||
|
||||
#: conf/global_settings.py:74
|
||||
#: conf/global_settings.py:75
|
||||
msgid "Khmer"
|
||||
msgstr "камбодијски"
|
||||
|
||||
#: conf/global_settings.py:75
|
||||
#: conf/global_settings.py:76
|
||||
msgid "Kannada"
|
||||
msgstr "канада"
|
||||
|
||||
#: conf/global_settings.py:76
|
||||
#: conf/global_settings.py:77
|
||||
msgid "Korean"
|
||||
msgstr "корејски"
|
||||
|
||||
#: conf/global_settings.py:77
|
||||
#: conf/global_settings.py:78
|
||||
msgid "Lithuanian"
|
||||
msgstr "литвански"
|
||||
|
||||
#: conf/global_settings.py:78
|
||||
#: conf/global_settings.py:79
|
||||
msgid "Latvian"
|
||||
msgstr "латвијски"
|
||||
|
||||
#: conf/global_settings.py:79
|
||||
#: conf/global_settings.py:80
|
||||
msgid "Macedonian"
|
||||
msgstr "македонски"
|
||||
|
||||
#: conf/global_settings.py:80
|
||||
#: conf/global_settings.py:81
|
||||
msgid "Malayalam"
|
||||
msgstr "малајаламски"
|
||||
|
||||
#: conf/global_settings.py:82
|
||||
msgid "Mongolian"
|
||||
msgstr "монголски"
|
||||
|
||||
#: conf/global_settings.py:81
|
||||
#: conf/global_settings.py:83
|
||||
msgid "Dutch"
|
||||
msgstr "холандски"
|
||||
|
||||
#: conf/global_settings.py:82
|
||||
#: conf/global_settings.py:84
|
||||
msgid "Norwegian"
|
||||
msgstr "норвешки"
|
||||
|
||||
#: conf/global_settings.py:83
|
||||
#: conf/global_settings.py:85
|
||||
msgid "Norwegian Bokmal"
|
||||
msgstr "норвешки кнјжевни"
|
||||
|
||||
#: conf/global_settings.py:84
|
||||
#: conf/global_settings.py:86
|
||||
msgid "Norwegian Nynorsk"
|
||||
msgstr "норвешки нови"
|
||||
|
||||
#: conf/global_settings.py:85
|
||||
#: conf/global_settings.py:87
|
||||
msgid "Polish"
|
||||
msgstr "пољски"
|
||||
|
||||
#: conf/global_settings.py:86
|
||||
#: conf/global_settings.py:88
|
||||
msgid "Portuguese"
|
||||
msgstr "португалски"
|
||||
|
||||
#: conf/global_settings.py:87
|
||||
#: conf/global_settings.py:89
|
||||
msgid "Brazilian Portuguese"
|
||||
msgstr "бразилски португалски"
|
||||
|
||||
#: conf/global_settings.py:88
|
||||
#: conf/global_settings.py:90
|
||||
msgid "Romanian"
|
||||
msgstr "румунски"
|
||||
|
||||
#: conf/global_settings.py:89
|
||||
#: conf/global_settings.py:91
|
||||
msgid "Russian"
|
||||
msgstr "руски"
|
||||
|
||||
#: conf/global_settings.py:90
|
||||
#: conf/global_settings.py:92
|
||||
msgid "Slovak"
|
||||
msgstr "словачки"
|
||||
|
||||
#: conf/global_settings.py:91
|
||||
#: conf/global_settings.py:93
|
||||
msgid "Slovenian"
|
||||
msgstr "словеначки"
|
||||
|
||||
#: conf/global_settings.py:92
|
||||
#: conf/global_settings.py:94
|
||||
msgid "Albanian"
|
||||
msgstr "албански"
|
||||
|
||||
#: conf/global_settings.py:93
|
||||
#: conf/global_settings.py:95
|
||||
msgid "Serbian"
|
||||
msgstr "српски"
|
||||
|
||||
#: conf/global_settings.py:94
|
||||
#: conf/global_settings.py:96
|
||||
msgid "Serbian Latin"
|
||||
msgstr "српски (латиница)"
|
||||
|
||||
#: conf/global_settings.py:95
|
||||
#: conf/global_settings.py:97
|
||||
msgid "Swedish"
|
||||
msgstr "шведски"
|
||||
|
||||
#: conf/global_settings.py:96
|
||||
#: conf/global_settings.py:98
|
||||
msgid "Tamil"
|
||||
msgstr "тамилски"
|
||||
|
||||
#: conf/global_settings.py:97
|
||||
#: conf/global_settings.py:99
|
||||
msgid "Telugu"
|
||||
msgstr "телугу"
|
||||
|
||||
#: conf/global_settings.py:98
|
||||
#: conf/global_settings.py:100
|
||||
msgid "Thai"
|
||||
msgstr "тајландски"
|
||||
|
||||
#: conf/global_settings.py:99
|
||||
#: conf/global_settings.py:101
|
||||
msgid "Turkish"
|
||||
msgstr "турски"
|
||||
|
||||
#: conf/global_settings.py:100
|
||||
#: conf/global_settings.py:102
|
||||
msgid "Ukrainian"
|
||||
msgstr "украјински"
|
||||
|
||||
#: conf/global_settings.py:101
|
||||
#: conf/global_settings.py:103
|
||||
msgid "Vietnamese"
|
||||
msgstr "вијетнамски"
|
||||
|
||||
#: conf/global_settings.py:102
|
||||
#: conf/global_settings.py:104
|
||||
msgid "Simplified Chinese"
|
||||
msgstr "новокинески"
|
||||
|
||||
#: conf/global_settings.py:103
|
||||
#: conf/global_settings.py:105
|
||||
msgid "Traditional Chinese"
|
||||
msgstr "старокинески"
|
||||
|
||||
@ -304,15 +313,15 @@ msgstr "Овај месец"
|
||||
msgid "This year"
|
||||
msgstr "Ова година"
|
||||
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
|
||||
msgid "Yes"
|
||||
msgstr "Да"
|
||||
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:469
|
||||
#: contrib/admin/filterspecs.py:147 forms/widgets.py:478
|
||||
msgid "No"
|
||||
msgstr "Не"
|
||||
|
||||
#: contrib/admin/filterspecs.py:154 forms/widgets.py:469
|
||||
#: contrib/admin/filterspecs.py:154 forms/widgets.py:478
|
||||
msgid "Unknown"
|
||||
msgstr "Непознато"
|
||||
|
||||
@ -358,7 +367,7 @@ msgid "Changed %s."
|
||||
msgstr "Измењена поља %s"
|
||||
|
||||
#: 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
|
||||
msgid "and"
|
||||
msgstr "и"
|
||||
@ -457,9 +466,9 @@ msgstr[1] "%(total_count)s изабрано"
|
||||
msgstr[2] "%(total_count)s изабраних"
|
||||
|
||||
#: contrib/admin/options.py:1071
|
||||
#, fuzzy, python-format
|
||||
#, python-format
|
||||
msgid "0 of %(cnt)s selected"
|
||||
msgstr "0 од %(cnt)d изабрано"
|
||||
msgstr "0 од %(cnt)s изабрано"
|
||||
|
||||
#: contrib/admin/options.py:1118
|
||||
#, python-format
|
||||
@ -687,7 +696,7 @@ msgid "Filter"
|
||||
msgstr "Филтер"
|
||||
|
||||
#: 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"
|
||||
msgstr "Обриши"
|
||||
|
||||
@ -849,7 +858,7 @@ msgstr "Сачувај и додај следећи"
|
||||
msgid "Save and continue editing"
|
||||
msgstr "Сачувај и настави са изменама"
|
||||
|
||||
#: contrib/admin/templates/admin/auth/user/add_form.html:5
|
||||
#: contrib/admin/templates/admin/auth/user/add_form.html:6
|
||||
msgid ""
|
||||
"First, enter a username and password. Then, you'll be able to edit more user "
|
||||
"options."
|
||||
@ -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
|
||||
#, python-format
|
||||
msgid "Enter a new password for the user <strong>%(username)s</strong>."
|
||||
@ -1050,7 +1063,7 @@ msgstr "Имејл адреса:"
|
||||
msgid "Reset my password"
|
||||
msgstr "Ресетуј моју лозинку"
|
||||
|
||||
#: contrib/admin/templatetags/admin_list.py:239
|
||||
#: contrib/admin/templatetags/admin_list.py:257
|
||||
msgid "All dates"
|
||||
msgstr "Сви датуми"
|
||||
|
||||
@ -1424,8 +1437,8 @@ msgstr "порука"
|
||||
msgid "Logged out"
|
||||
msgstr "Одјављен"
|
||||
|
||||
#: contrib/auth/management/commands/createsuperuser.py:23
|
||||
#: core/validators.py:120 forms/fields.py:428
|
||||
#: contrib/auth/management/commands/createsuperuser.py:24
|
||||
#: core/validators.py:120 forms/fields.py:427
|
||||
msgid "Enter a valid e-mail address."
|
||||
msgstr "Унесите важећу имејл адресу."
|
||||
|
||||
@ -1497,7 +1510,7 @@ msgid "Email address"
|
||||
msgstr "Имејл адреса"
|
||||
|
||||
#: 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"
|
||||
msgstr "URL"
|
||||
|
||||
@ -1547,7 +1560,7 @@ msgstr "коментар"
|
||||
msgid "date/time submitted"
|
||||
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"
|
||||
msgstr "IP адреса"
|
||||
|
||||
@ -4471,22 +4484,22 @@ msgstr "сајтови"
|
||||
msgid "Enter a valid value."
|
||||
msgstr "Унесите исправну вредност."
|
||||
|
||||
#: core/validators.py:87 forms/fields.py:529
|
||||
#: core/validators.py:87 forms/fields.py:528
|
||||
msgid "Enter a valid 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."
|
||||
msgstr "Овај URL изгледа не води никуда."
|
||||
|
||||
#: core/validators.py:123 forms/fields.py:873
|
||||
#: core/validators.py:123 forms/fields.py:877
|
||||
msgid ""
|
||||
"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
|
||||
msgstr ""
|
||||
"Унесите исрпаван „слаг“, који се састоји од слова, бројки, доњих црта или "
|
||||
"циртица."
|
||||
|
||||
#: core/validators.py:126 forms/fields.py:866
|
||||
#: core/validators.py:126 forms/fields.py:870
|
||||
msgid "Enter a valid IPv4 address."
|
||||
msgstr "Унесите исправну IPv4 адресу."
|
||||
|
||||
@ -4499,12 +4512,12 @@ msgstr "Унесите само бројке раздвојене запетам
|
||||
msgid "Ensure this value is %(limit_value)s (it is %(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
|
||||
msgid "Ensure this value is less than or equal to %(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
|
||||
msgid "Ensure this value is greater than or equal to %(limit_value)s."
|
||||
msgstr "Ова вредност мора бити већа од %(limit_value)s или тачно толико."
|
||||
@ -4512,27 +4525,27 @@ msgstr "Ова вредност мора бити већа од %(limit_value)s
|
||||
#: core/validators.py:164
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Ensure this value has at least %(limit_value)d characters (it has %"
|
||||
"(show_value)d)."
|
||||
"Ensure this value has at least %(limit_value)d characters (it has "
|
||||
"%(show_value)d)."
|
||||
msgstr ""
|
||||
"Ово поље мора да садржи најмање %(limit_value)d словних места (тренутно има %"
|
||||
"(show_value)d)."
|
||||
"Ово поље мора да садржи најмање %(limit_value)d словних места (тренутно има "
|
||||
"%(show_value)d)."
|
||||
|
||||
#: core/validators.py:170
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Ensure this value has at most %(limit_value)d characters (it has %"
|
||||
"(show_value)d)."
|
||||
"Ensure this value has at most %(limit_value)d characters (it has "
|
||||
"%(show_value)d)."
|
||||
msgstr ""
|
||||
"Ово поље мора да садржи највише %(limit_value)d словних места (тренутно има %"
|
||||
"(show_value)d)."
|
||||
"Ово поље мора да садржи највише %(limit_value)d словних места (тренутно има "
|
||||
"%(show_value)d)."
|
||||
|
||||
#: db/models/base.py:822
|
||||
#: db/models/base.py:823
|
||||
#, python-format
|
||||
msgid "%(field_name)s must be unique for %(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
|
||||
msgid "%(model_name)s with this %(field_label)s already exists."
|
||||
msgstr "%(model_name)s са овом вредношћу %(field_label)s већ постоји."
|
||||
@ -4555,13 +4568,13 @@ msgstr "Ово поље не може да остане празно."
|
||||
msgid "Field of type: %(field_type)s"
|
||||
msgstr "Поње типа: %(field_type)s"
|
||||
|
||||
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:852
|
||||
#: db/models/fields/__init__.py:961 db/models/fields/__init__.py:972
|
||||
#: db/models/fields/__init__.py:999
|
||||
#: db/models/fields/__init__.py:451 db/models/fields/__init__.py:860
|
||||
#: db/models/fields/__init__.py:969 db/models/fields/__init__.py:980
|
||||
#: db/models/fields/__init__.py:1007
|
||||
msgid "Integer"
|
||||
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."
|
||||
msgstr "Ова вредност мора бити целобројна."
|
||||
|
||||
@ -4573,7 +4586,7 @@ msgstr "Ова вредност мора бити True или False."
|
||||
msgid "Boolean (Either True or 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
|
||||
msgid "String (up to %(max_length)s)"
|
||||
msgstr "Стринг (највише %(max_length)s знакова)"
|
||||
@ -4615,44 +4628,44 @@ msgstr "Децимални број"
|
||||
msgid "E-mail address"
|
||||
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
|
||||
msgid "File path"
|
||||
msgstr "Путања фајла"
|
||||
|
||||
#: db/models/fields/__init__.py:822
|
||||
#: db/models/fields/__init__.py:830
|
||||
msgid "This value must be a float."
|
||||
msgstr "Ова вредност мора бити број са клизећом запетом"
|
||||
|
||||
#: db/models/fields/__init__.py:824
|
||||
#: db/models/fields/__init__.py:832
|
||||
msgid "Floating point number"
|
||||
msgstr "Број са покреном запетом"
|
||||
|
||||
#: db/models/fields/__init__.py:883
|
||||
#: db/models/fields/__init__.py:891
|
||||
msgid "Big (8 byte) integer"
|
||||
msgstr "Велики цео број"
|
||||
|
||||
#: db/models/fields/__init__.py:912
|
||||
#: db/models/fields/__init__.py:920
|
||||
msgid "This value must be either None, True or False."
|
||||
msgstr "Ова вредност мора бити или None, или True, или False."
|
||||
|
||||
#: db/models/fields/__init__.py:914
|
||||
#: db/models/fields/__init__.py:922
|
||||
msgid "Boolean (Either True, False or None)"
|
||||
msgstr "Булова вредност (True, False или None)"
|
||||
|
||||
#: db/models/fields/__init__.py:1005
|
||||
#: db/models/fields/__init__.py:1013
|
||||
msgid "Text"
|
||||
msgstr "Текст"
|
||||
|
||||
#: db/models/fields/__init__.py:1021
|
||||
#: db/models/fields/__init__.py:1029
|
||||
msgid "Time"
|
||||
msgstr "Време"
|
||||
|
||||
#: db/models/fields/__init__.py:1025
|
||||
#: db/models/fields/__init__.py:1033
|
||||
msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
|
||||
msgstr "Унесите исправно време у формату ЧЧ:ММ[:сс[.уууууу]]."
|
||||
|
||||
#: db/models/fields/__init__.py:1109
|
||||
#: db/models/fields/__init__.py:1125
|
||||
msgid "XML text"
|
||||
msgstr "XML текст"
|
||||
|
||||
@ -4665,22 +4678,22 @@ msgstr "Објекат класе %(model)s са примарним кључем
|
||||
msgid "Foreign Key (type determined by related field)"
|
||||
msgstr "Страни кључ (тип одређује референтно поље)"
|
||||
|
||||
#: db/models/fields/related.py:918
|
||||
#: db/models/fields/related.py:919
|
||||
msgid "One-to-one relationship"
|
||||
msgstr "Релација један на један"
|
||||
|
||||
#: db/models/fields/related.py:980
|
||||
#: db/models/fields/related.py:981
|
||||
msgid "Many-to-many relationship"
|
||||
msgstr "Релација више на више"
|
||||
|
||||
#: db/models/fields/related.py:1000
|
||||
#: db/models/fields/related.py:1001
|
||||
msgid ""
|
||||
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
|
||||
msgstr ""
|
||||
"Држите „Control“, или „Command“ на Mac-у да бисте обележили више од једне "
|
||||
"ставке."
|
||||
|
||||
#: db/models/fields/related.py:1061
|
||||
#: db/models/fields/related.py:1062
|
||||
#, python-format
|
||||
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
|
||||
msgid_plural ""
|
||||
@ -4693,62 +4706,62 @@ msgstr[2] "Унесите исправан %(self)s IDs. Вредности %(va
|
||||
msgid "This field is required."
|
||||
msgstr "Ово поље се мора попунити."
|
||||
|
||||
#: forms/fields.py:204
|
||||
#: forms/fields.py:203
|
||||
msgid "Enter a whole number."
|
||||
msgstr "Унесите цео број."
|
||||
|
||||
#: forms/fields.py:235 forms/fields.py:256
|
||||
#: forms/fields.py:234 forms/fields.py:255
|
||||
msgid "Enter a number."
|
||||
msgstr "Унесите број."
|
||||
|
||||
#: forms/fields.py:259
|
||||
#: forms/fields.py:258
|
||||
#, python-format
|
||||
msgid "Ensure that there are no more than %s digits in total."
|
||||
msgstr "Не сме бити укупно више од %s цифара. Проверите."
|
||||
|
||||
#: forms/fields.py:260
|
||||
#: forms/fields.py:259
|
||||
#, python-format
|
||||
msgid "Ensure that there are no more than %s decimal places."
|
||||
msgstr "Не сме бити укупно више од %s децималних места. Проверите."
|
||||
|
||||
#: forms/fields.py:261
|
||||
#: forms/fields.py:260
|
||||
#, python-format
|
||||
msgid "Ensure that there are no more than %s digits before the decimal point."
|
||||
msgstr "Не сме бити укупно више од %s цифара пре запете. Проверите."
|
||||
|
||||
#: forms/fields.py:323 forms/fields.py:838
|
||||
#: forms/fields.py:322 forms/fields.py:837
|
||||
msgid "Enter a valid date."
|
||||
msgstr "Унесите исправан датум."
|
||||
|
||||
#: forms/fields.py:351 forms/fields.py:839
|
||||
#: forms/fields.py:350 forms/fields.py:838
|
||||
msgid "Enter a valid time."
|
||||
msgstr "Унесите исправно време"
|
||||
|
||||
#: forms/fields.py:377
|
||||
#: forms/fields.py:376
|
||||
msgid "Enter a valid date/time."
|
||||
msgstr "Унесите исправан датум/време."
|
||||
|
||||
#: forms/fields.py:435
|
||||
#: forms/fields.py:434
|
||||
msgid "No file was submitted. Check the encoding type on the form."
|
||||
msgstr "Фајл није пребачен. Проверите тип енкодирања формулара."
|
||||
|
||||
#: forms/fields.py:436
|
||||
#: forms/fields.py:435
|
||||
msgid "No file was submitted."
|
||||
msgstr "Фајл није пребачен."
|
||||
|
||||
#: forms/fields.py:437
|
||||
#: forms/fields.py:436
|
||||
msgid "The submitted file is empty."
|
||||
msgstr "Пребачен фајл је празан."
|
||||
|
||||
#: forms/fields.py:438
|
||||
#: forms/fields.py:437
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Ensure this filename has at most %(max)d characters (it has %(length)d)."
|
||||
msgstr ""
|
||||
"Назив фајла мора да садржи бар %(max)d словних места (тренутно има %(length)"
|
||||
"d)."
|
||||
"Назив фајла мора да садржи бар %(max)d словних места (тренутно има "
|
||||
"%(length)d)."
|
||||
|
||||
#: forms/fields.py:473
|
||||
#: forms/fields.py:472
|
||||
msgid ""
|
||||
"Upload a valid image. The file you uploaded was either not an image or a "
|
||||
"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
|
||||
msgid "Select a valid choice. %(value)s is not one of the available choices."
|
||||
msgstr ""
|
||||
"%(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."
|
||||
msgstr "Унесите листу вредности."
|
||||
|
||||
#: forms/formsets.py:298 forms/formsets.py:300
|
||||
#: forms/formsets.py:296 forms/formsets.py:298
|
||||
msgid "Order"
|
||||
msgstr "Редослед"
|
||||
|
||||
@ -5103,23 +5116,23 @@ msgstr "%(number)d %(type)s"
|
||||
msgid ", %(number)d %(type)s"
|
||||
msgstr ", %(number)d %(type)s"
|
||||
|
||||
#: utils/translation/trans_real.py:518
|
||||
#: utils/translation/trans_real.py:519
|
||||
msgid "DATE_FORMAT"
|
||||
msgstr "j. F Y."
|
||||
|
||||
#: utils/translation/trans_real.py:519
|
||||
#: utils/translation/trans_real.py:520
|
||||
msgid "DATETIME_FORMAT"
|
||||
msgstr "j. F Y. H:i Т"
|
||||
|
||||
#: utils/translation/trans_real.py:520
|
||||
#: utils/translation/trans_real.py:521
|
||||
msgid "TIME_FORMAT"
|
||||
msgstr "G:i"
|
||||
|
||||
#: utils/translation/trans_real.py:541
|
||||
#: utils/translation/trans_real.py:542
|
||||
msgid "YEAR_MONTH_FORMAT"
|
||||
msgstr "F Y."
|
||||
|
||||
#: utils/translation/trans_real.py:542
|
||||
#: utils/translation/trans_real.py:543
|
||||
msgid "MONTH_DAY_FORMAT"
|
||||
msgstr "j. F"
|
||||
|
||||
|
Binary file not shown.
@ -4,50 +4,24 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Django\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"
|
||||
"Last-Translator: Janos Guljas <janos@janos.in.rs>\n"
|
||||
"Language-Team: Branko Vukelic <bg.branko@gmail.com> & Janos Guljas "
|
||||
"<janos@janos.in.rs> & Nesh <djnesh@gmail.com> & Petar <petar.maric@gmail."
|
||||
"com>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
|
||||
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
|
||||
#: 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 "Направите избор и кликните "
|
||||
"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"
|
||||
|
||||
#: 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] "%(sel)s од %(cnt)s изабран"
|
||||
@ -55,7 +29,6 @@ msgstr[1] "%(sel)s од %(cnt)s изабрано"
|
||||
msgstr[2] "%(sel)s од %(cnt)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."
|
||||
@ -151,3 +124,21 @@ msgstr "Јуче"
|
||||
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:184
|
||||
msgid "Tomorrow"
|
||||
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 "Направите избор и кликните "
|
||||
|
@ -11,9 +11,9 @@ SHORT_DATE_FORMAT = 'j.m.Y.'
|
||||
SHORT_DATETIME_FORMAT = 'j.m.Y. H:i'
|
||||
FIRST_DAY_OF_WEEK = 1
|
||||
DATE_INPUT_FORMATS = (
|
||||
'%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.'
|
||||
'%Y-%m-%d', # '2006-10-25'
|
||||
# '%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.'
|
||||
@ -23,9 +23,6 @@ TIME_INPUT_FORMATS = (
|
||||
'%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'
|
||||
'%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.'
|
||||
@ -38,7 +35,10 @@ DATETIME_INPUT_FORMATS = (
|
||||
'%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', # '2006-10-25 14:30'
|
||||
'%Y-%m-%d', # '2006-10-25'
|
||||
)
|
||||
DECIMAL_SEPARATOR = '.'
|
||||
THOUSAND_SEPARATOR = ','
|
||||
DECIMAL_SEPARATOR = ','
|
||||
THOUSAND_SEPARATOR = '.'
|
||||
NUMBER_GROUPING = 3
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -11,9 +11,9 @@ SHORT_DATE_FORMAT = 'j.m.Y.'
|
||||
SHORT_DATETIME_FORMAT = 'j.m.Y. H:i'
|
||||
FIRST_DAY_OF_WEEK = 1
|
||||
DATE_INPUT_FORMATS = (
|
||||
'%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.'
|
||||
'%Y-%m-%d', # '2006-10-25'
|
||||
# '%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.'
|
||||
@ -23,9 +23,6 @@ TIME_INPUT_FORMATS = (
|
||||
'%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'
|
||||
'%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.'
|
||||
@ -38,7 +35,10 @@ DATETIME_INPUT_FORMATS = (
|
||||
'%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', # '2006-10-25 14:30'
|
||||
'%Y-%m-%d', # '2006-10-25'
|
||||
)
|
||||
DECIMAL_SEPARATOR = '.'
|
||||
THOUSAND_SEPARATOR = ','
|
||||
DECIMAL_SEPARATOR = ','
|
||||
THOUSAND_SEPARATOR = '.'
|
||||
NUMBER_GROUPING = 3
|
||||
|
@ -91,4 +91,6 @@ INSTALLED_APPS = (
|
||||
'django.contrib.messages',
|
||||
# Uncomment the next line to enable the admin:
|
||||
# 'django.contrib.admin',
|
||||
# Uncomment the next line to enable admin documentation:
|
||||
# 'django.contrib.admindocs',
|
||||
)
|
||||
|
@ -8,8 +8,7 @@ urlpatterns = patterns('',
|
||||
# Example:
|
||||
# (r'^{{ project_name }}/', include('{{ project_name }}.foo.urls')),
|
||||
|
||||
# Uncomment the admin/doc line below and add 'django.contrib.admindocs'
|
||||
# to INSTALLED_APPS to enable admin documentation:
|
||||
# Uncomment the admin/doc line below to enable admin documentation:
|
||||
# (r'^admin/doc/', include('django.contrib.admindocs.urls')),
|
||||
|
||||
# Uncomment the next line to enable the admin:
|
||||
|
@ -445,6 +445,14 @@ ul.messagelist li {
|
||||
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 {
|
||||
font-size: 12px !important;
|
||||
display: block;
|
||||
@ -470,6 +478,11 @@ ul.errorlist {
|
||||
background: red url(../img/admin/icon_alert.gif) 5px .3em no-repeat;
|
||||
}
|
||||
|
||||
.errorlist li a {
|
||||
color: white;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
td ul.errorlist {
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
|
@ -9,6 +9,8 @@
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.change-list .hiddenfields { display:none; }
|
||||
|
||||
.change-list .filtered table {
|
||||
border-right: 1px solid #ddd;
|
||||
}
|
||||
@ -21,7 +23,7 @@
|
||||
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;
|
||||
width: auto !important;
|
||||
}
|
||||
|
@ -100,8 +100,9 @@ var dateParsePatterns = [
|
||||
{ re: /^(\d{1,2})(?:st|nd|rd|th)? (\w+)$/i,
|
||||
handler: function(bits) {
|
||||
var d = new Date();
|
||||
d.setDate(parseInt(bits[1], 10));
|
||||
d.setDate(1);
|
||||
d.setMonth(parseMonth(bits[2]));
|
||||
d.setDate(parseInt(bits[1], 10));
|
||||
return d;
|
||||
}
|
||||
},
|
||||
@ -109,9 +110,10 @@ var dateParsePatterns = [
|
||||
{ re: /^(\d{1,2})(?:st|nd|rd|th)? (\w+),? (\d{4})$/i,
|
||||
handler: function(bits) {
|
||||
var d = new Date();
|
||||
d.setDate(parseInt(bits[1], 10));
|
||||
d.setMonth(parseMonth(bits[2]));
|
||||
d.setDate(1);
|
||||
d.setYear(bits[3]);
|
||||
d.setMonth(parseMonth(bits[2]));
|
||||
d.setDate(parseInt(bits[1], 10));
|
||||
return d;
|
||||
}
|
||||
},
|
||||
@ -119,8 +121,9 @@ var dateParsePatterns = [
|
||||
{ re: /^(\w+) (\d{1,2})(?:st|nd|rd|th)?$/i,
|
||||
handler: function(bits) {
|
||||
var d = new Date();
|
||||
d.setDate(parseInt(bits[2], 10));
|
||||
d.setDate(1);
|
||||
d.setMonth(parseMonth(bits[1]));
|
||||
d.setDate(parseInt(bits[2], 10));
|
||||
return d;
|
||||
}
|
||||
},
|
||||
@ -128,9 +131,10 @@ var dateParsePatterns = [
|
||||
{ re: /^(\w+) (\d{1,2})(?:st|nd|rd|th)?,? (\d{4})$/i,
|
||||
handler: function(bits) {
|
||||
var d = new Date();
|
||||
d.setDate(parseInt(bits[2], 10));
|
||||
d.setMonth(parseMonth(bits[1]));
|
||||
d.setDate(1);
|
||||
d.setYear(bits[3]);
|
||||
d.setMonth(parseMonth(bits[1]));
|
||||
d.setDate(parseInt(bits[2], 10));
|
||||
return d;
|
||||
}
|
||||
},
|
||||
@ -158,9 +162,10 @@ var dateParsePatterns = [
|
||||
{ re: /(\d{1,2})\/(\d{1,2})\/(\d{4})/,
|
||||
handler: function(bits) {
|
||||
var d = new Date();
|
||||
d.setDate(1);
|
||||
d.setYear(bits[3]);
|
||||
d.setDate(parseInt(bits[2], 10));
|
||||
d.setMonth(parseInt(bits[1], 10) - 1); // Because months indexed from 0
|
||||
d.setDate(parseInt(bits[2], 10));
|
||||
return d;
|
||||
}
|
||||
},
|
||||
@ -168,6 +173,7 @@ var dateParsePatterns = [
|
||||
{ re: /(\d{4})-(\d{1,2})-(\d{1,2})/,
|
||||
handler: function(bits) {
|
||||
var d = new Date();
|
||||
d.setDate(1);
|
||||
d.setYear(parseInt(bits[1]));
|
||||
d.setMonth(parseInt(bits[2], 10) - 1);
|
||||
d.setDate(parseInt(bits[3], 10));
|
||||
|
@ -108,7 +108,13 @@ class BaseModelAdmin(object):
|
||||
# rendered output. formfield can be None if it came from a
|
||||
# OneToOneField with parent_link=True or a M2M intermediary.
|
||||
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
|
||||
|
||||
@ -502,7 +508,7 @@ class ModelAdmin(BaseModelAdmin):
|
||||
|
||||
# Convert the actions into a SortedDict keyed by name
|
||||
# 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([
|
||||
(name, (func, name, desc))
|
||||
for func, name, desc in actions
|
||||
@ -755,7 +761,7 @@ class ModelAdmin(BaseModelAdmin):
|
||||
if isinstance(response, HttpResponse):
|
||||
return response
|
||||
else:
|
||||
return HttpResponseRedirect(".")
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
else:
|
||||
msg = _("No action selected.")
|
||||
self.message_user(request, msg)
|
||||
|
@ -380,11 +380,11 @@ class AdminSite(object):
|
||||
|
||||
# Sort the apps alphabetically.
|
||||
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.
|
||||
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 = {
|
||||
'title': _('Site administration'),
|
||||
@ -445,7 +445,7 @@ class AdminSite(object):
|
||||
if not app_dict:
|
||||
raise http.Http404('The requested admin page does not exist.')
|
||||
# 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 = {
|
||||
'title': _('%s administration') % app_instance.verbose_name,
|
||||
'app_list': [app_dict],
|
||||
|
@ -2,8 +2,11 @@
|
||||
{% load i18n %}
|
||||
|
||||
{% 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>
|
||||
<input type="hidden" name="_continue" value="1" />
|
||||
{% else %}
|
||||
<p>{% trans "Enter a username and password." %}</p>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
{% block after_field_sets %}
|
||||
|
@ -56,7 +56,9 @@
|
||||
{% endif %}
|
||||
|
||||
{% 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 %}
|
||||
|
||||
<!-- Content -->
|
||||
|
@ -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 %}
|
||||
<div class="results">
|
||||
<table cellspacing="0" id="result_list">
|
||||
<thead>
|
||||
<tr>
|
||||
@ -14,4 +20,5 @@
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
@ -189,7 +189,7 @@ def items_for_result(cl, result, form):
|
||||
else:
|
||||
result_repr = conditional_escape(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]))
|
||||
|
||||
def results(cl):
|
||||
@ -200,11 +200,18 @@ def results(cl):
|
||||
for res in cl.result_list:
|
||||
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):
|
||||
"""
|
||||
Displays the headers and data list together
|
||||
"""
|
||||
return {'cl': cl,
|
||||
'result_hidden_fields': list(result_hidden_fields(cl)),
|
||||
'result_headers': list(result_headers(cl)),
|
||||
'results': list(results(cl))}
|
||||
result_list = register.inclusion_tag("admin/change_list_results.html")(result_list)
|
||||
|
@ -154,9 +154,9 @@ class ForeignKeyRawIdWidget(forms.TextInput):
|
||||
key = self.rel.get_related_field().name
|
||||
try:
|
||||
obj = self.rel.to._default_manager.using(self.db).get(**{key: value})
|
||||
except self.rel.to.DoesNotExist:
|
||||
return ' <strong>%s</strong>' % escape(truncate_words(obj, 14))
|
||||
except (ValueError, self.rel.to.DoesNotExist):
|
||||
return ''
|
||||
return ' <strong>%s</strong>' % escape(truncate_words(obj, 14))
|
||||
|
||||
class ManyToManyRawIdWidget(ForeignKeyRawIdWidget):
|
||||
"""
|
||||
@ -169,7 +169,7 @@ class ManyToManyRawIdWidget(ForeignKeyRawIdWidget):
|
||||
def render(self, name, value, attrs=None):
|
||||
attrs['class'] = 'vManyToManyRawIdAdminField'
|
||||
if value:
|
||||
value = ','.join([str(v) for v in value])
|
||||
value = ','.join([force_unicode(v) for v in value])
|
||||
else:
|
||||
value = ''
|
||||
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
|
||||
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.needs_multipart_form = widget.needs_multipart_form
|
||||
self.attrs = widget.attrs
|
||||
self.choices = widget.choices
|
||||
self.widget = widget
|
||||
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
|
||||
self.admin_site = admin_site
|
||||
|
||||
@ -236,7 +241,7 @@ class RelatedFieldWidgetWrapper(forms.Widget):
|
||||
related_url = '%s%s/%s/add/' % info
|
||||
self.widget.choices = self.choices
|
||||
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
|
||||
# API to determine the ID dynamically.
|
||||
output.append(u'<a href="%s" class="add-another" id="add_id_%s" onclick="return showAddAnotherPopup(this);"> ' % \
|
||||
|
@ -15,7 +15,7 @@
|
||||
<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 %}
|
||||
{% 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.body }}</p>
|
||||
{% if not forloop.last %}<hr />{% endif %}
|
||||
@ -36,7 +36,7 @@
|
||||
<h2>{% firstof library.grouper "Built-in filters" %}</h2>
|
||||
<ul>
|
||||
{% 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 %}
|
||||
</ul>
|
||||
</div>
|
||||
|
@ -15,7 +15,7 @@
|
||||
<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 %}
|
||||
{% 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>
|
||||
<p>{{ tag.body }}</p>
|
||||
{% if not forloop.last %}<hr />{% endif %}
|
||||
@ -36,7 +36,7 @@
|
||||
<h2>{% firstof library.grouper "Built-in tags" %}</h2>
|
||||
<ul>
|
||||
{% 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 %}
|
||||
</ul>
|
||||
</div>
|
||||
|
@ -54,7 +54,9 @@ def template_tag_index(request):
|
||||
load_all_installed_template_libraries()
|
||||
|
||||
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():
|
||||
title, body, metadata = utils.parse_docstring(tag_func.__doc__)
|
||||
if title:
|
||||
@ -87,7 +89,9 @@ def template_filter_index(request):
|
||||
load_all_installed_template_libraries()
|
||||
|
||||
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():
|
||||
title, body, metadata = utils.parse_docstring(filter_func.__doc__)
|
||||
if title:
|
||||
|
@ -30,13 +30,14 @@ def user_passes_test(test_func, login_url=None, redirect_field_name=REDIRECT_FIE
|
||||
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
|
||||
to the log-in page if necessary.
|
||||
"""
|
||||
actual_decorator = user_passes_test(
|
||||
lambda u: u.is_authenticated(),
|
||||
login_url=login_url,
|
||||
redirect_field_name=redirect_field_name
|
||||
)
|
||||
if function:
|
||||
|
@ -52,6 +52,12 @@ class UserChangeForm(forms.ModelForm):
|
||||
class Meta:
|
||||
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):
|
||||
"""
|
||||
Base class for authenticating users. Extend this to get a form that accepts
|
||||
@ -111,7 +117,7 @@ class PasswordResetForm(forms.Form):
|
||||
return email
|
||||
|
||||
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
|
||||
"""
|
||||
@ -134,7 +140,7 @@ class PasswordResetForm(forms.Form):
|
||||
'protocol': use_https and 'https' or 'http',
|
||||
}
|
||||
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):
|
||||
"""
|
||||
|
@ -1,7 +1,7 @@
|
||||
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.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 \
|
||||
import RemoteUserTest, RemoteUserNoCreateTest, RemoteUserCustomTest
|
||||
from django.contrib.auth.tests.models import ProfileTestCase
|
||||
@ -13,6 +13,5 @@ from django.contrib.auth.tests.views \
|
||||
|
||||
__test__ = {
|
||||
'BASIC_TESTS': BASIC_TESTS,
|
||||
'FORM_TESTS': FORM_TESTS,
|
||||
'TOKEN_GENERATOR_TESTS': TOKEN_GENERATOR_TESTS,
|
||||
}
|
||||
|
@ -1,12 +1,12 @@
|
||||
from unittest import TestCase
|
||||
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.contrib.auth.tests.views import AuthViewsTestCase
|
||||
|
||||
|
||||
class LoginRequiredTestCase(TestCase):
|
||||
class LoginRequiredTestCase(AuthViewsTestCase):
|
||||
"""
|
||||
Tests the login_required decorators
|
||||
"""
|
||||
urls = 'django.contrib.auth.tests.urls'
|
||||
|
||||
def testCallable(self):
|
||||
"""
|
||||
Check that login_required is assignable to callable objects.
|
||||
@ -22,4 +22,24 @@ class LoginRequiredTestCase(TestCase):
|
||||
"""
|
||||
def normal_view(request):
|
||||
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/')
|
@ -1,231 +1,252 @@
|
||||
|
||||
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.
|
||||
|
||||
>>> user = User.objects.create_user("jsmith", "jsmith@example.com", "test123")
|
||||
>>> 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.
|
||||
|
||||
>>> data = {
|
||||
... 'username': 'jsmith!',
|
||||
... 'password1': 'test123',
|
||||
... 'password2': 'test123',
|
||||
... }
|
||||
>>> form = UserCreationForm(data)
|
||||
>>> form.is_valid()
|
||||
False
|
||||
>>> form["username"].errors
|
||||
[u'This value may contain only letters, numbers and @/./+/-/_ characters.']
|
||||
|
||||
# The verification password is incorrect.
|
||||
|
||||
>>> 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."]
|
||||
|
||||
# One (or both) passwords weren't given
|
||||
|
||||
>>> 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'
|
||||
>>> form = UserCreationForm(data)
|
||||
>>> form.is_valid()
|
||||
False
|
||||
>>> form['password1'].errors
|
||||
[u'This field is required.']
|
||||
|
||||
# The success case.
|
||||
|
||||
>>> data = {
|
||||
... 'username': 'jsmith2@example.com',
|
||||
... 'password1': 'test123',
|
||||
... 'password2': 'test123',
|
||||
... }
|
||||
>>> form = UserCreationForm(data)
|
||||
>>> form.is_valid()
|
||||
True
|
||||
>>> form.save()
|
||||
<User: jsmith2@example.com>
|
||||
|
||||
# The user submits an invalid username.
|
||||
|
||||
>>> data = {
|
||||
... 'username': 'jsmith_does_not_exist',
|
||||
... 'password': 'test123',
|
||||
... }
|
||||
|
||||
>>> form = AuthenticationForm(None, data)
|
||||
>>> form.is_valid()
|
||||
False
|
||||
>>> form.non_field_errors()
|
||||
[u'Please enter a correct username and password. Note that both fields are case-sensitive.']
|
||||
|
||||
# The user 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()
|
||||
|
||||
# The success case
|
||||
|
||||
>>> form = AuthenticationForm(None, data)
|
||||
>>> form.is_valid()
|
||||
True
|
||||
>>> form.non_field_errors()
|
||||
[]
|
||||
|
||||
### SetPasswordForm:
|
||||
|
||||
# The two new passwords do not match.
|
||||
|
||||
>>> data = {
|
||||
... 'new_password1': 'abc123',
|
||||
... 'new_password2': 'abc',
|
||||
... }
|
||||
>>> form = SetPasswordForm(user, data)
|
||||
>>> form.is_valid()
|
||||
False
|
||||
>>> form["new_password2"].errors
|
||||
[u"The two password fields didn't match."]
|
||||
|
||||
# The success case.
|
||||
|
||||
>>> data = {
|
||||
... 'new_password1': 'abc123',
|
||||
... 'new_password2': 'abc123',
|
||||
... }
|
||||
>>> form = SetPasswordForm(user, data)
|
||||
>>> form.is_valid()
|
||||
True
|
||||
|
||||
### PasswordChangeForm:
|
||||
|
||||
The old password is incorrect.
|
||||
|
||||
>>> 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.']
|
||||
|
||||
# The two new passwords do not 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."]
|
||||
|
||||
# The success case.
|
||||
|
||||
>>> data = {
|
||||
... 'old_password': 'test123',
|
||||
... 'new_password1': 'abc123',
|
||||
... 'new_password2': 'abc123',
|
||||
... }
|
||||
>>> form = PasswordChangeForm(user, data)
|
||||
>>> form.is_valid()
|
||||
True
|
||||
|
||||
# Regression test - check the order of fields:
|
||||
|
||||
>>> PasswordChangeForm(user, {}).fields.keys()
|
||||
['old_password', 'new_password1', 'new_password2']
|
||||
|
||||
### UserChangeForm
|
||||
|
||||
>>> from django.contrib.auth.forms import UserChangeForm
|
||||
>>> data = {'username': 'not valid'}
|
||||
>>> form = UserChangeForm(data, instance=user)
|
||||
>>> form.is_valid()
|
||||
False
|
||||
>>> form['username'].errors
|
||||
[u'This value may contain only letters, numbers and @/./+/-/_ characters.']
|
||||
from django.contrib.auth.models import User
|
||||
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm, PasswordChangeForm, SetPasswordForm, UserChangeForm, PasswordResetForm
|
||||
from django.test import TestCase
|
||||
|
||||
|
||||
### PasswordResetForm
|
||||
class UserCreationFormTest(TestCase):
|
||||
|
||||
>>> from django.contrib.auth.forms import PasswordResetForm
|
||||
>>> data = {'email':'not valid'}
|
||||
>>> form = PasswordResetForm(data)
|
||||
>>> form.is_valid()
|
||||
False
|
||||
>>> form['email'].errors
|
||||
[u'Enter a valid e-mail address.']
|
||||
fixtures = ['authtestdata.json']
|
||||
|
||||
# Test nonexistant email address
|
||||
>>> data = {'email':'foo@bar.com'}
|
||||
>>> form = PasswordResetForm(data)
|
||||
>>> form.is_valid()
|
||||
False
|
||||
>>> form.errors
|
||||
{'email': [u"That e-mail address doesn't have an associated user account. Are you sure you've registered?"]}
|
||||
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.'])
|
||||
|
||||
# Test cleaned_data bug fix
|
||||
>>> user = User.objects.create_user("jsmith3", "jsmith3@example.com", "test123")
|
||||
>>> data = {'email':'jsmith3@example.com'}
|
||||
>>> form = PasswordResetForm(data)
|
||||
>>> form.is_valid()
|
||||
True
|
||||
>>> form.cleaned_data['email']
|
||||
u'jsmith3@example.com'
|
||||
def test_invalid_data(self):
|
||||
data = {
|
||||
'username': 'jsmith!',
|
||||
'password1': 'test123',
|
||||
'password2': 'test123',
|
||||
}
|
||||
form = UserCreationForm(data)
|
||||
self.assertFalse(form.is_valid())
|
||||
self.assertEqual(form["username"].errors,
|
||||
[u'This value may contain only letters, numbers and @/./+/-/_ characters.'])
|
||||
|
||||
# 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_password_verification(self):
|
||||
# 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."])
|
||||
|
||||
|
||||
def test_both_passwords(self):
|
||||
# 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['password2'] = 'test123'
|
||||
form = UserCreationForm(data)
|
||||
self.assertFalse(form.is_valid())
|
||||
self.assertEqual(form['password1'].errors,
|
||||
[u'This field is required.'])
|
||||
|
||||
def test_success(self):
|
||||
# The success case.
|
||||
|
||||
data = {
|
||||
'username': 'jsmith@example.com',
|
||||
'password1': 'test123',
|
||||
'password2': 'test123',
|
||||
}
|
||||
form = UserCreationForm(data)
|
||||
self.assertTrue(form.is_valid())
|
||||
u = form.save()
|
||||
self.assertEqual(repr(u), '<User: jsmith@example.com>')
|
||||
|
||||
|
||||
class AuthenticationFormTest(TestCase):
|
||||
|
||||
fixtures = ['authtestdata.json']
|
||||
|
||||
def test_invalid_username(self):
|
||||
# The user submits an invalid username.
|
||||
|
||||
data = {
|
||||
'username': 'jsmith_does_not_exist',
|
||||
'password': 'test123',
|
||||
}
|
||||
form = AuthenticationForm(None, data)
|
||||
self.assertFalse(form.is_valid())
|
||||
self.assertEqual(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.
|
||||
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.'])
|
||||
|
||||
|
||||
def test_success(self):
|
||||
# The success case
|
||||
data = {
|
||||
'username': 'testclient',
|
||||
'password': 'password',
|
||||
}
|
||||
form = AuthenticationForm(None, data)
|
||||
self.assertTrue(form.is_valid())
|
||||
self.assertEqual(form.non_field_errors(), [])
|
||||
|
||||
|
||||
class SetPasswordFormTest(TestCase):
|
||||
|
||||
fixtures = ['authtestdata.json']
|
||||
|
||||
def test_password_verification(self):
|
||||
# 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."])
|
||||
|
||||
def test_success(self):
|
||||
user = User.objects.get(username='testclient')
|
||||
data = {
|
||||
'new_password1': 'abc123',
|
||||
'new_password2': 'abc123',
|
||||
}
|
||||
form = SetPasswordForm(user, data)
|
||||
self.assertTrue(form.is_valid())
|
||||
|
||||
|
||||
class PasswordChangeFormTest(TestCase):
|
||||
|
||||
fixtures = ['authtestdata.json']
|
||||
|
||||
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.'])
|
||||
|
||||
|
||||
def test_password_verification(self):
|
||||
# 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."])
|
||||
|
||||
|
||||
def test_success(self):
|
||||
# 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())
|
||||
|
||||
def test_field_order(self):
|
||||
# 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'])
|
||||
|
||||
class UserChangeFormTest(TestCase):
|
||||
|
||||
fixtures = ['authtestdata.json']
|
||||
|
||||
def test_username_validity(self):
|
||||
user = User.objects.get(username='testclient')
|
||||
data = {'username': 'not valid'}
|
||||
form = UserChangeForm(data, instance=user)
|
||||
self.assertFalse(form.is_valid())
|
||||
self.assertEqual(form['username'].errors,
|
||||
[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({})
|
||||
|
||||
|
||||
class PasswordResetFormTest(TestCase):
|
||||
|
||||
fixtures = ['authtestdata.json']
|
||||
|
||||
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
|
||||
data = {'email':'foo@bar.com'}
|
||||
form = PasswordResetForm(data)
|
||||
self.assertFalse(form.is_valid())
|
||||
self.assertEqual(form.errors,
|
||||
{'email': [u"That e-mail address doesn't have an associated user account. Are you sure you've registered?"]})
|
||||
|
||||
def test_cleaned_data(self):
|
||||
# Regression test
|
||||
user = User.objects.create_user("jsmith3", "jsmith3@example.com", "test123")
|
||||
data = {'email':'jsmith3@example.com'}
|
||||
form = PasswordResetForm(data)
|
||||
self.assertTrue(form.is_valid())
|
||||
self.assertEqual(form.cleaned_data['email'], u'jsmith3@example.com')
|
||||
|
||||
|
||||
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')
|
||||
|
@ -1,5 +1,7 @@
|
||||
from django.conf.urls.defaults import patterns
|
||||
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.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/next_page/$', 'django.contrib.auth.views.logout', dict(next_page='/somewhere/')),
|
||||
(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/')),
|
||||
)
|
||||
|
||||
|
@ -36,6 +36,16 @@ class AuthViewsTestCase(TestCase):
|
||||
settings.LANGUAGE_CODE = self.old_LANGUAGE_CODE
|
||||
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):
|
||||
|
||||
def test_email_not_found(self):
|
||||
@ -52,6 +62,14 @@ class PasswordResetTest(AuthViewsTestCase):
|
||||
self.assertEquals(response.status_code, 302)
|
||||
self.assertEquals(len(mail.outbox), 1)
|
||||
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):
|
||||
# Start by creating the email
|
||||
@ -118,15 +136,6 @@ class PasswordResetTest(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'):
|
||||
response = self.client.post('/login/', {
|
||||
'username': 'testclient',
|
||||
@ -228,16 +237,6 @@ class LoginTest(AuthViewsTestCase):
|
||||
class LogoutTest(AuthViewsTestCase):
|
||||
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):
|
||||
self.assert_(SESSION_KEY not in self.client.session)
|
||||
|
||||
|
@ -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',
|
||||
email_template_name='registration/password_reset_email.html',
|
||||
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:
|
||||
post_reset_redirect = reverse('django.contrib.auth.views.password_reset_done')
|
||||
if request.method == "POST":
|
||||
@ -114,6 +114,7 @@ def password_reset(request, is_admin_site=False, template_name='registration/pas
|
||||
opts = {}
|
||||
opts['use_https'] = request.is_secure()
|
||||
opts['token_generator'] = token_generator
|
||||
opts['from_email'] = from_email
|
||||
if is_admin_site:
|
||||
opts['domain_override'] = request.META['HTTP_HOST']
|
||||
else:
|
||||
|
@ -60,7 +60,7 @@ class CalendarPlugin(DatabrowsePlugin):
|
||||
def homepage_view(self, request):
|
||||
easy_model = EasyModel(self.site, self.model)
|
||||
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})
|
||||
|
||||
def calendar_view(self, request, field, year=None, month=None, day=None):
|
||||
|
@ -61,7 +61,7 @@ class FieldChoicePlugin(DatabrowsePlugin):
|
||||
def homepage_view(self, request):
|
||||
easy_model = EasyModel(self.site, self.model)
|
||||
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})
|
||||
|
||||
def field_view(self, request, field, value=None):
|
||||
|
@ -5,11 +5,11 @@ from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
|
||||
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"
|
||||
" and trailing slashes."),
|
||||
error_message = _("This value must contain only letters, numbers,"
|
||||
" underscores, dashes or slashes."))
|
||||
" dots, underscores, dashes, slashes or tildes."))
|
||||
|
||||
class Meta:
|
||||
model = FlatPage
|
||||
|
63
django/contrib/flatpages/fixtures/sample_flatpages.json
Normal file
63
django/contrib/flatpages/fixtures/sample_flatpages.json
Normal 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
|
||||
}
|
||||
}
|
||||
]
|
0
django/contrib/flatpages/templatetags/__init__.py
Normal file
0
django/contrib/flatpages/templatetags/__init__.py
Normal file
99
django/contrib/flatpages/templatetags/flatpages.py
Normal file
99
django/contrib/flatpages/templatetags/flatpages.py
Normal 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)
|
5
django/contrib/flatpages/tests/__init__.py
Normal file
5
django/contrib/flatpages/tests/__init__.py
Normal 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 *
|
76
django/contrib/flatpages/tests/csrf.py
Normal file
76
django/contrib/flatpages/tests/csrf.py
Normal 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)
|
22
django/contrib/flatpages/tests/forms.py
Normal file
22
django/contrib/flatpages/tests/forms.py
Normal 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())
|
67
django/contrib/flatpages/tests/middleware.py
Normal file
67
django/contrib/flatpages/tests/middleware.py
Normal 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>")
|
1
django/contrib/flatpages/tests/templates/404.html
Normal file
1
django/contrib/flatpages/tests/templates/404.html
Normal file
@ -0,0 +1 @@
|
||||
<h1>Oh Noes!</h1>
|
@ -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>
|
134
django/contrib/flatpages/tests/templatetags.py
Normal file
134
django/contrib/flatpages/tests/templatetags.py
Normal 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%}")
|
||||
|
8
django/contrib/flatpages/tests/urls.py
Normal file
8
django/contrib/flatpages/tests/urls.py
Normal 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')),
|
||||
)
|
||||
|
72
django/contrib/flatpages/tests/views.py
Normal file
72
django/contrib/flatpages/tests/views.py
Normal 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>")
|
@ -13,10 +13,13 @@ DEFAULT_TEMPLATE = 'flatpages/default.html'
|
||||
# when a 404 is raised, which often means CsrfViewMiddleware.process_view
|
||||
# has not been called even if CsrfViewMiddleware is installed. So we need
|
||||
# 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):
|
||||
"""
|
||||
Flat page view.
|
||||
Public interface to the flat page view.
|
||||
|
||||
Models: `flatpages.flatpages`
|
||||
Templates: Uses the template defined by the ``template_name`` field,
|
||||
@ -30,6 +33,13 @@ def flatpage(request, url):
|
||||
if not url.startswith('/'):
|
||||
url = "/" + url
|
||||
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
|
||||
# logged in, redirect to the login page.
|
||||
if f.registration_required and not request.user.is_authenticated():
|
||||
|
@ -27,7 +27,7 @@ class FormWizard(object):
|
||||
def __init__(self, form_list, initial=None):
|
||||
"""
|
||||
Start a new wizard with a list of forms.
|
||||
|
||||
|
||||
form_list should be a list of Form classes (not instances).
|
||||
"""
|
||||
self.form_list = form_list[:]
|
||||
@ -37,7 +37,7 @@ class FormWizard(object):
|
||||
self.extra_context = {}
|
||||
|
||||
# A zero-based counter keeping track of which step we're in.
|
||||
self.step = 0
|
||||
self.step = 0
|
||||
|
||||
def __repr__(self):
|
||||
return "step: %d\nform_list: %s\ninitial_data: %s" % (self.step, self.form_list, self.initial)
|
||||
@ -48,7 +48,7 @@ class FormWizard(object):
|
||||
|
||||
def num_steps(self):
|
||||
"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
|
||||
# hook methods might alter self.form_list.
|
||||
return len(self.form_list)
|
||||
|
@ -6,7 +6,7 @@ class MySQLCreation(DatabaseCreation):
|
||||
from django.contrib.gis.db.models.fields import GeometryField
|
||||
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
|
||||
db_table = model._meta.db_table
|
||||
idx_name = '%s_%s_id' % (db_table, f.column)
|
||||
|
@ -233,8 +233,6 @@ class PostGISOperations(DatabaseOperations, BaseSpatialOperations):
|
||||
})
|
||||
self.geography_operators = {
|
||||
'bboverlaps' : PostGISOperator('&&'),
|
||||
'exact' : PostGISOperator('~='),
|
||||
'same_as' : PostGISOperator('~='),
|
||||
}
|
||||
|
||||
# Creating a dictionary lookup of all GIS terms for PostGIS.
|
||||
|
@ -51,7 +51,7 @@ class DatabaseWrapper(SqliteDatabaseWrapper):
|
||||
self.connection.create_function("django_extract", 2, _sqlite_extract)
|
||||
self.connection.create_function("django_date_trunc", 2, _sqlite_date_trunc)
|
||||
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 ##
|
||||
|
||||
|
@ -95,7 +95,7 @@ class GeoSQLCompiler(compiler.SQLCompiler):
|
||||
return result
|
||||
|
||||
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
|
||||
model. Will sometimes be called to pull in related models (e.g. via
|
||||
@ -121,6 +121,8 @@ class GeoSQLCompiler(compiler.SQLCompiler):
|
||||
if start_alias:
|
||||
seen = {None: start_alias}
|
||||
for field, model in opts.get_fields_with_model():
|
||||
if local_only and model is not None:
|
||||
continue
|
||||
if start_alias:
|
||||
try:
|
||||
alias = seen[model]
|
||||
|
@ -14,10 +14,10 @@ if lib_path:
|
||||
lib_names = None
|
||||
elif os.name == 'nt':
|
||||
# Windows NT shared library
|
||||
lib_names = ['gdal16', 'gdal15']
|
||||
lib_names = ['gdal17', 'gdal16', 'gdal15']
|
||||
elif os.name == 'posix':
|
||||
# *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:
|
||||
raise OGRException('Unsupported OS "%s"' % os.name)
|
||||
|
||||
|
@ -1,115 +1,108 @@
|
||||
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):
|
||||
from django.test.simple import run_tests as base_run_tests
|
||||
return base_run_tests(*args, **kwargs)
|
||||
|
||||
def geo_suite():
|
||||
"""
|
||||
Builds a test suite for the GIS package. This is not named
|
||||
`suite` so it will not interfere with the Django test suite (since
|
||||
spatial database tables are required to execute these tests on
|
||||
some backends).
|
||||
"""
|
||||
from django.conf import settings
|
||||
from django.contrib.gis.geos import GEOS_PREPARE
|
||||
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
|
||||
def run_gis_tests(test_labels, verbosity=1, interactive=True, failfast=False, extra_tests=None):
|
||||
import warnings
|
||||
warnings.warn(
|
||||
'The run_gis_tests() test runner has been deprecated in favor of GeoDjangoTestSuiteRunner.',
|
||||
PendingDeprecationWarning
|
||||
)
|
||||
test_runner = GeoDjangoTestSuiteRunner(verbosity=verbosity, interactive=interactive, failfast=failfast)
|
||||
return test_runner.run_tests(test_labels, extra_tests=extra_tests)
|
||||
|
||||
gis_tests = []
|
||||
class GeoDjangoTestSuiteRunner(DjangoTestSuiteRunner):
|
||||
|
||||
# Adding the GEOS tests.
|
||||
from django.contrib.gis.geos import tests as geos_tests
|
||||
gis_tests.append(geos_tests.suite())
|
||||
|
||||
# Tests that require use of a spatial database (e.g., creation of models)
|
||||
test_apps = ['geoapp', 'relatedapp']
|
||||
if postgis and connection.ops.geography:
|
||||
# Test geography support with PostGIS 1.5+.
|
||||
test_apps.append('geogapp')
|
||||
|
||||
# Tests that do not require setting up and tearing down a spatial database.
|
||||
test_suite_names = [
|
||||
'test_measure',
|
||||
]
|
||||
|
||||
if HAS_GDAL:
|
||||
# These tests require GDAL.
|
||||
if not mysql:
|
||||
test_apps.append('distapp')
|
||||
|
||||
# Only PostGIS using GEOS 3.1+ can support 3D so far.
|
||||
if postgis and GEOS_PREPARE:
|
||||
test_apps.append('geo3d')
|
||||
|
||||
test_suite_names.extend(['test_spatialrefsys', 'test_geoforms'])
|
||||
test_apps.append('layermap')
|
||||
def setup_test_environment(self, **kwargs):
|
||||
super(GeoDjangoTestSuiteRunner, self).setup_test_environment(**kwargs)
|
||||
|
||||
# Adding the GDAL tests.
|
||||
from django.contrib.gis.gdal import tests as gdal_tests
|
||||
gis_tests.append(gdal_tests.suite())
|
||||
else:
|
||||
print >>sys.stderr, "GDAL not available - no tests requiring GDAL will be run."
|
||||
from django.db import connection
|
||||
from django.contrib.gis.geos import GEOS_PREPARE
|
||||
from django.contrib.gis.gdal import HAS_GDAL
|
||||
|
||||
if HAS_GEOIP and hasattr(settings, 'GEOIP_PATH'):
|
||||
test_suite_names.append('test_geoip')
|
||||
# Getting and storing the original values of INSTALLED_APPS and
|
||||
# the ROOT_URLCONF.
|
||||
self.old_installed = settings.INSTALLED_APPS
|
||||
self.old_root_urlconf = settings.ROOT_URLCONF
|
||||
|
||||
# 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())
|
||||
# Tests that require use of a spatial database (e.g., creation of models)
|
||||
self.geo_apps = ['geoapp', 'relatedapp']
|
||||
if connection.ops.postgis and connection.ops.geography:
|
||||
# Test geography support with PostGIS 1.5+.
|
||||
self.geo_apps.append('geogapp')
|
||||
|
||||
return gis_tests, test_apps
|
||||
if HAS_GDAL:
|
||||
# The following GeoDjango test apps depend on GDAL support.
|
||||
if not connection.ops.mysql:
|
||||
self.geo_apps.append('distapp')
|
||||
|
||||
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
|
||||
# 3D apps use LayerMapping, which uses GDAL.
|
||||
if connection.ops.postgis and GEOS_PREPARE:
|
||||
self.geo_apps.append('geo3d')
|
||||
|
||||
# Getting initial values.
|
||||
old_installed = settings.INSTALLED_APPS
|
||||
old_root_urlconf = settings.ROOT_URLCONF
|
||||
self.geo_apps.append('layermap')
|
||||
|
||||
# Overridding the INSTALLED_APPS with only what we need,
|
||||
# to prevent unnecessary database table creation.
|
||||
new_installed = ['django.contrib.sites',
|
||||
'django.contrib.sitemaps',
|
||||
'django.contrib.gis',
|
||||
]
|
||||
# Constructing the new INSTALLED_APPS, and including applications
|
||||
# within the GeoDjango test namespace (`self.geo_apps`).
|
||||
new_installed = ['django.contrib.sites',
|
||||
'django.contrib.sitemaps',
|
||||
'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.
|
||||
settings.ROOT_URLCONF = 'django.contrib.gis.tests.urls'
|
||||
# Setting the URLs.
|
||||
settings.ROOT_URLCONF = 'django.contrib.gis.tests.urls'
|
||||
|
||||
# Creating the test suite, adding the test models to INSTALLED_APPS
|
||||
# so they will be tested.
|
||||
gis_tests, test_apps = geo_suite()
|
||||
for test_model in test_apps:
|
||||
module_name = 'django.contrib.gis.tests.%s' % test_model
|
||||
new_installed.append(module_name)
|
||||
def teardown_test_environment(self, **kwargs):
|
||||
super(GeoDjangoTestSuiteRunner, self).teardown_test_environment(**kwargs)
|
||||
settings.INSTALLED_APPS = self.old_installed
|
||||
settings.ROOT_URLCONF = self.old_root_urlconf
|
||||
|
||||
# Resetting the loaded flag to take into account what we appended to
|
||||
# the INSTALLED_APPS (since this routine is invoked through
|
||||
# django/core/management, it caches the apps; this ensures that syncdb
|
||||
# will see our appended models)
|
||||
settings.INSTALLED_APPS = new_installed
|
||||
loading.cache.loaded = False
|
||||
def build_suite(self, test_labels, extra_tests=None, **kwargs):
|
||||
"""
|
||||
This method is overridden to construct a suite consisting only of tests
|
||||
for GeoDjango.
|
||||
"""
|
||||
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.
|
||||
result = run_tests(test_labels, **kwargs)
|
||||
# Adding the measurment tests.
|
||||
from django.contrib.gis.tests import test_measure
|
||||
suite.addTest(test_measure.suite())
|
||||
|
||||
# Restoring modified settings.
|
||||
settings.INSTALLED_APPS = old_installed
|
||||
settings.ROOT_URLCONF = old_root_urlconf
|
||||
# Adding GDAL tests, and any test suite that depends on GDAL, to the
|
||||
# suite if GDAL is available.
|
||||
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
|
||||
|
@ -44,6 +44,10 @@ class GeographyTest(TestCase):
|
||||
# `@` operator not available.
|
||||
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):
|
||||
"Testing LayerMapping support on models with geography fields."
|
||||
# There is a similar test in `layermap` that uses the same data set,
|
||||
|
@ -38,6 +38,11 @@ class Author(models.Model):
|
||||
name = models.CharField(max_length=100)
|
||||
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):
|
||||
title = models.CharField(max_length=100)
|
||||
author = models.ForeignKey(Author, related_name='books', null=True)
|
||||
|
@ -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.tests.utils import mysql, oracle, postgis, spatialite, no_mysql, no_oracle, no_spatialite
|
||||
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),
|
||||
('Roswell', 'NM', -104.528056, 33.387222),
|
||||
@ -291,6 +291,14 @@ class RelatedGeoModelTest(unittest.TestCase):
|
||||
self.assertEqual(4, len(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.
|
||||
|
||||
def suite():
|
||||
|
@ -7,43 +7,43 @@ when explicitly needed.
|
||||
"""
|
||||
|
||||
STATE_CHOICES = (
|
||||
'KA', 'Karnataka',
|
||||
'AP', 'Andhra Pradesh',
|
||||
'KL', 'Kerala',
|
||||
'TN', 'Tamil Nadu',
|
||||
'MH', 'Maharashtra',
|
||||
'UP', 'Uttar Pradesh',
|
||||
'GA', 'Goa',
|
||||
'GJ', 'Gujarat',
|
||||
'RJ', 'Rajasthan',
|
||||
'HP', 'Himachal Pradesh',
|
||||
'JK', 'Jammu and Kashmir',
|
||||
'AR', 'Arunachal Pradesh',
|
||||
'AS', 'Assam',
|
||||
'BR', 'Bihar',
|
||||
'CG', 'Chattisgarh',
|
||||
'HR', 'Haryana',
|
||||
'JH', 'Jharkhand',
|
||||
'MP', 'Madhya Pradesh',
|
||||
'MN', 'Manipur',
|
||||
'ML', 'Meghalaya',
|
||||
'MZ', 'Mizoram',
|
||||
'NL', 'Nagaland',
|
||||
'OR', 'Orissa',
|
||||
'PB', 'Punjab',
|
||||
'SK', 'Sikkim',
|
||||
'TR', 'Tripura',
|
||||
'UA', 'Uttarakhand',
|
||||
'WB', 'West Bengal',
|
||||
('KA', 'Karnataka'),
|
||||
('AP', 'Andhra Pradesh'),
|
||||
('KL', 'Kerala'),
|
||||
('TN', 'Tamil Nadu'),
|
||||
('MH', 'Maharashtra'),
|
||||
('UP', 'Uttar Pradesh'),
|
||||
('GA', 'Goa'),
|
||||
('GJ', 'Gujarat'),
|
||||
('RJ', 'Rajasthan'),
|
||||
('HP', 'Himachal Pradesh'),
|
||||
('JK', 'Jammu and Kashmir'),
|
||||
('AR', 'Arunachal Pradesh'),
|
||||
('AS', 'Assam'),
|
||||
('BR', 'Bihar'),
|
||||
('CG', 'Chattisgarh'),
|
||||
('HR', 'Haryana'),
|
||||
('JH', 'Jharkhand'),
|
||||
('MP', 'Madhya Pradesh'),
|
||||
('MN', 'Manipur'),
|
||||
('ML', 'Meghalaya'),
|
||||
('MZ', 'Mizoram'),
|
||||
('NL', 'Nagaland'),
|
||||
('OR', 'Orissa'),
|
||||
('PB', 'Punjab'),
|
||||
('SK', 'Sikkim'),
|
||||
('TR', 'Tripura'),
|
||||
('UA', 'Uttarakhand'),
|
||||
('WB', 'West Bengal'),
|
||||
|
||||
# Union Territories
|
||||
'AN', 'Andaman and Nicobar',
|
||||
'CH', 'Chandigarh',
|
||||
'DN', 'Dadra and Nagar Haveli',
|
||||
'DD', 'Daman and Diu',
|
||||
'DL', 'Delhi',
|
||||
'LD', 'Lakshadweep',
|
||||
'PY', 'Pondicherry',
|
||||
('AN', 'Andaman and Nicobar'),
|
||||
('CH', 'Chandigarh'),
|
||||
('DN', 'Dadra and Nagar Haveli'),
|
||||
('DD', 'Daman and Diu'),
|
||||
('DL', 'Delhi'),
|
||||
('LD', 'Lakshadweep'),
|
||||
('PY', 'Pondicherry'),
|
||||
)
|
||||
|
||||
STATES_NORMALIZED = {
|
||||
|
@ -22,7 +22,7 @@ Paragraph 2 with "quotes" and @code@"""
|
||||
t = Template("{{ textile_content|textile }}")
|
||||
rendered = t.render(Context(locals())).strip()
|
||||
if textile:
|
||||
self.assertEqual(rendered, """<p>Paragraph 1</p>
|
||||
self.assertEqual(rendered.replace('\t', ''), """<p>Paragraph 1</p>
|
||||
|
||||
<p>Paragraph 2 with “quotes” and <code>code</code></p>""")
|
||||
else:
|
||||
|
@ -58,7 +58,7 @@ class SessionStore(SessionBase):
|
||||
finally:
|
||||
session_file.close()
|
||||
except IOError:
|
||||
pass
|
||||
self.create()
|
||||
return session_data
|
||||
|
||||
def create(self):
|
||||
|
@ -1,388 +1,273 @@
|
||||
r"""
|
||||
|
||||
>>> 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()
|
||||
>>> db_session.modified
|
||||
False
|
||||
>>> db_session.get('cat')
|
||||
>>> 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'
|
||||
>>> 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
|
||||
|
||||
# Submitting an invalid session key (either by guessing, or if the db has
|
||||
# removed the key) results in a new key being generated.
|
||||
>>> Session.objects.filter(pk=db_session.session_key).delete()
|
||||
>>> db_session = DatabaseSession(db_session.session_key)
|
||||
>>> db_session.save()
|
||||
>>> DatabaseSession('1').get('cat')
|
||||
|
||||
#
|
||||
# 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'
|
||||
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
|
||||
|
||||
|
||||
>>> s.get('update key', None)
|
||||
class SessionTestsMixin(object):
|
||||
# This does not inherit from TestCase to avoid any tests being run with this
|
||||
# class, which wouldn't work, and to allow different TestCase subclasses to
|
||||
# be used.
|
||||
|
||||
# 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
|
||||
backend = None # subclasses must specify
|
||||
|
||||
# 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)
|
||||
def setUp(self):
|
||||
self.session = self.backend()
|
||||
|
||||
# test .values()
|
||||
>>> s = SessionBase()
|
||||
>>> s.values()
|
||||
[]
|
||||
>>> s.accessed
|
||||
True
|
||||
>>> s['x'] = 1
|
||||
>>> s.values()
|
||||
[1]
|
||||
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()
|
||||
|
||||
# test .iterkeys()
|
||||
>>> s.accessed = False
|
||||
>>> i = s.iterkeys()
|
||||
>>> hasattr(i,'__iter__')
|
||||
True
|
||||
>>> s.accessed
|
||||
True
|
||||
>>> list(i)
|
||||
['x']
|
||||
def test_new_session(self):
|
||||
self.assertFalse(self.session.modified)
|
||||
self.assertFalse(self.session.accessed)
|
||||
|
||||
# test .itervalues()
|
||||
>>> s.accessed = False
|
||||
>>> i = s.itervalues()
|
||||
>>> hasattr(i,'__iter__')
|
||||
True
|
||||
>>> s.accessed
|
||||
True
|
||||
>>> list(i)
|
||||
[1]
|
||||
def test_get_empty(self):
|
||||
self.assertEqual(self.session.get('cat'), None)
|
||||
|
||||
# test .iteritems()
|
||||
>>> s.accessed = False
|
||||
>>> i = s.iteritems()
|
||||
>>> hasattr(i,'__iter__')
|
||||
True
|
||||
>>> s.accessed
|
||||
True
|
||||
>>> list(i)
|
||||
[('x', 1)]
|
||||
def test_store(self):
|
||||
self.session['cat'] = "dog"
|
||||
self.assertTrue(self.session.modified)
|
||||
self.assertEqual(self.session.pop('cat'), 'dog')
|
||||
|
||||
# test .clear()
|
||||
>>> s.modified = s.accessed = False
|
||||
>>> s.items()
|
||||
[('x', 1)]
|
||||
>>> s.clear()
|
||||
>>> s.items()
|
||||
[]
|
||||
>>> s.accessed, s.modified
|
||||
(True, True)
|
||||
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
|
||||
|
||||
#########################
|
||||
# Custom session expiry #
|
||||
#########################
|
||||
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)
|
||||
|
||||
>>> from django.conf import settings
|
||||
>>> from datetime import datetime, timedelta
|
||||
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)
|
||||
|
||||
>>> td10 = timedelta(seconds=10)
|
||||
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)
|
||||
|
||||
# A normal session has a max age equal to settings
|
||||
>>> s.get_expiry_age() == settings.SESSION_COOKIE_AGE
|
||||
True
|
||||
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)
|
||||
|
||||
# So does a custom session with an idle expiration time of 0 (but it'll expire
|
||||
# at browser close)
|
||||
>>> s.set_expiry(0)
|
||||
>>> s.get_expiry_age() == settings.SESSION_COOKIE_AGE
|
||||
True
|
||||
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)
|
||||
|
||||
# Custom session idle expiration time
|
||||
>>> s.set_expiry(10)
|
||||
>>> delta = s.get_expiry_date() - datetime.now()
|
||||
>>> delta.seconds in (9, 10)
|
||||
True
|
||||
>>> age = s.get_expiry_age()
|
||||
>>> age in (9, 10)
|
||||
True
|
||||
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])
|
||||
|
||||
# Custom session fixed expiry date (timedelta)
|
||||
>>> s.set_expiry(td10)
|
||||
>>> delta = s.get_expiry_date() - datetime.now()
|
||||
>>> delta.seconds in (9, 10)
|
||||
True
|
||||
>>> age = s.get_expiry_age()
|
||||
>>> age in (9, 10)
|
||||
True
|
||||
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'])
|
||||
|
||||
# Custom session fixed expiry date (fixed datetime)
|
||||
>>> s.set_expiry(datetime.now() + td10)
|
||||
>>> delta = s.get_expiry_date() - datetime.now()
|
||||
>>> delta.seconds in (9, 10)
|
||||
True
|
||||
>>> age = s.get_expiry_age()
|
||||
>>> age in (9, 10)
|
||||
True
|
||||
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])
|
||||
|
||||
# Set back to default session age
|
||||
>>> s.set_expiry(None)
|
||||
>>> s.get_expiry_age() == settings.SESSION_COOKIE_AGE
|
||||
True
|
||||
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)])
|
||||
|
||||
# Allow to set back to default session age even if no alternate has been set
|
||||
>>> s.set_expiry(None)
|
||||
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
|
||||
# removed the key) results in a new key being generated.
|
||||
session = self.backend('1')
|
||||
session.save()
|
||||
self.assertNotEqual(session.session_key, '1')
|
||||
self.assertEqual(session.get('cat'), None)
|
||||
session.delete()
|
||||
|
||||
# Custom session expiry
|
||||
def test_default_expiry(self):
|
||||
# A normal session has a max age equal to settings
|
||||
self.assertEqual(self.session.get_expiry_age(), settings.SESSION_COOKIE_AGE)
|
||||
|
||||
# So does a custom session with an idle expiration time of 0 (but it'll
|
||||
# expire at browser close)
|
||||
self.session.set_expiry(0)
|
||||
self.assertEqual(self.session.get_expiry_age(), settings.SESSION_COOKIE_AGE)
|
||||
|
||||
def test_custom_expiry_seconds(self):
|
||||
# Using seconds
|
||||
self.session.set_expiry(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_timedelta(self):
|
||||
# Using timedelta
|
||||
self.session.set_expiry(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_timedelta(self):
|
||||
# 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
|
||||
# end of these tests.
|
||||
>>> original_expire_at_browser_close = settings.SESSION_EXPIRE_AT_BROWSER_CLOSE
|
||||
>>> settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = False
|
||||
class DatabaseSessionTests(SessionTestsMixin, TestCase):
|
||||
|
||||
# Custom session age
|
||||
>>> s.set_expiry(10)
|
||||
>>> s.get_expire_at_browser_close()
|
||||
False
|
||||
backend = DatabaseSession
|
||||
|
||||
# Custom expire-at-browser-close
|
||||
>>> s.set_expiry(0)
|
||||
>>> s.get_expire_at_browser_close()
|
||||
True
|
||||
|
||||
# Default session age
|
||||
>>> s.set_expiry(None)
|
||||
>>> s.get_expire_at_browser_close()
|
||||
False
|
||||
class CacheDBSessionTests(SessionTestsMixin, TestCase):
|
||||
|
||||
>>> settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = True
|
||||
backend = CacheDBSession
|
||||
|
||||
# Custom session age
|
||||
>>> s.set_expiry(10)
|
||||
>>> s.get_expire_at_browser_close()
|
||||
False
|
||||
# Don't need DB flushing for these tests, so can use unittest.TestCase as base class
|
||||
class FileSessionTests(SessionTestsMixin, unittest.TestCase):
|
||||
|
||||
# Custom expire-at-browser-close
|
||||
>>> s.set_expiry(0)
|
||||
>>> s.get_expire_at_browser_close()
|
||||
True
|
||||
backend = FileSession
|
||||
|
||||
# Default session age
|
||||
>>> s.set_expiry(None)
|
||||
>>> s.get_expire_at_browser_close()
|
||||
True
|
||||
def setUp(self):
|
||||
super(FileSessionTests, self).setUp()
|
||||
# Do file session tests in an isolated directory, and kill it after we're done.
|
||||
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__':
|
||||
import doctest
|
||||
doctest.testmod()
|
||||
def test_configuration_check(self):
|
||||
# Make sure the file backend checks for a good storage dir
|
||||
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
|
||||
|
@ -65,11 +65,12 @@ class Sitemap(object):
|
||||
urls = []
|
||||
for item in self.paginator.page(page).object_list:
|
||||
loc = "http://%s%s" % (current_site.domain, self.__get('location', item))
|
||||
priority = self.__get('priority', item, None)
|
||||
url_info = {
|
||||
'location': loc,
|
||||
'lastmod': self.__get('lastmod', 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)
|
||||
return urls
|
||||
@ -78,7 +79,7 @@ class FlatPageSitemap(Sitemap):
|
||||
def items(self):
|
||||
from django.contrib.sites.models import Site
|
||||
current_site = Site.objects.get_current()
|
||||
return current_site.flatpage_set.all()
|
||||
return current_site.flatpage_set.filter(registration_required=False)
|
||||
|
||||
class GenericSitemap(Sitemap):
|
||||
priority = None
|
||||
|
1
django/contrib/sitemaps/models.py
Normal file
1
django/contrib/sitemaps/models.py
Normal file
@ -0,0 +1 @@
|
||||
# This file intentionally left blank
|
1
django/contrib/sitemaps/tests/__init__.py
Normal file
1
django/contrib/sitemaps/tests/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
from django.contrib.sitemaps.tests.basic import *
|
77
django/contrib/sitemaps/tests/basic.py
Normal file
77
django/contrib/sitemaps/tests/basic.py
Normal 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
Loading…
x
Reference in New Issue
Block a user