diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py index 5c8cacee7c..f05494a593 100644 --- a/django/conf/global_settings.py +++ b/django/conf/global_settings.py @@ -136,9 +136,6 @@ ALLOWED_INCLUDE_ROOTS = () # is an admin. ADMIN_FOR = () -# Whether to check the flat-pages table as a last resort for all 404 errors. -USE_FLAT_PAGES = True - # 404s that may be ignored. IGNORABLE_404_STARTS = ('/cgi-bin/', '/_vti_bin', '/_vti_inf') IGNORABLE_404_ENDS = ('mail.pl', 'mailform.pl', 'mail.cgi', 'mailform.cgi', 'favicon.ico', '.php') diff --git a/django/conf/locale/cs/LC_MESSAGES/django.mo b/django/conf/locale/cs/LC_MESSAGES/django.mo index 40c1e6145c..31608a23d3 100644 Binary files a/django/conf/locale/cs/LC_MESSAGES/django.mo and b/django/conf/locale/cs/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/cs/LC_MESSAGES/django.po b/django/conf/locale/cs/LC_MESSAGES/django.po index 7831e1d768..8ac89d7bd7 100644 --- a/django/conf/locale/cs/LC_MESSAGES/django.po +++ b/django/conf/locale/cs/LC_MESSAGES/django.po @@ -14,8 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" -"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Poedit-Language: Czech\n" "X-Poedit-Country: CZECH REPUBLIC\n" @@ -265,12 +264,8 @@ msgid "Server Error (500)" msgstr "Chyba serveru (500)" #: 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 "" -"Nastala chyba. Ta byla oznámena administrátorovi serveru pomocí e-mailu a " -"měla by být brzy odstraněna. Děkujeme za trpělivost." +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 "Nastala chyba. Ta byla oznámena administrátorovi serveru pomocí e-mailu a měla by být brzy odstraněna. Děkujeme za trpělivost." #: contrib/admin/templates/admin/404.html:4 #: contrib/admin/templates/admin/404.html:8 @@ -361,13 +356,8 @@ msgstr "Odhlásit se" #: contrib/admin/templates/admin/delete_confirmation.html:7 #, fuzzy, 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 "" -"Mazání %(object_name)s '%(object)s' by vyústilo ve vymazání souvisejících " -"objektů, ale Váš účet nemá oprávnění pro mazání následujících typů objektů:" +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 "Mazání %(object_name)s '%(object)s' by vyústilo ve vymazání souvisejících objektů, ale Váš účet nemá oprávnění pro mazání následujících typů objektů:" #: contrib/admin/templates/admin/500.html:6 msgid "Server error (500)" @@ -445,12 +435,8 @@ msgstr "" #: contrib/admin/templates/admin/delete_confirmation.html:14 #, 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 "" -"Jste si jist(á), že chcete smazat %(object_name)s \"%(object)s\"? Všechny " -"následující související položky budou smazány:" +msgid "Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of the following related items will be deleted:" +msgstr "Jste si jist(á), že chcete smazat %(object_name)s \"%(object)s\"? Všechny následující související položky budou smazány:" #: contrib/admin/templates/admin/delete_confirmation.html:18 msgid "Yes, I'm sure" @@ -479,12 +465,8 @@ msgid "Password reset" msgstr "Obnovení 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 "" -"Zapomněl(a) jste heslo? Vložte níže Vaši e-mailovou adresu a my Vaše heslo " -"obnovíme a zašleme Vám e-mailem nové." +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 "Zapomněl(a) jste heslo? Vložte níže Vaši e-mailovou adresu a my Vaše heslo obnovíme a zašleme Vám e-mailem nové." #: contrib/admin/templates/registration/password_reset_form.html:16 msgid "E-mail address:" @@ -508,20 +490,12 @@ msgid "Password reset successful" msgstr "Obnovení hesla bylo úspěšné" #: 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 jsme Vám e-mailem nové heslo na adresu, kterou jste zadal(a). Měl(a) " -"byste ji dostat během okamžiku." +msgid "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly." +msgstr "Poslali jsme Vám e-mailem nové heslo na adresu, kterou jste zadal(a). Měl(a) byste ji dostat během okamžiku." #: 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 "" -"Prosíme, pro zabezpečení vložte svoje staré heslo a poté vložte dvakrát nové " -"heslo, takže můžeme ověřit, že jste ho napsal(a) správně." +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 "Prosíme, pro zabezpečení vložte svoje staré heslo a poté vložte dvakrát nové heslo, takže můžeme ověřit, že jste ho napsal(a) správně." #: contrib/admin/templates/registration/password_change_form.html:17 msgid "Old password:" @@ -638,23 +612,28 @@ msgstr "Leden" msgid "February" msgstr "Únor" -#: utils/dates.py:14 utils/dates.py:27 +#: utils/dates.py:14 +#: utils/dates.py:27 msgid "March" msgstr "Březen" -#: utils/dates.py:14 utils/dates.py:27 +#: utils/dates.py:14 +#: utils/dates.py:27 msgid "April" msgstr "Duben" -#: utils/dates.py:14 utils/dates.py:27 +#: utils/dates.py:14 +#: utils/dates.py:27 msgid "May" msgstr "Květen" -#: utils/dates.py:14 utils/dates.py:27 +#: utils/dates.py:14 +#: utils/dates.py:27 msgid "June" msgstr "Červen" -#: utils/dates.py:15 utils/dates.py:27 +#: utils/dates.py:15 +#: utils/dates.py:27 msgid "July" msgstr "Červenec" @@ -726,7 +705,10 @@ msgstr "weby" msgid "label" msgstr "nadpis" -#: models/core.py:29 models/core.py:40 models/auth.py:6 models/auth.py:19 +#: models/core.py:29 +#: models/core.py:40 +#: models/auth.py:6 +#: models/auth.py:19 msgid "name" msgstr "jméno" @@ -755,23 +737,16 @@ msgid "redirect from" msgstr "přesměrovat z" #: models/core.py:69 -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"Toto by měla být absolutní cesta, bez domény. Např. '/udalosti/hledat/'." +msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'." +msgstr "Toto by měla být absolutní cesta, bez domény. Např. '/udalosti/hledat/'." #: models/core.py:70 msgid "redirect to" msgstr "přesměrovat na" #: models/core.py:71 -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"Toto může být buď absolutní cesta (jako nahoře) nebo plné URL začínající na " -"'http://'." +msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'." +msgstr "Toto může být buď absolutní cesta (jako nahoře) nebo plné URL začínající na 'http://'." #: models/core.py:73 msgid "redirect" @@ -782,10 +757,8 @@ msgid "redirects" msgstr "přesměrování" #: models/core.py:88 -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"Příklad: '/o/kontakt/'. Ujistěte se, že máte počáteční a konečná lomítka." +msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "Příklad: '/o/kontakt/'. Ujistěte se, že máte počáteční a konečná lomítka." #: models/core.py:89 msgid "title" @@ -804,12 +777,8 @@ msgid "template name" msgstr "jméno šablony" #: models/core.py:93 -msgid "" -"Example: 'flatfiles/contact_page'. If this isn't provided, the system will " -"use 'flatfiles/default'." -msgstr "" -"Například: 'flatfiles/kontaktni_stranka'. Pokud toto není zadáno, systém " -"použije 'flatfiles/default'." +msgid "Example: 'flatfiles/contact_page'. If this isn't provided, the system will use 'flatfiles/default'." +msgstr "Například: 'flatfiles/kontaktni_stranka'. Pokud toto není zadáno, systém použije 'flatfiles/default'." #: models/core.py:94 msgid "registration required" @@ -817,9 +786,7 @@ msgstr "nutná registrace" #: models/core.py:94 msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Pokud je zaškrtnuto, pouze přihlášení uživatelé budou moci prohlížet tuto " -"stránku." +msgstr "Pokud je zaškrtnuto, pouze přihlášení uživatelé budou moci prohlížet tuto stránku." #: models/core.py:98 msgid "flat page" @@ -857,7 +824,8 @@ msgstr "codename" msgid "Permission" msgstr "Oprávnění" -#: models/auth.py:11 models/auth.py:58 +#: models/auth.py:11 +#: models/auth.py:58 msgid "Permissions" msgstr "Oprávnění" @@ -865,7 +833,8 @@ msgstr "Oprávnění" msgid "Group" msgstr "Skupina" -#: models/auth.py:23 models/auth.py:60 +#: models/auth.py:23 +#: models/auth.py:60 msgid "Groups" msgstr "Skupiny" @@ -919,12 +888,8 @@ msgid "date joined" msgstr "datum zaregistrování" #: models/auth.py:44 -msgid "" -"In addition to the permissions manually assigned, this user will also get " -"all permissions granted to each group he/she is in." -msgstr "" -"Kromě manuálně přidělených oprávnění uživatel dostane všechna oprávnění pro " -"každou skupinu, ve které je." +msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in." +msgstr "Kromě manuálně přidělených oprávnění uživatel dostane všechna oprávnění pro každou skupinu, ve které je." #: models/auth.py:48 msgid "Users" @@ -944,7 +909,7 @@ msgstr "Zpráva" #: conf/global_settings.py:37 msgid "Bengali" -msgstr "" +msgstr "Bengálsky" #: conf/global_settings.py:37 msgid "Czech" @@ -952,7 +917,7 @@ msgstr "Česky" #: conf/global_settings.py:38 msgid "Welsh" -msgstr "" +msgstr "Welšsky" #: conf/global_settings.py:39 msgid "German" @@ -971,9 +936,8 @@ msgid "French" msgstr "Francouzsky" #: conf/global_settings.py:43 -#, fuzzy msgid "Galician" -msgstr "Galicijský" +msgstr "Galicijsky" #: conf/global_settings.py:44 msgid "Italian" @@ -1009,8 +973,7 @@ msgstr "Tato hodnota musí obsahovat pouze znaky, čísla nebo podtržítka." #: core/validators.py:63 msgid "This value must contain only letters, numbers, underscores and slashes." -msgstr "" -"Tato hodnota musí obsahovat pouze znaky, čísla, podtržítka nebo lomítka." +msgstr "Tato hodnota musí obsahovat pouze znaky, čísla, podtržítka nebo lomítka." #: core/validators.py:71 msgid "Uppercase letters are not allowed here." @@ -1069,12 +1032,8 @@ msgid "Enter a valid e-mail address." msgstr "Vložte platnou e-mailovou adresu." #: core/validators.py:147 -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Nahrajte na server platný obrázek. Soubor, který jste nahrál(a) nebyl " -"obrázek, nebo byl porušen." +msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image." +msgstr "Nahrajte na server platný obrázek. Soubor, který jste nahrál(a) nebyl obrázek, nebo byl porušen." #: core/validators.py:154 #, python-format @@ -1140,7 +1099,8 @@ msgstr "Toto pole se musí shodovat s polem '%s'." msgid "Please enter something for at least one field." msgstr "Prosíme, vložte něco alespoň pro jedno pole." -#: core/validators.py:259 core/validators.py:270 +#: core/validators.py:259 +#: core/validators.py:270 msgid "Please enter both fields or leave them both empty." msgstr "Prosíme, vložte obě pole, nebo je nechte obě prázdná." @@ -1170,8 +1130,7 @@ msgstr "Prosíme, vložte platné číslo." #: core/validators.py:344 #, 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." +msgid_plural "Please enter a valid decimal number with at most %s total digits." msgstr[0] "Prosíme, vložte platné číslo s nejvíce %s cifrou celkem." msgstr[1] "Prosíme, vložte platné číslo s nejvíce %s ciframi celkem." msgstr[2] "Prosíme, vložte platné číslo s nejvíce %s ciframi celkem." @@ -1179,16 +1138,10 @@ msgstr[2] "Prosíme, vložte platné číslo s nejvíce %s ciframi celkem." #: core/validators.py:347 #, 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íme, vložte platné číslo s nejvíce %s cifrou za desetinnou čárkou celkem." -msgstr[1] "" -"Prosíme, vložte platné číslo s nejvíce %s ciframi za desetinnou čárkou " -"celkem." -msgstr[2] "" -"Prosíme, vložte platné číslo s nejvíce %s ciframi za desetinnou čárkou " -"celkem." +msgid_plural "Please enter a valid decimal number with at most %s decimal places." +msgstr[0] "Prosíme, vložte platné číslo s nejvíce %s cifrou za desetinnou čárkou celkem." +msgstr[1] "Prosíme, vložte platné číslo s nejvíce %s ciframi za desetinnou čárkou celkem." +msgstr[2] "Prosíme, vložte platné číslo s nejvíce %s ciframi za desetinnou čárkou celkem." #: core/validators.py:357 #, python-format @@ -1215,71 +1168,44 @@ msgstr "Nemohl jsem získat nic z %s." #: core/validators.py:424 #, python-format -msgid "" -"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." +msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." msgstr "URL %(url)s vrátilo neplatnou hlavičku Content-Type '%(contenttype)s'." #: core/validators.py:457 #, python-format -msgid "" -"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with " -"\"%(start)s\".)" -msgstr "" -"Prosíme, zavřete nezavřenou značku %(tag)s z řádky %(line)s. (Řádka začíná s " -"\"%(start)s\".)" +msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)" +msgstr "Prosíme, zavřete nezavřenou značku %(tag)s z řádky %(line)s. (Řádka začíná s \"%(start)s\".)" #: core/validators.py:461 #, python-format -msgid "" -"Some text starting on line %(line)s is not allowed in that context. (Line " -"starts with \"%(start)s\".)" -msgstr "" -"Nějaký text začínající na řádce %(line)s není povolen v tomto kontextu. " -"(Řádka začíná s \"%(start)s\".)" +msgid "Some text starting on line %(line)s is not allowed in that context. (Line starts with \"%(start)s\".)" +msgstr "Nějaký text začínající na řádce %(line)s není povolen v tomto kontextu. (Řádka začíná s \"%(start)s\".)" #: core/validators.py:466 #, python-format -msgid "" -"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%" -"(start)s\".)" -msgstr "" -"\"%(attr)s\" na řádce %(line)s je neplatný atribut. (Řádka začíná s \"%" -"(start)s\".)" +msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)" +msgstr "\"%(attr)s\" na řádce %(line)s je neplatný atribut. (Řádka začíná s \"%(start)s\".)" #: core/validators.py:471 #, python-format -msgid "" -"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%" -"(start)s\".)" -msgstr "" -"\"<%(tag)s>\" na řádce %(line)s je neplatná značka. (Řádka začíná s \"%" -"(start)s\".)" +msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)" +msgstr "\"<%(tag)s>\" na řádce %(line)s je neplatná značka. (Řádka začíná s \"%(start)s\".)" #: core/validators.py:475 #, python-format -msgid "" -"A tag on line %(line)s is missing one or more required attributes. (Line " -"starts with \"%(start)s\".)" -msgstr "" -"Značce na řádce %(line)s schází jeden nebo více požadovaných atributů. " -"(Řádka začíná s \"%(start)s\".)" +msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)" +msgstr "Značce na řádce %(line)s schází jeden nebo více požadovaných atributů. (Řádka začíná s \"%(start)s\".)" #: core/validators.py:480 #, python-format -msgid "" -"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line " -"starts with \"%(start)s\".)" -msgstr "" -"Atribut \"%(attr)s\" na řádce %(line)s má neplatnou hodnotu. (Řádka začína s " -"\"%(start)s\".)" +msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)" +msgstr "Atribut \"%(attr)s\" na řádce %(line)s má neplatnou hodnotu. (Řádka začína s \"%(start)s\".)" #: core/meta/fields.py:114 msgid " Separate multiple IDs with commas." msgstr "Oddělte více identifikátorů čárkami." #: core/meta/fields.py:117 -msgid "" -" Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" -"Podržte \"Control\", nebo \"Command\" na Macu pro vybrání více jak jedné " -"položky." +msgid " Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "Podržte \"Control\", nebo \"Command\" na Macu pro vybrání více jak jedné položky." + diff --git a/django/conf/locale/sk/LC_MESSAGES/django.mo b/django/conf/locale/sk/LC_MESSAGES/django.mo index 3f99def330..f5c9dbe283 100644 Binary files a/django/conf/locale/sk/LC_MESSAGES/django.mo and b/django/conf/locale/sk/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/sk/LC_MESSAGES/django.po b/django/conf/locale/sk/LC_MESSAGES/django.po index fe6c382f77..e2809b2ef8 100644 --- a/django/conf/locale/sk/LC_MESSAGES/django.po +++ b/django/conf/locale/sk/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgstr "" "POT-Creation-Date: 2005-11-08 09:05-0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Vladimir Labath \n" -"Language-Team: Slovak \n" +"Language-Team: Slovak \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -272,11 +272,11 @@ msgstr "" #: contrib/admin/templates/admin/404.html:4 #: contrib/admin/templates/admin/404.html:8 msgid "Page not found" -msgstr "Stránka sa nenašla" +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 sa nenašla." +msgstr "Ľutujeme, ale požadovaná stránka nebola nájdená." #: contrib/admin/templates/admin/index.html:27 #: contrib/admin/templates/admin/change_form.html:14 @@ -1276,3 +1276,41 @@ msgid "" msgstr "" " Podržte \"Control\", alebo \"Command\" na Mac_u, na výber viac ako jednej " "položky." +#:commit +msgid "Post a comment" +msgstr "Pošli komentár" + + +msgid "Comments" +msgstr "Komentáre" + +msgid "Comment" +msgstr "Komentár" + +msgid "Your name" +msgstr "Vaše meno" + +msgid "Preview revised comment" +msgstr "Ukázať upravený komentár" + +msgid "Post public comment" +msgstr "Zveréjniť komentár" + +msgid "Preview comment" +msgstr "Ukázať komentár" + +msgid "Posted by" +msgstr "Poslané" + +msgid "Or edit it again" +msgstr "Alebo ho vytvorte znova" + +msgid "Please correct the following errors." +msgstr "Odstráňte nasledujúce chyby, prosím." + +msgid "Looks like you followed a bad link. If you think it is our fault, please let us know" +msgstr "Pozrite si linku , kde vzikla chyba. Ak si myslíte, že je to naša chyba, dajte nám to vedieť, prosím" + +msgid "Here is a link to the homepage. You know, just in case" +msgstr "Tu je adresa úvodnej stránky. Ak by ste ju potrebovali" + diff --git a/django/conf/locale/zh_CN/LC_MESSAGES/django.mo b/django/conf/locale/zh_CN/LC_MESSAGES/django.mo index 3b55a17ad7..31dce87a44 100644 Binary files a/django/conf/locale/zh_CN/LC_MESSAGES/django.mo and b/django/conf/locale/zh_CN/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/zh_CN/LC_MESSAGES/django.po b/django/conf/locale/zh_CN/LC_MESSAGES/django.po index 74e10461ad..710b2c7a98 100644 --- a/django/conf/locale/zh_CN/LC_MESSAGES/django.po +++ b/django/conf/locale/zh_CN/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: django v1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2005-11-08 15:05+0000\n" -"PO-Revision-Date: 2005-10-30 15:46+0800\n" +"PO-Revision-Date: 2005-11-11 13:55+0800\n" "Last-Translator: limodou \n" "Language-Team: Simplified Chinese \n" "MIME-Version: 1.0\n" @@ -17,6 +17,7 @@ msgstr "" "X-Poedit-Language: Chinese\n" "X-Poedit-Country: CHINA\n" "X-Poedit-SourceCharset: utf-8\n" +"Plural-Forms: nplurals=1; plural=0;\n" #: contrib/admin/views/main.py:78 contrib/admin/views/main.py:106 #, python-format @@ -252,9 +253,8 @@ msgid "Home" msgstr "首页" #: contrib/admin/templates/admin/500.html:4 -#, fuzzy msgid "Server error" -msgstr "服务器错误(500)" +msgstr "服务器错误" #: contrib/admin/templates/admin/500.html:6 msgid "Server error (500)" @@ -265,12 +265,8 @@ msgid "Server Error (500)" msgstr "服务器错误 (500)" #: 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 "" -"存在一个错误。它已经通过电子邮件被报告给站点管理员了,并且应该很快被改正。谢" -"谢你的关心。" +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/404.html:4 #: contrib/admin/templates/admin/404.html:8 @@ -358,14 +354,9 @@ msgid "Log out" msgstr "注销" #: contrib/admin/templates/admin/delete_confirmation.html:7 -#, fuzzy, 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' 会导致删除相关的对象,但你的帐号无权删除下" -"列类型的对象:" +#, 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/500.html:6 msgid "Server error (500)" @@ -443,11 +434,8 @@ msgstr "" #: contrib/admin/templates/admin/delete_confirmation.html:14 #, 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 "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:18 msgid "Yes, I'm sure" @@ -476,12 +464,8 @@ msgid "Password reset" msgstr "口令重设" #: contrib/admin/templates/registration/password_reset_form.html:12 -msgid "" -"Forgotten your password? Enter your e-mail address below, and we'll reset " -"your password and e-mail the new one to you." -msgstr "" -"忘记你的口令?在下面输入你的邮箱地址,我们将重设你的口令并且将新的口令通过邮" -"件发送给你。" +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 "忘记你的口令?在下面输入你的邮箱地址,我们将重设你的口令并且将新的口令通过邮件发送给你。" #: contrib/admin/templates/registration/password_reset_form.html:16 msgid "E-mail address:" @@ -505,19 +489,12 @@ 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 "" -"我们已经按你所提交的邮箱地址发送了一个新的口令给你。你应该很会收到这封邮件。" +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_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 "" -"请输入你的旧口令,为了安全起见,接着要输入你的新口令两遍,这样我们可以校验你" -"输入的是否正确。" +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:" @@ -634,23 +611,28 @@ msgstr "一月" msgid "February" msgstr "二月" -#: utils/dates.py:14 utils/dates.py:27 +#: utils/dates.py:14 +#: utils/dates.py:27 msgid "March" msgstr "三月" -#: utils/dates.py:14 utils/dates.py:27 +#: utils/dates.py:14 +#: utils/dates.py:27 msgid "April" msgstr "四月" -#: utils/dates.py:14 utils/dates.py:27 +#: utils/dates.py:14 +#: utils/dates.py:27 msgid "May" msgstr "五月" -#: utils/dates.py:14 utils/dates.py:27 +#: utils/dates.py:14 +#: utils/dates.py:27 msgid "June" msgstr "六月" -#: utils/dates.py:15 utils/dates.py:27 +#: utils/dates.py:15 +#: utils/dates.py:27 msgid "July" msgstr "七月" @@ -722,7 +704,10 @@ msgstr "站点" msgid "label" msgstr "标签" -#: models/core.py:29 models/core.py:40 models/auth.py:6 models/auth.py:19 +#: models/core.py:29 +#: models/core.py:40 +#: models/auth.py:6 +#: models/auth.py:19 msgid "name" msgstr "名称" @@ -751,9 +736,7 @@ msgid "redirect from" msgstr "重定向自" #: models/core.py:69 -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." +msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'." msgstr "应该是一个绝对路径,不包括域名。例如:'/events/search/'。" #: models/core.py:70 @@ -761,9 +744,7 @@ msgid "redirect to" msgstr "重定向到" #: models/core.py:71 -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." +msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'." msgstr "可以是绝对路径(同上)或以'http://'开始的全URL。" #: models/core.py:73 @@ -775,8 +756,7 @@ msgid "redirects" msgstr "重定向" #: models/core.py:88 -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes." msgstr "例如:'/about/contact/'。请确保前导和结尾的除号。" #: models/core.py:89 @@ -796,11 +776,8 @@ msgid "template name" msgstr "模板名称" #: models/core.py:93 -msgid "" -"Example: 'flatfiles/contact_page'. If this isn't provided, the system will " -"use 'flatfiles/default'." -msgstr "" -"例如:'flatfiles/contact_page'。如果未提供,系统将使用'flatfiles/default'。" +msgid "Example: 'flatfiles/contact_page'. If this isn't provided, the system will use 'flatfiles/default'." +msgstr "例如:'flatfiles/contact_page'。如果未提供,系统将使用'flatfiles/default'。" #: models/core.py:94 msgid "registration required" @@ -846,7 +823,8 @@ msgstr "代码名称" msgid "Permission" msgstr "许可" -#: models/auth.py:11 models/auth.py:58 +#: models/auth.py:11 +#: models/auth.py:58 msgid "Permissions" msgstr "许可" @@ -854,7 +832,8 @@ msgstr "许可" msgid "Group" msgstr "组" -#: models/auth.py:23 models/auth.py:60 +#: models/auth.py:23 +#: models/auth.py:60 msgid "Groups" msgstr "组" @@ -907,11 +886,8 @@ msgid "date joined" msgstr "加入日期" #: models/auth.py:44 -msgid "" -"In addition to the permissions manually assigned, this user will also get " -"all permissions granted to each group he/she is in." -msgstr "" -"除了手动设置权限以外,用户也会从他(她)所在的小组获得所赋组小组的所有权限。" +msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in." +msgstr "除了手动设置权限以外,用户也会从他(她)所在的小组获得所赋组小组的所有权限。" #: models/auth.py:48 msgid "Users" @@ -931,7 +907,7 @@ msgstr "消息" #: conf/global_settings.py:37 msgid "Bengali" -msgstr "" +msgstr "孟加拉语" #: conf/global_settings.py:37 msgid "Czech" @@ -939,7 +915,7 @@ msgstr "捷克语" #: conf/global_settings.py:38 msgid "Welsh" -msgstr "" +msgstr "威尔士语" #: conf/global_settings.py:39 msgid "German" @@ -967,7 +943,7 @@ msgstr "意大利语" #: conf/global_settings.py:45 msgid "Norwegian" -msgstr "" +msgstr "挪威语" #: conf/global_settings.py:46 msgid "Brazilian" @@ -978,13 +954,12 @@ msgid "Russian" msgstr "俄语" #: conf/global_settings.py:47 -#, fuzzy msgid "Serbian" msgstr "塞尔维亚语" #: conf/global_settings.py:48 msgid "Simplified Chinese" -msgstr "" +msgstr "简体中文" #: conf/global_settings.py:49 msgid "Slovak" @@ -1055,9 +1030,7 @@ msgid "Enter a valid e-mail address." msgstr "输入一个有效的邮件地址。" #: core/validators.py:147 -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." +msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image." msgstr "上传一个有效的图片。您所上传的文件或者不是图片或是一个破坏的图片。" #: core/validators.py:154 @@ -1108,11 +1081,10 @@ msgid "Enter a valid U.S. state abbreviation." msgstr "输入一个有效的 U.S. 州缩写。" #: core/validators.py:224 -#, fuzzy, python-format +#, python-format msgid "Watch your mouth! The word %s is not allowed here." msgid_plural "Watch your mouth! The words %s are not allowed here." -msgstr[0] "小心你的嘴!%s 不允许在这里出现。" -msgstr[1] "小心你的嘴!%s 不允许在这里出现。" +msgstr[0] "看住你的嘴!%s 不允许在这里出现。" #: core/validators.py:231 #, python-format @@ -1123,7 +1095,8 @@ msgstr "这个字段必须与 '%s' 字段相匹配。" msgid "Please enter something for at least one field." msgstr "请至少在一个字段上输入些什么。" -#: core/validators.py:259 core/validators.py:270 +#: core/validators.py:259 +#: core/validators.py:270 msgid "Please enter both fields or leave them both empty." msgstr "请要么两个字段都输入或者两个字段都空着。" @@ -1151,20 +1124,16 @@ msgid "Please enter a valid decimal number." msgstr "请输入一个有效的小数。" #: core/validators.py:344 -#, fuzzy, python-format +#, python-format msgid "Please enter a valid decimal number with at most %s total digit." -msgid_plural "" -"Please enter a valid decimal number with at most %s total digits." -msgstr[0] "请输入一个有效的小数,最多 %s 个数字。" -msgstr[1] "请输入一个有效的小数,最多 %s 个数字。" +msgid_plural "Please enter a valid decimal number with at most %s total digits." +msgstr[0] "请输入一个有效的小数,最多 %s 个数字。 " #: core/validators.py:347 -#, fuzzy, python-format +#, python-format msgid "Please enter a valid decimal number with at most %s decimal place." -msgid_plural "" -"Please enter a valid decimal number with at most %s decimal places." -msgstr[0] "请输入一个有效的小数,最多 %s 个小数位。" -msgstr[1] "请输入一个有效的小数,最多 %s 个小数位。" +msgid_plural "Please enter a valid decimal number with at most %s decimal places." +msgstr[0] "请输入一个有效的小数,最多 %s 个小数位。 " #: core/validators.py:357 #, python-format @@ -1191,63 +1160,44 @@ msgstr "不能从 %s 得到任何东西。" #: core/validators.py:424 #, python-format -msgid "" -"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." +msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." msgstr "URL %(url)s 返回了无效的 Content-Type 头 '%(contenttype)s'。" #: core/validators.py:457 #, 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\"。)" +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:461 #, 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\"。)" +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:466 #, python-format -msgid "" -"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%" -"(start)s\".)" -msgstr "" -"在 %(line)s 行的\"%(attr)s\"不是一个有效的属性。(行开始于 \"%(start)s\"。)" +msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)" +msgstr "在 %(line)s 行的\"%(attr)s\"不是一个有效的属性。(行开始于 \"%(start)s\"。)" #: core/validators.py:471 #, python-format -msgid "" -"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%" -"(start)s\".)" -msgstr "" -"在 %(line)s 行的\"<%(tag)s>\"不是一个有效的标签。(行开始于 \"%(start)s\"。)" +msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)" +msgstr "在 %(line)s 行的\"<%(tag)s>\"不是一个有效的标签。(行开始于 \"%(start)s\"。)" #: core/validators.py:475 #, 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\"。)" +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:480 #, python-format -msgid "" -"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line " -"starts with \"%(start)s\".)" -msgstr "" -"在行 %(line)s 的\"%(attr)s\"属性有一个无效的值。(行开始于 \"%(start)s\"。)" +msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)" +msgstr "在行 %(line)s 的\"%(attr)s\"属性有一个无效的值。(行开始于 \"%(start)s\"。)" #: core/meta/fields.py:114 msgid " Separate multiple IDs with commas." msgstr " 用逗号分隔多个ID。" #: core/meta/fields.py:117 -msgid "" -" Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid " Hold down \"Control\", or \"Command\" on a Mac, to select more than one." msgstr " 按下 \"Control\",或者在Mac上按 \"Command\" 来选择一个或多个值。" + diff --git a/django/conf/settings.py b/django/conf/settings.py index 2001a06ffd..f455f65afe 100644 --- a/django/conf/settings.py +++ b/django/conf/settings.py @@ -44,6 +44,19 @@ for setting in dir(mod): setting_value = (setting_value,) # In case the user forgot the comma. setattr(me, setting, setting_value) +# Expand entries in INSTALLED_APPS like "django.contrib.*" to a list +# of all those apps. +new_installed_apps = [] +for app in me.INSTALLED_APPS: + if app.endswith('.*'): + appdir = os.path.dirname(__import__(app[:-2], '', '', ['']).__file__) + for d in os.listdir(appdir): + if d.isalpha() and os.path.isdir(os.path.join(appdir, d)): + new_installed_apps.append('%s.%s' % (app[:-2], d)) + else: + new_installed_apps.append(app) +me.INSTALLED_APPS = new_installed_apps + # save DJANGO_SETTINGS_MODULE in case anyone in the future cares me.SETTINGS_MODULE = os.environ.get(ENVIRONMENT_VARIABLE, '') diff --git a/django/conf/urls/flatfiles.py b/django/conf/urls/flatfiles.py deleted file mode 100644 index 1d29463319..0000000000 --- a/django/conf/urls/flatfiles.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.conf.urls.defaults import * - -urlpatterns = patterns('django.views', - (r'^(?P.*)$', 'core.flatfiles.flat_file'), -) diff --git a/django/contrib/admin/templates/admin/change_form.html b/django/contrib/admin/templates/admin/change_form.html index b3992d3376..21d5ab6e37 100644 --- a/django/contrib/admin/templates/admin/change_form.html +++ b/django/contrib/admin/templates/admin/change_form.html @@ -49,7 +49,6 @@ {% endif %} {% endif %} - {% for related_object in bound_manipulator.inline_related_objects %}{% edit_inline related_object %}{% endfor %} {% block after_related_objects%}{%endblock%} {% submit_row bound_manipulator %} diff --git a/django/contrib/admin/templates/admin/template_debug.html b/django/contrib/admin/templates/admin/template_debug.html index f6ef796be3..433b565aa0 100644 --- a/django/contrib/admin/templates/admin/template_debug.html +++ b/django/contrib/admin/templates/admin/template_debug.html @@ -4,10 +4,10 @@ {% block content %}

