diff options
author | Joseph Kocherhans <joseph@jkocherhans.com> | 2006-06-19 15:23:57 +0000 |
---|---|---|
committer | Joseph Kocherhans <joseph@jkocherhans.com> | 2006-06-19 15:23:57 +0000 |
commit | adf4b9311d5d64a2bdd58da50271c121ea22e397 (patch) | |
tree | a69b3b023595cf1ce67a14c4c1ecd3290d94088e | |
parent | e976ed1f7910fad03704f88853c5c5b36cbab134 (diff) | |
download | django-attic/multi-auth.tar.gz |
multi-auth: Merged to [3151]archive/attic/multi-authattic/multi-auth
git-svn-id: http://code.djangoproject.com/svn/django/branches/multi-auth@3152 bcc190cf-cafb-0310-a4f2-bffc1f526a37
101 files changed, 3290 insertions, 2216 deletions
@@ -71,6 +71,7 @@ answer newbie questions, and generally made Django that much better: Russell Keith-Magee <freakboy@iinet.net.au> Garth Kidd <http://www.deadlybloodyserious.com/> Sune Kirkeby <http://ibofobi.dk/> + Cameron Knight (ckknight) Bruce Kroeze <http://coderseye.com/> Joseph Kocherhans lakin.wecker@gmail.com diff --git a/django/conf/__init__.py b/django/conf/__init__.py index a4aaf46a76..d5477201d7 100644 --- a/django/conf/__init__.py +++ b/django/conf/__init__.py @@ -12,7 +12,7 @@ from django.conf import global_settings ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE" -class LazySettings: +class LazySettings(object): """ A lazy proxy for either global Django settings or a custom settings object. The user can manually configure settings prior to using them. Otherwise, @@ -67,7 +67,7 @@ class LazySettings: setattr(holder, name, value) self._target = holder -class Settings: +class Settings(object): def __init__(self, settings_module): # update this dict from global settings (but only for ALL_CAPS settings) for setting in dir(global_settings): @@ -112,7 +112,7 @@ class Settings: def get_all_members(self): return dir(self) -class UserSettingsHolder: +class UserSettingsHolder(object): """ Holder for user configured settings. """ diff --git a/django/conf/locale/fr/LC_MESSAGES/django.mo b/django/conf/locale/fr/LC_MESSAGES/django.mo Binary files differindex 38d7fab7bb..d678225f2f 100644 --- a/django/conf/locale/fr/LC_MESSAGES/django.mo +++ b/django/conf/locale/fr/LC_MESSAGES/django.mo diff --git a/django/conf/locale/fr/LC_MESSAGES/django.po b/django/conf/locale/fr/LC_MESSAGES/django.po index acb86bf6ff..7cc5070840 100644 --- a/django/conf/locale/fr/LC_MESSAGES/django.po +++ b/django/conf/locale/fr/LC_MESSAGES/django.po @@ -12,7 +12,7 @@ msgstr "" "Last-Translator: Gaël Chardon <gael.dev_at_nospam_4now.net>\n" "Language-Team: français <fr@li.org>\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #: contrib/comments/models.py:67 contrib/comments/models.py:166 @@ -2010,4 +2010,4 @@ msgstr "oui,non,peut-être" #~ msgstr "paquetages" #~ msgid "Messages" -#~ msgstr "Messages"
\ No newline at end of file +#~ msgstr "Messages" diff --git a/django/conf/locale/he/LC_MESSAGES/django.mo b/django/conf/locale/he/LC_MESSAGES/django.mo Binary files differindex e2101a527b..0f8b07e5bb 100644 --- a/django/conf/locale/he/LC_MESSAGES/django.mo +++ b/django/conf/locale/he/LC_MESSAGES/django.mo diff --git a/django/conf/locale/he/LC_MESSAGES/django.po b/django/conf/locale/he/LC_MESSAGES/django.po index 04a4df18ad..6e4df17521 100644 --- a/django/conf/locale/he/LC_MESSAGES/django.po +++ b/django/conf/locale/he/LC_MESSAGES/django.po @@ -7,13 +7,734 @@ msgid "" msgstr "" "Project-Id-Version: Django 0.95\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2006-05-16 10:14+0200\n" -"PO-Revision-Date: 2006-05-16 15:48+0300\n" +"POT-Creation-Date: 2006-06-15 12:42+0300\n" +"PO-Revision-Date: 2006-06-15 12:40+0300\n" "Last-Translator: Meir Kriheli <meir@mksoft.co.il>\n" "Language-Team: Hebrew\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit" +"Content-Transfer-Encoding: 8bit\n" + +#: template/defaultfilters.py:389 +msgid "yes,no,maybe" +msgstr "כן,לא,אולי" + +#: forms/__init__.py:346 db/models/fields/__init__.py:114 +#: db/models/fields/__init__.py:265 db/models/fields/__init__.py:545 +#: db/models/fields/__init__.py:556 +msgid "This field is required." +msgstr "יש להזין תוכן בשדה זה." + +#: forms/__init__.py:381 +#, python-format +msgid "Ensure your text is less than %s character." +msgid_plural "Ensure your text is less than %s characters." +msgstr[0] "נא לוודא שהטקסט שלך מכיל פחות מ %s תו." +msgstr[1] "נא לוודא שהטקסט שלך מכיל פחות מ %s תווים." + +#: forms/__init__.py:386 +msgid "Line breaks are not allowed here." +msgstr "מעברי שורה אסורים כאן." + +#: forms/__init__.py:485 forms/__init__.py:558 forms/__init__.py:597 +#, python-format +msgid "Select a valid choice; '%(data)s' is not in %(choices)s." +msgstr "יש לבחור אפשרות חוקית; '%(data)s' אינו בין %(choices)s." + +#: forms/__init__.py:659 core/validators.py:151 core/validators.py:376 +msgid "No file was submitted. Check the encoding type on the form." +msgstr "לא נשלח שום קובץ. נא לבדוק את סוג הקידוד של הטופס." + +#: forms/__init__.py:661 +msgid "The submitted file is empty." +msgstr "הקובץ שנשלח ריק." + +#: forms/__init__.py:717 +msgid "Enter a whole number between -32,768 and 32,767." +msgstr "חש להזין מספר שלם בין -32,768 ל- 32,767." + +#: forms/__init__.py:727 +msgid "Enter a positive number." +msgstr "יש להזין מספר חיובי." + +#: forms/__init__.py:737 +msgid "Enter a whole number between 0 and 32,767." +msgstr "יש להזין מספר שלם בין 0 ל- 32,767." + +#: utils/translation.py:363 +msgid "DATE_FORMAT" +msgstr "d.m.Y" + +#: utils/translation.py:364 +msgid "DATETIME_FORMAT" +msgstr "d.m.y H:i:s" + +#: utils/translation.py:365 +msgid "TIME_FORMAT" +msgstr "H:i:s" + +#: utils/translation.py:381 +msgid "YEAR_MONTH_FORMAT" +msgstr "d.m.Y" + +#: utils/translation.py:382 +msgid "MONTH_DAY_FORMAT" +msgstr "d.m.Y" + +#: utils/timesince.py:12 +msgid "year" +msgid_plural "years" +msgstr[0] "שנה" +msgstr[1] "שנים" + +#: utils/timesince.py:13 +msgid "month" +msgid_plural "months" +msgstr[0] "חודש" +msgstr[1] "חודשים" + +#: utils/timesince.py:14 +msgid "week" +msgid_plural "weeks" +msgstr[0] "שבוע" +msgstr[1] "שבועות" + +#: utils/timesince.py:15 +msgid "day" +msgid_plural "days" +msgstr[0] "יום" +msgstr[1] "ימים" + +#: utils/timesince.py:16 +msgid "hour" +msgid_plural "hours" +msgstr[0] "שעה" +msgstr[1] "שעות" + +#: utils/timesince.py:17 +msgid "minute" +msgid_plural "minutes" +msgstr[0] "דקה" +msgstr[1] "דקות" + +#: utils/dates.py:6 +msgid "Monday" +msgstr "שני" + +#: utils/dates.py:6 +msgid "Tuesday" +msgstr "שלישי" + +#: utils/dates.py:6 +msgid "Wednesday" +msgstr "רביעי" + +#: utils/dates.py:6 +msgid "Thursday" +msgstr "חמישי" + +#: utils/dates.py:6 +msgid "Friday" +msgstr "שישי" + +#: utils/dates.py:7 +msgid "Saturday" +msgstr "שבת" + +#: utils/dates.py:7 +msgid "Sunday" +msgstr "ראשון" + +#: utils/dates.py:14 +msgid "January" +msgstr "ינואר" + +#: utils/dates.py:14 +msgid "February" +msgstr "פברואר" + +#: utils/dates.py:14 utils/dates.py:27 +msgid "March" +msgstr "מרץ" + +#: utils/dates.py:14 utils/dates.py:27 +msgid "April" +msgstr "אפריל" + +#: utils/dates.py:14 utils/dates.py:27 +msgid "May" +msgstr "מאי" + +#: utils/dates.py:14 utils/dates.py:27 +msgid "June" +msgstr "יוני" + +#: utils/dates.py:15 utils/dates.py:27 +msgid "July" +msgstr "יולי" + +#: utils/dates.py:15 +msgid "August" +msgstr "אוגוסט" + +#: utils/dates.py:15 +msgid "September" +msgstr "ספטמבר" + +#: utils/dates.py:15 +msgid "October" +msgstr "אוקטובר" + +#: utils/dates.py:15 +msgid "November" +msgstr "נובמבר" + +#: utils/dates.py:16 +msgid "December" +msgstr "תצבר" + +#: utils/dates.py:19 +msgid "jan" +msgstr "יאנ" + +#: utils/dates.py:19 +msgid "feb" +msgstr "פבר" + +#: utils/dates.py:19 +msgid "mar" +msgstr "מרץ" + +#: utils/dates.py:19 +msgid "apr" +msgstr "אפר" + +#: utils/dates.py:19 +msgid "may" +msgstr "מאי" + +#: utils/dates.py:19 +msgid "jun" +msgstr "יונ" + +#: utils/dates.py:20 +msgid "jul" +msgstr "יול" + +#: utils/dates.py:20 +msgid "aug" +msgstr "אוג" + +#: utils/dates.py:20 +msgid "sep" +msgstr "ספט" + +#: utils/dates.py:20 +msgid "oct" +msgstr "אוק" + +#: utils/dates.py:20 +msgid "nov" +msgstr "נוב" + +#: utils/dates.py:20 +msgid "dec" +msgstr "דצמ" + +#: utils/dates.py:27 +msgid "Jan." +msgstr "יאנ'" + +#: utils/dates.py:27 +msgid "Feb." +msgstr "פבר'" + +#: utils/dates.py:28 +msgid "Aug." +msgstr "אוג'" + +#: utils/dates.py:28 +msgid "Sept." +msgstr "ספט'" + +#: utils/dates.py:28 +msgid "Oct." +msgstr "אוק'" + +#: utils/dates.py:28 +msgid "Nov." +msgstr "נוב'" + +#: utils/dates.py:28 +msgid "Dec." +msgstr "דצמ'" + +#: db/models/manipulators.py:302 +#, python-format +msgid "%(object)s with this %(type)s already exists for the given %(field)s." +msgstr "%(object)s עם %(type)s קיים כבר עבור %(field)s נתון." + +#: db/models/fields/__init__.py:40 +#, python-format +msgid "%(optname)s with this %(fieldname)s already exists." +msgstr "%(optname)s·עם·%(fieldname)s·זה קיימת כבר." + +#: db/models/fields/__init__.py:337 +msgid "This value must be an integer." +msgstr "ערך זה חייב להיות מספר שלם." + +#: db/models/fields/__init__.py:369 +msgid "This value must be either True or False." +msgstr "ערך זה חייב להיות אמת או שקר." + +#: db/models/fields/__init__.py:385 +msgid "This field cannot be null." +msgstr "שדה זה אינו יכול להכיל null." + +#: db/models/fields/__init__.py:471 core/validators.py:135 +msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format." +msgstr "יש להזין תאריך ושעה במבנה YYYY-MM-DD HH:MM." + +#: db/models/fields/__init__.py:565 +msgid "Enter a valid filename." +msgstr "יש להזין שם קובץ חוקי." + +#: db/models/fields/related.py:43 +#, python-format +msgid "Please enter a valid %s." +msgstr "יש להזין %s חוקי." + +#: db/models/fields/related.py:579 +msgid "Separate multiple IDs with commas." +msgstr "יש להפריד מזהים מרובים בפסיקים." + +#: db/models/fields/related.py:581 +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "החזק את \"Control\", או \"Command\" על מק, לחוץ כדי לבחור יותר מאחד." + +#: db/models/fields/related.py:625 +#, python-format +msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." +msgid_plural "" +"Please enter valid %(self)s IDs. The values %(value)r are invalid." +msgstr[0] "נא להזין זיהוי %(self)s חוקי. הערך %(value)r אינו חוקי." +msgstr[1] "" +"נא להזין זיהויי %(self)s חוקיים. הערכים %(value)r אינם חוקיים." + +#: core/validators.py:63 +msgid "This value must contain only letters, numbers and underscores." +msgstr "ערך זה חייב להכיל אותיות, ספרות וקווים תחתונים בלבד." + +#: core/validators.py:67 +msgid "" +"This value must contain only letters, numbers, underscores, dashes or " +"slashes." +msgstr "ערך זה חייב להכיל אותיות, ספרות, מקפים, קווים תחתונים ונטויים בלבד." + +#: core/validators.py:75 +msgid "Uppercase letters are not allowed here." +msgstr "אסור להשתמש באותיות גדולות." + +#: core/validators.py:79 +msgid "Lowercase letters are not allowed here." +msgstr "אסור להשתמש באותיות קטנות." + +#: core/validators.py:86 +msgid "Enter only digits separated by commas." +msgstr "יש להזין רק ספרות מופרדות בפסיקים." + +#: core/validators.py:98 +msgid "Enter valid e-mail addresses separated by commas." +msgstr "יש להזין רק כתובות דוא\"ל מופרדות בפסיקים." + +#: core/validators.py:102 +msgid "Please enter a valid IP address." +msgstr "נא להזין כתובת IP חוקית." + +#: core/validators.py:106 +msgid "Empty values are not allowed here." +msgstr "חובה להזין ערך בשדה זה." + +#: core/validators.py:110 +msgid "Non-numeric characters aren't allowed here." +msgstr "מותר להזין ספרות בלבד." + +#: core/validators.py:114 +msgid "This value can't be comprised solely of digits." +msgstr "ערך זה אינו יכול להכיל ספרות בלבד." + +#: core/validators.py:119 +msgid "Enter a whole number." +msgstr "נא להזין מספר שלם." + +#: core/validators.py:123 +msgid "Only alphabetical characters are allowed here." +msgstr "יש להזין כאן אותיות בלבד." + +#: core/validators.py:127 +msgid "Enter a valid date in YYYY-MM-DD format." +msgstr "יש להזין תאריך במבנה YYYY-MM-DD." + +#: core/validators.py:131 +msgid "Enter a valid time in HH:MM format." +msgstr "יש להזין שעה במבנה HH:MM." + +#: core/validators.py:139 +msgid "Enter a valid e-mail address." +msgstr "יש להזין כתובת דוא\"ל חוקית." + +#: core/validators.py:155 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "נא להעלות תמונה חוקית. הקובץ שהעלת אינו תמונה אומכיל תמונה מקולקלת." + +#: core/validators.py:162 +#, python-format +msgid "The URL %s does not point to a valid image." +msgstr "ה-URL %s אנו מצביע לתמונה חוקית." + +#: core/validators.py:166 +#, python-format +msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid." +msgstr "מספרי טלפון חייבים להיות במבנה XXX-XXX-XXXX. \"%s\" אינו חוקי." + +#: core/validators.py:174 +#, python-format +msgid "The URL %s does not point to a valid QuickTime video." +msgstr "ה-URL %s אינו מצביע לסרטון QuickTime חוקי." + +#: core/validators.py:178 +msgid "A valid URL is required." +msgstr "יש להזין URL חוקי." + +#: core/validators.py:192 +#, python-format +msgid "" +"Valid HTML is required. Specific errors are:\n" +"%s" +msgstr "" +"יש להזין HTML חוקי. שגיאות ספציפיות:\n" +"%s" + +#: core/validators.py:199 +#, python-format +msgid "Badly formed XML: %s" +msgstr "מבנה XML שגוי: %s" + +#: core/validators.py:209 +#, python-format +msgid "Invalid URL: %s" +msgstr "URL שגוי: %s" + +#: core/validators.py:213 core/validators.py:215 +#, python-format +msgid "The URL %s is a broken link." +msgstr "ה-URL %s הוא קישור שבור." + +#: core/validators.py:221 +msgid "Enter a valid U.S. state abbreviation." +msgstr "יש להזין קיצור חוקי למדינה בארה\"ב." + +#: core/validators.py:236 +#, python-format +msgid "Watch your mouth! The word %s is not allowed here." +msgid_plural "Watch your mouth! The words %s are not allowed here." +msgstr[0] "שמור על לשונך! המילה %s אסורה לשימוש כאן." +msgstr[1] "שמור על לשונך! המילים %s אסורות לשימוש כאן." + +#: core/validators.py:243 +#, python-format +msgid "This field must match the '%s' field." +msgstr "תוכן השדה חייב להיות זהה לשדה '%s'." + +#: core/validators.py:262 +msgid "Please enter something for at least one field." +msgstr "יש להזין תוכן בלפחות אחד מהשדות." + +#: core/validators.py:271 core/validators.py:282 +msgid "Please enter both fields or leave them both empty." +msgstr "יש להזין תוכן בשני השדות או להשאיר את שניהם ריקים." + +#: core/validators.py:289 +#, python-format +msgid "This field must be given if %(field)s is %(value)s" +msgstr "יש להזין מידע בשדה זה אם שדה %(field)s מכיל %(value)s" + +#: core/validators.py:301 +#, python-format +msgid "This field must be given if %(field)s is not %(value)s" +msgstr "יש להזין תוכן בשדה זה אם תוכן שדה %(field)s אינו %(value)s" + +#: core/validators.py:320 +msgid "Duplicate values are not allowed." +msgstr "לא ניתן להזין ערכים כפולים." + +#: core/validators.py:343 +#, python-format +msgid "This value must be a power of %s." +msgstr "ערך זה חייב להיות חזקה של %s." + +#: core/validators.py:354 +msgid "Please enter a valid decimal number." +msgstr "יש להזין מספר עשרוני חוקי." + +#: core/validators.py:356 +#, python-format +msgid "Please enter a valid decimal number with at most %s total digit." +msgid_plural "" +"Please enter a valid decimal number with at most %s total digits." +msgstr[0] "נא להזין מספר עשרוני חוקי עם %s ספרה לכל היותר." +msgstr[1] "" +"נא להזין מספר עשרוני חוקי עם %s ספרות לכל היותר." + +#: core/validators.py:359 +#, python-format +msgid "Please enter a valid decimal number with at most %s decimal place." +msgid_plural "" +"Please enter a valid decimal number with at most %s decimal places." +msgstr[0] "נא להזין מספר עשרוני חוקי עם %s ספרה אחרי הנקודה לכל היותר." +msgstr[1] "" +"נא להזין מספר עשרוני חוקי עם %s ספרות אחרי הנקודה לכל היותר." + +#: core/validators.py:369 +#, python-format +msgid "Make sure your uploaded file is at least %s bytes big." +msgstr "יש להעלות קובץ בגודל %s בתים לפחות." + +#: core/validators.py:370 +#, python-format +msgid "Make sure your uploaded file is at most %s bytes big." +msgstr "יש לוודא שהקובץ שהעלת הוא בגודל %s בתים לכל היותר." + +#: core/validators.py:387 +msgid "The format for this field is wrong." +msgstr "מבנה תוכן שדה זה שגוי." + +#: core/validators.py:402 +msgid "This field is invalid." +msgstr "שדה זה אינו חוקי." + +#: core/validators.py:438 +#, python-format +msgid "Could not retrieve anything from %s." +msgstr "לא ניתן לאחזר כלום מ %s." + +#: core/validators.py:441 +#, python-format +msgid "" +"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." +msgstr "ה-URL·%(url)s·החזיר כותרת·Content-Type·לא חוקית·'%(contenttype)s'." + +#: core/validators.py:474 +#, python-format +msgid "" +"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with " +"\"%(start)s\".)" +msgstr "נא לסגור את תג·%(tag)s·בשורה·%(line)s.·(השורה מתחילה ב·\"%(start)s\".)" + +#: core/validators.py:478 +#, python-format +msgid "" +"Some text starting on line %(line)s is not allowed in that context. (Line " +"starts with \"%(start)s\".)" +msgstr "" +"חלק מהטקסט בשורה·%(line)s·אסור בהקשר זה.·(השורה·מתחילה ב·\"%(start)s\".)" + +#: core/validators.py:483 +#, python-format +msgid "" +"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%" +"(start)s\".)" +msgstr "" +"\"%(attr)s\"·בשורה·%(line)s·אינה תכונה חוקית.·(השורה מתחילה ב·\"%(start)s\".)" + +#: core/validators.py:488 +#, python-format +msgid "" +"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%" +"(start)s\".)" +msgstr "" +"\"<%(tag)s>\"·בשורה·%(line)s·אינו תג חוקי.·(השורה מתחילה ב·\"%(start)s\".)" + +#: core/validators.py:492 +#, python-format +msgid "" +"A tag on line %(line)s is missing one or more required attributes. (Line " +"starts with \"%(start)s\".)" +msgstr "" +"לתג בשורה %(line)s חסרה תכונה אחת או יותר נדרשות. (השורה מתחילה ב-\"%" +"(start)s\".)" + +#: core/validators.py:497 +#, python-format +msgid "" +"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line " +"starts with \"%(start)s\".)" +msgstr "" +"לתכונה·\"%(attr)s\"·בשורה·%(line)s·יש ערך לא חוקי.·(השורה·מתחילה ב·\"%(start)" +"s\".)" + +#: conf/global_settings.py:37 +msgid "Bengali" +msgstr "בנגאלית - Bengali" + +#: conf/global_settings.py:38 +msgid "Czech" +msgstr "צ'כית - Czech" + +#: conf/global_settings.py:39 +msgid "Welsh" +msgstr "וולשית - Welsh" + +#: conf/global_settings.py:40 +msgid "Danish" +msgstr "דנית - Danish" + +#: conf/global_settings.py:41 +msgid "German" +msgstr "גרמנית - German" + +#: conf/global_settings.py:42 +msgid "Greek" +msgstr "יוונית - Greek" + +#: conf/global_settings.py:43 +msgid "English" +msgstr "אנגלית - English" + +#: conf/global_settings.py:44 +msgid "Spanish" +msgstr "ספרדית - Spanish" + +#: conf/global_settings.py:45 +msgid "Argentinean Spanish" +msgstr "ספרדית ארגנטינאית - Argentinean Spanish" + +#: conf/global_settings.py:46 +msgid "French" +msgstr "צרפתית - French" + +#: conf/global_settings.py:47 +msgid "Galician" +msgstr "גאליצית - Galician" + +#: conf/global_settings.py:48 +msgid "Hungarian" +msgstr "הונגרית (Hungarian)" + +#: conf/global_settings.py:49 +msgid "Hebrew" +msgstr "עברית - Hebrew" + +#: conf/global_settings.py:50 +msgid "Icelandic" +msgstr "איסלנדית - Icelandic" + +#: conf/global_settings.py:51 +msgid "Italian" +msgstr "איטלקית - Italian" + +#: conf/global_settings.py:52 +msgid "Japanese" +msgstr "יפנית - Japanese" + +#: conf/global_settings.py:53 +msgid "Dutch" +msgstr "הולנדית - Dutch" + +#: conf/global_settings.py:54 +msgid "Norwegian" +msgstr "נורווגית - Norwegian" + +#: conf/global_settings.py:55 +msgid "Brazilian" +msgstr "ברזילאית - Brazilian" + +#: conf/global_settings.py:56 +msgid "Romanian" +msgstr "רומנית - Romanian" + +#: conf/global_settings.py:57 +msgid "Russian" +msgstr "רוסית - Russian" + +#: conf/global_settings.py:58 +msgid "Slovak" +msgstr "סלובקית - Slovak" + +#: conf/global_settings.py:59 +msgid "Slovenian" +msgstr "סלובנית - Slovenian" + +#: conf/global_settings.py:60 +msgid "Serbian" +msgstr "סרבית - Serbian" + +#: conf/global_settings.py:61 +msgid "Swedish" +msgstr "שוודית - Swedish" + +#: conf/global_settings.py:62 +msgid "Ukrainian" +msgstr "אוקראינית - Ukrainian" + +#: conf/global_settings.py:63 +msgid "Simplified Chinese" +msgstr "סינית פשוטה - Simplified·Chinese" + +#: conf/global_settings.py:64 +msgid "Traditional Chinese" +msgstr "סינית מסורתית - Traditional·Chinese" + +#: contrib/sessions/models.py:35 +msgid "session key" +msgstr "מפתח התחברות (session key)" + +#: contrib/sessions/models.py:36 +msgid "session data" +msgstr "מידע התחברות (session data)" + +#: contrib/sessions/models.py:37 +msgid "expire date" +msgstr "תאריך פג תוקף" + +#: contrib/sessions/models.py:41 +msgid "session" +msgstr "התחברות" + +#: contrib/sessions/models.py:42 +msgid "sessions" +msgstr "התחברויות" + +#: contrib/sites/models.py:10 +msgid "domain name" +msgstr "שם מתחם" + +#: contrib/sites/models.py:11 +msgid "display name" +msgstr "שם לתצוגה" + +#: contrib/sites/models.py:15 +msgid "site" +msgstr "אתר" + +#: contrib/sites/models.py:16 +msgid "sites" +msgstr "אתרים" + +#: contrib/contenttypes/models.py:25 +msgid "python model class name" +msgstr "שם ה-class של מודל פייתון" + +#: contrib/contenttypes/models.py:28 +msgid "content type" +msgstr "סוג תוכן" + +#: contrib/contenttypes/models.py:29 +msgid "content types" +msgstr "סוגי תוכן" #: contrib/comments/models.py:67 contrib/comments/models.py:166 msgid "object ID" @@ -72,7 +793,7 @@ msgstr "תאריך/שעת הגשה" msgid "is public" msgstr "ציבורי" -#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289 +#: contrib/comments/models.py:85 contrib/admin/views/doc.py:292 msgid "IP address" msgstr "כתובת IP" @@ -196,17 +917,73 @@ msgstr "מחיקות מודרטור" msgid "Moderator deletion by %r" msgstr "מחיקת מודרציה ע\"י %r" -#: contrib/comments/views/karma.py:19 -msgid "Anonymous users cannot vote" -msgstr "משתמשים אנונימיים אינם יכולים להצביע" +#: contrib/comments/templates/comments/freeform.html:4 +msgid "Your name:" +msgstr "שמך:" -#: contrib/comments/views/karma.py:23 -msgid "Invalid comment ID" -msgstr "מזהה תגובה שגוי" +#: contrib/comments/templates/comments/freeform.html:5 +#: contrib/comments/templates/comments/form.html:27 +msgid "Comment:" +msgstr "תגובה:" -#: contrib/comments/views/karma.py:25 -msgid "No voting for yourself" -msgstr "לא ניתן להצביע לעצמך" +#: contrib/comments/templates/comments/freeform.html:9 +#: contrib/comments/templates/comments/form.html:32 +msgid "Preview comment" +msgstr "תצוגה מקדימה של התגובה" + +#: contrib/comments/templates/comments/form.html:6 +#: contrib/comments/templates/comments/form.html:8 +#: contrib/admin/templates/admin/login.html:17 +msgid "Username:" +msgstr "שם משתמש:" + +#: contrib/comments/templates/comments/form.html:6 +#: contrib/admin/templates/admin/login.html:20 +msgid "Password:" +msgstr "סיסמה:" + +#: contrib/comments/templates/comments/form.html:6 +msgid "Forgotten your password?" +msgstr "שכחת את סיסמתך ?" + +#: contrib/comments/templates/comments/form.html:8 +#: contrib/admin/templates/admin_doc/bookmarklets.html:4 +#: contrib/admin/templates/admin_doc/view_index.html:5 +#: contrib/admin/templates/admin_doc/template_filter_index.html:5 +#: contrib/admin/templates/admin_doc/template_detail.html:4 +#: contrib/admin/templates/admin_doc/missing_docutils.html:4 +#: contrib/admin/templates/admin_doc/model_detail.html:3 +#: contrib/admin/templates/admin_doc/template_tag_index.html:5 +#: contrib/admin/templates/admin_doc/model_index.html:5 +#: contrib/admin/templates/admin_doc/view_detail.html:4 +#: contrib/admin/templates/admin_doc/index.html:4 +#: contrib/admin/templates/admin/base.html:24 +#: contrib/admin/templates/admin/object_history.html:3 +#: contrib/admin/templates/admin/change_form.html:10 +#: contrib/admin/templates/admin/delete_confirmation.html:3 +#: contrib/admin/templates/admin/change_list.html:5 +#: contrib/admin/templates/registration/password_change_form.html:3 +#: contrib/admin/templates/registration/password_change_done.html:3 +msgid "Log out" +msgstr "יציאה" + +#: contrib/comments/templates/comments/form.html:12 +msgid "Ratings" +msgstr "דירוג" + +#: contrib/comments/templates/comments/form.html:12 +#: contrib/comments/templates/comments/form.html:23 +msgid "Required" +msgstr "נדרש" + +#: contrib/comments/templates/comments/form.html:12 +#: contrib/comments/templates/comments/form.html:23 +msgid "Optional" +msgstr "אופציונלי" + +#: contrib/comments/templates/comments/form.html:23 +msgid "Post a photo" +msgstr "שליחת תמונה" #: contrib/comments/views/comments.py:28 msgid "" @@ -220,16 +997,18 @@ msgid "" "comment:\n" "\n" "%(text)s" +msgid_plural "" "This comment was posted by a user who has posted fewer than %(count)s " "comments:\n" "\n" "%(text)s" -msgstr "" -"תגובה זו נשלחה ע\"י משתמש אשר שלח פחות מ %(count)s " +msgstr[0] "" +"התגובה נשלחה ע\"י משתמש אשר שלח פחות מ-%(count)s " "תגובה:\n" "\n" "%(text)s" -"תגובה זו נשלחה ע\"י משתמש אשר שלח פחות מ %(count)s " +msgstr[1] "" +"התגובה נשלחה ע\"י משתמש אשר שלח פחות מ-%(count)s " "תגובות:\n" "\n" "%(text)s" @@ -272,73 +1051,17 @@ msgstr "טופס התגובה הכיל פרמטר target לא חוקי -- מזה msgid "The comment form didn't provide either 'preview' or 'post'" msgstr "טופס התגובה לא הכיל 'preview' או 'post'" -#: contrib/comments/templates/comments/form.html:6 -#: contrib/comments/templates/comments/form.html:8 -#: contrib/admin/templates/admin/login.html:17 -msgid "Username:" -msgstr "שם משתמש:" - -#: contrib/comments/templates/comments/form.html:6 -#: contrib/admin/templates/admin/login.html:20 -msgid "Password:" -msgstr "סיסמה:" - -#: contrib/comments/templates/comments/form.html:6 -msgid "Forgotten your password?" -msgstr "שכחת את סיסמתך ?" - -#: contrib/comments/templates/comments/form.html:8 -#: contrib/admin/templates/admin/object_history.html:3 -#: contrib/admin/templates/admin/change_list.html:5 -#: contrib/admin/templates/admin/base.html:23 -#: contrib/admin/templates/admin/delete_confirmation.html:3 -#: contrib/admin/templates/admin/change_form.html:10 -#: contrib/admin/templates/registration/password_change_done.html:3 -#: contrib/admin/templates/registration/password_change_form.html:3 -#: contrib/admin/templates/admin_doc/bookmarklets.html:4 -#: contrib/admin/templates/admin_doc/view_detail.html:4 -#: contrib/admin/templates/admin_doc/template_tag_index.html:5 -#: contrib/admin/templates/admin_doc/template_detail.html:4 -#: contrib/admin/templates/admin_doc/template_filter_index.html:5 -#: contrib/admin/templates/admin_doc/missing_docutils.html:4 -#: contrib/admin/templates/admin_doc/view_index.html:5 -#: contrib/admin/templates/admin_doc/model_detail.html:3 -#: contrib/admin/templates/admin_doc/index.html:4 -#: contrib/admin/templates/admin_doc/model_index.html:5 -msgid "Log out" -msgstr "יציאה" - -#: contrib/comments/templates/comments/form.html:12 -msgid "Ratings" -msgstr "דירוג" - -#: contrib/comments/templates/comments/form.html:12 -#: contrib/comments/templates/comments/form.html:23 -msgid "Required" -msgstr "נדרש" - -#: contrib/comments/templates/comments/form.html:12 -#: contrib/comments/templates/comments/form.html:23 -msgid "Optional" -msgstr "אופציונלי" - -#: contrib/comments/templates/comments/form.html:23 -msgid "Post a photo" -msgstr "שליחת תמונה" - -#: contrib/comments/templates/comments/form.html:27 -#: contrib/comments/templates/comments/freeform.html:5 -msgid "Comment:" -msgstr "תגובה:" +#: contrib/comments/views/karma.py:19 +msgid "Anonymous users cannot vote" +msgstr "משתמשים אנונימיים אינם יכולים להצביע" -#: contrib/comments/templates/comments/form.html:32 -#: contrib/comments/templates/comments/freeform.html:9 -msgid "Preview comment" -msgstr "תצוגה מקדימה של התגובה" +#: contrib/comments/views/karma.py:23 +msgid "Invalid comment ID" +msgstr "מזהה תגובה שגוי" -#: contrib/comments/templates/comments/freeform.html:4 -msgid "Your name:" -msgstr "שמך:" +#: contrib/comments/views/karma.py:25 +msgid "No voting for yourself" +msgstr "לא ניתן להצביע לעצמך" #: contrib/admin/filterspecs.py:40 #, python-format @@ -414,260 +1137,188 @@ msgstr "רישום יומן" msgid "log entries" msgstr "רישומי יומן" -#: contrib/admin/templatetags/admin_list.py:228 +#: contrib/admin/templatetags/admin_list.py:230 msgid "All dates" msgstr "כל התאריכים" -#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36 -#: contrib/auth/forms.py:41 -msgid "" -"Please enter a correct username and password. Note that both fields are case-" -"sensitive." -msgstr "" -"נא להזין שם משתמש וסיסמה נכונים. בשני השדות גודל האותיות האנגליות משנה." - -#: contrib/admin/views/decorators.py:23 -#: contrib/admin/templates/admin/login.html:25 -msgid "Log in" -msgstr "כניסה" - -#: contrib/admin/views/decorators.py:61 -msgid "" -"Please log in again, because your session has expired. Don't worry: Your " -"submission has been saved." -msgstr "" -"נא להתחבר שוב, מאחר ופג תוקף ההתחברות הנוכחית. אל דאגה: המידעששלחת נשמר." - -#: contrib/admin/views/decorators.py:68 -msgid "" -"Looks like your browser isn't configured to accept cookies. Please enable " -"cookies, reload this page, and try again." -msgstr "" -"נראה שהדפדפן שלך אינו מוגדר לקבל עוגיות. נא לאפשר עוגיות,לטעון מחדש את הדף " -"ולנסות שוב." - -#: contrib/admin/views/decorators.py:82 -msgid "Usernames cannot contain the '@' character." -msgstr "שם משתמש אינו יכול להכיל את התו '@'." - -#: contrib/admin/views/decorators.py:84 -#, python-format -msgid "Your e-mail address is not your username. Try '%s' instead." -msgstr "כתובת הדוא\"ל שלך אינה שם המשתמש שלך. נסה/י '%s' במקום." - -#: contrib/admin/views/main.py:226 -msgid "Site administration" -msgstr "ניהול אתר" - -#: contrib/admin/views/main.py:260 -#, python-format -msgid "The %(name)s \"%(obj)s\" was added successfully." -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 "ניתן לערוך שוב מתחת" +#: contrib/admin/templates/widget/file.html:2 +msgid "Currently:" +msgstr "הנוכחי." -#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357 -#, python-format -msgid "You may add another %s below." -msgstr "ניתן להוסיף %s נוסף מתחת." +#: contrib/admin/templates/widget/file.html:3 +msgid "Change:" +msgstr "שינוי:" -#: contrib/admin/views/main.py:290 -#, python-format -msgid "Add %s" -msgstr "הוספת %s" +#: contrib/admin/templates/widget/date_time.html:3 +msgid "Date:" +msgstr "תאריך:" -#: contrib/admin/views/main.py:336 -#, python-format -msgid "Added %s." -msgstr "%s התווסף." +#: contrib/admin/templates/widget/date_time.html:4 +msgid "Time:" +msgstr "שעה:" -#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338 -#: contrib/admin/views/main.py:340 -msgid "and" -msgstr "ו" +#: contrib/admin/templates/admin_doc/bookmarklets.html:3 +#: contrib/admin/templates/admin/base.html:29 +#: contrib/admin/templates/admin/object_history.html:5 +#: contrib/admin/templates/admin/change_form.html:13 +#: contrib/admin/templates/admin/delete_confirmation.html:6 +#: contrib/admin/templates/admin/invalid_setup.html:4 +#: contrib/admin/templates/admin/500.html:4 +#: contrib/admin/templates/admin/change_list.html:6 +#: contrib/admin/templates/registration/password_change_form.html:4 +#: contrib/admin/templates/registration/password_change_done.html:4 +#: contrib/admin/templates/registration/logged_out.html:4 +#: contrib/admin/templates/registration/password_reset_done.html:4 +#: contrib/admin/templates/registration/password_reset_form.html:4 +msgid "Home" +msgstr "דף הבית" -#: contrib/admin/views/main.py:338 -#, python-format -msgid "Changed %s." -msgstr "%s שונה." +#: contrib/admin/templates/admin_doc/bookmarklets.html:3 +#: contrib/admin/templates/admin/base.html:24 +#: contrib/admin/templates/admin/object_history.html:3 +#: contrib/admin/templates/admin/change_form.html:10 +#: contrib/admin/templates/admin/delete_confirmation.html:3 +#: contrib/admin/templates/admin/change_list.html:5 +#: contrib/admin/templates/registration/password_change_form.html:3 +#: contrib/admin/templates/registration/password_change_done.html:3 +msgid "Documentation" +msgstr "תיעוד" -#: contrib/admin/views/main.py:340 -#, python-format -msgid "Deleted %s." -msgstr "%s נמחק." +#: contrib/admin/templates/admin_doc/bookmarklets.html:3 +msgid "Bookmarklets" +msgstr "ייסומניות" -#: contrib/admin/views/main.py:343 -msgid "No fields changed." -msgstr "אף שדה לא השתנה." +#: contrib/admin/templates/admin_doc/bookmarklets.html:4 +#: contrib/admin/templates/admin_doc/view_index.html:5 +#: contrib/admin/templates/admin_doc/template_filter_index.html:5 +#: contrib/admin/templates/admin_doc/template_detail.html:4 +#: contrib/admin/templates/admin_doc/missing_docutils.html:4 +#: contrib/admin/templates/admin_doc/model_detail.html:3 +#: contrib/admin/templates/admin_doc/template_tag_index.html:5 +#: contrib/admin/templates/admin_doc/model_index.html:5 +#: contrib/admin/templates/admin_doc/view_detail.html:4 +#: contrib/admin/templates/admin_doc/index.html:4 +#: contrib/admin/templates/admin/base.html:24 +#: contrib/admin/templates/admin/object_history.html:3 +#: contrib/admin/templates/admin/change_form.html:10 +#: contrib/admin/templates/admin/delete_confirmation.html:3 +#: contrib/admin/templates/admin/change_list.html:5 +#: contrib/admin/templates/registration/password_change_form.html:3 +#: contrib/admin/templates/registration/password_change_done.html:3 +msgid "Change password" +msgstr "שינוי סיסמה" -#: contrib/admin/views/main.py:346 -#, python-format -msgid "The %(name)s \"%(obj)s\" was changed successfully." -msgstr "שינוי %(name)s \"%(obj)s\" בוצע בהצלחה." +#: contrib/admin/templates/admin_doc/bookmarklets.html:5 +msgid "Documentation bookmarklets" +msgstr "ייסומוניות תיעוד" -#: contrib/admin/views/main.py:354 -#, python-format +#: contrib/admin/templates/admin_doc/bookmarklets.html:9 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 "שינוי %s" - -#: contrib/admin/views/main.py:470 -#, python-format -msgid "One or more %(fieldname)s in %(name)s: %(obj)s" -msgstr "אחד או יותר %(fieldname)s ב%(name)s: %(obj)s" - -#: contrib/admin/views/main.py:475 -#, python-format -msgid "One or more %(fieldname)s in %(name)s:" -msgstr "אחד או יותר %(fieldname)s ב%(name)s:" - -#: contrib/admin/views/main.py:508 -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "מחיקת %(name)s \"%(obj)s\" בוצעה בהצלחה." - -#: contrib/admin/views/main.py:511 -msgid "Are you sure?" -msgstr "האם את/ה בטוח/ה ?" - -#: contrib/admin/views/main.py:533 -#, python-format -msgid "Change history: %s" -msgstr "היסטוריית שינוי: %s" - -#: contrib/admin/views/main.py:565 -#, python-format -msgid "Select %s" -msgstr "בחר/י %s" - -#: contrib/admin/views/main.py:565 -#, python-format -msgid "Select %s to change" -msgstr "בחר/י %s לשינוי" +"\n" +"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n" +"toolbar, or right-click the link and add it to your bookmarks. Now you can\n" +"select the bookmarklet from any page in the site. Note that some of these\n" +"bookmarklets require you to be viewing the site from a computer designated\n" +"as \"internal\" (talk to your system administrator if you aren't sure if\n" +"your computer is \"internal\").</p>\n" +msgstr "" +"\n" +"<p class=\"help\">כדי להתקין ייסומניות, יש לגרור את הקישור לסרגל הסימניות\n" +"שלך, או קליק ימני והוספה לסימניות. כעת ניתן\n" +"לבחור את הייסומניה מכל עמוד באתר. יש לשים לב כי חלק מהייסומניות\n" +"ניתנות לצפיה רק ממחשב שמסווג\n" +"כ\"פנימי\" (יש לדבר עם מנהל המערכת שלך אם אינך בטוח/ה\n" +"שהמחשב מסווג ככזה).</p>\n" -#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286 -#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294 -#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297 -msgid "Integer" -msgstr "מספר שלם" +#: contrib/admin/templates/admin_doc/bookmarklets.html:19 +msgid "Documentation for this page" +msgstr "תיעוד לדף זה" -#: contrib/admin/views/doc.py:278 -msgid "Boolean (Either True or False)" -msgstr "בוליאני (אמת או שקר)" +#: contrib/admin/templates/admin_doc/bookmarklets.html:20 +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "מקפיץ אותך מכל עמוד לתיעוד התצוגה שייצרה אותו." -#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296 -#, python-format -msgid "String (up to %(maxlength)s)" -msgstr "מחרוזת (עד %(maxlength)s תווים)" +#: contrib/admin/templates/admin_doc/bookmarklets.html:22 +msgid "Show object ID" +msgstr "הצג מזהה אובייקט" -#: contrib/admin/views/doc.py:280 -msgid "Comma-separated integers" -msgstr "מספרים שלמים מופרדים בפסיקים" +#: contrib/admin/templates/admin_doc/bookmarklets.html:23 +msgid "" +"Shows the content-type and unique ID for pages that represent a single " +"object." +msgstr "מציג את סוג התוכן והמזהה הייחודי לעמודים המייצגים אובייקט בודד." -#: contrib/admin/views/doc.py:281 -msgid "Date (without time)" -msgstr "תאריך (ללא שעה)" +#: contrib/admin/templates/admin_doc/bookmarklets.html:25 +msgid "Edit this object (current window)" +msgstr "עריכת אובייקט זה (בחלון הנוכחי)" -#: contrib/admin/views/doc.py:282 -msgid "Date (with time)" -msgstr "תאריך (כולל שעה)" +#: contrib/admin/templates/admin_doc/bookmarklets.html:26 +msgid "Jumps to the admin page for pages that represent a single object." +msgstr "קופץ לעמוד הניהול לעמודים אשר מייצגים אובייקטים בודד." -#: contrib/admin/views/doc.py:283 -msgid "E-mail address" -msgstr "כתובת דוא\"ל" +#: contrib/admin/templates/admin_doc/bookmarklets.html:28 +msgid "Edit this object (new window)" +msgstr "עריכת אובייקט זה (בחלון חדש)" -#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287 -msgid "File path" -msgstr "נתיב קובץ" +#: contrib/admin/templates/admin_doc/bookmarklets.html:29 +msgid "As above, but opens the admin page in a new window." +msgstr "כנ\"ל, אך דף הניהול ייפתח בחלון חדש." -#: contrib/admin/views/doc.py:285 -msgid "Decimal number" -msgstr "מספר עשרוני" +#: contrib/admin/templates/admin/login.html:22 +msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?" +msgstr "האם <a href=\"/password_reset/\">שכחת את הסיסמה שלך</a>?" -#: contrib/admin/views/doc.py:291 -msgid "Boolean (Either True, False or None)" -msgstr "בוליאני (אמת, שקר או כלום)" +#: contrib/admin/templates/admin/login.html:25 +#: contrib/admin/views/decorators.py:23 +msgid "Log in" +msgstr "כניסה" -#: contrib/admin/views/doc.py:292 -msgid "Relation to parent model" -msgstr "יחס למודל אב" +#: contrib/admin/templates/admin/submit_line.html:3 +#: contrib/admin/templates/admin/delete_confirmation.html:9 +msgid "Delete" +msgstr "מחיקה" -#: contrib/admin/views/doc.py:293 -msgid "Phone number" -msgstr "מספר טלפון" +#: contrib/admin/templates/admin/submit_line.html:4 +msgid "Save as new" +msgstr "שמירה כחדש" -#: contrib/admin/views/doc.py:298 -msgid "Text" -msgstr "טקסט" +#: contrib/admin/templates/admin/submit_line.html:5 +msgid "Save and add another" +msgstr "שמירה והוספת אחר" -#: contrib/admin/views/doc.py:299 -msgid "Time" -msgstr "זמן" +#: contrib/admin/templates/admin/submit_line.html:6 +msgid "Save and continue editing" +msgstr "שמירה והמשך עריכה" -#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7 -msgid "URL" -msgstr "URL" +#: contrib/admin/templates/admin/submit_line.html:7 +msgid "Save" +msgstr "שמירה" -#: contrib/admin/views/doc.py:301 -msgid "U.S. state (two uppercase letters)" -msgstr "מדינה בארה\"ב (שתי אותיות גדולות)" +#: contrib/admin/templates/admin/base.html:24 +msgid "Welcome," +msgstr "שלום" -#: contrib/admin/views/doc.py:302 -msgid "XML text" -msgstr "טקסט XML" +#: contrib/admin/templates/admin/filters.html:4 +msgid "Filter" +msgstr "סינון" -#: contrib/admin/templates/admin/object_history.html:3 -#: contrib/admin/templates/admin/change_list.html:5 -#: contrib/admin/templates/admin/base.html:23 -#: contrib/admin/templates/admin/delete_confirmation.html:3 -#: contrib/admin/templates/admin/change_form.html:10 -#: contrib/admin/templates/registration/password_change_done.html:3 -#: contrib/admin/templates/registration/password_change_form.html:3 -#: contrib/admin/templates/admin_doc/bookmarklets.html:3 -msgid "Documentation" -msgstr "תיעוד" +#: contrib/admin/templates/admin/search_form.html:8 +msgid "Go" +msgstr "בצע" -#: contrib/admin/templates/admin/object_history.html:3 -#: contrib/admin/templates/admin/change_list.html:5 -#: contrib/admin/templates/admin/base.html:23 -#: contrib/admin/templates/admin/delete_confirmation.html:3 -#: contrib/admin/templates/admin/change_form.html:10 -#: contrib/admin/templates/registration/password_change_done.html:3 -#: contrib/admin/templates/registration/password_change_form.html:3 -#: contrib/admin/templates/admin_doc/bookmarklets.html:4 -#: contrib/admin/templates/admin_doc/view_detail.html:4 -#: contrib/admin/templates/admin_doc/template_tag_index.html:5 -#: contrib/admin/templates/admin_doc/template_detail.html:4 -#: contrib/admin/templates/admin_doc/template_filter_index.html:5 -#: contrib/admin/templates/admin_doc/missing_docutils.html:4 -#: contrib/admin/templates/admin_doc/view_index.html:5 -#: contrib/admin/templates/admin_doc/model_detail.html:3 -#: contrib/admin/templates/admin_doc/index.html:4 -#: contrib/admin/templates/admin_doc/model_index.html:5 -msgid "Change password" -msgstr "שינוי סיסמה" +#: contrib/admin/templates/admin/search_form.html:10 +#, python-format +msgid "1 result" +msgid_plural "%(counter)s results" +msgstr[0] "תוצאה אחת" +msgstr[1] "%(counter)s תוצאות" -#: contrib/admin/templates/admin/object_history.html:5 -#: contrib/admin/templates/admin/500.html:4 -#: contrib/admin/templates/admin/change_list.html:6 -#: contrib/admin/templates/admin/base.html:28 -#: contrib/admin/templates/admin/delete_confirmation.html:6 -#: contrib/admin/templates/admin/change_form.html:13 -#: contrib/admin/templates/registration/password_change_done.html:4 -#: contrib/admin/templates/registration/password_reset_form.html:4 -#: contrib/admin/templates/registration/logged_out.html:4 -#: contrib/admin/templates/registration/password_reset_done.html:4 -#: contrib/admin/templates/registration/password_change_form.html:4 -#: contrib/admin/templates/admin_doc/bookmarklets.html:3 -msgid "Home" -msgstr "דף הבית" +#: contrib/admin/templates/admin/search_form.html:10 +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)s סה\"כ" #: contrib/admin/templates/admin/object_history.html:5 #: contrib/admin/templates/admin/change_form.html:20 @@ -694,7 +1345,31 @@ msgstr "l d.m.y H:i:s" msgid "" "This object doesn't have a change history. It probably wasn't added via this " "admin site." -msgstr "לאובייקט זה אין היסטוריית שינוי. כנראה לא השתמשו בממשק הניהול להוספתו." +msgstr "" +"לאובייקט זה אין היסטוריית שינוי. כנראה לא השתמשו בממשק הניהול הזה להוספתו." + +#: contrib/admin/templates/admin/change_form.html:15 +#: contrib/admin/templates/admin/index.html:28 +msgid "Add" +msgstr "הוספה" + +#: contrib/admin/templates/admin/change_form.html:21 +msgid "View on site" +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] "נא לתקן את השגיאות המופיעות מתחת." + +#: contrib/admin/templates/admin/change_form.html:48 +msgid "Ordering" +msgstr "מיון" + +#: contrib/admin/templates/admin/change_form.html:51 +msgid "Order:" +msgstr "מיון:" #: contrib/admin/templates/admin/base_site.html:4 msgid "Django site admin" @@ -704,24 +1379,9 @@ msgstr "ניהול אתר Django" msgid "Django administration" msgstr "ניהול Django" -#: contrib/admin/templates/admin/500.html:4 -msgid "Server error" -msgstr "שגיאת שרת" - -#: contrib/admin/templates/admin/500.html:6 -msgid "Server error (500)" -msgstr "שגיאת שרת (500)" - -#: contrib/admin/templates/admin/500.html:9 -msgid "Server Error <em>(500)</em>" -msgstr "שגיאת שרת <em>(500)</em>" - -#: contrib/admin/templates/admin/500.html:10 -msgid "" -"There's been an error. It's been reported to the site administrators via e-" -"mail and should be fixed shortly. Thanks for your patience." -msgstr "" -"התרחשה שגיאה. היא דווחה למנהלי האתר בדוא\"ל ותתוקן בקרוב. תודה על סבלנותך." +#: contrib/admin/templates/admin/pagination.html:10 +msgid "Show all" +msgstr "הצג הכל" #: contrib/admin/templates/admin/404.html:4 #: contrib/admin/templates/admin/404.html:8 @@ -732,16 +1392,48 @@ msgstr "דף לא קיים" msgid "We're sorry, but the requested page could not be found." msgstr "אנו מצטערים, לא ניתן למצוא את הדף המבוקש." +#: contrib/admin/templates/admin/filter.html:2 +#, python-format +msgid " By %(title)s " +msgstr " לפי %(title)s " + +#: contrib/admin/templates/admin/delete_confirmation.html:14 +#, python-format +msgid "" +"Deleting the %(object_name)s '%(object)s' would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"מחיקת %(object_name)s '%(object)s' תמחק אובייקטים קשורים, אך לחשבון שלך אין " +"הרשאות למחיקת אובייקטים מהסוג הבא:" + +#: contrib/admin/templates/admin/delete_confirmation.html:21 +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of " +"the following related items will be deleted:" +msgstr "" +"האם ברצונך למחוק את %(object_name)s·\"%(object)s\"? כלהפריטים הקשורים הבאים " +"יימחקו:" + +#: contrib/admin/templates/admin/delete_confirmation.html:26 +msgid "Yes, I'm sure" +msgstr "כן, אני בטוח/ה" + +#: contrib/admin/templates/admin/invalid_setup.html:8 +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"משהו שגוי בהתקנת בסיס הנתונים שלך. נא לוודא שנוצרו טבלאות בסיס הנתונים " +"המתאימות, ובסיס הנתונים ניתן לקריאה על ידי המשתמש המתאים." + #: contrib/admin/templates/admin/index.html:17 #, python-format msgid "Models available in the %(name)s application." msgstr "מודלים זמינים ביישום %(name)s." -#: contrib/admin/templates/admin/index.html:28 -#: contrib/admin/templates/admin/change_form.html:15 -msgid "Add" -msgstr "הוספה" - #: contrib/admin/templates/admin/index.html:34 msgid "Change" msgstr "שינוי" @@ -762,95 +1454,92 @@ msgstr "הפעולות שלי" msgid "None available" msgstr "לא נמצאו" -#: contrib/admin/templates/admin/change_list.html:11 -#, python-format -msgid "Add %(name)s" -msgstr "הוספת %(name)s" - -#: contrib/admin/templates/admin/login.html:22 -msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?" -msgstr "האם <a href=\"/password_reset/\">שכחת את הסיסמה שלך</a>?" +#: contrib/admin/templates/admin/500.html:4 +msgid "Server error" +msgstr "שגיאת שרת" -#: contrib/admin/templates/admin/base.html:23 -msgid "Welcome," -msgstr "שלום" +#: contrib/admin/templates/admin/500.html:6 +msgid "Server error (500)" +msgstr "שגיאת שרת (500)" -#: contrib/admin/templates/admin/delete_confirmation.html:9 -#: contrib/admin/templates/admin/submit_line.html:3 -msgid "Delete" -msgstr "מחיקה" +#: contrib/admin/templates/admin/500.html:9 +msgid "Server Error <em>(500)</em>" +msgstr "שגיאת שרת <em>(500)</em>" -#: contrib/admin/templates/admin/delete_confirmation.html:14 -#, python-format +#: contrib/admin/templates/admin/500.html:10 msgid "" -"Deleting the %(object_name)s '%(object)s' would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" +"There's been an error. It's been reported to the site administrators via e-" +"mail and should be fixed shortly. Thanks for your patience." msgstr "" -"מחיקת %(object_name)s·'%(object)s'·תמחק אובייקטים קשורים,אך לחשבון שלך אין " -"הרשאות למחיקת אובייקטים מהסוג הבא:" +"התרחשה שגיאה. היא דווחה למנהלי האתר בדוא\"ל ותתוקן בקרוב. תודה על סבלנותך." -#: contrib/admin/templates/admin/delete_confirmation.html:21 +#: contrib/admin/templates/admin/change_list.html:11 #, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of " -"the following related items will be deleted:" -msgstr "" -"האם ברצונך למחוק את %(object_name)s·\"%(object)s\"? כלהפריטים הקשורים הבאים " -"יימחקו:" +msgid "Add %(name)s" +msgstr "הוספת %(name)s" -#: contrib/admin/templates/admin/delete_confirmation.html:26 -msgid "Yes, I'm sure" -msgstr "כן, אני בטוח/ה" +#: contrib/admin/templates/registration/password_reset_email.html:2 +msgid "You're receiving this e-mail because you requested a password reset" +msgstr "הודעה זו התקבלה כי ביקשת איפוס סיסמה" -#: contrib/admin/templates/admin/filter.html:2 +#: contrib/admin/templates/registration/password_reset_email.html:3 #, python-format -msgid " By %(title)s " -msgstr " לפי %(title)s " - -#: contrib/admin/templates/admin/search_form.html:8 -msgid "Go" -msgstr "בצע" - -#: contrib/admin/templates/admin/change_form.html:21 -msgid "View on site" -msgstr "צפיה באתר" - -#: contrib/admin/templates/admin/change_form.html:30 -msgid "Please correct the error below." -msgstr "נא לתקן את השגיאה המופיעה מתחת." - -#: contrib/admin/templates/admin/change_form.html:48 -msgid "Ordering" -msgstr "סידור" +msgid "for your user account at %(site_name)s" +msgstr "עבור חשבון המשתמש שלך ב %(site_name)s" -#: contrib/admin/templates/admin/change_form.html:51 -msgid "Order:" -msgstr "סדר:" +#: contrib/admin/templates/registration/password_reset_email.html:5 +#, python-format +msgid "Your new password is: %(new_password)s" +msgstr "סיסמתך החדשה: %(new_password)s" -#: contrib/admin/templates/admin/submit_line.html:4 -msgid "Save as new" -msgstr "שמירה כחדש" +#: contrib/admin/templates/registration/password_reset_email.html:7 +msgid "Feel free to change this password by going to this page:" +msgstr "ניתן לשנות את הסיסמה בכל עת ע\"י פניה לדף זה:" -#: contrib/admin/templates/admin/submit_line.html:5 -msgid "Save and add another" -msgstr "שמירה והוספת אחר" +#: contrib/admin/templates/registration/password_reset_email.html:11 +msgid "Your username, in case you've forgotten:" +msgstr "שם המשתמש שלך, במקרה ששכחת:" -#: contrib/admin/templates/admin/submit_line.html:6 -msgid "Save and continue editing" -msgstr "שמירה והמשך עריכה" +#: contrib/admin/templates/registration/password_reset_email.html:13 +msgid "Thanks for using our site!" +msgstr "תודה על השימוש באתר שלנו!" -#: contrib/admin/templates/admin/submit_line.html:7 -msgid "Save" -msgstr "שמירה" +#: contrib/admin/templates/registration/password_reset_email.html:15 +#, python-format +msgid "The %(site_name)s team" +msgstr "צוות %(site_name)s" -#: contrib/admin/templates/registration/password_change_done.html:4 #: contrib/admin/templates/registration/password_change_form.html:4 #: contrib/admin/templates/registration/password_change_form.html:6 #: contrib/admin/templates/registration/password_change_form.html:10 +#: contrib/admin/templates/registration/password_change_done.html:4 msgid "Password change" msgstr "שינוי סיסמה" +#: contrib/admin/templates/registration/password_change_form.html:12 +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"נא להזין את סיסמתך הישנה, למען האבטחה, ולאחר מכן את סיסמתךהחדשה פעמיים כדי " +"שנוכל לוודא שהקלדת אותה כראוי." + +#: contrib/admin/templates/registration/password_change_form.html:17 +msgid "Old password:" +msgstr "סיסמה ישנה:" + +#: contrib/admin/templates/registration/password_change_form.html:19 +msgid "New password:" +msgstr "סיסמה חדשה:" + +#: contrib/admin/templates/registration/password_change_form.html:21 +msgid "Confirm password:" +msgstr "אימות סיסמה:" + +#: contrib/admin/templates/registration/password_change_form.html:23 +msgid "Change my password" +msgstr "שנה את סיסמתי" + #: contrib/admin/templates/registration/password_change_done.html:6 #: contrib/admin/templates/registration/password_change_done.html:10 msgid "Password change successful" @@ -860,13 +1549,33 @@ msgstr "הסיסמה שונתה בהצלחה" msgid "Your password was changed." msgstr "סיסמתך שונתה." +#: contrib/admin/templates/registration/logged_out.html:8 +msgid "Thanks for spending some quality time with the Web site today." +msgstr "תודה על בילוי זמן איכות עם האתר." + +#: contrib/admin/templates/registration/logged_out.html:10 +msgid "Log in again" +msgstr "התחבר/י שוב" + +#: contrib/admin/templates/registration/password_reset_done.html:4 #: contrib/admin/templates/registration/password_reset_form.html:4 #: contrib/admin/templates/registration/password_reset_form.html:6 #: contrib/admin/templates/registration/password_reset_form.html:10 -#: contrib/admin/templates/registration/password_reset_done.html:4 msgid "Password reset" msgstr "איפוס סיסמה" +#: contrib/admin/templates/registration/password_reset_done.html:6 +#: contrib/admin/templates/registration/password_reset_done.html:10 +msgid "Password reset successful" +msgstr "הסיסמה אופסה בהצלחה" + +#: contrib/admin/templates/registration/password_reset_done.html:12 +msgid "" +"We've e-mailed a new password to the e-mail address you submitted. You " +"should be receiving it shortly." +msgstr "" +"שלחנו את הסיסמה החדשה לכתובת הדוא\"ל שהזנת. היא אמורה להתקבל תוך זמן קצר." + #: contrib/admin/templates/registration/password_reset_form.html:12 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll reset " @@ -883,158 +1592,210 @@ msgstr "כתובת דוא\"ל:" msgid "Reset my password" msgstr "אפס את סיסמתי" -#: contrib/admin/templates/registration/logged_out.html:8 -msgid "Thanks for spending some quality time with the Web site today." -msgstr "תודה על בילוי זמן איכות עם האתר." +#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:289 +#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:297 +#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:300 +msgid "Integer" +msgstr "מספר שלם" -#: contrib/admin/templates/registration/logged_out.html:10 -msgid "Log in again" -msgstr "התחבר/י שוב" +#: contrib/admin/views/doc.py:280 +msgid "Boolean (Either True or False)" +msgstr "בוליאני (אמת או שקר)" -#: contrib/admin/templates/registration/password_reset_done.html:6 -#: contrib/admin/templates/registration/password_reset_done.html:10 -msgid "Password reset successful" -msgstr "הסיסמה אופסה בהצלחה" +#: contrib/admin/views/doc.py:281 contrib/admin/views/doc.py:299 +#, python-format +msgid "String (up to %(maxlength)s)" +msgstr "מחרוזת (עד %(maxlength)s תווים)" -#: contrib/admin/templates/registration/password_reset_done.html:12 -msgid "" -"We've e-mailed a new password to the e-mail address you submitted. You " -"should be receiving it shortly." -msgstr "" -"שלחנו את הסיסמה החדשה לכתובת הדוא\"ל שהזנת. היא אמורה להתקבלתוך זמן קצר." +#: contrib/admin/views/doc.py:282 +msgid "Comma-separated integers" +msgstr "מספרים שלמים מופרדים בפסיקים" -#: contrib/admin/templates/registration/password_change_form.html:12 -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"נא להזין את סיסמתך הישנה, למען האבטחה, ולאחר מכן את סיסמתךהחדשה פעמיים כדי " -"שנוכל לוודא שהקלדת אותה כראוי." +#: contrib/admin/views/doc.py:283 +msgid "Date (without time)" +msgstr "תאריך (ללא שעה)" -#: contrib/admin/templates/registration/password_change_form.html:17 -msgid "Old password:" -msgstr "סיסמה ישנה:" +#: contrib/admin/views/doc.py:284 +msgid "Date (with time)" +msgstr "תאריך (כולל שעה)" -#: contrib/admin/templates/registration/password_change_form.html:19 -msgid "New password:" -msgstr "סיסמה חדשה:" +#: contrib/admin/views/doc.py:285 +msgid "E-mail address" +msgstr "כתובת דוא\"ל" -#: contrib/admin/templates/registration/password_change_form.html:21 -msgid "Confirm password:" -msgstr "אימות סיסמה:" +#: contrib/admin/views/doc.py:286 contrib/admin/views/doc.py:287 +#: contrib/admin/views/doc.py:290 +msgid "File path" +msgstr "נתיב קובץ" -#: contrib/admin/templates/registration/password_change_form.html:23 -msgid "Change my password" -msgstr "שנה את סיסמתי" +#: contrib/admin/views/doc.py:288 +msgid "Decimal number" +msgstr "מספר עשרוני" -#: contrib/admin/templates/registration/password_reset_email.html:2 -msgid "You're receiving this e-mail because you requested a password reset" -msgstr "הודעה זו התקבלה כי ביקשת איפוס סיסמה" +#: contrib/admin/views/doc.py:294 +msgid "Boolean (Either True, False or None)" +msgstr "בוליאני (אמת, שקר או כלום)" -#: contrib/admin/templates/registration/password_reset_email.html:3 +#: contrib/admin/views/doc.py:295 +msgid "Relation to parent model" +msgstr "יחס למודל אב" + +#: contrib/admin/views/doc.py:296 +msgid "Phone number" +msgstr "מספר טלפון" + +#: contrib/admin/views/doc.py:301 +msgid "Text" +msgstr "טקסט" + +#: contrib/admin/views/doc.py:302 +msgid "Time" +msgstr "זמן" + +#: contrib/admin/views/doc.py:303 contrib/flatpages/models.py:7 +msgid "URL" +msgstr "URL" + +#: contrib/admin/views/doc.py:304 +msgid "U.S. state (two uppercase letters)" +msgstr "מדינה בארה\"ב (שתי אותיות גדולות)" + +#: contrib/admin/views/doc.py:305 +msgid "XML text" +msgstr "טקסט XML" + +#: contrib/admin/views/main.py:226 +msgid "Site administration" +msgstr "ניהול אתר" + +#: contrib/admin/views/main.py:260 #, python-format -msgid "for your user account at %(site_name)s" -msgstr "עבור חשבון המשתמש שלך ב %(site_name)s" +msgid "The %(name)s \"%(obj)s\" was added successfully." +msgstr "הוספת %(name)s \"%(obj)s\" בוצעה בהצלחה." -#: contrib/admin/templates/registration/password_reset_email.html:5 +#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348 +msgid "You may edit it again below." +msgstr "ניתן לערוך שוב מתחת" + +#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357 #, python-format -msgid "Your new password is: %(new_password)s" -msgstr "סיסמתך החדשה: %(new_password)s" +msgid "You may add another %s below." +msgstr "ניתן להוסיף %s נוסף מתחת." -#: contrib/admin/templates/registration/password_reset_email.html:7 -msgid "Feel free to change this password by going to this page:" -msgstr "ניתן לשנות את הסיסמה בכל עת ע\"י פניה לדף זה:" +#: contrib/admin/views/main.py:290 +#, python-format +msgid "Add %s" +msgstr "הוספת %s" -#: contrib/admin/templates/registration/password_reset_email.html:11 -msgid "Your username, in case you've forgotten:" -msgstr "שם המשתמש שלך, במקרה ששכחת:" +#: contrib/admin/views/main.py:336 +#, python-format +msgid "Added %s." +msgstr "%s התווסף." -#: contrib/admin/templates/registration/password_reset_email.html:13 -msgid "Thanks for using our site!" -msgstr "תודה על השימוש באתר שלנו!" +#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338 +#: contrib/admin/views/main.py:340 +msgid "and" +msgstr "ו" -#: contrib/admin/templates/registration/password_reset_email.html:15 +#: contrib/admin/views/main.py:338 #, python-format -msgid "The %(site_name)s team" -msgstr "צוות %(site_name)s" +msgid "Changed %s." +msgstr "%s שונה." -#: contrib/admin/templates/admin_doc/bookmarklets.html:3 -msgid "Bookmarklets" -msgstr "ייסומניות" +#: contrib/admin/views/main.py:340 +#, python-format +msgid "Deleted %s." +msgstr "%s נמחק." -#: contrib/admin/templates/admin_doc/bookmarklets.html:5 -msgid "Documentation bookmarklets" -msgstr "ייסומוניות תיעוד" +#: contrib/admin/views/main.py:343 +msgid "No fields changed." +msgstr "אף שדה לא השתנה." -#: contrib/admin/templates/admin_doc/bookmarklets.html:9 +#: contrib/admin/views/main.py:346 +#, python-format +msgid "The %(name)s \"%(obj)s\" was changed successfully." +msgstr "שינוי %(name)s \"%(obj)s\" בוצע בהצלחה." + +#: contrib/admin/views/main.py:354 +#, python-format msgid "" -"\n" -"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n" -"toolbar, or right-click the link and add it to your bookmarks. Now you can\n" -"select the bookmarklet from any page in the site. Note that some of these\n" -"bookmarklets require you to be viewing the site from a computer designated\n" -"as \"internal\" (talk to your system administrator if you aren't sure if\n" -"your computer is \"internal\").</p>\n" -msgstr "" -"\n" -"<p class=\"help\">כדי להתקין ייסומניות, יש לגרור את הקישור לסרגל הסימניות\n" -"שלך, או קליק ימני והוספה לסימניות. כעת ניתן\n" -"לבחור את הייסומניה מכל עמוד באתר. יש לשים לב כי חלק מהייסומניות\n" -"ניתנות לצפיה רק ממחשב שמסווג\n" -"כ\"פנימי\" (יש לדבר עם מנהל המערכת שלך אם אינך בטוח/ה\n" -"שהמחשב מסווג ככזה).</p>\n" +"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." +msgstr "הוספת %(name)s \"%(obj)s\" בוצעה בהצלחה. ניתן לערוך אותו שוב מתחת." -#: contrib/admin/templates/admin_doc/bookmarklets.html:19 -msgid "Documentation for this page" -msgstr "תיעוד לדף זה" +#: contrib/admin/views/main.py:392 +#, python-format +msgid "Change %s" +msgstr "שינוי %s" -#: contrib/admin/templates/admin_doc/bookmarklets.html:20 -msgid "" -"Jumps you from any page to the documentation for the view that generates " -"that page." -msgstr "מקפיץ אותך מכל עמוד לתיעוד התצוגה שייצרה אותו." +#: contrib/admin/views/main.py:470 +#, python-format +msgid "One or more %(fieldname)s in %(name)s: %(obj)s" +msgstr "אחד או יותר %(fieldname)s ב%(name)s: %(obj)s" -#: contrib/admin/templates/admin_doc/bookmarklets.html:22 -msgid "Show object ID" -msgstr "הצג מזהה אובייקט" +#: contrib/admin/views/main.py:475 +#, python-format +msgid "One or more %(fieldname)s in %(name)s:" +msgstr "אחד או יותר %(fieldname)s ב%(name)s:" -#: contrib/admin/templates/admin_doc/bookmarklets.html:23 -msgid "" -"Shows the content-type and unique ID for pages that represent a single " -"object." -msgstr "מציג את סוג התוכן והמזהה הייחודי לעמודים המייצגים אובייקט בודד." +#: contrib/admin/views/main.py:508 +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "מחיקת %(name)s \"%(obj)s\" בוצעה בהצלחה." -#: contrib/admin/templates/admin_doc/bookmarklets.html:25 -msgid "Edit this object (current window)" -msgstr "עריכת אובייקט זה (בחלון הנוכחי)" +#: contrib/admin/views/main.py:511 +msgid "Are you sure?" +msgstr "האם את/ה בטוח/ה ?" -#: contrib/admin/templates/admin_doc/bookmarklets.html:26 -msgid "Jumps to the admin page for pages that represent a single object." -msgstr "קופץ לעמוד הניהול לעמודים אשר מייצגים אובייקטים בודד." +#: contrib/admin/views/main.py:533 +#, python-format +msgid "Change history: %s" +msgstr "היסטוריית שינוי: %s" -#: contrib/admin/templates/admin_doc/bookmarklets.html:28 -msgid "Edit this object (new window)" -msgstr "עריכת אובייקט זה (בחלון חדש)" +#: contrib/admin/views/main.py:567 +#, python-format +msgid "Select %s" +msgstr "בחירת %s" -#: contrib/admin/templates/admin_doc/bookmarklets.html:29 -msgid "As above, but opens the admin page in a new window." -msgstr "כנ\"ל, אך דף הניהול ייפתח בחלון חדש." +#: contrib/admin/views/main.py:567 +#, python-format +msgid "Select %s to change" +msgstr "בחירת %s לשינוי" -#: contrib/admin/templates/widget/date_time.html:3 -msgid "Date:" -msgstr "תאריך:" +#: contrib/admin/views/main.py:743 +msgid "Database error" +msgstr "שגיאת בסיס נתונים" -#: contrib/admin/templates/widget/date_time.html:4 -msgid "Time:" -msgstr "שעה:" +#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36 +#: contrib/auth/forms.py:43 +msgid "" +"Please enter a correct username and password. Note that both fields are case-" +"sensitive." +msgstr "" +"נא להזין שם משתמש וסיסמה נכונים. בשני השדות גודל האותיות האנגליות משנה." -#: contrib/admin/templates/widget/file.html:2 -msgid "Currently:" -msgstr "הנוכחי." +#: contrib/admin/views/decorators.py:61 +msgid "" +"Please log in again, because your session has expired. Don't worry: Your " +"submission has been saved." +msgstr "" +"נא להתחבר שוב, מאחר ופג תוקף ההתחברות הנוכחית. אל דאגה: המידע ששלחת נשמר." -#: contrib/admin/templates/widget/file.html:3 -msgid "Change:" -msgstr "שינוי:" +#: contrib/admin/views/decorators.py:68 +msgid "" +"Looks like your browser isn't configured to accept cookies. Please enable " +"cookies, reload this page, and try again." +msgstr "" +"נראה שהדפדפן שלך אינו מוגדר לקבל עוגיות. נא לאפשר עוגיות, לטעון מחדש את הדף " +"ולנסות שוב." + +#: contrib/admin/views/decorators.py:82 +msgid "Usernames cannot contain the '@' character." +msgstr "שם משתמש אינו יכול להכיל את התו '@'." + +#: contrib/admin/views/decorators.py:84 +#, python-format +msgid "Your e-mail address is not your username. Try '%s' instead." +msgstr "כתובת הדוא\"ל שלך אינה שם המשתמש שלך. נסה/י '%s' במקום." #: contrib/redirects/models.py:7 msgid "redirect from" @@ -1056,59 +1817,27 @@ msgid "" "'http://'." msgstr "יכול להיות נתיב מלא (כנ\"ל) או URL מלא המתחיל ב'http://'." -#: contrib/redirects/models.py:12 +#: contrib/redirects/models.py:13 msgid "redirect" msgstr "הפניה" -#: contrib/redirects/models.py:13 +#: contrib/redirects/models.py:14 msgid "redirects" msgstr "הפניות" -#: contrib/flatpages/models.py:8 -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"לדוגמא: '/about/contact/'. יש לוודא הימצאות הקווים הנטויים בהתחלה ובסוף." - -#: contrib/flatpages/models.py:9 -msgid "title" -msgstr "כותרת" - -#: contrib/flatpages/models.py:10 -msgid "content" -msgstr "תוכן" - -#: contrib/flatpages/models.py:11 -msgid "enable comments" -msgstr "אפשר תגובות" - -#: contrib/flatpages/models.py:12 -msgid "template name" -msgstr "שם תבנית" - -#: contrib/flatpages/models.py:13 +#: contrib/auth/forms.py:30 msgid "" -"Example: 'flatpages/contact_page'. If this isn't provided, the system will " -"use 'flatpages/default'." -msgstr "" -"דוגמא: 'flatpages/contact_page'. האם אינו קיים, המערכתתשתמש ב 'flatpages/" -"default'." - -#: contrib/flatpages/models.py:14 -msgid "registration required" -msgstr "הרשמה נדרשת" - -#: contrib/flatpages/models.py:14 -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "אם זה מסומך, רק משתמשים מחוברים יוכלו לצפות בדף." +"Your Web browser doesn't appear to have cookies enabled. Cookies are " +"required for logging in." +msgstr "נראה שעוגיות לא מאופשרות בדפדפן שלך.הן נדרשות כדי להתחבר." -#: contrib/flatpages/models.py:18 -msgid "flat page" -msgstr "דף פשוט" +#: contrib/auth/forms.py:45 +msgid "This account is inactive." +msgstr "חשבון זה אינו פעיל." -#: contrib/flatpages/models.py:19 -msgid "flat pages" -msgstr "דפים פשוטים" +#: contrib/auth/views.py:39 +msgid "Logged out" +msgstr "יצאת מהמערכת" #: contrib/auth/models.py:13 contrib/auth/models.py:26 msgid "name" @@ -1187,8 +1916,8 @@ msgid "" "In addition to the permissions manually assigned, this user will also get " "all permissions granted to each group he/she is in." msgstr "" -"בנוסף לכל ההרשאות שהוקצו ידנית, יוענקו למשתמש/ת גם כל ההרשאות של כל קבוצה " -"המשוייכת אליו/ה." +"בנוסף לכל ההרשאות שהוקצו ידנית, יוענקו למשתמש גם כל ההרשאות של כל קבוצה " +"המשוייכת אליו." #: contrib/auth/models.py:67 msgid "user permissions" @@ -1222,693 +1951,49 @@ msgstr "קבוצות" msgid "message" msgstr "הודעה" -#: contrib/auth/forms.py:30 -msgid "" -"Your Web browser doesn't appear to have cookies enabled. Cookies are " -"required for logging in." -msgstr "נראה שעוגיות לא מאופשרות בדפדפן שלך.הן נדרשות כדי להתחבר." - -#: contrib/contenttypes/models.py:25 -msgid "python model class name" -msgstr "שם ה-class של מודל פייתון" - -#: contrib/contenttypes/models.py:28 -msgid "content type" -msgstr "סוג תוכן" - -#: contrib/contenttypes/models.py:29 -msgid "content types" -msgstr "סוגי תוכן" - -#: contrib/sessions/models.py:35 -msgid "session key" -msgstr "מפתח התחברות (session key)" - -#: contrib/sessions/models.py:36 -msgid "session data" -msgstr "מידע התחברות (session data)" - -#: contrib/sessions/models.py:37 -msgid "expire date" -msgstr "תאריך פג תוקף" - -#: contrib/sessions/models.py:41 -msgid "session" -msgstr "התחברות" - -#: contrib/sessions/models.py:42 -msgid "sessions" -msgstr "התחברויות" - -#: contrib/sites/models.py:10 -msgid "domain name" -msgstr "שם מתחם" - -#: contrib/sites/models.py:11 -msgid "display name" -msgstr "שם לתצוגה" - -#: contrib/sites/models.py:15 -msgid "site" -msgstr "אתר" - -#: contrib/sites/models.py:16 -msgid "sites" -msgstr "אתרים" - -#: utils/translation.py:360 -msgid "DATE_FORMAT" -msgstr "d.m.Y" - -#: utils/translation.py:361 -msgid "DATETIME_FORMAT" -msgstr "d.m.y H:i:s" - -#: utils/translation.py:362 -msgid "TIME_FORMAT" -msgstr "H:i:s" - -#: utils/dates.py:6 -msgid "Monday" -msgstr "שני" - -#: utils/dates.py:6 -msgid "Tuesday" -msgstr "שלישי" - -#: utils/dates.py:6 -msgid "Wednesday" -msgstr "רביעי" - -#: utils/dates.py:6 -msgid "Thursday" -msgstr "חמישי" - -#: utils/dates.py:6 -msgid "Friday" -msgstr "שישי" - -#: utils/dates.py:7 -msgid "Saturday" -msgstr "שבת" - -#: utils/dates.py:7 -msgid "Sunday" -msgstr "ראשון" - -#: utils/dates.py:14 -msgid "January" -msgstr "ינואר" - -#: utils/dates.py:14 -msgid "February" -msgstr "פברואר" - -#: utils/dates.py:14 utils/dates.py:27 -msgid "March" -msgstr "מרץ" - -#: utils/dates.py:14 utils/dates.py:27 -msgid "April" -msgstr "אפריל" - -#: utils/dates.py:14 utils/dates.py:27 -msgid "May" -msgstr "מאי" - -#: utils/dates.py:14 utils/dates.py:27 -msgid "June" -msgstr "יוני" - -#: utils/dates.py:15 utils/dates.py:27 -msgid "July" -msgstr "יולי" - -#: utils/dates.py:15 -msgid "August" -msgstr "אוגוסט" - -#: utils/dates.py:15 -msgid "September" -msgstr "ספטמבר" - -#: utils/dates.py:15 -msgid "October" -msgstr "אוקטובר" - -#: utils/dates.py:15 -msgid "November" -msgstr "נובמבר" - -#: utils/dates.py:16 -msgid "December" -msgstr "תצבר" - -#: utils/dates.py:19 -msgid "jan" -msgstr "יאנ" - -#: utils/dates.py:19 -msgid "feb" -msgstr "פבר" - -#: utils/dates.py:19 -msgid "mar" -msgstr "מרץ" - -#: utils/dates.py:19 -msgid "apr" -msgstr "אפר" - -#: utils/dates.py:19 -msgid "may" -msgstr "מאי" - -#: utils/dates.py:19 -msgid "jun" -msgstr "יונ" - -#: utils/dates.py:20 -msgid "jul" -msgstr "יול" - -#: utils/dates.py:20 -msgid "aug" -msgstr "אוג" - -#: utils/dates.py:20 -msgid "sep" -msgstr "ספט" - -#: utils/dates.py:20 -msgid "oct" -msgstr "אוק" - -#: utils/dates.py:20 -msgid "nov" -msgstr "נוב" - -#: utils/dates.py:20 -msgid "dec" -msgstr "דצמ" - -#: utils/dates.py:27 -msgid "Jan." -msgstr "יאנ'" - -#: utils/dates.py:27 -msgid "Feb." -msgstr "פבר'" - -#: utils/dates.py:28 -msgid "Aug." -msgstr "אוג'" - -#: utils/dates.py:28 -msgid "Sept." -msgstr "ספט'" - -#: utils/dates.py:28 -msgid "Oct." -msgstr "אוק'" - -#: utils/dates.py:28 -msgid "Nov." -msgstr "נוב'" - -#: utils/dates.py:28 -msgid "Dec." -msgstr "דצמ'" - -#: utils/timesince.py:12 -msgid "year" -msgstr "שנה" - -#: utils/timesince.py:13 -msgid "month" -msgstr "חודש" - -#: utils/timesince.py:14 -msgid "week" -msgstr "שבוע" - -#: utils/timesince.py:15 -msgid "day" -msgstr "יום" - -#: utils/timesince.py:16 -msgid "hour" -msgstr "שעה" - -#: utils/timesince.py:17 -msgid "minute" -msgstr "דקה" - -#: conf/global_settings.py:37 -msgid "Bengali" -msgstr "בנגאלית - Bengali" - -#: conf/global_settings.py:38 -msgid "Czech" -msgstr "צ'כית - Czech" - -#: conf/global_settings.py:39 -msgid "Welsh" -msgstr "וולשית - Welsh" - -#: conf/global_settings.py:40 -msgid "Danish" -msgstr "דנית - Danish" - -#: conf/global_settings.py:41 -msgid "German" -msgstr "גרמנית - German" - -#: conf/global_settings.py:42 -msgid "Greek" -msgstr "יוונית - Greek" - -#: conf/global_settings.py:43 -msgid "English" -msgstr "אנגלית - English" - -#: conf/global_settings.py:44 -msgid "Spanish" -msgstr "ספרדית - Spanish" - -#: conf/global_settings.py:45 -msgid "French" -msgstr "צרפתית - French" - -#: conf/global_settings.py:46 -msgid "Galician" -msgstr "גאליצית - Galician" - -#: conf/global_settings.py:47 -msgid "Hungarian" -msgstr "הונגרית (Hungarian)" - -#: conf/global_settings.py:48 -msgid "Hebrew" -msgstr "עברית - Hebrew" - -#: conf/global_settings.py:49 -msgid "Icelandic" -msgstr "איסלנדית - Icelandic" - -#: conf/global_settings.py:50 -msgid "Italian" -msgstr "איטלקית - Italian" - -#: conf/global_settings.py:51 -msgid "Japanese" -msgstr "יפנית - Japanese" - -#: conf/global_settings.py:52 -msgid "Dutch" -msgstr "הולנדית - Dutch" - -#: conf/global_settings.py:53 -msgid "Norwegian" -msgstr "נורווגית - Norwegian" - -#: conf/global_settings.py:54 -msgid "Brazilian" -msgstr "ברזילאית - Brazilian" - -#: conf/global_settings.py:55 -msgid "Romanian" -msgstr "רומנית - Romanian" - -#: conf/global_settings.py:56 -msgid "Russian" -msgstr "רוסית - Russian" - -#: conf/global_settings.py:57 -msgid "Slovak" -msgstr "סלובקית - Slovak" - -#: conf/global_settings.py:58 -msgid "Slovenian" -msgstr "סלובנית - Slovenian" - -#: conf/global_settings.py:59 -msgid "Serbian" -msgstr "סרבית - Serbian" - -#: conf/global_settings.py:60 -msgid "Swedish" -msgstr "שוודית - Swedish" - -#: conf/global_settings.py:61 -msgid "Ukrainian" -msgstr "אוקראינית - Ukrainian" - -#: conf/global_settings.py:62 -msgid "Simplified Chinese" -msgstr "סינית פשוטה - Simplified·Chinese" - -#: conf/global_settings.py:63 -msgid "Traditional Chinese" -msgstr "סינית מסורתית - Traditional·Chinese" - -#: core/validators.py:60 -msgid "This value must contain only letters, numbers and underscores." -msgstr "ערך זה חייב להכיל אותיות, ספרות וקווים תחתונים בלבד." - -#: core/validators.py:64 -msgid "" -"This value must contain only letters, numbers, underscores, dashes or " -"slashes." -msgstr "ערך זה חייב להכיל אותיות, ספרות, מקפים, קווים תחתונים ונטויים בלבד." - -#: core/validators.py:72 -msgid "Uppercase letters are not allowed here." -msgstr "אסור להשתמש באותיות גדולות." - -#: core/validators.py:76 -msgid "Lowercase letters are not allowed here." -msgstr "אסור להשתמש באותיות קטנות." - -#: core/validators.py:83 -msgid "Enter only digits separated by commas." -msgstr "יש להזין רק ספרות מופרדות בפסיקים." - -#: core/validators.py:95 -msgid "Enter valid e-mail addresses separated by commas." -msgstr "יש להזין רק כתובות דוא\"ל מופרדות בפסיקים." - -#: core/validators.py:99 -msgid "Please enter a valid IP address." -msgstr "נא להזין כתובת IP חוקית." - -#: core/validators.py:103 -msgid "Empty values are not allowed here." -msgstr "חובה להזין ערך בשדה זה." - -#: core/validators.py:107 -msgid "Non-numeric characters aren't allowed here." -msgstr "מותר להזין ספרות בלבד." - -#: core/validators.py:111 -msgid "This value can't be comprised solely of digits." -msgstr "ערך זה אינו יכול להכיל ספרות בלבד." - -#: core/validators.py:116 -msgid "Enter a whole number." -msgstr "נא להזין מספר שלם." - -#: core/validators.py:120 -msgid "Only alphabetical characters are allowed here." -msgstr "יש להזין כאן אותיות בלבד." - -#: core/validators.py:124 -msgid "Enter a valid date in YYYY-MM-DD format." -msgstr "יש להזין תאריך במבנה YYYY-MM-DD." - -#: core/validators.py:128 -msgid "Enter a valid time in HH:MM format." -msgstr "יש להזין שעה במבנה HH:MM." - -#: core/validators.py:132 db/models/fields/__init__.py:468 -msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format." -msgstr "יש להזין תאריך ושעה במבנה YYYY-MM-DD HH:MM." - -#: core/validators.py:136 -msgid "Enter a valid e-mail address." -msgstr "יש להזין כתובת דוא\"ל חוקית." - -#: core/validators.py:148 -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "נא להעלות תמונה חוקית. הקובץ שהעלת אינו תמונה אומכיל תמונה מקולקלת." - -#: core/validators.py:155 -#, python-format -msgid "The URL %s does not point to a valid image." -msgstr "ה-URL %s אנו מצביע לתמונה חוקית." - -#: core/validators.py:159 -#, python-format -msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid." -msgstr "מספרי טלפון חייבים להיות במבנה XXX-XXX-XXXX. \"%s\" אינו חוקי." - -#: core/validators.py:167 -#, python-format -msgid "The URL %s does not point to a valid QuickTime video." -msgstr "ה-URL %s אינו מצביע לסרטון QuickTime חוקי." - -#: core/validators.py:171 -msgid "A valid URL is required." -msgstr "יש להזין URL חוקי." - -#: core/validators.py:185 -#, python-format -msgid "" -"Valid HTML is required. Specific errors are:\n" -"%s" -msgstr "" -"יש להזין HTML חוקי. שגיאות ספציפיות:\n" -"%s" - -#: core/validators.py:192 -#, python-format -msgid "Badly formed XML: %s" -msgstr "מבנה XML שגוי: %s" - -#: core/validators.py:202 -#, python-format -msgid "Invalid URL: %s" -msgstr "URL שגוי: %s" - -#: core/validators.py:206 core/validators.py:208 -#, python-format -msgid "The URL %s is a broken link." -msgstr "ה-URL %s הוא קישור שבור." - -#: core/validators.py:214 -msgid "Enter a valid U.S. state abbreviation." -msgstr "יש להזין קיצור חוקי למדינה בארה\"ב." - -#: core/validators.py:229 -#, python-format -msgid "Watch your mouth! The word %s is not allowed here." -msgstr "שמור על לשונך! המילה %s אינה מותרת לשימוש כאן." - -#: core/validators.py:236 -#, python-format -msgid "This field must match the '%s' field." -msgstr "תוכן השדה חייב להיות זהה לשדה '%s'." - -#: core/validators.py:255 -msgid "Please enter something for at least one field." -msgstr "יש להזין תוכן בלפחות אחד מהשדות." - -#: core/validators.py:264 core/validators.py:275 -msgid "Please enter both fields or leave them both empty." -msgstr "יש להזין תוכן בשני השדות או להשאיר את שניהם ריקים." - -#: core/validators.py:282 -#, python-format -msgid "This field must be given if %(field)s is %(value)s" -msgstr "יש להזין מידע בשדה זה אם שדה %(field)s מכיל %(value)s" - -#: core/validators.py:294 -#, python-format -msgid "This field must be given if %(field)s is not %(value)s" -msgstr "יש להזין תוכן בשדה זה אם תוכן שדה %(field)s אינו %(value)s" - -#: core/validators.py:313 -msgid "Duplicate values are not allowed." -msgstr "לא ניתן להזין ערכים כפולים." - -#: core/validators.py:336 -#, python-format -msgid "This value must be a power of %s." -msgstr "ערך זה חייב להיות חזקה של %s." - -#: core/validators.py:347 -msgid "Please enter a valid decimal number." -msgstr "יש להזין מספר עשרוני חוקי." - -#: core/validators.py:349 -#, python-format -msgid "Please enter a valid decimal number with at most %s total digit." -"Please enter a valid decimal number with at most %s total digits." -msgstr "נא להזין מספר שלם המכיל %s ספרה לכל היותר." -"נא להזין מספר שלם המכיל %s ספרות לכל היותר." - -#: core/validators.py:352 -#, python-format -msgid "Please enter a valid decimal number with at most %s decimal place." -"Please enter a valid decimal number with at most %s decimal places." -msgstr "נא·להזין·מספר·עשרוני·חוקי·המכיל·%s·ספרה·אחרי·הנקודה·לכל·היותר." -"נא להזין מספר עשרוני חוקי המכיל %s ספרות אחרי הנקודה לכל היותר." - -#: core/validators.py:362 -#, python-format -msgid "Make sure your uploaded file is at least %s bytes big." -msgstr "יש להעלות קובץ בגודל %s בתים לפחות." - -#: core/validators.py:363 -#, python-format -msgid "Make sure your uploaded file is at most %s bytes big." -msgstr "יש לוודא שהקובץ שהעלת הוא בגודל %s בתים לכל היותר." - -#: core/validators.py:376 -msgid "The format for this field is wrong." -msgstr "מבנה תוכן שדה זה שגוי." - -#: core/validators.py:391 -msgid "This field is invalid." -msgstr "שדה זה אינו חוקי." - -#: core/validators.py:426 -#, python-format -msgid "Could not retrieve anything from %s." -msgstr "לא ניתן לאחזר כלום מ %s." - -#: core/validators.py:429 -#, python-format -msgid "" -"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." -msgstr "ה-URL·%(url)s·החזיר כותרת·Content-Type·לא חוקית·'%(contenttype)s'." - -#: core/validators.py:462 -#, python-format -msgid "" -"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with " -"\"%(start)s\".)" -msgstr "נא לסגור את תג·%(tag)s·בשורה·%(line)s.·(השורה מתחילה ב·\"%(start)s\".)" - -#: core/validators.py:466 -#, python-format -msgid "" -"Some text starting on line %(line)s is not allowed in that context. (Line " -"starts with \"%(start)s\".)" -msgstr "" -"חלק מהטקסט בשורה·%(line)s·אסור בהקשר זה.·(השורה·מתחילה ב·\"%(start)s\".)" - -#: core/validators.py:471 -#, python-format -msgid "" -"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%" -"(start)s\".)" -msgstr "" -"\"%(attr)s\"·בשורה·%(line)s·אינה תכונה חוקית.·(השורה מתחילה ב·\"%(start)s\".)" - -#: core/validators.py:476 -#, python-format -msgid "" -"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%" -"(start)s\".)" -msgstr "" -"\"<%(tag)s>\"·בשורה·%(line)s·אינו תג חוקי.·(השורה מתחילה ב·\"%(start)s\".)" - -#: core/validators.py:480 -#, python-format -msgid "" -"A tag on line %(line)s is missing one or more required attributes. (Line " -"starts with \"%(start)s\".)" -msgstr "" -"A·tag·on·line·%(line)s·חסרה תכונה אחת או יותר נדרשות.·(השורה·מתחילה ב·\"%" -"(start)s\".)" - -#: core/validators.py:485 -#, python-format +#: contrib/flatpages/models.py:8 msgid "" -"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line " -"starts with \"%(start)s\".)" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." msgstr "" -"לתכונה·\"%(attr)s\"·בשורה·%(line)s·יש ערך לא חוקי.·(השורה·מתחילה ב·\"%(start)" -"s\".)" - -#: db/models/manipulators.py:302 -#, python-format -msgid "%(object)s with this %(type)s already exists for the given %(field)s." -msgstr "%(object)s עם %(type)s קיים כבר עבור %(field)s נתון." - -#: db/models/fields/__init__.py:40 -#, python-format -msgid "%(optname)s with this %(fieldname)s already exists." -msgstr "%(optname)s·עם·%(fieldname)s·זה קיימת כבר." - -#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265 -#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553 -#: forms/__init__.py:346 -msgid "This field is required." -msgstr "יש להזין תוכן בשדה זה." - -#: db/models/fields/__init__.py:337 -msgid "This value must be an integer." -msgstr "ערך זה חייב להיות מספר שלם." - -#: db/models/fields/__init__.py:369 -msgid "This value must be either True or False." -msgstr "ערך זה חייב להיות אמת או שקר." +"לדוגמא: '/about/contact/'. יש לוודא הימצאות הקווים הנטויים בהתחלה ובסוף." -#: db/models/fields/__init__.py:385 -msgid "This field cannot be null." -msgstr "שדה זה אינו יכול להכיל null." +#: contrib/flatpages/models.py:9 +msgid "title" +msgstr "כותרת" -#: db/models/fields/__init__.py:562 -msgid "Enter a valid filename." -msgstr "יש להזין שם קובץ חוקי." +#: contrib/flatpages/models.py:10 +msgid "content" +msgstr "תוכן" -#: db/models/fields/related.py:43 -#, python-format -msgid "Please enter a valid %s." -msgstr "יש להזין %s חוקי." +#: contrib/flatpages/models.py:11 +msgid "enable comments" +msgstr "אפשר תגובות" -#: db/models/fields/related.py:579 -msgid "Separate multiple IDs with commas." -msgstr "יש להפריד מזהים מרובים בפסיקים." +#: contrib/flatpages/models.py:12 +msgid "template name" +msgstr "שם תבנית" -#: db/models/fields/related.py:581 +#: contrib/flatpages/models.py:13 msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +"Example: 'flatpages/contact_page'. If this isn't provided, the system will " +"use 'flatpages/default'." msgstr "" -"החזק את \"Control\", או \"Command\" על מק, לחוץ כדי לבחור יותר מאחד." - -#: db/models/fields/related.py:625 -#, python-format -msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." -"Please enter valid %(self)s IDs. The values %(value)r are invalid." -msgstr "נא להזין זיהוי %(self)s חוקי. הערך %(value)r אינו חוקי." -"נא להזין זיהויי %(self)s חוקיים. הערכים %(value)r אינם חוקיים." - -#: forms/__init__.py:380 -#, python-format -msgid "Ensure your text is less than %s character." -msgstr "נא לוודא שהטקסט שלך מכיל פחות מ %s תו." - -#: forms/__init__.py:385 -msgid "Line breaks are not allowed here." -msgstr "מעברי שורה אסורים כאן." - -#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589 -#, python-format -msgid "Select a valid choice; '%(data)s' is not in %(choices)s." -msgstr "יש לבחור אפשרות חוקית; '%(data)s' אינו בין %(choices)s." - -#: forms/__init__.py:645 -msgid "The submitted file is empty." -msgstr "הקובץ שנשלח ריק." +"דוגמא: 'flatpages/contact_page'. האם אינו קיים, המערכתתשתמש ב 'flatpages/" +"default'." -#: forms/__init__.py:699 -msgid "Enter a whole number between -32,768 and 32,767." -msgstr "חש להזין מספר שלם בין -32,768 ל- 32,767." +#: contrib/flatpages/models.py:14 +msgid "registration required" +msgstr "הרשמה נדרשת" -#: forms/__init__.py:708 -msgid "Enter a positive number." -msgstr "יש להזין מספר חיובי." +#: contrib/flatpages/models.py:14 +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "אם זה מסומך, רק משתמשים מחוברים יוכלו לצפות בדף." -#: forms/__init__.py:717 -msgid "Enter a whole number between 0 and 32,767." -msgstr "יש להזין מספר שלם בין 0 ל- 32,767." +#: contrib/flatpages/models.py:18 +msgid "flat page" +msgstr "דף פשוט" -#: template/defaultfilters.py:379 -msgid "yes,no,maybe" -msgstr "כן,לא,אולי" +#: contrib/flatpages/models.py:19 +msgid "flat pages" +msgstr "דפים פשוטים" diff --git a/django/conf/locale/he/LC_MESSAGES/djangojs.mo b/django/conf/locale/he/LC_MESSAGES/djangojs.mo Binary files differindex 4441ea84e6..2539598770 100644 --- a/django/conf/locale/he/LC_MESSAGES/djangojs.mo +++ b/django/conf/locale/he/LC_MESSAGES/djangojs.mo diff --git a/django/conf/locale/he/LC_MESSAGES/djangojs.po b/django/conf/locale/he/LC_MESSAGES/djangojs.po index ce5b25568c..75b53dd8db 100644 --- a/django/conf/locale/he/LC_MESSAGES/djangojs.po +++ b/django/conf/locale/he/LC_MESSAGES/djangojs.po @@ -2,7 +2,6 @@ # Copyright (C) 2006 THE djangojs'S COPYRIGHT HOLDER # This file is distributed under the same license as the djangojs package. # Meir Kriheli <meir@mksoft.co.il>, 2006. -# , fuzzy # # msgid "" @@ -53,7 +52,7 @@ msgstr "%s נבחרות" #: contrib/admin/media/js/SelectFilter2.js:54 msgid "Select your choice(s) and click " -msgstr "יש לסמן את ההרשאות המבוקשות וללחוץ על" +msgstr "יש לסמן את ההרשאות המבוקשות וללחוץ על " #: contrib/admin/media/js/SelectFilter2.js:59 msgid "Clear all" diff --git a/django/conf/locale/pl/LC_MESSAGES/django.mo b/django/conf/locale/pl/LC_MESSAGES/django.mo Binary files differindex 3e748781ac..f7fad56339 100644 --- a/django/conf/locale/pl/LC_MESSAGES/django.mo +++ b/django/conf/locale/pl/LC_MESSAGES/django.mo diff --git a/django/conf/locale/pl/LC_MESSAGES/django.po b/django/conf/locale/pl/LC_MESSAGES/django.po index dee8dbf226..b6449e22b0 100644 --- a/django/conf/locale/pl/LC_MESSAGES/django.po +++ b/django/conf/locale/pl/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2006-05-16 10:13+0200\n" "PO-Revision-Date: 2006-02-21 11:10+0100\n" -"Last-Translator: GNOME PL Team <translators@gnome.pl>\n" +"Last-Translator: Piotr Maliński <admin@rk.edu.pl>\n" "Language-Team: Polish <pl@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,7 +19,7 @@ msgstr "" #: contrib/comments/models.py:67 contrib/comments/models.py:166 msgid "object ID" -msgstr "" +msgstr "ID obiektu" #: contrib/comments/models.py:68 msgid "headline" @@ -32,43 +32,43 @@ msgstr "komentarz" #: contrib/comments/models.py:70 msgid "rating #1" -msgstr "" +msgstr "ocena #1" #: contrib/comments/models.py:71 msgid "rating #2" -msgstr "" +msgstr "ocena #2" #: contrib/comments/models.py:72 msgid "rating #3" -msgstr "" +msgstr "ocena #3" #: contrib/comments/models.py:73 msgid "rating #4" -msgstr "" +msgstr "ocena #4" #: contrib/comments/models.py:74 msgid "rating #5" -msgstr "" +msgstr "ocena #5" #: contrib/comments/models.py:75 msgid "rating #6" -msgstr "" +msgstr "ocena #6" #: contrib/comments/models.py:76 msgid "rating #7" -msgstr "" +msgstr "ocena #7" #: contrib/comments/models.py:77 msgid "rating #8" -msgstr "" +msgstr "ocena #8" #: contrib/comments/models.py:82 msgid "is valid rating" -msgstr "" +msgstr "jest poprawną oceną" #: contrib/comments/models.py:83 contrib/comments/models.py:169 msgid "date/time submitted" -msgstr "" +msgstr "data/czas dodania" #: contrib/comments/models.py:84 contrib/comments/models.py:170 msgid "is public" @@ -87,15 +87,16 @@ msgid "" "Check this box if the comment is inappropriate. A \"This comment has been " "removed\" message will be displayed instead." msgstr "" +"Zaznacz to pole jeżeli komentarz jest nieodpowiedni. Wyświetlony zostanie tekst \"Ten " +"komentarz został usunięty\". " #: contrib/comments/models.py:91 -#, fuzzy msgid "comments" -msgstr "komentarz" +msgstr "komentarze" #: contrib/comments/models.py:131 contrib/comments/models.py:207 msgid "Content object" -msgstr "" +msgstr "Obiekt Treści" #: contrib/comments/models.py:159 #, python-format @@ -106,6 +107,11 @@ msgid "" "\n" "http://%(domain)s%(url)s" msgstr "" +"Dodane przez %(user)s dnia %(date)s\n" +"\n" +"%(comment)y\n" +"\n" +"http://%(domain)s%(url)s" #: contrib/comments/models.py:168 msgid "person's name" @@ -122,12 +128,12 @@ msgstr "zaakceptowano" #: contrib/comments/models.py:176 #, fuzzy msgid "free comment" -msgstr "Wolny komentarz" +msgstr "wolny komentarz" #: contrib/comments/models.py:177 #, fuzzy msgid "free comments" -msgstr "Wolne komentarze" +msgstr "wolne komentarze" #: contrib/comments/models.py:233 msgid "score" @@ -135,7 +141,7 @@ msgstr "ilość punktów" #: contrib/comments/models.py:234 msgid "score date" -msgstr "" +msgstr "data przyznania punktów" #: contrib/comments/models.py:237 #, fuzzy @@ -144,12 +150,12 @@ msgstr "ilość punktów" #: contrib/comments/models.py:238 msgid "karma scores" -msgstr "" +msgstr "wyniki" #: contrib/comments/models.py:242 #, python-format msgid "%(score)d rating by %(user)s" -msgstr "" +msgstr "%(score)d ocenę przez %(user)s" #: contrib/comments/models.py:258 #, python-format @@ -158,57 +164,62 @@ msgid "" "\n" "%(text)s" msgstr "" +"Komentarz oflagowany przez %(user)s:\n" +"\n" +"%(text)s" #: contrib/comments/models.py:265 msgid "flag date" -msgstr "" +msgstr "data flagi" #: contrib/comments/models.py:268 msgid "user flag" -msgstr "" +msgstr "flaga użytkownika" #: contrib/comments/models.py:269 msgid "user flags" -msgstr "" +msgstr "flagi użytkownika" #: contrib/comments/models.py:273 #, python-format msgid "Flag by %r" -msgstr "" +msgstr "Flaga %r" #: contrib/comments/models.py:278 msgid "deletion date" -msgstr "" +msgstr "data skasowania" #: contrib/comments/models.py:280 msgid "moderator deletion" -msgstr "" +msgstr "usunięcie moderatora" #: contrib/comments/models.py:281 msgid "moderator deletions" -msgstr "" +msgstr "usunięcia moderatorów" #: contrib/comments/models.py:285 #, python-format msgid "Moderator deletion by %r" -msgstr "" +msgstr "Usunięcie moderatora przez %r" #: contrib/comments/views/karma.py:19 msgid "Anonymous users cannot vote" -msgstr "" +msgstr "Anonimowi użytkownicy nie mogą głosować" #: contrib/comments/views/karma.py:23 msgid "Invalid comment ID" -msgstr "" +msgstr "Błędny ID komentarza" #: contrib/comments/views/karma.py:25 msgid "No voting for yourself" -msgstr "" +msgstr "Nie można głosować na siebie" #: contrib/comments/views/comments.py:28 msgid "" "This rating is required because you've entered at least one other rating." msgstr "" +"Ta ocena jest wymagana gdyż podałeś przynajmniej jedną inną ocenę." + #: contrib/comments/views/comments.py:112 #, python-format @@ -236,12 +247,12 @@ msgstr "" #: contrib/comments/views/comments.py:189 #: contrib/comments/views/comments.py:280 msgid "Only POSTs are allowed" -msgstr "" +msgstr "Dozwolone tylko POSTy" #: 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 "Jedno lub więcej wymaganych pól nie zostało wypełnionych" #: contrib/comments/views/comments.py:197 #: contrib/comments/views/comments.py:286 @@ -264,17 +275,16 @@ msgstr "" #: contrib/comments/templates/comments/form.html:8 #: contrib/admin/templates/admin/login.html:17 msgid "Username:" -msgstr "Nazwa użytkownika" +msgstr "Nazwa użytkownika:" #: contrib/comments/templates/comments/form.html:6 #: contrib/admin/templates/admin/login.html:20 msgid "Password:" -msgstr "Hasło" +msgstr "Hasło:" #: contrib/comments/templates/comments/form.html:6 -#, fuzzy msgid "Forgotten your password?" -msgstr "Zmień hasło" +msgstr "Zapomniałeś hasło?" #: contrib/comments/templates/comments/form.html:8 #: contrib/admin/templates/admin/object_history.html:3 @@ -385,7 +395,7 @@ msgstr "id obiektu" #: contrib/admin/models.py:20 msgid "object repr" -msgstr "" +msgstr "reprezentacj obiektu" #: contrib/admin/models.py:21 msgid "action flag" @@ -426,12 +436,16 @@ msgid "" "Please log in again, because your session has expired. Don't worry: Your " "submission has been saved." msgstr "" +"Zaloguj się ponownie. Twoja sesja wygasła lecz twoje zgłoszenie " +"zostało zapisane." #: contrib/admin/views/decorators.py:68 msgid "" "Looks like your browser isn't configured to accept cookies. Please enable " "cookies, reload this page, and try again." msgstr "" +"Twoja przeglądarka nie chce akceptować ciasteczek. Zmień " +"jej ustawienia i spróbuj ponownie." #: contrib/admin/views/decorators.py:82 msgid "Usernames cannot contain the '@' character." @@ -449,16 +463,16 @@ msgstr "Administracja stroną" #: contrib/admin/views/main.py:260 #, python-format msgid "The %(name)s \"%(obj)s\" was added successfully." -msgstr "" +msgstr "%(name)s \"%(obj)s\" dodany pomyślnie." #: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348 msgid "You may edit it again below." -msgstr "Możesz to ponownie edytować poniżej." +msgstr "Możesz ponownie edytować wpis poniżej." #: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357 #, python-format msgid "You may add another %s below." -msgstr "Możesz dodać nowe %s poniżej." +msgstr "Możesz dodać nowy wpis %s poniżej." #: contrib/admin/views/main.py:290 #, python-format @@ -499,6 +513,8 @@ msgstr "%(name)s \"%(obj)s\" zostało pomyślnie zmienione." msgid "" "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." msgstr "" +"%(name)s \"%(obj)s\" dodane pomyślnie. Możesz edytować ponownie wpis poniżej." + #: contrib/admin/views/main.py:392 #, python-format @@ -508,21 +524,21 @@ msgstr "Zmień %s" #: contrib/admin/views/main.py:470 #, python-format msgid "One or more %(fieldname)s in %(name)s: %(obj)s" -msgstr "" +msgstr "Jedno lub więcej %(fieldname)s w %(name)s: %(obj)s" #: contrib/admin/views/main.py:475 #, python-format msgid "One or more %(fieldname)s in %(name)s:" -msgstr "" +msgstr "Jedno lub więcej %(fieldname)s w %(name)s:" #: contrib/admin/views/main.py:508 #, python-format msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "" +msgstr "%(name)s \"%(obj)s\" usunięty pomyślnie." #: contrib/admin/views/main.py:511 msgid "Are you sure?" -msgstr "Czy na pewno?" +msgstr "Jesteś pewien?" #: contrib/admin/views/main.py:533 #, python-format @@ -552,7 +568,7 @@ msgstr "Wartość logiczna (True, False - prawda lub fałsz)" #: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296 #, python-format msgid "String (up to %(maxlength)s)" -msgstr "" +msgstr "Łańcuch (do %(maxlength)s znaków)" #: contrib/admin/views/doc.py:280 msgid "Comma-separated integers" @@ -604,11 +620,11 @@ msgstr "URL" #: contrib/admin/views/doc.py:301 msgid "U.S. state (two uppercase letters)" -msgstr "" +msgstr "Stan USA (dwie duże litery)" #: contrib/admin/views/doc.py:302 msgid "XML text" -msgstr "Text XML" +msgstr "Tekst XML" #: contrib/admin/templates/admin/object_history.html:3 #: contrib/admin/templates/admin/change_list.html:5 @@ -682,6 +698,8 @@ msgid "" "This object doesn't have a change history. It probably wasn't added via this " "admin site." msgstr "" +"Ten obiekt nie ma historii zmian. Najprawdopodobniej wpis te nie " +"został dodany poprzez panel admina" #: contrib/admin/templates/admin/base_site.html:4 msgid "Django site admin" @@ -701,13 +719,15 @@ msgstr "Bład serwera (500)" #: contrib/admin/templates/admin/500.html:9 msgid "Server Error <em>(500)</em>" -msgstr "" +msgstr "Błąd Serwera <em>(500)</em>" #: contrib/admin/templates/admin/500.html:10 msgid "" "There's been an error. It's been reported to the site administrators via e-" "mail and should be fixed shortly. Thanks for your patience." msgstr "" +"Wystąpił niespodziewany błąd. Raport został wysłany emailem " +"administratorowi strony." #: contrib/admin/templates/admin/404.html:4 #: contrib/admin/templates/admin/404.html:8 @@ -716,12 +736,12 @@ msgstr "Strona nie znaleziona" #: contrib/admin/templates/admin/404.html:10 msgid "We're sorry, but the requested page could not be found." -msgstr "" +msgstr "Niestety nie można znaleźć rządanej strony." #: contrib/admin/templates/admin/index.html:17 #, python-format msgid "Models available in the %(name)s application." -msgstr "" +msgstr "Modele dostępne w aplikacji %(name)s." #: contrib/admin/templates/admin/index.html:28 #: contrib/admin/templates/admin/change_form.html:15 @@ -734,7 +754,7 @@ msgstr "Zmień" #: contrib/admin/templates/admin/index.html:44 msgid "You don't have permission to edit anything." -msgstr "" +msgstr "Nie masz uprawnień by edytować cokolwiek" #: contrib/admin/templates/admin/index.html:52 msgid "Recent Actions" @@ -746,7 +766,7 @@ msgstr "Moje akcje" #: contrib/admin/templates/admin/index.html:57 msgid "None available" -msgstr "Nic nie dostępne" +msgstr "Brak" #: contrib/admin/templates/admin/change_list.html:11 #, python-format @@ -756,7 +776,7 @@ msgstr "Dodaj %(name)s" #: contrib/admin/templates/admin/login.html:22 msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?" msgstr "" -"Czy aby na pewno <a href=\"/password_reset/\">zapomniałeś/łaś</a> hasła?" +"Czy <a href=\"/password_reset/\">zapomniałeś/łaś</a> hasła?" #: contrib/admin/templates/admin/base.html:23 msgid "Welcome," @@ -816,11 +836,11 @@ msgstr "Porządek:" #: contrib/admin/templates/admin/submit_line.html:4 msgid "Save as new" -msgstr "Zapisz" +msgstr "Zapisz jako nowe" #: contrib/admin/templates/admin/submit_line.html:5 msgid "Save and add another" -msgstr "Zapisz i dodaj" +msgstr "Zapisz i dodaj nowe" #: contrib/admin/templates/admin/submit_line.html:6 msgid "Save and continue editing" @@ -858,6 +878,8 @@ msgid "" "Forgotten your password? Enter your e-mail address below, and we'll reset " "your password and e-mail the new one to you." msgstr "" +"Podaj swój adres email. Hasło zostanie zresetowane i wysłane na twój " +"adres email." #: contrib/admin/templates/registration/password_reset_form.html:16 msgid "E-mail address:" @@ -869,7 +891,7 @@ msgstr "Zresetuj moje hasło" #: contrib/admin/templates/registration/logged_out.html:8 msgid "Thanks for spending some quality time with the Web site today." -msgstr "" +msgstr "Dziękujemy za odwiedzenie serwisu." #: contrib/admin/templates/registration/logged_out.html:10 msgid "Log in again" @@ -878,19 +900,21 @@ msgstr "Zaloguj ponownie" #: contrib/admin/templates/registration/password_reset_done.html:6 #: contrib/admin/templates/registration/password_reset_done.html:10 msgid "Password reset successful" -msgstr "" +msgstr "Udane resetowanie hasła" #: contrib/admin/templates/registration/password_reset_done.html:12 msgid "" "We've e-mailed a new password to the e-mail address you submitted. You " "should be receiving it shortly." msgstr "" +"Nowe hasło zostało wysłane na podany adres email. Powinieneś " +"otrzymać je niebawem." #: contrib/admin/templates/registration/password_change_form.html:12 msgid "" "Please enter your old password, for security's sake, and then enter your new " "password twice so we can verify you typed it in correctly." -msgstr "" +msgstr "Podaj swoje stare hasło i dwa razy nowe." #: contrib/admin/templates/registration/password_change_form.html:17 msgid "Old password:" @@ -910,12 +934,12 @@ msgstr "Zmień hasło" #: contrib/admin/templates/registration/password_reset_email.html:2 msgid "You're receiving this e-mail because you requested a password reset" -msgstr "" +msgstr "Otrzymałeś email gdyż zarządałeś zresetowania hasła" #: contrib/admin/templates/registration/password_reset_email.html:3 #, python-format msgid "for your user account at %(site_name)s" -msgstr "" +msgstr "dla twojego konta użytkownika na stronie %(site_name)s" #: contrib/admin/templates/registration/password_reset_email.html:5 #, python-format @@ -924,11 +948,11 @@ msgstr "Twoje nowe hasło to: %(new_password)s" #: contrib/admin/templates/registration/password_reset_email.html:7 msgid "Feel free to change this password by going to this page:" -msgstr "" +msgstr "Możesz zmienić je na stronie:" #: contrib/admin/templates/registration/password_reset_email.html:11 msgid "Your username, in case you've forgotten:" -msgstr "" +msgstr "Twój login:" #: contrib/admin/templates/registration/password_reset_email.html:13 msgid "Thanks for using our site!" @@ -960,7 +984,7 @@ msgstr "" #: contrib/admin/templates/admin_doc/bookmarklets.html:19 msgid "Documentation for this page" -msgstr "" +msgstr "Dokumentacja dla tej strony" #: contrib/admin/templates/admin_doc/bookmarklets.html:20 msgid "" @@ -970,37 +994,39 @@ msgstr "" #: contrib/admin/templates/admin_doc/bookmarklets.html:22 msgid "Show object ID" -msgstr "" +msgstr "Pokaż ID obiektu" #: contrib/admin/templates/admin_doc/bookmarklets.html:23 msgid "" "Shows the content-type and unique ID for pages that represent a single " "object." msgstr "" +"Pokazuje typ i unikalne ID dla stron, które reprezentują " +"pojedynczy obiekt." #: contrib/admin/templates/admin_doc/bookmarklets.html:25 msgid "Edit this object (current window)" -msgstr "" +msgstr "Edytuj ten obiekt (bierzące okno)" #: contrib/admin/templates/admin_doc/bookmarklets.html:26 msgid "Jumps to the admin page for pages that represent a single object." -msgstr "" +msgstr "Przeskok do panelu admina dla stron reprezentujących pojedynczy obiekt" #: contrib/admin/templates/admin_doc/bookmarklets.html:28 msgid "Edit this object (new window)" -msgstr "" +msgstr "Edytuj ten obiekt (nowe onko)" #: contrib/admin/templates/admin_doc/bookmarklets.html:29 msgid "As above, but opens the admin page in a new window." -msgstr "" +msgstr "Jak wyżej, tyle że otwiera nowe okno." #: contrib/admin/templates/widget/date_time.html:3 msgid "Date:" -msgstr "data" +msgstr "Data:" #: contrib/admin/templates/widget/date_time.html:4 msgid "Time:" -msgstr "Czas" +msgstr "Czas:" #: contrib/admin/templates/widget/file.html:2 msgid "Currently:" @@ -1012,36 +1038,40 @@ msgstr "Zmień:" #: contrib/redirects/models.py:7 msgid "redirect from" -msgstr "" +msgstr "przekieruj z" #: contrib/redirects/models.py:8 msgid "" "This should be an absolute path, excluding the domain name. Example: '/" "events/search/'." msgstr "" +"Podaj pełną ścieżkę bez nazwy domeny. Przykład: '/" +"events/search/'." #: contrib/redirects/models.py:9 msgid "redirect to" -msgstr "" +msgstr "przekierowanie do" #: contrib/redirects/models.py:10 msgid "" "This can be either an absolute path (as above) or a full URL starting with " "'http://'." -msgstr "" +msgstr "Ścieżka jak wyżej lub pełny URL z http://" #: contrib/redirects/models.py:12 msgid "redirect" -msgstr "" +msgstr "przekieruj" #: contrib/redirects/models.py:13 msgid "redirects" -msgstr "" +msgstr "przekierowania" #: contrib/flatpages/models.py:8 msgid "" "Example: '/about/contact/'. Make sure to have leading and trailing slashes." msgstr "" +"Przykład: '/about/contact/'. Upewnij się że wpisałeś otwierający i zamykający slash." + #: contrib/flatpages/models.py:9 msgid "title" @@ -1053,11 +1083,11 @@ msgstr "zawartość" #: contrib/flatpages/models.py:11 msgid "enable comments" -msgstr "" +msgstr "włącz komentarze" #: contrib/flatpages/models.py:12 msgid "template name" -msgstr "" +msgstr "nazwa szablonu" #: contrib/flatpages/models.py:13 msgid "" @@ -1067,11 +1097,11 @@ msgstr "" #: contrib/flatpages/models.py:14 msgid "registration required" -msgstr "" +msgstr "wymagana rejestracja" #: contrib/flatpages/models.py:14 msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" +msgstr "Jeżeli zaznaczone - tylko zalogowani użytkownicy będą mogli zobaczyć stronę." #: contrib/flatpages/models.py:18 msgid "flat page" @@ -1091,31 +1121,31 @@ msgstr "" #: contrib/auth/models.py:17 msgid "permission" -msgstr "" +msgstr "uprawnienie" #: contrib/auth/models.py:18 contrib/auth/models.py:27 msgid "permissions" -msgstr "" +msgstr "uprawnienia" #: contrib/auth/models.py:29 msgid "group" -msgstr "" +msgstr "grupa" #: contrib/auth/models.py:30 contrib/auth/models.py:65 msgid "groups" -msgstr "" +msgstr "grupy" #: contrib/auth/models.py:55 msgid "username" -msgstr "" +msgstr "użytkownik" #: contrib/auth/models.py:56 msgid "first name" -msgstr "" +msgstr "Imię" #: contrib/auth/models.py:57 msgid "last name" -msgstr "" +msgstr "Nazwisko" #: contrib/auth/models.py:58 msgid "e-mail address" @@ -1127,15 +1157,15 @@ msgstr "hasło" #: contrib/auth/models.py:59 msgid "Use '[algo]$[salt]$[hexdigest]'" -msgstr "" +msgstr "Użyj '[algo]$[salt]$[hexdigest]'" #: contrib/auth/models.py:60 msgid "staff status" -msgstr "" +msgstr "stan w zespole" #: contrib/auth/models.py:60 msgid "Designates whether the user can log into this admin site." -msgstr "" +msgstr "Oznaczy czy użytkownik może zalogować się do panelu admina." #: contrib/auth/models.py:61 msgid "active" @@ -1143,7 +1173,7 @@ msgstr "aktywny" #: contrib/auth/models.py:62 msgid "superuser status" -msgstr "" +msgstr "Główny Administrator" #: contrib/auth/models.py:63 msgid "last login" @@ -1158,10 +1188,12 @@ msgid "" "In addition to the permissions manually assigned, this user will also get " "all permissions granted to each group he/she is in." msgstr "" +"Oprócz uprawnień przypisanych bezpośrednio użytkownikowi otrzyma on " +"uprawnienia grup, do których należy." #: contrib/auth/models.py:67 msgid "user permissions" -msgstr "" +msgstr "uprawnienia użytkownika" #: contrib/auth/models.py:70 #, fuzzy @@ -1175,62 +1207,64 @@ msgstr "Uzytkownicy" #: contrib/auth/models.py:76 msgid "Personal info" -msgstr "" +msgstr "Dane osobowe" #: contrib/auth/models.py:77 msgid "Permissions" -msgstr "" +msgstr "Uprawnienia" #: contrib/auth/models.py:78 msgid "Important dates" -msgstr "" +msgstr "Ważne daty" #: contrib/auth/models.py:79 msgid "Groups" -msgstr "" +msgstr "Grupy" #: contrib/auth/models.py:219 #, fuzzy msgid "message" -msgstr "Wiadomość" +msgstr "wiadomość" #: contrib/auth/forms.py:30 msgid "" "Your Web browser doesn't appear to have cookies enabled. Cookies are " "required for logging in." msgstr "" +"Twoja przeglądarka nie chce akceptować ciasteczek. Są one " +"wymagane do zalogowania się." #: contrib/contenttypes/models.py:25 msgid "python model class name" -msgstr "" +msgstr "nazwa pythonowa modelu klasy" #: contrib/contenttypes/models.py:28 msgid "content type" -msgstr "" +msgstr "typ zawartości" #: contrib/contenttypes/models.py:29 msgid "content types" -msgstr "" +msgstr "typy zawartości" #: contrib/sessions/models.py:35 msgid "session key" -msgstr "" +msgstr "klucz sesji" #: contrib/sessions/models.py:36 msgid "session data" -msgstr "" +msgstr "data sesji" #: contrib/sessions/models.py:37 msgid "expire date" -msgstr "" +msgstr "data wygaśnięcia sesji" #: contrib/sessions/models.py:41 msgid "session" -msgstr "" +msgstr "sesja" #: contrib/sessions/models.py:42 msgid "sessions" -msgstr "" +msgstr "sesje" #: contrib/sites/models.py:10 msgid "domain name" @@ -1250,15 +1284,15 @@ msgstr "strony" #: utils/translation.py:360 msgid "DATE_FORMAT" -msgstr "FORMAT_DATY" +msgstr "Y-m-d" #: utils/translation.py:361 msgid "DATETIME_FORMAT" -msgstr "" +msgstr "Y-m-d H:i:s" #: utils/translation.py:362 msgid "TIME_FORMAT" -msgstr "" +msgstr "H:i:s" #: utils/dates.py:6 msgid "Monday" @@ -1339,52 +1373,51 @@ msgstr "Grudzień" #: utils/dates.py:19 #, fuzzy msgid "jan" -msgstr "i" +msgstr "sty" #: utils/dates.py:19 msgid "feb" -msgstr "" +msgstr "luty" #: utils/dates.py:19 msgid "mar" -msgstr "" +msgstr "marz" #: utils/dates.py:19 msgid "apr" -msgstr "" +msgstr "kwie" #: utils/dates.py:19 -#, fuzzy msgid "may" -msgstr "dzień" +msgstr "maj" #: utils/dates.py:19 msgid "jun" -msgstr "" +msgstr "czerw" #: utils/dates.py:20 msgid "jul" -msgstr "" +msgstr "lip" #: utils/dates.py:20 msgid "aug" -msgstr "" +msgstr "sier" #: utils/dates.py:20 msgid "sep" -msgstr "" +msgstr "wrze" #: utils/dates.py:20 msgid "oct" -msgstr "" +msgstr "paź" #: utils/dates.py:20 msgid "nov" -msgstr "" +msgstr "list" #: utils/dates.py:20 msgid "dec" -msgstr "" +msgstr "gru" #: utils/dates.py:27 msgid "Jan." @@ -1396,7 +1429,7 @@ msgstr "Lut." #: utils/dates.py:28 msgid "Aug." -msgstr "Sier.." +msgstr "Sier." #: utils/dates.py:28 msgid "Sept." @@ -1415,31 +1448,28 @@ msgid "Dec." msgstr "Gru." #: utils/timesince.py:12 -#, fuzzy msgid "year" msgid_plural "years" msgstr[0] "rok" -msgstr[1] "rok" +msgstr[1] "lat" #: utils/timesince.py:13 -#, fuzzy msgid "month" msgid_plural "months" msgstr[0] "miesiąc" -msgstr[1] "miesiąc" +msgstr[1] "miesięcy" #: utils/timesince.py:14 msgid "week" msgid_plural "weeks" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "tydzień" +msgstr[1] "tygodni" #: utils/timesince.py:15 -#, fuzzy msgid "day" msgid_plural "days" msgstr[0] "dzień" -msgstr[1] "dzień" +msgstr[1] "dni" #: utils/timesince.py:16 #, fuzzy @@ -1449,11 +1479,10 @@ msgstr[0] "godzina" msgstr[1] "godzina" #: utils/timesince.py:17 -#, fuzzy msgid "minute" msgid_plural "minutes" msgstr[0] "minuta" -msgstr[1] "minuta" +msgstr[1] "minut" #: conf/global_settings.py:37 msgid "Bengali" @@ -1477,7 +1506,7 @@ msgstr "Niemiecki" #: conf/global_settings.py:42 msgid "Greek" -msgstr "" +msgstr "Grecki" #: conf/global_settings.py:43 msgid "English" @@ -1501,7 +1530,7 @@ msgstr "" #: conf/global_settings.py:48 msgid "Hebrew" -msgstr "" +msgstr "Hebrajski" #: conf/global_settings.py:49 msgid "Icelandic" @@ -1517,7 +1546,7 @@ msgstr "Japoński" #: conf/global_settings.py:52 msgid "Dutch" -msgstr "" +msgstr "Holenderski" #: conf/global_settings.py:53 msgid "Norwegian" @@ -1570,11 +1599,10 @@ msgid "This value must contain only letters, numbers and underscores." msgstr "To pole możei zawierać tylko litery, cyfry i podkreślenia" #: core/validators.py:64 -#, fuzzy msgid "" "This value must contain only letters, numbers, underscores, dashes or " "slashes." -msgstr "To pole może zawierać jedynie litery, cyfry, podkreślenia i slasze" +msgstr "To pole może zawierać jedynie litery, cyfry, podkreślenia i slasze." #: core/validators.py:72 msgid "Uppercase letters are not allowed here." @@ -1606,7 +1634,7 @@ msgstr "Tu mogą być tylko cyfry" #: core/validators.py:111 msgid "This value can't be comprised solely of digits." -msgstr "" +msgstr "To pole nie może zawierać jedynie cyfr." #: core/validators.py:116 msgid "Enter a whole number." @@ -1777,6 +1805,7 @@ msgid "" "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." msgstr "" + #: core/validators.py:462 #, python-format msgid "" diff --git a/django/conf/locale/ru/LC_MESSAGES/django.mo b/django/conf/locale/ru/LC_MESSAGES/django.mo Binary files differindex 6fb7a4929c..562996eee5 100644 --- a/django/conf/locale/ru/LC_MESSAGES/django.mo +++ b/django/conf/locale/ru/LC_MESSAGES/django.mo diff --git a/django/conf/locale/ru/LC_MESSAGES/django.po b/django/conf/locale/ru/LC_MESSAGES/django.po index a9901b5342..024b2bfc12 100644 --- a/django/conf/locale/ru/LC_MESSAGES/django.po +++ b/django/conf/locale/ru/LC_MESSAGES/django.po @@ -125,12 +125,10 @@ msgid "approved by staff" msgstr "одобрено администрацией" #: contrib/comments/models.py:176 -#, fuzzy msgid "free comment" msgstr "Свободный комментарий" #: contrib/comments/models.py:177 -#, fuzzy msgid "free comments" msgstr "Свободные комментарии" @@ -143,13 +141,12 @@ msgid "score date" msgstr "счёт времени" #: contrib/comments/models.py:237 -#, fuzzy msgid "karma score" -msgstr "счёт" +msgstr "Карма счёт" #: contrib/comments/models.py:238 msgid "karma scores" -msgstr "" +msgstr "Карма счета" #: contrib/comments/models.py:242 #, python-format @@ -172,12 +169,10 @@ msgid "flag date" msgstr "отметка даты" #: contrib/comments/models.py:268 -#, fuzzy msgid "user flag" msgstr "Признак пользователя" #: contrib/comments/models.py:269 -#, fuzzy msgid "user flags" msgstr "Признаки пользователя" @@ -191,14 +186,12 @@ msgid "deletion date" msgstr "дата удаления" #: contrib/comments/models.py:280 -#, fuzzy msgid "moderator deletion" -msgstr "Удалено модератором" +msgstr "Удаленно модератором" #: contrib/comments/models.py:281 -#, fuzzy msgid "moderator deletions" -msgstr "Удалено модератором" +msgstr "Удаления модератором" #: contrib/comments/models.py:285 #, python-format @@ -742,7 +735,7 @@ 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 @@ -818,11 +811,11 @@ 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." @@ -832,7 +825,7 @@ msgstr[1] "Пожалуйста исправьте ошибки ниже." #: contrib/admin/templates/admin/change_form.html:48 msgid "Ordering" -msgstr "" +msgstr "Очерёдность" #: contrib/admin/templates/admin/change_form.html:51 msgid "Order:" @@ -967,11 +960,11 @@ msgstr "Спасибо за посещение нашего сайта!" #: contrib/admin/templates/registration/password_reset_email.html:15 #, python-format msgid "The %(site_name)s team" -msgstr "Команда сайта di %(site_name)s" +msgstr "Команда сайта %(site_name)s" #: contrib/admin/templates/admin_doc/bookmarklets.html:3 msgid "Bookmarklets" -msgstr "" +msgstr "Закладки" #: contrib/admin/templates/admin_doc/bookmarklets.html:5 msgid "Documentation bookmarklets" @@ -1018,7 +1011,7 @@ msgstr "Редактировать данный обьект (в текущем #: contrib/admin/templates/admin_doc/bookmarklets.html:26 msgid "Jumps to the admin page for pages that represent a single object." -msgstr "" +msgstr "Перейти на страницу администратор для страниц представляющих один объект." #: contrib/admin/templates/admin_doc/bookmarklets.html:28 msgid "Edit this object (new window)" @@ -1129,22 +1122,18 @@ msgid "codename" msgstr "код" #: contrib/auth/models.py:17 -#, fuzzy msgid "permission" msgstr "Права" #: contrib/auth/models.py:18 contrib/auth/models.py:27 -#, fuzzy msgid "permissions" msgstr "Права" #: contrib/auth/models.py:29 -#, fuzzy msgid "group" msgstr "Группа" #: contrib/auth/models.py:30 contrib/auth/models.py:65 -#, fuzzy msgid "groups" msgstr "Группы" @@ -1205,17 +1194,14 @@ msgstr "" "все права группы, к которой он принадлежит." #: contrib/auth/models.py:67 -#, fuzzy msgid "user permissions" -msgstr "Права" +msgstr "Права пользователя" #: contrib/auth/models.py:70 -#, fuzzy msgid "user" msgstr "Пользователь" #: contrib/auth/models.py:71 -#, fuzzy msgid "users" msgstr "Пользователи" @@ -1236,7 +1222,6 @@ msgid "Groups" msgstr "Группы" #: contrib/auth/models.py:219 -#, fuzzy msgid "message" msgstr "Сообщение" @@ -1247,9 +1232,8 @@ msgid "" msgstr "" #: contrib/contenttypes/models.py:25 -#, fuzzy msgid "python model class name" -msgstr "имя python модуля" +msgstr "имя класса python модуля" #: contrib/contenttypes/models.py:28 msgid "content type" @@ -1384,54 +1368,52 @@ msgid "December" 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 -#, fuzzy 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." @@ -1476,8 +1458,8 @@ 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" @@ -1610,11 +1592,11 @@ msgid "This value must contain only letters, numbers and underscores." msgstr "Значение может содержать только буквы, цифры и подчеркивания." #: core/validators.py:64 -#, fuzzy msgid "" "This value must contain only letters, numbers, underscores, dashes or " "slashes." -msgstr "Значение может содержать только буквы, цифры и подчеркивания." +msgstr "Значение может содержать только буквы, цифры, подчеркивания, дифисы или " +"тере." #: core/validators.py:72 msgid "Uppercase letters are not allowed here." diff --git a/django/conf/locale/sk/LC_MESSAGES/django.mo b/django/conf/locale/sk/LC_MESSAGES/django.mo Binary files differindex bf2ff58d36..c6ac1c9612 100644 --- a/django/conf/locale/sk/LC_MESSAGES/django.mo +++ b/django/conf/locale/sk/LC_MESSAGES/django.mo diff --git a/django/conf/locale/sk/LC_MESSAGES/django.po b/django/conf/locale/sk/LC_MESSAGES/django.po index 7cedb35c8a..4e1dba2a49 100644 --- a/django/conf/locale/sk/LC_MESSAGES/django.po +++ b/django/conf/locale/sk/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2006-05-16 10:12+0200\n" +"POT-Creation-Date: 2006-05-27 07:31-0400\n" "PO-Revision-Date: 2005-11-10 23:22-0500\n" "Last-Translator: Vladimir Labath <vlado@labath.org>\n" "Language-Team: Slovak <sk@li.org>\n" @@ -16,6 +16,178 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +#: contrib/contenttypes/models.py:25 +msgid "python model class name" +msgstr "pythonové meno triedy modelu" + +#: contrib/contenttypes/models.py:28 +msgid "content type" +msgstr "typ obsahu" + +#: contrib/contenttypes/models.py:29 +msgid "content types" +msgstr "typy obsahu" + +#: contrib/auth/models.py:13 contrib/auth/models.py:26 +msgid "name" +msgstr "meno" + +#: contrib/auth/models.py:15 +msgid "codename" +msgstr "codename" + +#: contrib/auth/models.py:17 +msgid "permission" +msgstr "povolenie" + +#: contrib/auth/models.py:18 contrib/auth/models.py:27 +msgid "permissions" +msgstr "povolenia" + +#: contrib/auth/models.py:29 +msgid "group" +msgstr "skupina" + +#: contrib/auth/models.py:30 contrib/auth/models.py:65 +msgid "groups" +msgstr "skupiny" + +#: contrib/auth/models.py:55 +msgid "username" +msgstr "užívateľské meno" + +#: contrib/auth/models.py:56 +msgid "first name" +msgstr "krstné meno" + +#: contrib/auth/models.py:57 +msgid "last name" +msgstr "priezvisko" + +#: contrib/auth/models.py:58 +msgid "e-mail address" +msgstr "e-mailová adresa" + +#: contrib/auth/models.py:59 +msgid "password" +msgstr "heslo" + +#: contrib/auth/models.py:59 +msgid "Use '[algo]$[salt]$[hexdigest]'" +msgstr "Použi '[algo]$[salt]$[hexdigest]'" + +#: contrib/auth/models.py:60 +msgid "staff status" +msgstr "štatút zamestnanca" + +#: contrib/auth/models.py:60 +msgid "Designates whether the user can log into this admin site." +msgstr "Označenie, ak užívateľ má oprávnenie vstúpiť ako administrátor." + +#: contrib/auth/models.py:61 +msgid "active" +msgstr "aktívny" + +#: contrib/auth/models.py:62 +msgid "superuser status" +msgstr "štatút superužívateľa" + +#: contrib/auth/models.py:63 +msgid "last login" +msgstr "posledné prihlásenie" + +#: contrib/auth/models.py:64 +msgid "date joined" +msgstr "dátum registrácie" + +#: contrib/auth/models.py:66 +msgid "" +"In addition to the permissions manually assigned, this user will also get " +"all permissions granted to each group he/she is in." +msgstr "" +"Okrem ručne vložených povolení, tento uživateľ dostane všetky povolenia " +"skupin, v ktorých sa nachádza." + +#: contrib/auth/models.py:67 +msgid "user permissions" +msgstr "pridelené povolenia" + +#: contrib/auth/models.py:70 +msgid "user" +msgstr "uživateľ" + +#: contrib/auth/models.py:71 +msgid "users" +msgstr "užívatelia" + +#: contrib/auth/models.py:76 +msgid "Personal info" +msgstr "Osobné údaje" + +#: contrib/auth/models.py:77 +msgid "Permissions" +msgstr "Povolenia" + +#: contrib/auth/models.py:78 +msgid "Important dates" +msgstr "Dôležité údaje" + +#: contrib/auth/models.py:79 +msgid "Groups" +msgstr "Skupiny" + +#: contrib/auth/models.py:219 +msgid "message" +msgstr "zpráva" + +#: contrib/auth/forms.py:30 +msgid "" +"Your Web browser doesn't appear to have cookies enabled. Cookies are " +"required for logging in." +msgstr "" +"Vyzerá, že tvoj web prehliadač nedovoľuje prístup ku cookies. Cookies sú " +"nevýhnutné aby si sa mohol prihlásiť." + +#: contrib/auth/forms.py:36 contrib/auth/forms.py:41 +#: contrib/admin/views/decorators.py:9 +msgid "" +"Please enter a correct username and password. Note that both fields are case-" +"sensitive." +msgstr "" +"Prosím, vlož spávne meno užvateľa ako aj heslo. Pripomínam, že obe polia " +"rozlišujú malé a veľké písmena" + +#: contrib/redirects/models.py:7 +msgid "redirect from" +msgstr "presmerovaný z" + +#: contrib/redirects/models.py:8 +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"Tu by sa mala použiť absolútna cesta, bez domény. Napr.: '/events/search/'." + +#: contrib/redirects/models.py:9 +msgid "redirect to" +msgstr "presmerovaný na " + +#: contrib/redirects/models.py:10 +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Tu môže byť buď absolútna cesta (ako hore) alebo plné URL začínajúce s " +"'http://'." + +#: contrib/redirects/models.py:12 +msgid "redirect" +msgstr "presmerovanie" + +#: contrib/redirects/models.py:13 +msgid "redirects" +msgstr "presmerovania" + #: contrib/comments/models.py:67 contrib/comments/models.py:166 msgid "object ID" msgstr "objekt ID" @@ -73,7 +245,7 @@ msgstr "dátum/čas poslania" msgid "is public" msgstr "je zveréjnený" -#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289 +#: contrib/comments/models.py:85 contrib/admin/views/doc.py:292 msgid "IP address" msgstr "IP adresa" @@ -86,7 +258,7 @@ msgid "" "Check this box if the comment is inappropriate. A \"This comment has been " "removed\" message will be displayed instead." msgstr "" -"Ak je tento komentár nevhodný, tu ho poznačte. \"Tento komentár bol vymazaný" +"Ak je tento komentár nevhodný, tu ho poznač. \"Tento komentár bol vymazaný" "\" táto správa sa objaví namiesto neho." #: contrib/comments/models.py:91 @@ -278,6 +450,20 @@ msgstr "" msgid "The comment form didn't provide either 'preview' or 'post'" msgstr "Formulár komentára neposkytuje odpoveď buď 'prezri' alebo 'pošli'" +#: contrib/comments/templates/comments/freeform.html:4 +msgid "Your name:" +msgstr "Tvoje meno:" + +#: contrib/comments/templates/comments/freeform.html:5 +#: contrib/comments/templates/comments/form.html:27 +msgid "Comment:" +msgstr "Komentár:" + +#: contrib/comments/templates/comments/freeform.html:9 +#: contrib/comments/templates/comments/form.html:32 +msgid "Preview comment" +msgstr "Pozri komentár" + #: contrib/comments/templates/comments/form.html:6 #: contrib/comments/templates/comments/form.html:8 #: contrib/admin/templates/admin/login.html:17 @@ -296,9 +482,9 @@ msgstr "Zabudol si svoje heslo?" #: contrib/comments/templates/comments/form.html:8 #: contrib/admin/templates/admin/object_history.html:3 #: contrib/admin/templates/admin/change_list.html:5 +#: contrib/admin/templates/admin/change_form.html:10 #: contrib/admin/templates/admin/base.html:23 #: contrib/admin/templates/admin/delete_confirmation.html:3 -#: contrib/admin/templates/admin/change_form.html:10 #: contrib/admin/templates/registration/password_change_done.html:3 #: contrib/admin/templates/registration/password_change_form.html:3 #: contrib/admin/templates/admin_doc/bookmarklets.html:4 @@ -332,19 +518,93 @@ msgstr "Voliteľné" msgid "Post a photo" msgstr "Pošli foto" -#: contrib/comments/templates/comments/form.html:27 -#: contrib/comments/templates/comments/freeform.html:5 -msgid "Comment:" -msgstr "Komentár:" +#: contrib/flatpages/models.py:7 contrib/admin/views/doc.py:303 +msgid "URL" +msgstr "URL" -#: contrib/comments/templates/comments/form.html:32 -#: contrib/comments/templates/comments/freeform.html:9 -msgid "Preview comment" -msgstr "Pozri komentár" +#: contrib/flatpages/models.py:8 +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"Príklad: '/about/contact/'. Uisti sa, že máš vložené ako úvodné tak aj " +"záverečné lomítka." -#: contrib/comments/templates/comments/freeform.html:4 -msgid "Your name:" -msgstr "Vaše meno:" +#: contrib/flatpages/models.py:9 +msgid "title" +msgstr "názov" + +#: contrib/flatpages/models.py:10 +msgid "content" +msgstr "obsah" + +#: contrib/flatpages/models.py:11 +msgid "enable comments" +msgstr "povolené komentáre" + +#: contrib/flatpages/models.py:12 +msgid "template name" +msgstr "meno predlohy" + +#: contrib/flatpages/models.py:13 +msgid "" +"Example: 'flatpages/contact_page'. If this isn't provided, the system will " +"use 'flatpages/default'." +msgstr "" +"Príklad: 'flatpages/contact_page'. Ak sa toto nevykonalo, systém použije " +"'flatpages/default'." + +#: contrib/flatpages/models.py:14 +msgid "registration required" +msgstr "musíte byť zaregistrovaný" + +#: contrib/flatpages/models.py:14 +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" +"Ak je toto označené, potom len prihlásený užívateľ môže vidieť túto stránku." + +#: contrib/flatpages/models.py:18 +msgid "flat page" +msgstr "plochá stránka" + +#: contrib/flatpages/models.py:19 +msgid "flat pages" +msgstr "ploché stránky" + +#: contrib/sessions/models.py:35 +msgid "session key" +msgstr "kľúč sedenia" + +#: contrib/sessions/models.py:36 +msgid "session data" +msgstr "údaje sedenia" + +#: contrib/sessions/models.py:37 +msgid "expire date" +msgstr "dátum konca platnosti" + +#: contrib/sessions/models.py:41 +msgid "session" +msgstr "sedenie" + +#: contrib/sessions/models.py:42 +msgid "sessions" +msgstr "sedenia" + +#: contrib/sites/models.py:10 +msgid "domain name" +msgstr "meno domény" + +#: contrib/sites/models.py:11 +msgid "display name" +msgstr "zobrazené meno" + +#: contrib/sites/models.py:15 +msgid "site" +msgstr "web" + +#: contrib/sites/models.py:16 +msgid "sites" +msgstr "weby" #: contrib/admin/filterspecs.py:40 #, python-format @@ -410,7 +670,7 @@ msgstr "návestie udalosti" #: contrib/admin/models.py:22 msgid "change message" -msgstr "zmena zprávy" +msgstr "zmeň zprávu" #: contrib/admin/models.py:25 msgid "log entry" @@ -424,15 +684,6 @@ msgstr "záznamy priebehu" msgid "All dates" msgstr "Všetky dátumy" -#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36 -#: contrib/auth/forms.py:41 -msgid "" -"Please enter a correct username and password. Note that both fields are case-" -"sensitive." -msgstr "" -"Prosím, vložte spávne meno užvateľa ako aj heslo. Pripomínam, že obe " -"poliarozlišujú malé a veľké písmena" - #: contrib/admin/views/decorators.py:23 #: contrib/admin/templates/admin/login.html:25 msgid "Log in" @@ -443,16 +694,16 @@ msgid "" "Please log in again, because your session has expired. Don't worry: Your " "submission has been saved." msgstr "" -"Prosím prihlaste sa znovu, lebo čas vášho sedenia vypršal. Nemajte obavy: " -"Vaše údaje su uchované." +"Prosím prihlas sa znovu, lebo čas tvojho sedenia vypršal. Nemaj obavy: tvoje " +"údaje su uchované." #: contrib/admin/views/decorators.py:68 msgid "" "Looks like your browser isn't configured to accept cookies. Please enable " "cookies, reload this page, and try again." msgstr "" -"Vyzerá, že váš prehliadač nemá povolené cookies. Prosím povoľte cookies, " -"znovu načítajte túto stránku a skúste činnosť znovu." +"Vyzerá, že tvoj prehliadač nemá povolené cookies. Prosím, povoľ cookies, " +"znovu načítaj túto stránku a skús činnosť znovu." #: contrib/admin/views/decorators.py:82 msgid "Usernames cannot contain the '@' character." @@ -461,7 +712,7 @@ msgstr "Meno užívateľa nemože obsahovať znak '@' ." #: contrib/admin/views/decorators.py:84 #, python-format msgid "Your e-mail address is not your username. Try '%s' instead." -msgstr "Vaša e-mailova adresa nie je vaše užívateľské meno. Skúste '%s'." +msgstr "Tvoja e-mailova adresa nie je tvoje užívateľské meno. Skús '%s'." #: contrib/admin/views/main.py:226 msgid "Site administration" @@ -474,12 +725,12 @@ msgstr "Objekt %(name)s \"%(obj)s\" bol úspešne pridaný." #: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348 msgid "You may edit it again below." -msgstr "Môžete urobiť zmeny zase nižšie." +msgstr "Môžeš urobiť zmeny zase nižšie." #: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357 #, python-format msgid "You may add another %s below." -msgstr "Môžete pridať ďalší %s nižšie." +msgstr "Môžeš pridať ďalší %s nižšie." #: contrib/admin/views/main.py:290 #, python-format @@ -520,7 +771,7 @@ msgstr "Objekt %(name)s \"%(obj)s\" boli úspešne zmenený." msgid "" "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." msgstr "" -"Objekt %(name)s \"%(obj)s\" bol úspešne zmenený. Ďalšie zmeny môžete urobiť " +"Objekt %(name)s \"%(obj)s\" bol úspešne zmenený. Ďalšie zmeny môžeš urobiť " "zase nižšie." #: contrib/admin/views/main.py:392 @@ -545,12 +796,12 @@ msgstr "Objekt %(name)s \"%(obj)s\" bol úspešne vymazaný." #: contrib/admin/views/main.py:511 msgid "Are you sure?" -msgstr "Ste si istý?" +msgstr "Si si istý?" #: contrib/admin/views/main.py:533 #, python-format msgid "Change history: %s" -msgstr "Zmena histórie:" +msgstr "Zmeň históriu: %s" #: contrib/admin/views/main.py:565 #, python-format @@ -560,84 +811,97 @@ msgstr "Výber %s" #: contrib/admin/views/main.py:565 #, python-format msgid "Select %s to change" -msgstr "Výber %s na zmenu" +msgstr "Ktorý %s sa má zmeniť?" -#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286 -#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294 -#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297 +#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:289 +#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:297 +#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:300 msgid "Integer" msgstr "Celočíselná hodnota" -#: contrib/admin/views/doc.py:278 +#: contrib/admin/views/doc.py:280 msgid "Boolean (Either True or False)" msgstr "Logická hodnota (buď True alebo False)" -#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296 +#: contrib/admin/views/doc.py:281 contrib/admin/views/doc.py:299 #, python-format msgid "String (up to %(maxlength)s)" msgstr "Dĺžka reťazca (maximálne do %(maxlength)s)" -#: contrib/admin/views/doc.py:280 +#: contrib/admin/views/doc.py:282 msgid "Comma-separated integers" msgstr "Čiarka oddeľuje celé čísla" -#: contrib/admin/views/doc.py:281 +#: contrib/admin/views/doc.py:283 msgid "Date (without time)" msgstr "Dátum (bez času)" -#: contrib/admin/views/doc.py:282 +#: contrib/admin/views/doc.py:284 msgid "Date (with time)" msgstr "Dátum ( a čas)" -#: contrib/admin/views/doc.py:283 +#: contrib/admin/views/doc.py:285 msgid "E-mail address" msgstr "E-mailová adresa" -#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287 +#: contrib/admin/views/doc.py:286 contrib/admin/views/doc.py:287 +#: contrib/admin/views/doc.py:290 msgid "File path" msgstr "Cesta k súboru" -#: contrib/admin/views/doc.py:285 +#: contrib/admin/views/doc.py:288 msgid "Decimal number" msgstr "Desiatkové číslo" -#: contrib/admin/views/doc.py:291 +#: contrib/admin/views/doc.py:294 msgid "Boolean (Either True, False or None)" msgstr "Logická hodnota (buď True, False alebo None)" -#: contrib/admin/views/doc.py:292 +#: contrib/admin/views/doc.py:295 msgid "Relation to parent model" msgstr "Má vzťah na rodičovský model" -#: contrib/admin/views/doc.py:293 +#: contrib/admin/views/doc.py:296 msgid "Phone number" msgstr "Číslo telefónu" -#: contrib/admin/views/doc.py:298 +#: contrib/admin/views/doc.py:301 msgid "Text" msgstr "Text" -#: contrib/admin/views/doc.py:299 +#: contrib/admin/views/doc.py:302 msgid "Time" msgstr "Čas" -#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7 -msgid "URL" -msgstr "URL" - -#: contrib/admin/views/doc.py:301 +#: contrib/admin/views/doc.py:304 msgid "U.S. state (two uppercase letters)" msgstr "U.S. štát (dve veľké písmena)" -#: contrib/admin/views/doc.py:302 +#: contrib/admin/views/doc.py:305 msgid "XML text" msgstr "XML text" +#: contrib/admin/templates/widget/file.html:2 +msgid "Currently:" +msgstr "Aktuálny:" + +#: contrib/admin/templates/widget/file.html:3 +msgid "Change:" +msgstr "Zmeň:" + +#: contrib/admin/templates/widget/date_time.html:3 +msgid "Date:" +msgstr "Dátum:" + +#: contrib/admin/templates/widget/date_time.html:4 +msgid "Time:" +msgstr "Čas:" + #: contrib/admin/templates/admin/object_history.html:3 #: contrib/admin/templates/admin/change_list.html:5 +#: contrib/admin/templates/admin/change_form.html:10 #: contrib/admin/templates/admin/base.html:23 #: contrib/admin/templates/admin/delete_confirmation.html:3 -#: contrib/admin/templates/admin/change_form.html:10 #: contrib/admin/templates/registration/password_change_done.html:3 #: contrib/admin/templates/registration/password_change_form.html:3 #: contrib/admin/templates/admin_doc/bookmarklets.html:3 @@ -646,9 +910,9 @@ msgstr "Dokumentácia" #: contrib/admin/templates/admin/object_history.html:3 #: contrib/admin/templates/admin/change_list.html:5 +#: contrib/admin/templates/admin/change_form.html:10 #: contrib/admin/templates/admin/base.html:23 #: contrib/admin/templates/admin/delete_confirmation.html:3 -#: contrib/admin/templates/admin/change_form.html:10 #: contrib/admin/templates/registration/password_change_done.html:3 #: contrib/admin/templates/registration/password_change_form.html:3 #: contrib/admin/templates/admin_doc/bookmarklets.html:4 @@ -662,14 +926,14 @@ msgstr "Dokumentácia" #: contrib/admin/templates/admin_doc/index.html:4 #: contrib/admin/templates/admin_doc/model_index.html:5 msgid "Change password" -msgstr "Zmena hesla" +msgstr "Zmeň heslo" #: contrib/admin/templates/admin/object_history.html:5 -#: contrib/admin/templates/admin/500.html:4 #: contrib/admin/templates/admin/change_list.html:6 +#: contrib/admin/templates/admin/500.html:4 +#: contrib/admin/templates/admin/change_form.html:13 #: contrib/admin/templates/admin/base.html:28 #: contrib/admin/templates/admin/delete_confirmation.html:6 -#: contrib/admin/templates/admin/change_form.html:13 #: contrib/admin/templates/registration/password_change_done.html:4 #: contrib/admin/templates/registration/password_reset_form.html:4 #: contrib/admin/templates/registration/logged_out.html:4 @@ -708,13 +972,15 @@ msgstr "" "Tento object nemá históriu zmien. Možno nebol pridaný prostredníctvom tohoto " "web admina" -#: contrib/admin/templates/admin/base_site.html:4 -msgid "Django site admin" -msgstr "Django web admin" +#: contrib/admin/templates/admin/change_list.html:11 +#, python-format +msgid "Add %(name)s" +msgstr "Pridaj %(name)s" -#: contrib/admin/templates/admin/base_site.html:7 -msgid "Django administration" -msgstr "Administrácia Django" +#: contrib/admin/templates/admin/filter.html:2 +#, python-format +msgid " By %(title)s " +msgstr " Od %(title)s " #: contrib/admin/templates/admin/500.html:4 msgid "Server error" @@ -733,22 +999,25 @@ msgid "" "There's been an error. It's been reported to the site administrators via e-" "mail and should be fixed shortly. Thanks for your patience." msgstr "" -"Vznikla chyba. Prostredníctvom e-mailu bol o nej informovaný správca a " -"chyba by mala byť o chviľu odstránená. Ďakujeme za vašu trpezlivosť." +"Vznikla chyba. Prostredníctvom e-mailu bol o nej informovaný správca a táto " +"by mala byť o chviľu odstránená. Ďakujeme za tvoju trpezlivosť." -#: contrib/admin/templates/admin/404.html:4 -#: contrib/admin/templates/admin/404.html:8 -msgid "Page not found" -msgstr "Stránka nebola nájdená" +#: contrib/admin/templates/admin/search_form.html:8 +msgid "Go" +msgstr "Choď" -#: contrib/admin/templates/admin/404.html:10 -msgid "We're sorry, but the requested page could not be found." -msgstr "Ľutujeme, ale požadovaná stránka nebola nájdená." +#: contrib/admin/templates/admin/base_site.html:4 +msgid "Django site admin" +msgstr "Django web admin" + +#: contrib/admin/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "Administrácia Django" #: contrib/admin/templates/admin/index.html:17 #, python-format msgid "Models available in the %(name)s application." -msgstr "" +msgstr "Model je prístupný v %(name)s aplikácií." #: contrib/admin/templates/admin/index.html:28 #: contrib/admin/templates/admin/change_form.html:15 @@ -761,7 +1030,7 @@ msgstr "Zmeň" #: contrib/admin/templates/admin/index.html:44 msgid "You don't have permission to edit anything." -msgstr "Nemáte povolenie na zmeny ." +msgstr "Nemáš povolenie na zmeny ." #: contrib/admin/templates/admin/index.html:52 msgid "Recent Actions" @@ -775,14 +1044,36 @@ msgstr "Moje udalosti" msgid "None available" msgstr "Nepovolené" -#: contrib/admin/templates/admin/change_list.html:11 -#, python-format -msgid "Add %(name)s" -msgstr "Pridaj %(name)s" +#: contrib/admin/templates/admin/404.html:4 +#: contrib/admin/templates/admin/404.html:8 +msgid "Page not found" +msgstr "Stránka nebola nájdená" + +#: contrib/admin/templates/admin/404.html:10 +msgid "We're sorry, but the requested page could not be found." +msgstr "Ľutujeme, ale požadovaná stránka nebola nájdená." #: contrib/admin/templates/admin/login.html:22 msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?" -msgstr "Zabudli ste<a href=\"/password_reset/\"> vaše heslo</a>?" +msgstr "Zabudol si<a href=\"/password_reset/\"> svoje heslo</a>?" + +#: contrib/admin/templates/admin/change_form.html:21 +msgid "View on site" +msgstr "Pozri na webe" + +#: contrib/admin/templates/admin/change_form.html:30 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Oprav chybu, čo je nižšie, prosím." +msgstr[1] "Oprav chyby, čo sú nižšie, prosím." + +#: contrib/admin/templates/admin/change_form.html:48 +msgid "Ordering" +msgstr "Určenie" + +#: contrib/admin/templates/admin/change_form.html:51 +msgid "Order:" +msgstr "Poradie:" #: contrib/admin/templates/admin/base.html:23 msgid "Welcome," @@ -800,8 +1091,8 @@ msgid "" "objects, but your account doesn't have permission to delete the following " "types of objects:" msgstr "" -"Vymazaním objektu %(object_name)s '%(object)s' môžete spôsobiť vymazanie " -"súvisiacich objektov, ale váš účet nemá povolenie na mazanie nasledujúcich " +"Vymazaním objektu %(object_name)s '%(object)s' môžeš spôsobiť vymazanie " +"súvisiacich objektov, ale tvoj účet nemá povolenie na mazanie nasledujúcich " "typov objektov:" #: contrib/admin/templates/admin/delete_confirmation.html:21 @@ -810,40 +1101,13 @@ msgid "" "Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of " "the following related items will be deleted:" msgstr "" -"Ste si istý, že chcete vymazať %(object_name)s \"%(object)s\"? Všetky " +"Si si istý, že chceš vymazať %(object_name)s \"%(object)s\"? Všetky " "nasledujúce objekty budú tiež vymazané :" #: contrib/admin/templates/admin/delete_confirmation.html:26 msgid "Yes, I'm sure" msgstr "Ano, som si istý" -#: contrib/admin/templates/admin/filter.html:2 -#, python-format -msgid " By %(title)s " -msgstr " Od %(title)s " - -#: contrib/admin/templates/admin/search_form.html:8 -msgid "Go" -msgstr "Choď" - -#: contrib/admin/templates/admin/change_form.html:21 -msgid "View on site" -msgstr "Pozri na webe" - -#: contrib/admin/templates/admin/change_form.html:30 -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Opravte chybu, čo je nižšie, prosím." -msgstr[1] "Opravte chyby, čo sú nižšie, prosím." - -#: contrib/admin/templates/admin/change_form.html:48 -msgid "Ordering" -msgstr "Určenie" - -#: contrib/admin/templates/admin/change_form.html:51 -msgid "Order:" -msgstr "Poradie:" - #: contrib/admin/templates/admin/submit_line.html:4 msgid "Save as new" msgstr "Zapísať ako nový" @@ -865,7 +1129,7 @@ msgstr "Zápis" #: contrib/admin/templates/registration/password_change_form.html:6 #: contrib/admin/templates/registration/password_change_form.html:10 msgid "Password change" -msgstr "Zmena hesla" +msgstr "Zmeň heslo" #: contrib/admin/templates/registration/password_change_done.html:6 #: contrib/admin/templates/registration/password_change_done.html:10 @@ -874,21 +1138,21 @@ msgstr "Heslo bolo úspešne zmenené" #: contrib/admin/templates/registration/password_change_done.html:12 msgid "Your password was changed." -msgstr "Vaše heslo bolo zmenené." +msgstr "Tvoje heslo bolo zmenené." #: contrib/admin/templates/registration/password_reset_form.html:4 #: contrib/admin/templates/registration/password_reset_form.html:6 #: contrib/admin/templates/registration/password_reset_form.html:10 #: contrib/admin/templates/registration/password_reset_done.html:4 msgid "Password reset" -msgstr "Obnova hesla" +msgstr "Generácia nového hesla" #: contrib/admin/templates/registration/password_reset_form.html:12 msgid "" "Forgotten your password? Enter your e-mail address below, and we'll reset " "your password and e-mail the new one to you." msgstr "" -"Zabudli ste vaše heslo? Vložte nižšie vašu e-mail adresu, a nové heslo vám " +"Zabudol si svoje heslo? Vlož nižšie tvoju e-mail adresu, a nové heslo ti " "bude na ňu zaslané ." #: contrib/admin/templates/registration/password_reset_form.html:16 @@ -901,23 +1165,23 @@ msgstr "Obnova môjho hesla" #: contrib/admin/templates/registration/logged_out.html:8 msgid "Thanks for spending some quality time with the Web site today." -msgstr "Ďakujeme vám, za stráveny čas na našej stránke." +msgstr "Ďakujeme ti, za stráveny čas na našej stránke." #: contrib/admin/templates/registration/logged_out.html:10 msgid "Log in again" -msgstr "Prihláste sa znovu" +msgstr "Prihlás sa znovu" #: contrib/admin/templates/registration/password_reset_done.html:6 #: contrib/admin/templates/registration/password_reset_done.html:10 msgid "Password reset successful" -msgstr "Heslo bolo úspešne obnovené" +msgstr "Heslo bolo úspešne vygenerované" #: contrib/admin/templates/registration/password_reset_done.html:12 msgid "" "We've e-mailed a new password to the e-mail address you submitted. You " "should be receiving it shortly." msgstr "" -"Poslali sme vám, nové heslo na vami uvedenú emailovú adresu.Mali by ste ho " +"Poslali sme ti, nové heslo na tebou uvedenú emailovú adresu. Mal by si ho " "dostať čo najskôr." #: contrib/admin/templates/registration/password_change_form.html:12 @@ -925,7 +1189,7 @@ msgid "" "Please enter your old password, for security's sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"Kvôli bezpečnosti vložte prosím vaše staré heslo, a potom dvakrát vaše nové " +"Kvôli bezpečnosti vlož prosím tvoje staré heslo, a potom dvakrát tvoje nové " "heslo, tým môžeme skontrolovať jeho správnosť." #: contrib/admin/templates/registration/password_change_form.html:17 @@ -942,33 +1206,33 @@ msgstr "Potvrdenie hesla:" #: contrib/admin/templates/registration/password_change_form.html:23 msgid "Change my password" -msgstr "Zmena môjho hesla" +msgstr "Zmeň svoje heslo" #: contrib/admin/templates/registration/password_reset_email.html:2 msgid "You're receiving this e-mail because you requested a password reset" -msgstr "Dostali ste túto správu preto, lebo ste požadovali obnoviť vaše heslo" +msgstr "Dostal si túto správu preto, lebo si požadoval vygenerovať tvoje heslo" #: contrib/admin/templates/registration/password_reset_email.html:3 #, python-format msgid "for your user account at %(site_name)s" -msgstr "pre váš užívateľský účet na %(site_name)s" +msgstr "pre tvoj užívateľský účet na %(site_name)s" #: contrib/admin/templates/registration/password_reset_email.html:5 #, python-format msgid "Your new password is: %(new_password)s" -msgstr "Vaše nové heslo je: %(new_password)s" +msgstr "Tvoje nové heslo je: %(new_password)s" #: contrib/admin/templates/registration/password_reset_email.html:7 msgid "Feel free to change this password by going to this page:" -msgstr "Môžete zmeniť toto heslo na nasledujúcej stránke:" +msgstr "Môžeš zmeniť toto heslo na nasledujúcej stránke:" #: contrib/admin/templates/registration/password_reset_email.html:11 msgid "Your username, in case you've forgotten:" -msgstr "Vaše užívateľské meno, ak ste ho zabudli:" +msgstr "Tvoje užívateľské meno, ak si ho zabudol:" #: contrib/admin/templates/registration/password_reset_email.html:13 msgid "Thanks for using our site!" -msgstr "Ďakujeme, že používate naše stránky!" +msgstr "Ďakujeme, že používaš naše stránky!" #: contrib/admin/templates/registration/password_reset_email.html:15 #, python-format @@ -994,15 +1258,15 @@ msgid "" "your computer is \"internal\").</p>\n" msgstr "" "\n" -"<p class=\"help\">Na inštaláciu záložiek, potiahnite linku do vášho " +"<p class=\"help\">Na inštaláciu záložiek, potiahni linku do tvojho " "bookmarks\n" -"toolbar, alebo kliknite pravou myšou na linku a pridajte ju do vášho " +"toolbar, alebo klikni pravou myšou na linku a pridaj ju do tvojho " "bookmarks.\n" -"Teraz si môžete vybrať záložku pre ľubovoľnú stránku na webe. Poznámka:\n" -"niektoré záložky vyžadujú aby ste prezerali web z počítača označeného \n" -"ako \"internal\" (opýtajte sa vášho systémového administrátora ak nie ste si " +"Teraz si môžeš vybrať záložku pre ľubovoľnú stránku na webe. Poznámka:\n" +"niektoré záložky vyžadujú aby si prezeral web z počítača označeného \n" +"ako \"internal\" (opýtaj sa vášho systémového administrátora ak si si nie " "istý/á, \n" -"že váš počítač je označený ako \"internal\").</p>\n" +"že tvoj počítač je označený ako \"internal\").</p>\n" #: contrib/admin/templates/admin_doc/bookmarklets.html:19 msgid "Documentation for this page" @@ -1038,284 +1302,21 @@ msgstr "Skoč na stránku admina, ktorá zastupuje jednoduchý objekt" #: contrib/admin/templates/admin_doc/bookmarklets.html:28 msgid "Edit this object (new window)" -msgstr "Editujte tento objekt (nové okno)" +msgstr "Edituj tento objekt (nové okno)" #: contrib/admin/templates/admin_doc/bookmarklets.html:29 msgid "As above, but opens the admin page in a new window." msgstr "Ako vyššie, ale stranka admina sa otvorí v novom okne." -#: contrib/admin/templates/widget/date_time.html:3 -msgid "Date:" -msgstr "Dátum:" - -#: contrib/admin/templates/widget/date_time.html:4 -msgid "Time:" -msgstr "Čas" - -#: contrib/admin/templates/widget/file.html:2 -msgid "Currently:" -msgstr "Aktuálny:" - -#: contrib/admin/templates/widget/file.html:3 -msgid "Change:" -msgstr "Zmeň:" - -#: contrib/redirects/models.py:7 -msgid "redirect from" -msgstr "presmerovaný z" - -#: contrib/redirects/models.py:8 -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"Tu by sa mala použiť absolútna cesta, bez domény. Napr.: '/events/search/'." - -#: contrib/redirects/models.py:9 -msgid "redirect to" -msgstr "presmerovaný na " - -#: contrib/redirects/models.py:10 -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"Tu môže byť buď absolútna cesta (ako hore) alebo plné URL začínajúce s " -"'http://'." - -#: contrib/redirects/models.py:12 -msgid "redirect" -msgstr "presmerovanie" - -#: contrib/redirects/models.py:13 -msgid "redirects" -msgstr "presmerovania" - -#: contrib/flatpages/models.py:8 -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"Príklad: '/about/contact/'. Uistite sa, že máte vložené ako úvodné tak aj " -"záverečné lomítka." - -#: contrib/flatpages/models.py:9 -msgid "title" -msgstr "názov" - -#: contrib/flatpages/models.py:10 -msgid "content" -msgstr "obsah" - -#: contrib/flatpages/models.py:11 -msgid "enable comments" -msgstr "povolené komentáre" - -#: contrib/flatpages/models.py:12 -msgid "template name" -msgstr "meno predlohy" - -#: contrib/flatpages/models.py:13 -msgid "" -"Example: 'flatpages/contact_page'. If this isn't provided, the system will " -"use 'flatpages/default'." -msgstr "" -"Príklad: 'flatpages/contact_page'. Ak sa toto nevykonalo, systém použije " -"'flatpages/default'." - -#: contrib/flatpages/models.py:14 -msgid "registration required" -msgstr "musíte byť zaregistrovaný" - -#: contrib/flatpages/models.py:14 -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Ak je toto označené, potom len prihlásený užívateľ môže vidieť túto stránku." - -#: contrib/flatpages/models.py:18 -msgid "flat page" -msgstr "plochá stránka" - -#: contrib/flatpages/models.py:19 -msgid "flat pages" -msgstr "ploché stránky" - -#: contrib/auth/models.py:13 contrib/auth/models.py:26 -msgid "name" -msgstr "meno" - -#: contrib/auth/models.py:15 -msgid "codename" -msgstr "codename" - -#: contrib/auth/models.py:17 -msgid "permission" -msgstr "povolenie" - -#: contrib/auth/models.py:18 contrib/auth/models.py:27 -msgid "permissions" -msgstr "povolenia" - -#: contrib/auth/models.py:29 -msgid "group" -msgstr "skupina" - -#: contrib/auth/models.py:30 contrib/auth/models.py:65 -msgid "groups" -msgstr "skupiny" - -#: contrib/auth/models.py:55 -msgid "username" -msgstr "užívateľské meno" - -#: contrib/auth/models.py:56 -msgid "first name" -msgstr "krstné meno" - -#: contrib/auth/models.py:57 -msgid "last name" -msgstr "priezvisko" - -#: contrib/auth/models.py:58 -msgid "e-mail address" -msgstr "e-mailová adresa" - -#: contrib/auth/models.py:59 -msgid "password" -msgstr "heslo" - -#: contrib/auth/models.py:59 -msgid "Use '[algo]$[salt]$[hexdigest]'" -msgstr "Použi '[algo]$[salt]$[hexdigest]'" - -#: contrib/auth/models.py:60 -msgid "staff status" -msgstr "štatút zamestnanca" - -#: contrib/auth/models.py:60 -msgid "Designates whether the user can log into this admin site." -msgstr "Označenie, ak užívateľ má oprávnenie vstúpiť ako administrátor." - -#: contrib/auth/models.py:61 -msgid "active" -msgstr "aktívny" - -#: contrib/auth/models.py:62 -msgid "superuser status" -msgstr "štatút superužívateľa" - -#: contrib/auth/models.py:63 -msgid "last login" -msgstr "posledné prihlásenie" - -#: contrib/auth/models.py:64 -msgid "date joined" -msgstr "dátum registrácie" - -#: contrib/auth/models.py:66 -msgid "" -"In addition to the permissions manually assigned, this user will also get " -"all permissions granted to each group he/she is in." -msgstr "" -"Okrem ručne vložených povolení, tento uživateľ dostane všetky povolenia " -"skupin, v ktorých sa nachádza." - -#: contrib/auth/models.py:67 -msgid "user permissions" -msgstr "pridelené povolenia" - -#: contrib/auth/models.py:70 -msgid "user" -msgstr "Uživateľ" - -#: contrib/auth/models.py:71 -msgid "users" -msgstr "Užívatelia" - -#: contrib/auth/models.py:76 -msgid "Personal info" -msgstr "Osobné údaje" - -#: contrib/auth/models.py:77 -msgid "Permissions" -msgstr "Povolenia" - -#: contrib/auth/models.py:78 -msgid "Important dates" -msgstr "Dôležité údaje" - -#: contrib/auth/models.py:79 -msgid "Groups" -msgstr "Skupiny" - -#: contrib/auth/models.py:219 -msgid "message" -msgstr "zpráva" - -#: contrib/auth/forms.py:30 -msgid "" -"Your Web browser doesn't appear to have cookies enabled. Cookies are " -"required for logging in." -msgstr "" -"Vyzerá, že váš web prehliadač nedovoľuje prístup ku cookies. Cookies sú " -"nevýhnutné aby ste sa mohli prilásiť." - -#: contrib/contenttypes/models.py:25 -msgid "python model class name" -msgstr "pythonové meno triedy modelu" - -#: contrib/contenttypes/models.py:28 -msgid "content type" -msgstr "typ obsahu" - -#: contrib/contenttypes/models.py:29 -msgid "content types" -msgstr "typy obsahu" - -#: contrib/sessions/models.py:35 -msgid "session key" -msgstr "kľúč sedenia" - -#: contrib/sessions/models.py:36 -msgid "session data" -msgstr "údaje sedenia" - -#: contrib/sessions/models.py:37 -msgid "expire date" -msgstr "dátum konca platnosti" - -#: contrib/sessions/models.py:41 -msgid "session" -msgstr "sedenie" - -#: contrib/sessions/models.py:42 -msgid "sessions" -msgstr "sedenia" - -#: contrib/sites/models.py:10 -msgid "domain name" -msgstr "meno domény" - -#: contrib/sites/models.py:11 -msgid "display name" -msgstr "zobrazené meno" - -#: contrib/sites/models.py:15 -msgid "site" -msgstr "web" - -#: contrib/sites/models.py:16 -msgid "sites" -msgstr "weby" - -#: utils/translation.py:360 +#: utils/translation.py:363 msgid "DATE_FORMAT" msgstr "" -#: utils/translation.py:361 +#: utils/translation.py:364 msgid "DATETIME_FORMAT" msgstr "" -#: utils/translation.py:362 +#: utils/translation.py:365 msgid "TIME_FORMAT" msgstr "" @@ -1397,7 +1398,7 @@ msgstr "December" #: utils/dates.py:19 msgid "jan" -msgstr "a" +msgstr "" #: utils/dates.py:19 msgid "feb" @@ -1529,7 +1530,7 @@ msgstr "Nemecký" #: conf/global_settings.py:42 msgid "Greek" -msgstr "" +msgstr "Grécký" #: conf/global_settings.py:43 msgid "English" @@ -1540,81 +1541,177 @@ msgid "Spanish" msgstr "Španielsky" #: conf/global_settings.py:45 +msgid "Argentinean Spanish" +msgstr "Argentínska španielčina" + +#: conf/global_settings.py:46 msgid "French" msgstr "Francúzsky" -#: conf/global_settings.py:46 +#: conf/global_settings.py:47 msgid "Galician" msgstr "Galicijský" -#: conf/global_settings.py:47 +#: conf/global_settings.py:48 msgid "Hungarian" -msgstr "" +msgstr "Maďarský" -#: conf/global_settings.py:48 +#: conf/global_settings.py:49 msgid "Hebrew" -msgstr "" +msgstr "Hebrejský" -#: conf/global_settings.py:49 +#: conf/global_settings.py:50 msgid "Icelandic" msgstr "Islandský" -#: conf/global_settings.py:50 +#: conf/global_settings.py:51 msgid "Italian" msgstr "Taliansky" -#: conf/global_settings.py:51 +#: conf/global_settings.py:52 msgid "Japanese" msgstr "Japónsky" -#: conf/global_settings.py:52 +#: conf/global_settings.py:53 msgid "Dutch" msgstr "Holándsky" -#: conf/global_settings.py:53 +#: conf/global_settings.py:54 msgid "Norwegian" msgstr "Nórsky" -#: conf/global_settings.py:54 +#: conf/global_settings.py:55 msgid "Brazilian" msgstr "Brazílsky" -#: conf/global_settings.py:55 +#: conf/global_settings.py:56 msgid "Romanian" msgstr "Rumúnsky" -#: conf/global_settings.py:56 +#: conf/global_settings.py:57 msgid "Russian" msgstr "Ruský" -#: conf/global_settings.py:57 +#: conf/global_settings.py:58 msgid "Slovak" msgstr "Slovenský" -#: conf/global_settings.py:58 +#: conf/global_settings.py:59 msgid "Slovenian" msgstr "Slovinský" -#: conf/global_settings.py:59 +#: conf/global_settings.py:60 msgid "Serbian" msgstr "Srbský" -#: conf/global_settings.py:60 +#: conf/global_settings.py:61 msgid "Swedish" msgstr "Švédsky" -#: conf/global_settings.py:61 +#: conf/global_settings.py:62 msgid "Ukrainian" msgstr "Ukrajínsky" -#: conf/global_settings.py:62 +#: conf/global_settings.py:63 msgid "Simplified Chinese" msgstr "Zjednodušená činština " -#: conf/global_settings.py:63 +#: conf/global_settings.py:64 msgid "Traditional Chinese" msgstr "Tradičná čínština" +#: db/models/manipulators.py:302 +#, python-format +msgid "%(object)s with this %(type)s already exists for the given %(field)s." +msgstr "%(object)s s %(type)s už existuje pre prvok %(field)s." + +#: db/models/fields/__init__.py:40 +#, python-format +msgid "%(optname)s with this %(fieldname)s already exists." +msgstr "%(optname)s s %(fieldname)s už existuje." + +#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265 +#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553 +#: forms/__init__.py:346 +msgid "This field is required." +msgstr "Toto pole je nevyhnutné." + +#: db/models/fields/__init__.py:337 +msgid "This value must be an integer." +msgstr "Táto hodnota musí byť integer." + +#: db/models/fields/__init__.py:369 +msgid "This value must be either True or False." +msgstr "Táto hodnota musí byť buď True alebo False." + +#: db/models/fields/__init__.py:385 +msgid "This field cannot be null." +msgstr "Toto pole nemôže obsahovať null." + +#: db/models/fields/__init__.py:468 core/validators.py:132 +msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format." +msgstr "Vlož platný dátum/čas vo formáte RRRR-MM-DD HH:MM" + +#: db/models/fields/__init__.py:562 +msgid "Enter a valid filename." +msgstr "Vlož platné meno súboru." + +#: db/models/fields/related.py:43 +#, python-format +msgid "Please enter a valid %s." +msgstr "Prosím vlož platné %s." + +#: db/models/fields/related.py:579 +msgid "Separate multiple IDs with commas." +msgstr "Oddeľ viacnásobné ID čiarkami." + +#: db/models/fields/related.py:581 +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" +" Podržte \"Control\", alebo \"Command\" na Mac_u, na výber viac ako jednej " +"položky." + +#: db/models/fields/related.py:625 +#, python-format +msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." +msgid_plural "" +"Please enter valid %(self)s IDs. The values %(value)r are invalid." +msgstr[0] "Prosím vlož platné %(self)s IDs. Hodnota %(value)r je neplatná." +msgstr[1] "Prosím vlož platné %(self)s IDs. Hodnoty %(value)r sú neplatné." + +#: forms/__init__.py:380 +#, python-format +msgid "Ensure your text is less than %s character." +msgid_plural "Ensure your text is less than %s characters." +msgstr[0] "Zabezpeč aby tvoj text bol menší ako %s znak." +msgstr[1] "Zabezpeč aby tvoj text bol menší ako %s znakov." + +#: forms/__init__.py:385 +msgid "Line breaks are not allowed here." +msgstr "Nový riadok tu nieje povolený." + +#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589 +#, python-format +msgid "Select a valid choice; '%(data)s' is not in %(choices)s." +msgstr "Vyber si platnú voľbu; '%(data)s' nie je v %(choices)s." + +#: forms/__init__.py:645 +msgid "The submitted file is empty." +msgstr "Poslaný súbor je prázdný." + +#: forms/__init__.py:699 +msgid "Enter a whole number between -32,768 and 32,767." +msgstr "Vlož celé číslo s hodnotou medzi -32768 a 32767." + +#: forms/__init__.py:708 +msgid "Enter a positive number." +msgstr "Vlož celé kladné číslo." + +#: forms/__init__.py:717 +msgid "Enter a whole number between 0 and 32,767." +msgstr "Vlož celé číslo s hodnotou medzi 0 a 32767." + #: core/validators.py:60 msgid "This value must contain only letters, numbers and underscores." msgstr "Toto môže obsahovať len písmená, číslice a podčiarkovníky." @@ -1636,15 +1733,15 @@ msgstr "Malé písmena tu nie sú povolené." #: core/validators.py:83 msgid "Enter only digits separated by commas." -msgstr "Vložte len číslice, oddelené čiarkami." +msgstr "Vlož len číslice, oddelené čiarkami." #: core/validators.py:95 msgid "Enter valid e-mail addresses separated by commas." -msgstr "Vložte platné e-mail adresy oddelené čiarkami." +msgstr "Vlož platné e-mail adresy oddelené čiarkami." #: core/validators.py:99 msgid "Please enter a valid IP address." -msgstr "Prosím vložte platnú IP adresu." +msgstr "Prosím vlož platnú IP adresu." #: core/validators.py:103 msgid "Empty values are not allowed here." @@ -1660,7 +1757,7 @@ msgstr "Tento údaj nemôže byť vytvorený len z číslic." #: core/validators.py:116 msgid "Enter a whole number." -msgstr "Vložte celé číslo." +msgstr "Vlož celé číslo." #: core/validators.py:120 msgid "Only alphabetical characters are allowed here." @@ -1668,26 +1765,22 @@ msgstr "Tu sú povolené len alfanumerické znaky." #: core/validators.py:124 msgid "Enter a valid date in YYYY-MM-DD format." -msgstr "Vložte platný dátum vo formáte RRRR-MM-DD." +msgstr "Vlož platný dátum vo formáte RRRR-MM-DD." #: core/validators.py:128 msgid "Enter a valid time in HH:MM format." -msgstr "Vložte platný čas vo formáte HH:MM." - -#: core/validators.py:132 db/models/fields/__init__.py:468 -msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format." -msgstr "Vlož platný dátum/čas vo formáte RRRR-MM-DD HH:MM" +msgstr "Vlož platný čas vo formáte HH:MM." #: core/validators.py:136 msgid "Enter a valid e-mail address." -msgstr "Vložte platnú e-mail adresu." +msgstr "Vlož platnú e-mail adresu." #: core/validators.py:148 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -"Nahrajte platný obrázok. Súbor, ktorý ste nahrali buď nebol obrázok alebo je " +"Nahraj platný obrázok. Súbor, ktorý si nahral buď nebol obrázok alebo je " "nahratý poškodený obrázok." #: core/validators.py:155 @@ -1736,14 +1829,14 @@ msgstr "Odkaz na URL %s je neplatný." #: core/validators.py:214 msgid "Enter a valid U.S. state abbreviation." -msgstr "Vložte platnú skratku U.S. štátu." +msgstr "Vlož platnú skratku U.S. štátu." #: core/validators.py:229 #, 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] "Vyjadrujte sa slušne! Slovo %s tu nie je dovolené použivať." -msgstr[1] "Vyjadrujte sa slušne! Slová %s tu nie je dovolené použivať." +msgstr[0] "Vyjadruj sa slušne! Slovo %s tu nie je dovolené použivať." +msgstr[1] "Vyjadruj sa slušne! Slová %s tu nie je dovolené použivať." #: core/validators.py:236 #, python-format @@ -1752,11 +1845,11 @@ msgstr "Toto pole sa musí zhodovať s poľom '%s'. " #: core/validators.py:255 msgid "Please enter something for at least one field." -msgstr "Prosím vložte niečo aspoň pre jedno pole." +msgstr "Prosím vlož niečo aspoň pre jedno pole." #: core/validators.py:264 core/validators.py:275 msgid "Please enter both fields or leave them both empty." -msgstr "Prosím vložte obidve polia, alebo nechajte ich obe prázdne. " +msgstr "Prosím vlož obidve polia, alebo nechaj ich obe prázdne. " #: core/validators.py:282 #, python-format @@ -1780,35 +1873,34 @@ msgstr "Táto hodnota musí byť mocninou %s." #: core/validators.py:347 msgid "Please enter a valid decimal number." -msgstr "Prosím vložte platné desiatkové číslo. " +msgstr "Prosím vlož platné desiatkové číslo. " #: core/validators.py:349 #, python-format msgid "Please enter a valid decimal number with at most %s total digit." msgid_plural "" "Please enter a valid decimal number with at most %s total digits." -msgstr[0] "Prosím vložte platné desiatkové číslo s najviac %s číslicou." -msgstr[1] "Prosím vložte platné desiatkové číslo s najviac %s číslicami." +msgstr[0] "Prosím vlož platné desiatkové číslo s najviac %s číslicou." +msgstr[1] "Prosím vlož platné desiatkové číslo s najviac %s číslicami." #: core/validators.py:352 #, python-format msgid "Please enter a valid decimal number with at most %s decimal place." msgid_plural "" "Please enter a valid decimal number with at most %s decimal places." -msgstr[0] "" -"Prosím vložte platné desatinné číslo s najviac %s desatinným miestom." +msgstr[0] "Prosím vlož platné desatinné číslo s najviac %s desatinným miestom." msgstr[1] "" -"Prosím vložte platné desatinné číslo s najviac %s desatinnými miestami." +"Prosím vlož platné desatinné číslo s najviac %s desatinnými miestami." #: core/validators.py:362 #, python-format msgid "Make sure your uploaded file is at least %s bytes big." -msgstr "Presvedčte sa, že posielaný súbor nemá menej ako %s bytov." +msgstr "Presvedč sa, že posielaný súbor nemá menej ako %s bytov." #: core/validators.py:363 #, python-format msgid "Make sure your uploaded file is at most %s bytes big." -msgstr "Presvedčte sa, že posielaný súbor nemá viac ako %s bytov." +msgstr "Presvedč sa, že posielaný súbor nemá viac ako %s bytov." #: core/validators.py:376 msgid "The format for this field is wrong." @@ -1836,8 +1928,8 @@ msgid "" "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with " "\"%(start)s\".)" msgstr "" -"Prosím zavrite nezavretý %(tag)s popisovač v riadku %(line)s. (Riadok " -"začína s \"%(start)s\".)" +"Prosím zavri nezavretý %(tag)s popisovač v riadku %(line)s. (Riadok začína " +"s \"%(start)s\".)" #: core/validators.py:466 #, python-format @@ -1884,95 +1976,7 @@ msgstr "" "Atribút \"%(attr)s\" na riadku %(line)s má neplatnú hodnotu. (Riadok začína " "s \"%(start)s\".)" -#: db/models/manipulators.py:302 -#, python-format -msgid "%(object)s with this %(type)s already exists for the given %(field)s." -msgstr "%(object)s s %(type)s už existuje pre prvok %(field)s." - -#: db/models/fields/__init__.py:40 -#, python-format -msgid "%(optname)s with this %(fieldname)s already exists." -msgstr "%(optname)s s %(fieldname)s už existuje." - -#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265 -#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553 -#: forms/__init__.py:346 -msgid "This field is required." -msgstr "Toto pole je nevyhnutné." - -#: db/models/fields/__init__.py:337 -msgid "This value must be an integer." -msgstr "Táto hodnota musí byť integer." - -#: db/models/fields/__init__.py:369 -msgid "This value must be either True or False." -msgstr "Táto hodnota musí byť buď True alebo False." - -#: db/models/fields/__init__.py:385 -msgid "This field cannot be null." -msgstr "Toto pole nemôže obsahovať null." - -#: db/models/fields/__init__.py:562 -msgid "Enter a valid filename." -msgstr "Vložte platné meno súboru." - -#: db/models/fields/related.py:43 -#, python-format -msgid "Please enter a valid %s." -msgstr "Prosím vložte platné %s." - -#: db/models/fields/related.py:579 -msgid "Separate multiple IDs with commas." -msgstr "Oddeľte viacnásobné ID čiarkami." - -#: db/models/fields/related.py:581 -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" -" Podržte \"Control\", alebo \"Command\" na Mac_u, na výber viac ako jednej " -"položky." - -#: db/models/fields/related.py:625 -#, python-format -msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." -msgid_plural "" -"Please enter valid %(self)s IDs. The values %(value)r are invalid." -msgstr[0] "Prosím vložte platné %(self)s IDs. Hodnota %(value)r je neplatná." -msgstr[1] "Prosím vložte platné %(self)s IDs. Hodnoty %(value)r sú neplatné." - -#: forms/__init__.py:380 -#, python-format -msgid "Ensure your text is less than %s character." -msgid_plural "Ensure your text is less than %s characters." -msgstr[0] "Zabezpečte aby váš text bol menší ako %s znak." -msgstr[1] "Zabezpečte aby váš text bol menší ako %s znakov." - -#: forms/__init__.py:385 -msgid "Line breaks are not allowed here." -msgstr "Nový riadok tu nieje povolený." - -#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589 -#, python-format -msgid "Select a valid choice; '%(data)s' is not in %(choices)s." -msgstr "Vyberte si platnú voľbu; '%(data)s' nie je v %(choices)s." - -#: forms/__init__.py:645 -msgid "The submitted file is empty." -msgstr "Poslaný súbor je prázdný." - -#: forms/__init__.py:699 -msgid "Enter a whole number between -32,768 and 32,767." -msgstr "Vložte celé číslo s hodnotou medzi -32768 a 32767." - -#: forms/__init__.py:708 -msgid "Enter a positive number." -msgstr "Vložte celé kladné číslo." - -#: forms/__init__.py:717 -msgid "Enter a whole number between 0 and 32,767." -msgstr "Vložte celé číslo s hodnotou medzi 0 a 32767." - -#: template/defaultfilters.py:379 +#: template/defaultfilters.py:383 msgid "yes,no,maybe" msgstr "ano,nie,možno" diff --git a/django/contrib/admin/filterspecs.py b/django/contrib/admin/filterspecs.py index 0284f13114..25376be12a 100644 --- a/django/contrib/admin/filterspecs.py +++ b/django/contrib/admin/filterspecs.py @@ -11,18 +11,18 @@ import datetime class FilterSpec(object): filter_specs = [] - def __init__(self, f, request, params): + def __init__(self, f, request, params, model): self.field = f self.params = params def register(cls, test, factory): - cls.filter_specs.append( (test, factory) ) + cls.filter_specs.append((test, factory)) register = classmethod(register) - def create(cls, f, request, params): + def create(cls, f, request, params, model): for test, factory in cls.filter_specs: if test(f): - return factory(f, request, params) + return factory(f, request, params, model) create = classmethod(create) def has_output(self): @@ -48,8 +48,8 @@ class FilterSpec(object): return "".join(t) class RelatedFilterSpec(FilterSpec): - def __init__(self, f, request, params): - super(RelatedFilterSpec, self).__init__(f, request, params) + def __init__(self, f, request, params, model): + super(RelatedFilterSpec, self).__init__(f, request, params, model) if isinstance(f, models.ManyToManyField): self.lookup_title = f.rel.to._meta.verbose_name else: @@ -71,31 +71,31 @@ class RelatedFilterSpec(FilterSpec): for val in self.lookup_choices: pk_val = getattr(val, self.field.rel.to._meta.pk.attname) yield {'selected': self.lookup_val == str(pk_val), - 'query_string': cl.get_query_string( {self.lookup_kwarg: pk_val}), + 'query_string': cl.get_query_string({self.lookup_kwarg: pk_val}), 'display': val} FilterSpec.register(lambda f: bool(f.rel), RelatedFilterSpec) class ChoicesFilterSpec(FilterSpec): - def __init__(self, f, request, params): - super(ChoicesFilterSpec, self).__init__(f, request, params) + def __init__(self, f, request, params, model): + super(ChoicesFilterSpec, self).__init__(f, request, params, model) self.lookup_kwarg = '%s__exact' % f.name self.lookup_val = request.GET.get(self.lookup_kwarg, None) def choices(self, cl): yield {'selected': self.lookup_val is None, - 'query_string': cl.get_query_string( {}, [self.lookup_kwarg]), + 'query_string': cl.get_query_string({}, [self.lookup_kwarg]), 'display': _('All')} for k, v in self.field.choices: yield {'selected': str(k) == self.lookup_val, - 'query_string': cl.get_query_string( {self.lookup_kwarg: k}), + 'query_string': cl.get_query_string({self.lookup_kwarg: k}), 'display': v} FilterSpec.register(lambda f: bool(f.choices), ChoicesFilterSpec) class DateFieldFilterSpec(FilterSpec): - def __init__(self, f, request, params): - super(DateFieldFilterSpec, self).__init__(f, request, params) + def __init__(self, f, request, params, model): + super(DateFieldFilterSpec, self).__init__(f, request, params, model) self.field_generic = '%s__' % self.field.name @@ -123,14 +123,14 @@ class DateFieldFilterSpec(FilterSpec): def choices(self, cl): for title, param_dict in self.links: yield {'selected': self.date_params == param_dict, - 'query_string': cl.get_query_string( param_dict, self.field_generic), + 'query_string': cl.get_query_string(param_dict, self.field_generic), 'display': title} FilterSpec.register(lambda f: isinstance(f, models.DateField), DateFieldFilterSpec) class BooleanFieldFilterSpec(FilterSpec): - def __init__(self, f, request, params): - super(BooleanFieldFilterSpec, self).__init__(f, request, params) + def __init__(self, f, request, params, model): + super(BooleanFieldFilterSpec, self).__init__(f, request, params, model) self.lookup_kwarg = '%s__exact' % f.name self.lookup_kwarg2 = '%s__isnull' % f.name self.lookup_val = request.GET.get(self.lookup_kwarg, None) @@ -142,11 +142,34 @@ class BooleanFieldFilterSpec(FilterSpec): def choices(self, cl): for k, v in ((_('All'), None), (_('Yes'), '1'), (_('No'), '0')): yield {'selected': self.lookup_val == v and not self.lookup_val2, - 'query_string': cl.get_query_string( {self.lookup_kwarg: v}, [self.lookup_kwarg2]), + 'query_string': cl.get_query_string({self.lookup_kwarg: v}, [self.lookup_kwarg2]), 'display': k} if isinstance(self.field, models.NullBooleanField): yield {'selected': self.lookup_val2 == 'True', - 'query_string': cl.get_query_string( {self.lookup_kwarg2: 'True'}, [self.lookup_kwarg]), + 'query_string': cl.get_query_string({self.lookup_kwarg2: 'True'}, [self.lookup_kwarg]), 'display': _('Unknown')} FilterSpec.register(lambda f: isinstance(f, models.BooleanField) or isinstance(f, models.NullBooleanField), BooleanFieldFilterSpec) + +# This should be registered last, because it's a last resort. For example, +# if a field is eligible to use the BooleanFieldFilterSpec, that'd be much +# more appropriate, and the AllValuesFilterSpec won't get used for it. +class AllValuesFilterSpec(FilterSpec): + def __init__(self, f, request, params, model): + super(AllValuesFilterSpec, self).__init__(f, request, params, model) + self.lookup_val = request.GET.get(f.name, None) + self.lookup_choices = model._meta.admin.manager.distinct().order_by(f.name).values(f.name) + + def title(self): + return self.field.verbose_name + + def choices(self, cl): + yield {'selected': self.lookup_val is None, + 'query_string': cl.get_query_string({}, [self.field.name]), + 'display': _('All')} + for val in self.lookup_choices: + val = str(val[self.field.name]) + yield {'selected': self.lookup_val == val, + 'query_string': cl.get_query_string({self.field.name: val}), + 'display': val} +FilterSpec.register(lambda f: True, AllValuesFilterSpec) diff --git a/django/contrib/admin/media/css/rtl.css b/django/contrib/admin/media/css/rtl.css new file mode 100644 index 0000000000..c29391cabf --- /dev/null +++ b/django/contrib/admin/media/css/rtl.css @@ -0,0 +1,46 @@ +body { direction: rtl; } + +/* login styles */ + +.login .form-row { float:right; } +.login .form-row label { float:right; padding-left:0.5em; padding-right:0; text-align:left;} +.login .submit-row { clear:both; padding:1em 9.4em 0 0; } + + +/* global styles */ +th { text-align: right; } +.module h2, .module caption { text-align: right; } +.addlink, .changelink { padding-left:0px; padding-right:12px; background-position:100% 0.2em; } +.deletelink { padding-left:0px; padding-right:12px; background-position:100% 0.25em; } +.object-tools { float:left; } + + +/* layout styles */ +#user-tools { right:auto; left:0; text-align:left; } +div.breadcrumbs { text-align:right; } +#content-main { float:right;} +#content-related { float:left; margin-left:-19em; margin-right:auto;} +.colMS { margin-left:20em !important; margin-right:10px !important;} + +/* dashboard styles */ +.dashboard .module table td a { padding-left:.6em; padding-right:12px; } + +/* changelists styles */ +.change-list .filtered { background:white url(../img/admin/changelist-bg_rtl.gif) top left repeat-y !important; } +.change-list .filtered table { border-left:1px solid #ddd; border-right:0px none; } +#changelist-filter { right:auto; left:0; border-left:0px none; border-right:1px solid #ddd;} +.change-list .filtered table, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull { margin-right:0px !important; margin-left:160px !important; } +#changelist-filter li.selected { border-left:0px none; padding-left:0px; margin-left:0; border-right:5px solid #ccc; padding-right:5px;margin-right:-10px; } + +/* fomrs styles */ +.aligned label { padding:0 0 3px 1em; float:right; } +.submit-row { text-align: left } +.vDateField, .vTimeField { margin-left:2px; } + +/* widget styles */ +.calendarnav-previous { top:0; left:auto; right:0; } +.calendarnav-next { top:0; right:auto; left:0;} +.calendar caption, .calendarbox h2 { text-align:center; } + +.selector { float: right;} +.selector .selector-filter { text-align: right;} diff --git a/django/contrib/admin/media/js/admin/CollapsedFieldsets.js b/django/contrib/admin/media/js/admin/CollapsedFieldsets.js index 0b3ad9e421..97f0a68d04 100644 --- a/django/contrib/admin/media/js/admin/CollapsedFieldsets.js +++ b/django/contrib/admin/media/js/admin/CollapsedFieldsets.js @@ -31,7 +31,7 @@ var CollapsedFieldsets = { collapse_link.id = 'fieldsetcollapser' + i; collapse_link.onclick = new Function('CollapsedFieldsets.show('+i+'); return false;'); collapse_link.href = '#'; - collapse_link.innerHTML = 'Show'; + collapse_link.innerHTML = gettext('Show'); var h2 = fs.getElementsByTagName('h2')[0]; h2.appendChild(document.createTextNode(' (')); h2.appendChild(collapse_link); @@ -60,7 +60,7 @@ var CollapsedFieldsets = { // Toggle the "Show" link to a "Hide" link var collapse_link = document.getElementById('fieldsetcollapser' + fieldset_index); collapse_link.onclick = new Function('CollapsedFieldsets.hide('+fieldset_index+'); return false;'); - collapse_link.innerHTML = 'Hide'; + collapse_link.innerHTML = gettext('Hide'); }, hide: function(fieldset_index) { var fs = document.getElementsByTagName('fieldset')[fieldset_index]; @@ -69,9 +69,9 @@ var CollapsedFieldsets = { // Toggle the "Hide" link to a "Show" link var collapse_link = document.getElementById('fieldsetcollapser' + fieldset_index); collapse_link.onclick = new Function('CollapsedFieldsets.show('+fieldset_index+'); return false;'); - collapse_link.innerHTML = 'Show'; + collapse_link.innerHTML = gettext('Show'); }, - + uncollapse_all: function() { var fieldsets = document.getElementsByTagName('fieldset'); for (var i=0; i<fieldsets.length; i++) { diff --git a/django/contrib/admin/media/js/admin/DateTimeShortcuts.js b/django/contrib/admin/media/js/admin/DateTimeShortcuts.js index 28511f76c6..ed99c6103d 100644 --- a/django/contrib/admin/media/js/admin/DateTimeShortcuts.js +++ b/django/contrib/admin/media/js/admin/DateTimeShortcuts.js @@ -69,7 +69,16 @@ var DateTimeShortcuts = { var clock_box = document.createElement('div'); clock_box.style.display = 'none'; clock_box.style.position = 'absolute'; - clock_box.style.left = findPosX(clock_link) + 17 + 'px'; + if (getStyle(document.body,'direction')!='rtl') { + clock_box.style.left = findPosX(clock_link) + 17 + 'px'; + } + else { + // since style's width is in em, it'd be tough to calculate + // px value of it. let's use an estimated px for now + // TODO: IE returns wrong value for findPosX when in rtl mode + // (it returns as it was left aligned), needs to be fixed. + clock_box.style.left = findPosX(clock_link) - 110 + 'px'; + } clock_box.style.top = findPosY(clock_link) - 30 + 'px'; clock_box.className = 'clockbox module'; clock_box.setAttribute('id', DateTimeShortcuts.clockDivName + num); @@ -140,7 +149,17 @@ var DateTimeShortcuts = { var cal_box = document.createElement('div'); cal_box.style.display = 'none'; cal_box.style.position = 'absolute'; - cal_box.style.left = findPosX(cal_link) + 17 + 'px'; + // is it left-to-right or right-to-left layout ? + if (getStyle(document.body,'direction')!='rtl') { + cal_box.style.left = findPosX(cal_link) + 17 + 'px'; + } + else { + // since style's width is in em, it'd be tough to calculate + // px value of it. let's use an estimated px for now + // TODO: IE returns wrong value for findPosX when in rtl mode + // (it returns as it was left aligned), needs to be fixed. + cal_box.style.left = findPosX(cal_link) - 180 + 'px'; + } cal_box.style.top = findPosY(cal_link) - 75 + 'px'; cal_box.className = 'calendarbox module'; cal_box.setAttribute('id', DateTimeShortcuts.calendarDivName1 + num); diff --git a/django/contrib/admin/media/js/core.js b/django/contrib/admin/media/js/core.js index 1c8f678773..8eba69c9bb 100644 --- a/django/contrib/admin/media/js/core.js +++ b/django/contrib/admin/media/js/core.js @@ -135,4 +135,21 @@ String.prototype.pad_left = function(pad_length, pad_string) { new_string = pad_string + new_string; } return new_string; -}
\ No newline at end of file +} + +// ---------------------------------------------------------------------------- +// Get the computed style for and element +// ---------------------------------------------------------------------------- +function getStyle(oElm, strCssRule){ + var strValue = ""; + if(document.defaultView && document.defaultView.getComputedStyle){ + strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule); + } + else if(oElm.currentStyle){ + strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){ + return p1.toUpperCase(); + }); + strValue = oElm.currentStyle[strCssRule]; + } + return strValue; +} diff --git a/django/contrib/admin/templates/admin/base.html b/django/contrib/admin/templates/admin/base.html index a8c1c9c101..e7f1c7e5a9 100644 --- a/django/contrib/admin/templates/admin/base.html +++ b/django/contrib/admin/templates/admin/base.html @@ -1,8 +1,9 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" lang="{{ LANGUAGE_CODE }}" xml:lang="{{ LANGUAGE_CODE }}"> +<html xmlns="http://www.w3.org/1999/xhtml" lang="{{ LANGUAGE_CODE }}" xml:lang="{{ LANGUAGE_CODE }}" {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}> <head> <title>{% block title %}{% endblock %}</title> <link rel="stylesheet" type="text/css" href="{% block stylesheet %}{% load adminmedia %}{% admin_media_prefix %}css/base.css{% endblock %}" /> +{% if LANGUAGE_BIDI %}<link rel="stylesheet" type="text/css" href="{% block stylesheet_rtl %}{% admin_media_prefix %}css/rtl.css{% endblock %}" />{% endif %} {% block extrastyle %}{% endblock %} {% block extrahead %}{% endblock %} </head> @@ -20,7 +21,7 @@ {% block branding %}{% endblock %} </div> {% if not user.is_anonymous %}{% if user.is_staff %} - <div id="user-tools">{% trans 'Welcome,' %} <strong>{% if user.first_name %}{{ user.first_name }}{% else %}{{ user.username }}{% endif %}</strong>. {% block userlinks %}<a href="doc/">{% trans 'Documentation' %}</a> / <a href="password_change/">{% trans 'Change password' %}</a> / <a href="logout/">{% trans 'Log out' %}</a>{% endblock %}</div> + <div id="user-tools">{% trans 'Welcome,' %} <strong>{% if user.first_name %}{{ user.first_name|escape }}{% else %}{{ user.username }}{% endif %}</strong>. {% block userlinks %}<a href="doc/">{% trans 'Documentation' %}</a> / <a href="password_change/">{% trans 'Change password' %}</a> / <a href="logout/">{% trans 'Log out' %}</a>{% endblock %}</div> {% endif %}{% endif %} {% block nav-global %}{% endblock %} </div> diff --git a/django/contrib/admin/templates/admin/filters.html b/django/contrib/admin/templates/admin/filters.html index 93c2f65b15..3ca763cce3 100644 --- a/django/contrib/admin/templates/admin/filters.html +++ b/django/contrib/admin/templates/admin/filters.html @@ -1,6 +1,7 @@ {% load admin_list %} +{% load i18n %} {% if cl.has_filters %}<div id="changelist-filter"> -<h2>Filter</h2> +<h2>{% trans 'Filter' %}</h2> {% for spec in cl.filter_specs %} {% filter cl spec %} {% endfor %}</div>{% endif %} diff --git a/django/contrib/admin/templates/admin/pagination.html b/django/contrib/admin/templates/admin/pagination.html index 64b1b1a3dd..7694e4c5b0 100644 --- a/django/contrib/admin/templates/admin/pagination.html +++ b/django/contrib/admin/templates/admin/pagination.html @@ -1,4 +1,5 @@ {% load admin_list %} +{% load i18n %} <p class="paginator"> {% if pagination_required %} {% for i in page_range %} @@ -6,5 +7,5 @@ {% endfor %} {% endif %} {{ cl.result_count }} {% ifequal cl.result_count 1 %}{{ cl.opts.verbose_name }}{% else %}{{ cl.opts.verbose_name_plural }}{% endifequal %} -{% if show_all_url %} <a href="{{ show_all_url }}" class="showall">Show all</a>{% endif %} +{% if show_all_url %} <a href="{{ show_all_url }}" class="showall">{% trans 'Show all' %}</a>{% endif %} </p> diff --git a/django/contrib/admin/templates/admin/search_form.html b/django/contrib/admin/templates/admin/search_form.html index 24eced9ef9..d9126c3ec5 100644 --- a/django/contrib/admin/templates/admin/search_form.html +++ b/django/contrib/admin/templates/admin/search_form.html @@ -7,7 +7,7 @@ <input type="text" size="40" name="{{ search_var }}" value="{{ cl.query|escape }}" id="searchbar" /> <input type="submit" value="{% trans 'Go' %}" /> {% if show_result_count %} - <span class="small quiet">{{ cl.result_count }} result{{ cl.result_count|pluralize }} (<a href="?">{{ cl.full_result_count }} total</a>)</span> + <span class="small quiet">{% blocktrans count cl.result_count as counter %}1 result{% plural %}{{ counter }} results{% endblocktrans %} (<a href="?">{% blocktrans with cl.full_result_count as full_result_count %}{{ full_result_count }} total{% endblocktrans %}</a>)</span> {% endif %} {% for pair in cl.params.items %} {% ifnotequal pair.0 search_var %}<input type="hidden" name="{{ pair.0|escape }}" value="{{ pair.1|escape }}"/>{% endifnotequal %} diff --git a/django/contrib/admin/templates/registration/password_reset_email.html b/django/contrib/admin/templates/registration/password_reset_email.html index b7f31e484c..f765dd0670 100644 --- a/django/contrib/admin/templates/registration/password_reset_email.html +++ b/django/contrib/admin/templates/registration/password_reset_email.html @@ -1,6 +1,6 @@ {% load i18n %} {% trans "You're receiving this e-mail because you requested a password reset" %} -{% trans "for your user account at %(site_name)s" %}. +{% blocktrans %}for your user account at {{ site_name }}{% endblocktrans %}. {% blocktrans %}Your new password is: {{ new_password }}{% endblocktrans %} diff --git a/django/contrib/admin/templatetags/admin_list.py b/django/contrib/admin/templatetags/admin_list.py index d5f8df9dfd..0e550dd471 100644 --- a/django/contrib/admin/templatetags/admin_list.py +++ b/django/contrib/admin/templatetags/admin_list.py @@ -131,7 +131,7 @@ def items_for_result(cl, result): if isinstance(f.rel, models.ManyToOneRel): if field_val is not None: - result_repr = getattr(result, f.name) + result_repr = escape(getattr(result, f.name)) else: result_repr = EMPTY_CHANGELIST_VALUE # Dates and times are special: They're formatted in a certain way. diff --git a/django/contrib/admin/templatetags/admin_modify.py b/django/contrib/admin/templatetags/admin_modify.py index 9f646214ce..2d34452f52 100644 --- a/django/contrib/admin/templatetags/admin_modify.py +++ b/django/contrib/admin/templatetags/admin_modify.py @@ -18,6 +18,19 @@ def class_name_to_underscored(name): return '_'.join([s.lower() for s in word_re.findall(name)[:-1]]) def include_admin_script(script_path): + """ + Returns an HTML script element for including a script from the admin + media url. + + Example usage:: + + {% include_admin_script js/calendar.js %} + + could return:: + + <script type="text/javascript" src="/media/admin/js/calendar.js"> + """ + return '<script type="text/javascript" src="%s%s"></script>' % (settings.ADMIN_MEDIA_PREFIX, script_path) include_admin_script = register.simple_tag(include_admin_script) diff --git a/django/contrib/admin/views/main.py b/django/contrib/admin/views/main.py index af55587d23..ea7aeb490b 100644 --- a/django/contrib/admin/views/main.py +++ b/django/contrib/admin/views/main.py @@ -574,7 +574,7 @@ class ChangeList(object): filter_fields = [self.lookup_opts.get_field(field_name) \ for field_name in self.lookup_opts.admin.list_filter] for f in filter_fields: - spec = FilterSpec.create(f, request, self.params) + spec = FilterSpec.create(f, request, self.params, self.model) if spec and spec.has_output(): filter_specs.append(spec) return filter_specs, bool(filter_specs) diff --git a/django/contrib/auth/management.py b/django/contrib/auth/management.py index fe3399edbb..c4c315eb21 100644 --- a/django/contrib/auth/management.py +++ b/django/contrib/auth/management.py @@ -23,8 +23,6 @@ def create_permissions(app, created_models): if not app_models: return for klass in app_models: - if not klass._meta.admin: - continue ctype = ContentType.objects.get_for_model(klass) for codename, name in _get_all_permissions(klass._meta): try: diff --git a/django/contrib/auth/middleware.py b/django/contrib/auth/middleware.py index 5630f7ea81..a6a60780a7 100644 --- a/django/contrib/auth/middleware.py +++ b/django/contrib/auth/middleware.py @@ -8,7 +8,7 @@ class LazyUser(object): self._user = get_user(request) return self._user -class AuthenticationMiddleware: +class AuthenticationMiddleware(object): def process_request(self, request): assert hasattr(request, 'session'), "The Django authentication middleware requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'." request.__class__.user = LazyUser() diff --git a/django/contrib/auth/views.py b/django/contrib/auth/views.py index 96c97241c1..97ecd6a3fd 100644 --- a/django/contrib/auth/views.py +++ b/django/contrib/auth/views.py @@ -8,7 +8,7 @@ from django.http import HttpResponse, HttpResponseRedirect from django.contrib.auth.decorators import login_required from django.contrib.auth import LOGIN_URL, REDIRECT_FIELD_NAME -def login(request): +def login(request, template_name='registration/login.html'): "Displays the login form and handles the login action." manipulator = AuthenticationForm(request) redirect_to = request.REQUEST.get(REDIRECT_FIELD_NAME, '') @@ -25,19 +25,19 @@ def login(request): else: errors = {} request.session.set_test_cookie() - return render_to_response('registration/login.html', { + return render_to_response(template_name, { 'form': forms.FormWrapper(manipulator, request.POST, errors), REDIRECT_FIELD_NAME: redirect_to, 'site_name': Site.objects.get_current().name, }, context_instance=RequestContext(request)) -def logout(request, next_page=None): +def logout(request, next_page=None, template_name='registration/logged_out.html'): "Logs out the user and displays 'You are logged out' message." from django.contrib.auth import logout try: logout(request) except KeyError: - return render_to_response('registration/logged_out.html', {'title': 'Logged out'}, context_instance=RequestContext(request)) + return render_to_response(template_name, {'title': _('Logged out')}, context_instance=RequestContext(request)) else: # Redirect to this page until the session has been cleared. return HttpResponseRedirect(next_page or request.path) @@ -50,7 +50,7 @@ def redirect_to_login(next, login_url=LOGIN_URL): "Redirects the user to the login page, passing the given 'next' page" return HttpResponseRedirect('%s?%s=%s' % (login_url, REDIRECT_FIELD_NAME, next)) -def password_reset(request, is_admin_site=False): +def password_reset(request, is_admin_site=False, template_name='registration/password_reset_form.html'): new_data, errors = {}, {} form = PasswordResetForm() if request.POST: @@ -62,13 +62,13 @@ def password_reset(request, is_admin_site=False): else: form.save() return HttpResponseRedirect('%sdone/' % request.path) - return render_to_response('registration/password_reset_form.html', {'form': forms.FormWrapper(form, new_data, errors)}, + return render_to_response(template_name, {'form': forms.FormWrapper(form, new_data, errors)}, context_instance=RequestContext(request)) -def password_reset_done(request): - return render_to_response('registration/password_reset_done.html', context_instance=RequestContext(request)) +def password_reset_done(request, template_name='registration/password_reset_done.html'): + return render_to_response(template_name, context_instance=RequestContext(request)) -def password_change(request): +def password_change(request, template_name='registration/password_change_form.html'): new_data, errors = {}, {} form = PasswordChangeForm(request.user) if request.POST: @@ -77,9 +77,9 @@ def password_change(request): if not errors: form.save(new_data) return HttpResponseRedirect('%sdone/' % request.path) - return render_to_response('registration/password_change_form.html', {'form': forms.FormWrapper(form, new_data, errors)}, + return render_to_response(template_name, {'form': forms.FormWrapper(form, new_data, errors)}, context_instance=RequestContext(request)) password_change = login_required(password_change) -def password_change_done(request): - return render_to_response('registration/password_change_done.html', context_instance=RequestContext(request)) +def password_change_done(request, template_name='registration/password_change_done.html'): + return render_to_response(template_name, context_instance=RequestContext(request)) diff --git a/django/contrib/contenttypes/management.py b/django/contrib/contenttypes/management.py new file mode 100644 index 0000000000..a9174584bc --- /dev/null +++ b/django/contrib/contenttypes/management.py @@ -0,0 +1,24 @@ +""" +Creates content types for all installed models. +""" + +from django.dispatch import dispatcher +from django.db.models import get_models, signals + +def create_contenttypes(app, created_models): + from django.contrib.contenttypes.models import ContentType + app_models = get_models(app) + if not app_models: + return + for klass in app_models: + opts = klass._meta + try: + ContentType.objects.get(app_label=opts.app_label, + model=opts.object_name.lower()) + except ContentType.DoesNotExist: + ct = ContentType(name=str(opts.verbose_name), + app_label=opts.app_label, model=opts.object_name.lower()) + ct.save() + print "Adding content type '%s | %s'" % (ct.app_label, ct.model) + +dispatcher.connect(create_contenttypes, signal=signals.post_syncdb) diff --git a/django/contrib/flatpages/middleware.py b/django/contrib/flatpages/middleware.py index 074e4ea735..231b5fdd5c 100644 --- a/django/contrib/flatpages/middleware.py +++ b/django/contrib/flatpages/middleware.py @@ -2,7 +2,7 @@ from django.contrib.flatpages.views import flatpage from django.http import Http404 from django.conf import settings -class FlatpageFallbackMiddleware: +class FlatpageFallbackMiddleware(object): def process_response(self, request, response): if response.status_code != 404: return response # No need to check for a flatpage for non-404 responses. diff --git a/django/contrib/redirects/middleware.py b/django/contrib/redirects/middleware.py index 1960bffa12..32f2760c45 100644 --- a/django/contrib/redirects/middleware.py +++ b/django/contrib/redirects/middleware.py @@ -2,7 +2,7 @@ from django.contrib.redirects.models import Redirect from django import http from django.conf import settings -class RedirectFallbackMiddleware: +class RedirectFallbackMiddleware(object): def process_response(self, request, response): if response.status_code != 404: return response # No need to check for a redirect for non-404 responses. diff --git a/django/contrib/redirects/models.py b/django/contrib/redirects/models.py index 3f01996b9c..60205e29f3 100644 --- a/django/contrib/redirects/models.py +++ b/django/contrib/redirects/models.py @@ -8,15 +8,17 @@ class Redirect(models.Model): help_text=_("This should be an absolute path, excluding the domain name. Example: '/events/search/'.")) new_path = models.CharField(_('redirect to'), maxlength=200, blank=True, help_text=_("This can be either an absolute path (as above) or a full URL starting with 'http://'.")) + class Meta: verbose_name = _('redirect') verbose_name_plural = _('redirects') db_table = 'django_redirect' unique_together=(('site', 'old_path'),) ordering = ('old_path',) + class Admin: list_filter = ('site',) search_fields = ('old_path', 'new_path') - def __repr__(self): + def __str__(self): return "%s ---> %s" % (self.old_path, self.new_path) diff --git a/django/contrib/sessions/middleware.py b/django/contrib/sessions/middleware.py index da1130f560..dde4f1a6c0 100644 --- a/django/contrib/sessions/middleware.py +++ b/django/contrib/sessions/middleware.py @@ -64,7 +64,7 @@ class SessionWrapper(object): _session = property(_get_session) -class SessionMiddleware: +class SessionMiddleware(object): def process_request(self, request): request.session = SessionWrapper(request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)) diff --git a/django/contrib/syndication/feeds.py b/django/contrib/syndication/feeds.py index 367af4f9ff..3deefc5866 100644 --- a/django/contrib/syndication/feeds.py +++ b/django/contrib/syndication/feeds.py @@ -12,7 +12,7 @@ def add_domain(domain, url): class FeedDoesNotExist(ObjectDoesNotExist): pass -class Feed: +class Feed(object): item_pubdate = None item_enclosure_url = None feed_type = feedgenerator.DefaultFeed @@ -73,6 +73,7 @@ class Feed: author_name = self.__get_dynamic_attr('author_name', obj), author_link = self.__get_dynamic_attr('author_link', obj), author_email = self.__get_dynamic_attr('author_email', obj), + categories = self.__get_dynamic_attr('categories', obj), ) try: @@ -110,5 +111,6 @@ class Feed: author_name = author_name, author_email = author_email, author_link = author_link, + categories = self.__get_dynamic_attr('item_categories', item), ) return feed diff --git a/django/core/cache/backends/base.py b/django/core/cache/backends/base.py index ad8941204e..ef5f6a6b3e 100644 --- a/django/core/cache/backends/base.py +++ b/django/core/cache/backends/base.py @@ -5,7 +5,7 @@ from django.core.exceptions import ImproperlyConfigured class InvalidCacheBackendError(ImproperlyConfigured): pass -class BaseCache: +class BaseCache(object): def __init__(self, params): timeout = params.get('timeout', 300) try: diff --git a/django/core/context_processors.py b/django/core/context_processors.py index 1ab0768776..2ae9a6d972 100644 --- a/django/core/context_processors.py +++ b/django/core/context_processors.py @@ -36,6 +36,10 @@ def i18n(request): context_extras['LANGUAGE_CODE'] = request.LANGUAGE_CODE else: context_extras['LANGUAGE_CODE'] = settings.LANGUAGE_CODE + + from django.utils import translation + context_extras['LANGUAGE_BIDI'] = translation.get_language_bidi() + return context_extras def request(request): @@ -44,7 +48,7 @@ def request(request): # PermWrapper and PermLookupDict proxy the permissions system into objects that # the template system can understand. -class PermLookupDict: +class PermLookupDict(object): def __init__(self, user, module_name): self.user, self.module_name = user, module_name def __repr__(self): @@ -54,7 +58,7 @@ class PermLookupDict: def __nonzero__(self): return self.user.has_module_perms(self.module_name) -class PermWrapper: +class PermWrapper(object): def __init__(self, user): self.user = user def __getitem__(self, module_name): diff --git a/django/core/handlers/base.py b/django/core/handlers/base.py index 20f0d04669..c25ff2b14e 100644 --- a/django/core/handlers/base.py +++ b/django/core/handlers/base.py @@ -3,7 +3,7 @@ from django.dispatch import dispatcher from django import http import sys -class BaseHandler: +class BaseHandler(object): def __init__(self): self._request_middleware = self._view_middleware = self._response_middleware = self._exception_middleware = None diff --git a/django/core/management.py b/django/core/management.py index 931372cc5e..61213d0965 100644 --- a/django/core/management.py +++ b/django/core/management.py @@ -211,35 +211,38 @@ def _get_sql_for_pending_references(klass, pending_references): def _get_many_to_many_sql_for_model(klass): from django.db import backend, get_creation_module + from django.db.models import GenericRel + data_types = get_creation_module().DATA_TYPES opts = klass._meta final_output = [] for f in opts.many_to_many: - table_output = [style.SQL_KEYWORD('CREATE TABLE') + ' ' + \ - style.SQL_TABLE(backend.quote_name(f.m2m_db_table())) + ' ('] - table_output.append(' %s %s %s,' % \ - (style.SQL_FIELD(backend.quote_name('id')), - style.SQL_COLTYPE(data_types['AutoField']), - style.SQL_KEYWORD('NOT NULL PRIMARY KEY'))) - table_output.append(' %s %s %s %s (%s),' % \ - (style.SQL_FIELD(backend.quote_name(f.m2m_column_name())), - style.SQL_COLTYPE(data_types[get_rel_data_type(opts.pk)] % opts.pk.__dict__), - style.SQL_KEYWORD('NOT NULL REFERENCES'), - style.SQL_TABLE(backend.quote_name(opts.db_table)), - style.SQL_FIELD(backend.quote_name(opts.pk.column)))) - table_output.append(' %s %s %s %s (%s),' % \ - (style.SQL_FIELD(backend.quote_name(f.m2m_reverse_name())), - style.SQL_COLTYPE(data_types[get_rel_data_type(f.rel.to._meta.pk)] % f.rel.to._meta.pk.__dict__), - style.SQL_KEYWORD('NOT NULL REFERENCES'), - style.SQL_TABLE(backend.quote_name(f.rel.to._meta.db_table)), - style.SQL_FIELD(backend.quote_name(f.rel.to._meta.pk.column)))) - table_output.append(' %s (%s, %s)' % \ - (style.SQL_KEYWORD('UNIQUE'), - style.SQL_FIELD(backend.quote_name(f.m2m_column_name())), - style.SQL_FIELD(backend.quote_name(f.m2m_reverse_name())))) - table_output.append(');') - final_output.append('\n'.join(table_output)) + if not isinstance(f.rel, GenericRel): + table_output = [style.SQL_KEYWORD('CREATE TABLE') + ' ' + \ + style.SQL_TABLE(backend.quote_name(f.m2m_db_table())) + ' ('] + table_output.append(' %s %s %s,' % \ + (style.SQL_FIELD(backend.quote_name('id')), + style.SQL_COLTYPE(data_types['AutoField']), + style.SQL_KEYWORD('NOT NULL PRIMARY KEY'))) + table_output.append(' %s %s %s %s (%s),' % \ + (style.SQL_FIELD(backend.quote_name(f.m2m_column_name())), + style.SQL_COLTYPE(data_types[get_rel_data_type(opts.pk)] % opts.pk.__dict__), + style.SQL_KEYWORD('NOT NULL REFERENCES'), + style.SQL_TABLE(backend.quote_name(opts.db_table)), + style.SQL_FIELD(backend.quote_name(opts.pk.column)))) + table_output.append(' %s %s %s %s (%s),' % \ + (style.SQL_FIELD(backend.quote_name(f.m2m_reverse_name())), + style.SQL_COLTYPE(data_types[get_rel_data_type(f.rel.to._meta.pk)] % f.rel.to._meta.pk.__dict__), + style.SQL_KEYWORD('NOT NULL REFERENCES'), + style.SQL_TABLE(backend.quote_name(f.rel.to._meta.db_table)), + style.SQL_FIELD(backend.quote_name(f.rel.to._meta.pk.column)))) + table_output.append(' %s (%s, %s)' % \ + (style.SQL_KEYWORD('UNIQUE'), + style.SQL_FIELD(backend.quote_name(f.m2m_column_name())), + style.SQL_FIELD(backend.quote_name(f.m2m_reverse_name())))) + table_output.append(');') + final_output.append('\n'.join(table_output)) return final_output def get_sql_delete(app): @@ -815,10 +818,8 @@ def get_validation_errors(outfile, app=None): # Do field-specific validation. for f in opts.fields: - # Check for deprecated args - dep_args = getattr(f, 'deprecated_args', None) - if dep_args: - e.add(opts, "'%s' Initialized with deprecated args:%s" % (f.name, ",".join(dep_args))) + if f.name == 'id' and not f.primary_key and opts.pk.name == 'id': + e.add(opts, '"%s": You can\'t use "id" as a field name, because each model automatically gets an "id" field if none of the fields have primary_key=True. You need to either remove/rename your "id" field or add primary_key=True to a field.' % f.name) if isinstance(f, models.CharField) and f.maxlength in (None, 0): e.add(opts, '"%s": CharFields require a "maxlength" attribute.' % f.name) if isinstance(f, models.FloatField): @@ -836,8 +837,8 @@ def get_validation_errors(outfile, app=None): if f.prepopulate_from is not None and type(f.prepopulate_from) not in (list, tuple): e.add(opts, '"%s": prepopulate_from should be a list or tuple.' % f.name) if f.choices: - if not type(f.choices) in (tuple, list): - e.add(opts, '"%s": "choices" should be either a tuple or list.' % f.name) + if not hasattr(f.choices, '__iter__'): + e.add(opts, '"%s": "choices" should be iterable (e.g., a tuple or list).' % f.name) else: for c in f.choices: if not type(c) in (tuple, list) or len(c) != 2: @@ -923,6 +924,7 @@ def get_validation_errors(outfile, app=None): field_name = field_name[1:] if opts.order_with_respect_to and field_name == '_order': continue + if '.' in field_name: continue # Skip ordering in the format 'table.field'. try: opts.get_field(field_name, many_to_many=False) except models.FieldDoesNotExist: diff --git a/django/core/paginator.py b/django/core/paginator.py index f4941cb678..195ad1009e 100644 --- a/django/core/paginator.py +++ b/django/core/paginator.py @@ -4,7 +4,7 @@ from math import ceil class InvalidPage(Exception): pass -class ObjectPaginator: +class ObjectPaginator(object): """ This class makes pagination easy. Feed it a QuerySet, plus the number of objects you want on each page. Then read the hits and pages properties to diff --git a/django/core/servers/basehttp.py b/django/core/servers/basehttp.py index 5772912031..259a931594 100644 --- a/django/core/servers/basehttp.py +++ b/django/core/servers/basehttp.py @@ -21,7 +21,7 @@ software_version = server_version + ' ' + sys_version class WSGIServerException(Exception): pass -class FileWrapper: +class FileWrapper(object): """Wrapper to convert file-like objects to iterables""" def __init__(self, filelike, blksize=8192): @@ -63,7 +63,7 @@ def _formatparam(param, value=None, quote=1): else: return param -class Headers: +class Headers(object): """Manage a collection of HTTP response headers""" def __init__(self,headers): if type(headers) is not ListType: @@ -218,7 +218,7 @@ def is_hop_by_hop(header_name): """Return true if 'header_name' is an HTTP/1.1 "Hop-by-Hop" header""" return _hoppish(header_name.lower()) -class ServerHandler: +class ServerHandler(object): """Manage the invocation of a WSGI application""" # Configuration parameters; can override per-subclass or per-instance @@ -591,7 +591,7 @@ class WSGIRequestHandler(BaseHTTPRequestHandler): return sys.stderr.write("[%s] %s\n" % (self.log_date_time_string(), format % args)) -class AdminMediaHandler: +class AdminMediaHandler(object): """ WSGI middleware that intercepts calls to the admin media directory, as defined by the ADMIN_MEDIA_PREFIX setting, and serves those images. diff --git a/django/core/urlresolvers.py b/django/core/urlresolvers.py index 91e999f802..a1661a2ecd 100644 --- a/django/core/urlresolvers.py +++ b/django/core/urlresolvers.py @@ -83,7 +83,7 @@ class MatchChecker(object): raise NoReverseMatch("Value %r didn't match regular expression %r" % (value, test_regex)) return str(value) # TODO: Unicode? -class RegexURLPattern: +class RegexURLPattern(object): def __init__(self, regex, callback, default_args=None): # regex is a string representing a regular expression. # callback is something like 'foo.views.news.stories.story_detail', diff --git a/django/core/validators.py b/django/core/validators.py index a2e9bfaf89..f98589578e 100644 --- a/django/core/validators.py +++ b/django/core/validators.py @@ -237,7 +237,7 @@ def hasNoProfanities(field_data, all_data): "Watch your mouth! The words %s are not allowed here.", plural) % \ get_text_list(['"%s%s%s"' % (i[0], '-'*(len(i)-2), i[-1]) for i in words_seen], 'and') -class AlwaysMatchesOtherField: +class AlwaysMatchesOtherField(object): def __init__(self, other_field_name, error_message=None): self.other = other_field_name self.error_message = error_message or lazy_inter(gettext_lazy("This field must match the '%s' field."), self.other) @@ -247,7 +247,7 @@ class AlwaysMatchesOtherField: if field_data != all_data[self.other]: raise ValidationError, self.error_message -class ValidateIfOtherFieldEquals: +class ValidateIfOtherFieldEquals(object): def __init__(self, other_field, other_value, validator_list): self.other_field, self.other_value = other_field, other_value self.validator_list = validator_list @@ -258,7 +258,7 @@ class ValidateIfOtherFieldEquals: for v in self.validator_list: v(field_data, all_data) -class RequiredIfOtherFieldNotGiven: +class RequiredIfOtherFieldNotGiven(object): def __init__(self, other_field_name, error_message=gettext_lazy("Please enter something for at least one field.")): self.other, self.error_message = other_field_name, error_message self.always_test = True @@ -267,7 +267,7 @@ class RequiredIfOtherFieldNotGiven: if not all_data.get(self.other, False) and not field_data: raise ValidationError, self.error_message -class RequiredIfOtherFieldsGiven: +class RequiredIfOtherFieldsGiven(object): def __init__(self, other_field_names, error_message=gettext_lazy("Please enter both fields or leave them both empty.")): self.other, self.error_message = other_field_names, error_message self.always_test = True @@ -282,7 +282,7 @@ class RequiredIfOtherFieldGiven(RequiredIfOtherFieldsGiven): def __init__(self, other_field_name, error_message=gettext_lazy("Please enter both fields or leave them both empty.")): RequiredIfOtherFieldsGiven.__init__(self, [other_field_name], error_message) -class RequiredIfOtherFieldEquals: +class RequiredIfOtherFieldEquals(object): def __init__(self, other_field, other_value, error_message=None): self.other_field = other_field self.other_value = other_value @@ -294,7 +294,7 @@ class RequiredIfOtherFieldEquals: if all_data.has_key(self.other_field) and all_data[self.other_field] == self.other_value and not field_data: raise ValidationError(self.error_message) -class RequiredIfOtherFieldDoesNotEqual: +class RequiredIfOtherFieldDoesNotEqual(object): def __init__(self, other_field, other_value, error_message=None): self.other_field = other_field self.other_value = other_value @@ -306,7 +306,7 @@ class RequiredIfOtherFieldDoesNotEqual: if all_data.has_key(self.other_field) and all_data[self.other_field] != self.other_value and not field_data: raise ValidationError(self.error_message) -class IsLessThanOtherField: +class IsLessThanOtherField(object): def __init__(self, other_field_name, error_message): self.other, self.error_message = other_field_name, error_message @@ -314,7 +314,7 @@ class IsLessThanOtherField: if field_data > all_data[self.other]: raise ValidationError, self.error_message -class UniqueAmongstFieldsWithPrefix: +class UniqueAmongstFieldsWithPrefix(object): def __init__(self, field_name, prefix, error_message): self.field_name, self.prefix = field_name, prefix self.error_message = error_message or gettext_lazy("Duplicate values are not allowed.") @@ -324,7 +324,7 @@ class UniqueAmongstFieldsWithPrefix: if field_name != self.field_name and value == field_data: raise ValidationError, self.error_message -class IsAPowerOf: +class IsAPowerOf(object): """ >>> v = IsAPowerOf(2) >>> v(4, None) @@ -342,7 +342,7 @@ class IsAPowerOf: if val != int(val): raise ValidationError, gettext("This value must be a power of %s.") % self.power_of -class IsValidFloat: +class IsValidFloat(object): def __init__(self, max_digits, decimal_places): self.max_digits, self.decimal_places = max_digits, decimal_places @@ -355,11 +355,14 @@ class IsValidFloat: if len(data) > (self.max_digits + 1): raise ValidationError, ngettext("Please enter a valid decimal number with at most %s total digit.", "Please enter a valid decimal number with at most %s total digits.", self.max_digits) % self.max_digits + if (not '.' in data and len(data) > (self.max_digits - self.decimal_places)) or ('.' in data and len(data) > (self.max_digits - (self.decimal_places - len(data.split('.')[1])) + 1)): + raise ValidationError, ngettext( "Please enter a valid decimal number with a whole part of at most %s digit.", + "Please enter a valid decimal number with a whole part of at most %s digits.", str(self.max_digits-self.decimal_places)) % str(self.max_digits-self.decimal_places) if '.' in data and len(data.split('.')[1]) > self.decimal_places: raise ValidationError, ngettext("Please enter a valid decimal number with at most %s decimal place.", "Please enter a valid decimal number with at most %s decimal places.", self.decimal_places) % self.decimal_places -class HasAllowableSize: +class HasAllowableSize(object): """ Checks that the file-upload field data is a certain size. min_size and max_size are measurements in bytes. @@ -379,7 +382,7 @@ class HasAllowableSize: if self.max_size is not None and len(content) > self.max_size: raise ValidationError, self.max_error_message -class MatchesRegularExpression: +class MatchesRegularExpression(object): """ Checks that the field matches the given regular-expression. The regex should be in string format, not already compiled. @@ -392,7 +395,7 @@ class MatchesRegularExpression: if not self.regexp.search(field_data): raise ValidationError(self.error_message) -class AnyValidator: +class AnyValidator(object): """ This validator tries all given validators. If any one of them succeeds, validation passes. If none of them succeeds, the given message is thrown @@ -416,7 +419,7 @@ class AnyValidator: pass raise ValidationError(self.error_message) -class URLMimeTypeCheck: +class URLMimeTypeCheck(object): "Checks that the provided URL points to a document with a listed mime type" class CouldNotRetrieve(ValidationError): pass @@ -441,7 +444,7 @@ class URLMimeTypeCheck: raise URLMimeTypeCheck.InvalidContentType, gettext("The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'.") % { 'url': field_data, 'contenttype': content_type} -class RelaxNGCompact: +class RelaxNGCompact(object): "Validate against a Relax NG compact schema" def __init__(self, schema_path, additional_root_element=None): self.schema_path = schema_path diff --git a/django/db/backends/ado_mssql/base.py b/django/db/backends/ado_mssql/base.py index b645b053bf..afe2d19981 100644 --- a/django/db/backends/ado_mssql/base.py +++ b/django/db/backends/ado_mssql/base.py @@ -131,6 +131,9 @@ def get_fulltext_search_sql(field_name): def get_drop_foreignkey_sql(): return "DROP CONSTRAINT" +def get_pk_default_value(): + return "DEFAULT" + OPERATOR_MAPPING = { 'exact': '= %s', 'iexact': 'LIKE %s', diff --git a/django/db/backends/mysql/base.py b/django/db/backends/mysql/base.py index 4a13450c67..a522f24f2f 100644 --- a/django/db/backends/mysql/base.py +++ b/django/db/backends/mysql/base.py @@ -158,6 +158,9 @@ def get_fulltext_search_sql(field_name): def get_drop_foreignkey_sql(): return "DROP FOREIGN KEY" +def get_pk_default_value(): + return "DEFAULT" + OPERATOR_MAPPING = { 'exact': '= %s', 'iexact': 'LIKE %s', diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py index e981805108..9943ac9610 100644 --- a/django/db/backends/oracle/base.py +++ b/django/db/backends/oracle/base.py @@ -114,6 +114,9 @@ def get_fulltext_search_sql(field_name): def get_drop_foreignkey_sql(): return "DROP FOREIGN KEY" +def get_pk_default_value(): + return "DEFAULT" + OPERATOR_MAPPING = { 'exact': '= %s', 'iexact': 'LIKE %s', diff --git a/django/db/backends/postgresql/base.py b/django/db/backends/postgresql/base.py index decb160ee9..5355781e81 100644 --- a/django/db/backends/postgresql/base.py +++ b/django/db/backends/postgresql/base.py @@ -108,6 +108,9 @@ def get_fulltext_search_sql(field_name): def get_drop_foreignkey_sql(): return "DROP CONSTRAINT" +def get_pk_default_value(): + return "DEFAULT" + # Register these custom typecasts, because Django expects dates/times to be # in Python's native (standard-library) datetime/time format, whereas psycopg # use mx.DateTime by default. diff --git a/django/db/backends/postgresql_psycopg2/base.py b/django/db/backends/postgresql_psycopg2/base.py index 697a33bb76..55cba81b70 100644 --- a/django/db/backends/postgresql_psycopg2/base.py +++ b/django/db/backends/postgresql_psycopg2/base.py @@ -114,6 +114,9 @@ def get_fulltext_search_sql(field_name): def get_drop_foreignkey_sql(): return "DROP CONSTRAINT" +def get_pk_default_value(): + return "DEFAULT" + OPERATOR_MAPPING = { 'exact': '= %s', 'iexact': 'ILIKE %s', diff --git a/django/db/backends/sqlite3/base.py b/django/db/backends/sqlite3/base.py index 7b51967416..68452e1363 100644 --- a/django/db/backends/sqlite3/base.py +++ b/django/db/backends/sqlite3/base.py @@ -130,6 +130,9 @@ def get_fulltext_search_sql(field_name): def get_drop_foreignkey_sql(): return "" +def get_pk_default_value(): + return "NULL" + def _sqlite_date_trunc(lookup_type, dt): try: dt = util.typecast_timestamp(dt) diff --git a/django/db/backends/util.py b/django/db/backends/util.py index 3098a53556..74d33f42ca 100644 --- a/django/db/backends/util.py +++ b/django/db/backends/util.py @@ -1,7 +1,7 @@ import datetime from time import time -class CursorDebugWrapper: +class CursorDebugWrapper(object): def __init__(self, cursor, db): self.cursor = cursor self.db = db diff --git a/django/db/models/__init__.py b/django/db/models/__init__.py index d708fa60bc..82b1238723 100644 --- a/django/db/models/__init__.py +++ b/django/db/models/__init__.py @@ -8,6 +8,7 @@ from django.db.models.manager import Manager from django.db.models.base import Model, AdminOptions from django.db.models.fields import * from django.db.models.fields.related import ForeignKey, OneToOneField, ManyToManyField, ManyToOneRel, ManyToManyRel, OneToOneRel, TABULAR, STACKED +from django.db.models.fields.generic import GenericRelation, GenericRel, GenericForeignKey from django.db.models import signals from django.utils.functional import curry from django.utils.text import capfirst @@ -15,7 +16,7 @@ from django.utils.text import capfirst # Admin stages. ADD, CHANGE, BOTH = 1, 2, 3 -class LazyDate: +class LazyDate(object): """ Use in limit_choices_to to compare the field to dates calculated at run time instead of when the model is loaded. For example:: diff --git a/django/db/models/base.py b/django/db/models/base.py index 3538826356..7242e6baa7 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -107,6 +107,12 @@ class Model(object): else: val = kwargs.pop(f.attname, f.get_default()) setattr(self, f.attname, val) + for prop in kwargs.keys(): + try: + if isinstance(getattr(self.__class__, prop), property): + setattr(self, prop, kwargs.pop(prop)) + except AttributeError: + pass if kwargs: raise TypeError, "'%s' is an invalid keyword argument for this function" % kwargs.keys()[0] for i, arg in enumerate(args): @@ -165,7 +171,7 @@ class Model(object): cursor.execute("UPDATE %s SET %s WHERE %s=%%s" % \ (backend.quote_name(self._meta.db_table), ','.join(['%s=%%s' % backend.quote_name(f.column) for f in non_pks]), - backend.quote_name(self._meta.pk.attname)), + backend.quote_name(self._meta.pk.column)), db_values + [pk_val]) else: record_exists = False @@ -183,9 +189,16 @@ class Model(object): placeholders.append('(SELECT COUNT(*) FROM %s WHERE %s = %%s)' % \ (backend.quote_name(self._meta.db_table), backend.quote_name(self._meta.order_with_respect_to.column))) db_values.append(getattr(self, self._meta.order_with_respect_to.attname)) - cursor.execute("INSERT INTO %s (%s) VALUES (%s)" % \ - (backend.quote_name(self._meta.db_table), ','.join(field_names), - ','.join(placeholders)), db_values) + if db_values: + cursor.execute("INSERT INTO %s (%s) VALUES (%s)" % \ + (backend.quote_name(self._meta.db_table), ','.join(field_names), + ','.join(placeholders)), db_values) + else: + # Create a new record with defaults for everything. + cursor.execute("INSERT INTO %s (%s) VALUES (%s)" % + (backend.quote_name(self._meta.db_table), + backend.quote_name(self._meta.pk.column), + backend.get_pk_default_value())) if self._meta.has_auto_field and not pk_set: setattr(self, self._meta.pk.attname, backend.get_last_insert_id(cursor, self._meta.db_table, self._meta.pk.column)) transaction.commit_unless_managed() diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 2f8a8651a1..720737efcf 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -535,7 +535,7 @@ class FileField(Field): if not self.blank: if rel: # This validator makes sure FileFields work in a related context. - class RequiredFileField: + class RequiredFileField(object): def __init__(self, other_field_names, other_file_field_name): self.other_field_names = other_field_names self.other_file_field_name = other_file_field_name diff --git a/django/db/models/fields/generic.py b/django/db/models/fields/generic.py new file mode 100644 index 0000000000..5f4de40e69 --- /dev/null +++ b/django/db/models/fields/generic.py @@ -0,0 +1,259 @@ +""" +Classes allowing "generic" relations through ContentType and object-id fields. +""" + +from django import forms +from django.core.exceptions import ObjectDoesNotExist +from django.db import backend +from django.db.models import signals +from django.db.models.fields.related import RelatedField, Field, ManyToManyRel +from django.db.models.loading import get_model +from django.dispatch import dispatcher +from django.utils.functional import curry + +class GenericForeignKey(object): + """ + Provides a generic relation to any object through content-type/object-id + fields. + """ + + def __init__(self, ct_field="content_type", fk_field="object_id"): + self.ct_field = ct_field + self.fk_field = fk_field + + def contribute_to_class(self, cls, name): + # Make sure the fields exist (these raise FieldDoesNotExist, + # which is a fine error to raise here) + self.name = name + self.model = cls + self.cache_attr = "_%s_cache" % name + + # For some reason I don't totally understand, using weakrefs here doesn't work. + dispatcher.connect(self.instance_pre_init, signal=signals.pre_init, sender=cls, weak=False) + + # Connect myself as the descriptor for this field + setattr(cls, name, self) + + def instance_pre_init(self, signal, sender, args, kwargs): + # Handle initalizing an object with the generic FK instaed of + # content-type/object-id fields. + if kwargs.has_key(self.name): + value = kwargs.pop(self.name) + kwargs[self.ct_field] = self.get_content_type(value) + kwargs[self.fk_field] = value._get_pk_val() + + def get_content_type(self, obj): + # Convenience function using get_model avoids a circular import when using this model + ContentType = get_model("contenttypes", "contenttype") + return ContentType.objects.get_for_model(obj) + + def __get__(self, instance, instance_type=None): + if instance is None: + raise AttributeError, "%s must be accessed via instance" % self.name + + try: + return getattr(instance, self.cache_attr) + except AttributeError: + rel_obj = None + ct = getattr(instance, self.ct_field) + if ct: + try: + rel_obj = ct.get_object_for_this_type(pk=getattr(instance, self.fk_field)) + except ObjectDoesNotExist: + pass + setattr(instance, self.cache_attr, rel_obj) + return rel_obj + + def __set__(self, instance, value): + if instance is None: + raise AttributeError, "%s must be accessed via instance" % self.related.opts.object_name + + ct = None + fk = None + if value is not None: + ct = self.get_content_type(value) + fk = value._get_pk_val() + + setattr(instance, self.ct_field, ct) + setattr(instance, self.fk_field, fk) + setattr(instance, self.cache_attr, value) + +class GenericRelation(RelatedField, Field): + """Provides an accessor to generic related objects (i.e. comments)""" + + def __init__(self, to, **kwargs): + kwargs['verbose_name'] = kwargs.get('verbose_name', None) + kwargs['rel'] = GenericRel(to, + related_name=kwargs.pop('related_name', None), + limit_choices_to=kwargs.pop('limit_choices_to', None), + symmetrical=kwargs.pop('symmetrical', True)) + + # Override content-type/object-id field names on the related class + self.object_id_field_name = kwargs.pop("object_id_field", "object_id") + self.content_type_field_name = kwargs.pop("content_type_field", "content_type") + + kwargs['blank'] = True + kwargs['editable'] = False + Field.__init__(self, **kwargs) + + def get_manipulator_field_objs(self): + choices = self.get_choices_default() + return [curry(forms.SelectMultipleField, size=min(max(len(choices), 5), 15), choices=choices)] + + def get_choices_default(self): + return Field.get_choices(self, include_blank=False) + + def flatten_data(self, follow, obj = None): + new_data = {} + if obj: + instance_ids = [instance._get_pk_val() for instance in getattr(obj, self.name).all()] + new_data[self.name] = instance_ids + return new_data + + def m2m_db_table(self): + return self.rel.to._meta.db_table + + def m2m_column_name(self): + return self.object_id_field_name + + def m2m_reverse_name(self): + return self.model._meta.pk.attname + + def contribute_to_class(self, cls, name): + super(GenericRelation, self).contribute_to_class(cls, name) + + # Save a reference to which model this class is on for future use + self.model = cls + + # Add the descriptor for the m2m relation + setattr(cls, self.name, ReverseGenericRelatedObjectsDescriptor(self)) + + def contribute_to_related_class(self, cls, related): + pass + + def set_attributes_from_rel(self): + pass + + def get_internal_type(self): + return "ManyToManyField" + +class ReverseGenericRelatedObjectsDescriptor(object): + """ + This class provides the functionality that makes the related-object + managers available as attributes on a model class, for fields that have + multiple "remote" values and have a GenericRelation defined in their model + (rather than having another model pointed *at* them). In the example + "article.publications", the publications attribute is a + ReverseGenericRelatedObjectsDescriptor instance. + """ + def __init__(self, field): + self.field = field + + def __get__(self, instance, instance_type=None): + if instance is None: + raise AttributeError, "Manager must be accessed via instance" + + # This import is done here to avoid circular import importing this module + from django.contrib.contenttypes.models import ContentType + + # Dynamically create a class that subclasses the related model's + # default manager. + rel_model = self.field.rel.to + superclass = rel_model._default_manager.__class__ + RelatedManager = create_generic_related_manager(superclass) + + manager = RelatedManager( + model = rel_model, + instance = instance, + symmetrical = (self.field.rel.symmetrical and instance.__class__ == rel_model), + join_table = backend.quote_name(self.field.m2m_db_table()), + source_col_name = backend.quote_name(self.field.m2m_column_name()), + target_col_name = backend.quote_name(self.field.m2m_reverse_name()), + content_type = ContentType.objects.get_for_model(self.field.model), + content_type_field_name = self.field.content_type_field_name, + object_id_field_name = self.field.object_id_field_name + ) + + return manager + + def __set__(self, instance, value): + if instance is None: + raise AttributeError, "Manager must be accessed via instance" + + manager = self.__get__(instance) + manager.clear() + for obj in value: + manager.add(obj) + +def create_generic_related_manager(superclass): + """ + Factory function for a manager that subclasses 'superclass' (which is a + Manager) and adds behavior for generic related objects. + """ + + class GenericRelatedObjectManager(superclass): + def __init__(self, model=None, core_filters=None, instance=None, symmetrical=None, + join_table=None, source_col_name=None, target_col_name=None, content_type=None, + content_type_field_name=None, object_id_field_name=None): + + super(GenericRelatedObjectManager, self).__init__() + self.core_filters = core_filters or {} + self.model = model + self.content_type = content_type + self.symmetrical = symmetrical + self.instance = instance + self.join_table = join_table + self.join_table = model._meta.db_table + self.source_col_name = source_col_name + self.target_col_name = target_col_name + self.content_type_field_name = content_type_field_name + self.object_id_field_name = object_id_field_name + self.pk_val = self.instance._get_pk_val() + + def get_query_set(self): + query = { + '%s__pk' % self.content_type_field_name : self.content_type.id, + '%s__exact' % self.object_id_field_name : self.pk_val, + } + return superclass.get_query_set(self).filter(**query) + + def add(self, *objs): + for obj in objs: + setattr(obj, self.content_type_field_name, self.content_type) + setattr(obj, self.object_id_field_name, self.pk_val) + obj.save() + add.alters_data = True + + def remove(self, *objs): + for obj in objs: + obj.delete() + remove.alters_data = True + + def clear(self): + for obj in self.all(): + obj.delete() + clear.alters_data = True + + def create(self, **kwargs): + kwargs[self.content_type_field_name] = self.content_type + kwargs[self.object_id_field_name] = self.pk_val + obj = self.model(**kwargs) + obj.save() + return obj + create.alters_data = True + + return GenericRelatedObjectManager + +class GenericRel(ManyToManyRel): + def __init__(self, to, related_name=None, limit_choices_to=None, symmetrical=True): + self.to = to + self.num_in_admin = 0 + self.related_name = related_name + self.filter_interface = None + self.limit_choices_to = limit_choices_to or {} + self.edit_inline = False + self.raw_id_admin = False + self.symmetrical = symmetrical + self.multiple = True + assert not (self.raw_id_admin and self.filter_interface), \ + "Generic relations may not use both raw_id_admin and filter_interface" diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index 6e0fb6d2a8..f9750217a2 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -667,7 +667,7 @@ class ManyToManyField(RelatedField, Field): def set_attributes_from_rel(self): pass -class ManyToOneRel: +class ManyToOneRel(object): def __init__(self, to, field_name, num_in_admin=3, min_num_in_admin=None, max_num_in_admin=None, num_extra_on_change=1, edit_inline=False, related_name=None, limit_choices_to=None, lookup_overrides=None, raw_id_admin=False): @@ -704,7 +704,7 @@ class OneToOneRel(ManyToOneRel): self.raw_id_admin = raw_id_admin self.multiple = False -class ManyToManyRel: +class ManyToManyRel(object): def __init__(self, to, num_in_admin=0, related_name=None, filter_interface=None, limit_choices_to=None, raw_id_admin=False, symmetrical=True): self.to = to diff --git a/django/db/models/manager.py b/django/db/models/manager.py index 93de4a6adc..f679c5492c 100644 --- a/django/db/models/manager.py +++ b/django/db/models/manager.py @@ -3,6 +3,7 @@ from django.db import backend, connection from django.db.models.query import QuerySet from django.dispatch import dispatcher from django.db.models import signals +from django.db.models.fields import FieldDoesNotExist from django.utils.datastructures import SortedDict # Size of each "chunk" for get_iterator calls. @@ -13,8 +14,11 @@ def ensure_default_manager(sender): cls = sender if not hasattr(cls, '_default_manager'): # Create the default manager, if needed. - if hasattr(cls, 'objects'): - raise ValueError, "Model %s must specify a custom Manager, because it has a field named 'objects'" % name + try: + cls._meta.get_field('objects') + raise ValueError, "Model %s must specify a custom Manager, because it has a field named 'objects'" % cls.__name__ + except FieldDoesNotExist: + pass cls.add_to_class('objects', Manager()) dispatcher.connect(ensure_default_manager, signal=signals.class_prepared) @@ -65,6 +69,9 @@ class Manager(object): def get(self, *args, **kwargs): return self.get_query_set().get(*args, **kwargs) + def get_or_create(self, *args, **kwargs): + return self.get_query_set().get_or_create(*args, **kwargs) + def filter(self, *args, **kwargs): return self.get_query_set().filter(*args, **kwargs) diff --git a/django/db/models/options.py b/django/db/models/options.py index 1023689a86..f8149bdf5c 100644 --- a/django/db/models/options.py +++ b/django/db/models/options.py @@ -15,7 +15,7 @@ DEFAULT_NAMES = ('verbose_name', 'db_table', 'ordering', 'unique_together', 'permissions', 'get_latest_by', 'order_with_respect_to', 'app_label') -class Options: +class Options(object): def __init__(self, meta): self.fields, self.many_to_many = [], [] self.module_name, self.verbose_name = None, None @@ -195,7 +195,7 @@ class Options: self._field_types[field_type] = False return self._field_types[field_type] -class AdminOptions: +class AdminOptions(object): def __init__(self, fields=None, js=None, list_display=None, list_filter=None, date_hierarchy=None, save_as=False, ordering=None, search_fields=None, save_on_top=False, list_select_related=False, manager=None, list_per_page=100): diff --git a/django/db/models/query.py b/django/db/models/query.py index 4bd9b3b9fe..e826efa779 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -205,6 +205,23 @@ class QuerySet(object): assert len(obj_list) == 1, "get() returned more than one %s -- it returned %s! Lookup parameters were %s" % (self.model._meta.object_name, len(obj_list), kwargs) return obj_list[0] + def get_or_create(self, **kwargs): + """ + Looks up an object with the given kwargs, creating one if necessary. + Returns a tuple of (object, created), where created is a boolean + specifying whether an object was created. + """ + assert len(kwargs), 'get_or_create() must be passed at least one keyword argument' + defaults = kwargs.pop('defaults', {}) + try: + return self.get(**kwargs), False + except self.model.DoesNotExist: + params = dict([(k, v) for k, v in kwargs.items() if '__' not in k]) + params.update(defaults) + obj = self.model(**params) + obj.save() + return obj, True + def latest(self, field_name=None): """ Returns the latest object, according to the model's 'get_latest_by' @@ -529,7 +546,7 @@ class DateQuerySet(QuerySet): c._order = self._order return c -class QOperator: +class QOperator(object): "Base class for QAnd and QOr" def __init__(self, *args): self.args = args diff --git a/django/db/transaction.py b/django/db/transaction.py index 60a743c42a..4a0658e1c3 100644 --- a/django/db/transaction.py +++ b/django/db/transaction.py @@ -114,7 +114,7 @@ def is_managed(): def managed(flag=True): """ Puts the transaction manager into a manual state: managed transactions have - to be committed explicitely by the user. If you switch off transaction + to be committed explicitly by the user. If you switch off transaction management and there is a pending commit/rollback, the data will be commited. """ diff --git a/django/forms/__init__.py b/django/forms/__init__.py index cea3d22310..fab7a6da7a 100644 --- a/django/forms/__init__.py +++ b/django/forms/__init__.py @@ -101,7 +101,7 @@ class Manipulator(object): for field in self.fields: field.convert_post_data(new_data) -class FormWrapper: +class FormWrapper(object): """ A wrapper linking a Manipulator to the template system. This allows dictionary-style lookups of formfields. It also handles feeding @@ -150,7 +150,7 @@ class FormWrapper: fields = property(_get_fields) -class FormFieldWrapper: +class FormFieldWrapper(object): "A bridge between the template system and an individual form field. Used by FormWrapper." def __init__(self, formfield, data, error_list): self.formfield, self.data, self.error_list = formfield, data, error_list @@ -211,7 +211,7 @@ class FormFieldCollection(FormFieldWrapper): def html_combined_error_list(self): return ''.join([field.html_error_list() for field in self.formfield_dict.values() if hasattr(field, 'errors')]) -class InlineObjectCollection: +class InlineObjectCollection(object): "An object that acts like a sparse list of form field collections." def __init__(self, parent_manipulator, rel_obj, data, errors): self.parent_manipulator = parent_manipulator @@ -269,7 +269,7 @@ class InlineObjectCollection: self._collections = collections -class FormField: +class FormField(object): """Abstract class representing a form field. Classes that extend FormField should define the following attributes: @@ -613,9 +613,10 @@ class CheckboxSelectMultipleField(SelectMultipleField): back into the single list that validators, renderers and save() expect. """ requires_data_list = True - def __init__(self, field_name, choices=None, validator_list=None): + def __init__(self, field_name, choices=None, ul_class='', validator_list=None): if validator_list is None: validator_list = [] if choices is None: choices = [] + self.ul_class = ul_class SelectMultipleField.__init__(self, field_name, choices, size=1, is_required=False, validator_list=validator_list) def prepare(self, new_data): @@ -628,7 +629,7 @@ class CheckboxSelectMultipleField(SelectMultipleField): new_data.setlist(self.field_name, data_list) def render(self, data): - output = ['<ul>'] + output = ['<ul%s>' % (self.ul_class and ' class="%s"' % self.ul_class or '')] str_data_list = map(str, data) # normalize to strings for value, choice in self.choices: checked_html = '' @@ -897,10 +898,11 @@ class FilePathField(SelectField): "A SelectField whose choices are the files in a given directory." def __init__(self, field_name, path, match=None, recursive=False, is_required=False, validator_list=None): import os + from django.db.models import BLANK_CHOICE_DASH if match is not None: import re match_re = re.compile(match) - choices = [] + choices = not is_required and BLANK_CHOICE_DASH[:] or [] if recursive: for root, dirs, files in os.walk(path): for f in files: diff --git a/django/http/__init__.py b/django/http/__init__.py index bb03ab8ea5..178510c94c 100644 --- a/django/http/__init__.py +++ b/django/http/__init__.py @@ -265,6 +265,12 @@ class HttpResponseForbidden(HttpResponse): HttpResponse.__init__(self, *args, **kwargs) self.status_code = 403 +class HttpResponseNotAllowed(HttpResponse): + def __init__(self, permitted_methods): + HttpResponse.__init__(self) + self['Allow'] = ', '.join(permitted_methods) + self.status_code = 405 + class HttpResponseGone(HttpResponse): def __init__(self, *args, **kwargs): HttpResponse.__init__(self, *args, **kwargs) diff --git a/django/middleware/cache.py b/django/middleware/cache.py index b5e142a383..5510eba714 100644 --- a/django/middleware/cache.py +++ b/django/middleware/cache.py @@ -3,7 +3,7 @@ from django.core.cache import cache from django.utils.cache import get_cache_key, learn_cache_key, patch_response_headers from django.http import HttpResponseNotModified -class CacheMiddleware: +class CacheMiddleware(object): """ Cache middleware. If this is enabled, each Django-powered page will be cached for CACHE_MIDDLEWARE_SECONDS seconds. Cache is based on URLs. diff --git a/django/middleware/common.py b/django/middleware/common.py index 763918878a..acd3233e1d 100644 --- a/django/middleware/common.py +++ b/django/middleware/common.py @@ -3,7 +3,7 @@ from django import http from django.core.mail import mail_managers import md5, os -class CommonMiddleware: +class CommonMiddleware(object): """ "Common" middleware for taking care of some basic operations: @@ -39,6 +39,8 @@ class CommonMiddleware: # trailing slash or a file extension. if settings.APPEND_SLASH and (old_url[1][-1] != '/') and ('.' not in old_url[1].split('/')[-1]): new_url[1] = new_url[1] + '/' + if settings.DEBUG and request.META['REQUEST_METHOD'].lower() == 'post': + raise RuntimeError, "You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data. Change your form to point to %s%s (note the trailing slash), or set APPEND_SLASH=False in your Django settings." % (new_url[0], new_url[1]) if new_url != old_url: # Redirect if new_url[0]: diff --git a/django/middleware/doc.py b/django/middleware/doc.py index 6376fe4d5c..01c09e9c15 100644 --- a/django/middleware/doc.py +++ b/django/middleware/doc.py @@ -1,7 +1,7 @@ from django.conf import settings from django import http -class XViewMiddleware: +class XViewMiddleware(object): """ Adds an X-View header to internal HEAD requests -- used by the documentation system. """ diff --git a/django/middleware/gzip.py b/django/middleware/gzip.py index 201bec2000..cc8a68406c 100644 --- a/django/middleware/gzip.py +++ b/django/middleware/gzip.py @@ -4,7 +4,7 @@ from django.utils.cache import patch_vary_headers re_accepts_gzip = re.compile(r'\bgzip\b') -class GZipMiddleware: +class GZipMiddleware(object): """ This middleware compresses content if the browser allows gzip compression. It sets the Vary header accordingly, so that caches will base their storage diff --git a/django/middleware/http.py b/django/middleware/http.py index 2bccd60903..0a8cd67dfa 100644 --- a/django/middleware/http.py +++ b/django/middleware/http.py @@ -1,6 +1,6 @@ import datetime -class ConditionalGetMiddleware: +class ConditionalGetMiddleware(object): """ Handles conditional GET operations. If the response has a ETag or Last-Modified header, and the request has If-None-Match or diff --git a/django/middleware/locale.py b/django/middleware/locale.py index e3c95766c9..dd154e1280 100644 --- a/django/middleware/locale.py +++ b/django/middleware/locale.py @@ -3,7 +3,7 @@ from django.utils.cache import patch_vary_headers from django.utils import translation -class LocaleMiddleware: +class LocaleMiddleware(object): """ This is a very simple middleware that parses a request and decides what translation object to install in the current diff --git a/django/middleware/transaction.py b/django/middleware/transaction.py index da218ac31a..4128e012f2 100644 --- a/django/middleware/transaction.py +++ b/django/middleware/transaction.py @@ -1,7 +1,7 @@ from django.conf import settings from django.db import transaction -class TransactionMiddleware: +class TransactionMiddleware(object): """ Transaction middleware. If this is enabled, each view function will be run with commit_on_response activated - that way a save() doesn't do a direct diff --git a/django/template/__init__.py b/django/template/__init__.py index b526863fbf..08f433fec9 100644 --- a/django/template/__init__.py +++ b/django/template/__init__.py @@ -56,9 +56,10 @@ times with multiple contexts) """ import re from inspect import getargspec -from django.utils.functional import curry from django.conf import settings from django.template.context import Context, RequestContext, ContextPopException +from django.utils.functional import curry +from django.utils.text import smart_split __all__ = ('Template', 'Context', 'RequestContext', 'compile_string') @@ -74,6 +75,8 @@ BLOCK_TAG_START = '{%' BLOCK_TAG_END = '%}' VARIABLE_TAG_START = '{{' VARIABLE_TAG_END = '}}' +SINGLE_BRACE_START = '{' +SINGLE_BRACE_END = '}' ALLOWED_VARIABLE_CHARS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.' @@ -133,7 +136,7 @@ class StringOrigin(Origin): def reload(self): return self.source -class Template: +class Template(object): def __init__(self, template_string, origin=None): "Compilation stage" if settings.TEMPLATE_DEBUG and origin == None: @@ -157,22 +160,18 @@ def compile_string(template_string, origin): parser = parser_factory(lexer.tokenize()) return parser.parse() -class Token: +class Token(object): def __init__(self, token_type, contents): "The token_type must be TOKEN_TEXT, TOKEN_VAR or TOKEN_BLOCK" self.token_type, self.contents = token_type, contents def __str__(self): - return '<%s token: "%s...">' % ( - {TOKEN_TEXT: 'Text', TOKEN_VAR: 'Var', TOKEN_BLOCK: 'Block'}[self.token_type], - self.contents[:20].replace('\n', '') - ) + return '<%s token: "%s...">' % \ + ({TOKEN_TEXT: 'Text', TOKEN_VAR: 'Var', TOKEN_BLOCK: 'Block'}[self.token_type], + self.contents[:20].replace('\n', '')) - def __repr__(self): - return '<%s token: "%s">' % ( - {TOKEN_TEXT: 'Text', TOKEN_VAR: 'Var', TOKEN_BLOCK: 'Block'}[self.token_type], - self.contents[:].replace('\n', '') - ) + def split_contents(self): + return smart_split(self.contents) class Lexer(object): def __init__(self, template_string, origin): @@ -367,7 +366,6 @@ class DebugParser(Parser): if not hasattr(e, 'source'): e.source = token.source - def lexer_factory(*args, **kwargs): if settings.TEMPLATE_DEBUG: return DebugLexer(*args, **kwargs) @@ -380,8 +378,7 @@ def parser_factory(*args, **kwargs): else: return Parser(*args, **kwargs) - -class TokenParser: +class TokenParser(object): """ Subclass this and implement the top() method to parse a template line. When instantiating the parser, pass in the line from the Django template parser. @@ -544,7 +541,7 @@ class FilterExpression(object): upto = match.end() if upto != len(token): raise TemplateSyntaxError, "Could not parse the remainder: %s" % token[upto:] - self.var , self.filters = var, filters + self.var, self.filters = var, filters def resolve(self, context): try: @@ -564,7 +561,7 @@ class FilterExpression(object): def args_check(name, func, provided): provided = list(provided) plen = len(provided) - (args, varargs, varkw, defaults) = getargspec(func) + args, varargs, varkw, defaults = getargspec(func) # First argument is filter input. args.pop(0) if defaults: @@ -614,7 +611,7 @@ def resolve_variable(path, context): (The example assumes VARIABLE_ATTRIBUTE_SEPARATOR is '.') """ - if path[0] in '0123456789': + if path[0].isdigit(): number_type = '.' in path and float or int try: current = number_type(path) @@ -655,11 +652,11 @@ def resolve_variable(path, context): if getattr(e, 'silent_variable_failure', False): current = settings.TEMPLATE_STRING_IF_INVALID else: - raise + raise del bits[0] return current -class Node: +class Node(object): def render(self, context): "Return the node rendered as a string" pass @@ -820,7 +817,7 @@ class Library(object): return func def simple_tag(self,func): - (params, xx, xxx, defaults) = getargspec(func) + params, xx, xxx, defaults = getargspec(func) class SimpleNode(Node): def __init__(self, vars_to_resolve): @@ -837,7 +834,7 @@ class Library(object): def inclusion_tag(self, file_name, context_class=Context, takes_context=False): def dec(func): - (params, xx, xxx, defaults) = getargspec(func) + params, xx, xxx, defaults = getargspec(func) if takes_context: if params[0] == 'context': params = params[1:] diff --git a/django/template/context.py b/django/template/context.py index f50fb07598..44a97f95a8 100644 --- a/django/template/context.py +++ b/django/template/context.py @@ -7,7 +7,7 @@ class ContextPopException(Exception): "pop() has been called more times than push()" pass -class Context: +class Context(object): "A stack container for variable context" def __init__(self, dict_=None): dict_ = dict_ or {} diff --git a/django/template/defaultfilters.py b/django/template/defaultfilters.py index 03069121ee..453c34b0bd 100644 --- a/django/template/defaultfilters.py +++ b/django/template/defaultfilters.py @@ -330,6 +330,8 @@ def get_digit(value, arg): def date(value, arg=None): "Formats a date according to the given format" from django.utils.dateformat import format + if not value: + return '' if arg is None: arg = settings.DATE_FORMAT return format(value, arg) @@ -337,6 +339,8 @@ def date(value, arg=None): def time(value, arg=None): "Formats a time according to the given format" from django.utils.dateformat import time_format + if not value: + return '' if arg is None: arg = settings.TIME_FORMAT return time_format(value, arg) @@ -344,6 +348,8 @@ def time(value, arg=None): def timesince(value): 'Formats a date as the time since that date (i.e. "4 days, 6 hours")' from django.utils.timesince import timesince + if not value: + return '' return timesince(value) ################### diff --git a/django/template/defaulttags.py b/django/template/defaulttags.py index 18f1b9ab30..8b52b70cda 100644 --- a/django/template/defaulttags.py +++ b/django/template/defaulttags.py @@ -1,7 +1,7 @@ "Default tags used by the template system, available to all templates." from django.template import Node, NodeList, Template, Context, resolve_variable -from django.template import TemplateSyntaxError, VariableDoesNotExist, BLOCK_TAG_START, BLOCK_TAG_END, VARIABLE_TAG_START, VARIABLE_TAG_END +from django.template import TemplateSyntaxError, VariableDoesNotExist, BLOCK_TAG_START, BLOCK_TAG_END, VARIABLE_TAG_START, VARIABLE_TAG_END, SINGLE_BRACE_START, SINGLE_BRACE_END from django.template import get_library, Library, InvalidTemplateLibrary from django.conf import settings import sys @@ -149,9 +149,10 @@ class IfEqualNode(Node): return self.nodelist_false.render(context) class IfNode(Node): - def __init__(self, bool_exprs, nodelist_true, nodelist_false): + def __init__(self, bool_exprs, nodelist_true, nodelist_false, link_type): self.bool_exprs = bool_exprs self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false + self.link_type = link_type def __repr__(self): return "<If node>" @@ -171,14 +172,28 @@ class IfNode(Node): return nodes def render(self, context): - for ifnot, bool_expr in self.bool_exprs: - try: - value = bool_expr.resolve(context) - except VariableDoesNotExist: - value = None - if (value and not ifnot) or (ifnot and not value): - return self.nodelist_true.render(context) - return self.nodelist_false.render(context) + if self.link_type == IfNode.LinkTypes.or_: + for ifnot, bool_expr in self.bool_exprs: + try: + value = bool_expr.resolve(context) + except VariableDoesNotExist: + value = None + if (value and not ifnot) or (ifnot and not value): + return self.nodelist_true.render(context) + return self.nodelist_false.render(context) + else: + for ifnot, bool_expr in self.bool_exprs: + try: + value = bool_expr.resolve(context) + except VariableDoesNotExist: + value = None + if not ((value and not ifnot) or (ifnot and not value)): + return self.nodelist_false.render(context) + return self.nodelist_true.render(context) + + class LinkTypes: + and_ = 0, + or_ = 1 class RegroupNode(Node): def __init__(self, target, expression, var_name): @@ -260,7 +275,10 @@ class TemplateTagNode(Node): mapping = {'openblock': BLOCK_TAG_START, 'closeblock': BLOCK_TAG_END, 'openvariable': VARIABLE_TAG_START, - 'closevariable': VARIABLE_TAG_END} + 'closevariable': VARIABLE_TAG_END, + 'openbrace': SINGLE_BRACE_START, + 'closebrace': SINGLE_BRACE_END, + } def __init__(self, tagtype): self.tagtype = tagtype @@ -487,7 +505,7 @@ def do_ifequal(parser, token, negate): ... {% endifnotequal %} """ - bits = token.contents.split() + bits = list(token.split_contents()) if len(bits) != 3: raise TemplateSyntaxError, "%r takes two arguments" % bits[0] end_tag = 'end' + bits[0] @@ -561,11 +579,22 @@ def do_if(parser, token): if not bits: raise TemplateSyntaxError, "'if' statement requires at least one argument" # bits now looks something like this: ['a', 'or', 'not', 'b', 'or', 'c.d'] - boolpairs = ' '.join(bits).split(' or ') + bitstr = ' '.join(bits) + boolpairs = bitstr.split(' and ') boolvars = [] + if len(boolpairs) == 1: + link_type = IfNode.LinkTypes.or_ + boolpairs = bitstr.split(' or ') + else: + link_type = IfNode.LinkTypes.and_ + if ' or ' in bitstr: + raise TemplateSyntaxError, "'if' tags can't mix 'and' and 'or'" for boolpair in boolpairs: if ' ' in boolpair: - not_, boolvar = boolpair.split() + try: + not_, boolvar = boolpair.split() + except ValueError: + raise TemplateSyntaxError, "'if' statement improperly formatted" if not_ != 'not': raise TemplateSyntaxError, "Expected 'not' in if statement" boolvars.append((True, parser.compile_filter(boolvar))) @@ -578,7 +607,7 @@ def do_if(parser, token): parser.delete_first_token() else: nodelist_false = NodeList() - return IfNode(boolvars, nodelist_true, nodelist_false) + return IfNode(boolvars, nodelist_true, nodelist_false, link_type) do_if = register.tag("if", do_if) #@register.tag @@ -783,6 +812,8 @@ def templatetag(parser, token): ``closeblock`` ``%}`` ``openvariable`` ``{{`` ``closevariable`` ``}}`` + ``openbrace`` ``{`` + ``closebrace`` ``}`` ================== ======= """ bits = token.contents.split() diff --git a/django/utils/datastructures.py b/django/utils/datastructures.py index 3d7c4275bb..632e804f26 100644 --- a/django/utils/datastructures.py +++ b/django/utils/datastructures.py @@ -1,4 +1,4 @@ -class MergeDict: +class MergeDict(object): """ A simple class for creating new "virtual" dictionaries that actualy look up values in more than one dictionary, passed in the constructor. diff --git a/django/utils/dateformat.py b/django/utils/dateformat.py index 4e5f2bc8c0..0890a81a81 100644 --- a/django/utils/dateformat.py +++ b/django/utils/dateformat.py @@ -19,7 +19,7 @@ import re, time re_formatchars = re.compile(r'(?<!\\)([aABdDfFgGhHiIjlLmMnNOPrsStTUwWyYzZ])') re_escaped = re.compile(r'\\(.)') -class Formatter: +class Formatter(object): def format(self, formatstr): pieces = [] for i, piece in enumerate(re_formatchars.split(formatstr)): diff --git a/django/utils/feedgenerator.py b/django/utils/feedgenerator.py index 4c5d515f41..2eb27a40b7 100644 --- a/django/utils/feedgenerator.py +++ b/django/utils/feedgenerator.py @@ -36,7 +36,7 @@ def get_tag_uri(url, date): tag = re.sub('#', '/', tag) return 'tag:' + tag -class SyndicationFeed: +class SyndicationFeed(object): "Base class for all syndication feeds. Subclasses should provide write()" def __init__(self, title, link, description, language=None, author_email=None, author_name=None, author_link=None, subtitle=None, categories=None, @@ -108,7 +108,7 @@ class SyndicationFeed: else: return datetime.datetime.now() -class Enclosure: +class Enclosure(object): "Represents an RSS enclosure" def __init__(self, url, length, mime_type): "All args are expected to be Python Unicode objects" @@ -126,6 +126,8 @@ class RssFeed(SyndicationFeed): handler.addQuickElement(u"description", self.feed['description']) if self.feed['language'] is not None: handler.addQuickElement(u"language", self.feed['language']) + for cat in self.feed['categories']: + handler.addQuickElement(u"category", cat) self.write_items(handler) self.endChannelElement(handler) handler.endElement(u"rss") diff --git a/django/utils/text.py b/django/utils/text.py index 7b6e1182ab..7df9bc03b7 100644 --- a/django/utils/text.py +++ b/django/utils/text.py @@ -109,3 +109,21 @@ def javascript_quote(s): s = s.replace("'", "\\'") return str(ustring_re.sub(fix, s)) +smart_split_re = re.compile('("(?:[^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'(?:[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'|[^\\s]+)') +def smart_split(text): + """ + Generator that splits a string by spaces, leaving quoted phrases together. + Supports both single and double quotes, and supports escaping quotes with + backslashes. In the output, strings will keep their initial and trailing + quote marks. + >>> list(smart_split('This is "a person\'s" test.')) + ['This', 'is', '"a person\'s"', 'test.'] + """ + for bit in smart_split_re.finditer(text): + bit = bit.group(0) + if bit[0] == '"': + yield '"' + bit[1:-1].replace('\\"', '"').replace('\\\\', '\\') + '"' + elif bit[0] == "'": + yield "'" + bit[1:-1].replace("\\'", "'").replace("\\\\", "\\") + "'" + else: + yield bit diff --git a/django/views/debug.py b/django/views/debug.py index 16cf937d80..6cbbde987b 100644 --- a/django/views/debug.py +++ b/django/views/debug.py @@ -111,6 +111,12 @@ def technical_500_response(request, exc_type, exc_value, tb): }) tb = tb.tb_next + if not frames: + frames = [{ + 'filename': '<unknown>', + 'function': '?', + 'lineno': '?', + }] t = Template(TECHNICAL_500_TEMPLATE) c = Context({ 'exception_type': exc_type.__name__, diff --git a/django/views/generic/create_update.py b/django/views/generic/create_update.py index 0804cdf30b..c6d7db7af5 100644 --- a/django/views/generic/create_update.py +++ b/django/views/generic/create_update.py @@ -106,6 +106,8 @@ def update_object(request, model, object_id=None, slug=None, if request.POST: new_data = request.POST.copy() + if model._meta.has_field_type(FileField): + new_data.update(request.FILES) errors = manipulator.get_validation_errors(new_data) manipulator.do_html2python(new_data) if not errors: diff --git a/docs/add_ons.txt b/docs/add_ons.txt index 9f5dc640da..d72e92b018 100644 --- a/docs/add_ons.txt +++ b/docs/add_ons.txt @@ -49,8 +49,8 @@ humanize ======== A set of Django template filters useful for adding a "human touch" to data. -To activate these filters, add ``'django.contrib.english'`` to your -``INSTALLED_APPS`` setting. Once you've done that, use ``{% load english %}`` +To activate these filters, add ``'django.contrib.humanize'`` to your +``INSTALLED_APPS`` setting. Once you've done that, use ``{% load humanize %}`` in a template, and you'll have access to these filters: apnumber diff --git a/docs/authentication.txt b/docs/authentication.txt index c1a1f8494d..3edbc21f7a 100644 --- a/docs/authentication.txt +++ b/docs/authentication.txt @@ -355,8 +355,8 @@ Here's what ``django.contrib.auth.views.login`` does:: form. It's your responsibility to provide the login form in a template called -``registration/login.html``. This template gets passed three template context -variables: +``registration/login.html`` by default. This template gets passed three +template context variables: * ``form``: A ``FormWrapper`` object representing the login form. See the `forms documentation`_ for more on ``FormWrapper`` objects. @@ -365,6 +365,13 @@ variables: * ``site_name``: The name of the current ``Site``, according to the ``SITE_ID`` setting. See the `site framework docs`_. +If you'd prefer not to call the template ``registration/login.html``, you can +pass the ``template_name`` parameter via the extra arguments to the view in +your URLconf. For example, this URLconf line would use ``myapp/login.html`` +instead:: + + (r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'myapp/login.html'}), + Here's a sample ``registration/login.html`` template you can use as a starting point. It assumes you have a ``base.html`` template that defines a ``content`` block:: diff --git a/docs/db-api.txt b/docs/db-api.txt index 3624620609..5108949184 100644 --- a/docs/db-api.txt +++ b/docs/db-api.txt @@ -559,7 +559,7 @@ following models:: # ... hometown = models.ForeignKey(City) - class Book(meta.Model): + class Book(models.Model): # ... author = models.ForeignKey(Person) @@ -705,6 +705,64 @@ The ``DoesNotExist`` exception inherits from except ObjectDoesNotExist: print "Either the entry or blog doesn't exist." +``get_or_create(**kwargs)`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A convenience method for looking up an object with the given kwargs, creating +one if necessary. + +Returns a tuple of ``(object, created)``, where ``object`` is the retrieved or +created object and ``created`` is a boolean specifying whether a new object was +created. + +This is meant as a shortcut to boilerplatish code and is mostly useful for +data-import scripts. For example:: + + try: + obj = Person.objects.get(first_name='John', last_name='Lennon') + except Person.DoesNotExist: + obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9)) + obj.save() + +This pattern gets quite unwieldy as the number of fields in a model goes up. +The above example can be rewritten using ``get_or_create()`` like so:: + + obj, created = Person.objects.get_or_create(first_name='John', last_name='Lennon', + defaults={'birthday': date(1940, 10, 9)}) + +Any keyword arguments passed to ``get_or_create()`` -- *except* an optional one +called ``defaults`` -- will be used in a ``get()`` call. If an object is found, +``get_or_create()`` returns a tuple of that object and ``False``. If an object +is *not* found, ``get_or_create()`` will instantiate and save a new object, +returning a tuple of the new object and ``True``. The new object will be +created according to this algorithm:: + + defaults = kwargs.pop('defaults', {}) + params = dict([(k, v) for k, v in kwargs.items() if '__' not in k]) + params.update(defaults) + obj = self.model(**params) + obj.save() + +In English, that means start with any non-``'defaults'`` keyword argument that +doesn't contain a double underscore (which would indicate a non-exact lookup). +Then add the contents of ``defaults``, overriding any keys if necessary, and +use the result as the keyword arguments to the model class. + +If you have a field named ``defaults`` and want to use it as an exact lookup in +``get_or_create()``, just use ``'defaults__exact'``, like so:: + + Foo.objects.get_or_create(defaults__exact='bar', defaults={'defaults': 'baz'}) + +Finally, a word on using ``get_or_create()`` in Django views. As mentioned +earlier, ``get_or_create()`` is mostly useful in scripts that need to parse +data and create new records if existing ones aren't available. But if you need +to use ``get_or_create()`` in a view, please make sure to use it only in +``POST`` requests unless you have a good reason not to. ``GET`` requests +shouldn't have any effect on data; use ``POST`` whenever a request to a page +has a side effect on your data. For more, see `Safe methods`_ in the HTTP spec. + +.. _Safe methods: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.1 + ``count()`` ~~~~~~~~~~~ diff --git a/docs/faq.txt b/docs/faq.txt index a2c069f0ca..7238a0aef7 100644 --- a/docs/faq.txt +++ b/docs/faq.txt @@ -200,6 +200,23 @@ In the meantime, though, check out this `unofficial Django screencast`_. .. _unofficial Django screencast: http://www.throwingbeans.org/django_screencasts.html +Is Django a content-management-system (CMS)? +-------------------------------------------- + +No, Django is not a CMS, or any sort of "turnkey product" in and of itself. +It's a Web framework; it's a programming tool that lets you build Web sites. + +For example, it doesn't make much sense to compare Django to something like +Drupal_, because Django is something you use to *create* things like Drupal. + +Of course, Django's automatic admin site is fantastic and timesaving -- but +the admin site is one module of Django the framework. Furthermore, although +Django has special conveniences for building "CMS-y" apps, that doesn't mean +it's not just as appropriate for building "non-CMS-y" apps (whatever that +means!). + +.. _Drupal: http://drupal.org/ + When will you release Django 1.0? --------------------------------- @@ -222,7 +239,7 @@ How can I download the Django documentation to read it offline? --------------------------------------------------------------- The Django docs are available in the ``docs`` directory of each Django tarball -release. These docs are in ReST (restructured text) format, and each text file +release. These docs are in ReST (ReStructured Text) format, and each text file corresponds to a Web page on the official Django site. Because the documentation is `stored in revision control`_, you can browse @@ -297,13 +314,16 @@ as long as that server has WSGI_ hooks. See the `server arrangements wiki page`_ How do I install mod_python on Windows? --------------------------------------- - * For Python 2.4, check out this `guide to mod_python & Python 2.3`_. + * For Python 2.4, grab mod_python from `win32 build of mod_python for + Python 2.4`_. + * For Python 2.4, check out this `Django on Windows howto`_. * For Python 2.3, grab mod_python from http://www.modpython.org/ and read `Running mod_python on Apache on Windows2000`_. * Also, try this (not Windows-specific) `guide to getting mod_python working`_. -.. _`guide to mod_python & Python 2.3`: http://www.lehuen.com/nicolas/index.php/2005/02/21/39-win32-build-of-mod_python-314-for-python-24 +.. _`win32 build of mod_python for Python 2.4`: http://www.lehuen.com/nicolas/index.php/2005/02/21/39-win32-build-of-mod_python-314-for-python-24 +.. _`Django on Windows howto`: http://thinkhole.org/wp/2006/04/03/django-on-windows-howto/ .. _`Running mod_python on Apache on Windows2000`: http://groups-beta.google.com/group/comp.lang.python/msg/139af8c83a5a9d4f .. _`guide to getting mod_python working`: http://www.dscpl.com.au/articles/modpython-001.html @@ -388,19 +408,12 @@ Using a ``FileField`` or an ``ImageField`` in a model takes a few steps: If I make changes to a model, how do I update the database? ----------------------------------------------------------- -If you don't mind clearing data, just pipe the output of the appropriate -``django-admin.py sqlreset`` command into your database's command-line utility. -For example:: - - django-admin.py sqlreset appname | psql dbname +If you don't mind clearing data, your project's ``manage.py`` utility has an +option to reset the SQL for a particular application:: -That "psql" assumes you're using PostgreSQL. If you're using MySQL, use the -appropriate command-line utility, ``mysql``. + manage.py reset appname -``django-admin.py sqlreset`` outputs SQL that clears the app's database -table(s) and creates new ones. The above command uses a Unix pipe to send the -SQL directly to the PostgreSQL command-line utility, which accepts SQL as -input. +This drops any tables associated with ``appname`` and recreates them. If you do care about deleting data, you'll have to execute the ``ALTER TABLE`` statements manually in your database. That's the way we've always done it, diff --git a/docs/forms.txt b/docs/forms.txt index 2f8a3106fc..5026bc1bab 100644 --- a/docs/forms.txt +++ b/docs/forms.txt @@ -15,6 +15,8 @@ We'll take a top-down approach to examining Django's form validation framework, because much of the time you won't need to use the lower-level APIs. Throughout this document, we'll be working with the following model, a "place" object:: + from django.db import models + PLACE_TYPES = ( (1, 'Bar'), (2, 'Restaurant'), @@ -22,13 +24,13 @@ this document, we'll be working with the following model, a "place" object:: (4, 'Secret Hideout'), ) - class Place(meta.Model): - name = meta.CharField(maxlength=100) - address = meta.CharField(maxlength=100, blank=True) - city = meta.CharField(maxlength=50, blank=True) - state = meta.USStateField() - zip_code = meta.CharField(maxlength=5, blank=True) - place_type = meta.IntegerField(choices=PLACE_TYPES) + class Place(models.Model): + name = models.CharField(maxlength=100) + address = models.CharField(maxlength=100, blank=True) + city = models.CharField(maxlength=50, blank=True) + state = models.USStateField() + zip_code = models.CharField(maxlength=5, blank=True) + place_type = models.IntegerField(choices=PLACE_TYPES) class Admin: pass diff --git a/docs/i18n.txt b/docs/i18n.txt index e6660f939d..1220ea95b3 100644 --- a/docs/i18n.txt +++ b/docs/i18n.txt @@ -133,8 +133,8 @@ For example, to translate a model's ``help_text``, do the following:: from django.utils.translation import gettext_lazy - class MyThing(meta.Model): - name = meta.CharField(help_text=gettext_lazy('This is the help text')) + class MyThing(models.Model): + name = models.CharField(help_text=gettext_lazy('This is the help text')) In this example, ``gettext_lazy()`` stores a lazy reference to the string -- not the actual translation. The translation itself will be done when the string @@ -145,8 +145,8 @@ If you don't like the verbose name ``gettext_lazy``, you can just alias it as from django.utils.translation import gettext_lazy as _ - class MyThing(meta.Model): - name = meta.CharField(help_text=_('This is the help text')) + class MyThing(models.Model): + name = models.CharField(help_text=_('This is the help text')) Always use lazy translations in `Django models`_. And it's a good idea to add translations for the field names and table names, too. This means writing @@ -155,8 +155,8 @@ class, though:: from django.utils.translation import gettext_lazy as _ - class MyThing(meta.Model): - name = meta.CharField(_('name'), help_text=_('This is the help text')) + class MyThing(models.Model): + name = models.CharField(_('name'), help_text=_('This is the help text')) class Meta: verbose_name = _('my thing') verbose_name_plural = _('mythings') @@ -230,12 +230,17 @@ Each ``RequestContext`` has access to two translation-specific variables: language code and the second is the language name (in that language). * ``LANGUAGE_CODE`` is the current user's preferred language, as a string. Example: ``en-us``. (See "How language preference is discovered", below.) + * ``LANGUAGE_BIDI`` is the current language's direction. If True, it's a + right-to-left language, e.g: Hebrew, Arabic. If False it's a + left-to-right language, e.g: English, French, German etc. + If you don't use the ``RequestContext`` extension, you can get those values with -two tags:: +three tags:: {% get_current_language as LANGUAGE_CODE %} {% get_available_languages as LANGUAGES %} + {% get_current_language_bidi as LANGUAGE_BIDI %} These tags also require a ``{% load i18n %}``. diff --git a/docs/model-api.txt b/docs/model-api.txt index c6707a691b..0dc98416a3 100644 --- a/docs/model-api.txt +++ b/docs/model-api.txt @@ -445,7 +445,8 @@ empty value. If a field has ``blank=False``, the field will be required. ``choices`` ~~~~~~~~~~~ -A list of 2-tuples to use as choices for this field. +An iterable (e.g., a list or tuple) of 2-tuples to use as choices for this +field. If this is given, Django's admin will use a select box instead of the standard text field and will limit choices to the choices given. @@ -481,6 +482,12 @@ or outside your model class altogether:: class Foo(models.Model): gender = models.CharField(maxlength=1, choices=GENDER_CHOICES) +Finally, note that choices can be any iterable object -- not necessarily a +list or tuple. This lets you construct choices dynamically. But if you find +yourself hacking ``choices`` to be dynamic, you're probably better off using +a proper database table with a ``ForeignKey``. ``choices`` is meant for static +data that doesn't change much, if ever. + ``core`` ~~~~~~~~ @@ -1627,10 +1634,10 @@ to happen whenever you save an object. For example:: name = models.CharField(maxlength=100) tagline = models.TextField() - def save(self): - do_something() - super(Blog, self).save() # Call the "real" save() method. - do_something_else() + def save(self): + do_something() + super(Blog, self).save() # Call the "real" save() method. + do_something_else() You can also prevent saving:: @@ -1638,11 +1645,11 @@ You can also prevent saving:: name = models.CharField(maxlength=100) tagline = models.TextField() - def save(self): - if self.name == "Yoko Ono's blog": - return # Yoko shall never have her own blog! - else: - super(Blog, self).save() # Call the "real" save() method. + def save(self): + if self.name == "Yoko Ono's blog": + return # Yoko shall never have her own blog! + else: + super(Blog, self).save() # Call the "real" save() method. .. _database API docs: http://www.djangoproject.com/documentation/db_api/ diff --git a/docs/request_response.txt b/docs/request_response.txt index 33e5ef4d84..4939cac76f 100644 --- a/docs/request_response.txt +++ b/docs/request_response.txt @@ -400,6 +400,10 @@ types of HTTP responses. Like ``HttpResponse``, these subclasses live in ``HttpResponseForbidden`` Acts just like ``HttpResponse`` but uses a 403 status code. +``HttpResponseNotAllowed`` + Like ``HttpResponse``, but uses a 405 status code. Takes a single, + required argument: a list of permitted methods (e.g. ``['GET', 'POST']``). + ``HttpResponseGone`` Acts just like ``HttpResponse`` but uses a 410 status code. diff --git a/docs/syndication_feeds.txt b/docs/syndication_feeds.txt index b7b0a9047b..4f77c4ff21 100644 --- a/docs/syndication_feeds.txt +++ b/docs/syndication_feeds.txt @@ -439,6 +439,23 @@ This example illustrates all possible attributes and methods for a ``Feed`` clas author_link = 'http://www.example.com/' # Hard-coded author URL. + # CATEGORIES -- One of the following three is optional. The framework + # looks for them in this order. In each case, the method/attribute + # should return an iterable object that returns strings. + + def categories(self, obj): + """ + Takes the object returned by get_object() and returns the feed's + categories as iterable over strings. + """ + + def categories(self): + """ + Returns the feed's categories as iterable over strings. + """ + + categories = ("python", "django") # Hard-coded list of categories. + # ITEMS -- One of the following three is required. The framework looks # for them in this order. @@ -602,6 +619,25 @@ This example illustrates all possible attributes and methods for a ``Feed`` clas item_pubdate = datetime.datetime(2005, 5, 3) # Hard-coded pubdate. + # ITEM CATEGORIES -- It's optional to use one of these three. This is + # a hook that specifies how to get the list of categories for a given + # item. In each case, the method/attribute should return an iterable + # object that returns strings. + + def item_categories(self, item): + """ + Takes an item, as returned by items(), and returns the item's + categories. + """ + + def item_categories(self): + """ + Returns the categories for every item in the feed. + """ + + item_categories = ("python", "django") # Hard-coded categories. + + The low-level framework ======================= diff --git a/docs/templates.txt b/docs/templates.txt index c191b409f4..5f397c5a60 100644 --- a/docs/templates.txt +++ b/docs/templates.txt @@ -454,8 +454,12 @@ displayed by the ``{{ athlete_list|length }}`` variable. As you can see, the ``if`` tag can take an option ``{% else %}`` clause that will be displayed if the test fails. -``if`` tags may use ``or`` or ``not`` to test a number of variables or to negate -a given variable:: +``if`` tags may use ``and``, ``or`` or ``not`` to test a number of variables or +to negate a given variable:: + + {% if athlete_list and coach_list %} + Both athletes and coaches are available. + {% endif %} {% if not athlete_list %} There are no athletes. @@ -468,16 +472,24 @@ a given variable:: {% if not athlete_list or coach_list %} There are no athletes or there are some coaches (OK, so writing English translations of boolean logic sounds - stupid; it's not my fault). + stupid; it's not our fault). + {% endif %} + + {% if athlete_list and not coach_list %} + There are some athletes and absolutely no coaches. {% endif %} -For simplicity, ``if`` tags do not allow ``and`` clauses; use nested ``if`` -tags instead:: +``if`` tags don't allow ``and`` and ``or`` clauses within the same tag, because +the order of logic would be ambiguous. For example, this is invalid:: + + {% if athlete_list and coach_list or cheerleader_list %} + +If you need to combine ``and`` and ``or`` to do advanced logic, just use nested +``if`` tags. For example:: {% if athlete_list %} - {% if coach_list %} - Number of athletes: {{ athlete_list|length }}. - Number of coaches: {{ coach_list|length }}. + {% if coach_list or cheerleader_list %} + We have athletes, and either coaches or cheerleaders! {% endif %} {% endif %} @@ -754,6 +766,8 @@ The argument tells which template bit to output: ``closeblock`` ``%}`` ``openvariable`` ``{{`` ``closevariable`` ``}}`` + ``openbrace`` ``{`` + ``closebrace`` ``}`` ================== ======= widthratio diff --git a/docs/templates_python.txt b/docs/templates_python.txt index dea5bcbee6..5e3038ebb4 100644 --- a/docs/templates_python.txt +++ b/docs/templates_python.txt @@ -502,12 +502,13 @@ Although the Django template language comes with several default tags and filters, you might want to write your own. It's easy to do. First, create a ``templatetags`` package in the appropriate Django app's -package. It should be on the same level as ``models``, ``views.py``, etc. For +package. It should be on the same level as ``models.py``, ``views.py``, etc. For example:: polls/ - models/ + models.py templatetags/ + views.py Add two files to the ``templatetags`` package: an ``__init__.py`` file and a file that will contain your custom tag/filter definitions. The name of the diff --git a/tests/modeltests/custom_pk/models.py b/tests/modeltests/custom_pk/models.py index 6193852adf..f7b790ca21 100644 --- a/tests/modeltests/custom_pk/models.py +++ b/tests/modeltests/custom_pk/models.py @@ -8,7 +8,8 @@ this behavior by explicitly adding ``primary_key=True`` to a field. from django.db import models class Employee(models.Model): - employee_code = models.CharField(maxlength=10, primary_key=True) + employee_code = models.CharField(maxlength=10, primary_key=True, + db_column = 'code') first_name = models.CharField(maxlength=20) last_name = models.CharField(maxlength=20) class Meta: diff --git a/tests/modeltests/empty/__init__.py b/tests/modeltests/empty/__init__.py new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/tests/modeltests/empty/__init__.py diff --git a/tests/modeltests/empty/models.py b/tests/modeltests/empty/models.py new file mode 100644 index 0000000000..c50878398d --- /dev/null +++ b/tests/modeltests/empty/models.py @@ -0,0 +1,24 @@ +""" +Empty model tests + +These test that things behave sensibly for the rare corner-case of a model with +no fields. +""" + +from django.db import models + +class Empty(models.Model): + pass + +API_TESTS = """ +>>> m = Empty() +>>> m.id +>>> m.save() +>>> m2 = Empty() +>>> m2.save() +>>> len(Empty.objects.all()) +2 +>>> m.id is not None +True + +""" diff --git a/tests/modeltests/generic_relations/__init__.py b/tests/modeltests/generic_relations/__init__.py new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/tests/modeltests/generic_relations/__init__.py diff --git a/tests/modeltests/generic_relations/models.py b/tests/modeltests/generic_relations/models.py new file mode 100644 index 0000000000..a9a775ad6e --- /dev/null +++ b/tests/modeltests/generic_relations/models.py @@ -0,0 +1,108 @@ +""" +33. Generic relations + +Generic relations let an object have a foreign key to any object through a +content-type/object-id field. A generic foreign key can point to any object, +be it animal, vegetable, or mineral. + +The cannonical example is tags (although this example implementation is *far* +from complete). +""" + +from django.db import models +from django.contrib.contenttypes.models import ContentType + +class TaggedItem(models.Model): + """A tag on an item.""" + tag = models.SlugField() + content_type = models.ForeignKey(ContentType) + object_id = models.PositiveIntegerField() + + content_object = models.GenericForeignKey() + + class Meta: + ordering = ["tag"] + + def __str__(self): + return self.tag + +class Animal(models.Model): + common_name = models.CharField(maxlength=150) + latin_name = models.CharField(maxlength=150) + + tags = models.GenericRelation(TaggedItem) + + def __str__(self): + return self.common_name + +class Vegetable(models.Model): + name = models.CharField(maxlength=150) + is_yucky = models.BooleanField(default=True) + + tags = models.GenericRelation(TaggedItem) + + def __str__(self): + return self.name + +class Mineral(models.Model): + name = models.CharField(maxlength=150) + hardness = models.PositiveSmallIntegerField() + + # note the lack of an explicit GenericRelation here... + + def __str__(self): + return self.name + +API_TESTS = """ +# Create the world in 7 lines of code... +>>> lion = Animal(common_name="Lion", latin_name="Panthera leo") +>>> platypus = Animal(common_name="Platypus", latin_name="Ornithorhynchus anatinus") +>>> eggplant = Vegetable(name="Eggplant", is_yucky=True) +>>> bacon = Vegetable(name="Bacon", is_yucky=False) +>>> quartz = Mineral(name="Quartz", hardness=7) +>>> for o in (lion, platypus, eggplant, bacon, quartz): +... o.save() + +# Objects with declared GenericRelations can be tagged directly -- the API +# mimics the many-to-many API +>>> lion.tags.create(tag="yellow") +<TaggedItem: yellow> +>>> lion.tags.create(tag="hairy") +<TaggedItem: hairy> +>>> bacon.tags.create(tag="fatty") +<TaggedItem: fatty> +>>> bacon.tags.create(tag="salty") +<TaggedItem: salty> + +>>> lion.tags.all() +[<TaggedItem: hairy>, <TaggedItem: yellow>] +>>> bacon.tags.all() +[<TaggedItem: fatty>, <TaggedItem: salty>] + +# You can easily access the content object like a foreign key +>>> t = TaggedItem.objects.get(tag="salty") +>>> t.content_object +<Vegetable: Bacon> + +# Recall that the Mineral class doesn't have an explicit GenericRelation +# defined. That's OK since you can create TaggedItems explicitally. +>>> tag1 = TaggedItem(content_object=quartz, tag="shiny") +>>> tag2 = TaggedItem(content_object=quartz, tag="clearish") +>>> tag1.save() +>>> tag2.save() + +# However, not having the convience takes a small toll when it comes +# to do lookups +>>> from django.contrib.contenttypes.models import ContentType +>>> ctype = ContentType.objects.get_for_model(quartz) +>>> TaggedItem.objects.filter(content_type__pk=ctype.id, object_id=quartz.id) +[<TaggedItem: clearish>, <TaggedItem: shiny>] + +# You can set a generic foreign key in the way you'd expect +>>> tag1.content_object = platypus +>>> tag1.save() +>>> platypus.tags.all() +[<TaggedItem: shiny>] +>>> TaggedItem.objects.filter(content_type__pk=ctype.id, object_id=quartz.id) +[<TaggedItem: clearish>] +"""
\ No newline at end of file diff --git a/tests/modeltests/get_or_create/__init__.py b/tests/modeltests/get_or_create/__init__.py new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/tests/modeltests/get_or_create/__init__.py diff --git a/tests/modeltests/get_or_create/models.py b/tests/modeltests/get_or_create/models.py new file mode 100644 index 0000000000..10a8721afc --- /dev/null +++ b/tests/modeltests/get_or_create/models.py @@ -0,0 +1,52 @@ +""" +32. get_or_create() + +get_or_create() does what it says: it tries to look up an object with the given +parameters. If an object isn't found, it creates one with the given parameters. +""" + +from django.db import models + +class Person(models.Model): + first_name = models.CharField(maxlength=100) + last_name = models.CharField(maxlength=100) + birthday = models.DateField() + + def __str__(self): + return '%s %s' % (self.first_name, self.last_name) + +API_TESTS = """ +# Acting as a divine being, create an Person. +>>> from datetime import date +>>> p = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9)) +>>> p.save() + +# Only one Person is in the database at this point. +>>> Person.objects.count() +1 + +# get_or_create() a person with similar first names. +>>> p, created = Person.objects.get_or_create(first_name='John', last_name='Lennon', defaults={'birthday': date(1940, 10, 9)}) + +# get_or_create() didn't have to create an object. +>>> created +False + +# There's still only one Person in the database. +>>> Person.objects.count() +1 + +# get_or_create() a Person with a different name. +>>> p, created = Person.objects.get_or_create(first_name='George', last_name='Harrison', defaults={'birthday': date(1943, 2, 25)}) +>>> created +True +>>> Person.objects.count() +2 + +# If we execute the exact same statement, it won't create a Person. +>>> p, created = Person.objects.get_or_create(first_name='George', last_name='Harrison', defaults={'birthday': date(1943, 2, 25)}) +>>> created +False +>>> Person.objects.count() +2 +""" diff --git a/tests/modeltests/invalid_models/models.py b/tests/modeltests/invalid_models/models.py index 127cc9e0d2..1720dd96d3 100644 --- a/tests/modeltests/invalid_models/models.py +++ b/tests/modeltests/invalid_models/models.py @@ -74,7 +74,7 @@ invalid_models.fielderrors: "floatfield": FloatFields require a "decimal_places" invalid_models.fielderrors: "floatfield": FloatFields require a "max_digits" attribute. invalid_models.fielderrors: "filefield": FileFields require an "upload_to" attribute. invalid_models.fielderrors: "prepopulate": prepopulate_from should be a list or tuple. -invalid_models.fielderrors: "choices": "choices" should be either a tuple or list. +invalid_models.fielderrors: "choices": "choices" should be iterable (e.g., a tuple or list). invalid_models.fielderrors: "choices2": "choices" should be a sequence of two-tuples. invalid_models.fielderrors: "choices2": "choices" should be a sequence of two-tuples. invalid_models.fielderrors: "index": "db_index" should be either None, True or False. diff --git a/tests/modeltests/properties/models.py b/tests/modeltests/properties/models.py index e9d8da9594..3b0133bf8a 100644 --- a/tests/modeltests/properties/models.py +++ b/tests/modeltests/properties/models.py @@ -12,8 +12,14 @@ class Person(models.Model): def _get_full_name(self): return "%s %s" % (self.first_name, self.last_name) + + def _set_full_name(self, combined_name): + self.first_name, self.last_name = combined_name.split(' ', 1) + full_name = property(_get_full_name) + full_name_2 = property(_get_full_name, _set_full_name) + API_TESTS = """ >>> a = Person(first_name='John', last_name='Lennon') >>> a.save() @@ -25,4 +31,10 @@ API_TESTS = """ Traceback (most recent call last): ... AttributeError: can't set attribute + +# But "full_name_2" has, and it can be used to initialise the class. +>>> a2 = Person(full_name_2 = 'Paul McCartney') +>>> a2.save() +>>> a2.first_name +'Paul' """ diff --git a/tests/othertests/templates.py b/tests/othertests/templates.py index ed7105bb71..96ad330917 100644 --- a/tests/othertests/templates.py +++ b/tests/othertests/templates.py @@ -169,8 +169,7 @@ TEMPLATE_TESTS = { 'comment-tag05': ("foo{% comment %} {% somerandomtag %} {% endcomment %}", {}, "foo"), ### CYCLE TAG ############################################################# - #'cycleXX': ('', {}, ''), - 'cycle01': ('{% cycle a, %}', {}, 'a'), + 'cycle01': ('{% cycle a %}', {}, template.TemplateSyntaxError), 'cycle02': ('{% cycle a,b,c as abc %}{% cycle abc %}', {}, 'ab'), 'cycle03': ('{% cycle a,b,c as abc %}{% cycle abc %}{% cycle abc %}', {}, 'abc'), 'cycle04': ('{% cycle a,b,c as abc %}{% cycle abc %}{% cycle abc %}{% cycle abc %}', {}, 'abca'), @@ -193,13 +192,11 @@ TEMPLATE_TESTS = { 'exception04': ("{% extends 'inheritance17' %}{% block first %}{% echo 400 %}5678{% endblock %}", {}, template.TemplateSyntaxError), ### FILTER TAG ############################################################ - #'filterXX': ('', {}, ''), 'filter01': ('{% filter upper %}{% endfilter %}', {}, ''), 'filter02': ('{% filter upper %}django{% endfilter %}', {}, 'DJANGO'), 'filter03': ('{% filter upper|lower %}django{% endfilter %}', {}, 'django'), ### FIRSTOF TAG ########################################################### - #'firstofXX': ('', {}, ''), 'firstof01': ('{% firstof a b c %}', {'a':0,'b':0,'c':0}, ''), 'firstof02': ('{% firstof a b c %}', {'a':1,'b':0,'c':0}, '1'), 'firstof03': ('{% firstof a b c %}', {'a':0,'b':2,'c':0}, '2'), @@ -220,8 +217,79 @@ TEMPLATE_TESTS = { 'if-tag02': ("{% if foo %}yes{% else %}no{% endif %}", {"foo": False}, "no"), 'if-tag03': ("{% if foo %}yes{% else %}no{% endif %}", {}, "no"), + # AND + 'if-tag-and01': ("{% if foo and bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': True}, 'yes'), + 'if-tag-and02': ("{% if foo and bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': False}, 'no'), + 'if-tag-and03': ("{% if foo and bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': True}, 'no'), + 'if-tag-and04': ("{% if foo and bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': False}, 'no'), + 'if-tag-and05': ("{% if foo and bar %}yes{% else %}no{% endif %}", {'foo': False}, 'no'), + 'if-tag-and06': ("{% if foo and bar %}yes{% else %}no{% endif %}", {'bar': False}, 'no'), + 'if-tag-and07': ("{% if foo and bar %}yes{% else %}no{% endif %}", {'foo': True}, 'no'), + 'if-tag-and08': ("{% if foo and bar %}yes{% else %}no{% endif %}", {'bar': True}, 'no'), + + # OR + 'if-tag-or01': ("{% if foo or bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': True}, 'yes'), + 'if-tag-or02': ("{% if foo or bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': False}, 'yes'), + 'if-tag-or03': ("{% if foo or bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': True}, 'yes'), + 'if-tag-or04': ("{% if foo or bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': False}, 'no'), + 'if-tag-or05': ("{% if foo or bar %}yes{% else %}no{% endif %}", {'foo': False}, 'no'), + 'if-tag-or06': ("{% if foo or bar %}yes{% else %}no{% endif %}", {'bar': False}, 'no'), + 'if-tag-or07': ("{% if foo or bar %}yes{% else %}no{% endif %}", {'foo': True}, 'yes'), + 'if-tag-or08': ("{% if foo or bar %}yes{% else %}no{% endif %}", {'bar': True}, 'yes'), + + # TODO: multiple ORs + + # NOT + 'if-tag-not01': ("{% if not foo %}no{% else %}yes{% endif %}", {'foo': True}, 'yes'), + 'if-tag-not02': ("{% if not %}yes{% else %}no{% endif %}", {'foo': True}, 'no'), + 'if-tag-not03': ("{% if not %}yes{% else %}no{% endif %}", {'not': True}, 'yes'), + 'if-tag-not04': ("{% if not not %}no{% else %}yes{% endif %}", {'not': True}, 'yes'), + 'if-tag-not05': ("{% if not not %}no{% else %}yes{% endif %}", {}, 'no'), + + 'if-tag-not06': ("{% if foo and not bar %}yes{% else %}no{% endif %}", {}, 'no'), + 'if-tag-not07': ("{% if foo and not bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': True}, 'no'), + 'if-tag-not08': ("{% if foo and not bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': False}, 'yes'), + 'if-tag-not09': ("{% if foo and not bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': True}, 'no'), + 'if-tag-not10': ("{% if foo and not bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': False}, 'no'), + + 'if-tag-not11': ("{% if not foo and bar %}yes{% else %}no{% endif %}", {}, 'no'), + 'if-tag-not12': ("{% if not foo and bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': True}, 'no'), + 'if-tag-not13': ("{% if not foo and bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': False}, 'no'), + 'if-tag-not14': ("{% if not foo and bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': True}, 'yes'), + 'if-tag-not15': ("{% if not foo and bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': False}, 'no'), + + 'if-tag-not16': ("{% if foo or not bar %}yes{% else %}no{% endif %}", {}, 'yes'), + 'if-tag-not17': ("{% if foo or not bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': True}, 'yes'), + 'if-tag-not18': ("{% if foo or not bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': False}, 'yes'), + 'if-tag-not19': ("{% if foo or not bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': True}, 'no'), + 'if-tag-not20': ("{% if foo or not bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': False}, 'yes'), + + 'if-tag-not21': ("{% if not foo or bar %}yes{% else %}no{% endif %}", {}, 'yes'), + 'if-tag-not22': ("{% if not foo or bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': True}, 'yes'), + 'if-tag-not23': ("{% if not foo or bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': False}, 'no'), + 'if-tag-not24': ("{% if not foo or bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': True}, 'yes'), + 'if-tag-not25': ("{% if not foo or bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': False}, 'yes'), + + 'if-tag-not26': ("{% if not foo and not bar %}yes{% else %}no{% endif %}", {}, 'yes'), + 'if-tag-not27': ("{% if not foo and not bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': True}, 'no'), + 'if-tag-not28': ("{% if not foo and not bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': False}, 'no'), + 'if-tag-not29': ("{% if not foo and not bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': True}, 'no'), + 'if-tag-not30': ("{% if not foo and not bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': False}, 'yes'), + + 'if-tag-not31': ("{% if not foo or not bar %}yes{% else %}no{% endif %}", {}, 'yes'), + 'if-tag-not32': ("{% if not foo or not bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': True}, 'no'), + 'if-tag-not33': ("{% if not foo or not bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': False}, 'yes'), + 'if-tag-not34': ("{% if not foo or not bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': True}, 'yes'), + 'if-tag-not35': ("{% if not foo or not bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': False}, 'yes'), + + # AND and OR raises a TemplateSyntaxError + 'if-tag-error01': ("{% if foo or bar and baz %}yes{% else %}no{% endif %}", {'foo': False, 'bar': False}, template.TemplateSyntaxError), + 'if-tag-error02': ("{% if foo and %}yes{% else %}no{% endif %}", {'foo': True}, template.TemplateSyntaxError), + 'if-tag-error03': ("{% if foo or %}yes{% else %}no{% endif %}", {'foo': True}, template.TemplateSyntaxError), + 'if-tag-error04': ("{% if not foo and %}yes{% else %}no{% endif %}", {'foo': True}, template.TemplateSyntaxError), + 'if-tag-error05': ("{% if not foo or %}yes{% else %}no{% endif %}", {'foo': True}, template.TemplateSyntaxError), + ### IFCHANGED TAG ######################################################### - #'ifchangedXX': ('', {}, ''), 'ifchanged01': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% endfor %}', { 'num': (1,2,3) }, '123'), 'ifchanged02': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% endfor %}', { 'num': (1,1,3) }, '13'), 'ifchanged03': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% endfor %}', { 'num': (1,1,1) }, '1'), @@ -238,6 +306,18 @@ TEMPLATE_TESTS = { 'ifequal09': ('{% ifequal a "test" %}yes{% else %}no{% endifequal %}', {}, "no"), 'ifequal10': ('{% ifequal a b %}yes{% else %}no{% endifequal %}', {}, "yes"), + # SMART SPLITTING + 'ifequal-split01': ('{% ifequal a "test man" %}yes{% else %}no{% endifequal %}', {}, "no"), + 'ifequal-split02': ('{% ifequal a "test man" %}yes{% else %}no{% endifequal %}', {'a': 'foo'}, "no"), + 'ifequal-split03': ('{% ifequal a "test man" %}yes{% else %}no{% endifequal %}', {'a': 'test man'}, "yes"), + 'ifequal-split04': ("{% ifequal a 'test man' %}yes{% else %}no{% endifequal %}", {'a': 'test man'}, "yes"), + 'ifequal-split05': ("{% ifequal a 'i \"love\" you' %}yes{% else %}no{% endifequal %}", {'a': ''}, "no"), + 'ifequal-split06': ("{% ifequal a 'i \"love\" you' %}yes{% else %}no{% endifequal %}", {'a': 'i "love" you'}, "yes"), + 'ifequal-split07': ("{% ifequal a 'i \"love\" you' %}yes{% else %}no{% endifequal %}", {'a': 'i love you'}, "no"), + 'ifequal-split08': (r"{% ifequal a 'I\'m happy' %}yes{% else %}no{% endifequal %}", {'a': "I'm happy"}, "yes"), + 'ifequal-split09': (r"{% ifequal a 'slash\man' %}yes{% else %}no{% endifequal %}", {'a': r"slash\man"}, "yes"), + 'ifequal-split10': (r"{% ifequal a 'slash\man' %}yes{% else %}no{% endifequal %}", {'a': r"slashman"}, "no"), + ### IFNOTEQUAL TAG ######################################################## 'ifnotequal01': ("{% ifnotequal a b %}yes{% endifnotequal %}", {"a": 1, "b": 2}, "yes"), 'ifnotequal02': ("{% ifnotequal a b %}yes{% endifnotequal %}", {"a": 1, "b": 1}, ""), @@ -388,7 +468,6 @@ TEMPLATE_TESTS = { """), ### REGROUP TAG ########################################################### - #'regroupXX': ('', {}, ''), 'regroup01': ('{% regroup data by bar as grouped %}' + \ '{% for group in grouped %}' + \ '{{ group.grouper }}:' + \ @@ -414,16 +493,18 @@ TEMPLATE_TESTS = { {}, ''), ### TEMPLATETAG TAG ####################################################### - #'templatetagXX': ('', {}, ''), 'templatetag01': ('{% templatetag openblock %}', {}, '{%'), 'templatetag02': ('{% templatetag closeblock %}', {}, '%}'), 'templatetag03': ('{% templatetag openvariable %}', {}, '{{'), 'templatetag04': ('{% templatetag closevariable %}', {}, '}}'), 'templatetag05': ('{% templatetag %}', {}, template.TemplateSyntaxError), 'templatetag06': ('{% templatetag foo %}', {}, template.TemplateSyntaxError), + 'templatetag07': ('{% templatetag openbrace %}', {}, '{'), + 'templatetag08': ('{% templatetag closebrace %}', {}, '}'), + 'templatetag09': ('{% templatetag openbrace %}{% templatetag openbrace %}', {}, '{{'), + 'templatetag10': ('{% templatetag closebrace %}{% templatetag closebrace %}', {}, '}}'), ### WIDTHRATIO TAG ######################################################## - #'widthratioXX': ('', {}, ''), 'widthratio01': ('{% widthratio a b 0 %}', {'a':50,'b':100}, '0'), 'widthratio02': ('{% widthratio a b 100 %}', {'a':0,'b':0}, ''), 'widthratio03': ('{% widthratio a b 100 %}', {'a':0,'b':100}, '0'), @@ -440,11 +521,11 @@ TEMPLATE_TESTS = { 'widthratio08': ('{% widthratio %}', {}, template.TemplateSyntaxError), 'widthratio09': ('{% widthratio a b %}', {'a':50,'b':100}, template.TemplateSyntaxError), 'widthratio10': ('{% widthratio a b 100.0 %}', {'a':50,'b':100}, template.TemplateSyntaxError), - + ### NOW TAG ######################################################## # Simple case 'now01' : ('{% now "j n Y"%}', {}, str(datetime.now().day) + ' ' + str(datetime.now().month) + ' ' + str(datetime.now().year)), - + # Check parsing of escaped and special characters 'now02' : ('{% now "j "n" Y"%}', {}, template.TemplateSyntaxError), # 'now03' : ('{% now "j \"n\" Y"%}', {}, str(datetime.now().day) + '"' + str(datetime.now().month) + '"' + str(datetime.now().year)), diff --git a/tests/runtests.py b/tests/runtests.py index f0eee97ec5..87cad83124 100755 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -21,14 +21,14 @@ def log_error(model_name, title, description): MODEL_TEST_DIR = os.path.join(os.path.dirname(__file__), MODEL_TESTS_DIR_NAME) ALWAYS_INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.comments', 'django.contrib.contenttypes', + 'django.contrib.auth', + 'django.contrib.sites', 'django.contrib.flatpages', 'django.contrib.redirects', 'django.contrib.sessions', - 'django.contrib.sites', + 'django.contrib.comments', + 'django.contrib.admin', ] def get_test_models(): @@ -148,6 +148,12 @@ class TestRunner: # Initialize the test database. cursor = connection.cursor() + + # Install the core always installed apps + for app in ALWAYS_INSTALLED_APPS: + self.output(1, "Installing contrib app %s" % app) + mod = __import__(app + ".models", '', '', ['']) + management.install(mod) # Run the tests for each test model. self.output(1, "Running app tests") |