diff --git a/AUTHORS b/AUTHORS index b291f22400..f49210d303 100644 --- a/AUTHORS +++ b/AUTHORS @@ -51,6 +51,7 @@ answer newbie questions, and generally made Django that much better: Jiri Barton Ned Batchelder Shannon -jj Behrens + Esdras Beleza James Bennett Paul Bissex Simon Blanchard diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py index 79d3afe81b..15bddeb25a 100644 --- a/django/conf/global_settings.py +++ b/django/conf/global_settings.py @@ -101,7 +101,7 @@ DATABASE_USER = '' # Not used with sqlite3. DATABASE_PASSWORD = '' # Not used with sqlite3. DATABASE_HOST = '' # Set to empty string for localhost. Not used with sqlite3. DATABASE_PORT = '' # Set to empty string for default. Not used with sqlite3. -DATABASE_OPTIONS = {} # Set to empy dictionary for default. +DATABASE_OPTIONS = {} # Set to empty dictionary for default. # Optional named database connections in addition to the default. OTHER_DATABASES = {} diff --git a/django/conf/locale/de/LC_MESSAGES/django.mo b/django/conf/locale/de/LC_MESSAGES/django.mo index aef68099d3..0dd2b26dff 100644 Binary files a/django/conf/locale/de/LC_MESSAGES/django.mo and b/django/conf/locale/de/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/de/LC_MESSAGES/django.po b/django/conf/locale/de/LC_MESSAGES/django.po index 614ea69247..c5e3f4282a 100644 --- a/django/conf/locale/de/LC_MESSAGES/django.po +++ b/django/conf/locale/de/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Django 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2006-09-25 16:04+0200\n" +"POT-Creation-Date: 2006-11-15 18:35+0100\n" "PO-Revision-Date: 2005-10-08 00:03+0200\n" "Last-Translator: Georg Bauer \n" "MIME-Version: 1.0\n" @@ -452,7 +452,7 @@ msgid "" "Looks like your browser isn't configured to accept cookies. Please enable " "cookies, reload this page, and try again." msgstr "" -"Es sieht danach aus, das der Browser keine Cookies akzeptiert. Bitte im " +"Es sieht danach aus, dass der Browser keine Cookies akzeptiert. Bitte im " "Browser Cookies aktivieren und diese Seite neu laden." #: contrib/admin/views/decorators.py:83 @@ -470,13 +470,13 @@ msgstr "" msgid "Site administration" msgstr "Website Verwaltung" -#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:17 +#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:18 #, python-format msgid "The %(name)s \"%(obj)s\" was added successfully." msgstr "%(name)s \"%(obj)s\" wurde erfolgreich hinzugefgt." #: contrib/admin/views/main.py:261 contrib/admin/views/main.py:347 -#: contrib/admin/views/auth.py:22 +#: contrib/admin/views/auth.py:23 msgid "You may edit it again below." msgstr "Das Element kann jetzt weiter gendert werden." @@ -496,7 +496,7 @@ msgid "Added %s." msgstr "%s hinzugefgt." #: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337 -#: contrib/admin/views/main.py:339 +#: contrib/admin/views/main.py:339 db/models/manipulators.py:306 msgid "and" msgstr "und" @@ -702,7 +702,7 @@ msgstr "XML Text" msgid "%s does not appear to be a urlpattern object" msgstr "%s ist scheinbar kein urlpattern Objekt" -#: contrib/admin/views/auth.py:28 +#: contrib/admin/views/auth.py:29 msgid "Add user" msgstr "Benutzer zufgen" @@ -861,10 +861,6 @@ msgstr "Keine vorhanden" msgid "Add %(name)s" msgstr "%(name)s zufgen" -#: contrib/admin/templates/admin/login.html:22 -msgid "Have you forgotten your password?" -msgstr "Haben Sie ihr Passwort vergessen?" - #: contrib/admin/templates/admin/base.html:25 msgid "Welcome," msgstr "Willkommen," @@ -891,7 +887,7 @@ msgid "" "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " "All of the following related items will be deleted:" msgstr "" -"Sind Sie sicher, das Sie %(object_name)s \"%(escaped_object)s\" lschen " +"Sind Sie sicher, dass Sie %(object_name)s \"%(escaped_object)s\" lschen " "wollen? Es werden zustzlich die folgenden abhngigen Daten mit gelscht:" #: contrib/admin/templates/admin/delete_confirmation.html:26 @@ -1061,7 +1057,7 @@ msgid "" "password twice so we can verify you typed it in correctly." msgstr "" "Bitte geben Sie aus Sicherheitsgrnden erst Ihr altes Kennwort und darunter " -"dann zweimal (um sicherzustellen, das Sie es korrekt eingegeben haben) das " +"dann zweimal (um sicherzustellen, dass Sie es korrekt eingegeben haben) das " "neue Kennwort ein." #: contrib/admin/templates/registration/password_change_form.html:17 @@ -1087,7 +1083,7 @@ msgstr "Sie erhalten diese Mail, weil Sie ein neues Kennwort" #: contrib/admin/templates/registration/password_reset_email.html:3 #, python-format msgid "for your user account at %(site_name)s" -msgstr "fr ihren Benutzer bei %(site_name)s angefordert haben." +msgstr "fr Ihren Benutzer bei %(site_name)s angefordert haben." #: contrib/admin/templates/registration/password_reset_email.html:5 #, python-format @@ -1104,7 +1100,7 @@ msgstr "Ihr Benutzername, falls Sie ihn vergessen haben:" #: contrib/admin/templates/registration/password_reset_email.html:13 msgid "Thanks for using our site!" -msgstr "Vielen Dank, das Sie unsere Seiten benutzen!" +msgstr "Vielen Dank, dass Sie unsere Seiten benutzen!" #: contrib/admin/templates/registration/password_reset_email.html:15 #, python-format @@ -1367,7 +1363,7 @@ msgid "" "Designates that this user has all permissions without explicitly assigning " "them." msgstr "" -"Bestimmt, das dieser Benutzer alle Berechtigungen hat, ohne diese einzeln " +"Bestimmt, dass dieser Benutzer alle Berechtigungen hat, ohne diese einzeln " "zuweisen zu mssen." #: contrib/auth/models.py:98 @@ -1414,10 +1410,18 @@ msgstr "Wichtige Daten" msgid "Groups" msgstr "Gruppen" -#: contrib/auth/models.py:256 +#: contrib/auth/models.py:258 msgid "message" msgstr "Mitteilung" +#: contrib/auth/forms.py:16 +msgid "The two password fields didn't match." +msgstr "Die zwei Passwrter sind nicht gleich." + +#: contrib/auth/forms.py:24 +msgid "A user with that username already exists." +msgstr "Ein Benutzer mit diesem Namen existiert bereits." + #: contrib/auth/forms.py:52 msgid "" "Your Web browser doesn't appear to have cookies enabled. Cookies are " @@ -1432,10 +1436,10 @@ msgstr "Dieser Benutzer ist inaktiv." #: contrib/auth/forms.py:84 msgid "" -"That e-mail address doesn't have an associated user acount. Are you sure " +"That e-mail address doesn't have an associated user account. Are you sure " "you've registered?" msgstr "" -"Die Email-Adresse hat keinen Benutzer zugeordnet. Sicher, das die Adresse " +"Die Email-Adresse hat keinen Benutzer zugeordnet. Sicher, dass die Adresse " "hier angemeldet ist?" #: contrib/auth/forms.py:116 @@ -1783,58 +1787,62 @@ msgid "Norwegian" msgstr "Norwegisch" #: conf/global_settings.py:59 +msgid "Polish" +msgstr "Polnisch" + +#: conf/global_settings.py:60 msgid "Brazilian" msgstr "Brasilianisch" -#: conf/global_settings.py:60 +#: conf/global_settings.py:61 msgid "Romanian" msgstr "Rumnisch" -#: conf/global_settings.py:61 +#: conf/global_settings.py:62 msgid "Russian" msgstr "Russisch" -#: conf/global_settings.py:62 +#: conf/global_settings.py:63 msgid "Slovak" msgstr "Slowakisch" -#: conf/global_settings.py:63 +#: conf/global_settings.py:64 msgid "Slovenian" msgstr "Slowenisch" -#: conf/global_settings.py:64 +#: conf/global_settings.py:65 msgid "Serbian" msgstr "Serbisch" -#: conf/global_settings.py:65 +#: conf/global_settings.py:66 msgid "Swedish" msgstr "Schwedisch" -#: conf/global_settings.py:66 +#: conf/global_settings.py:67 msgid "Tamil" msgstr "Tamilisch" -#: conf/global_settings.py:67 +#: conf/global_settings.py:68 msgid "Turkish" msgstr "Trkisch" -#: conf/global_settings.py:68 +#: conf/global_settings.py:69 msgid "Ukrainian" msgstr "Ukrainisch" -#: conf/global_settings.py:69 +#: conf/global_settings.py:70 msgid "Simplified Chinese" msgstr "Vereinfachtes Chinesisch" -#: conf/global_settings.py:70 +#: conf/global_settings.py:71 msgid "Traditional Chinese" msgstr "Traditionelles Chinesisch" -#: core/validators.py:63 +#: core/validators.py:64 msgid "This value must contain only letters, numbers and underscores." msgstr "Dieser Wert darf nur Buchstaben, Ziffern und Unterstriche enthalten." -#: core/validators.py:67 +#: core/validators.py:68 msgid "" "This value must contain only letters, numbers, underscores, dashes or " "slashes." @@ -1842,85 +1850,85 @@ msgstr "" "Dieser Wert darf nur Buchstaben, Ziffern, Unterstriche und Schrgstriche " "enthalten." -#: core/validators.py:71 +#: core/validators.py:72 msgid "This value must contain only letters, numbers, underscores or hyphens." msgstr "" "Dieser Wert darf nur Buchstaben, Ziffern, Unterstriche und Bindestriche " "enthalten." -#: core/validators.py:75 +#: core/validators.py:76 msgid "Uppercase letters are not allowed here." msgstr "Grobuchstaben sind hier nicht erlaubt." -#: core/validators.py:79 +#: core/validators.py:80 msgid "Lowercase letters are not allowed here." msgstr "Kleinbuchstaben sind hier nicht erlaubt." -#: core/validators.py:86 +#: core/validators.py:87 msgid "Enter only digits separated by commas." msgstr "Hier sind nur durch Komma getrennte Ziffern erlaubt." -#: core/validators.py:98 +#: core/validators.py:99 msgid "Enter valid e-mail addresses separated by commas." msgstr "Bitte mit Komma getrennte, gltige eMail-Adressen eingeben." -#: core/validators.py:102 +#: core/validators.py:103 msgid "Please enter a valid IP address." msgstr "Bitte eine gltige IP-Adresse eingeben." -#: core/validators.py:106 +#: core/validators.py:107 msgid "Empty values are not allowed here." msgstr "Dieses Feld darf nicht leer sein." -#: core/validators.py:110 +#: core/validators.py:111 msgid "Non-numeric characters aren't allowed here." msgstr "Nichtnumerische Zeichen sind hier nicht erlaubt." -#: core/validators.py:114 +#: core/validators.py:115 msgid "This value can't be comprised solely of digits." msgstr "Dieser Wert darf nicht nur aus Ziffern bestehen." -#: core/validators.py:119 +#: core/validators.py:120 msgid "Enter a whole number." msgstr "Bitte eine ganze Zahl eingeben." -#: core/validators.py:123 +#: core/validators.py:124 msgid "Only alphabetical characters are allowed here." msgstr "Nur alphabetische Zeichen sind hier erlaubt." -#: core/validators.py:138 +#: core/validators.py:139 msgid "Year must be 1900 or later." msgstr "Das Jahr muss 1900 oder spter sein." -#: core/validators.py:142 +#: core/validators.py:143 #, python-format msgid "Invalid date: %s." msgstr "Ungltiges Datum: %s" -#: core/validators.py:146 db/models/fields/__init__.py:415 +#: core/validators.py:147 db/models/fields/__init__.py:424 msgid "Enter a valid date in YYYY-MM-DD format." msgstr "Bitte ein gltiges Datum im Format JJJJ-MM-TT eingeben." -#: core/validators.py:151 +#: core/validators.py:152 msgid "Enter a valid time in HH:MM format." msgstr "Bitte eine gltige Zeit im Format SS:MM eingeben." -#: core/validators.py:155 db/models/fields/__init__.py:477 +#: core/validators.py:156 db/models/fields/__init__.py:488 msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format." msgstr "" "Bitte eine gltige Datums- und Zeitangabe im Format JJJJ-MM-TT SS:MM " "eingeben." -#: core/validators.py:160 +#: core/validators.py:161 msgid "Enter a valid e-mail address." msgstr "Bitte eine gltige eMail-Adresse eingeben" -#: core/validators.py:172 core/validators.py:401 forms/__init__.py:661 +#: core/validators.py:173 core/validators.py:442 forms/__init__.py:667 msgid "No file was submitted. Check the encoding type on the form." msgstr "" "Es wurde keine Datei geschickt. Eventuell ist das Formular-Encoding falsch." -#: core/validators.py:176 +#: core/validators.py:177 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." @@ -1928,27 +1936,27 @@ msgstr "" "Bitte ein Bild hochladen. Die Datei, die hochgeladen wurde, ist kein Bild " "oder ist defekt." -#: core/validators.py:183 +#: core/validators.py:184 #, python-format msgid "The URL %s does not point to a valid image." msgstr "Die URL %s zeigt nicht auf ein gltiges Bild." -#: core/validators.py:187 +#: core/validators.py:188 #, python-format msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid." msgstr "" "Telefonnummern mssen im Format XXX-XXX-XXXX sein. \"%s\" ist ungltig." -#: core/validators.py:195 +#: core/validators.py:196 #, python-format msgid "The URL %s does not point to a valid QuickTime video." msgstr "Die URL %s zeigt nicht auf ein gltiges QuickTime video." -#: core/validators.py:199 +#: core/validators.py:200 msgid "A valid URL is required." msgstr "Eine gltige URL ist hier verlangt." -#: core/validators.py:213 +#: core/validators.py:214 #, python-format msgid "" "Valid HTML is required. Specific errors are:\n" @@ -1957,71 +1965,83 @@ msgstr "" "Bitte gltiges HTML eingeben. Fehler sind:\n" "%s" -#: core/validators.py:220 +#: core/validators.py:221 #, python-format msgid "Badly formed XML: %s" msgstr "Ungltiges XML: %s" -#: core/validators.py:230 +#: core/validators.py:238 #, python-format msgid "Invalid URL: %s" msgstr "Ungltige URL: %s" -#: core/validators.py:234 core/validators.py:236 +#: core/validators.py:243 core/validators.py:245 #, python-format msgid "The URL %s is a broken link." msgstr "Die URL %s funktioniert nicht." -#: core/validators.py:242 +#: core/validators.py:251 msgid "Enter a valid U.S. state abbreviation." msgstr "Bitte eine gltige Abkrzung fr einen US-Staat eingeben." -#: core/validators.py:256 +#: core/validators.py:265 #, python-format msgid "Watch your mouth! The word %s is not allowed here." msgid_plural "Watch your mouth! The words %s are not allowed here." msgstr[0] "Keine Schimpfworte! Das Wort %s ist hier nicht gern gesehen!" msgstr[1] "Keine Schimpfworte! Die Wrter %s sind hier nicht gern gesehen!" -#: core/validators.py:263 +#: core/validators.py:272 #, python-format msgid "This field must match the '%s' field." msgstr "Dieses Feld muss zum Feld '%s' passen." -#: core/validators.py:282 +#: core/validators.py:291 msgid "Please enter something for at least one field." msgstr "Bitte mindestens eines der Felder ausfllen." -#: core/validators.py:291 core/validators.py:302 +#: core/validators.py:300 core/validators.py:311 msgid "Please enter both fields or leave them both empty." msgstr "Bitte entweder beide Felder ausfllen, oder beide leer lassen." -#: core/validators.py:309 +#: core/validators.py:318 #, python-format msgid "This field must be given if %(field)s is %(value)s" msgstr "" "Dieses Feld muss gefllt sein, wenn Feld %(field)s den Wert %(value)s hat." -#: core/validators.py:321 +#: core/validators.py:330 #, python-format msgid "This field must be given if %(field)s is not %(value)s" msgstr "" "Dieses Feld muss gefllt sein, wenn Feld %(field)s nicht %(value)s ist." -#: core/validators.py:340 +#: core/validators.py:349 msgid "Duplicate values are not allowed." msgstr "Doppelte Werte sind hier nicht erlaubt." -#: core/validators.py:363 +#: core/validators.py:364 +msgid "This value must be between %s and %s." +msgstr "Dieser Wert muss zwischen %s und %s sein." + +#: core/validators.py:366 +msgid "This value must be at least %s." +msgstr "Dieser Wert muss mindestens %s sein." + +#: core/validators.py:368 +msgid "This value must be no more than %s." +msgstr "Dieser Wert darf maximal %s sein." + +#: core/validators.py:404 #, python-format msgid "This value must be a power of %s." msgstr "Dieser Wert muss eine Potenz von %s sein." -#: core/validators.py:374 +#: core/validators.py:415 msgid "Please enter a valid decimal number." msgstr "Bitte eine gltige Dezimalzahl eingeben." -#: core/validators.py:378 +#: core/validators.py:419 #, python-format msgid "Please enter a valid decimal number with at most %s total digit." msgid_plural "" @@ -2029,7 +2049,7 @@ msgid_plural "" msgstr[0] "Bitte eine gltige Dezimalzahl mit maximal %s Ziffer eingeben." msgstr[1] "Bitte eine gltige Dezimalzahl mit maximal %s Ziffern eingeben." -#: core/validators.py:381 +#: core/validators.py:422 #, python-format msgid "" "Please enter a valid decimal number with a whole part of at most %s digit." @@ -2038,7 +2058,7 @@ msgid_plural "" msgstr[0] "Bitte eine gltige Dezimalzahl mit maximal %s Ziffer eingeben." msgstr[1] "Bitte eine gltige Dezimalzahl mit maximal %s Ziffern eingeben." -#: core/validators.py:384 +#: core/validators.py:425 #, python-format msgid "Please enter a valid decimal number with at most %s decimal place." msgid_plural "" @@ -2048,39 +2068,39 @@ msgstr[0] "" msgstr[1] "" "Bitte eine gltige Dezimalzahl mit maximal %s Dezimalstellen eingeben." -#: core/validators.py:394 +#: core/validators.py:435 #, python-format msgid "Make sure your uploaded file is at least %s bytes big." msgstr "" "Bitte sicherstellen, da die hochgeladene Datei mindestens %s Bytes gross " "ist." -#: core/validators.py:395 +#: core/validators.py:436 #, python-format msgid "Make sure your uploaded file is at most %s bytes big." msgstr "" "Bitte sicherstellen, da die hochgeladene Datei maximal %s Bytes gross ist." -#: core/validators.py:412 +#: core/validators.py:453 msgid "The format for this field is wrong." msgstr "Das Format fr dieses Feld ist falsch." -#: core/validators.py:427 +#: core/validators.py:468 msgid "This field is invalid." msgstr "Dieses Feld ist ungltig." -#: core/validators.py:463 +#: core/validators.py:504 #, python-format msgid "Could not retrieve anything from %s." msgstr "Konnte nichts von %s empfangen." -#: core/validators.py:466 +#: core/validators.py:507 #, python-format msgid "" "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." msgstr "Die URL %(url)s lieferte den falschen Content-Type '%(contenttype)s'." -#: core/validators.py:499 +#: core/validators.py:540 #, python-format msgid "" "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with " @@ -2089,7 +2109,7 @@ msgstr "" "Bitte das ungeschlossene %(tag)s Tag in Zeile %(line)s schlieen. Die Zeile " "beginnt mit \"%(start)s\"." -#: core/validators.py:503 +#: core/validators.py:544 #, python-format msgid "" "Some text starting on line %(line)s is not allowed in that context. (Line " @@ -2098,7 +2118,7 @@ msgstr "" "In Zeile %(line)s ist Text, der nicht in dem Kontext erlaubt ist. Die Zeile " "beginnt mit \"%(start)s\"." -#: core/validators.py:508 +#: core/validators.py:549 #, python-format msgid "" "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%" @@ -2107,7 +2127,7 @@ msgstr "" "Das Attribute %(attr)s in Zeile %(line)s ist ungltig. Die Zeile beginnt mit " "\"%(start)s\"." -#: core/validators.py:513 +#: core/validators.py:554 #, python-format msgid "" "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%" @@ -2116,7 +2136,7 @@ msgstr "" "<%(tag)s> in Zeile %(line)s ist ungltig. Die Zeile beginnt mit \"%(start)s" "\"." -#: core/validators.py:517 +#: core/validators.py:558 #, python-format msgid "" "A tag on line %(line)s is missing one or more required attributes. (Line " @@ -2125,7 +2145,7 @@ msgstr "" "Ein Tag in Zeile %(line)s hat eines oder mehrere Pflichtattribute nicht. Die " "Zeile beginnt mit \"%(start)s\"." -#: core/validators.py:522 +#: core/validators.py:563 #, python-format msgid "" "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line " @@ -2149,37 +2169,37 @@ msgstr "%(verbose_name)s wurde erfolgreich aktualisiert." msgid "The %(verbose_name)s was deleted." msgstr "%(verbose_name)s wurde gelscht" -#: db/models/manipulators.py:302 +#: db/models/manipulators.py:305 #, python-format msgid "%(object)s with this %(type)s already exists for the given %(field)s." msgstr "" "Ein '%(object)s' in dieser '%(type)s' existiert bereits fr dieses '%(field)" "s'." -#: db/models/fields/__init__.py:40 +#: db/models/fields/__init__.py:41 #, python-format msgid "%(optname)s with this %(fieldname)s already exists." msgstr "Ein '%(optname)s' mit diesem '%(fieldname)s' existiert bereits." -#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265 -#: db/models/fields/__init__.py:551 db/models/fields/__init__.py:562 -#: forms/__init__.py:346 +#: db/models/fields/__init__.py:115 db/models/fields/__init__.py:266 +#: db/models/fields/__init__.py:569 db/models/fields/__init__.py:580 +#: forms/__init__.py:352 msgid "This field is required." msgstr "Dieses Feld ist zwingend." -#: db/models/fields/__init__.py:340 +#: db/models/fields/__init__.py:349 msgid "This value must be an integer." msgstr "Dieser Wert muss eine Ganzzahl sein." -#: db/models/fields/__init__.py:372 +#: db/models/fields/__init__.py:381 msgid "This value must be either True or False." msgstr "Dieser Wert muss wahr oder falsch sein." -#: db/models/fields/__init__.py:388 +#: db/models/fields/__init__.py:397 msgid "This field cannot be null." msgstr "Dieses Feld darf nicht leer sein." -#: db/models/fields/__init__.py:571 +#: db/models/fields/__init__.py:589 msgid "Enter a valid filename." msgstr "Bitte einen gltigen Dateinamen eingeben" @@ -2209,36 +2229,36 @@ msgstr[0] "" msgstr[1] "" "Bitte gltige IDs fr %(self)s eingeben. Die Werte %(value)r sind ungltig." -#: forms/__init__.py:381 +#: forms/__init__.py:387 #, python-format msgid "Ensure your text is less than %s character." msgid_plural "Ensure your text is less than %s characters." -msgstr[0] "Bitte sicherstellen, das der Text weniger als %s Zeichen hat." -msgstr[1] "Bitte sicherstellen, das der Text weniger als %s Zeichen hat." +msgstr[0] "Bitte sicherstellen, dass der Text weniger als %s Zeichen hat." +msgstr[1] "Bitte sicherstellen, dass der Text weniger als %s Zeichen hat." -#: forms/__init__.py:386 +#: forms/__init__.py:392 msgid "Line breaks are not allowed here." msgstr "Zeilenumbrche sind hier nicht erlaubt." -#: forms/__init__.py:487 forms/__init__.py:560 forms/__init__.py:599 +#: forms/__init__.py:493 forms/__init__.py:566 forms/__init__.py:605 #, python-format msgid "Select a valid choice; '%(data)s' is not in %(choices)s." msgstr "" "Bitte eine gltige Auswahl treffen; '%(data)s' ist nicht in %(choices)s." -#: forms/__init__.py:663 +#: forms/__init__.py:669 msgid "The submitted file is empty." msgstr "Die ausgewhlte Datei ist leer." -#: forms/__init__.py:719 +#: forms/__init__.py:725 msgid "Enter a whole number between -32,768 and 32,767." msgstr "Bitte eine ganze Zahl zwischen -32.768 und 32.767 eingeben." -#: forms/__init__.py:729 +#: forms/__init__.py:735 msgid "Enter a positive number." msgstr "Bitte eine ganze, positive Zahl eingeben." -#: forms/__init__.py:739 +#: forms/__init__.py:745 msgid "Enter a whole number between 0 and 32,767." msgstr "Bitte eine ganze Zahl zwischen 0 und 32.767 eingeben." diff --git a/django/conf/locale/el/LC_MESSAGES/django.mo b/django/conf/locale/el/LC_MESSAGES/django.mo index 1c95d6b5d9..4a7d8e41f0 100644 Binary files a/django/conf/locale/el/LC_MESSAGES/django.mo and b/django/conf/locale/el/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/el/LC_MESSAGES/django.po b/django/conf/locale/el/LC_MESSAGES/django.po index 173b300d04..06099eb9da 100644 --- a/django/conf/locale/el/LC_MESSAGES/django.po +++ b/django/conf/locale/el/LC_MESSAGES/django.po @@ -107,6 +107,11 @@ msgid "" "\n" "http://%(domain)s%(url)s" msgstr "" +"Σχόλιο από τον/την %(user)s την %(date)s\n" +"\n" +"%(comment)s\n" +"\n" +"http://%(domain)s%(url)s" #: contrib/comments/models.py:168 msgid "person's name" @@ -141,11 +146,11 @@ msgstr "ημερομηνία βαθμολογίας" #: contrib/comments/models.py:237 #, fuzzy msgid "karma score" -msgstr "βαθμολογία" +msgstr "karma" #: contrib/comments/models.py:238 msgid "karma scores" -msgstr "" +msgstr "karma" #: contrib/comments/models.py:242 #, python-format @@ -159,7 +164,7 @@ msgid "" "\n" "%(text)s" msgstr "" -"Αυτο το σχόλιο σημειώθει απο %(χρήστη)ες\n" +"Αυτο το σχόλιο σημειώθηκε απο %(χρήστη)ες\n" "\n" "%(κείμενο)α" @@ -245,7 +250,7 @@ msgstr "" #: contrib/comments/views/comments.py:193 #: contrib/comments/views/comments.py:284 msgid "One or more of the required fields wasn't submitted" -msgstr "Ένα ή περισσότερα από τα απαιτούμενα πεδία δεν υποβλίθει" +msgstr "Ένα ή περισσότερα από τα απαιτούμενα πεδία δεν υπεβλήθει" #: contrib/comments/views/comments.py:197 #: contrib/comments/views/comments.py:286 @@ -268,7 +273,7 @@ msgstr "" #: contrib/comments/templates/comments/form.html:8 #: contrib/admin/templates/admin/login.html:17 msgid "Username:" -msgstr "" +msgstr "Όνομα χρήστη:" #: contrib/comments/templates/comments/form.html:6 #: contrib/admin/templates/admin/login.html:20 @@ -298,21 +303,21 @@ msgstr "Ξεχάσατε τον κωδικό σας;" #: contrib/admin/templates/admin_doc/index.html:4 #: contrib/admin/templates/admin_doc/model_index.html:5 msgid "Log out" -msgstr "" +msgstr "Αποσύνδεση" #: contrib/comments/templates/comments/form.html:12 msgid "Ratings" -msgstr "" +msgstr "Βαθμολογίες" #: contrib/comments/templates/comments/form.html:12 #: contrib/comments/templates/comments/form.html:23 msgid "Required" -msgstr "" +msgstr "Απαραίτητο" #: contrib/comments/templates/comments/form.html:12 #: contrib/comments/templates/comments/form.html:23 msgid "Optional" -msgstr "" +msgstr "Προαιρετικό" #: contrib/comments/templates/comments/form.html:23 msgid "Post a photo" @@ -326,11 +331,11 @@ msgstr "Σχόλιο:" #: contrib/comments/templates/comments/form.html:32 #: contrib/comments/templates/comments/freeform.html:9 msgid "Preview comment" -msgstr "" +msgstr "Προεπισκόπηση σχολίου" #: contrib/comments/templates/comments/freeform.html:4 msgid "Your name:" -msgstr "" +msgstr "Το όνομα σας:" #: contrib/admin/filterspecs.py:40 #, python-format @@ -338,15 +343,17 @@ msgid "" "