{%trans "Error in Template" %}

+
 {%blocktrans %}
 In template {{name}}, error at line {{line}}:
 {%endblocktrans %}
-
 {{message|escape}}
 {{traceback|escape}}
 
diff --git a/django/contrib/admin/templatetags/admin_modify.py b/django/contrib/admin/templatetags/admin_modify.py index 4b03beb53a..53a32a52c6 100644 --- a/django/contrib/admin/templatetags/admin_modify.py +++ b/django/contrib/admin/templatetags/admin_modify.py @@ -30,7 +30,7 @@ def submit_row(context, bound_manipulator): show_delete = context['show_delete'] has_delete_permission = context['has_delete_permission'] is_popup = context['is_popup'] - + print is_popup.something return { 'onclick_attrib' : (bound_manipulator.ordered_objects and change and 'onclick="submitOrderForm();"' or ''), diff --git a/django/contrib/flatpages/__init__.py b/django/contrib/flatpages/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/django/contrib/flatpages/middleware.py b/django/contrib/flatpages/middleware.py new file mode 100644 index 0000000000..9c4e0bb44e --- /dev/null +++ b/django/contrib/flatpages/middleware.py @@ -0,0 +1,15 @@ +from django.contrib.flatpages.views import flatpage +from django.conf.settings import DEBUG + +class FlatpageFallbackMiddleware: + def process_response(self, request, response): + if response.status_code != 404: + return response # No need to check for a flatpage for non-404 responses. + try: + return flatpage(request, request.path) + # Return the original response if any errors happened. Because this + # is a middleware, we can't assume the errors will be caught elsewhere. + except: + if DEBUG: + raise + return response diff --git a/django/contrib/flatpages/models/__init__.py b/django/contrib/flatpages/models/__init__.py new file mode 100644 index 0000000000..bb46349b5a --- /dev/null +++ b/django/contrib/flatpages/models/__init__.py @@ -0,0 +1 @@ +__all__ = ['flatpages'] diff --git a/django/contrib/flatpages/models/flatpages.py b/django/contrib/flatpages/models/flatpages.py new file mode 100644 index 0000000000..cfb2741d34 --- /dev/null +++ b/django/contrib/flatpages/models/flatpages.py @@ -0,0 +1,33 @@ +from django.core import meta, validators +from django.models.core import Site +from django.utils.translation import gettext_lazy as _ + +class FlatPage(meta.Model): + url = meta.CharField(_('URL'), maxlength=100, validator_list=[validators.isAlphaNumericURL], + help_text=_("Example: '/about/contact/'. Make sure to have leading and trailing slashes.")) + title = meta.CharField(_('title'), maxlength=200) + content = meta.TextField(_('content')) + enable_comments = meta.BooleanField(_('enable comments')) + template_name = meta.CharField(_('template name'), maxlength=70, blank=True, + help_text=_("Example: 'flatpages/contact_page'. If this isn't provided, the system will use 'flatpages/default'.")) + registration_required = meta.BooleanField(_('registration required'), help_text=_("If this is checked, only logged-in users will be able to view the page.")) + sites = meta.ManyToManyField(Site) + class META: + db_table = 'django_flatpages' + verbose_name = _('flat page') + verbose_name_plural = _('flat pages') + ordering = ('url',) + admin = meta.Admin( + fields = ( + (None, {'fields': ('url', 'title', 'content', 'sites')}), + ('Advanced options', {'classes': 'collapse', 'fields': ('enable_comments', 'registration_required', 'template_name')}), + ), + list_filter = ('sites',), + search_fields = ('url', 'title'), + ) + + def __repr__(self): + return "%s -- %s" % (self.url, self.title) + + def get_absolute_url(self): + return self.url diff --git a/django/contrib/flatpages/urls.py b/django/contrib/flatpages/urls.py new file mode 100644 index 0000000000..49289304ff --- /dev/null +++ b/django/contrib/flatpages/urls.py @@ -0,0 +1,5 @@ +from django.conf.urls.defaults import * + +urlpatterns = patterns('django.contrib.flatpages.views', + (r'^(?P.*)$', 'flatpage'), +) diff --git a/django/views/core/flatfiles.py b/django/contrib/flatpages/views.py similarity index 66% rename from django/views/core/flatfiles.py rename to django/contrib/flatpages/views.py index ded33d4cdd..48cd4526ab 100644 --- a/django/views/core/flatfiles.py +++ b/django/contrib/flatpages/views.py @@ -1,28 +1,28 @@ from django.core import template_loader from django.core.extensions import get_object_or_404, DjangoContext -from django.models.core import flatfiles +from django.models.flatpages import flatpages from django.utils.httpwrappers import HttpResponse from django.conf.settings import SITE_ID -DEFAULT_TEMPLATE = 'flatfiles/default' +DEFAULT_TEMPLATE = 'flatpages/default' -def flat_file(request, url): +def flatpage(request, url): """ - Flat file view + Flat page view. - Models: `core.flatfiles` + Models: `flatpages.flatpages` Templates: Uses the template defined by the ``template_name`` field, - or `flatfiles/default` if template_name is not defined. + or `flatpages/default` if template_name is not defined. Context: - flatfile - `flatfiles.flatfiles` object + flatpage + `flatpages.flatpages` object """ if not url.startswith('/'): url = "/" + url - f = get_object_or_404(flatfiles, url__exact=url, sites__id__exact=SITE_ID) + f = get_object_or_404(flatpages, url__exact=url, sites__id__exact=SITE_ID) # If registration is required for accessing this page, and the user isn't # logged in, redirect to the login page. - if request.user.is_anonymous() and f.registration_required: + if f.registration_required and request.user.is_anonymous(): from django.views.auth.login import redirect_to_login return redirect_to_login(request.path) if f.template_name: @@ -30,6 +30,6 @@ def flat_file(request, url): else: t = template_loader.get_template(DEFAULT_TEMPLATE) c = DjangoContext(request, { - 'flatfile': f, + 'flatpage': f, }) return HttpResponse(t.render(c)) diff --git a/django/contrib/redirects/__init__.py b/django/contrib/redirects/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/django/contrib/redirects/middleware.py b/django/contrib/redirects/middleware.py new file mode 100644 index 0000000000..c8f09ada8e --- /dev/null +++ b/django/contrib/redirects/middleware.py @@ -0,0 +1,27 @@ +from django.models.redirects import redirects +from django.utils import httpwrappers +from django.conf.settings import APPEND_SLASH, SITE_ID + +class RedirectFallbackMiddleware: + def process_response(self, request, response): + if response.status_code != 404: + return response # No need to check for a redirect for non-404 responses. + path = request.get_full_path() + try: + r = redirects.get_object(site__id__exact=SITE_ID, old_path__exact=path) + except redirects.RedirectDoesNotExist: + r = None + if r is None and APPEND_SLASH: + # Try removing the trailing slash. + try: + r = redirects.get_object(site__id__exact=SITE_ID, + old_path__exact=path[:path.rfind('/')]+path[path.rfind('/')+1:]) + except redirects.RedirectDoesNotExist: + pass + if r is not None: + if r == '': + return httpwrappers.HttpResponseGone() + return httpwrappers.HttpResponseRedirect(r.new_path) + + # No redirect was found. Return the response. + return response diff --git a/django/contrib/redirects/models/__init__.py b/django/contrib/redirects/models/__init__.py new file mode 100644 index 0000000000..05063b2146 --- /dev/null +++ b/django/contrib/redirects/models/__init__.py @@ -0,0 +1 @@ +__all__ = ['redirects'] diff --git a/django/contrib/redirects/models/redirects.py b/django/contrib/redirects/models/redirects.py new file mode 100644 index 0000000000..06dcdb38ac --- /dev/null +++ b/django/contrib/redirects/models/redirects.py @@ -0,0 +1,23 @@ +from django.core import meta +from django.models.core import Site +from django.utils.translation import gettext_lazy as _ + +class Redirect(meta.Model): + site = meta.ForeignKey(Site, radio_admin=meta.VERTICAL) + old_path = meta.CharField(_('redirect from'), maxlength=200, db_index=True, + help_text=_("This should be an absolute path, excluding the domain name. Example: '/events/search/'.")) + new_path = meta.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_redirects' + unique_together=(('site', 'old_path'),) + ordering = ('old_path',) + admin = meta.Admin( + list_filter = ('site',), + search_fields = ('old_path', 'new_path'), + ) + + def __repr__(self): + return "%s ---> %s" % (self.old_path, self.new_path) diff --git a/django/middleware/common.py b/django/middleware/common.py index fb37f653c1..1e437170e3 100644 --- a/django/middleware/common.py +++ b/django/middleware/common.py @@ -1,8 +1,6 @@ from django.conf import settings -from django.core import exceptions from django.utils import httpwrappers from django.core.mail import mail_managers -from django.views.core.flatfiles import flat_file import md5, os class CommonMiddleware: @@ -17,9 +15,6 @@ class CommonMiddleware: - ETags: If the USE_ETAGS setting is set, ETags will be calculated from the entire page content and Not Modified responses will be returned appropriately. - - - Flat files: For 404 responses, a flat file matching the given path - will be looked up and used if found. """ def process_request(self, request): @@ -55,12 +50,6 @@ class CommonMiddleware: def process_response(self, request, response): "Check for a flat page (for 404s) and calculate the Etag, if needed." if response.status_code == 404: - if settings.USE_FLAT_PAGES: - try: - return flat_file(request, request.path) - except exceptions.Http404: - pass - if settings.SEND_BROKEN_LINK_EMAILS: # If the referrer was from an internal link or a non-search-engine site, # send a note to the managers. diff --git a/django/models/core.py b/django/models/core.py index 1c52affdfd..17519b53d8 100644 --- a/django/models/core.py +++ b/django/models/core.py @@ -1,6 +1,6 @@ import base64, md5, random, sys import cPickle as pickle -from django.core import meta, validators +from django.core import meta from django.utils.translation import gettext_lazy as _ class Site(meta.Model): @@ -63,56 +63,6 @@ class ContentType(meta.Model): """ return self.get_model_module().get_object(**kwargs) -class Redirect(meta.Model): - site = meta.ForeignKey(Site, radio_admin=meta.VERTICAL) - old_path = meta.CharField(_('redirect from'), maxlength=200, db_index=True, - help_text=_("This should be an absolute path, excluding the domain name. Example: '/events/search/'.")) - new_path = meta.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 = 'redirects' - unique_together=(('site', 'old_path'),) - ordering = ('old_path',) - admin = meta.Admin( - list_filter = ('site',), - search_fields = ('old_path', 'new_path'), - ) - - def __repr__(self): - return "%s ---> %s" % (self.old_path, self.new_path) - -class FlatFile(meta.Model): - url = meta.CharField(_('URL'), maxlength=100, validator_list=[validators.isAlphaNumericURL], - help_text=_("Example: '/about/contact/'. Make sure to have leading and trailing slashes.")) - title = meta.CharField(_('title'), maxlength=200) - content = meta.TextField(_('content')) - enable_comments = meta.BooleanField(_('enable comments')) - template_name = meta.CharField(_('template name'), maxlength=70, blank=True, - help_text=_("Example: 'flatfiles/contact_page'. If this isn't provided, the system will use 'flatfiles/default'.")) - registration_required = meta.BooleanField(_('registration required'), help_text=_("If this is checked, only logged-in users will be able to view the page.")) - sites = meta.ManyToManyField(Site) - class META: - db_table = 'flatfiles' - verbose_name = _('flat page') - verbose_name_plural = _('flat pages') - ordering = ('url',) - admin = meta.Admin( - fields = ( - (None, {'fields': ('url', 'title', 'content', 'sites')}), - ('Advanced options', {'classes': 'collapse', 'fields': ('enable_comments', 'registration_required', 'template_name')}), - ), - list_filter = ('sites',), - search_fields = ('url', 'title'), - ) - - def __repr__(self): - return "%s -- %s" % (self.url, self.title) - - def get_absolute_url(self): - return self.url - class Session(meta.Model): session_key = meta.CharField(_('session key'), maxlength=40, primary_key=True) session_data = meta.TextField(_('session data')) diff --git a/django/views/defaults.py b/django/views/defaults.py index 45e5636c5a..062f1a8cf5 100644 --- a/django/views/defaults.py +++ b/django/views/defaults.py @@ -4,7 +4,7 @@ from django.models.core import sites, contenttypes from django.utils import httpwrappers def shortcut(request, content_type_id, object_id): - """Redirect to an object's page based on a content-type ID and an object ID""" + "Redirect to an object's page based on a content-type ID and an object ID." # Look up the object, making sure it's got a get_absolute_url() function. try: content_type = contenttypes.get_object(pk=content_type_id) @@ -15,23 +15,23 @@ def shortcut(request, content_type_id, object_id): absurl = obj.get_absolute_url() except AttributeError: raise Http404, "%s objects don't have get_absolute_url() methods" % content_type.name - - # Try to figure out the object's domain so we can do a cross-site redirect - # if necessary + + # Try to figure out the object's domain, so we can do a cross-site redirect + # if necessary. # If the object actually defines a domain, we're done. if absurl.startswith('http://'): return httpwrappers.HttpResponseRedirect(absurl) object_domain = None - + # Next, look for an many-to-many relationship to sites if hasattr(obj, 'get_site_list'): site_list = obj.get_site_list() if site_list: object_domain = site_list[0].domain - - # Next, look for a many-to-one relationship to sites + + # Next, look for a many-to-one relationship to sites elif hasattr(obj, 'get_site'): try: object_domain = obj.get_site().domain @@ -55,34 +55,15 @@ def page_not_found(request): Templates: `404` Context: None """ - from django.models.core import redirects - from django.conf.settings import APPEND_SLASH, SITE_ID - path = request.get_full_path() - try: - r = redirects.get_object(site__id__exact=SITE_ID, old_path__exact=path) - except redirects.RedirectDoesNotExist: - r = None - if r is None and APPEND_SLASH: - # Try removing the trailing slash. - try: - r = redirects.get_object(site__id__exact=SITE_ID, old_path__exact=path[:path.rfind('/')]+path[path.rfind('/')+1:]) - except redirects.RedirectDoesNotExist: - pass - if r is not None: - if r == '': - return httpwrappers.HttpResponseGone() - return httpwrappers.HttpResponseRedirect(r.new_path) t = loader.get_template('404') - c = Context() - return httpwrappers.HttpResponseNotFound(t.render(c)) + return httpwrappers.HttpResponseNotFound(t.render(Context())) def server_error(request): """ - 500 Error handler + 500 error handler. Templates: `500` Context: None """ t = loader.get_template('500') - c = Context() - return httpwrappers.HttpResponseServerError(t.render(c)) + return httpwrappers.HttpResponseServerError(t.render(Context())) diff --git a/docs/flatpages.txt b/docs/flatpages.txt new file mode 100644 index 0000000000..5c0520dae0 --- /dev/null +++ b/docs/flatpages.txt @@ -0,0 +1,114 @@ +================= +The flatpages app +================= + +Django comes with an optional "flatpages" application. It lets you store simple +"flat" HTML content in a database and handles the management for you. + +A flatpage is a simple object with a URL, title and content. Use it for +one-off, special-case pages, such as "About" or "Privacy Policy" pages, that +you want to store in a database but for which you don't want to develop a +custom Django application. + +A flatpage can use a custom template or a default, systemwide flatpage +template. It can be associated with one, or multiple, sites. + +Here are some examples of flatpages on Django-powered sites: + + * http://www.chicagocrime.org/about/ + * http://www.lawrence.com/about/contact/ + +Installation +============ + +To install the flatpages app, follow these two steps: + + 1. Add ``"django.contrib.flatpages"`` to your INSTALLED_APPS_ setting. + 2. Add ``"django.contrib.flatpages.middleware.FlatpageFallbackMiddleware"`` + to your MIDDLEWARE_CLASSES_ setting. + 3. Run the command ``django-admin.py install flatpages``. + +.. _INSTALLED_APPS: http://www.djangoproject.com/documentation/settings/#installed-apps +.. _MIDDLEWARE_CLASSES: http://www.djangoproject.com/documentation/settings/#middleware-classes + +How it works +============ + +``django-admin.py install flatpages`` creates two tables in your database: +``django_flatpages`` and ``django_flatpages_sites``. ``django_flatpages`` is a +simple lookup table that essentially maps a URL to a title and bunch of text +content. ``django_flatpages_sites`` associates a flatpage with a site. + +The ``FlatpageFallbackMiddleware`` does all of the work. Each time any Django +application raises a 404 error, this middleware checks the flatpages database +for the requested URL as a last resort. Specifically, it checks for a flatpage +with the given URL with a site ID that corresponds to the SITE_ID_ setting. + +If it finds a match, it follows this algorithm: + + * If the flatpage has a custom template, it loads that template. Otherwise, + it loads the template ``flatpages/default``. + * It passes that template a single context variable, ``flatpage``, which is + the flatpage object. It uses DjangoContext_ in rendering the template. + +If it doesn't find a match, the request continues to be processed as usual. + +The middleware only gets activated for 404s -- not for 500s or responses of any +other status code. + +Note that the order of ``MIDDLEWARE_CLASSES`` matters. Generally, you can put +``FlatpageFallbackMiddleware`` at the end of the list, because it's a last +resort. + +For more on middleware, read the `middleware docs`_. + +.. _SITE_ID: http://www.djangoproject.com/documentation/settings/#site-id +.. _DjangoContext: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-djangocontext +.. _middleware docs: http://www.djangoproject.com/documentation/middleware/ + +How to add, change and delete flatpages +======================================= + +Via the admin interface +----------------------- + +If you've activated the automatic Django admin interface, you should see a +"Flatpages" section on the admin index page. Edit flatpages as you edit any +other object in the system. + +Via the Python API +------------------ + +Flatpages are represented by a standard `Django model`_, which lives in +`django/contrib/flatpages/models/flatpages.py`_. You can access flatpage +objects via the `Django database API`_. + +.. _Django model: http://www.djangoproject.com/documentation/model_api/ +.. _django/contrib/flatpages/models/flatpages.py: http://code.djangoproject.com/browser/django/trunk/django/contrib/flatpages/models/flatpages.py +.. _Django database API: http://www.djangoproject.com/documentation/db_api/ + +Flatpage templates +================== + +By default, flatpages are rendered via the template ``flatpages/default``, but +you can override that for a particular flatpage. + +Creating the ``flatpages/default`` template is your responsibility; in your +template directory, just create a ``flatpages`` directory containing a file +``default.html``. + +Flatpage templates are passed a single context variable, ``flatpage``, which is +the flatpage object. + +Here's a sample ``flatpages/default`` template:: + + + + + {{ flatpage.title }} + + + {{ flatpage.content }} + + diff --git a/docs/legacy_databases.txt b/docs/legacy_databases.txt index beddc74134..f1b8f85970 100644 --- a/docs/legacy_databases.txt +++ b/docs/legacy_databases.txt @@ -69,10 +69,7 @@ following names: * ``sites`` * ``packages`` * ``content_types`` - * ``redirects`` - * ``flatfiles`` * ``core_sessions`` - * ``flatfiles_sites`` * ``auth_permissions`` * ``auth_groups`` * ``auth_users`` diff --git a/docs/middleware.txt b/docs/middleware.txt index d920e88370..5a01f728d4 100644 --- a/docs/middleware.txt +++ b/docs/middleware.txt @@ -27,7 +27,9 @@ name. For example, here's the default ``MIDDLEWARE_CLASSES`` created by "django.middleware.doc.XViewMiddleware", ) -Django applies middleware in the order it's defined in ``MIDDLEWARE_CLASSES``. +Django applies middleware in the order it's defined in ``MIDDLEWARE_CLASSES``, +except in the case of response and exception middleware, which is applied in +reverse order. A Django installation doesn't require any middleware -- e.g., ``MIDDLEWARE_CLASSES`` can be empty, if you'd like -- but it's strongly @@ -70,10 +72,6 @@ Adds a few conveniences for perfectionists: MD5-hashing the page content, and it'll take care of sending ``Not Modified`` responses, if appropriate. -* Handles flat pages. Every time Django encounters a 404 -- either within - a view or as a result of no URLconfs matching -- it will check the - database of flat pages based on the current URL. - django.middleware.doc.XViewMiddleware ------------------------------------- diff --git a/docs/model-api.txt b/docs/model-api.txt index a9190c78fe..51086e426e 100644 --- a/docs/model-api.txt +++ b/docs/model-api.txt @@ -831,7 +831,7 @@ object, which takes the following parameters. All are optional. "click to expand" link. Fieldsets with the ``wide`` style will be given extra horizontal space. - For example (taken from the ``core.flatfiles`` model):: + For example (taken from the ``django.contrib.flatpages`` model):: fields = ( (None, { diff --git a/docs/redirects.txt b/docs/redirects.txt new file mode 100644 index 0000000000..08fae8a8dc --- /dev/null +++ b/docs/redirects.txt @@ -0,0 +1,72 @@ +================= +The redirects app +================= + +Django comes with an optional redirects application. It lets you store simple +redirects in a database and handles the redirecting for you. + +Installation +============ + +To install the redirects app, follow these two steps: + + 1. Add ``"django.contrib.redirects"`` to your INSTALLED_APPS_ setting. + 2. Add ``"django.contrib.redirects.middleware.RedirectFallbackMiddleware"`` + to your MIDDLEWARE_CLASSES_ setting. + 3. Run the command ``django-admin.py install redirects``. + +.. _INSTALLED_APPS: http://www.djangoproject.com/documentation/settings/#installed-apps +.. _MIDDLEWARE_CLASSES: http://www.djangoproject.com/documentation/settings/#middleware-classes + +How it works +============ + +``django-admin.py install redirects`` creates a ``django_redirects`` table in +your database. This is a simple lookup table with ``site_id``, ``old_path`` and +``new_path`` fields. + +The ``RedirectFallbackMiddleware`` does all of the work. Each time any Django +application raises a 404 error, this middleware checks the redirects database +for the requested URL as a last resort. Specifically, it checks for a redirect +with the given ``old_path`` with a site ID that corresponds to the SITE_ID_ +setting. + + * If it finds a match, and ``new_path`` is not empty, it redirects to + ``new_path``. + * If it finds a match, and ``new_path`` is empty, it sends a 410 ("Gone") + HTTP header and empty (content-less) response. + * If it doesn't find a match, the request continues to be processed as + usual. + +The middleware only gets activated for 404s -- not for 500s or responses of any +other status code. + +Note that the order of ``MIDDLEWARE_CLASSES`` matters. Generally, you can put +``RedirectFallbackMiddleware`` at the end of the list, because it's a last +resort. + +For more on middleware, read the `middleware docs`_. + +.. _SITE_ID: http://www.djangoproject.com/documentation/settings/#site-id +.. _middleware docs: http://www.djangoproject.com/documentation/middleware/ + +How to add, change and delete redirects +======================================= + +Via the admin interface +----------------------- + +If you've activated the automatic Django admin interface, you should see a +"Redirects" section on the admin index page. Edit redirects as you edit any +other object in the system. + +Via the Python API +------------------ + +Redirects are represented by a standard `Django model`_, which lives in +`django/contrib/redirects/models/redirects.py`_. You can access redirect +objects via the `Django database API`_. + +.. _Django model: http://www.djangoproject.com/documentation/model_api/ +.. _django/contrib/redirects/models/redirects.py: http://code.djangoproject.com/browser/django/trunk/django/contrib/redirects/models/redirects.py +.. _Django database API: http://www.djangoproject.com/documentation/db_api/ diff --git a/docs/settings.txt b/docs/settings.txt index 9b7eb2004a..b5287b26a2 100644 --- a/docs/settings.txt +++ b/docs/settings.txt @@ -358,6 +358,17 @@ Default: ``('/cgi-bin/', '/_vti_bin', '/_vti_inf')`` A tuple of strings that specify beginnings of URLs that should be ignored by the 404 e-mailer. See ``SEND_BROKEN_LINK_EMAILS`` and ``IGNORABLE_404_ENDS``. +INSTALLED_APPS +-------------- + +Default: Not defined + +A tuple of strings designating all applications that are enabled in this Django +installation. Each string should be a full Python path to a Python package that +contains a Django application, as created by `django-admin.py startapp`_. + +.. _django-admin.py startapp: http://www.djangoproject.com/documentation/django_admin/#startapp-appname + INTERNAL_IPS ------------ @@ -488,6 +499,15 @@ See the `session docs`_. ``'hotclub'`` is a reference to the Hot Club of France, the band Django Reinhardt played in. +SITE_ID +------- + +Default: Not defined + +The ID, as an integer, of the current site in the ``sites`` database. This is +used so that application data can hook into specific site(s) and a single +database can manage content for multiple sites. + TEMPLATE_DIRS ------------- @@ -542,14 +562,6 @@ A boolean that specifies whether to output the "Etag" header. This saves bandwidth but slows down performance. This is only used if ``CommonMiddleware`` is installed (see the `middleware docs`_). -USE_FLAT_PAGES --------------- - -Default: ``True`` - -Whether to check the flat-pages table as a last resort for all 404 errors. This -is only used if ``CommonMiddleware`` is installed (see the `middleware docs`_). - .. _cache docs: http://www.djangoproject.com/documentation/cache/ .. _middleware docs: http://www.djangoproject.com/documentation/middleware/ .. _session docs: http://www.djangoproject.com/documentation/sessions/ diff --git a/docs/url_dispatch.txt b/docs/url_dispatch.txt index 3a3feea8be..363d31174a 100644 --- a/docs/url_dispatch.txt +++ b/docs/url_dispatch.txt @@ -56,7 +56,6 @@ module that will be used for the entire site. Here's the URLconf for the (r'^documentation/', include('django_website.apps.docs.urls.docs')), (r'^comments/', include('django.contrib.comments.urls.comments')), (r'^rss/', include('django.conf.urls.rss')), - (r'', include('django.conf.urls.flatfiles')), ) Note that an included URLconf receives any captured parameters from parent