By %s:

\n" "
    \n" msgstr "" +"

    Από %s:

    \n" +"
      \n" #: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88 #: contrib/admin/filterspecs.py:143 msgid "All" -msgstr "" +msgstr "Όλα" #: contrib/admin/filterspecs.py:109 msgid "Any date" -msgstr "" +msgstr "Όλες οι ημερομηνίες" #: contrib/admin/filterspecs.py:110 msgid "Today" @@ -354,7 +361,7 @@ msgstr "Σήμερα" #: contrib/admin/filterspecs.py:113 msgid "Past 7 days" -msgstr "" +msgstr "Τις προηγούμενες 7 ημέρες" #: contrib/admin/filterspecs.py:115 msgid "This month" @@ -374,7 +381,7 @@ msgstr "Όχι" #: contrib/admin/filterspecs.py:150 msgid "Unknown" -msgstr "’γνωστο" +msgstr "Άγνωστο" #: contrib/admin/models.py:16 msgid "action time" @@ -441,7 +448,7 @@ msgstr "" #: contrib/admin/views/decorators.py:82 msgid "Usernames cannot contain the '@' character." -msgstr "Τα ονόματα των Χρηστών δεν μπορόυν να περιέχουν τον χαρακτήρα '@'." +msgstr "Τα ονόματα των χρηστών δεν μπορόυν να περιέχουν τον χαρακτήρα '@'." #: contrib/admin/views/decorators.py:84 #, python-format @@ -452,16 +459,16 @@ msgstr "" #: contrib/admin/views/main.py:226 msgid "Site administration" -msgstr "Διαχείριση του Διαδυκτιακού χώρου" +msgstr "Διαχείριση του Διαδικτυακού χώρου" #: contrib/admin/views/main.py:260 #, python-format msgid "The %(name)s \"%(obj)s\" was added successfully." -msgstr "" +msgstr "Το %(name)s \"%(obj)s\" αποθηκεύτηκε επιτυχώς." #: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348 msgid "You may edit it again below." -msgstr "" +msgstr "Μπορείτε να το επεξεργαστείτε ξανα παρακάτω." #: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357 #, python-format @@ -471,12 +478,12 @@ msgstr "Μπορείτε να προσθέσετε ακόμα ένα %s απο #: contrib/admin/views/main.py:290 #, python-format msgid "Add %s" -msgstr "" +msgstr "Προσθήκη %s" #: contrib/admin/views/main.py:336 #, python-format msgid "Added %s." -msgstr "" +msgstr "Προστέθηκε %s." #: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338 #: contrib/admin/views/main.py:340 @@ -486,32 +493,33 @@ msgstr "και" #: contrib/admin/views/main.py:338 #, python-format msgid "Changed %s." -msgstr "" +msgstr "Επεξεργάσθηκε %s." #: contrib/admin/views/main.py:340 #, python-format msgid "Deleted %s." -msgstr "" +msgstr "Διεγράφη %s." #: contrib/admin/views/main.py:343 msgid "No fields changed." -msgstr "" +msgstr "Κανένα πεδίο δεν άλλαξε." #: contrib/admin/views/main.py:346 #, python-format msgid "The %(name)s \"%(obj)s\" was changed successfully." -msgstr "" +msgstr "Το %(name)s \"%(obj)s\" επεξεργάσθηκε επιτυχώς." #: contrib/admin/views/main.py:354 #, python-format msgid "" "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." msgstr "" +"Το %(name)s \"%(obj)s\" αποθηκεύθηκε επιτυχώς. Μπορείτε να το επεξεργαστείτε πάλι παρακάτω." #: contrib/admin/views/main.py:392 #, python-format msgid "Change %s" -msgstr "" +msgstr "Αλλαγή %s" #: contrib/admin/views/main.py:470 #, python-format @@ -535,17 +543,17 @@ msgstr "Είστε σίγουρος;" #: contrib/admin/views/main.py:533 #, python-format msgid "Change history: %s" -msgstr "" +msgstr "Ιστορικό Αλλαγών: %s" #: contrib/admin/views/main.py:565 #, python-format msgid "Select %s" -msgstr "" +msgstr "Επιλογή %s" #: contrib/admin/views/main.py:565 #, python-format msgid "Select %s to change" -msgstr "" +msgstr "Επιλέξτε %s προς αλλαγή" #: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286 #: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294 @@ -555,7 +563,7 @@ msgstr "Ακέραιος" #: contrib/admin/views/doc.py:278 msgid "Boolean (Either True or False)" -msgstr "Boolean (Είτε Αλήθεια ή Ψέμα)" +msgstr "Boolean (Είτε Αληθές ή Ψέυδές)" #: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296 #, python-format @@ -580,7 +588,7 @@ msgstr "Ηλεκτρονική διεύθυνση" #: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287 msgid "File path" -msgstr "" +msgstr "Τοποθεσία Αρχείου" #: contrib/admin/views/doc.py:285 msgid "Decimal number" @@ -592,7 +600,7 @@ msgstr "" #: contrib/admin/views/doc.py:292 msgid "Relation to parent model" -msgstr "" +msgstr "Σχέση με το γονεϊκό μοντέλο" #: contrib/admin/views/doc.py:293 msgid "Phone number" @@ -627,7 +635,7 @@ msgstr "" #: contrib/admin/templates/registration/password_change_form.html:3 #: contrib/admin/templates/admin_doc/bookmarklets.html:3 msgid "Documentation" -msgstr "" +msgstr "Τεκμηρίωση" #: contrib/admin/templates/admin/object_history.html:3 #: contrib/admin/templates/admin/change_list.html:5 @@ -667,11 +675,11 @@ msgstr "Home" #: contrib/admin/templates/admin/object_history.html:5 #: contrib/admin/templates/admin/change_form.html:20 msgid "History" -msgstr "" +msgstr "Ιστορικό" #: contrib/admin/templates/admin/object_history.html:18 msgid "Date/time" -msgstr "" +msgstr "Ημερομηνία/Ώρα" #: contrib/admin/templates/admin/object_history.html:19 msgid "User" @@ -679,7 +687,7 @@ msgstr "Χρήστης" #: contrib/admin/templates/admin/object_history.html:20 msgid "Action" -msgstr "" +msgstr "Δράση" #: contrib/admin/templates/admin/object_history.html:26 msgid "DATE_WITH_TIME_FULL" @@ -697,19 +705,19 @@ msgstr "Διαχειριστής ιστοσελίδας Django" #: contrib/admin/templates/admin/base_site.html:7 msgid "Django administration" -msgstr "" +msgstr "Διαχείριση Django" #: contrib/admin/templates/admin/500.html:4 msgid "Server error" -msgstr "" +msgstr "Σφάλμα Διακομιστή" #: contrib/admin/templates/admin/500.html:6 msgid "Server error (500)" -msgstr "" +msgstr "Σφάλμα Διακομιστή (500)" #: contrib/admin/templates/admin/500.html:9 msgid "Server Error (500)" -msgstr "" +msgstr "Σφάλμα Διακομιστή (500)" #: contrib/admin/templates/admin/500.html:10 msgid "" @@ -720,7 +728,7 @@ msgstr "" #: contrib/admin/templates/admin/404.html:4 #: contrib/admin/templates/admin/404.html:8 msgid "Page not found" -msgstr "" +msgstr "Η σελίδα δε βρέθηκε." #: contrib/admin/templates/admin/404.html:10 msgid "We're sorry, but the requested page could not be found." @@ -729,24 +737,24 @@ msgstr "" #: contrib/admin/templates/admin/index.html:17 #, python-format msgid "Models available in the %(name)s application." -msgstr "" +msgstr "Διαθέσιμα μοντέλα στην εφαρμογή %(name)s." #: contrib/admin/templates/admin/index.html:28 #: contrib/admin/templates/admin/change_form.html:15 msgid "Add" -msgstr "" +msgstr "Προσθήκη" #: contrib/admin/templates/admin/index.html:34 msgid "Change" -msgstr "" +msgstr "Επεξεργασία" #: contrib/admin/templates/admin/index.html:44 msgid "You don't have permission to edit anything." -msgstr "" +msgstr "Δεν έχετε άδεια να επεξεργαστείτε τίποτα." #: contrib/admin/templates/admin/index.html:52 msgid "Recent Actions" -msgstr "" +msgstr "Πρόσφατες Πράξεις" #: contrib/admin/templates/admin/index.html:53 msgid "My Actions" @@ -754,16 +762,16 @@ msgstr "Οι πράξεις μου" #: contrib/admin/templates/admin/index.html:57 msgid "None available" -msgstr "" +msgstr "Κανένα διαθέσιμο" #: contrib/admin/templates/admin/change_list.html:11 #, python-format msgid "Add %(name)s" -msgstr "" +msgstr "Προσθήκη %(name)s" #: contrib/admin/templates/admin/login.html:22 msgid "Have you forgotten your password?" -msgstr "" +msgstr "Ξεχάσατε τον κωδικό σας; " #: contrib/admin/templates/admin/base.html:23 msgid "Welcome," @@ -772,7 +780,7 @@ msgstr "Καλωσήρθατε," #: contrib/admin/templates/admin/delete_confirmation.html:9 #: contrib/admin/templates/admin/submit_line.html:3 msgid "Delete" -msgstr "" +msgstr "Διαγραφή" #: contrib/admin/templates/admin/delete_confirmation.html:14 #, python-format @@ -800,37 +808,37 @@ msgstr "" #: contrib/admin/templates/admin/search_form.html:8 msgid "Go" -msgstr "" +msgstr "Πήγαινε" #: contrib/admin/templates/admin/change_form.html:21 msgid "View on site" -msgstr "" +msgstr "Προβολή στην ιστοσελίδα" #: contrib/admin/templates/admin/change_form.html:30 msgid "Please correct the error below." msgid_plural "Please correct the errors below." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Παρακαλώ διορθώστε το παρακάτω λάθος." +msgstr[1] "Παρακαλώ διορθώστε τα παρακάτω λάθη." #: contrib/admin/templates/admin/change_form.html:48 msgid "Ordering" -msgstr "" +msgstr "Σειρά" #: contrib/admin/templates/admin/change_form.html:51 msgid "Order:" -msgstr "" +msgstr "Σειρά:" #: contrib/admin/templates/admin/submit_line.html:4 msgid "Save as new" -msgstr "" +msgstr "Αποθήκευση καινούριου" #: contrib/admin/templates/admin/submit_line.html:5 msgid "Save and add another" -msgstr "" +msgstr "Αποθήκευση και προσθήκη καινούριου." #: contrib/admin/templates/admin/submit_line.html:6 msgid "Save and continue editing" -msgstr "" +msgstr "Αποθήκευση και συνέχεια επεξεργασίας" #: contrib/admin/templates/admin/submit_line.html:7 msgid "Save" @@ -841,12 +849,12 @@ msgstr "Αποθήκευση" #: contrib/admin/templates/registration/password_change_form.html:6 #: contrib/admin/templates/registration/password_change_form.html:10 msgid "Password change" -msgstr "" +msgstr "Αλλαγή Κωδικού" #: contrib/admin/templates/registration/password_change_done.html:6 #: contrib/admin/templates/registration/password_change_done.html:10 msgid "Password change successful" -msgstr "" +msgstr "Αλλαγή κωδικού επιτυχής" #: contrib/admin/templates/registration/password_change_done.html:12 msgid "Your password was changed." @@ -857,7 +865,7 @@ msgstr "Ο κωδίκός σας άλλαξε." #: contrib/admin/templates/registration/password_reset_form.html:10 #: contrib/admin/templates/registration/password_reset_done.html:4 msgid "Password reset" -msgstr "" +msgstr "Επαναφορά κωδικού" #: contrib/admin/templates/registration/password_reset_form.html:12 msgid "" @@ -867,11 +875,11 @@ msgstr "" #: contrib/admin/templates/registration/password_reset_form.html:16 msgid "E-mail address:" -msgstr "" +msgstr "E-mail διεύθυνση:" #: contrib/admin/templates/registration/password_reset_form.html:16 msgid "Reset my password" -msgstr "" +msgstr "Επαναφορά του κωδικού μου" #: contrib/admin/templates/registration/logged_out.html:8 msgid "Thanks for spending some quality time with the Web site today." @@ -880,7 +888,7 @@ msgstr "" #: contrib/admin/templates/registration/logged_out.html:10 msgid "Log in again" -msgstr "" +msgstr "Εισαγωγή ξανά" #: contrib/admin/templates/registration/password_reset_done.html:6 #: contrib/admin/templates/registration/password_reset_done.html:10 @@ -909,11 +917,11 @@ msgstr "Νέος κωδικός:" #: contrib/admin/templates/registration/password_change_form.html:21 msgid "Confirm password:" -msgstr "" +msgstr "Επιβεβαίωση κωδικού" #: contrib/admin/templates/registration/password_change_form.html:23 msgid "Change my password" -msgstr "" +msgstr "Αλλαγή του κωδικού μου" #: contrib/admin/templates/registration/password_reset_email.html:2 msgid "You're receiving this e-mail because you requested a password reset" @@ -1003,19 +1011,19 @@ msgstr "" #: contrib/admin/templates/widget/date_time.html:3 msgid "Date:" -msgstr "" +msgstr "Ημ/νία:" #: contrib/admin/templates/widget/date_time.html:4 msgid "Time:" -msgstr "" +msgstr "     Ώρα:" #: contrib/admin/templates/widget/file.html:2 msgid "Currently:" -msgstr "" +msgstr "Τρέχον:" #: contrib/admin/templates/widget/file.html:3 msgid "Change:" -msgstr "" +msgstr "Αλλαγή:" #: contrib/redirects/models.py:7 msgid "redirect from" @@ -1271,192 +1279,192 @@ msgstr "P" #: utils/dates.py:6 msgid "Monday" -msgstr "" +msgstr "Δευτέρα" #: utils/dates.py:6 msgid "Tuesday" -msgstr "" +msgstr "Τρίτη" #: utils/dates.py:6 msgid "Wednesday" -msgstr "" +msgstr "Τετάρτη" #: utils/dates.py:6 msgid "Thursday" -msgstr "" +msgstr "Πέμπτη" #: utils/dates.py:6 msgid "Friday" -msgstr "" +msgstr "Παρασκευή" #: utils/dates.py:7 msgid "Saturday" -msgstr "" +msgstr "Σάββατο" #: utils/dates.py:7 msgid "Sunday" -msgstr "" +msgstr "Κυριακή" #: utils/dates.py:14 msgid "January" -msgstr "" +msgstr "Ιανουάριος" #: utils/dates.py:14 msgid "February" -msgstr "" +msgstr "Φεβρουάριος" #: utils/dates.py:14 utils/dates.py:27 msgid "March" -msgstr "" +msgstr "Μάρτιος" #: utils/dates.py:14 utils/dates.py:27 msgid "April" -msgstr "" +msgstr "Απρίλιος" #: utils/dates.py:14 utils/dates.py:27 msgid "May" -msgstr "" +msgstr "Μάιος" #: utils/dates.py:14 utils/dates.py:27 msgid "June" -msgstr "" +msgstr "Ιούνιος" #: utils/dates.py:15 utils/dates.py:27 msgid "July" -msgstr "" +msgstr "Ιούλιος" #: utils/dates.py:15 msgid "August" -msgstr "" +msgstr "Αύγουστος" #: utils/dates.py:15 msgid "September" -msgstr "" +msgstr "Σεπτέμβριος" #: utils/dates.py:15 msgid "October" -msgstr "" +msgstr "Οκτώβριος" #: utils/dates.py:15 msgid "November" -msgstr "" +msgstr "Νοέμβριος" #: utils/dates.py:16 msgid "December" -msgstr "" +msgstr "Δεκέμβριος" #: utils/dates.py:19 #, fuzzy msgid "jan" -msgstr "και" +msgstr "Ιαν" #: utils/dates.py:19 msgid "feb" -msgstr "" +msgstr "Φεβ" #: utils/dates.py:19 msgid "mar" -msgstr "" +msgstr "Μάρ" #: utils/dates.py:19 msgid "apr" -msgstr "" +msgstr "Απρ" #: utils/dates.py:19 msgid "may" -msgstr "" +msgstr "Μάι" #: utils/dates.py:19 msgid "jun" -msgstr "" +msgstr "Ιούν" #: utils/dates.py:20 msgid "jul" -msgstr "" +msgstr "Ιούλ" #: utils/dates.py:20 msgid "aug" -msgstr "" +msgstr "Αύγ" #: utils/dates.py:20 msgid "sep" -msgstr "" +msgstr "Σεπ" #: utils/dates.py:20 msgid "oct" -msgstr "" +msgstr "Οκτ" #: utils/dates.py:20 msgid "nov" -msgstr "" +msgstr "Νοέ" #: utils/dates.py:20 msgid "dec" -msgstr "" +msgstr "Δεκ" #: utils/dates.py:27 msgid "Jan." -msgstr "" +msgstr "Ιάν." #: utils/dates.py:27 msgid "Feb." -msgstr "" +msgstr "Φεβ." #: utils/dates.py:28 msgid "Aug." -msgstr "" +msgstr "Αύγ." #: utils/dates.py:28 msgid "Sept." -msgstr "" +msgstr "Σεπτ." #: utils/dates.py:28 msgid "Oct." -msgstr "" +msgstr "Οκτ." #: utils/dates.py:28 msgid "Nov." -msgstr "" +msgstr "Νοέ." #: utils/dates.py:28 msgid "Dec." -msgstr "" +msgstr "Δεκ." #: utils/timesince.py:12 msgid "year" msgid_plural "years" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "χρόνος" +msgstr[1] "χρόνια" #: utils/timesince.py:13 msgid "month" msgid_plural "months" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "μήνας" +msgstr[1] "μήνες" #: utils/timesince.py:14 msgid "week" msgid_plural "weeks" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "εβδομάδα" +msgstr[1] "εβδομάδες" #: utils/timesince.py:15 msgid "day" msgid_plural "days" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "ημέρα" +msgstr[1] "ημέρες" #: utils/timesince.py:16 msgid "hour" msgid_plural "hours" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "ώρα" +msgstr[1] "ώρες" #: utils/timesince.py:17 msgid "minute" msgid_plural "minutes" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "λεπτό" +msgstr[1] "λεπτά" #: conf/global_settings.py:37 msgid "Bengali" @@ -1630,7 +1638,7 @@ msgstr "" #: core/validators.py:136 msgid "Enter a valid e-mail address." -msgstr "" +msgstr "Εισάγετε ένα σωστό e-mail." #: core/validators.py:148 msgid "" @@ -1745,12 +1753,12 @@ msgstr[1] "" #: core/validators.py:362 #, python-format msgid "Make sure your uploaded file is at least %s bytes big." -msgstr "Σιγουρευτείτε ότι το αρχείου που ανεβάζετε είναι %s bytes τουλάχιστον." +msgstr "Σιγουρευτείτε ότι το αρχείο που ανεβάζετε είναι %s bytes τουλάχιστον." #: core/validators.py:363 #, python-format msgid "Make sure your uploaded file is at most %s bytes big." -msgstr "" +msgstr "Σιγουρευτείτε ότι το αρχείο που ανεβάζετε έχει μέγεθος μέχρι %s bytes." #: core/validators.py:376 msgid "The format for this field is wrong." @@ -1827,7 +1835,7 @@ msgstr "" #: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553 #: forms/__init__.py:346 msgid "This field is required." -msgstr "" +msgstr "Αυτό το πεδίο είναι απαραίτητο" #: db/models/fields/__init__.py:337 msgid "This value must be an integer." @@ -1836,12 +1844,12 @@ msgstr "" #: db/models/fields/__init__.py:369 #, fuzzy msgid "This value must be either True or False." -msgstr "Boolean (Είτε Αλήθεια ή Ψέμα)" +msgstr "Boolean (Είτε Αληθές ή Ψευδές)" #: db/models/fields/__init__.py:385 #, fuzzy msgid "This field cannot be null." -msgstr "Αυτό το πεδίο είναι άκυρο" +msgstr "Αυτό το πεδίο δεν μπορεί να είναι κενό (null)" #: db/models/fields/__init__.py:562 msgid "Enter a valid filename." @@ -1850,7 +1858,7 @@ msgstr "Εισάγετε ένα έγκυρο όνομα αρχείου" #: db/models/fields/related.py:43 #, python-format msgid "Please enter a valid %s." -msgstr "" +msgstr "Παρακαλώ εισάγετε ένα/μία έγκυρο/η %s" #: db/models/fields/related.py:579 #, fuzzy diff --git a/django/conf/locale/el/LC_MESSAGES/djangojs.mo b/django/conf/locale/el/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000000..7d43b315fe Binary files /dev/null and b/django/conf/locale/el/LC_MESSAGES/djangojs.mo differ diff --git a/django/conf/locale/el/LC_MESSAGES/djangojs.po b/django/conf/locale/el/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000000..545f9f8601 --- /dev/null +++ b/django/conf/locale/el/LC_MESSAGES/djangojs.po @@ -0,0 +1,109 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2006 and beyond. +# This file is distributed under the same license as the Django package. +# Orestis Markou , 2006. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-09 11:51+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Orestis Markou \n" +"Language-Team: Greek\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: contrib/admin/media/js/SelectFilter2.js:33 +#, perl-format +msgid "Available %s" +msgstr "Διαθέσιμο %s" + +#: contrib/admin/media/js/SelectFilter2.js:41 +msgid "Choose all" +msgstr "Επιλογή Όλων" + +#: contrib/admin/media/js/SelectFilter2.js:46 +msgid "Add" +msgstr "Προσθήκη" + +#: contrib/admin/media/js/SelectFilter2.js:48 +msgid "Remove" +msgstr "Αφαίρεση" + +#: contrib/admin/media/js/SelectFilter2.js:53 +#, perl-format +msgid "Chosen %s" +msgstr "Επιλεχθέντα %s" + +#: contrib/admin/media/js/SelectFilter2.js:54 +msgid "Select your choice(s) and click " +msgstr "Επιλέξτε και κάντε κλικ." + +#: contrib/admin/media/js/SelectFilter2.js:59 +msgid "Clear all" +msgstr "Καθαρισμός όλων" + +#: contrib/admin/media/js/dateparse.js:26 +#: contrib/admin/media/js/calendar.js:24 +msgid "" +"January February March April May June July August September October November " +"December" +msgstr "Ιανουάριος Φεβρουάριος Μάρτιος Απρίλιος Μάιος Ιούνιος Ιούλιος Αύγουστος Σεπτέμβριος Οκτώβριος Νοέμβριος " +"Δεκέμβριος" + +#: contrib/admin/media/js/dateparse.js:27 +msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday" +msgstr "Κυριακή Δευτέρα Τρίτη Τετάρτη Πέμπτη Παρασκευή Σάββατο" + +#: contrib/admin/media/js/calendar.js:25 +msgid "S M T W T F S" +msgstr "Κ Δ Τ Τ Π Π Σ" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80 +msgid "Now" +msgstr "Τώρα" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48 +msgid "Clock" +msgstr "Ρολόι" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77 +msgid "Choose a time" +msgstr "Διαλέξτε ώρα" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81 +msgid "Midnight" +msgstr "Μεσάνυχτα" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82 +msgid "6 a.m." +msgstr "6 π.μ." + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83 +msgid "Noon" +msgstr "Μεσημέρι" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168 +msgid "Cancel" +msgstr "Άκυρο" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162 +msgid "Today" +msgstr "Σήμερα" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114 +msgid "Calendar" +msgstr "Ημερολόγιο" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160 +msgid "Yesterday" +msgstr "Χθες" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164 +msgid "Tomorrow" +msgstr "Αύριο" diff --git a/django/conf/locale/es_AR/LC_MESSAGES/django.mo b/django/conf/locale/es_AR/LC_MESSAGES/django.mo index dd96bf99ce..a247bb2385 100644 Binary files a/django/conf/locale/es_AR/LC_MESSAGES/django.mo and b/django/conf/locale/es_AR/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/es_AR/LC_MESSAGES/django.po b/django/conf/locale/es_AR/LC_MESSAGES/django.po index e5169e9c4a..36cae2f7f2 100644 --- a/django/conf/locale/es_AR/LC_MESSAGES/django.po +++ b/django/conf/locale/es_AR/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2006-08-18 18:57-0300\n" -"PO-Revision-Date: 2006-08-21 18:06-0300\n" +"POT-Creation-Date: 2006-11-05 19:57-0300\n" +"PO-Revision-Date: 2006-11-05 20:00-0300\n" "Last-Translator: Ramiro Morales \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" @@ -165,10 +165,18 @@ msgstr "Fechas importantes" msgid "Groups" msgstr "Grupos" -#: contrib/auth/models.py:256 +#: contrib/auth/models.py:258 msgid "message" msgstr "mensaje" +#: contrib/auth/forms.py:16 +msgid "The two password fields didn't match." +msgstr "Los dos campos de contraseas no coinciden entre si." + +#: contrib/auth/forms.py:24 +msgid "A user with that username already exists." +msgstr "Ya existe un usuario con ese nombre." + #: contrib/auth/forms.py:52 msgid "" "Your Web browser doesn't appear to have cookies enabled. Cookies are " @@ -189,6 +197,24 @@ msgstr "" msgid "This account is inactive." msgstr "Esta cuenta est inactiva" +#: contrib/auth/forms.py:84 +msgid "" +"That e-mail address doesn't have an associated user account. Are you sure " +"you've registered?" +msgstr "" +"Esa direccin de e-mail no est asociada a ninguna cuenta de usuario. Est " +"seguro de que ya se ha registrado?" + +#: contrib/auth/forms.py:116 +msgid "The two 'new password' fields didn't match." +msgstr "Los dos campos 'nueva contrasea' no coinciden entre si." + +#: contrib/auth/forms.py:123 +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "" +"La antigua contrasea ingresada es incorrecta. Por favor ingrsela " +"nuevamente." + #: contrib/redirects/models.py:7 msgid "redirect from" msgstr "redirigir desde" @@ -754,13 +780,13 @@ msgstr "" msgid "Site administration" msgstr "Sitio administrativo" -#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:14 +#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:18 #, python-format msgid "The %(name)s \"%(obj)s\" was added successfully." -msgstr "Se agreg con xito el %(name)s \"%(obj)s\"." +msgstr "Se agreg con xito %(name)s \"%(obj)s\"." #: contrib/admin/views/main.py:261 contrib/admin/views/main.py:347 -#: contrib/admin/views/auth.py:19 +#: contrib/admin/views/auth.py:23 msgid "You may edit it again below." msgstr "Puede modificarlo nuevamente abajo." @@ -780,7 +806,7 @@ msgid "Added %s." msgstr "Agregado %s." #: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337 -#: contrib/admin/views/main.py:339 +#: contrib/admin/views/main.py:339 db/models/manipulators.py:306 msgid "and" msgstr "y" @@ -801,15 +827,14 @@ msgstr "No ha modificado ning #: contrib/admin/views/main.py:345 #, python-format msgid "The %(name)s \"%(obj)s\" was changed successfully." -msgstr "Se modific con xito el %(name)s \"%(obj)s." +msgstr "Se modific con xito %(name)s \"%(obj)s." #: contrib/admin/views/main.py:353 #, python-format msgid "" "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." msgstr "" -"Se agreg con xito el %(name)s \"%(obj)s. Puede modificarlo nuevamente " -"abajo." +"Se agreg con xito %(name)s \"%(obj)s. Puede modificarlo nuevamente abajo." #: contrib/admin/views/main.py:391 #, python-format @@ -829,7 +854,7 @@ msgstr "Uno o m #: contrib/admin/views/main.py:511 #, python-format msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "Se elimin con xito el %(name)s \"%(obj)s\"." +msgstr "Se elimin con xito %(name)s \"%(obj)s\"." #: contrib/admin/views/main.py:514 msgid "Are you sure?" @@ -850,7 +875,7 @@ msgstr "Seleccione %s" msgid "Select %s to change" msgstr "Seleccione %s a modificar" -#: contrib/admin/views/main.py:756 +#: contrib/admin/views/main.py:758 msgid "Database error" msgstr "Error de base de datos" @@ -977,12 +1002,12 @@ msgstr "Estado de los EEUU (dos letras may msgid "XML text" msgstr "Texto XML" -#: contrib/admin/views/doc.py:339 +#: contrib/admin/views/doc.py:343 #, python-format msgid "%s does not appear to be a urlpattern object" msgstr "%s no parece ser un objeto urlpattern" -#: contrib/admin/views/auth.py:25 +#: contrib/admin/views/auth.py:29 msgid "Add user" msgstr "Agregar usuario" @@ -1181,10 +1206,6 @@ msgstr "P msgid "We're sorry, but the requested page could not be found." msgstr "Lo sentimos, pero no se encuentra la pgina solicitada." -#: contrib/admin/templates/admin/login.html:22 -msgid "Have you forgotten your password?" -msgstr "Ha olvidado su contrasea?" - #: contrib/admin/templates/admin/filters.html:4 msgid "Filter" msgstr "Filtrar" @@ -1726,123 +1747,134 @@ msgid "Argentinean Spanish" msgstr "Espaol Argentino" #: conf/global_settings.py:49 +msgid "Finnish" +msgstr "Finlands" + +#: conf/global_settings.py:50 msgid "French" msgstr "Francs" -#: conf/global_settings.py:50 +#: conf/global_settings.py:51 msgid "Galician" msgstr "Gallego" -#: conf/global_settings.py:51 +#: conf/global_settings.py:52 msgid "Hungarian" msgstr "Hngaro" -#: conf/global_settings.py:52 +#: conf/global_settings.py:53 msgid "Hebrew" msgstr "Hebreo" -#: conf/global_settings.py:53 +#: conf/global_settings.py:54 msgid "Icelandic" msgstr "Islands" -#: conf/global_settings.py:54 +#: conf/global_settings.py:55 msgid "Italian" msgstr "Italiano" -#: conf/global_settings.py:55 +#: conf/global_settings.py:56 msgid "Japanese" msgstr "Japons" -#: conf/global_settings.py:56 +#: conf/global_settings.py:57 msgid "Dutch" msgstr "Holands" -#: conf/global_settings.py:57 +#: conf/global_settings.py:58 msgid "Norwegian" msgstr "Noruego" -#: conf/global_settings.py:58 +#: conf/global_settings.py:59 +msgid "Polish" +msgstr "Polaco" + +#: conf/global_settings.py:60 msgid "Brazilian" msgstr "Brasileo" -#: conf/global_settings.py:59 +#: conf/global_settings.py:61 msgid "Romanian" msgstr "Rumano" -#: conf/global_settings.py:60 +#: conf/global_settings.py:62 msgid "Russian" msgstr "Ruso" -#: conf/global_settings.py:61 +#: conf/global_settings.py:63 msgid "Slovak" msgstr "Eslovaco" -#: conf/global_settings.py:62 +#: conf/global_settings.py:64 msgid "Slovenian" msgstr "Esloveno" -#: conf/global_settings.py:63 +#: conf/global_settings.py:65 msgid "Serbian" msgstr "Serbio" -#: conf/global_settings.py:64 +#: conf/global_settings.py:66 msgid "Swedish" msgstr "Sueco" -#: conf/global_settings.py:65 +#: conf/global_settings.py:67 msgid "Tamil" msgstr "Tamil" -#: conf/global_settings.py:66 +#: conf/global_settings.py:68 +msgid "Turkish" +msgstr "Turco" + +#: conf/global_settings.py:69 msgid "Ukrainian" msgstr "Ucraniano" -#: conf/global_settings.py:67 +#: conf/global_settings.py:70 msgid "Simplified Chinese" msgstr "Chino simplificado" -#: conf/global_settings.py:68 +#: conf/global_settings.py:71 msgid "Traditional Chinese" msgstr "Chino tradicional" -#: db/models/manipulators.py:302 +#: db/models/manipulators.py:305 #, python-format msgid "%(object)s with this %(type)s already exists for the given %(field)s." -msgstr "" -"Ya existen %(object)s con este %(type)s para el %(field)s especificado." +msgstr "Ya existe un(a) %(object)s con este/a %(type)s para %(field)s." -#: db/models/fields/__init__.py:40 +#: db/models/fields/__init__.py:41 #, python-format msgid "%(optname)s with this %(fieldname)s already exists." msgstr "Ya existe %(optname)s con este %(fieldname)s." -#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265 -#: db/models/fields/__init__.py:551 db/models/fields/__init__.py:562 -#: forms/__init__.py:346 +#: db/models/fields/__init__.py:115 db/models/fields/__init__.py:266 +#: db/models/fields/__init__.py:569 db/models/fields/__init__.py:580 +#: forms/__init__.py:347 msgid "This field is required." msgstr "Este campo es obligatorio." -#: db/models/fields/__init__.py:340 +#: db/models/fields/__init__.py:349 msgid "This value must be an integer." msgstr "Este valor debe ser un nmero entero." -#: db/models/fields/__init__.py:372 +#: db/models/fields/__init__.py:381 msgid "This value must be either True or False." msgstr "Este valor debe ser True o False." -#: db/models/fields/__init__.py:388 +#: db/models/fields/__init__.py:397 msgid "This field cannot be null." msgstr "Este campo no puede ser nulo." -#: db/models/fields/__init__.py:415 core/validators.py:127 +#: db/models/fields/__init__.py:424 core/validators.py:146 msgid "Enter a valid date in YYYY-MM-DD format." msgstr "Introduzca una fecha vlida en formato AAAA-MM-DD." -#: db/models/fields/__init__.py:477 core/validators.py:135 +#: db/models/fields/__init__.py:488 core/validators.py:155 msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format." msgstr "Introduzca una fecha/hora vlida en formato YYYY-MM-DD HH:MM." -#: db/models/fields/__init__.py:571 +#: db/models/fields/__init__.py:589 msgid "Enter a valid filename." msgstr "Introduzca un nombre de achivo vlido" @@ -1859,7 +1891,8 @@ msgstr " Separe m msgid "" "Hold down \"Control\", or \"Command\" on a Mac, to select more than one." msgstr "" -"Pulse \"Control\", o \"Command\" en un Mac, para seleccionar ms de uno." +"Mantenga presionada \"Control\" (\"Command\" en un Mac) para seleccionar ms " +"de uno." #: db/models/fields/related.py:664 #, python-format @@ -1873,42 +1906,42 @@ msgstr[1] "" "Por favor, introduzca IDs de %(self)s vlidos. Los valores %(value)r no son " "vlidos." -#: forms/__init__.py:381 +#: forms/__init__.py:382 #, python-format msgid "Ensure your text is less than %s character." msgid_plural "Ensure your text is less than %s characters." msgstr[0] "Asegrese de que su texto tiene menos de %s carcter." msgstr[1] "Asegrese de que su texto tiene menos de %s caracteres." -#: forms/__init__.py:386 +#: forms/__init__.py:387 msgid "Line breaks are not allowed here." msgstr "No se permiten saltos de lnea." -#: forms/__init__.py:487 forms/__init__.py:560 forms/__init__.py:599 +#: forms/__init__.py:488 forms/__init__.py:561 forms/__init__.py:600 #, python-format msgid "Select a valid choice; '%(data)s' is not in %(choices)s." msgstr "Seleccione una opcin vlida; '%(data)s' no est en %(choices)s." -#: forms/__init__.py:661 core/validators.py:151 core/validators.py:379 +#: forms/__init__.py:662 core/validators.py:172 core/validators.py:401 msgid "No file was submitted. Check the encoding type on the form." msgstr "" "No se envi un archivo. Verifique el tipo de codificacin en el formulario." -#: forms/__init__.py:663 +#: forms/__init__.py:664 msgid "The submitted file is empty." msgstr "El archivo enviado est vaco." -#: forms/__init__.py:719 +#: forms/__init__.py:720 msgid "Enter a whole number between -32,768 and 32,767." -msgstr "Introduzca un nmero entero entre -32,768 y 32,767." +msgstr "Introduzca un nmero entero entre -32.768 y 32.767." -#: forms/__init__.py:729 +#: forms/__init__.py:730 msgid "Enter a positive number." msgstr "Introduzca un nmero positivo." -#: forms/__init__.py:739 +#: forms/__init__.py:740 msgid "Enter a whole number between 0 and 32,767." -msgstr "Introduzca un nmero entero entre 0 y 32,767." +msgstr "Introduzca un nmero entero entre 0 y 32.767." #: core/validators.py:63 msgid "This value must contain only letters, numbers and underscores." @@ -1919,8 +1952,13 @@ msgid "" "This value must contain only letters, numbers, underscores, dashes or " "slashes." msgstr "" -"Este valor debe contener slo letras, nmeros, guiones bajos, barras (/) o " -"slashes." +"Este valor debe contener slo letras, nmeros, guiones bajos, guiones o " +"barras (/)" + +#: core/validators.py:71 +msgid "This value must contain only letters, numbers, underscores or hyphens." +msgstr "" +"Este valor debe contener slo letras, nmeros, guiones bajos o guiones." #: core/validators.py:75 msgid "Uppercase letters are not allowed here." @@ -1962,15 +2000,24 @@ msgstr "Introduzca un n msgid "Only alphabetical characters are allowed here." msgstr "Slo se admiten caracteres alfabticos." -#: core/validators.py:131 +#: core/validators.py:138 +msgid "Year must be 1900 or later." +msgstr "El ao debe ser 1900 o posterior." + +#: core/validators.py:142 +#, python-format +msgid "Invalid date: %s." +msgstr "Fecha no vlida: %s." + +#: core/validators.py:151 msgid "Enter a valid time in HH:MM format." msgstr "Introduzca una hora vlida en formato HH:MM." -#: core/validators.py:139 +#: core/validators.py:160 msgid "Enter a valid e-mail address." msgstr "Introduzca una direccin de correo electrnico vlida" -#: core/validators.py:155 +#: core/validators.py:176 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." @@ -1978,28 +2025,28 @@ msgstr "" "Enve una imagen vlida. El archivo que ha enviado no era una imagen o se " "trataba de una imagen corrupta." -#: core/validators.py:162 +#: core/validators.py:183 #, python-format msgid "The URL %s does not point to a valid image." msgstr "La URL %s no apunta a una imagen vlida." -#: core/validators.py:166 +#: core/validators.py:187 #, python-format msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid." msgstr "" -"Los nmeros de telfono deben guardar el formato XXX-XXX-XXXX format. \"%s\" " -"no es vlido." +"Los nmeros telefnicos deben respetar el formato XXX-XXX-XXXX. \"%s\" no es " +"vlido." -#: core/validators.py:174 +#: core/validators.py:195 #, python-format msgid "The URL %s does not point to a valid QuickTime video." msgstr "La URL %s no apunta a un vdeo QuickTime vlido." -#: core/validators.py:178 +#: core/validators.py:199 msgid "A valid URL is required." msgstr "Se precisa una URL vlida." -#: core/validators.py:192 +#: core/validators.py:213 #, python-format msgid "" "Valid HTML is required. Specific errors are:\n" @@ -2008,69 +2055,69 @@ msgstr "" "Se precisa HTML vlido. Los errores especficos son:\n" "%s" -#: core/validators.py:199 +#: core/validators.py:220 #, python-format msgid "Badly formed XML: %s" msgstr "XML mal formado: %s" -#: core/validators.py:209 +#: core/validators.py:230 #, python-format msgid "Invalid URL: %s" msgstr "URL no vlida: %s" -#: core/validators.py:213 core/validators.py:215 +#: core/validators.py:234 core/validators.py:236 #, python-format msgid "The URL %s is a broken link." msgstr "La URL %s es un enlace roto." -#: core/validators.py:221 +#: core/validators.py:242 msgid "Enter a valid U.S. state abbreviation." msgstr "Introduzca una abreviatura vlida de estado de los EEUU." -#: core/validators.py:236 +#: core/validators.py:256 #, python-format msgid "Watch your mouth! The word %s is not allowed here." msgid_plural "Watch your mouth! The words %s are not allowed here." msgstr[0] "Vigila tu boca! Aqu no admitimos la palabra %s." msgstr[1] "Vigila tu boca! Aqu no admitimos las palabras %s." -#: core/validators.py:243 +#: core/validators.py:263 #, python-format msgid "This field must match the '%s' field." msgstr "Este campo debe concordar con el campo '%s'." -#: core/validators.py:262 +#: core/validators.py:282 msgid "Please enter something for at least one field." msgstr "Por favor, introduzca algo en al menos un campo." -#: core/validators.py:271 core/validators.py:282 +#: core/validators.py:291 core/validators.py:302 msgid "Please enter both fields or leave them both empty." msgstr "Por favor, rellene ambos campos o deje ambos vacos." -#: core/validators.py:289 +#: core/validators.py:309 #, python-format msgid "This field must be given if %(field)s is %(value)s" msgstr "Se debe proporcionar este campo si %(field)s es %(value)s" -#: core/validators.py:301 +#: core/validators.py:321 #, python-format msgid "This field must be given if %(field)s is not %(value)s" msgstr "Se debe proporcionar este campo si %(field)s no es %(value)s" -#: core/validators.py:320 +#: core/validators.py:340 msgid "Duplicate values are not allowed." msgstr "No se admiten valores duplicados." -#: core/validators.py:343 +#: core/validators.py:363 #, python-format msgid "This value must be a power of %s." msgstr "Este valor debe ser una potencia de %s." -#: core/validators.py:354 +#: core/validators.py:374 msgid "Please enter a valid decimal number." msgstr "Por favor, introduzca un nmero decimal vlido." -#: core/validators.py:356 +#: core/validators.py:378 #, python-format msgid "Please enter a valid decimal number with at most %s total digit." msgid_plural "" @@ -2082,7 +2129,7 @@ msgstr[1] "" "Por favor, introduzca un nmero decimal vlido con un maximo de %s dgitos " "en total." -#: core/validators.py:359 +#: core/validators.py:381 #, python-format msgid "" "Please enter a valid decimal number with a whole part of at most %s digit." @@ -2095,7 +2142,7 @@ msgstr[1] "" "Por favor, introduzca un nmero decimal vlido con un mximo de %s dgitos " "enteros." -#: core/validators.py:362 +#: core/validators.py:384 #, python-format msgid "Please enter a valid decimal number with at most %s decimal place." msgid_plural "" @@ -2107,30 +2154,30 @@ msgstr[1] "" "Por favor, introduzca un nmero decimal vlido con un mximo de %s " "posiciones decimales." -#: core/validators.py:372 +#: core/validators.py:394 #, python-format msgid "Make sure your uploaded file is at least %s bytes big." msgstr "Asegrese de que el archivo que enva tiene al menos %s bytes." -#: core/validators.py:373 +#: core/validators.py:395 #, python-format msgid "Make sure your uploaded file is at most %s bytes big." msgstr "Asegrese de que el archivo que enva tiene como mximo %s bytes." -#: core/validators.py:390 +#: core/validators.py:412 msgid "The format for this field is wrong." msgstr "El formato de este campo es incorrecto." -#: core/validators.py:405 +#: core/validators.py:427 msgid "This field is invalid." msgstr "Este campo no es vlido." -#: core/validators.py:441 +#: core/validators.py:463 #, python-format msgid "Could not retrieve anything from %s." msgstr "No pude obtener nada de %s." -#: core/validators.py:444 +#: core/validators.py:466 #, python-format msgid "" "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." @@ -2138,7 +2185,7 @@ msgstr "" "La URL %(url)s devolvi la cabecera Content-Type '%(contenttype)s', que no " "es vlida." -#: core/validators.py:477 +#: core/validators.py:499 #, python-format msgid "" "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with " @@ -2147,7 +2194,7 @@ msgstr "" "Por favor, cierre la etiqueta %(tag)s de la lnea %(line)s. (La lnea " "empieza por \"%(start)s\".)" -#: core/validators.py:481 +#: core/validators.py:503 #, python-format msgid "" "Some text starting on line %(line)s is not allowed in that context. (Line " @@ -2156,7 +2203,7 @@ msgstr "" "Parte del texto que comienza en la lnea %(line)s no est permitido en ese " "contexto. (La lnea empieza por \"%(start)s\".)" -#: core/validators.py:486 +#: core/validators.py:508 #, python-format msgid "" "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%" @@ -2165,7 +2212,7 @@ msgstr "" "El \"%(attr)s\" de la lnea %(line)s no es un atributo vlido. (La lnea " "empieza por \"%(start)s\".)" -#: core/validators.py:491 +#: core/validators.py:513 #, python-format msgid "" "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%" @@ -2174,7 +2221,7 @@ msgstr "" "La \"<%(tag)s>\" de la lnea %(line)s no es una etiqueta vlida. (La lnea " "empieza por \"%(start)s\".)" -#: core/validators.py:495 +#: core/validators.py:517 #, python-format msgid "" "A tag on line %(line)s is missing one or more required attributes. (Line " @@ -2183,7 +2230,7 @@ msgstr "" "A una etiqueta de la lnea %(line)s le faltan uno o ms atributos " "requeridos. (La lnea empieza por \"%(start)s\".)" -#: core/validators.py:500 +#: core/validators.py:522 #, python-format msgid "" "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line " @@ -2199,17 +2246,20 @@ msgstr "si,no,tal vez" #: views/generic/create_update.py:43 #, python-format msgid "The %(verbose_name)s was created successfully." -msgstr "Se cre con xito el %(verbose_name)." +msgstr "Se cre con xito %(verbose_name)." #: views/generic/create_update.py:117 #, python-format msgid "The %(verbose_name)s was updated successfully." -msgstr "Se actualiz con xito el %(verbose_name)s." +msgstr "Se actualiz con xito %(verbose_name)s." #: views/generic/create_update.py:184 #, python-format msgid "The %(verbose_name)s was deleted." -msgstr "Se elimin el %(verbose_name)s." +msgstr "Se elimin %(verbose_name)s." + +#~ msgid "Have you forgotten your password?" +#~ msgstr "Ha olvidado su contrasea?" #~ msgid "%(content_type_name)s" #~ msgstr "tipos de contenido" diff --git a/django/conf/locale/es_AR/LC_MESSAGES/djangojs.mo b/django/conf/locale/es_AR/LC_MESSAGES/djangojs.mo index f24c9a12d0..3f89e3e33f 100644 Binary files a/django/conf/locale/es_AR/LC_MESSAGES/djangojs.mo and b/django/conf/locale/es_AR/LC_MESSAGES/djangojs.mo differ diff --git a/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po b/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po index 49d3856d3c..1865de9450 100644 --- a/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po +++ b/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Django JavaScript 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2006-06-19 12:15-0300\n" +"POT-Creation-Date: 2006-09-25 15:09-0300\n" "PO-Revision-Date: 2006-05-16 10:20-0300\n" "Last-Translator: Ramiro Morales \n" "MIME-Version: 1.0\n" @@ -39,7 +39,7 @@ msgstr "%s elegidos" #: contrib/admin/media/js/SelectFilter2.js:54 msgid "Select your choice(s) and click " -msgstr "Haga sus elecciones y haga click en " +msgstr "Seleccione los items a agregar y haga click en " #: contrib/admin/media/js/SelectFilter2.js:59 msgid "Clear all" @@ -51,7 +51,7 @@ msgid "" "January February March April May June July August September October November " "December" msgstr "" -"Enero Febrero Marzo Abril Mayo Junio Julio Agosto Septiembre Octubre " +"Enero Febrero Marzo Abril Mayo Junio Julio Agosto Setiembre Octubre " "Noviembre Diciembre" #: contrib/admin/media/js/dateparse.js:33 @@ -71,49 +71,49 @@ msgstr "Mostrar" msgid "Hide" msgstr "Ocultar" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45 -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:89 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81 msgid "Now" msgstr "Ahora" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51 msgid "Clock" msgstr "Reloj" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:86 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78 msgid "Choose a time" msgstr "Elija una hora" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:90 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82 msgid "Midnight" msgstr "Medianoche" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:91 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83 msgid "6 a.m." msgstr "6 a.m." -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:92 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84 msgid "Noon" msgstr "Medioda" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:96 -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:187 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183 msgid "Cancel" msgstr "Cancelar" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:120 -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:181 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177 msgid "Today" msgstr "Hoy" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:123 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132 msgid "Calendar" msgstr "Calendario" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175 msgid "Yesterday" msgstr "Ayer" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179 msgid "Tomorrow" msgstr "Maana" diff --git a/django/contrib/admin/media/js/admin/DateTimeShortcuts.js b/django/contrib/admin/media/js/admin/DateTimeShortcuts.js index 77c536b865..b1504fc819 100644 --- a/django/contrib/admin/media/js/admin/DateTimeShortcuts.js +++ b/django/contrib/admin/media/js/admin/DateTimeShortcuts.js @@ -44,7 +44,7 @@ var DateTimeShortcuts = { var shortcuts_span = document.createElement('span'); inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); var now_link = document.createElement('a'); - now_link.setAttribute('href', "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date().getHourMinute());"); + now_link.setAttribute('href', "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date().getHourMinuteSecond());"); now_link.appendChild(document.createTextNode(gettext('Now'))); var clock_link = document.createElement('a'); clock_link.setAttribute('href', 'javascript:DateTimeShortcuts.openClock(' + num + ');'); @@ -80,10 +80,10 @@ var DateTimeShortcuts = { quickElement('h2', clock_box, gettext('Choose a time')); time_list = quickElement('ul', clock_box, ''); time_list.className = 'timelist'; - quickElement("a", quickElement("li", time_list, ""), gettext("Now"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date().getHourMinute());") - quickElement("a", quickElement("li", time_list, ""), gettext("Midnight"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '00:00');") - quickElement("a", quickElement("li", time_list, ""), gettext("6 a.m."), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '06:00');") - quickElement("a", quickElement("li", time_list, ""), gettext("Noon"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '12:00');") + quickElement("a", quickElement("li", time_list, ""), gettext("Now"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date().getHourMinuteSecond());") + quickElement("a", quickElement("li", time_list, ""), gettext("Midnight"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '00:00:00');") + quickElement("a", quickElement("li", time_list, ""), gettext("6 a.m."), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '06:00:00');") + quickElement("a", quickElement("li", time_list, ""), gettext("Noon"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '12:00:00');") cancel_p = quickElement('p', clock_box, ''); cancel_p.className = 'calendar-cancel'; diff --git a/django/contrib/admin/media/js/core.js b/django/contrib/admin/media/js/core.js index d35bd29c1c..a17ac8a4d2 100644 --- a/django/contrib/admin/media/js/core.js +++ b/django/contrib/admin/media/js/core.js @@ -119,6 +119,10 @@ Date.prototype.getTwoDigitMinute = function() { return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes(); } +Date.prototype.getTwoDigitSecond = function() { + return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds(); +} + Date.prototype.getISODate = function() { return this.getCorrectYear() + '-' + this.getTwoDigitMonth() + '-' + this.getTwoDigitDate(); } @@ -127,6 +131,10 @@ Date.prototype.getHourMinute = function() { return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute(); } +Date.prototype.getHourMinuteSecond = function() { + return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute() + ':' + this.getTwoDigitSecond(); +} + // ---------------------------------------------------------------------------- // String object extensions // ---------------------------------------------------------------------------- diff --git a/django/contrib/sitemaps/templates/sitemap.xml b/django/contrib/sitemaps/templates/sitemap.xml index ad24c045d4..16d9a0bbe0 100644 --- a/django/contrib/sitemaps/templates/sitemap.xml +++ b/django/contrib/sitemaps/templates/sitemap.xml @@ -1,5 +1,5 @@ - + {% spaceless %} {% for url in urlset %} diff --git a/django/contrib/sitemaps/templates/sitemap_index.xml b/django/contrib/sitemaps/templates/sitemap_index.xml index c89b192ecc..9f39bb879f 100644 --- a/django/contrib/sitemaps/templates/sitemap_index.xml +++ b/django/contrib/sitemaps/templates/sitemap_index.xml @@ -1,4 +1,4 @@ - + {% for location in sitemaps %}{{ location|escape }}{% endfor %} diff --git a/django/core/handlers/wsgi.py b/django/core/handlers/wsgi.py index 2998bd31f6..7dc1a4a5eb 100644 --- a/django/core/handlers/wsgi.py +++ b/django/core/handlers/wsgi.py @@ -157,7 +157,8 @@ class WSGIRequest(http.HttpRequest): return self._raw_post_data except AttributeError: buf = StringIO() - content_length = int(self.environ['CONTENT_LENGTH']) + # CONTENT_LENGTH might be absent if POST doesn't have content at all (lighttpd) + content_length = int(self.environ.get('CONTENT_LENGTH', 0)) safe_copyfileobj(self.environ['wsgi.input'], buf, size=content_length) self._raw_post_data = buf.getvalue() buf.close() diff --git a/django/core/mail.py b/django/core/mail.py index da4cacbe29..a5af6e610f 100644 --- a/django/core/mail.py +++ b/django/core/mail.py @@ -4,6 +4,11 @@ from django.conf import settings from email.MIMEText import MIMEText from email.Header import Header import smtplib, rfc822 +import socket +import time +import random + +DNS_NAME = socket.getfqdn() # Cache the hostname class BadHeaderError(ValueError): pass @@ -50,6 +55,11 @@ def send_mass_mail(datatuple, fail_silently=False, auth_user=settings.EMAIL_HOST msg['From'] = from_email msg['To'] = ', '.join(recipient_list) msg['Date'] = rfc822.formatdate() + try: + random_bits = str(random.getrandbits(64)) + except AttributeError: # Python 2.3 doesn't have random.getrandbits(). + random_bits = ''.join([random.choice('1234567890') for i in range(19)]) + msg['Message-ID'] = "<%d.%s@%s>" % (time.time(), random_bits, DNS_NAME) try: server.sendmail(from_email, recipient_list, msg.as_string()) num_sent += 1 diff --git a/django/core/xheaders.py b/django/core/xheaders.py index 69f6115839..3beb930158 100644 --- a/django/core/xheaders.py +++ b/django/core/xheaders.py @@ -17,6 +17,6 @@ def populate_xheaders(request, response, model, object_id): or if the request is from a logged in staff member. """ from django.conf import settings - if request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS or (request.user.is_authenticated() and request.user.is_staff): + if request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS or (hasattr(request, 'user') and request.user.is_authenticated() and request.user.is_staff): response['X-Object-Type'] = "%s.%s" % (model._meta.app_label, model._meta.object_name.lower()) response['X-Object-Id'] = str(object_id) diff --git a/django/middleware/gzip.py b/django/middleware/gzip.py index 7d860abdb1..a7c74481d0 100644 --- a/django/middleware/gzip.py +++ b/django/middleware/gzip.py @@ -25,4 +25,5 @@ class GZipMiddleware(object): response.content = compress_string(response.content) response['Content-Encoding'] = 'gzip' + response['Content-Length'] = str(len(response.content)) return response diff --git a/django/newforms/fields.py b/django/newforms/fields.py index 54089cb3c3..40fc18bd3e 100644 --- a/django/newforms/fields.py +++ b/django/newforms/fields.py @@ -2,7 +2,7 @@ Field classes """ -from util import ValidationError, DEFAULT_ENCODING +from util import ValidationError, DEFAULT_ENCODING, smart_unicode from widgets import TextInput, CheckboxInput, Select, SelectMultiple import datetime import re @@ -28,6 +28,9 @@ except NameError: class Field(object): widget = TextInput # Default widget to use when rendering this type of Field. + # Tracks each time a Field instance is created. Used to retain order. + creation_counter = 0 + def __init__(self, required=True, widget=None): self.required = required widget = widget or self.widget @@ -35,6 +38,10 @@ class Field(object): widget = widget() self.widget = widget + # Increase the creation counter, and save our local copy. + self.creation_counter = Field.creation_counter + Field.creation_counter += 1 + def clean(self, value): """ Validates the given value and returns its "cleaned" value as an @@ -55,10 +62,7 @@ class CharField(Field): "Validates max_length and min_length. Returns a Unicode object." Field.clean(self, value) if value in EMPTY_VALUES: value = u'' - if not isinstance(value, basestring): - value = unicode(str(value), DEFAULT_ENCODING) - elif not isinstance(value, unicode): - value = unicode(value, DEFAULT_ENCODING) + value = smart_unicode(value) if self.max_length is not None and len(value) > self.max_length: raise ValidationError(u'Ensure this value has at most %d characters.' % self.max_length) if self.min_length is not None and len(value) < self.min_length: @@ -165,10 +169,7 @@ class RegexField(Field): """ Field.clean(self, value) if value in EMPTY_VALUES: value = u'' - if not isinstance(value, basestring): - value = unicode(str(value), DEFAULT_ENCODING) - elif not isinstance(value, unicode): - value = unicode(value, DEFAULT_ENCODING) + value = smart_unicode(value) if not self.regex.search(value): raise ValidationError(self.error_message) return value @@ -215,7 +216,7 @@ class URLField(RegexField): "User-Agent": self.user_agent, } try: - req = urllib2.Request(field_data, None, headers) + req = urllib2.Request(value, None, headers) u = urllib2.urlopen(req) except ValueError: raise ValidationError(u'Enter a valid URL.') @@ -244,10 +245,7 @@ class ChoiceField(Field): """ value = Field.clean(self, value) if value in EMPTY_VALUES: value = u'' - if not isinstance(value, basestring): - value = unicode(str(value), DEFAULT_ENCODING) - elif not isinstance(value, unicode): - value = unicode(value, DEFAULT_ENCODING) + value = smart_unicode(value) valid_values = set([str(k) for k, v in self.choices]) if value not in valid_values: raise ValidationError(u'Select a valid choice. %s is not one of the available choices.' % value) @@ -267,11 +265,8 @@ class MultipleChoiceField(ChoiceField): raise ValidationError(u'This field is required.') new_value = [] for val in value: - if not isinstance(val, basestring): - value = unicode(str(val), DEFAULT_ENCODING) - elif not isinstance(val, unicode): - value = unicode(val, DEFAULT_ENCODING) - new_value.append(value) + val = smart_unicode(val) + new_value.append(val) # Validate that each value in the value list is in self.choices. valid_values = set([k for k, v in self.choices]) for val in new_value: diff --git a/django/newforms/forms.py b/django/newforms/forms.py index e490d0d5f9..b8264fb691 100644 --- a/django/newforms/forms.py +++ b/django/newforms/forms.py @@ -2,6 +2,7 @@ Form classes """ +from django.utils.datastructures import SortedDict from fields import Field from widgets import TextInput, Textarea from util import ErrorDict, ErrorList, ValidationError @@ -13,18 +14,30 @@ def pretty_name(name): name = name[0].upper() + name[1:] return name.replace('_', ' ') +class SortedDictFromList(SortedDict): + "A dictionary that keeps its keys in the order in which they're inserted." + # This is different than django.utils.datastructures.SortedDict, because + # this takes a list/tuple as the argument to __init__(). + def __init__(self, data=None): + if data is None: data = [] + self.keyOrder = [d[0] for d in data] + dict.__init__(self, dict(data)) + class DeclarativeFieldsMetaclass(type): "Metaclass that converts Field attributes to a dictionary called 'fields'." def __new__(cls, name, bases, attrs): - attrs['fields'] = dict([(name, attrs.pop(name)) for name, obj in attrs.items() if isinstance(obj, Field)]) + fields = [(name, attrs.pop(name)) for name, obj in attrs.items() if isinstance(obj, Field)] + fields.sort(lambda x, y: cmp(x[1].creation_counter, y[1].creation_counter)) + attrs['fields'] = SortedDictFromList(fields) return type.__new__(cls, name, bases, attrs) class Form(object): "A collection of Fields, plus their associated data." __metaclass__ = DeclarativeFieldsMetaclass - def __init__(self, data=None): # TODO: prefix stuff + def __init__(self, data=None, auto_id=False): # TODO: prefix stuff self.data = data or {} + self.auto_id = auto_id self.clean_data = None # Stores the data after clean() has been called. self.__errors = None # Stores the errors after clean() has been called. @@ -63,17 +76,15 @@ class Form(object): return not bool(self.errors()) def as_table(self): - "Returns this form rendered as an HTML ." - output = u'\n'.join(['' % (pretty_name(name), BoundField(self, field, name)) for name, field in self.fields.items()]) - return '
      %s:%s
      \n%s\n
      ' % output + "Returns this form rendered as HTML s -- excluding the
      ." + return u'\n'.join(['%s:%s' % (pretty_name(name), BoundField(self, field, name)) for name, field in self.fields.items()]) def as_ul(self): - "Returns this form rendered as an HTML
        ." - output = u'\n'.join(['
      • %s: %s
      • ' % (pretty_name(name), BoundField(self, field, name)) for name, field in self.fields.items()]) - return '
          \n%s\n
        ' % output + "Returns this form rendered as HTML
      • s -- excluding the
          ." + return u'\n'.join(['
        • %s: %s
        • ' % (pretty_name(name), BoundField(self, field, name)) for name, field in self.fields.items()]) def as_table_with_errors(self): - "Returns this form rendered as an HTML , with errors." + "Returns this form rendered as HTML s, with errors." output = [] if self.errors().get(NON_FIELD_ERRORS): # Errors not corresponding to a particular field are displayed at the top. @@ -83,10 +94,10 @@ class Form(object): if bf.errors: output.append('' % '\n'.join(['
        • %s
        • ' % e for e in bf.errors])) output.append('' % (pretty_name(name), bf)) - return '
            %s
          %s:%s
          \n%s\n
          ' % '\n'.join(output) + return u'\n'.join(output) def as_ul_with_errors(self): - "Returns this form rendered as an HTML
            , with errors." + "Returns this form rendered as HTML
          • s, with errors." output = [] if self.errors().get(NON_FIELD_ERRORS): # Errors not corresponding to a particular field are displayed at the top. @@ -98,7 +109,7 @@ class Form(object): line += '
              %s
            ' % '\n'.join(['
          • %s
          • ' % e for e in bf.errors]) line += '%s: %s' % (pretty_name(name), bf) output.append(line) - return '
              \n%s\n
            ' % '\n'.join(output) + return u'\n'.join(output) def full_clean(self): """ @@ -156,6 +167,10 @@ class BoundField(object): errors = property(_errors) def as_widget(self, widget, attrs=None): + attrs = attrs or {} + auto_id = self.auto_id + if not attrs.has_key('id') and not widget.attrs.has_key('id') and auto_id: + attrs['id'] = auto_id return widget.render(self._name, self._form.data.get(self._name, None), attrs=attrs) def as_text(self, attrs=None): @@ -167,3 +182,16 @@ class BoundField(object): def as_textarea(self, attrs=None): "Returns a string of HTML for representing this as a ' % (flatatt(final_attrs), escape(value)) + value = smart_unicode(value) + final_attrs = self.build_attrs(attrs, name=name) + return u'%s' % (flatatt(final_attrs), escape(value)) class CheckboxInput(Widget): def render(self, name, value, attrs=None): - final_attrs = dict(self.attrs, type='checkbox', name=name) - if attrs: - final_attrs.update(attrs) + final_attrs = self.build_attrs(attrs, type='checkbox', name=name) if value: final_attrs['checked'] = 'checked' - return u'' % flatatt(final_attrs) + return u'' % flatatt(final_attrs) class Select(Widget): def __init__(self, attrs=None, choices=()): @@ -75,14 +80,13 @@ class Select(Widget): def render(self, name, value, attrs=None, choices=()): if value is None: value = '' - final_attrs = dict(self.attrs, name=name) - if attrs: - final_attrs.update(attrs) - output = [u'') return u'\n'.join(output) @@ -95,19 +99,55 @@ class SelectMultiple(Widget): def render(self, name, value, attrs=None, choices=()): if value is None: value = [] - final_attrs = dict(self.attrs, name=name) - if attrs: - final_attrs.update(attrs) - output = [u'' % flatatt(final_attrs)] + str_values = set([smart_unicode(v) for v in value]) # Normalize to strings. for option_value, option_label in chain(self.choices, choices): - selected_html = (str(option_value) in str_values) and ' selected="selected"' or '' - output.append(u'' % (escape(option_value), selected_html, escape(option_label))) + option_value = smart_unicode(option_value) + selected_html = (option_value in str_values) and ' selected="selected"' or '' + output.append(u'' % (escape(option_value), selected_html, escape(smart_unicode(option_label)))) output.append(u'') return u'\n'.join(output) -class RadioSelect(Widget): - pass +class RadioInput(object): + "An object used by RadioFieldRenderer that represents a single ." + def __init__(self, name, value, attrs, choice): + self.name, self.value = name, value + self.attrs = attrs or {} + self.choice_value, self.choice_label = choice + + def __str__(self): + return u'' % (self.tag(), self.choice_label) + + def is_checked(self): + return self.value == smart_unicode(self.choice_value) + + def tag(self): + final_attrs = dict(self.attrs, type='radio', name=self.name, value=self.choice_value) + if self.is_checked(): + final_attrs['checked'] = 'checked' + return u'' % flatatt(final_attrs) + +class RadioFieldRenderer(object): + "An object used by RadioSelect to enable customization of radio widgets." + def __init__(self, name, value, attrs, choices): + self.name, self.value, self.attrs = name, value, attrs + self.choices = choices + + def __iter__(self): + for choice in self.choices: + yield RadioInput(self.name, self.value, self.attrs, choice) + + def __str__(self): + "Outputs a
              for this set of radio fields." + return u'
                \n%s\n
              ' % u'\n'.join([u'
            • %s
            • ' % w for w in self]) + +class RadioSelect(Select): + def render(self, name, value, attrs=None, choices=()): + "Returns a RadioFieldRenderer instance rather than a Unicode string." + if value is None: value = '' + str_value = smart_unicode(value) # Normalize to string. + return RadioFieldRenderer(name, str_value, attrs, list(chain(self.choices, choices))) class CheckboxSelectMultiple(Widget): pass diff --git a/django/template/defaulttags.py b/django/template/defaulttags.py index 992917c77f..41fa542519 100644 --- a/django/template/defaulttags.py +++ b/django/template/defaulttags.py @@ -657,14 +657,14 @@ def ifchanged(parser, token): {{ date|date:"j" }} {% endfor %} - 2. If given a variable, check if that variable has changed. For example, the + 2. If given a variable, check whether that variable has changed. For example, the following shows the date every time it changes, but only shows the hour if both - the hour and the date has changed:: + the hour and the date have changed:: {% for date in days %} - {% ifchanged date.date %} {{date.date}} {% endifchanged %} + {% ifchanged date.date %} {{ date.date }} {% endifchanged %} {% ifchanged date.hour date.date %} - {{date.hour}} + {{ date.hour }} {% endifchanged %} {% endfor %} """ diff --git a/docs/forms.txt b/docs/forms.txt index 1c683c44f7..ff192a4717 100644 --- a/docs/forms.txt +++ b/docs/forms.txt @@ -611,13 +611,13 @@ fails. If no message is passed in, a default message is used. string comparison here, you will need to write your own validator. ``NumberIsInRange`` - Takes two boundary number, ``lower`` and ``upper`` and checks that the + Takes two boundary numbers, ``lower`` and ``upper``, and checks that the field is greater than ``lower`` (if given) and less than ``upper`` (if given). - Both checks are inclusive; that is, ``NumberIsInRange(10, 20)`` will allow - values of both 10 and 20. This validator only checks numeric fields - (i.e. floats and integer fields). + Both checks are inclusive. That is, ``NumberIsInRange(10, 20)`` will allow + values of both 10 and 20. This validator only checks numeric values + (e.g., float and integer values). ``IsAPowerOf`` Takes an integer argument and when called as a validator, checks that the diff --git a/docs/sitemaps.txt b/docs/sitemaps.txt index fec65572f2..7414567b16 100644 --- a/docs/sitemaps.txt +++ b/docs/sitemaps.txt @@ -5,9 +5,9 @@ The sitemap framework **New in Django development version**. Django comes with a high-level sitemap-generating framework that makes -creating `Google Sitemap`_ XML files easy. +creating sitemap_ XML files easy. -.. _Google Sitemap: http://www.google.com/webmasters/sitemaps/docs/en/protocol.html +.. _sitemap: http://www.sitemaps.org/ Overview ======== @@ -55,11 +55,12 @@ URLconf_: This tells Django to build a sitemap when a client accesses ``/sitemap.xml``. -The name of the sitemap file is not important, but the location is. Google will -only index links in your sitemap for the current URL level and below. For -instance, if ``sitemap.xml`` lives in your root directory, it may reference any -URL in your site. However, if your sitemap lives at ``/content/sitemap.xml``, -it may only reference URLs that begin with ``/content/``. +The name of the sitemap file is not important, but the location is. Search +engines will only index links in your sitemap for the current URL level and +below. For instance, if ``sitemap.xml`` lives in your root directory, it may +reference any URL in your site. However, if your sitemap lives at +``/content/sitemap.xml``, it may only reference URLs that begin with +``/content/``. The sitemap view takes an extra, required argument: ``{'sitemaps': sitemaps}``. ``sitemaps`` should be a dictionary that maps a short section label (e.g., @@ -199,9 +200,9 @@ If it's an attribute, its value should be either a string or float representing the priority of *every* object returned by ``items()``. Example values for ``priority``: ``0.4``, ``1.0``. The default priority of a -page is ``0.5``. See Google's documentation for more documentation. +page is ``0.5``. See the `sitemaps.org documentation`_ for more. -.. _Google's documentation: http://www.google.com/webmasters/sitemaps/docs/en/protocol.html +.. _sitemaps.org documentation: http://www.sitemaps.org/protocol.html#prioritydef Shortcuts ========= diff --git a/docs/templates.txt b/docs/templates.txt index cb06fa27d9..b4cc47b9f3 100644 --- a/docs/templates.txt +++ b/docs/templates.txt @@ -473,7 +473,7 @@ block are output:: In the above, if ``athlete_list`` is not empty, the number of athletes will be displayed by the ``{{ athlete_list|length }}`` variable. -As you can see, the ``if`` tag can take an option ``{% else %}`` clause that +As you can see, the ``if`` tag can take an optional ``{% else %}`` clause that will be displayed if the test fails. ``if`` tags may use ``and``, ``or`` or ``not`` to test a number of variables or @@ -537,15 +537,15 @@ The 'ifchanged' block tag is used within a loop. It has two possible uses. {% ifchanged %}

              {{ date|date:"F" }}

              {% endifchanged %} {{ date|date:"j" }} {% endfor %} - -2. If given a variable, check if that variable has changed. For example, the - following shows the date every time it changes, but only shows the hour if both - the hour and the date has changed:: - + +2. **New in Django development version.** If given a variable, check whether that + variable has changed. For example, the following shows the date every time it + changes, but only shows the hour if both the hour and the date has changed:: + {% for date in days %} - {% ifchanged date.date %} {{date.date}} {% endifchanged %} + {% ifchanged date.date %} {{ date.date }} {% endifchanged %} {% ifchanged date.hour date.date %} - {{date.hour}} + {{ date.hour }} {% endifchanged %} {% endfor %} @@ -571,7 +571,7 @@ The arguments can be hard-coded strings, so the following is valid:: It is only possible to compare an argument to template variables or strings. You cannot check for equality with Python objects such as ``True`` or ``False``. If you need to test if something is true or false, use the ``if`` -and ``ifnot`` tags instead. +tag instead. ifnotequal ~~~~~~~~~~ diff --git a/docs/templates_python.txt b/docs/templates_python.txt index ae2582d7b8..7aeed935b9 100644 --- a/docs/templates_python.txt +++ b/docs/templates_python.txt @@ -321,7 +321,7 @@ Note:: def some_view(request): # ... - return render_to_response('my_template'html', + return render_to_response('my_template.html', my_data_dictionary, context_instance=RequestContext(request)) diff --git a/docs/testing.txt b/docs/testing.txt index 19eef9f071..68eff07788 100644 --- a/docs/testing.txt +++ b/docs/testing.txt @@ -10,7 +10,7 @@ used to validate that code behaves as expected. When refactoring or modifying code, tests serve as a guide to ensure that behavior hasn't changed unexpectedly as a result of the refactor. -Testing an web application is a complex task, as there are many +Testing a web application is a complex task, as there are many components of a web application that must be validated and tested. To help you test your application, Django provides a test execution framework, and range of utilities that can be used to stimulate and diff --git a/tests/regressiontests/forms/tests.py b/tests/regressiontests/forms/tests.py index 5402f654e9..73fa3c27bf 100644 --- a/tests/regressiontests/forms/tests.py +++ b/tests/regressiontests/forms/tests.py @@ -1,4 +1,5 @@ -""" +# -*- coding: utf-8 -*- +r""" >>> from django.newforms import * >>> import datetime >>> import re @@ -17,6 +18,11 @@ u'' +# Note that doctest in Python 2.4 (and maybe 2.5?) doesn't support non-ascii +# characters in output, so we're displaying the repr() here. +>>> w.render('email', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'}) +u'' + You can also pass 'attrs' to the constructor: >>> w = TextInput(attrs={'class': 'fun'}) >>> w.render('email', '') @@ -55,6 +61,9 @@ u'' >>> w.render('email', '', attrs={'class': 'special'}) u'' +>>> w.render('email', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'}) +u'' + # HiddenInput Widget ############################################################ >>> w = HiddenInput() @@ -81,6 +90,14 @@ u'' >>> w.render('email', '', attrs={'class': 'special'}) u'' +>>> w.render('email', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'}) +u'' + +'attrs' passed to render() get precedence over those passed to the constructor: +>>> w = HiddenInput(attrs={'class': 'pretty'}) +>>> w.render('email', '', attrs={'class': 'special'}) +u'' + # FileInput Widget ############################################################ >>> w = FileInput() @@ -102,10 +119,8 @@ u'' >>> w.render('email', 'foo@example.com') u'' -'attrs' passed to render() get precedence over those passed to the constructor: ->>> w = HiddenInput(attrs={'class': 'pretty'}) ->>> w.render('email', '', attrs={'class': 'special'}) -u'' +>>> w.render('email', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'}) +u'' # Textarea Widget ############################################################# @@ -133,6 +148,9 @@ u'' >>> w.render('msg', '', attrs={'class': 'special'}) u'' +>>> w.render('msg', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'}) +u'' + # CheckboxInput Widget ######################################################## >>> w = CheckboxInput() @@ -236,6 +254,9 @@ If 'choices' is passed to both the constructor and render(), then they'll both b +>>> w.render('email', 'ŠĐĆŽćžšđ', choices=[('ŠĐĆŽćžšđ', 'ŠĐabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')]) +u'' + # SelectMultiple Widget ####################################################### >>> w = SelectMultiple() @@ -340,6 +361,120 @@ If 'choices' is passed to both the constructor and render(), then they'll both b +>>> w.render('nums', ['ŠĐĆŽćžšđ'], choices=[('ŠĐĆŽćžšđ', 'ŠĐabcĆŽćžšđ'), ('ćžšđ', 'abcćžšđ')]) +u'' + +# RadioSelect Widget ########################################################## + +>>> w = RadioSelect() +>>> print w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))) +
                +
              • +
              • +
              • +
              • +
              + +If the value is None, none of the options are checked: +>>> print w.render('beatle', None, choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))) +
                +
              • +
              • +
              • +
              • +
              + +If the value corresponds to a label (but not to an option value), none of the options are checked: +>>> print w.render('beatle', 'John', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))) +
                +
              • +
              • +
              • +
              • +
              + +The value is compared to its str(): +>>> print w.render('num', 2, choices=[('1', '1'), ('2', '2'), ('3', '3')]) +
                +
              • +
              • +
              • +
              +>>> print w.render('num', '2', choices=[(1, 1), (2, 2), (3, 3)]) +
                +
              • +
              • +
              • +
              +>>> print w.render('num', 2, choices=[(1, 1), (2, 2), (3, 3)]) +
                +
              • +
              • +
              • +
              + +The 'choices' argument can be any iterable: +>>> def get_choices(): +... for i in range(5): +... yield (i, i) +>>> print w.render('num', 2, choices=get_choices()) +
                +
              • +
              • +
              • +
              • +
              • +
              + +You can also pass 'choices' to the constructor: +>>> w = RadioSelect(choices=[(1, 1), (2, 2), (3, 3)]) +>>> print w.render('num', 2) +
                +
              • +
              • +
              • +
              + +If 'choices' is passed to both the constructor and render(), then they'll both be in the output: +>>> print w.render('num', 2, choices=[(4, 4), (5, 5)]) +
                +
              • +
              • +
              • +
              • +
              • +
              + +The render() method returns a RadioFieldRenderer object, whose str() is a
                . +You can manipulate that object directly to customize the way the RadioSelect +is rendered. +>>> w = RadioSelect() +>>> r = w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo'))) +>>> for inp in r: +... print inp + + + + +>>> for inp in r: +... print '%s
                ' % inp +
                +
                +
                +
                +>>> for inp in r: +... print '

                %s %s

                ' % (inp.tag(), inp.choice_label) +

                John

                +

                Paul

                +

                George

                +

                Ringo

                +>>> for inp in r: +... print '%s %s %s %s %s' % (inp.name, inp.value, inp.choice_value, inp.choice_label, inp.is_checked()) +beatle J J John True +beatle J P Paul False +beatle J G George False +beatle J R Ringo False + # CharField ################################################################### >>> f = CharField(required=False) @@ -770,38 +905,28 @@ ValidationError: [u'This field is required.'] ... birthday = DateField() >>> p = Person() >>> print p - -
                First name:
                Last name:
                Birthday:
                >>> print p.as_table() - -
                First name:
                Last name:
                Birthday:
                >>> print p.as_ul() -
                • First name:
                • Last name:
                • Birthday:
                • -
                >>> print p.as_table_with_errors() - -
                • This field is required.
                First name:
                • This field is required.
                Last name:
                • This field is required.
                Birthday:
                >>> print p.as_ul_with_errors() -
                  • This field is required.
                  First name:
                  • This field is required.
                  Last name:
                  • This field is required.
                  Birthday:
                • -
                >>> p = Person({'first_name': u'John', 'last_name': u'Lennon', 'birthday': u'1940-10-9'}) >>> p.errors() @@ -826,11 +951,9 @@ u'' >>> print p - -
                First name:
                Last name:
                Birthday:
                >>> p = Person({'last_name': u'Lennon'}) >>> p.errors() @@ -862,6 +985,51 @@ u'* This field is required.' >>> print p['birthday'] +"auto_id" tells the Form to add an "id" attribute to each form element. +If it's a string that contains '%s', Django will use that as a format string +into which the field's name will be inserted. +>>> p = Person(auto_id='id_%s') +>>> print p.as_ul() +
              • First name:
              • +
              • Last name:
              • +
              • Birthday:
              • + +If auto_id is any True value whose str() does not contain '%s', the "id" +attribute will be the name of the field. +>>> p = Person(auto_id=True) +>>> print p.as_ul() +
              • First name:
              • +
              • Last name:
              • +
              • Birthday:
              • + +If auto_id is any False value, an "id" attribute won't be output unless it +was manually entered. +>>> p = Person(auto_id=False) +>>> print p.as_ul() +
              • First name:
              • +
              • Last name:
              • +
              • Birthday:
              • + +In this example, auto_id is False, but the "id" attribute for the "first_name" +field is given. +>>> class PersonNew(Form): +... first_name = CharField(widget=TextInput(attrs={'id': 'first_name_id'})) +... last_name = CharField() +... birthday = DateField() +>>> p = PersonNew(auto_id=False) +>>> print p.as_ul() +
              • First name:
              • +
              • Last name:
              • +
              • Birthday:
              • + +If the "id" attribute is specified in the Form and auto_id is True, the "id" +attribute in the Form gets precedence. +>>> p = PersonNew(auto_id=True) +>>> print p.as_ul() +
              • First name:
              • +
              • Last name:
              • +
              • Birthday:
              • + >>> class SignupForm(Form): ... email = EmailField() ... get_spam = BooleanField() @@ -992,44 +1160,81 @@ Form.clean() still needs to return a dictionary of all clean data: ... return self.clean_data >>> f = UserRegistration() >>> print f.as_table() - -
                Username:
                Password1:
                Password2:
                >>> f.errors() {'username': [u'This field is required.'], 'password1': [u'This field is required.'], 'password2': [u'This field is required.']} >>> f = UserRegistration({'username': 'adrian', 'password1': 'foo', 'password2': 'bar'}) >>> f.errors() {'__all__': [u'Please make sure your passwords match.']} >>> print f.as_table() - -
                Username:
                Password1:
                Password2:
                >>> print f.as_table_with_errors() - -
                • Please make sure your passwords match.
                Username:
                Password1:
                Password2:
                >>> print f.as_ul_with_errors() -
                  • Please make sure your passwords match.
                • Username:
                • Password1:
                • Password2:
                • -
                >>> f = UserRegistration({'username': 'adrian', 'password1': 'foo', 'password2': 'foo'}) >>> f.errors() {} >>> f.clean() {'username': u'adrian', 'password1': u'foo', 'password2': u'foo'} +It's possible to construct a Form dynamically by adding to the self.fields +dictionary in __init__(). Don't forget to call Form.__init__() within the +subclass' __init__(). +>>> class Person(Form): +... first_name = CharField() +... last_name = CharField() +... def __init__(self): +... super(Person, self).__init__() +... self.fields['birthday'] = DateField() +>>> p = Person() +>>> print p +First name: +Last name: +Birthday: - +A Form's fields are displayed in the same order in which they were defined. +>>> class TestForm(Form): +... field1 = CharField() +... field2 = CharField() +... field3 = CharField() +... field4 = CharField() +... field5 = CharField() +... field6 = CharField() +... field7 = CharField() +... field8 = CharField() +... field9 = CharField() +... field10 = CharField() +... field11 = CharField() +... field12 = CharField() +... field13 = CharField() +... field14 = CharField() +>>> p = TestForm() +>>> print p +Field1: +Field2: +Field3: +Field4: +Field5: +Field6: +Field7: +Field8: +Field9: +Field10: +Field11: +Field12: +Field13: +Field14: """ if __name__ == "__main__":