From 0b059aa4eadc1d95ceca3a32821b65a9fb2a53e8 Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Tue, 24 Oct 2006 07:49:37 +0000 Subject: [PATCH] sqlalchemy: Merged revisions 3832 to 3917 from trunk. git-svn-id: http://code.djangoproject.com/svn/django/branches/sqlalchemy@3918 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- AUTHORS | 8 + MANIFEST.in | 8 + django/bin/daily_cleanup.py | 13 +- django/conf/global_settings.py | 9 +- django/conf/locale/cs/LC_MESSAGES/django.mo | Bin 33632 -> 37754 bytes django/conf/locale/cs/LC_MESSAGES/django.po | 732 +++-- django/conf/locale/ja/LC_MESSAGES/django.mo | Bin 33761 -> 36566 bytes django/conf/locale/ja/LC_MESSAGES/django.po | 721 +++-- django/conf/locale/ja/LC_MESSAGES/djangojs.mo | Bin 1560 -> 1604 bytes django/conf/locale/ja/LC_MESSAGES/djangojs.po | 44 +- django/conf/locale/tr/LC_MESSAGES/django.mo | Bin 14429 -> 37149 bytes django/conf/locale/tr/LC_MESSAGES/django.po | 2717 +++++++++-------- django/conf/locale/tr/LC_MESSAGES/djangojs.mo | Bin 0 -> 1508 bytes django/conf/locale/tr/LC_MESSAGES/djangojs.po | 109 + .../templates/admin_doc/view_detail.html | 2 +- django/contrib/admin/views/decorators.py | 2 +- django/contrib/auth/create_superuser.py | 1 + django/contrib/auth/decorators.py | 4 +- django/contrib/auth/forms.py | 6 +- django/contrib/auth/models.py | 2 + django/contrib/sitemaps/templates/sitemap.xml | 2 + .../sitemaps/templates/sitemap_index.xml | 6 +- django/core/handlers/base.py | 35 +- django/core/handlers/modpython.py | 37 +- django/core/handlers/wsgi.py | 8 +- django/core/management.py | 114 +- django/core/servers/basehttp.py | 2 +- django/core/urlresolvers.py | 3 +- django/core/validators.py | 4 +- django/db/backends/mysql/base.py | 18 + django/db/models/fields/__init__.py | 15 +- django/db/models/fields/related.py | 2 +- django/db/models/manipulators.py | 9 +- django/db/models/query.py | 49 +- django/forms/__init__.py | 3 +- django/middleware/common.py | 12 +- django/template/__init__.py | 2 +- django/test/client.py | 56 +- django/utils/itercompat.py | 31 + django/views/generic/create_update.py | 6 +- docs/admin_css.txt | 4 +- docs/apache_auth.txt | 2 +- docs/api_stability.txt | 4 +- docs/authentication.txt | 59 +- docs/contributing.txt | 6 +- docs/db-api.txt | 21 +- docs/django-admin.txt | 8 +- docs/faq.txt | 18 +- docs/forms.txt | 29 +- docs/generic_views.txt | 16 +- docs/install.txt | 36 +- docs/model-api.txt | 5 +- docs/release_notes_0.95.txt | 2 +- docs/request_response.txt | 4 +- docs/serialization.txt | 22 +- docs/settings.txt | 16 +- docs/templates.txt | 7 +- docs/templates_python.txt | 43 +- docs/testing.txt | 6 +- docs/tutorial02.txt | 2 +- docs/tutorial03.txt | 4 +- docs/tutorial04.txt | 2 +- ez_setup.py | 217 -- setup.py | 45 +- tests/modeltests/one_to_one/models.py | 14 + tests/regressiontests/dateformat/tests.py | 42 +- .../regressiontests/null_queries/__init__.py | 0 tests/regressiontests/null_queries/models.py | 54 + tests/regressiontests/templates/tests.py | 3 + 69 files changed, 3214 insertions(+), 2269 deletions(-) create mode 100644 MANIFEST.in create mode 100644 django/conf/locale/tr/LC_MESSAGES/djangojs.mo create mode 100644 django/conf/locale/tr/LC_MESSAGES/djangojs.po create mode 100644 django/utils/itercompat.py delete mode 100644 ez_setup.py create mode 100644 tests/regressiontests/null_queries/__init__.py create mode 100644 tests/regressiontests/null_queries/models.py diff --git a/AUTHORS b/AUTHORS index 3c2542cb0d..88dbef908e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -64,6 +64,7 @@ answer newbie questions, and generally made Django that much better: Ian Clelland crankycoder@gmail.com Matt Croydon + dackze+django@gmail.com Jonathan Daugherty (cygnus) Jason Davies (Esaj) Alex Dedul @@ -74,6 +75,7 @@ answer newbie questions, and generally made Django that much better: Jeremy Dunck Andy Dustman Clint Ecker + Enrico favo@exoweb.net gandalf@owca.info Baishampayan Ghose @@ -82,6 +84,7 @@ answer newbie questions, and generally made Django that much better: Espen Grindhaug Brant Harris heckj@mac.com + Joel Heenan hipertracker@gmail.com Ian Holsman Kieran Holland @@ -95,6 +98,7 @@ answer newbie questions, and generally made Django that much better: kilian Sune Kirkeby Cameron Knight (ckknight) + Meir Kriheli Bruce Kroeze Joseph Kocherhans konrad@gwu.edu @@ -103,7 +107,9 @@ answer newbie questions, and generally made Django that much better: Eugene Lazutkin Jeong-Min Lee Christopher Lenz + lerouxb@gmail.com limodou + mattmcc Martin Maney Manuzhai Petar Marić @@ -115,6 +121,7 @@ answer newbie questions, and generally made Django that much better: Eric Moritz Robin Munn Nebojša Dorđević + Fraser Nevett Sam Newman Neal Norwitz oggie rob @@ -142,6 +149,7 @@ answer newbie questions, and generally made Django that much better: Radek Švarz Swaroop C H Aaron Swartz + Tyson Tate Tom Tobin Tom Insam Joe Topjian diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000000..b5fbb3cb90 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,8 @@ +include AUTHORS +include INSTALL +include LICENSE +recursive-include django/conf/locale * +recursive-include django/contrib/admin/templates +recursive-include django/contrib/admin/media +recursive-include django/contrib/comments/templates +recursive-include django/contrib/sitemaps/templates diff --git a/django/bin/daily_cleanup.py b/django/bin/daily_cleanup.py index 6eb5c17feb..667e0f16c6 100644 --- a/django/bin/daily_cleanup.py +++ b/django/bin/daily_cleanup.py @@ -1,16 +1,17 @@ -"Daily cleanup file" +""" +Daily cleanup job. + +Can be run as a cronjob to clean out old data from the database (only expired +sessions at the moment). +""" from django.db import backend, connection, transaction -DOCUMENTATION_DIRECTORY = '/home/html/documentation/' - def clean_up(): # Clean up old database records cursor = connection.cursor() cursor.execute("DELETE FROM %s WHERE %s < NOW()" % \ - (backend.quote_name('core_sessions'), backend.quote_name('expire_date'))) - cursor.execute("DELETE FROM %s WHERE %s < NOW() - INTERVAL '1 week'" % \ - (backend.quote_name('registration_challenges'), backend.quote_name('request_date'))) + (backend.quote_name('django_session'), backend.quote_name('expire_date'))) transaction.commit_unless_managed() if __name__ == "__main__": diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py index dc30d3f1f4..69c775cdec 100644 --- a/django/conf/global_settings.py +++ b/django/conf/global_settings.py @@ -56,6 +56,7 @@ LANGUAGES = ( ('ja', gettext_noop('Japanese')), ('nl', gettext_noop('Dutch')), ('no', gettext_noop('Norwegian')), + ('pl', gettext_noop('Polish')), ('pt-br', gettext_noop('Brazilian')), ('ro', gettext_noop('Romanian')), ('ru', gettext_noop('Russian')), @@ -223,10 +224,6 @@ YEAR_MONTH_FORMAT = 'F Y' # http://www.djangoproject.com/documentation/templates/#now MONTH_DAY_FORMAT = 'F j' -# Whether to enable Psyco, which optimizes Python code. Requires Psyco. -# http://psyco.sourceforge.net/ -ENABLE_PSYCO = False - # Do you want to manage transactions manually? # Hint: you really don't! TRANSACTIONS_MANAGED = False @@ -274,8 +271,8 @@ CACHE_MIDDLEWARE_KEY_PREFIX = '' COMMENTS_ALLOW_PROFANITIES = False # The profanities that will trigger a validation error in the -# 'hasNoProfanities' validator. All of these should be in lower-case. -PROFANITIES_LIST = ['asshat', 'asshead', 'asshole', 'cunt', 'fuck', 'gook', 'nigger', 'shit'] +# 'hasNoProfanities' validator. All of these should be in lowercase. +PROFANITIES_LIST = ('asshat', 'asshead', 'asshole', 'cunt', 'fuck', 'gook', 'nigger', 'shit') # The group ID that designates which users are banned. # Set to None if you're not using it. diff --git a/django/conf/locale/cs/LC_MESSAGES/django.mo b/django/conf/locale/cs/LC_MESSAGES/django.mo index 89840238109059592f2a96d547cdc1e83de12fd6..c2f04edb81d3d79459d1f7d6b2dcfb8012caf7f0 100644 GIT binary patch delta 12799 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 F{{y)dD}Mk0 delta 9276 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\n" +"PO-Revision-Date: 2006-10-07 13:10+0100\n" +"Last-Translator: \n" "Language-Team: Czech\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Poedit-Country: CZECH REPUBLIC\n" -"X-Poedit-Bookmarks: -1,-1,-1,-1,-1,-1,-1,-1,-1,139\n" #: contrib/comments/models.py:67 #: contrib/comments/models.py:166 @@ -80,7 +79,7 @@ msgid "is public" msgstr "je veřejné" #: contrib/comments/models.py:85 -#: contrib/admin/views/doc.py:289 +#: contrib/admin/views/doc.py:304 msgid "IP address" msgstr "IP adresa" @@ -214,11 +213,11 @@ msgstr "Neplatné ID komentáře" msgid "No voting for yourself" msgstr "Nelze hlasovat pro sebe" -#: contrib/comments/views/comments.py:28 +#: contrib/comments/views/comments.py:27 msgid "This rating is required because you've entered at least one other rating." msgstr "Toto hodnocení je povinné, protože jste zadal(a) alespoň jedno jiné hodnocení." -#: contrib/comments/views/comments.py:112 +#: contrib/comments/views/comments.py:111 #, python-format msgid "" "This comment was posted by a user who has posted fewer than %(count)s comment:\n" @@ -241,7 +240,7 @@ msgstr[2] "" "\n" "%(text)s" -#: contrib/comments/views/comments.py:117 +#: contrib/comments/views/comments.py:116 #, python-format msgid "" "This comment was posted by a sketchy user:\n" @@ -252,22 +251,22 @@ msgstr "" "\n" "%(text)s" -#: contrib/comments/views/comments.py:189 +#: contrib/comments/views/comments.py:188 #: contrib/comments/views/comments.py:280 msgid "Only POSTs are allowed" msgstr "Je povolená pouze metoda POST" -#: contrib/comments/views/comments.py:193 +#: contrib/comments/views/comments.py:192 #: contrib/comments/views/comments.py:284 msgid "One or more of the required fields wasn't submitted" msgstr "Jedno nebo více povinných polí nebylo vyplněné" -#: contrib/comments/views/comments.py:197 +#: contrib/comments/views/comments.py:196 #: contrib/comments/views/comments.py:286 msgid "Somebody tampered with the comment form (security violation)" msgstr "Někdo falšoval formulář komentáře (bezpečnostní narušení)" -#: contrib/comments/views/comments.py:207 +#: contrib/comments/views/comments.py:206 #: contrib/comments/views/comments.py:292 msgid "The comment form had an invalid 'target' parameter -- the object ID was invalid" msgstr "Formulář komentáře měl neplatný parametr 'target' -- ID objektu nebylo platné" @@ -284,18 +283,9 @@ msgid "Username:" msgstr "Uživatelské jméno:" #: contrib/comments/templates/comments/form.html:6 -#: contrib/admin/templates/admin/login.html:20 -msgid "Password:" -msgstr "Heslo:" - -#: contrib/comments/templates/comments/form.html:6 -msgid "Forgotten your password?" -msgstr "Zapomenuté 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/base.html:23 +#: contrib/admin/templates/admin/base.html:25 #: 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 @@ -313,6 +303,15 @@ msgstr "Zapomenuté heslo?" msgid "Log out" msgstr "Odhlásit se" +#: contrib/comments/templates/comments/form.html:8 +#: contrib/admin/templates/admin/login.html:20 +msgid "Password:" +msgstr "Heslo:" + +#: contrib/comments/templates/comments/form.html:8 +msgid "Forgotten your password?" +msgstr "Zapomenuté heslo?" + #: contrib/comments/templates/comments/form.html:12 msgid "Ratings" msgstr "Hodnocení" @@ -331,13 +330,13 @@ msgstr "Volitelné" msgid "Post a photo" msgstr "Zařadit fotografii" -#: contrib/comments/templates/comments/form.html:27 +#: contrib/comments/templates/comments/form.html:28 #: contrib/comments/templates/comments/freeform.html:5 msgid "Comment:" msgstr "Komentář:" -#: contrib/comments/templates/comments/form.html:32 -#: contrib/comments/templates/comments/freeform.html:9 +#: contrib/comments/templates/comments/form.html:35 +#: contrib/comments/templates/comments/freeform.html:10 msgid "Preview comment" msgstr "Náhled komentáře" @@ -357,6 +356,7 @@ msgstr "" #: contrib/admin/filterspecs.py:70 #: contrib/admin/filterspecs.py:88 #: contrib/admin/filterspecs.py:143 +#: contrib/admin/filterspecs.py:169 msgid "All" msgstr "Vše" @@ -420,217 +420,292 @@ msgstr "log záznam" msgid "log entries" msgstr "log záznamy" -#: contrib/admin/templatetags/admin_list.py:228 +#: contrib/admin/templatetags/admin_list.py:230 msgid "All dates" msgstr "Všechna data" -#: contrib/admin/views/decorators.py:9 -#: contrib/auth/forms.py:36 -#: contrib/auth/forms.py:41 +#: contrib/admin/views/decorators.py:10 +#: contrib/auth/forms.py:59 msgid "Please enter a correct username and password. Note that both fields are case-sensitive." msgstr "Prosíme, vložte správné uživatelské jméno a heslo. Poznámka - u obou položek se rozlišuje velikost písmen." -#: contrib/admin/views/decorators.py:23 +#: contrib/admin/views/decorators.py:24 #: contrib/admin/templates/admin/login.html:25 msgid "Log in" msgstr "Přihlášení" -#: contrib/admin/views/decorators.py:61 +#: contrib/admin/views/decorators.py:62 msgid "Please log in again, because your session has expired. Don't worry: Your submission has been saved." msgstr "Prosíme, znovu se přihlašte, Vaše sezení vypršelo. Nemusíte se obávat, Vaše podání je uloženo." -#: contrib/admin/views/decorators.py:68 +#: contrib/admin/views/decorators.py:69 msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again." msgstr "Vypadá to, že Váš prohlížeč není nastaven, aby akceptoval cookies. Prosíme, zapněte cookies, obnovte tuto stránku a zkuste znovu." -#: contrib/admin/views/decorators.py:82 +#: contrib/admin/views/decorators.py:83 msgid "Usernames cannot contain the '@' character." msgstr "Uživatelská jména nemohou obsahovat znak '@'." -#: contrib/admin/views/decorators.py:84 +#: contrib/admin/views/decorators.py:85 #, python-format msgid "Your e-mail address is not your username. Try '%s' instead." msgstr "Vaše e-mailová adresa není Vaše uživatelské jméno. Zkuste místo toho '%s'." -#: contrib/admin/views/main.py:226 +#: contrib/admin/views/main.py:223 msgid "Site administration" msgstr "Django správa" -#: contrib/admin/views/main.py:260 +#: contrib/admin/views/main.py:257 +#: contrib/admin/views/auth.py:17 #, python-format msgid "The %(name)s \"%(obj)s\" was added successfully." msgstr "Záznam %(name)s \"%(obj)s\" byl úspěšně přidán." -#: contrib/admin/views/main.py:264 -#: contrib/admin/views/main.py:348 +#: contrib/admin/views/main.py:261 +#: contrib/admin/views/main.py:347 +#: contrib/admin/views/auth.py:22 msgid "You may edit it again below." msgstr "Můžete to opět upravit níže." -#: contrib/admin/views/main.py:272 -#: contrib/admin/views/main.py:357 +#: contrib/admin/views/main.py:271 +#: contrib/admin/views/main.py:356 #, python-format msgid "You may add another %s below." msgstr "Můžete přidat další %s níže." -#: contrib/admin/views/main.py:290 +#: contrib/admin/views/main.py:289 #, python-format msgid "Add %s" msgstr "%s: přidat" -#: contrib/admin/views/main.py:336 +#: contrib/admin/views/main.py:335 #, python-format msgid "Added %s." msgstr "Záznam %s byl přidán." -#: contrib/admin/views/main.py:336 -#: contrib/admin/views/main.py:338 -#: contrib/admin/views/main.py:340 +#: contrib/admin/views/main.py:335 +#: contrib/admin/views/main.py:337 +#: contrib/admin/views/main.py:339 msgid "and" msgstr "a" -#: contrib/admin/views/main.py:338 +#: contrib/admin/views/main.py:337 #, python-format msgid "Changed %s." msgstr "%s: změněno" -#: contrib/admin/views/main.py:340 +#: contrib/admin/views/main.py:339 #, python-format msgid "Deleted %s." msgstr "Záznam %s byl smazán." -#: contrib/admin/views/main.py:343 +#: contrib/admin/views/main.py:342 msgid "No fields changed." msgstr "Nebyly změněny žádné pole." -#: contrib/admin/views/main.py:346 +#: contrib/admin/views/main.py:345 #, python-format msgid "The %(name)s \"%(obj)s\" was changed successfully." msgstr "%(name)s \"%(obj)s\" byl úspěšně změněn." -#: contrib/admin/views/main.py:354 +#: contrib/admin/views/main.py:353 #, python-format msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." msgstr "The %(name)s \"%(obj)s\" byl úspěšně přidán. Můžete to opět upravit níže." -#: contrib/admin/views/main.py:392 +#: contrib/admin/views/main.py:391 #, python-format msgid "Change %s" msgstr "%s: změnit" -#: contrib/admin/views/main.py:470 +#: contrib/admin/views/main.py:473 #, python-format msgid "One or more %(fieldname)s in %(name)s: %(obj)s" msgstr "Jedno nebo více %(fieldname)s z %(name)s: %(obj)s" -#: contrib/admin/views/main.py:475 +#: contrib/admin/views/main.py:478 #, python-format msgid "One or more %(fieldname)s in %(name)s:" msgstr "Jedno nebo více %(fieldname)s z %(name)s:" -#: contrib/admin/views/main.py:508 +#: contrib/admin/views/main.py:511 #, python-format msgid "The %(name)s \"%(obj)s\" was deleted successfully." msgstr "Záznam %(name)s \"%(obj)s\" byl úspěšně smazán." -#: contrib/admin/views/main.py:511 +#: contrib/admin/views/main.py:514 msgid "Are you sure?" msgstr "Jste si jist(á)?" -#: contrib/admin/views/main.py:533 +#: contrib/admin/views/main.py:536 #, python-format msgid "Change history: %s" msgstr "Historie změn: %s" -#: contrib/admin/views/main.py:565 +#: contrib/admin/views/main.py:570 #, python-format msgid "Select %s" msgstr "Vybrat %s" -#: contrib/admin/views/main.py:565 +#: contrib/admin/views/main.py:570 #, python-format msgid "Select %s to change" msgstr "Vyberte %s pro změnu" -#: 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/main.py:758 +msgid "Database error" +msgstr "Databázová chyba" + +#: contrib/admin/views/doc.py:46 +#: contrib/admin/views/doc.py:48 +#: contrib/admin/views/doc.py:50 +msgid "tag:" +msgstr "tag:" + +#: contrib/admin/views/doc.py:77 +#: contrib/admin/views/doc.py:79 +#: contrib/admin/views/doc.py:81 +msgid "filter:" +msgstr "filtr:" + +#: contrib/admin/views/doc.py:135 +#: contrib/admin/views/doc.py:137 +#: contrib/admin/views/doc.py:139 +msgid "view:" +msgstr "pohled (view):" + +#: contrib/admin/views/doc.py:164 +#, python-format +msgid "App %r not found" +msgstr "Aplikace %r nenalezena" + +#: contrib/admin/views/doc.py:171 +#, python-format +msgid "Model %r not found in app %r" +msgstr "Model %r v aplikaci %r nenalezen" + +#: contrib/admin/views/doc.py:183 +#, python-format +msgid "the related `%s.%s` object" +msgstr "související objekt `%s.%s`" + +#: contrib/admin/views/doc.py:183 +#: contrib/admin/views/doc.py:205 +#: contrib/admin/views/doc.py:219 +#: contrib/admin/views/doc.py:224 +msgid "model:" +msgstr "model:" + +#: contrib/admin/views/doc.py:214 +#, python-format +msgid "related `%s.%s` objects" +msgstr "související objekty `%s.%s`" + +#: contrib/admin/views/doc.py:219 +#, python-format +msgid "all %s" +msgstr "%s: vše" + +#: contrib/admin/views/doc.py:224 +#, python-format +msgid "number of %s" +msgstr "%s: počet" + +#: contrib/admin/views/doc.py:229 +#, python-format +msgid "Fields on %s objects" +msgstr "Pole na objektech %s" + +#: contrib/admin/views/doc.py:291 +#: contrib/admin/views/doc.py:301 +#: contrib/admin/views/doc.py:303 +#: contrib/admin/views/doc.py:309 +#: contrib/admin/views/doc.py:310 +#: contrib/admin/views/doc.py:312 msgid "Integer" msgstr "Celé číslo" -#: contrib/admin/views/doc.py:278 +#: contrib/admin/views/doc.py:292 msgid "Boolean (Either True or False)" msgstr "Boolean (buď Ano (True), nebo Ne (False))" -#: contrib/admin/views/doc.py:279 -#: contrib/admin/views/doc.py:296 +#: contrib/admin/views/doc.py:293 +#: contrib/admin/views/doc.py:311 #, python-format msgid "String (up to %(maxlength)s)" msgstr "Text (maximálně %(maxlength)s znaků)" -#: contrib/admin/views/doc.py:280 +#: contrib/admin/views/doc.py:294 msgid "Comma-separated integers" msgstr "Celá čísla oddělená čárkou" -#: contrib/admin/views/doc.py:281 +#: contrib/admin/views/doc.py:295 msgid "Date (without time)" msgstr "Datum (bez času)" -#: contrib/admin/views/doc.py:282 +#: contrib/admin/views/doc.py:296 msgid "Date (with time)" msgstr "Datum (s časem)" -#: contrib/admin/views/doc.py:283 +#: contrib/admin/views/doc.py:297 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:298 +#: contrib/admin/views/doc.py:299 +#: contrib/admin/views/doc.py:302 msgid "File path" msgstr "Cesta k souboru" -#: contrib/admin/views/doc.py:285 +#: contrib/admin/views/doc.py:300 msgid "Decimal number" msgstr "Desetiné číslo" -#: contrib/admin/views/doc.py:291 +#: contrib/admin/views/doc.py:306 msgid "Boolean (Either True, False or None)" msgstr "Boolean (buď Ano (True), Ne (False), nebo Nic (None))" -#: contrib/admin/views/doc.py:292 +#: contrib/admin/views/doc.py:307 msgid "Relation to parent model" msgstr "V relaci k rodičovskému modelu" -#: contrib/admin/views/doc.py:293 +#: contrib/admin/views/doc.py:308 msgid "Phone number" msgstr "Telefonní číslo" -#: contrib/admin/views/doc.py:298 +#: contrib/admin/views/doc.py:313 msgid "Text" msgstr "Text" -#: contrib/admin/views/doc.py:299 +#: contrib/admin/views/doc.py:314 msgid "Time" msgstr "Čas" -#: contrib/admin/views/doc.py:300 +#: contrib/admin/views/doc.py:315 #: contrib/flatpages/models.py:7 msgid "URL" msgstr "URL" -#: contrib/admin/views/doc.py:301 +#: contrib/admin/views/doc.py:316 msgid "U.S. state (two uppercase letters)" msgstr "Stát US (2 velké znaky)" -#: contrib/admin/views/doc.py:302 +#: contrib/admin/views/doc.py:317 msgid "XML text" msgstr "text XML" +#: contrib/admin/views/doc.py:343 +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s pravděpodobně není objekt urlpattern" + +#: contrib/admin/views/auth.py:28 +msgid "Add user" +msgstr "Přidat uživatele" + #: 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/base.html:25 #: 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 @@ -641,7 +716,7 @@ msgstr "Dokumentace" #: 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/base.html:25 #: 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 @@ -662,9 +737,10 @@ msgstr "Změnit 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/base.html:28 +#: contrib/admin/templates/admin/base.html:30 #: contrib/admin/templates/admin/delete_confirmation.html:6 #: contrib/admin/templates/admin/change_form.html:13 +#: contrib/admin/templates/admin/invalid_setup.html:4 #: 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 @@ -737,6 +813,11 @@ msgstr "Je nám líto, ale vyžádaná stránka nebyla nalezena." msgid "Models available in the %(name)s application." msgstr "Dostupné modely v aplikaci %(name)s." +#: contrib/admin/templates/admin/index.html:18 +#, python-format +msgid "%(name)s" +msgstr "%(name)s" + #: contrib/admin/templates/admin/index.html:28 #: contrib/admin/templates/admin/change_form.html:15 msgid "Add" @@ -771,7 +852,7 @@ msgstr "%(name)s: přidat" msgid "Have you forgotten your password?" msgstr "Zapomněl(a) jste své heslo?" -#: contrib/admin/templates/admin/base.html:23 +#: contrib/admin/templates/admin/base.html:25 msgid "Welcome," msgstr "Vítejte," @@ -782,13 +863,13 @@ msgstr "Smazat" #: 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 "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 '%(escaped_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 '%(escaped_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/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 "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 \"%(escaped_object)s\"? All of the following related items will be deleted:" +msgstr "Jste si jist(á), že chcete smazat %(object_name)s \"%(escaped_object)s\"? Všechny následující související položky budou smazány:" #: contrib/admin/templates/admin/delete_confirmation.html:26 msgid "Yes, I'm sure" @@ -796,13 +877,34 @@ msgstr "Ano, jsem si jist" #: contrib/admin/templates/admin/filter.html:2 #, python-format -msgid " By %(title)s " -msgstr "Od %(title)s" +msgid " By %(filter_title)s " +msgstr " Dle %(filter_title)s " #: contrib/admin/templates/admin/search_form.html:8 msgid "Go" msgstr "Provést" +#: contrib/admin/templates/admin/search_form.html:10 +#, python-format +msgid "1 result" +msgid_plural "%(counter)s results" +msgstr[0] "1 výsledek" +msgstr[1] "%(counter)s výsledky" +msgstr[2] "%(counter)s výsledků" + +#: contrib/admin/templates/admin/search_form.html:10 +#, python-format +msgid "%(full_result_count)s total" +msgstr "celkem %(full_result_count)s" + +#: contrib/admin/templates/admin/pagination.html:10 +msgid "Show all" +msgstr "Zobrazit všechny" + +#: contrib/admin/templates/admin/filters.html:4 +msgid "Filter" +msgstr "Filtr" + #: contrib/admin/templates/admin/change_form.html:21 msgid "View on site" msgstr "Pohled na stránku" @@ -838,6 +940,30 @@ msgstr "Uložit a pokračovat v úpravách" msgid "Save" msgstr "Uložit" +#: 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 "Něco není v pořádku s Vaší instalací databáze. Ujistěte se, že byly vytvořeny odpovídající tabulky databáze a že databáze je přístupná pro čtení daným databázovým uživatelem." + +#: contrib/admin/templates/admin/auth/user/add_form.html:6 +msgid "First, enter a username and password. Then, you'll be able to edit more user options." +msgstr "Nejdříve vložte uživatelské jméno a heslo. Poté budete moci upravovat více uživatelských možností." + +#: contrib/admin/templates/admin/auth/user/add_form.html:12 +msgid "Username" +msgstr "Uživatelské jméno" + +#: contrib/admin/templates/admin/auth/user/add_form.html:18 +msgid "Password" +msgstr "Heslo" + +#: contrib/admin/templates/admin/auth/user/add_form.html:23 +msgid "Password (again)" +msgstr "Heslo (znova)" + +#: contrib/admin/templates/admin/auth/user/add_form.html:24 +msgid "Enter the same password as above, for verification." +msgstr "Pro ověření vložte stejné heslo znovu." + #: 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 @@ -1031,11 +1157,11 @@ msgstr "přesměrovat na" 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://'." -#: contrib/redirects/models.py:12 +#: contrib/redirects/models.py:13 msgid "redirect" msgstr "přesměrovat" -#: contrib/redirects/models.py:13 +#: contrib/redirects/models.py:14 msgid "redirects" msgstr "přesměrování" @@ -1060,8 +1186,8 @@ msgid "template name" msgstr "jméno šablony" #: contrib/flatpages/models.py:13 -msgid "Example: 'flatpages/contact_page'. If this isn't provided, the system will use 'flatpages/default'." -msgstr "Například: 'flatfiles/kontaktni_stranka'. Pokud toto není zadáno, systém použije 'flatfiles/default'." +msgid "Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'." +msgstr "Například: 'flatpages/kontaktni_stranka.html'. Pokud toto není zadáno, systém použije 'flatpages/default.html'." #: contrib/flatpages/models.py:14 msgid "registration required" @@ -1079,150 +1205,170 @@ msgstr "statická stránka" msgid "flat pages" msgstr "statické stránky" -#: contrib/auth/models.py:13 -#: contrib/auth/models.py:26 +#: contrib/auth/views.py:39 +msgid "Logged out" +msgstr "Odhlášeno" + +#: contrib/auth/models.py:38 +#: contrib/auth/models.py:57 msgid "name" msgstr "jméno" -#: contrib/auth/models.py:15 +#: contrib/auth/models.py:40 msgid "codename" msgstr "codename" -#: contrib/auth/models.py:17 +#: contrib/auth/models.py:42 msgid "permission" msgstr "oprávnění" -#: contrib/auth/models.py:18 -#: contrib/auth/models.py:27 +#: contrib/auth/models.py:43 +#: contrib/auth/models.py:58 msgid "permissions" msgstr "oprávnění" -#: contrib/auth/models.py:29 +#: contrib/auth/models.py:60 msgid "group" msgstr "skupina" -#: contrib/auth/models.py:30 -#: contrib/auth/models.py:65 +#: contrib/auth/models.py:61 +#: contrib/auth/models.py:100 msgid "groups" msgstr "skupiny" -#: contrib/auth/models.py:55 +#: contrib/auth/models.py:90 msgid "username" msgstr "uživatelské jméno" -#: contrib/auth/models.py:56 +#: contrib/auth/models.py:90 +msgid "Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)." +msgstr "Požadováno. 30 znaků nebo méně. Pouze alfanumerické znaky (znaky, čísla a podtržítka)." + +#: contrib/auth/models.py:91 msgid "first name" msgstr "křestní jméno" -#: contrib/auth/models.py:57 +#: contrib/auth/models.py:92 msgid "last name" msgstr "příjmení" -#: contrib/auth/models.py:58 +#: contrib/auth/models.py:93 msgid "e-mail address" msgstr "e-mailová adresa" -#: contrib/auth/models.py:59 +#: contrib/auth/models.py:94 msgid "password" msgstr "heslo" -#: contrib/auth/models.py:59 +#: contrib/auth/models.py:94 msgid "Use '[algo]$[salt]$[hexdigest]'" msgstr "Použijte '[algo]$[salt]$[hexdigest]'" -#: contrib/auth/models.py:60 +#: contrib/auth/models.py:95 msgid "staff status" msgstr "administrativní přístup " -#: contrib/auth/models.py:60 +#: contrib/auth/models.py:95 msgid "Designates whether the user can log into this admin site." msgstr "Rozhodne, zda se může uživatel přihlásit do správy webu." -#: contrib/auth/models.py:61 +#: contrib/auth/models.py:96 msgid "active" msgstr "aktivní" -#: contrib/auth/models.py:62 +#: contrib/auth/models.py:96 +msgid "Designates whether this user can log into the Django admin. Unselect this instead of deleting accounts." +msgstr "Rozhodne, zda se může uživatel přihlásit do správy webu. Nastavte toto místo mazání účtů." + +#: contrib/auth/models.py:97 msgid "superuser status" msgstr "stav superuživatel" -#: contrib/auth/models.py:63 +#: contrib/auth/models.py:97 +msgid "Designates that this user has all permissions without explicitly assigning them." +msgstr "Stanoví, že tento uživatel má veškerá oprávnění bez jejich explicitního přiřazení." + +#: contrib/auth/models.py:98 msgid "last login" msgstr "poslední přihlášení" -#: contrib/auth/models.py:64 +#: contrib/auth/models.py:99 msgid "date joined" msgstr "datum zaregistrování" -#: contrib/auth/models.py:66 +#: contrib/auth/models.py:101 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." -#: contrib/auth/models.py:67 +#: contrib/auth/models.py:102 msgid "user permissions" msgstr "uživatelskí oprávnění" -#: contrib/auth/models.py:70 +#: contrib/auth/models.py:105 msgid "user" msgstr "uživatel" -#: contrib/auth/models.py:71 +#: contrib/auth/models.py:106 msgid "users" msgstr "uživatelé" -#: contrib/auth/models.py:76 +#: contrib/auth/models.py:111 msgid "Personal info" msgstr "Osobní informace" -#: contrib/auth/models.py:77 +#: contrib/auth/models.py:112 msgid "Permissions" msgstr "Oprávnění" -#: contrib/auth/models.py:78 +#: contrib/auth/models.py:113 msgid "Important dates" msgstr "Důležitá data" -#: contrib/auth/models.py:79 +#: contrib/auth/models.py:114 msgid "Groups" msgstr "Skupiny" -#: contrib/auth/models.py:219 +#: contrib/auth/models.py:256 msgid "message" msgstr "zpráva" -#: contrib/auth/forms.py:30 +#: contrib/auth/forms.py:52 msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in." msgstr "Váš prohlížeč pravděpodobně nemá zapnuté cookies. Cookies jsou potřeba pro zalogování." -#: contrib/contenttypes/models.py:25 +#: contrib/auth/forms.py:61 +msgid "This account is inactive." +msgstr "Tento účet není aktivní." + +#: contrib/contenttypes/models.py:20 msgid "python model class name" msgstr "jméno modelu Pythonu" -#: contrib/contenttypes/models.py:28 +#: contrib/contenttypes/models.py:23 msgid "content type" msgstr "typ obsahu" -#: contrib/contenttypes/models.py:29 +#: contrib/contenttypes/models.py:24 msgid "content types" msgstr "typy obsahu" -#: contrib/sessions/models.py:35 +#: contrib/sessions/models.py:51 msgid "session key" msgstr "klíč sezení" -#: contrib/sessions/models.py:36 +#: contrib/sessions/models.py:52 msgid "session data" msgstr "data sezení" -#: contrib/sessions/models.py:37 +#: contrib/sessions/models.py:53 msgid "expire date" msgstr "datum expirace" -#: contrib/sessions/models.py:41 +#: contrib/sessions/models.py:57 msgid "session" msgstr "sezení" -#: contrib/sessions/models.py:42 +#: contrib/sessions/models.py:58 msgid "sessions" msgstr "sezení" @@ -1242,18 +1388,6 @@ msgstr "web" msgid "sites" msgstr "weby" -#: utils/translation.py:360 -msgid "DATE_FORMAT" -msgstr "j.n.Y" - -#: utils/translation.py:361 -msgid "DATETIME_FORMAT" -msgstr "j.n.Y, H:i" - -#: utils/translation.py:362 -msgid "TIME_FORMAT" -msgstr "H:i" - #: utils/dates.py:6 msgid "Monday" msgstr "Pondělí" @@ -1453,203 +1587,263 @@ msgstr[0] "minuta" msgstr[1] "minuty" msgstr[2] "minut" -#: conf/global_settings.py:37 +#: utils/translation/trans_real.py:362 +msgid "DATE_FORMAT" +msgstr "j.n.Y" + +#: utils/translation/trans_real.py:363 +msgid "DATETIME_FORMAT" +msgstr "j.n.Y, H:i" + +#: utils/translation/trans_real.py:364 +msgid "TIME_FORMAT" +msgstr "H:i" + +#: utils/translation/trans_real.py:380 +msgid "YEAR_MONTH_FORMAT" +msgstr "F Y" + +#: utils/translation/trans_real.py:381 +msgid "MONTH_DAY_FORMAT" +msgstr "j. F" + +#: conf/global_settings.py:39 +msgid "Arabic" +msgstr "Arabic" + +#: conf/global_settings.py:40 msgid "Bengali" msgstr "Bengálsky" -#: conf/global_settings.py:38 +#: conf/global_settings.py:41 msgid "Czech" msgstr "Česky" -#: conf/global_settings.py:39 +#: conf/global_settings.py:42 msgid "Welsh" msgstr "Welšsky" -#: conf/global_settings.py:40 +#: conf/global_settings.py:43 msgid "Danish" msgstr "Dánsky" -#: conf/global_settings.py:41 +#: conf/global_settings.py:44 msgid "German" msgstr "Německy" -#: conf/global_settings.py:42 +#: conf/global_settings.py:45 msgid "Greek" msgstr "Řecky" -#: conf/global_settings.py:43 +#: conf/global_settings.py:46 msgid "English" msgstr "Anglicky" -#: conf/global_settings.py:44 +#: conf/global_settings.py:47 msgid "Spanish" msgstr "Španělsky" -#: conf/global_settings.py:45 +#: conf/global_settings.py:48 +msgid "Argentinean Spanish" +msgstr "Argentinean Spanish" + +#: conf/global_settings.py:49 +msgid "Finnish" +msgstr "Finsky" + +#: conf/global_settings.py:50 msgid "French" msgstr "Francouzsky" -#: conf/global_settings.py:46 +#: conf/global_settings.py:51 msgid "Galician" msgstr "Galicijsky" -#: conf/global_settings.py:47 +#: conf/global_settings.py:52 msgid "Hungarian" msgstr "Maďarsky" -#: conf/global_settings.py:48 +#: conf/global_settings.py:53 msgid "Hebrew" msgstr "Hebrejsky" -#: conf/global_settings.py:49 +#: conf/global_settings.py:54 msgid "Icelandic" msgstr "Islandština" -#: conf/global_settings.py:50 +#: conf/global_settings.py:55 msgid "Italian" msgstr "Italsky" -#: conf/global_settings.py:51 +#: conf/global_settings.py:56 msgid "Japanese" msgstr "Japonština" -#: conf/global_settings.py:52 +#: conf/global_settings.py:57 msgid "Dutch" msgstr "Holandština" -#: conf/global_settings.py:53 +#: conf/global_settings.py:58 msgid "Norwegian" msgstr "Norsky" -#: conf/global_settings.py:54 +#: conf/global_settings.py:59 msgid "Brazilian" msgstr "Brazilsky" -#: conf/global_settings.py:55 +#: conf/global_settings.py:60 msgid "Romanian" msgstr "Rumunsky" -#: conf/global_settings.py:56 +#: conf/global_settings.py:61 msgid "Russian" msgstr "Rusky" -#: conf/global_settings.py:57 +#: conf/global_settings.py:62 msgid "Slovak" msgstr "Slovensky" -#: conf/global_settings.py:58 +#: conf/global_settings.py:63 msgid "Slovenian" msgstr "Slovinsky" -#: conf/global_settings.py:59 +#: conf/global_settings.py:64 msgid "Serbian" msgstr "Srbsky" -#: conf/global_settings.py:60 +#: conf/global_settings.py:65 msgid "Swedish" msgstr "Švédsky" -#: conf/global_settings.py:61 +#: conf/global_settings.py:66 +msgid "Tamil" +msgstr "Tamil" + +#: conf/global_settings.py:67 +msgid "Turkish" +msgstr "Turecky" + +#: conf/global_settings.py:68 msgid "Ukrainian" msgstr "Ukrajinsky" -#: conf/global_settings.py:62 +#: conf/global_settings.py:69 msgid "Simplified Chinese" msgstr "Jednoduchá čínština" -#: conf/global_settings.py:63 +#: conf/global_settings.py:70 msgid "Traditional Chinese" msgstr "Tradiční čínština" -#: core/validators.py:60 +#: core/validators.py:63 msgid "This value must contain only letters, numbers and underscores." msgstr "Tato hodnota musí obsahovat pouze znaky, čísla nebo podtržítka." -#: core/validators.py:64 +#: core/validators.py:67 msgid "This value must contain only letters, numbers, underscores, dashes or slashes." msgstr "Tato hodnota musí obsahovat pouze znaky, čísla, podtržítka, pomlčky nebo lomítka." -#: core/validators.py:72 +#: core/validators.py:71 +msgid "This value must contain only letters, numbers, underscores or hyphens." +msgstr "Tato hodnota musí obsahovat pouze znaky, čísla, podtržítka nebo čárky." + +#: core/validators.py:75 msgid "Uppercase letters are not allowed here." msgstr "Velká písmena zde nejsou povolená." -#: core/validators.py:76 +#: core/validators.py:79 msgid "Lowercase letters are not allowed here." msgstr "Malá písmena zde nejsou povolená." -#: core/validators.py:83 +#: core/validators.py:86 msgid "Enter only digits separated by commas." msgstr "Vložte pouze cifry oddělené čárkami." -#: core/validators.py:95 +#: core/validators.py:98 msgid "Enter valid e-mail addresses separated by commas." msgstr "Vložte platné e-mailové adresy oddělené čárkami." -#: core/validators.py:99 +#: core/validators.py:102 msgid "Please enter a valid IP address." msgstr "Prosíme, zadejte platnou IP adresu." -#: core/validators.py:103 +#: core/validators.py:106 msgid "Empty values are not allowed here." msgstr "Zde nejsou povolené prázdné hodnoty." -#: core/validators.py:107 +#: core/validators.py:110 msgid "Non-numeric characters aren't allowed here." msgstr "Znaky, které nejsou čísla, nejsou zde povoleny." -#: core/validators.py:111 +#: core/validators.py:114 msgid "This value can't be comprised solely of digits." msgstr "Tato hodnota nemůže být složená pouze z cifer." -#: core/validators.py:116 +#: core/validators.py:119 msgid "Enter a whole number." msgstr "Vložte celé číslo." -#: core/validators.py:120 +#: core/validators.py:123 msgid "Only alphabetical characters are allowed here." msgstr "Zde jsou povoleny pouze alfanumerické znaky." -#: core/validators.py:124 +#: core/validators.py:138 +msgid "Year must be 1900 or later." +msgstr "Rok musí být 1900 a vyšší." + +#: core/validators.py:142 +#, python-format +msgid "Invalid date: %s." +msgstr "Neplatné datum: %s." + +#: core/validators.py:146 +#: db/models/fields/__init__.py:415 msgid "Enter a valid date in YYYY-MM-DD format." msgstr "Vložte platné datum ve formátu RRRR-MM-DD." -#: core/validators.py:128 +#: core/validators.py:151 msgid "Enter a valid time in HH:MM format." msgstr "Vložte platný čas ve formátu HH:MM." -#: core/validators.py:132 -#: db/models/fields/__init__.py:468 +#: core/validators.py:155 +#: db/models/fields/__init__.py:477 msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format." msgstr "Vložte platné datum a čas ve formátu RRRR-MM-DD HH:MM." -#: core/validators.py:136 +#: core/validators.py:160 msgid "Enter a valid e-mail address." msgstr "Vložte platnou e-mailovou adresu." -#: core/validators.py:148 +#: core/validators.py:172 +#: core/validators.py:401 +#: forms/__init__.py:661 +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Soubor nebyl odeslán. Zkontrolujte encoding type formuláře." + +#: core/validators.py:176 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:155 +#: core/validators.py:183 #, python-format msgid "The URL %s does not point to a valid image." msgstr "URL %s neukazuje na platný obrázek." -#: core/validators.py:159 +#: core/validators.py:187 #, python-format msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid." msgstr "Telefonní čísla musí být ve formátu XXX-XXX-XXXX. \"%s\" není platné." -#: core/validators.py:167 +#: core/validators.py:195 #, python-format msgid "The URL %s does not point to a valid QuickTime video." msgstr "URL %s neodkazuje na platné video ve formátu QuickTime." -#: core/validators.py:171 +#: core/validators.py:199 msgid "A valid URL is required." msgstr "Je vyžadováno platné URL." -#: core/validators.py:185 +#: core/validators.py:213 #, python-format msgid "" "Valid HTML is required. Specific errors are:\n" @@ -1658,27 +1852,27 @@ msgstr "" "Je vyžadováno platné HTML. Konkrétní chyby jsou:\n" "%s" -#: core/validators.py:192 +#: core/validators.py:220 #, python-format msgid "Badly formed XML: %s" msgstr "Špatně formované XML: %s" -#: core/validators.py:202 +#: core/validators.py:230 #, python-format msgid "Invalid URL: %s" msgstr "Neplatné URL: %s" -#: core/validators.py:206 -#: core/validators.py:208 +#: core/validators.py:234 +#: core/validators.py:236 #, python-format msgid "The URL %s is a broken link." msgstr "Odkaz na URL %s je rozbitý." -#: core/validators.py:214 +#: core/validators.py:242 msgid "Enter a valid U.S. state abbreviation." msgstr "Vložte platnou zkraku U.S. státu." -#: core/validators.py:229 +#: core/validators.py:256 #, python-format msgid "Watch your mouth! The word %s is not allowed here." msgid_plural "Watch your mouth! The words %s are not allowed here." @@ -1686,44 +1880,44 @@ msgstr[0] "Mluvte slušně! Slovo %s zde není přípustné." msgstr[1] "Mluvte slušně! Slova %s zde nejsou přípustná." msgstr[2] "Mluvte slušně! Slova %s zde nejsou přípustná." -#: core/validators.py:236 +#: core/validators.py:263 #, python-format msgid "This field must match the '%s' field." msgstr "Toto pole se musí shodovat s polem '%s'." -#: core/validators.py:255 +#: core/validators.py:282 msgid "Please enter something for at least one field." msgstr "Prosíme, vložte něco alespoň pro jedno pole." -#: core/validators.py:264 -#: core/validators.py:275 +#: core/validators.py:291 +#: core/validators.py:302 msgid "Please enter both fields or leave them both empty." msgstr "Prosíme, vložte obě pole, nebo je nechte obě prázdná." -#: core/validators.py:282 +#: core/validators.py:309 #, python-format msgid "This field must be given if %(field)s is %(value)s" msgstr "Toto pole musí být vyplněno, když %(field)s má %(value)s" -#: core/validators.py:294 +#: core/validators.py:321 #, python-format msgid "This field must be given if %(field)s is not %(value)s" msgstr "Toto pole musí být vyplněno, když %(field)s nemá %(value)s" -#: core/validators.py:313 +#: core/validators.py:340 msgid "Duplicate values are not allowed." msgstr "Duplikátní hodnoty nejsou povolené." -#: core/validators.py:336 +#: core/validators.py:363 #, python-format msgid "This value must be a power of %s." msgstr "Tato hodnota musí být mocninou %s." -#: core/validators.py:347 +#: core/validators.py:374 msgid "Please enter a valid decimal number." msgstr "Prosíme, vložte platné číslo." -#: core/validators.py:349 +#: core/validators.py:378 #, 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." @@ -1731,7 +1925,15 @@ 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." -#: core/validators.py:352 +#: core/validators.py:381 +#, python-format +msgid "Please enter a valid decimal number with a whole part of at most %s digit." +msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits." +msgstr[0] "Prosíme, vložte platné číslo s nejvíce %s cifrou." +msgstr[1] "Prosíme, vložte platné číslo s nejvíce %s ciframi." +msgstr[2] "Prosíme, vložte platné číslo s nejvíce %s ciframi." + +#: core/validators.py:384 #, 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." @@ -1739,64 +1941,79 @@ msgstr[0] "Prosíme, vložte platné číslo s nejvíce %s cifrou za desetinnou 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:362 +#: core/validators.py:394 #, python-format msgid "Make sure your uploaded file is at least %s bytes big." msgstr "Ujistěte se, že posílaný soubor je velký nejméně %s bytů." -#: core/validators.py:363 +#: core/validators.py:395 #, python-format msgid "Make sure your uploaded file is at most %s bytes big." msgstr "Ujistěte se, že posílaný soubor je velký nejvíce %s bytů." -#: core/validators.py:376 +#: core/validators.py:412 msgid "The format for this field is wrong." msgstr "Formát pro toto pole je špatný." -#: core/validators.py:391 +#: core/validators.py:427 msgid "This field is invalid." msgstr "Toto pole není platné." -#: core/validators.py:426 +#: core/validators.py:463 #, python-format msgid "Could not retrieve anything from %s." msgstr "Nemohl jsem získat nic z %s." -#: core/validators.py:429 +#: core/validators.py:466 #, python-format 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:462 +#: core/validators.py:499 #, 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\".)" -#: core/validators.py:466 +#: core/validators.py:503 #, 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\".)" -#: core/validators.py:471 +#: core/validators.py:508 #, 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\".)" -#: core/validators.py:476 +#: core/validators.py:513 #, 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\".)" -#: core/validators.py:480 +#: core/validators.py:517 #, 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\".)" -#: core/validators.py:485 +#: core/validators.py:522 #, 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\".)" +#: views/generic/create_update.py:43 +#, python-format +msgid "The %(verbose_name)s was created successfully." +msgstr "Záznam %(verbose_name)s byl úspěšně vytvořen." + +#: views/generic/create_update.py:117 +#, python-format +msgid "The %(verbose_name)s was updated successfully." +msgstr "Záznam %(verbose_name)s byl úspěšně změnen." + +#: views/generic/create_update.py:184 +#, python-format +msgid "The %(verbose_name)s was deleted." +msgstr "Záznam %(verbose_name)s byl smazán." + #: db/models/manipulators.py:302 #, python-format msgid "%(object)s with this %(type)s already exists for the given %(field)s." @@ -1809,42 +2026,42 @@ msgstr "%(optname)s s tímto %(fieldname)s již 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 +#: db/models/fields/__init__.py:551 +#: db/models/fields/__init__.py:562 #: forms/__init__.py:346 msgid "This field is required." msgstr "Toto pole je povinné." -#: db/models/fields/__init__.py:337 +#: db/models/fields/__init__.py:340 msgid "This value must be an integer." msgstr "Tato hodnota musí být celé číslo." -#: db/models/fields/__init__.py:369 +#: db/models/fields/__init__.py:372 msgid "This value must be either True or False." msgstr "Tato hodnota musí být buď Ano (True), nebo Ne (False)." -#: db/models/fields/__init__.py:385 +#: db/models/fields/__init__.py:388 msgid "This field cannot be null." msgstr "Toto pole nemůže být prázdné (null)." -#: db/models/fields/__init__.py:562 +#: db/models/fields/__init__.py:571 msgid "Enter a valid filename." msgstr "Vložte platný název souboru." -#: db/models/fields/related.py:43 +#: db/models/fields/related.py:51 #, python-format msgid "Please enter a valid %s." msgstr "Prosíme, zadejte %s správně." -#: db/models/fields/related.py:579 +#: db/models/fields/related.py:618 msgid "Separate multiple IDs with commas." msgstr "Oddělte více identifikátorů čárkami." -#: db/models/fields/related.py:581 +#: db/models/fields/related.py:620 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." -#: db/models/fields/related.py:625 +#: db/models/fields/related.py:664 #, 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." @@ -1852,7 +2069,7 @@ msgstr[0] "Prosíme, vložte platná %(self)s ID. Hodnota %(value)r není platn msgstr[1] "Prosíme, vložte platná %(self)s ID. Hodnoty %(value)r nejsou platné." msgstr[2] "Prosíme, vložte platná %(self)s ID. Hodnoty %(value)r nejsou platné." -#: forms/__init__.py:380 +#: 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." @@ -1860,59 +2077,34 @@ msgstr[0] "Ujistěte se, že Váš text má méně než %s znak." msgstr[1] "Ujistěte se, že Váš text má méně než %s znaky." msgstr[2] "Ujistěte se, že Váš text má méně než %s znaků." -#: forms/__init__.py:385 +#: forms/__init__.py:386 msgid "Line breaks are not allowed here." msgstr "Zalomení řádky zde nenjsou povolená." -#: forms/__init__.py:480 -#: forms/__init__.py:551 -#: forms/__init__.py:589 +#: forms/__init__.py:487 +#: forms/__init__.py:560 +#: forms/__init__.py:599 #, python-format msgid "Select a valid choice; '%(data)s' is not in %(choices)s." msgstr "Vyberte platnou volbu. '%(data)s' není mezi %(choices)s." -#: forms/__init__.py:645 +#: forms/__init__.py:663 msgid "The submitted file is empty." msgstr "Odevzdaný soubor je prázdný." -#: forms/__init__.py:699 +#: forms/__init__.py:719 msgid "Enter a whole number between -32,768 and 32,767." msgstr "Vložte celé číslo mezi -32,768 a 32,767." -#: forms/__init__.py:708 +#: forms/__init__.py:729 msgid "Enter a positive number." msgstr "Vložte celé kladné číslo." -#: forms/__init__.py:717 +#: forms/__init__.py:739 msgid "Enter a whole number between 0 and 32,767." msgstr "Vložte celé číslo mezi 0 a 32,767." -#: template/defaultfilters.py:379 +#: template/defaultfilters.py:401 msgid "yes,no,maybe" msgstr "ano, ne, možná" -#~ msgid "Comment" -#~ msgstr "Komentář" -#~ msgid "Comments" -#~ msgstr "Komentáře" -#~ msgid "String (up to 50)" -#~ msgstr "Text (max. 50 znaků)" -#~ msgid "label" -#~ msgstr "nadpis" -#~ msgid "package" -#~ msgstr "balík" -#~ msgid "packages" -#~ msgstr "balíky" -#~ msgid "Error in Template" -#~ msgstr "Chyba v šabloně" -#~ msgid "" -#~ "\n" -#~ "In template %(name)s, error at line %(line)s:\n" -#~ msgstr "" -#~ "\n" -#~ "V šabloně %(name)s, chyba na řádce %(line)s:\n" - -#, fuzzy -#~ msgid "count" -#~ msgstr "počet" - diff --git a/django/conf/locale/ja/LC_MESSAGES/django.mo b/django/conf/locale/ja/LC_MESSAGES/django.mo index 34b80e976e629cdd608072980bed03772193c4ae..17f6f6b4c897175b13469ca3fc8aebf933ddcd90 100644 GIT binary patch delta 11767 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 L&uh^$k*@y>m8{CU delta 9338 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 diff --git a/django/conf/locale/ja/LC_MESSAGES/django.po b/django/conf/locale/ja/LC_MESSAGES/django.po index dbc3de5f53..c4be20bbaa 100644 --- a/django/conf/locale/ja/LC_MESSAGES/django.po +++ b/django/conf/locale/ja/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Django 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2006-05-18 00:21+0900\n" +"POT-Creation-Date: 2006-10-05 23:35+0900\n" "PO-Revision-Date: 2006-05-18 00:28+0900\n" "Last-Translator: makoto tsuyuki \n" "Language-Team: Japanese \n" @@ -16,113 +16,134 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: conf/global_settings.py:37 +#: conf/global_settings.py:39 +msgid "Arabic" +msgstr "アラビア語" + +#: conf/global_settings.py:40 msgid "Bengali" msgstr "ベンガル語" -#: conf/global_settings.py:38 +#: conf/global_settings.py:41 msgid "Czech" msgstr "チェコ語" -#: conf/global_settings.py:39 +#: conf/global_settings.py:42 msgid "Welsh" msgstr "ウェールズ語" -#: conf/global_settings.py:40 +#: conf/global_settings.py:43 msgid "Danish" msgstr "デンマーク語" -#: conf/global_settings.py:41 +#: conf/global_settings.py:44 msgid "German" msgstr "ドイツ語" -#: conf/global_settings.py:42 +#: conf/global_settings.py:45 msgid "Greek" msgstr "ギリシャ語" -#: conf/global_settings.py:43 +#: conf/global_settings.py:46 msgid "English" msgstr "英語" -#: conf/global_settings.py:44 +#: conf/global_settings.py:47 msgid "Spanish" msgstr "スペイン語" -#: conf/global_settings.py:45 +#: conf/global_settings.py:48 +msgid "Argentinean Spanish" +msgstr "アルゼンチンスペイン語" + +#: conf/global_settings.py:49 +#, fuzzy +msgid "Finnish" +msgstr "デンマーク語" + +#: conf/global_settings.py:50 msgid "French" msgstr "フランス語" -#: conf/global_settings.py:46 +#: conf/global_settings.py:51 msgid "Galician" msgstr "ガリシア語" -#: conf/global_settings.py:47 +#: conf/global_settings.py:52 msgid "Hungarian" msgstr "ハンガリー語" -#: conf/global_settings.py:48 +#: conf/global_settings.py:53 msgid "Hebrew" msgstr "ヘブライ語" -#: conf/global_settings.py:49 +#: conf/global_settings.py:54 msgid "Icelandic" msgstr "アイスランド語" -#: conf/global_settings.py:50 +#: conf/global_settings.py:55 msgid "Italian" msgstr "イタリア語" -#: conf/global_settings.py:51 +#: conf/global_settings.py:56 msgid "Japanese" msgstr "日本語" -#: conf/global_settings.py:52 +#: conf/global_settings.py:57 msgid "Dutch" msgstr "オランダ語" -#: conf/global_settings.py:53 +#: conf/global_settings.py:58 msgid "Norwegian" msgstr "ノルウェー語" -#: conf/global_settings.py:54 +#: conf/global_settings.py:59 msgid "Brazilian" msgstr "ブラジル語" -#: conf/global_settings.py:55 +#: conf/global_settings.py:60 msgid "Romanian" msgstr "ルーマニア語" -#: conf/global_settings.py:56 +#: conf/global_settings.py:61 msgid "Russian" msgstr "ロシア語" -#: conf/global_settings.py:57 +#: conf/global_settings.py:62 msgid "Slovak" msgstr "スロバキア語" -#: conf/global_settings.py:58 +#: conf/global_settings.py:63 #, fuzzy msgid "Slovenian" msgstr "スロヴェニア語" -#: conf/global_settings.py:59 +#: conf/global_settings.py:64 msgid "Serbian" msgstr "セルビア語" -#: conf/global_settings.py:60 +#: conf/global_settings.py:65 msgid "Swedish" msgstr "スウェーデン語" -#: conf/global_settings.py:61 +#: conf/global_settings.py:66 +msgid "Tamil" +msgstr "タミル語" + +#: conf/global_settings.py:67 +msgid "Turkish" +msgstr "トルコ語" + +#: conf/global_settings.py:68 #, fuzzy msgid "Ukrainian" msgstr "ウクライナ語" -#: conf/global_settings.py:62 +#: conf/global_settings.py:69 msgid "Simplified Chinese" msgstr "簡体字中国語" -#: conf/global_settings.py:63 +#: conf/global_settings.py:70 msgid "Traditional Chinese" msgstr "繁体字中国語" @@ -136,7 +157,7 @@ msgstr "" "
    \n" #: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88 -#: contrib/admin/filterspecs.py:143 +#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169 msgid "All" msgstr "全て" @@ -210,10 +231,11 @@ msgid "We're sorry, but the requested page could not be found." msgstr "申し訳ありませんが、お探しのページは見つかりませんでした。" #: contrib/admin/templates/admin/500.html:4 -#: contrib/admin/templates/admin/base.html:28 +#: contrib/admin/templates/admin/base.html:30 #: contrib/admin/templates/admin/change_form.html:13 #: contrib/admin/templates/admin/change_list.html:6 #: contrib/admin/templates/admin/delete_confirmation.html:6 +#: contrib/admin/templates/admin/invalid_setup.html:4 #: contrib/admin/templates/admin/object_history.html:5 #: contrib/admin/templates/admin_doc/bookmarklets.html:3 #: contrib/admin/templates/registration/logged_out.html:4 @@ -244,11 +266,11 @@ msgstr "" "エラーが発生しました。エラーをサイトの管理者にメールで報告しましたので、近い" "うちに修正されるはずです。しばらくお待ちください。" -#: contrib/admin/templates/admin/base.html:23 +#: contrib/admin/templates/admin/base.html:25 msgid "Welcome," msgstr "ようこそ" -#: contrib/admin/templates/admin/base.html:23 +#: contrib/admin/templates/admin/base.html:25 #: contrib/admin/templates/admin/change_form.html:10 #: contrib/admin/templates/admin/change_list.html:5 #: contrib/admin/templates/admin/delete_confirmation.html:3 @@ -259,7 +281,7 @@ msgstr "ようこそ" msgid "Documentation" msgstr "ドキュメント" -#: contrib/admin/templates/admin/base.html:23 +#: contrib/admin/templates/admin/base.html:25 #: contrib/admin/templates/admin/change_form.html:10 #: contrib/admin/templates/admin/change_list.html:5 #: contrib/admin/templates/admin/delete_confirmation.html:3 @@ -279,7 +301,7 @@ msgstr "ドキュメント" msgid "Change password" msgstr "パスワードの変更" -#: contrib/admin/templates/admin/base.html:23 +#: contrib/admin/templates/admin/base.html:25 #: contrib/admin/templates/admin/change_form.html:10 #: contrib/admin/templates/admin/change_list.html:5 #: contrib/admin/templates/admin/delete_confirmation.html:3 @@ -296,7 +318,7 @@ msgstr "パスワードの変更" #: contrib/admin/templates/admin_doc/view_index.html:5 #: contrib/admin/templates/registration/password_change_done.html:3 #: contrib/admin/templates/registration/password_change_form.html:3 -#: contrib/comments/templates/comments/form.html:8 +#: contrib/comments/templates/comments/form.html:6 msgid "Log out" msgstr "ログアウト" @@ -306,7 +328,7 @@ msgstr "Django サイト管理" #: contrib/admin/templates/admin/base_site.html:7 msgid "Django administration" -msgstr "Django の管理" +msgstr "Django 管理サイト" #: contrib/admin/templates/admin/change_form.html:15 #: contrib/admin/templates/admin/index.html:28 @@ -347,21 +369,21 @@ msgid "Delete" msgstr "削除" #: contrib/admin/templates/admin/delete_confirmation.html:14 -#, python-format +#, 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:" +"Deleting the %(object_name)s '%(escaped_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 +#, fuzzy, 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:" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" msgstr "" "%(object_name)s \"%(object)s\"を削除しますか? 関連づけられている以下のオブ" "ジェクトも全て削除されます:" @@ -371,15 +393,24 @@ msgid "Yes, I'm sure" msgstr "はい。" #: contrib/admin/templates/admin/filter.html:2 -#, python-format -msgid " By %(title)s " +#, fuzzy, python-format +msgid " By %(filter_title)s " msgstr "%(title)s で絞り込む" +#: contrib/admin/templates/admin/filters.html:4 +msgid "Filter" +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:18 +#, fuzzy, python-format +msgid "%(name)s" +msgstr "%(name)s を追加" + #: contrib/admin/templates/admin/index.html:34 msgid "Change" msgstr "変更" @@ -400,6 +431,15 @@ msgstr "操作" msgid "None available" 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/login.html:17 #: contrib/comments/templates/comments/form.html:6 #: contrib/comments/templates/comments/form.html:8 @@ -407,7 +447,7 @@ msgid "Username:" msgstr "ユーザ名:" #: contrib/admin/templates/admin/login.html:20 -#: contrib/comments/templates/comments/form.html:6 +#: contrib/comments/templates/comments/form.html:8 msgid "Password:" msgstr "パスワード:" @@ -416,7 +456,7 @@ msgid "Have you forgotten your password?" msgstr "パスワードをお忘れですか?" #: contrib/admin/templates/admin/login.html:25 -#: contrib/admin/views/decorators.py:23 +#: contrib/admin/views/decorators.py:24 msgid "Log in" msgstr "ログイン" @@ -444,10 +484,26 @@ msgstr "" "このオブジェクトには変更履歴がありません。おそらくこの管理サイトで追加したも" "のではありません。" +#: contrib/admin/templates/admin/pagination.html:10 +msgid "Show all" +msgstr "全件表示" + #: contrib/admin/templates/admin/search_form.html:8 msgid "Go" msgstr "検索" +#: contrib/admin/templates/admin/search_form.html:10 +#, python-format +msgid "1 result" +msgid_plural "%(counter)s results" +msgstr[0] "1 件" +msgstr[1] "%(counter)s 件" + +#: 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/submit_line.html:4 msgid "Save as new" msgstr "新規保存" @@ -464,6 +520,33 @@ msgstr "保存して編集を続ける" msgid "Save" msgstr "保存" +#: contrib/admin/templates/admin/auth/user/add_form.html:6 +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"まずユーザ名とパスワードを登録してください。" +"その後詳細情報が編集可能になります。" + +#: contrib/admin/templates/admin/auth/user/add_form.html:12 +#, fuzzy +msgid "Username" +msgstr "ユーザ名:" + +#: contrib/admin/templates/admin/auth/user/add_form.html:18 +#, fuzzy +msgid "Password" +msgstr "パスワード:" + +#: contrib/admin/templates/admin/auth/user/add_form.html:23 +#, fuzzy +msgid "Password (again)" +msgstr "パスワードの変更" + +#: contrib/admin/templates/admin/auth/user/add_form.html:24 +msgid "Enter the same password as above, for verification." +msgstr "確認のため、再度パスワードを入力してください。" + #: contrib/admin/templates/admin_doc/bookmarklets.html:3 msgid "Bookmarklets" msgstr "ブックマークレット" @@ -572,7 +655,7 @@ msgstr "新しいパスワード:" #: contrib/admin/templates/registration/password_change_form.html:21 msgid "Confirm password:" -msgstr "新しいパスワード (もう一度) :" +msgstr "新しいパスワード (確認用) :" #: contrib/admin/templates/registration/password_change_form.html:23 msgid "Change my password" @@ -663,19 +746,33 @@ msgstr "現在:" msgid "Change:" 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 +#: contrib/admin/views/auth.py:17 contrib/admin/views/main.py:257 +#, python-format +msgid "The %(name)s \"%(obj)s\" was added successfully." +msgstr "%(name)s \"%(obj)s\" を追加しました。" + +#: contrib/admin/views/auth.py:22 contrib/admin/views/main.py:261 +#: contrib/admin/views/main.py:347 +msgid "You may edit it again below." +msgstr "続けて編集できます。" + +#: contrib/admin/views/auth.py:28 +#, fuzzy +msgid "Add user" +msgstr "%s を追加" + +#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:59 msgid "" "Please enter a correct username and password. Note that both fields are case-" "sensitive." msgstr "" "正しいユーザ名とパスワードを入力してください (大文字小文字は区別します) 。" -#: contrib/admin/views/decorators.py:61 +#: contrib/admin/views/decorators.py:62 msgid "" "Please log in again, because your session has expired. Don't worry: Your " "submission has been saved." @@ -683,7 +780,7 @@ msgstr "" "再ログインしてください。ログインセッションが有効期間切れしてしまいました。入" "力データは失われておりませんのでご安心ください。" -#: contrib/admin/views/decorators.py:68 +#: contrib/admin/views/decorators.py:69 msgid "" "Looks like your browser isn't configured to accept cookies. Please enable " "cookies, reload this page, and try again." @@ -691,188 +788,253 @@ msgstr "" "ブラウザがクッキーの使用を許可していないようです。クッキーの使用を許可して、" "もう一度このページを表示してください。" -#: contrib/admin/views/decorators.py:82 +#: contrib/admin/views/decorators.py:83 msgid "Usernames cannot contain the '@' character." msgstr "ユーザ名には '@' を含められません。" -#: contrib/admin/views/decorators.py:84 +#: contrib/admin/views/decorators.py:85 #, python-format msgid "Your e-mail address is not your username. Try '%s' instead." msgstr "メールアドレスはユーザ名ではありません。 '%s' を試してみてください。" -#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286 -#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294 -#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297 +#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48 +#: contrib/admin/views/doc.py:50 +msgid "tag:" +msgstr "タグ" + +#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79 +#: contrib/admin/views/doc.py:81 +msgid "filter:" +msgstr "フィルタ" + +#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137 +#: contrib/admin/views/doc.py:139 +msgid "view:" +msgstr "ビュー" + +#: contrib/admin/views/doc.py:164 +#, fuzzy, python-format +msgid "App %r not found" +msgstr "ページが見つかりません" + +#: contrib/admin/views/doc.py:171 +#, python-format +msgid "Model %r not found in app %r" +msgstr "モデル %r が %r アプリケーションに見つかりません" + +#: contrib/admin/views/doc.py:183 +#, python-format +msgid "the related `%s.%s` object" +msgstr "`%s.%s` (関連オブジェクト)" + +#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205 +#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224 +msgid "model:" +msgstr "モデル :" + +#: contrib/admin/views/doc.py:214 +#, python-format +msgid "related `%s.%s` objects" +msgstr "`%s.%s` (関連オブジェクト)" + +#: contrib/admin/views/doc.py:219 +#, python-format +msgid "all %s" +msgstr "全ての %s" + +#: contrib/admin/views/doc.py:224 +#, python-format +msgid "number of %s" +msgstr "%s の数" + +#: contrib/admin/views/doc.py:229 +#, python-format +msgid "Fields on %s objects" +msgstr "%s のフィールド" + +#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301 +#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309 +#: contrib/admin/views/doc.py:310 contrib/admin/views/doc.py:312 msgid "Integer" msgstr "整数" -#: contrib/admin/views/doc.py:278 +#: contrib/admin/views/doc.py:292 msgid "Boolean (Either True or False)" msgstr "ブール値 (真: True または偽: False)" -#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296 +#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311 #, python-format msgid "String (up to %(maxlength)s)" msgstr "文字列 ( %(maxlength)s 字まで )" -#: contrib/admin/views/doc.py:280 +#: contrib/admin/views/doc.py:294 msgid "Comma-separated integers" msgstr "カンマ区切りの整数" -#: contrib/admin/views/doc.py:281 +#: contrib/admin/views/doc.py:295 msgid "Date (without time)" msgstr "日付" -#: contrib/admin/views/doc.py:282 +#: contrib/admin/views/doc.py:296 msgid "Date (with time)" msgstr "日時" -#: contrib/admin/views/doc.py:283 +#: contrib/admin/views/doc.py:297 msgid "E-mail address" msgstr "メールアドレス" -#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287 +#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299 +#: contrib/admin/views/doc.py:302 msgid "File path" msgstr "ファイルの場所" -#: contrib/admin/views/doc.py:285 +#: contrib/admin/views/doc.py:300 msgid "Decimal number" msgstr "10 進数 (小数可)" -#: contrib/admin/views/doc.py:289 contrib/comments/models.py:85 +#: contrib/admin/views/doc.py:304 contrib/comments/models.py:85 msgid "IP address" msgstr "IP アドレス" -#: contrib/admin/views/doc.py:291 +#: contrib/admin/views/doc.py:306 msgid "Boolean (Either True, False or None)" msgstr "ブール値 (真: True 、偽: False または None)" -#: contrib/admin/views/doc.py:292 +#: contrib/admin/views/doc.py:307 msgid "Relation to parent model" msgstr "親モデルへのリレーション" -#: contrib/admin/views/doc.py:293 +#: contrib/admin/views/doc.py:308 msgid "Phone number" msgstr "電話番号" -#: contrib/admin/views/doc.py:298 +#: contrib/admin/views/doc.py:313 msgid "Text" msgstr "テキスト" -#: contrib/admin/views/doc.py:299 +#: contrib/admin/views/doc.py:314 msgid "Time" msgstr "時刻" -#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7 +#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7 msgid "URL" msgstr "URL" -#: contrib/admin/views/doc.py:301 +#: contrib/admin/views/doc.py:316 msgid "U.S. state (two uppercase letters)" msgstr "アメリカの州 (大文字二文字で)" -#: contrib/admin/views/doc.py:302 +#: contrib/admin/views/doc.py:317 msgid "XML text" msgstr "XMLテキスト" -#: contrib/admin/views/main.py:226 +#: contrib/admin/views/doc.py:343 +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s はurlpatternオブジェクトでは無いようです" + +#: contrib/admin/views/main.py:223 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/views/main.py:272 contrib/admin/views/main.py:357 +#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356 #, python-format msgid "You may add another %s below." msgstr "続けて別の %s を追加できます。" -#: contrib/admin/views/main.py:290 +#: contrib/admin/views/main.py:289 #, python-format msgid "Add %s" msgstr "%s を追加" -#: contrib/admin/views/main.py:336 +#: contrib/admin/views/main.py:335 #, python-format msgid "Added %s." msgstr "%s を追加しました。" -#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338 -#: contrib/admin/views/main.py:340 +#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337 +#: contrib/admin/views/main.py:339 msgid "and" msgstr "と" -#: contrib/admin/views/main.py:338 +#: contrib/admin/views/main.py:337 #, python-format msgid "Changed %s." msgstr "%s を変更しました。" -#: contrib/admin/views/main.py:340 +#: contrib/admin/views/main.py:339 #, python-format msgid "Deleted %s." msgstr "%s を削除しました。" -#: contrib/admin/views/main.py:343 +#: contrib/admin/views/main.py:342 msgid "No fields changed." msgstr "変更はありませんでした。" -#: contrib/admin/views/main.py:346 +#: contrib/admin/views/main.py:345 #, python-format msgid "The %(name)s \"%(obj)s\" was changed successfully." msgstr "%(name)s \"%(obj)s\" を変更しました。" -#: contrib/admin/views/main.py:354 +#: contrib/admin/views/main.py:353 #, python-format msgid "" "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." msgstr "%(name)s \"%(obj)s\" を追加しました。続けて編集できます。" -#: contrib/admin/views/main.py:392 +#: contrib/admin/views/main.py:391 #, python-format msgid "Change %s" msgstr "%s を変更" -#: contrib/admin/views/main.py:470 +#: contrib/admin/views/main.py:473 #, python-format msgid "One or more %(fieldname)s in %(name)s: %(obj)s" msgstr "%(name)s に %(fieldname)s が一つ以上あります: %(obj)s" -#: contrib/admin/views/main.py:475 +#: contrib/admin/views/main.py:478 #, python-format msgid "One or more %(fieldname)s in %(name)s:" msgstr "%(name)s に %(fieldname)s が一つ以上あります:" -#: contrib/admin/views/main.py:508 +#: contrib/admin/views/main.py:511 #, python-format msgid "The %(name)s \"%(obj)s\" was deleted successfully." msgstr "%(name)s \"%(obj)s\" を削除しました。" -#: contrib/admin/views/main.py:511 +#: contrib/admin/views/main.py:514 msgid "Are you sure?" msgstr "よろしいですか?" -#: contrib/admin/views/main.py:533 +#: contrib/admin/views/main.py:536 #, python-format msgid "Change history: %s" msgstr "変更履歴: %s" -#: contrib/admin/views/main.py:565 +#: contrib/admin/views/main.py:570 #, python-format msgid "Select %s" msgstr "%s を選択" -#: contrib/admin/views/main.py:565 +#: contrib/admin/views/main.py:570 #, python-format msgid "Select %s to change" msgstr "変更する %s を選択" -#: contrib/auth/forms.py:30 +#: contrib/admin/views/main.py:758 +msgid "Database error" +msgstr "データベースエラー" + +#: contrib/auth/forms.py:16 +msgid "The two password fields didn't match." +msgstr "確認用パスワードが一致しません。" + +#: contrib/auth/forms.py:24 +#, fuzzy +msgid "A user with that username already exists." +msgstr "%(fieldname)s に %(optname)s は既に存在します。" + +#: contrib/auth/forms.py:52 msgid "" "Your Web browser doesn't appear to have cookies enabled. Cookies are " "required for logging in." @@ -880,83 +1042,125 @@ msgstr "" "お使いのブラウザはクッキーを有効にしていないようです。ログインにはクッキーが" "必要です。" -#: contrib/auth/models.py:13 contrib/auth/models.py:26 +#: contrib/auth/forms.py:61 +msgid "This account is inactive." +msgstr "アカウントが無効です。" + +#: contrib/auth/forms.py:84 +msgid "" +"That e-mail address doesn't have an associated user acount. Are you sure " +"you've registered?" +msgstr "" +"メールアドレスの一致するユーザはいません。" +"本当に登録しましたか?" + +#: contrib/auth/forms.py:116 +msgid "The two 'new password' fields didn't match." +msgstr "新しいパスワード(確認用)が一致しません。" + +#: contrib/auth/forms.py:123 +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "元のパスワードが間違っています。もう一度入力してください。" + +#: contrib/auth/models.py:38 contrib/auth/models.py:57 msgid "name" msgstr "名前" -#: contrib/auth/models.py:15 +#: contrib/auth/models.py:40 msgid "codename" msgstr "コード名" -#: contrib/auth/models.py:17 +#: contrib/auth/models.py:42 #, fuzzy msgid "permission" msgstr "パーミッション" -#: contrib/auth/models.py:18 contrib/auth/models.py:27 +#: contrib/auth/models.py:43 contrib/auth/models.py:58 #, fuzzy msgid "permissions" msgstr "パーミッション" -#: contrib/auth/models.py:29 +#: contrib/auth/models.py:60 #, fuzzy msgid "group" msgstr "グループ" -#: contrib/auth/models.py:30 contrib/auth/models.py:65 +#: contrib/auth/models.py:61 contrib/auth/models.py:100 #, fuzzy msgid "groups" msgstr "グループ" -#: contrib/auth/models.py:55 +#: contrib/auth/models.py:90 msgid "username" msgstr "ユーザ名" -#: contrib/auth/models.py:56 +#: contrib/auth/models.py:90 +msgid "" +"Required. 30 characters or fewer. Alphanumeric characters only (letters, " +"digits and underscores)." +msgstr "" +"この項目は必須です。" +"半角アルファベット、半角数字、半角アンダーバーで30文字以下にしてください。" + +#: contrib/auth/models.py:91 msgid "first name" msgstr "名" -#: contrib/auth/models.py:57 +#: contrib/auth/models.py:92 msgid "last name" msgstr "姓" -#: contrib/auth/models.py:58 +#: contrib/auth/models.py:93 msgid "e-mail address" msgstr "メールアドレス" -#: contrib/auth/models.py:59 +#: contrib/auth/models.py:94 msgid "password" msgstr "パスワード" -#: contrib/auth/models.py:59 +#: contrib/auth/models.py:94 msgid "Use '[algo]$[salt]$[hexdigest]'" msgstr "'[アルゴリズム]$[ソルト]$[ダイジェスト(hex)]' 形式を使って下さい" -#: contrib/auth/models.py:60 +#: contrib/auth/models.py:95 msgid "staff status" msgstr "スタッフ権限" -#: contrib/auth/models.py:60 +#: contrib/auth/models.py:95 msgid "Designates whether the user can log into this admin site." msgstr "ユーザが管理サイトにログイン可能かどうかを示します。" -#: contrib/auth/models.py:61 +#: contrib/auth/models.py:96 msgid "active" msgstr "有効" -#: contrib/auth/models.py:62 +#: contrib/auth/models.py:96 +msgid "" +"Designates whether this user can log into the Django admin. Unselect this " +"instead of deleting accounts." +msgstr "" +"ユーザが管理サイトにログイン可能か" +"どうかを示します。" + +#: contrib/auth/models.py:97 msgid "superuser status" msgstr "スーパーユーザ権限" -#: contrib/auth/models.py:63 +#: contrib/auth/models.py:97 +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "全ての権限を持っているとみなされます。" + +#: contrib/auth/models.py:98 msgid "last login" msgstr "最終ログイン" -#: contrib/auth/models.py:64 +#: contrib/auth/models.py:99 msgid "date joined" msgstr "登録日" -#: contrib/auth/models.py:66 +#: contrib/auth/models.py:101 msgid "" "In addition to the permissions manually assigned, this user will also get " "all permissions granted to each group he/she is in." @@ -964,42 +1168,48 @@ msgstr "" "手動で付与したパーミッションに加え、所属しているグループに付与された全ての" "パーミッションを獲得します。" -#: contrib/auth/models.py:67 +#: contrib/auth/models.py:102 #, fuzzy msgid "user permissions" msgstr "ユーザパーミッション" -#: contrib/auth/models.py:70 +#: contrib/auth/models.py:105 #, fuzzy msgid "user" msgstr "ユーザ" -#: contrib/auth/models.py:71 +#: contrib/auth/models.py:106 #, fuzzy msgid "users" msgstr "ユーザ" -#: contrib/auth/models.py:76 +#: contrib/auth/models.py:111 msgid "Personal info" msgstr "個人情報" -#: contrib/auth/models.py:77 +#: contrib/auth/models.py:112 +#, fuzzy msgid "Permissions" msgstr "パーミッション" -#: contrib/auth/models.py:78 +#: contrib/auth/models.py:113 msgid "Important dates" msgstr "重要な日程" -#: contrib/auth/models.py:79 +#: contrib/auth/models.py:114 msgid "Groups" msgstr "グループ" -#: contrib/auth/models.py:219 +#: contrib/auth/models.py:258 #, fuzzy msgid "message" msgstr "メッセージ" +#: contrib/auth/views.py:39 +#, fuzzy +msgid "Logged out" +msgstr "ログアウト" + #: contrib/comments/models.py:67 contrib/comments/models.py:166 msgid "object ID" msgstr "オブジェクト ID" @@ -1187,7 +1397,7 @@ msgstr "モデレータ削除" msgid "Moderator deletion by %r" msgstr "%r によるモデレータ削除" -#: contrib/comments/templates/comments/form.html:6 +#: contrib/comments/templates/comments/form.html:8 #, fuzzy msgid "Forgotten your password?" msgstr "パスワードをお忘れですか?" @@ -1211,14 +1421,14 @@ msgstr "オプション" msgid "Post a photo" msgstr "写真を登録" -#: contrib/comments/templates/comments/form.html:27 +#: contrib/comments/templates/comments/form.html:28 #: contrib/comments/templates/comments/freeform.html:5 #, fuzzy msgid "Comment:" msgstr "コメント:" -#: contrib/comments/templates/comments/form.html:32 -#: contrib/comments/templates/comments/freeform.html:9 +#: contrib/comments/templates/comments/form.html:35 +#: contrib/comments/templates/comments/freeform.html:10 #, fuzzy msgid "Preview comment" msgstr "コメントをプレビュー" @@ -1228,13 +1438,13 @@ msgstr "コメントをプレビュー" msgid "Your name:" msgstr "ユーザ名:" -#: contrib/comments/views/comments.py:28 +#: contrib/comments/views/comments.py:27 msgid "" "This rating is required because you've entered at least one other rating." msgstr "" "他のレーティングを入力した場合は、このレーティングは必ず入力してください。" -#: contrib/comments/views/comments.py:112 +#: contrib/comments/views/comments.py:111 #, python-format msgid "" "This comment was posted by a user who has posted fewer than %(count)s " @@ -1249,7 +1459,7 @@ msgid_plural "" msgstr[0] "このコメントを投稿したユーザのコメント数は %(count)s 未満です。" msgstr[1] "このコメントを投稿したユーザのコメント数は %(count)s 未満です。" -#: contrib/comments/views/comments.py:117 +#: contrib/comments/views/comments.py:116 #, python-format msgid "" "This comment was posted by a sketchy user:\n" @@ -1260,22 +1470,22 @@ msgstr "" "\n" "%(text)s" -#: contrib/comments/views/comments.py:189 +#: contrib/comments/views/comments.py:188 #: contrib/comments/views/comments.py:280 msgid "Only POSTs are allowed" msgstr "POST メソッドのみ有効です。" -#: contrib/comments/views/comments.py:193 +#: contrib/comments/views/comments.py:192 #: contrib/comments/views/comments.py:284 msgid "One or more of the required fields wasn't submitted" msgstr "必須項目がいくつか入力されていません。" -#: contrib/comments/views/comments.py:197 +#: contrib/comments/views/comments.py:196 #: contrib/comments/views/comments.py:286 msgid "Somebody tampered with the comment form (security violation)" msgstr "だれかがコメントフォームを改竄しています (セキュリティ侵害です)" -#: contrib/comments/views/comments.py:207 +#: contrib/comments/views/comments.py:206 #: contrib/comments/views/comments.py:292 msgid "" "The comment form had an invalid 'target' parameter -- the object ID was " @@ -1301,16 +1511,16 @@ msgstr "コメント ID が不正です" msgid "No voting for yourself" msgstr "自分には投票できません。" -#: contrib/contenttypes/models.py:25 +#: contrib/contenttypes/models.py:20 #, fuzzy msgid "python model class name" msgstr "Python モデルクラス名" -#: contrib/contenttypes/models.py:28 +#: contrib/contenttypes/models.py:23 msgid "content type" msgstr "コンテンツタイプ" -#: contrib/contenttypes/models.py:29 +#: contrib/contenttypes/models.py:24 msgid "content types" msgstr "コンテンツタイプ" @@ -1337,9 +1547,10 @@ msgid "template name" msgstr "テンプレート名" #: contrib/flatpages/models.py:13 +#, fuzzy msgid "" -"Example: 'flatpages/contact_page'. If this isn't provided, the system will " -"use 'flatpages/default'." +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." msgstr "" "例: 'flatpages/contact_page'. 指定しなければ、デフォルト設定の'flatpages/" "default' を使います。" @@ -1380,31 +1591,31 @@ msgid "" "'http://'." msgstr "上記のような絶対パスか、 'http://' で始まる完全な URL にします。" -#: 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/sessions/models.py:35 +#: contrib/sessions/models.py:51 msgid "session key" msgstr "セッションキー" -#: contrib/sessions/models.py:36 +#: contrib/sessions/models.py:52 msgid "session data" msgstr "セッションデータ" -#: contrib/sessions/models.py:37 +#: contrib/sessions/models.py:53 msgid "expire date" msgstr "有効期限" -#: contrib/sessions/models.py:41 +#: contrib/sessions/models.py:57 msgid "session" msgstr "セッション" -#: contrib/sessions/models.py:42 +#: contrib/sessions/models.py:58 msgid "sessions" msgstr "セッション" @@ -1424,74 +1635,92 @@ msgstr "サイト" msgid "sites" msgstr "サイト" -#: core/validators.py:60 +#: core/validators.py:63 msgid "This value must contain only letters, numbers and underscores." msgstr "半角の英数字およびアンダースコア以外は使用できません。" -#: core/validators.py:64 +#: core/validators.py:67 #, fuzzy msgid "" "This value must contain only letters, numbers, underscores, dashes or " "slashes." msgstr "半角の英数字、アンダースコア、ダッシュ、ラッシュ以外は使用できません。" -#: core/validators.py:72 +#: core/validators.py:71 +#, fuzzy +msgid "This value must contain only letters, numbers, underscores or hyphens." +msgstr "半角の英数字、アンダースコア、ダッシュ、ラッシュ以外は使用できません。" + +#: core/validators.py:75 msgid "Uppercase letters are not allowed here." msgstr "大文字はここでは使用できません。" -#: core/validators.py:76 +#: core/validators.py:79 msgid "Lowercase letters are not allowed here." msgstr "小文字はここでは使用できません。" -#: core/validators.py:83 +#: core/validators.py:86 msgid "Enter only digits separated by commas." msgstr "カンマ区切りの数字だけを入力してください。" -#: core/validators.py:95 +#: core/validators.py:98 msgid "Enter valid e-mail addresses separated by commas." msgstr "カンマ区切りの有効なメールアドレスを入力してください。" -#: core/validators.py:99 +#: core/validators.py:102 msgid "Please enter a valid IP address." msgstr "有効な IP アドレスを入力してください。" -#: core/validators.py:103 +#: core/validators.py:106 msgid "Empty values are not allowed here." msgstr "入力は必須です。" -#: core/validators.py:107 +#: core/validators.py:110 msgid "Non-numeric characters aren't allowed here." msgstr "数値以外は使用できません。" -#: core/validators.py:111 +#: core/validators.py:114 msgid "This value can't be comprised solely of digits." msgstr "数値だけの値にはできません。" -#: core/validators.py:116 +#: core/validators.py:119 msgid "Enter a whole number." msgstr "整数を入力してください。" -#: core/validators.py:120 +#: core/validators.py:123 msgid "Only alphabetical characters are allowed here." msgstr "半角アルファベット以外使用できません。" -#: core/validators.py:124 +#: core/validators.py:138 +msgid "Year must be 1900 or later." +msgstr "1900年以降を指定してください。" + +#: core/validators.py:142 +#, fuzzy, python-format +msgid "Invalid date: %s." +msgstr "無効なURL: %s" + +#: core/validators.py:146 db/models/fields/__init__.py:424 msgid "Enter a valid date in YYYY-MM-DD format." msgstr "YYYY-MM-DD形式で日付を入力してください。" -#: core/validators.py:128 +#: core/validators.py:151 msgid "Enter a valid time in HH:MM format." msgstr "HH:MM形式で時刻を入力してください。" -#: core/validators.py:132 db/models/fields/__init__.py:468 +#: core/validators.py:155 db/models/fields/__init__.py:486 msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format." msgstr "YYYY-MM-DD HH:MM形式で日時を入力してください。" -#: core/validators.py:136 +#: core/validators.py:160 msgid "Enter a valid e-mail address." msgstr "有効なメールアドレスを入力してください。" -#: core/validators.py:148 +#: core/validators.py:172 core/validators.py:401 forms/__init__.py:662 +msgid "No file was submitted. Check the encoding type on the form." +msgstr "ファイルが取得できませんでした。formのencoding typeを確認してください。" + +#: core/validators.py:176 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." @@ -1499,26 +1728,26 @@ msgstr "" "画像をアップロードしてください。アップロードした画像は画像でないか、または壊" "れています。" -#: core/validators.py:155 +#: core/validators.py:183 #, python-format msgid "The URL %s does not point to a valid image." msgstr "URL ( %s ) は画像ではありません。" -#: core/validators.py:159 +#: core/validators.py:187 #, python-format msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid." msgstr "電話番号は XXX-XXX-XXXX 形式で入力してください。\"%s\" は無効です。" -#: core/validators.py:167 +#: core/validators.py:195 #, python-format msgid "The URL %s does not point to a valid QuickTime video." msgstr "URL ( %s ) は QuickTime ビデオではありません。" -#: core/validators.py:171 +#: core/validators.py:199 msgid "A valid URL is required." msgstr "正しい URL を入力してください。" -#: core/validators.py:185 +#: core/validators.py:213 #, python-format msgid "" "Valid HTML is required. Specific errors are:\n" @@ -1527,71 +1756,71 @@ msgstr "" "有効な HTML を入力してください。エラー:\n" "%s" -#: core/validators.py:192 +#: core/validators.py:220 #, python-format msgid "Badly formed XML: %s" msgstr "不正な XML です: %s" -#: core/validators.py:202 +#: core/validators.py:230 #, python-format msgid "Invalid URL: %s" msgstr "無効なURL: %s" -#: core/validators.py:206 core/validators.py:208 +#: core/validators.py:234 core/validators.py:236 #, python-format msgid "The URL %s is a broken link." msgstr "URL ( %s ) はリンクが壊れています。" -#: core/validators.py:214 +#: core/validators.py:242 msgid "Enter a valid U.S. state abbreviation." msgstr "正しい米州略称を入力してください。" -#: core/validators.py:229 +#: core/validators.py:256 #, python-format msgid "Watch your mouth! The word %s is not allowed here." msgid_plural "Watch your mouth! The words %s are not allowed here." msgstr[0] "言葉使いに気を付けて! %s という言葉は使えません。" msgstr[1] "言葉使いに気を付けて! %s という言葉は使えません。" -#: core/validators.py:236 +#: core/validators.py:263 #, python-format msgid "This field must match the '%s' field." msgstr "このフィールドは '%s' フィールドと一致せねばなりません。" -#: core/validators.py:255 +#: core/validators.py:282 msgid "Please enter something for at least one field." msgstr "少なくとも一つのフィールドに何か入力してください。" -#: core/validators.py:264 core/validators.py:275 +#: core/validators.py:291 core/validators.py:302 msgid "Please enter both fields or leave them both empty." msgstr "両方のフィールドに入力するか、両方とも未入力にしてください。" -#: core/validators.py:282 +#: core/validators.py:309 #, python-format msgid "This field must be given if %(field)s is %(value)s" msgstr "" "%(field)s を %(value)s にするのなら、このフィールドに必ず入力してください。" -#: core/validators.py:294 +#: core/validators.py:321 #, python-format msgid "This field must be given if %(field)s is not %(value)s" msgstr "" "%(field)s を %(value)s にしないのなら、このフィールドに必ず入力してください。" -#: core/validators.py:313 +#: core/validators.py:340 msgid "Duplicate values are not allowed." msgstr "重複する値は認められません。" -#: core/validators.py:336 +#: core/validators.py:363 #, python-format msgid "This value must be a power of %s." msgstr "この値は %s の累乗でなければなりません。" -#: core/validators.py:347 +#: core/validators.py:374 msgid "Please enter a valid decimal number." msgstr "有効な 10 進数を入力してください。" -#: core/validators.py:349 +#: core/validators.py:378 #, python-format msgid "Please enter a valid decimal number with at most %s total digit." msgid_plural "" @@ -1599,7 +1828,16 @@ msgid_plural "" msgstr[0] "最大桁数 %s 桁以下の有効な 10 進数を入力してください。" msgstr[1] "最大桁数 %s 桁以下の有効な 10 進数を入力してください。" -#: core/validators.py:352 +#: core/validators.py:381 +#, fuzzy, python-format +msgid "" +"Please enter a valid decimal number with a whole part of at most %s digit." +msgid_plural "" +"Please enter a valid decimal number with a whole part of at most %s digits." +msgstr[0] "最大桁数 %s 桁以下の有効な 10 進数を入力してください。" +msgstr[1] "最大桁数 %s 桁以下の有効な 10 進数を入力してください。" + +#: core/validators.py:384 #, python-format msgid "Please enter a valid decimal number with at most %s decimal place." msgid_plural "" @@ -1607,37 +1845,37 @@ msgid_plural "" msgstr[0] "小数点以下が %s 桁までの有効な 10 進数を入力してください。" msgstr[1] "小数点以下が %s 桁までの有効な 10 進数を入力してください。" -#: core/validators.py:362 +#: core/validators.py:394 #, python-format msgid "Make sure your uploaded file is at least %s bytes big." msgstr "アップロードするファイルの大きさは %s バイト以上にしてください。" -#: core/validators.py:363 +#: core/validators.py:395 #, python-format msgid "Make sure your uploaded file is at most %s bytes big." msgstr "アップロードするファイルの大きさは %s 最大バイトまでです。" -#: core/validators.py:376 +#: core/validators.py:412 msgid "The format for this field is wrong." msgstr "フィールドの形式が正しくありません。" -#: core/validators.py:391 +#: core/validators.py:427 msgid "This field is invalid." msgstr "このフィールドは無効です。" -#: core/validators.py:426 +#: core/validators.py:463 #, python-format msgid "Could not retrieve anything from %s." msgstr "%s から何も検索できませんでした。" -#: core/validators.py:429 +#: core/validators.py:466 #, python-format msgid "" "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." msgstr "" "URL %(url)s は無効なコンテンツタイプヘッダ '%(contenttype)s' を返しました。" -#: core/validators.py:462 +#: core/validators.py:499 #, python-format msgid "" "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with " @@ -1646,7 +1884,7 @@ msgstr "" "%(line)s 行目から始まる %(tag)s タグを閉じてください (\"%(start)s\" で始まる" "行です)。" -#: core/validators.py:466 +#: core/validators.py:503 #, python-format msgid "" "Some text starting on line %(line)s is not allowed in that context. (Line " @@ -1655,7 +1893,7 @@ msgstr "" "%(line)s 行目から始まるテキストはこのコンテキストでは使えません。 (\"%(start)" "s\" で始まる行です)。" -#: core/validators.py:471 +#: core/validators.py:508 #, python-format msgid "" "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%" @@ -1664,7 +1902,7 @@ msgstr "" "%(line)s 行目の \"%(attr)s\" は無効なアトリビュートです (\"%(start)s\" で始ま" "る行です)。" -#: core/validators.py:476 +#: core/validators.py:513 #, python-format msgid "" "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%" @@ -1673,7 +1911,7 @@ msgstr "" "%(line)s 行目の \"<%(tag)s>\" は無効なタグです( \"%(start)s\" で始まる行で" "す)。" -#: core/validators.py:480 +#: core/validators.py:517 #, python-format msgid "" "A tag on line %(line)s is missing one or more required attributes. (Line " @@ -1682,7 +1920,7 @@ msgstr "" "%(line)s 行目のタグは必須アトリビュートが未入力です( \"%(start)s\" で始まる行" "です)。" -#: core/validators.py:485 +#: core/validators.py:522 #, python-format msgid "" "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line " @@ -1691,61 +1929,59 @@ msgstr "" "%(line)s 行目の \"%(attr)s\" アトリビュートの値が正しくありません (\"%(start)" "s\" で始まる行です) 。" -#: db/models/manipulators.py:302 +#: db/models/manipulators.py:305 #, python-format msgid "%(object)s with this %(type)s already exists for the given %(field)s." msgstr "" "%(field)s に入力されたものは、この %(type)s の %(object)s に既に存在します。" -#: db/models/fields/__init__.py:40 +#: db/models/fields/__init__.py:41 #, python-format msgid "%(optname)s with this %(fieldname)s already exists." msgstr "%(fieldname)s に %(optname)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 +#: db/models/fields/__init__.py:115 db/models/fields/__init__.py:266 +#: db/models/fields/__init__.py:560 db/models/fields/__init__.py:571 +#: forms/__init__.py:347 msgid "This field is required." msgstr "このフィールドは必須です。" -#: db/models/fields/__init__.py:337 +#: db/models/fields/__init__.py:349 #, fuzzy msgid "This value must be an integer." msgstr "値は整数でなければなりません。" -#: db/models/fields/__init__.py:369 +#: db/models/fields/__init__.py:381 #, fuzzy msgid "This value must be either True or False." msgstr "値は真: True または偽: False でなければなりません。" -#: db/models/fields/__init__.py:385 +#: db/models/fields/__init__.py:397 #, fuzzy msgid "This field cannot be null." msgstr "このフィールドには NULL を指定できません。" -#: db/models/fields/__init__.py:562 +#: db/models/fields/__init__.py:580 msgid "Enter a valid filename." msgstr "正しいファイル名を入力してください。" -#: db/models/fields/related.py:43 +#: db/models/fields/related.py:51 #, python-format msgid "Please enter a valid %s." msgstr "正しい %s を入力してください。" -#: db/models/fields/related.py:579 +#: db/models/fields/related.py:618 #, fuzzy msgid "Separate multiple IDs with commas." msgstr "複数の ID はカンマで区切ってください。" -#: db/models/fields/related.py:581 -#, fuzzy +#: db/models/fields/related.py:620 msgid "" "Hold down \"Control\", or \"Command\" on a Mac, to select more than one." msgstr "" -"複数選択するときには \"Control\"キーを押したまま選択してください。Mac では " -"\"Command\" キーを使ってください。" +"複数選択するときには Control キーを押したまま選択してください。Mac は Command キーを使ってください" -#: db/models/fields/related.py:625 +#: db/models/fields/related.py:664 #, python-format msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." msgid_plural "" @@ -1753,39 +1989,39 @@ msgid_plural "" msgstr[0] "正しい %(self)s IDを入力してください。 %(value)r は無効です。" msgstr[1] "正しい %(self)s IDを入力してください。 %(value)r は無効です。" -#: forms/__init__.py:380 +#: forms/__init__.py:382 #, python-format msgid "Ensure your text is less than %s character." msgid_plural "Ensure your text is less than %s characters." msgstr[0] "%s 字以下で入力してください。" msgstr[1] "%s 字以下で入力してください。" -#: forms/__init__.py:385 +#: forms/__init__.py:387 msgid "Line breaks are not allowed here." msgstr "改行はできません。" -#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589 +#: forms/__init__.py:488 forms/__init__.py:561 forms/__init__.py:600 #, python-format msgid "Select a valid choice; '%(data)s' is not in %(choices)s." msgstr "正しく選択してください。; '%(data)s' は %(choices)s にありません。" -#: forms/__init__.py:645 +#: forms/__init__.py:664 msgid "The submitted file is empty." msgstr "入力されたファイルは空です。" -#: forms/__init__.py:699 +#: forms/__init__.py:720 msgid "Enter a whole number between -32,768 and 32,767." msgstr "-32,768 から 32,767 までの整数を入力してください。" -#: forms/__init__.py:708 +#: forms/__init__.py:730 msgid "Enter a positive number." msgstr "正の数を入力してください。" -#: forms/__init__.py:717 +#: forms/__init__.py:740 msgid "Enter a whole number between 0 and 32,767." msgstr "0 から 32,767 までの整数を入力してください。" -#: template/defaultfilters.py:383 +#: template/defaultfilters.py:401 msgid "yes,no,maybe" msgstr "はい,いいえ,たぶん" @@ -1979,18 +2215,43 @@ msgid_plural "minutes" msgstr[0] "分" msgstr[1] "分" -#: utils/translation.py:363 +#: utils/translation/trans_real.py:362 msgid "DATE_FORMAT" msgstr "Y/m/d" -#: utils/translation.py:364 +#: utils/translation/trans_real.py:363 msgid "DATETIME_FORMAT" msgstr "Y/m/d H:i" -#: utils/translation.py:365 +#: utils/translation/trans_real.py:364 msgid "TIME_FORMAT" msgstr "H:i" +#: utils/translation/trans_real.py:380 +#, fuzzy +msgid "YEAR_MONTH_FORMAT" +msgstr "Y/m/d" + +#: utils/translation/trans_real.py:381 +#, fuzzy +msgid "MONTH_DAY_FORMAT" +msgstr "Y/m/d" + +#: views/generic/create_update.py:43 +#, fuzzy, python-format +msgid "The %(verbose_name)s was created successfully." +msgstr "%(name)s \"%(obj)s\" を変更しました。" + +#: views/generic/create_update.py:117 +#, fuzzy, python-format +msgid "The %(verbose_name)s was updated successfully." +msgstr "%(name)s \"%(obj)s\" を削除しました。" + +#: views/generic/create_update.py:184 +#, fuzzy, python-format +msgid "The %(verbose_name)s was deleted." +msgstr " %(site_name)s チーム" + #~ msgid "String (up to 50)" #~ msgstr "文字列 (50 字まで)" diff --git a/django/conf/locale/ja/LC_MESSAGES/djangojs.mo b/django/conf/locale/ja/LC_MESSAGES/djangojs.mo index dee3150d1e7647ea1a04cf4f2e0ba77b6760cc9c..bddecacb108c1580bc2d408c658ad30deadb7451 100644 GIT binary patch delta 633 zcmZ9}zb}J97{Kvs-?mh%D2gz2VUu1{X&OOd@gv)u!2)q(EO!(t=_8lILLDkD7ReK{5M+mH@})lQC&93s*@;xfo1Q5!1NGuy;4YS zMV^;aON$W+qD3bETCdJKv0KNS+ob#GxFPSPlIOO)Tj-JrO->r|M%uaWzSY3o=GwZO x_g9^b?LD{YKX9wgKqPHPZ8mA`c*fq;oPA%od3yGCe$}|RbEkuqkPaV%vwt}hKEMC~ delta 580 zcmY+>O(;ZB6u|L2^JXv~KIZvol4g31W)hPk%|aG77M8C@Q_7IZMl#vR4&BH` z%GO3v63f|$m91jWhMgk$pXXXQb>?^Pym!yJ_r6;EFkXGKL;H&8AiK$XvWHv`@I$;| z9loQ59~j3kY`{qH_qmOY%sVlP{TRWFF^^&91)RlcWPMegFbMI-DN2Jgl!g~51+US; zTO7t0ltO*HEE^a=zY(snsXWRCFDWW@YS@f-#z*6;Z&j&J2C^VVRU4Bi3kFdNjN%wh znE9r0+qh#qz%Jf9!X#dyix1|xMKP%tH6}1XfB*FD_!sgiSo1GrLoFnS^G_=qmD`aU zs3*A;{}9rkiEJZVNeTHJF@K~~Ld-c{dNHlWi$$gL!5O_5Jl0uj%br~D%B7{$YGr<< m;!JtVURlqDdi9N!jJesAn{hHjBW~{e+1d!`Qg~N?hYLTaWjGiB diff --git a/django/conf/locale/ja/LC_MESSAGES/djangojs.po b/django/conf/locale/ja/LC_MESSAGES/djangojs.po index 3d91a17f7d..0ec1cadcf5 100644 --- a/django/conf/locale/ja/LC_MESSAGES/djangojs.po +++ b/django/conf/locale/ja/LC_MESSAGES/djangojs.po @@ -2,13 +2,13 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. -# +# #, fuzzy msgid "" msgstr "" "Project-Id-Version: Django 1.0\n" -"Report-Msgid-Bugs-To: Django-users Japan \n" -"POT-Creation-Date: 2006-05-02 23:06+0900\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-10-06 00:30+0900\n" "PO-Revision-Date: 2006-05-08 13:39+0900\n" "Last-Translator: makoto tsuyuki \n" "Language-Team: Japanese \n" @@ -61,50 +61,58 @@ msgstr "選択してクリック" msgid "Clear all" msgstr "全てクリア" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45 -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80 +#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34 +#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72 +msgid "Show" +msgstr "表示" + +#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63 +msgid "Hide" +msgstr "非表示" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81 msgid "Now" msgstr "現在" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51 msgid "Clock" msgstr "時計" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78 msgid "Choose a time" msgstr "時間を選択" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82 msgid "Midnight" msgstr "夜中" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83 msgid "6 a.m." msgstr "午前 6 時" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84 msgid "Noon" msgstr "正午" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87 -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183 msgid "Cancel" msgstr "キャンセル" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111 -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177 msgid "Today" msgstr "今日" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132 msgid "Calendar" msgstr "カレンダー" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175 msgid "Yesterday" msgstr "昨日" -#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179 msgid "Tomorrow" msgstr "明日" - diff --git a/django/conf/locale/tr/LC_MESSAGES/django.mo b/django/conf/locale/tr/LC_MESSAGES/django.mo index ba3dd15be8fe596f57cf90359964f3680ddff7c2..2415d26ee9cd7ef5396c26b2ca81095ef76478ea 100644 GIT binary patch literal 37149 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 A<^TWy literal 14429 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, 2006. +# translation of django.po to Turkish +# Django 0.95 +# Copyright (C) 2006 Django +# This file is distributed under the same license as the Django package. # -#, fuzzy +# Bahadır Kandemir , 2006. msgid "" msgstr "" -"Project-Id-Version: Django 1.0\n" +"Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2006-05-16 10:10+0200\n" -"PO-Revision-Date: 2006-09-12 23:43+0200\n" -"Last-Translator: Baurzhan Ismagulov \n" -"Language-Team: LANGUAGE \n" +"POT-Creation-Date: 2006-10-01 21:09+0300\n" +"PO-Revision-Date: 2006-10-01 21:19+0300\n" +"Last-Translator: Bahadır Kandemir \n" +"Language-Team: Turkish \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" + +#: db/models/manipulators.py:305 +#, python-format +msgid "%(object)s with this %(type)s already exists for the given %(field)s." +msgstr "%(type)s ve %(field)s değerine sahip %(object)s kaydı zaten var." + +#: db/models/manipulators.py:332 +#, python-format +msgid "" +"Please enter a different %s. The one you entered is already being used for %" +"s." +msgstr "Lütfen farklı bir %s girin. Girdiğiniz, %s tarihinde bir kez kullanılmış." + +#: db/models/fields/__init__.py:41 +#, python-format +msgid "%(optname)s with this %(fieldname)s already exists." +msgstr "%(fieldname)s için %(optname)s değeri zaten seçilmiş." + +#: db/models/fields/__init__.py:115 db/models/fields/__init__.py:266 +#: db/models/fields/__init__.py:560 db/models/fields/__init__.py:571 +#: forms/__init__.py:347 +msgid "This field is required." +msgstr "Bu alan gerekli." + +#: db/models/fields/__init__.py:349 +msgid "This value must be an integer." +msgstr "Bu değer tamsayı olmalı." + +#: db/models/fields/__init__.py:381 +msgid "This value must be either True or False." +msgstr "Bu değer True ya da False olabilir." + +#: db/models/fields/__init__.py:397 +msgid "This field cannot be null." +msgstr "Bu alan boş bırakılamaz." + +#: db/models/fields/__init__.py:424 core/validators.py:146 +msgid "Enter a valid date in YYYY-MM-DD format." +msgstr "YYYY-AA-GG formatında tarih girin." + +#: db/models/fields/__init__.py:486 core/validators.py:155 +msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format." +msgstr "YYYY-AA-GG SS:DD formatında tarih girin." + +#: db/models/fields/__init__.py:580 +msgid "Enter a valid filename." +msgstr "Geçerli bir dosya adı girin." + +#: db/models/fields/related.py:51 +#, python-format +msgid "Please enter a valid %s." +msgstr "Lütfen geçerli bir %s girin." + +#: db/models/fields/related.py:618 +msgid "Separate multiple IDs with commas." +msgstr "Birden fazla numarayı virgül ile ayırın." + +#: db/models/fields/related.py:620 +msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" +"\"Ctrl\" ve Mac'de \"Command\" tuşunu basılı tutarak birden fazla seçimde " +"bulunabilirsiniz." + +#: db/models/fields/related.py:664 +#, 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] "Lütfen geçerli bir %(self)s numarası girin. %(value)r değeri geçersiz." +msgstr[1] "Lütfen geçerli %(self)s numaraları girin. %(value)r değerleri geçersiz." + +#: conf/global_settings.py:39 +msgid "Arabic" +msgstr "Arapça" + +#: conf/global_settings.py:40 +msgid "Bengali" +msgstr "Bengali Dili" + +#: conf/global_settings.py:41 +msgid "Czech" +msgstr "Çekçe" + +#: conf/global_settings.py:42 +msgid "Welsh" +msgstr "Galce" + +#: conf/global_settings.py:43 +msgid "Danish" +msgstr "Danca" + +#: conf/global_settings.py:44 +msgid "German" +msgstr "Almanca" + +#: conf/global_settings.py:45 +msgid "Greek" +msgstr "Yunanca" + +#: conf/global_settings.py:46 +msgid "English" +msgstr "İngilizce" + +#: conf/global_settings.py:47 +msgid "Spanish" +msgstr "İspanyolca" + +#: conf/global_settings.py:48 +msgid "Argentinean Spanish" +msgstr "Arjantin İspanyolcası" + +#: conf/global_settings.py:49 +msgid "Finnish" +msgstr "Fince" + +#: conf/global_settings.py:50 +msgid "French" +msgstr "Fransızca" + +#: conf/global_settings.py:51 +msgid "Galician" +msgstr "Galler Dili" + +#: conf/global_settings.py:52 +msgid "Hungarian" +msgstr "Macarca" + +#: conf/global_settings.py:53 +msgid "Hebrew" +msgstr "İbranice" + +#: conf/global_settings.py:54 +msgid "Icelandic" +msgstr "İzlanda dili" + +#: conf/global_settings.py:55 +msgid "Italian" +msgstr "İtalyanca" + +#: conf/global_settings.py:56 +msgid "Japanese" +msgstr "Japonca" + +#: conf/global_settings.py:57 +msgid "Dutch" +msgstr "Flamanca" + +#: conf/global_settings.py:58 +msgid "Norwegian" +msgstr "Norveç Dili" + +#: conf/global_settings.py:59 +msgid "Brazilian" +msgstr "Brezilya Dili" + +#: conf/global_settings.py:60 +msgid "Romanian" +msgstr "Romence" + +#: conf/global_settings.py:61 +msgid "Russian" +msgstr "Rusça" + +#: conf/global_settings.py:62 +msgid "Slovak" +msgstr "Slovakça" + +#: conf/global_settings.py:63 +msgid "Slovenian" +msgstr "Slovence" + +#: conf/global_settings.py:64 +msgid "Serbian" +msgstr "Sırpça" + +#: conf/global_settings.py:65 +msgid "Swedish" +msgstr "İsveççe" + +#: conf/global_settings.py:66 +msgid "Tamil" +msgstr "Tamilce" + +#: conf/global_settings.py:67 +msgid "Turkish" +msgstr "Türkçe" + +#: conf/global_settings.py:68 +msgid "Ukrainian" +msgstr "Ukraynaca" + +#: conf/global_settings.py:69 +msgid "Simplified Chinese" +msgstr "Basiteştirilmiş Çince" + +#: conf/global_settings.py:70 +msgid "Traditional Chinese" +msgstr "Gelenelsek Çince" + +#: forms/__init__.py:382 +#, python-format +msgid "Ensure your text is less than %s character." +msgid_plural "Ensure your text is less than %s characters." +msgstr[0] "Metnin %s karakterden az olmasına dikkat edin." +msgstr[1] "Metnin %s karakterden az olmasına dikkat edin." + +#: forms/__init__.py:387 +msgid "Line breaks are not allowed here." +msgstr "Burada birden fazla satır olamaz." + +#: forms/__init__.py:488 forms/__init__.py:561 forms/__init__.py:600 +#, python-format +msgid "Select a valid choice; '%(data)s' is not in %(choices)s." +msgstr "Geçerli bir seçimde bulunun; %(choices)s değerleri içinde '%(data)s' yok." + +#: forms/__init__.py:662 core/validators.py:172 core/validators.py:401 +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Dosya gönderilmedi. Formdaki kodlama türünü kontrol edin." + +#: forms/__init__.py:664 +msgid "The submitted file is empty." +msgstr "Gönderilen dosya boş." + +#: forms/__init__.py:720 +msgid "Enter a whole number between -32,768 and 32,767." +msgstr "-32,768 ve 32,767 arası bir sayı girin." + +#: forms/__init__.py:730 +msgid "Enter a positive number." +msgstr "Pozitif tamsayı girin." + +#: forms/__init__.py:740 +msgid "Enter a whole number between 0 and 32,767." +msgstr "0 ve 32,767 arası bir sayı girin." + +#: core/validators.py:63 +msgid "This value must contain only letters, numbers and underscores." +msgstr "Bu değer sadece karakter, rakam ve altçizgiden oluşabilir." + +#: core/validators.py:67 +msgid "" +"This value must contain only letters, numbers, underscores, dashes or " +"slashes." +msgstr "Bu değer sadece harf, rakam, altçizgi, bölü ve ters bölüden oluşabilir." + +#: core/validators.py:71 +msgid "This value must contain only letters, numbers, underscores or hyphens." +msgstr "Bu değer sadece harf, rakam, altçizgi veya çizgiden oluşabilir." + +#: core/validators.py:75 +msgid "Uppercase letters are not allowed here." +msgstr "Burada büyük harf kullanılamaz." + +#: core/validators.py:79 +msgid "Lowercase letters are not allowed here." +msgstr "Burada küçük harf kullanılamaz." + +#: core/validators.py:86 +msgid "Enter only digits separated by commas." +msgstr "Sadece virgülle ayrılmış sayılar girin." + +#: core/validators.py:98 +msgid "Enter valid e-mail addresses separated by commas." +msgstr "Virgülle ayrılmış geçerli e-posta adresleri girin." + +#: core/validators.py:102 +msgid "Please enter a valid IP address." +msgstr "Lütfen geçerli bir IP adresi girin." + +#: core/validators.py:106 +msgid "Empty values are not allowed here." +msgstr "Burada boş değer kullanılamaz." + +#: core/validators.py:110 +msgid "Non-numeric characters aren't allowed here." +msgstr "Burada numerik olmayan karakterler kullanılamaz." + +#: core/validators.py:114 +msgid "This value can't be comprised solely of digits." +msgstr "Bu alanda sadece rakam kullanılamaz." + +#: core/validators.py:119 +msgid "Enter a whole number." +msgstr "Sayı girin." + +#: core/validators.py:123 +msgid "Only alphabetical characters are allowed here." +msgstr "Burada sadece alfabetik karakterler kullanılabilir." + +#: core/validators.py:138 +msgid "Year must be 1900 or later." +msgstr "Yıl 1900 ya da sonrası olabilir." + +#: core/validators.py:142 +#, python-format +msgid "Invalid date: %s." +msgstr "Geçersiz tarih: %s" + +#: core/validators.py:151 +msgid "Enter a valid time in HH:MM format." +msgstr "SS:DD formatında geçerli bir saat girin." + +#: core/validators.py:160 +msgid "Enter a valid e-mail address." +msgstr "Geçerli bir e-posta adresi girin." + +#: core/validators.py:176 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Geçerli bir resim girin. Gönderdiğiniz dosya resim değil, ya da bozuk bir " +"dosya." + +#: core/validators.py:183 +#, python-format +msgid "The URL %s does not point to a valid image." +msgstr "%s adresi geçerli bir resme işaret etmiyor." + +#: core/validators.py:187 +#, python-format +msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid." +msgstr "Telefon numarası XXX-XXX-XXXX formatında olmalı. \"%s\" geçersiz." + +#: core/validators.py:195 +#, python-format +msgid "The URL %s does not point to a valid QuickTime video." +msgstr "%s adresi geçerli bir QuickTime dosyasına işaret etmiyor." + +#: core/validators.py:199 +msgid "A valid URL is required." +msgstr "Geçerli bir URL gerekli." + +#: core/validators.py:213 +#, python-format +msgid "" +"Valid HTML is required. Specific errors are:\n" +"%s" +msgstr "" +"Metnin geçerli bir HTML kodu olması gerekir. Hatalar:\n" +"%s" + +#: core/validators.py:220 +#, python-format +msgid "Badly formed XML: %s" +msgstr "Geçersiz XML kodu: %s" + +#: core/validators.py:230 +#, python-format +msgid "Invalid URL: %s" +msgstr "Geçersiz adres: %s" + +#: core/validators.py:234 core/validators.py:236 +#, python-format +msgid "The URL %s is a broken link." +msgstr "%s kırık bir link." + +#: core/validators.py:242 +msgid "Enter a valid U.S. state abbreviation." +msgstr "Geçerli bir şehir kodu girin." + +#: core/validators.py:256 +#, python-format +msgid "Watch your mouth! The word %s is not allowed here." +msgid_plural "Watch your mouth! The words %s are not allowed here." +msgstr[0] "Söylediğinize dikkat edin! %s kelimesi burada kullanılamaz." +msgstr[1] "Söylediğinize dikkat edin! %s kelimeleri burada kullanılamaz." + +#: core/validators.py:263 +#, python-format +msgid "This field must match the '%s' field." +msgstr "Bu alan '%s' ile alanı ile uyuşmalı." + +#: core/validators.py:282 +msgid "Please enter something for at least one field." +msgstr "Lütfen en az bir alana giriş yapın." + +#: core/validators.py:291 core/validators.py:302 +msgid "Please enter both fields or leave them both empty." +msgstr "Lütfen tüm alanları doldurun ya da hepsini boş bırakın." + +#: core/validators.py:309 +#, python-format +msgid "This field must be given if %(field)s is %(value)s" +msgstr "Bu alan %(field)s alanı %(value)s değerine sahipse doldurulmalı." + +#: core/validators.py:321 +#, python-format +msgid "This field must be given if %(field)s is not %(value)s" +msgstr "Bu alan %(field)s alanı %(value)s değerine sahip değilse doldurulmalı." + +#: core/validators.py:340 +msgid "Duplicate values are not allowed." +msgstr "Tekrarlanan değerler kabul edilmez." + +#: core/validators.py:363 +#, python-format +msgid "This value must be a power of %s." +msgstr "Bu değer %s ya da kuvvetleri olabilir." + +#: core/validators.py:374 +msgid "Please enter a valid decimal number." +msgstr "Lütfen geçerli bir ondalık sayı girin." + +#: core/validators.py:378 +#, 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] "Lütfen en fazla %s basamaklı bir ondalık sayı girin." +msgstr[1] "Lütfen en fazla %s basamaklı bir ondalık sayı girin." + +#: core/validators.py:381 +#, python-format +msgid "Please enter a valid decimal number with a whole part of at most %s digit." +msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits." +msgstr[0] "Lütfen tamsayı kısmı en fazla %s basamaklı bir ondalık sayı girin." +msgstr[1] "Lütfen tamsayı kısmı en fazla %s basamaklı bir ondalık sayı girin." + +#: core/validators.py:384 +#, 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] "Lütfen ondalıklı kısmı en fazla %s basamaklı bir ondalık sayı girin." +msgstr[1] "Lütfen ondalıklı kısmı en fazla %s basamaklı bir ondalık sayı girin." + +#: core/validators.py:394 +#, python-format +msgid "Make sure your uploaded file is at least %s bytes big." +msgstr "Gönderdiğiniz dosyanın en az %s byte uzunlukta olduğundan emin olun." + +#: core/validators.py:395 +#, python-format +msgid "Make sure your uploaded file is at most %s bytes big." +msgstr "Gönderdiğiniz dosyanın en fazl %s byte uzunlukta olduğundan emin olun." + +#: core/validators.py:412 +msgid "The format for this field is wrong." +msgstr "Bu alandaki veri formatı hatalı." + +#: core/validators.py:427 +msgid "This field is invalid." +msgstr "Alan geçersiz." + +#: core/validators.py:463 +#, python-format +msgid "Could not retrieve anything from %s." +msgstr "%s içinden hiçbirşey aktarılamıyor." + +#: core/validators.py:466 +#, python-format +msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." +msgstr "%(url)s adresi geçersiz içerik türü (%(contenttype)s) gönderdi." + +#: core/validators.py:499 +#, python-format +msgid "" +"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with " +"\"%(start)s\".)" +msgstr "" +"Lütfen %(line)s. satırdaki kapatılmayan %(tag)s etiketini kapatın. (Satır, " +"\"%(start)s\" ile başlıyor.)" + +#: core/validators.py:503 +#, python-format +msgid "" +"Some text starting on line %(line)s is not allowed in that context. (Line " +"starts with \"%(start)s\".)" +msgstr "" +"%(line)s. satırda başlayan bazı kelimeler içerik olarak kabul edilmiyor. " +"(Satır, \"%(start)s\" ile başlıyor.)" + +#: core/validators.py:508 +#, python-format +msgid "" +"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%" +"(start)s\".)" +msgstr "" +"%(line)s. satırdaki \"%(attr)s\" özelliği geçersiz. (Satır, \"%(start)s\" " +"ile başlıyor.)" + +#: core/validators.py:513 +#, python-format +msgid "" +"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%" +"(start)s\".)" +msgstr "" +"%(line)s. satırdaki \"<%(tag)s>\" etiketi geçersiz. (Satır, \"%(start)s\" " +"ile başlıyor.)" + +#: core/validators.py:517 +#, python-format +msgid "" +"A tag on line %(line)s is missing one or more required attributes. (Line " +"starts with \"%(start)s\".)" +msgstr "" +"%(line)s. satırdaki bir etiket eksik ya da eklenmesi gereken özellikleri " +"var. (Satır, \"%(start)s\" ile başlıyor.)" + +#: core/validators.py:522 +#, python-format +msgid "" +"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line " +"starts with \"%(start)s\".)" +msgstr "" +"%(line)s. satırdaki \"%(attr)s\" özelliği geçersiz bir değere sahip. (Satır, " +"\"%(start)s\" ile başlıyor.)" + +#: views/generic/create_update.py:43 +#, python-format +msgid "The %(verbose_name)s was created successfully." +msgstr "%(verbose_name)s başarıyla yaratıldı." + +#: views/generic/create_update.py:117 +#, python-format +msgid "The %(verbose_name)s was updated successfully." +msgstr "%(verbose_name)s başarıyla güncellendi." + +#: views/generic/create_update.py:184 +#, python-format +msgid "The %(verbose_name)s was deleted." +msgstr "%(verbose_name)s silindi." + +#: utils/dates.py:6 +msgid "Monday" +msgstr "Pazartesi" + +#: utils/dates.py:6 +msgid "Tuesday" +msgstr "Salı" + +#: utils/dates.py:6 +msgid "Wednesday" +msgstr "Çarşamba" + +#: utils/dates.py:6 +msgid "Thursday" +msgstr "Perşembe" + +#: utils/dates.py:6 +msgid "Friday" +msgstr "Cuma" + +#: utils/dates.py:7 +msgid "Saturday" +msgstr "Cumartesi" + +#: utils/dates.py:7 +msgid "Sunday" +msgstr "Pazar" + +#: utils/dates.py:14 +msgid "January" +msgstr "Ocak" + +#: utils/dates.py:14 +msgid "February" +msgstr "Şubat" + +#: utils/dates.py:14 utils/dates.py:27 +msgid "March" +msgstr "Mart" + +#: utils/dates.py:14 utils/dates.py:27 +msgid "April" +msgstr "Nisan" + +#: utils/dates.py:14 utils/dates.py:27 +msgid "May" +msgstr "Mayıs" + +#: utils/dates.py:14 utils/dates.py:27 +msgid "June" +msgstr "Haziran" + +#: utils/dates.py:15 utils/dates.py:27 +msgid "July" +msgstr "Temmuz" + +#: utils/dates.py:15 +msgid "August" +msgstr "Ağustos" + +#: utils/dates.py:15 +msgid "September" +msgstr "Eylül" + +#: utils/dates.py:15 +msgid "October" +msgstr "Ekim" + +#: utils/dates.py:15 +msgid "November" +msgstr "Kasım" + +#: utils/dates.py:16 +msgid "December" +msgstr "Aralık" + +#: utils/dates.py:19 +msgid "jan" +msgstr "oca" + +#: utils/dates.py:19 +msgid "feb" +msgstr "şub" + +#: utils/dates.py:19 +msgid "mar" +msgstr "mar" + +#: utils/dates.py:19 +msgid "apr" +msgstr "nis" + +#: utils/dates.py:19 +msgid "may" +msgstr "may" + +#: utils/dates.py:19 +msgid "jun" +msgstr "haz" + +#: utils/dates.py:20 +msgid "jul" +msgstr "tem" + +#: utils/dates.py:20 +msgid "aug" +msgstr "ağu" + +#: utils/dates.py:20 +msgid "sep" +msgstr "eyl" + +#: utils/dates.py:20 +msgid "oct" +msgstr "eki" + +#: utils/dates.py:20 +msgid "nov" +msgstr "kas" + +#: utils/dates.py:20 +msgid "dec" +msgstr "ara" + +#: utils/dates.py:27 +msgid "Jan." +msgstr "Oca." + +#: utils/dates.py:27 +msgid "Feb." +msgstr "Şub." + +#: utils/dates.py:28 +msgid "Aug." +msgstr "Ağu." + +#: utils/dates.py:28 +msgid "Sept." +msgstr "Eyl." + +#: utils/dates.py:28 +msgid "Oct." +msgstr "Eki." + +#: utils/dates.py:28 +msgid "Nov." +msgstr "Kas." + +#: utils/dates.py:28 +msgid "Dec." +msgstr "Ara." + +#: utils/timesince.py:12 +msgid "year" +msgid_plural "years" +msgstr[0] "yıl" +msgstr[1] "yıl" + +#: utils/timesince.py:13 +msgid "month" +msgid_plural "months" +msgstr[0] "ay" +msgstr[1] "ay" + +#: utils/timesince.py:14 +msgid "week" +msgid_plural "weeks" +msgstr[0] "hafta" +msgstr[1] "hafta" + +#: utils/timesince.py:15 +msgid "day" +msgid_plural "days" +msgstr[0] "gün" +msgstr[1] "gün" + +#: utils/timesince.py:16 +msgid "hour" +msgid_plural "hours" +msgstr[0] "saat" +msgstr[1] "saat" + +#: utils/timesince.py:17 +msgid "minute" +msgid_plural "minutes" +msgstr[0] "dakika" +msgstr[1] "dakika" + +#: utils/translation/trans_real.py:362 +msgid "DATE_FORMAT" +msgstr "DATE_FORMAT" + +#: utils/translation/trans_real.py:363 +msgid "DATETIME_FORMAT" +msgstr "DATETIME_FORMAT" + +#: utils/translation/trans_real.py:364 +msgid "TIME_FORMAT" +msgstr "TIME_FORMAT" + +#: utils/translation/trans_real.py:380 +msgid "YEAR_MONTH_FORMAT" +msgstr "YEAR_MONTH_FORMAT" + +#: utils/translation/trans_real.py:381 +msgid "MONTH_DAY_FORMAT" +msgstr "MONTH_DAY_FORMAT" + +#: contrib/contenttypes/models.py:20 +msgid "python model class name" +msgstr "python model sınıfı" + +#: contrib/contenttypes/models.py:23 +msgid "content type" +msgstr "içerik türü" + +#: contrib/contenttypes/models.py:24 +msgid "content types" +msgstr "içerik türleri" + +#: contrib/auth/views.py:39 +msgid "Logged out" +msgstr "Çıkış yapıldı" + +#: contrib/auth/models.py:38 contrib/auth/models.py:57 +msgid "name" +msgstr "isim" + +#: contrib/auth/models.py:40 +msgid "codename" +msgstr "takma ad" + +#: contrib/auth/models.py:42 +msgid "permission" +msgstr "izin" + +#: contrib/auth/models.py:43 contrib/auth/models.py:58 +msgid "permissions" +msgstr "izinler" + +#: contrib/auth/models.py:60 +msgid "group" +msgstr "grup" + +#: contrib/auth/models.py:61 contrib/auth/models.py:100 +msgid "groups" +msgstr "gruplar" + +#: contrib/auth/models.py:90 +msgid "username" +msgstr "kullanıcı adı" + +#: contrib/auth/models.py:90 +msgid "" +"Required. 30 characters or fewer. Alphanumeric characters only (letters, " +"digits and underscores)." +msgstr "" +"Gerekli. 30 karakter ya da da az olmalı. Alfanumerik (harf, rakam ve alt " +"çizgi) karakterler kullanılabilir." + +#: contrib/auth/models.py:91 +msgid "first name" +msgstr "isim" + +#: contrib/auth/models.py:92 +msgid "last name" +msgstr "soyisim" + +#: contrib/auth/models.py:93 +msgid "e-mail address" +msgstr "e-posta adresi" + +#: contrib/auth/models.py:94 +msgid "password" +msgstr "parola" + +#: contrib/auth/models.py:94 +msgid "Use '[algo]$[salt]$[hexdigest]'" +msgstr "'[algo]$[salt]$[hexdigest]' formatında" + +#: contrib/auth/models.py:95 +msgid "staff status" +msgstr "yönetici modu" + +#: contrib/auth/models.py:95 +msgid "Designates whether the user can log into this admin site." +msgstr "Kullanıcının yönetici sayfasına girip giremeyeceğini belirler." + +#: contrib/auth/models.py:96 +msgid "active" +msgstr "aktif" + +#: contrib/auth/models.py:96 +msgid "" +"Designates whether this user can log into the Django admin. Unselect this " +"instead of deleting accounts." +msgstr "" +"Kullanıcının Django yönetim sayfasına girip giremeyeceğini belirler. " +"Kullanıcı hesabı silmek yerine işareti kaldırın." + +#: contrib/auth/models.py:97 +msgid "superuser status" +msgstr "süper kullanıcı modu" + +#: contrib/auth/models.py:97 +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" +"Kullanıcının tek tek hak atamasına gerek kalmadan tüm haklara sahip olup " +"olamayacağını belirler." + +#: contrib/auth/models.py:98 +msgid "last login" +msgstr "son ziyaret" + +#: contrib/auth/models.py:99 +msgid "date joined" +msgstr "kayıt tarihi" + +#: contrib/auth/models.py:101 +msgid "" +"In addition to the permissions manually assigned, this user will also get " +"all permissions granted to each group he/she is in." +msgstr "" +"Özel olarak atanmış hakların yanı sıra, kullanıcının üyesi olduğu grupların " +"hakları alır." + +#: contrib/auth/models.py:102 +msgid "user permissions" +msgstr "kullanıcı izinleri" + +#: contrib/auth/models.py:105 +msgid "user" +msgstr "kullanıcı" + +#: contrib/auth/models.py:106 +msgid "users" +msgstr "kullanıcılar" + +#: contrib/auth/models.py:111 +msgid "Personal info" +msgstr "Kişisel bilgiler" + +#: contrib/auth/models.py:112 +msgid "Permissions" +msgstr "İzinler" + +#: contrib/auth/models.py:113 +msgid "Important dates" +msgstr "Önemli tarihler" + +#: contrib/auth/models.py:114 +msgid "Groups" +msgstr "Gruplar" + +#: contrib/auth/models.py:258 +msgid "message" +msgstr "mesaj" + +#: contrib/auth/forms.py:16 +msgid "The two password fields didn't match." +msgstr "İki parola alanı uyuşmuyor." + +#: contrib/auth/forms.py:24 +msgid "A user with that username already exists." +msgstr "Bu isimde bir kullanıcı zaten var." + +#: contrib/auth/forms.py:52 +msgid "" +"Your Web browser doesn't appear to have cookies enabled. Cookies are " +"required for logging in." +msgstr "" +"Web tarayıcınızın çerezleri desteklemediği görülüyor. Çerezler giriş için " +"gerekli." + +#: contrib/auth/forms.py:59 contrib/admin/views/decorators.py:10 +msgid "" +"Please enter a correct username and password. Note that both fields are case-" +"sensitive." +msgstr "" +"Lütfen geçerli bir kullanıcı adı ve parola girin. Tüm alanlar büyük/küçük " +"harf duyarlıdır." + +#: contrib/auth/forms.py:61 +msgid "This account is inactive." +msgstr "Bu hesap aktif değil." + +#: contrib/auth/forms.py:84 +msgid "" +"That e-mail address doesn't have an associated user acount. Are you sure " +"you've registered?" +msgstr "Bu e-posta hesabıyla ilişkili kullanıcı bulunmuyor. Kayıtlı olduğunuzdan emin misiniz?" + +#: contrib/auth/forms.py:116 +msgid "The two 'new password' fields didn't match." +msgstr "İki parola alanı uyuşmuyor." + +#: contrib/auth/forms.py:123 +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "Eski parolanız hatalı. Lütfen tekrar girin." + +#: contrib/redirects/models.py:7 +msgid "redirect from" +msgstr "eski adres" + +#: contrib/redirects/models.py:8 +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"Buraya tam dosya yolu, alan adı kullanılmadan yazılmalı. Örnek: '/events/" +"search/'." + +#: contrib/redirects/models.py:9 +msgid "redirect to" +msgstr "yeni adres" + +#: contrib/redirects/models.py:10 +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Buraya tam dosya yolu (yukarıdaki gibi), ya da 'http://' ile başlayan tam " +"adres yazılmalı." + +#: contrib/redirects/models.py:13 +msgid "redirect" +msgstr "yönlendirme" + +#: contrib/redirects/models.py:14 +msgid "redirects" +msgstr "yönlendirmeler" #: contrib/comments/models.py:67 contrib/comments/models.py:166 msgid "object ID" -msgstr "nesne kodu" +msgstr "nesne no" #: contrib/comments/models.py:68 msgid "headline" @@ -31,61 +986,63 @@ msgstr "yorum" #: contrib/comments/models.py:70 msgid "rating #1" -msgstr "rating #1" +msgstr "reyting 1" #: contrib/comments/models.py:71 msgid "rating #2" -msgstr "rating #2" +msgstr "reyting 2" #: contrib/comments/models.py:72 msgid "rating #3" -msgstr "rating #3" +msgstr "reyting 3" #: contrib/comments/models.py:73 msgid "rating #4" -msgstr "rating #4" +msgstr "reyting 4" #: contrib/comments/models.py:74 msgid "rating #5" -msgstr "rating #5" +msgstr "reyting 5" #: contrib/comments/models.py:75 msgid "rating #6" -msgstr "rating #6" +msgstr "reyting 6" #: contrib/comments/models.py:76 msgid "rating #7" -msgstr "rating #7" +msgstr "reyting 7" #: contrib/comments/models.py:77 msgid "rating #8" -msgstr "rating #8" +msgstr "reyting 8" #: contrib/comments/models.py:82 msgid "is valid rating" -msgstr "geçerli bir rating'dir" +msgstr "geçerli reyting" #: contrib/comments/models.py:83 contrib/comments/models.py:169 msgid "date/time submitted" -msgstr "girildiği tarih/saat" +msgstr "gönderim tarihi/saati" #: contrib/comments/models.py:84 contrib/comments/models.py:170 msgid "is public" -msgstr "geneldir" +msgstr "görünürlük" -#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289 +#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304 msgid "IP address" msgstr "IP adresi" #: contrib/comments/models.py:86 msgid "is removed" -msgstr "silinmiştir" +msgstr "silinmiş" #: contrib/comments/models.py:86 msgid "" "Check this box if the comment is inappropriate. A \"This comment has been " "removed\" message will be displayed instead." -msgstr "Yorum uygun değilse bu alanı işaretleyin. Yerine \"Bu yorum silinmiştir\" yazısı gözükür." +msgstr "" +"Yorum uygunsuz ise bu işareti kaldırın. \"Yorum silindi\" uyarısı " +"görüntülenecek." #: contrib/comments/models.py:91 msgid "comments" @@ -104,7 +1061,7 @@ msgid "" "\n" "http://%(domain)s%(url)s" msgstr "" -"%(user)s, %(date)s\n" +"%(date)s tarihinde %(user)s göndermiş:\n" "\n" "%(comment)s\n" "\n" @@ -112,15 +1069,15 @@ msgstr "" #: contrib/comments/models.py:168 msgid "person's name" -msgstr "kişinin adı" +msgstr "isim" #: contrib/comments/models.py:171 msgid "ip address" -msgstr "IP adresi" +msgstr "ip adresi" #: contrib/comments/models.py:173 msgid "approved by staff" -msgstr "personel tarafından onaylanmış" +msgstr "yönetici onayı" #: contrib/comments/models.py:176 msgid "free comment" @@ -128,7 +1085,7 @@ msgstr "serbest yorum" #: contrib/comments/models.py:177 msgid "free comments" -msgstr "serbest yorum" +msgstr "serbest yorumlar" #: contrib/comments/models.py:233 msgid "score" @@ -149,7 +1106,7 @@ msgstr "karma puanları" #: contrib/comments/models.py:242 #, python-format msgid "%(score)d rating by %(user)s" -msgstr "%(score)d rating by %(user)s" +msgstr "%(user)s tarafından %(score)d puan" #: contrib/comments/models.py:258 #, python-format @@ -158,7 +1115,7 @@ msgid "" "\n" "%(text)s" msgstr "" -"Bu yorum, %(user)s tarafından işaretlenmiştir:\n" +"Bu yorum %(user)s tarafından işaretlenmiş:\n" "\n" "%(text)s" @@ -177,7 +1134,7 @@ msgstr "kullanıcı işaretleri" #: contrib/comments/models.py:273 #, python-format msgid "Flag by %r" -msgstr "Flag by %r" +msgstr "%r tarafından işaret" #: contrib/comments/models.py:278 msgid "deletion date" @@ -185,35 +1142,34 @@ msgstr "silme tarihi" #: contrib/comments/models.py:280 msgid "moderator deletion" -msgstr "moderator deletion" +msgstr "yönetici tarafından silinme" #: contrib/comments/models.py:281 msgid "moderator deletions" -msgstr "moderator deletions" +msgstr "yönetici tarafından silinme" #: contrib/comments/models.py:285 #, python-format msgid "Moderator deletion by %r" -msgstr "Moderator deletion by %r" +msgstr "%s tarafından silme işlemi" #: contrib/comments/views/karma.py:19 msgid "Anonymous users cannot vote" -msgstr "Kayıtlı olmayan kullanıcılar oy veremez" +msgstr "Kayıtsız kullanıcılar oy veremez" #: contrib/comments/views/karma.py:23 msgid "Invalid comment ID" -msgstr "Geçersiz yorum kodu" +msgstr "Geçersiz yorum numarası" #: contrib/comments/views/karma.py:25 msgid "No voting for yourself" msgstr "Kendinize oy veremezsiniz" -#: contrib/comments/views/comments.py:28 -msgid "" -"This rating is required because you've entered at least one other rating." -msgstr "Bu rating zorunludur, çünkü en az bir başka rating girdiniz." +#: contrib/comments/views/comments.py:27 +msgid "This rating is required because you've entered at least one other rating." +msgstr "Reyting gerekli, çünkü en az bir reyting tanımladınız." -#: contrib/comments/views/comments.py:112 +#: contrib/comments/views/comments.py:111 #, python-format msgid "" "This comment was posted by a user who has posted fewer than %(count)s " @@ -226,119 +1182,207 @@ msgid_plural "" "\n" "%(text)s" msgstr[0] "" -"Bu yorum, %(count)s'den az yorum yazmış bir kullanıcı tarafından yazılmıştır:\n" +"Bu yorum, %(count)s yorumdan daha az gönderide bulunmuş bir kullanıcıya " +"ait:\n" "\n" "%(text)s" msgstr[1] "" -"Bu yorum, %(count)s'den az yorum yazmış bir kullanıcı tarafından yazılmıştır:\n" +"Bu yorum, %(count)s yorumdan daha az gönderide bulunmuş bir kullanıcıya " +"ait:\n" "\n" "%(text)s" -#: contrib/comments/views/comments.py:117 +#: contrib/comments/views/comments.py:116 #, python-format msgid "" "This comment was posted by a sketchy user:\n" "\n" "%(text)s" msgstr "" -"Bu yorum, yüzeysel bir kullanıcı tarafından yazılmıştır:\n" +"Bu yorum kusurlu bir kullanıcı tarafından gönderildi:\n" "\n" "%(text)s" -#: contrib/comments/views/comments.py:189 +#: contrib/comments/views/comments.py:188 #: contrib/comments/views/comments.py:280 msgid "Only POSTs are allowed" -msgstr "Yalnızca POST kabul edilir" +msgstr "Sadece POST yapılabilir" -#: contrib/comments/views/comments.py:193 +#: contrib/comments/views/comments.py:192 #: contrib/comments/views/comments.py:284 msgid "One or more of the required fields wasn't submitted" -msgstr "En az bir zorunlu alan doldurulmamıştır" +msgstr "Bir ya da daha fazla gerekli alan doldurulmadı" -#: contrib/comments/views/comments.py:197 +#: contrib/comments/views/comments.py:196 #: contrib/comments/views/comments.py:286 msgid "Somebody tampered with the comment form (security violation)" -msgstr "Yorum formu ile oynanmış (güvenlik problemi)" +msgstr "Birisi yorum gönderme formunu kötüye kullanmaya çalıştı (güvenlik ihlali)" -#: contrib/comments/views/comments.py:207 +#: contrib/comments/views/comments.py:206 #: contrib/comments/views/comments.py:292 msgid "" "The comment form had an invalid 'target' parameter -- the object ID was " "invalid" -msgstr "Yorum formunun 'target' parametresi geçersiz, nesne kodu geçersiz" +msgstr "Bu yorumun geçersiz bir 'hedef' parametresi var -- nesne narası geçersiz" #: contrib/comments/views/comments.py:257 #: contrib/comments/views/comments.py:321 msgid "The comment form didn't provide either 'preview' or 'post'" -msgstr "Yorum formunda ne 'preview', ne de 'post' var" +msgstr "Yorum görüntülememe mi yoksa gönderme amaçlı mı belirsiz" #: contrib/comments/templates/comments/form.html:6 #: contrib/comments/templates/comments/form.html:8 #: contrib/admin/templates/admin/login.html:17 msgid "Username:" -msgstr "Kullanıcı adı:" +msgstr "Kullanıcı:" #: contrib/comments/templates/comments/form.html:6 -#: contrib/admin/templates/admin/login.html:20 -msgid "Password:" -msgstr "Şifre:" - -#: contrib/comments/templates/comments/form.html:6 -msgid "Forgotten your password?" -msgstr "Şifremi unuttum" - -#: 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/object_history.html:3 #: contrib/admin/templates/admin/change_form.html:10 +#: contrib/admin/templates/admin/delete_confirmation.html:3 +#: contrib/admin/templates/admin/base.html:25 #: 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/bookmarklets.html:4 #: contrib/admin/templates/admin_doc/template_detail.html:4 -#: contrib/admin/templates/admin_doc/template_filter_index.html:5 +#: contrib/admin/templates/admin_doc/template_tag_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 +#: contrib/admin/templates/admin_doc/template_filter_index.html:5 msgid "Log out" -msgstr "Çıkış" +msgstr "Çık" + +#: contrib/comments/templates/comments/form.html:8 +#: contrib/admin/templates/admin/login.html:20 +msgid "Password:" +msgstr "Parola:" + +#: contrib/comments/templates/comments/form.html:8 +msgid "Forgotten your password?" +msgstr "Parolanızı mı unuttunuz?" #: contrib/comments/templates/comments/form.html:12 msgid "Ratings" -msgstr "Rating'ler" +msgstr "Reytingler" #: contrib/comments/templates/comments/form.html:12 #: contrib/comments/templates/comments/form.html:23 msgid "Required" -msgstr "Zorunlu" +msgstr "Gerekli" #: contrib/comments/templates/comments/form.html:12 #: contrib/comments/templates/comments/form.html:23 msgid "Optional" -msgstr "İsteğe bağlı" +msgstr "Opsiyonel" #: contrib/comments/templates/comments/form.html:23 msgid "Post a photo" -msgstr "Resim ekle" +msgstr "Resim gönder" -#: contrib/comments/templates/comments/form.html:27 +#: contrib/comments/templates/comments/form.html:28 #: contrib/comments/templates/comments/freeform.html:5 msgid "Comment:" msgstr "Yorum:" -#: contrib/comments/templates/comments/form.html:32 -#: contrib/comments/templates/comments/freeform.html:9 +#: contrib/comments/templates/comments/form.html:35 +#: contrib/comments/templates/comments/freeform.html:10 msgid "Preview comment" -msgstr "Yorum önizleme" +msgstr "Yorumu görüntüle" #: contrib/comments/templates/comments/freeform.html:4 msgid "Your name:" -msgstr "Adınız:" +msgstr "İsminiz:" + +#: contrib/flatpages/models.py:7 contrib/admin/views/doc.py:315 +msgid "URL" +msgstr "URL" + +#: contrib/flatpages/models.py:8 +msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"Örnek: '/about/contact/'. Başında ve sonunda bölü işareti olduğundan emin " +"olun." + +#: contrib/flatpages/models.py:9 +msgid "title" +msgstr "başlık" + +#: contrib/flatpages/models.py:10 +msgid "content" +msgstr "içerik" + +#: contrib/flatpages/models.py:11 +msgid "enable comments" +msgstr "yorumlara izin ver" + +#: contrib/flatpages/models.py:12 +msgid "template name" +msgstr "şablon adı" + +#: contrib/flatpages/models.py:13 +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"Örnek: 'flatpages/contact_page.html'. Eğer birşey yazılmazsa, sistem " +"otomatik olarak 'flatpages/default.html' kullanacak." + +#: contrib/flatpages/models.py:14 +msgid "registration required" +msgstr "kayıt gerekli" + +#: contrib/flatpages/models.py:14 +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "Bu seçili ise, sadece kayıtlı kullanıcılar sayfayı görüntüleyebilir." + +#: contrib/flatpages/models.py:18 +msgid "flat page" +msgstr "düz sayfa" + +#: contrib/flatpages/models.py:19 +msgid "flat pages" +msgstr "düz sayfalar" + +#: contrib/sessions/models.py:51 +msgid "session key" +msgstr "oturum anahtarı" + +#: contrib/sessions/models.py:52 +msgid "session data" +msgstr "oturum bilgisi" + +#: contrib/sessions/models.py:53 +msgid "expire date" +msgstr "bitiş tarihi" + +#: contrib/sessions/models.py:57 +msgid "session" +msgstr "oturum" + +#: contrib/sessions/models.py:58 +msgid "sessions" +msgstr "oturumlar" + +#: contrib/sites/models.py:10 +msgid "domain name" +msgstr "alan adı" + +#: contrib/sites/models.py:11 +msgid "display name" +msgstr "görülen isim" + +#: contrib/sites/models.py:15 +msgid "site" +msgstr "site" + +#: contrib/sites/models.py:16 +msgid "sites" +msgstr "siteler" #: contrib/admin/filterspecs.py:40 #, python-format @@ -346,13 +1390,13 @@ msgid "" "

    By %s:

    \n" "
      \n" msgstr "" -"

      %s:

      \n" +"

      %s nesnesine göre:

      \n" "
        \n" #: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88 -#: contrib/admin/filterspecs.py:143 +#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169 msgid "All" -msgstr "Hepsi" +msgstr "Tümü" #: contrib/admin/filterspecs.py:109 msgid "Any date" @@ -364,7 +1408,7 @@ msgstr "Bugün" #: contrib/admin/filterspecs.py:113 msgid "Past 7 days" -msgstr "Son 7 gün" +msgstr "7 gün içinde" #: contrib/admin/filterspecs.py:115 msgid "This month" @@ -388,274 +1432,353 @@ msgstr "Bilinmiyor" #: contrib/admin/models.py:16 msgid "action time" -msgstr "hareket saati" +msgstr "işlem zamanı" #: contrib/admin/models.py:19 msgid "object id" -msgstr "nesne kodu" +msgstr "nesne no" #: contrib/admin/models.py:20 msgid "object repr" -msgstr "nesne repr gösterimi" +msgstr "nesne kodu" #: contrib/admin/models.py:21 msgid "action flag" -msgstr "hareket işareti" +msgstr "işlem adı" #: contrib/admin/models.py:22 msgid "change message" -msgstr "değişiklik mesajı" +msgstr "mesajı değiştir" #: contrib/admin/models.py:25 msgid "log entry" -msgstr "günlük kaydı" +msgstr "girişi kaydet" #: contrib/admin/models.py:26 msgid "log entries" -msgstr "günlük kayıtları" +msgstr "girişleri kaydet" -#: contrib/admin/templatetags/admin_list.py:228 +#: contrib/admin/templatetags/admin_list.py:230 msgid "All dates" msgstr "Tüm tarihler" -#: 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 "Geçerli bir kullanıcı adı ve şifre giriniz. Her ikisinde de büyük ve küçük harfler farklıdır." - -#: contrib/admin/views/decorators.py:23 -#: contrib/admin/templates/admin/login.html:25 -msgid "Log in" -msgstr "Giriş" - -#: 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 "Oturumunuzun süresi dolmuştur, yeniden giriniz. Merak etmeyin, verileriniz kaydedilmiştir." - -#: 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 "Tarayıcınızın cookie desteği kapalıdır. Cookie desteğini açın, bu sayfayı yeniden yükleyin ve tekrar deneyin." - -#: contrib/admin/views/decorators.py:82 -msgid "Usernames cannot contain the '@' character." -msgstr "Kullanıcı adında '@' karakterini kullanamazsınız." - -#: contrib/admin/views/decorators.py:84 +#: contrib/admin/views/auth.py:17 contrib/admin/views/main.py:257 #, python-format -msgid "Your e-mail address is not your username. Try '%s' instead." -msgstr "E-posta adresiniz, kullanıcı adınız değildir. Yerine '%s' deneyin." +msgid "The %(name)s \"%(obj)s\" was added successfully." +msgstr "\"%(obj)s\" isimli %(name)s eklendi." -#: contrib/admin/views/main.py:226 +#: contrib/admin/views/auth.py:22 contrib/admin/views/main.py:261 +#: contrib/admin/views/main.py:347 +msgid "You may edit it again below." +msgstr "Tekrar düzenleyebilirsiniz." + +#: contrib/admin/views/auth.py:28 +msgid "Add user" +msgstr "Kullanıcı ekle" + +#: contrib/admin/views/main.py:223 msgid "Site administration" msgstr "Site yönetimi" -#: contrib/admin/views/main.py:260 -#, python-format -msgid "The %(name)s \"%(obj)s\" was added successfully." -msgstr "%(name)s \\\"%(obj)s\\\" başarı ile eklenmiştir." - -#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348 -msgid "You may edit it again below." -msgstr "Aşağıda değiştirebilirsiniz." - -#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357 +#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356 #, python-format msgid "You may add another %s below." -msgstr "Aşağıda bir %s daha ekleyebilirsiniz." +msgstr "Yeni bir %s ekleyebilirsiniz." -#: contrib/admin/views/main.py:290 +#: contrib/admin/views/main.py:289 #, python-format msgid "Add %s" msgstr "%s ekle" -#: contrib/admin/views/main.py:336 +#: contrib/admin/views/main.py:335 #, python-format msgid "Added %s." -msgstr "%s eklenmiştir." +msgstr "%s eklendi." -#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338 -#: contrib/admin/views/main.py:340 +#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337 +#: contrib/admin/views/main.py:339 msgid "and" msgstr "ve" -#: contrib/admin/views/main.py:338 +#: contrib/admin/views/main.py:337 #, python-format msgid "Changed %s." -msgstr "%s değiştirilmiştir." +msgstr "%s değiştirildi." -#: contrib/admin/views/main.py:340 +#: contrib/admin/views/main.py:339 #, python-format msgid "Deleted %s." -msgstr "%s silinmiştir." +msgstr "%s silindi." -#: contrib/admin/views/main.py:343 +#: contrib/admin/views/main.py:342 msgid "No fields changed." -msgstr "Herhangi bir alan değiştirilmemiştir." +msgstr "Hiçbir alan değiştirilmedi." -#: contrib/admin/views/main.py:346 +#: contrib/admin/views/main.py:345 #, python-format msgid "The %(name)s \"%(obj)s\" was changed successfully." -msgstr "%(name)s \"%(obj)s\" başarı ile değiştirilmiştir." +msgstr "\"%(obj)s\" isimli %(name)s değiştirildi." -#: contrib/admin/views/main.py:354 +#: contrib/admin/views/main.py:353 #, python-format -msgid "" -"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." -msgstr "%(name)s \\\"%(obj)s\\\" başarı ile eklenmiştir. Aşağida değiştirebilirsiniz." +msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." +msgstr "\"%(obj)s\" isimli %(name)s eklendi. Aşağıda tekrar düzenleyebilirsiniz." -#: contrib/admin/views/main.py:392 +#: contrib/admin/views/main.py:391 #, python-format msgid "Change %s" msgstr "%s değiştir" -#: contrib/admin/views/main.py:470 +#: contrib/admin/views/main.py:473 #, python-format msgid "One or more %(fieldname)s in %(name)s: %(obj)s" -msgstr "%(name)s'daki bir ya da birden fazla %(fieldname)s: %(obj)s" +msgstr "%(name)s içinde bir ya da daha fazla %(fieldname)s: %(obj)s" -#: contrib/admin/views/main.py:475 +#: contrib/admin/views/main.py:478 #, python-format msgid "One or more %(fieldname)s in %(name)s:" -msgstr "%(name)s'daki bir ya da birden fazla %(fieldname)s:" - -#: contrib/admin/views/main.py:508 -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" başarı ile silinmiştir." +msgstr "%(name)s içinde bir ya da daha fazla %(fieldname)s:" #: contrib/admin/views/main.py:511 +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "\"%(obj)s\" isimli %(name)s silindi." + +#: contrib/admin/views/main.py:514 msgid "Are you sure?" msgstr "Emin misiniz?" -#: contrib/admin/views/main.py:533 +#: contrib/admin/views/main.py:536 #, python-format msgid "Change history: %s" -msgstr "Değişiklik tarihçesi: %s" +msgstr "%s için değişiklik geçmişi:" -#: contrib/admin/views/main.py:565 +#: contrib/admin/views/main.py:570 #, python-format msgid "Select %s" msgstr "%s seç" -#: contrib/admin/views/main.py:565 +#: contrib/admin/views/main.py:570 #, python-format msgid "Select %s to change" -msgstr "Değiştirmek için %s seçiniz" +msgstr "Değiştirilecek %s nesnesini seçin" -#: 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/main.py:758 +msgid "Database error" +msgstr "Veritabanı hatası" + +#: contrib/admin/views/decorators.py:24 +#: contrib/admin/templates/admin/login.html:25 +msgid "Log in" +msgstr "Giriş yap" + +#: contrib/admin/views/decorators.py:62 +msgid "" +"Please log in again, because your session has expired. Don't worry: Your " +"submission has been saved." +msgstr "" +"Oturumunuzun süresi geçti. Lütfen tekrar giriş yapın. Endişe etmeyin, " +"gönderiniz kayıt edildi." + +#: contrib/admin/views/decorators.py:69 +msgid "" +"Looks like your browser isn't configured to accept cookies. Please enable " +"cookies, reload this page, and try again." +msgstr "" +"Görünüşe göre tarayıcınız çerezleri kabul etmiyor. Çerez kullanımını aktif " +"hale getirin ve sayfayı yeniden yükleyin." + +#: contrib/admin/views/decorators.py:83 +msgid "Usernames cannot contain the '@' character." +msgstr "Kullanıcı isminde '@' karakteri bulunamaz." + +#: contrib/admin/views/decorators.py:85 +#, python-format +msgid "Your e-mail address is not your username. Try '%s' instead." +msgstr "E-posta adresiniz kullanıcı adınız değil. '%s' kullanın." + +#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48 +#: contrib/admin/views/doc.py:50 +msgid "tag:" +msgstr "etiket:" + +#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79 +#: contrib/admin/views/doc.py:81 +msgid "filter:" +msgstr "filtre:" + +#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137 +#: contrib/admin/views/doc.py:139 +msgid "view:" +msgstr "view:" + +#: contrib/admin/views/doc.py:164 +#, python-format +msgid "App %r not found" +msgstr "%r uygulaması bulunamadı" + +#: contrib/admin/views/doc.py:171 +#, python-format +msgid "Model %r not found in app %r" +msgstr "%r modeli %r uygulamasında bulunamadı" + +#: contrib/admin/views/doc.py:183 +#, python-format +msgid "the related `%s.%s` object" +msgstr "ilgili `%s.%s` nesnesi" + +#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205 +#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224 +msgid "model:" +msgstr "model:" + +#: contrib/admin/views/doc.py:214 +#, python-format +msgid "related `%s.%s` objects" +msgstr "ilgili `%s.%s` nesneleri" + +#: contrib/admin/views/doc.py:219 +#, python-format +msgid "all %s" +msgstr "tüm %s" + +#: contrib/admin/views/doc.py:224 +#, python-format +msgid "number of %s" +msgstr "%s sayısı" + +#: contrib/admin/views/doc.py:229 +#, python-format +msgid "Fields on %s objects" +msgstr "%s nesnesindeki alanlar" + +#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301 +#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309 +#: contrib/admin/views/doc.py:310 contrib/admin/views/doc.py:312 msgid "Integer" msgstr "Tamsayı" -#: contrib/admin/views/doc.py:278 +#: contrib/admin/views/doc.py:292 msgid "Boolean (Either True or False)" -msgstr "Boolean (True ya da False)" +msgstr "Mantıksal (True ya da False)" -#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296 +#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311 #, python-format msgid "String (up to %(maxlength)s)" -msgstr "String (en fazla %(maxlength)s karakter)" +msgstr "Karakter disizi (en fazla %(maxlength)s)" -#: contrib/admin/views/doc.py:280 +#: contrib/admin/views/doc.py:294 msgid "Comma-separated integers" -msgstr "Virgül ile ayrılmış tamsayılar" +msgstr "Virgülle ayrılmış tamsayılar" -#: contrib/admin/views/doc.py:281 +#: contrib/admin/views/doc.py:295 msgid "Date (without time)" msgstr "Tarih (saat yok)" -#: contrib/admin/views/doc.py:282 +#: contrib/admin/views/doc.py:296 msgid "Date (with time)" -msgstr "Tarih (saat ile)" +msgstr "Tarih (saat var)" -#: contrib/admin/views/doc.py:283 +#: contrib/admin/views/doc.py:297 msgid "E-mail address" msgstr "E-posta adresi" -#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287 +#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299 +#: contrib/admin/views/doc.py:302 msgid "File path" msgstr "Dosya yolu" -#: contrib/admin/views/doc.py:285 +#: contrib/admin/views/doc.py:300 msgid "Decimal number" -msgstr "Ondalık sayı" +msgstr "Ondalık sayı:" -#: contrib/admin/views/doc.py:291 +#: contrib/admin/views/doc.py:306 msgid "Boolean (Either True, False or None)" -msgstr "Boolean (True, False, ya da None)" +msgstr "Mantıksal (True, False, ya da None)" -#: contrib/admin/views/doc.py:292 +#: contrib/admin/views/doc.py:307 msgid "Relation to parent model" -msgstr "Ana model ile ilişki" +msgstr "Ana modelle ilişki" -#: contrib/admin/views/doc.py:293 +#: contrib/admin/views/doc.py:308 msgid "Phone number" msgstr "Telefon numarası" -#: contrib/admin/views/doc.py:298 +#: contrib/admin/views/doc.py:313 msgid "Text" msgstr "Metin" -#: contrib/admin/views/doc.py:299 +#: contrib/admin/views/doc.py:314 msgid "Time" msgstr "Saat" -#: 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:316 msgid "U.S. state (two uppercase letters)" -msgstr "ABD eyaleti (iki büyük harf)" +msgstr "Şehir Kodu (iki karakter)" -#: contrib/admin/views/doc.py:302 +#: contrib/admin/views/doc.py:317 msgid "XML text" msgstr "XML metni" -#: contrib/admin/templates/admin/object_history.html:3 +#: contrib/admin/views/doc.py:343 +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s geçerli vir adres kalıbı değil" + +#: contrib/admin/templates/widget/file.html:2 +msgid "Currently:" +msgstr "Şimdiki:" + +#: contrib/admin/templates/widget/file.html:3 +msgid "Change:" +msgstr "Değiştir:" + +#: contrib/admin/templates/widget/date_time.html:3 +msgid "Date:" +msgstr "Tarih:" + +#: contrib/admin/templates/widget/date_time.html:4 +msgid "Time:" +msgstr "Saat:" + #: 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/object_history.html:3 #: contrib/admin/templates/admin/change_form.html:10 +#: contrib/admin/templates/admin/delete_confirmation.html:3 +#: contrib/admin/templates/admin/base.html:25 #: 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 "Dokümantasyon" +msgstr "Dökümantasyon" -#: 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/object_history.html:3 #: contrib/admin/templates/admin/change_form.html:10 +#: contrib/admin/templates/admin/delete_confirmation.html:3 +#: contrib/admin/templates/admin/base.html:25 #: 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/bookmarklets.html:4 #: contrib/admin/templates/admin_doc/template_detail.html:4 -#: contrib/admin/templates/admin_doc/template_filter_index.html:5 +#: contrib/admin/templates/admin_doc/template_tag_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 +#: contrib/admin/templates/admin_doc/template_filter_index.html:5 msgid "Change password" -msgstr "Şifre değiştirme" +msgstr "Parola değiştir" +#: contrib/admin/templates/admin/change_list.html:6 #: 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/invalid_setup.html:4 #: contrib/admin/templates/admin/change_form.html:13 +#: contrib/admin/templates/admin/delete_confirmation.html:6 +#: contrib/admin/templates/admin/base.html:30 #: 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 @@ -663,12 +1786,22 @@ msgstr "Şifre değiştirme" #: contrib/admin/templates/registration/password_change_form.html:4 #: contrib/admin/templates/admin_doc/bookmarklets.html:3 msgid "Home" -msgstr "Ana sayfa" +msgstr "Anasayfa" + +#: contrib/admin/templates/admin/change_list.html:11 +#, python-format +msgid "Add %(name)s" +msgstr "%(name)s Ekle" + +#: contrib/admin/templates/admin/filter.html:2 +#, python-format +msgid " By %(filter_title)s " +msgstr " %(filter_title)s nesnesine göre " #: contrib/admin/templates/admin/object_history.html:5 #: contrib/admin/templates/admin/change_form.html:20 msgid "History" -msgstr "Tarihçe" +msgstr "Geçmiş" #: contrib/admin/templates/admin/object_history.html:18 msgid "Date/time" @@ -680,17 +1813,39 @@ msgstr "Kullanıcı" #: contrib/admin/templates/admin/object_history.html:20 msgid "Action" -msgstr "Hareket" +msgstr "İşlem" #: contrib/admin/templates/admin/object_history.html:26 msgid "DATE_WITH_TIME_FULL" -msgstr "j N Y, H:i" +msgstr "DATE_WITH_TIME_FULL" #: contrib/admin/templates/admin/object_history.html:36 msgid "" "This object doesn't have a change history. It probably wasn't added via this " "admin site." -msgstr "Bu nesne ile ilgili bir tarihçe yoktur. Muhtemelen bu yönetim arayüzü aracılığıyla eklenmemiştir." +msgstr "" +"Bu nesnenin işlem geçmişi yok. Muhtemelen yönetici sayfası dışında bir " +"yerden eklendi." + +#: contrib/admin/templates/admin/search_form.html:8 +msgid "Go" +msgstr "Git" + +#: contrib/admin/templates/admin/search_form.html:10 +#, python-format +msgid "1 result" +msgid_plural "%(counter)s results" +msgstr[0] "1 sonuç" +msgstr[1] "%(counter)s sonuç" + +#: contrib/admin/templates/admin/search_form.html:10 +#, python-format +msgid "%(full_result_count)s total" +msgstr "toplam %(full_result_count)s" + +#: contrib/admin/templates/admin/pagination.html:10 +msgid "Show all" +msgstr "Tümünü göster" #: contrib/admin/templates/admin/base_site.html:4 msgid "Django site admin" @@ -710,28 +1865,36 @@ msgstr "Sunucu hatası (500)" #: contrib/admin/templates/admin/500.html:9 msgid "Server Error (500)" -msgstr "Sunucu hatası (500)" +msgstr "Sunucu Hatası (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 "Bir hata oluştu. Site yöneticilerine e-posta ile gönderildi ve en kısa zamanda düzeltilir. Sabrınız için teşekkür ederiz." +msgstr "" +"Bir hata oluştu. Hata, e-psota ile site yöneticisine bildirildi ve kısa süre " +"içinde çözülecktir. Sabrınız için teşekkürler." -#: contrib/admin/templates/admin/404.html:4 -#: contrib/admin/templates/admin/404.html:8 -msgid "Page not found" -msgstr "Sayfa bulunamamıştır" - -#: contrib/admin/templates/admin/404.html:10 -msgid "We're sorry, but the requested page could not be found." -msgstr "Özür dileriz, sayfa bulunamamıştır." +#: 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 "" +"Veritabanı kurulumu ile ilgili bir problem var. İlgili veritabanı " +"tablolarının kurulu olduğundan ve veritabanının ilgili kullanıcı tarafından " +"okunabilir olduğundan emin olun." #: contrib/admin/templates/admin/index.html:17 #, python-format msgid "Models available in the %(name)s application." msgstr "%(name)s uygulamasındaki modeller." +#: contrib/admin/templates/admin/index.html:18 +#, python-format +msgid "%(name)s" +msgstr "%(name)s" + #: contrib/admin/templates/admin/index.html:28 #: contrib/admin/templates/admin/change_form.html:15 msgid "Add" @@ -743,32 +1906,54 @@ msgstr "Değiştir" #: contrib/admin/templates/admin/index.html:44 msgid "You don't have permission to edit anything." -msgstr "Değiştirme yetkiniz yoktur." +msgstr "İşlem yapmaya yetkiniz yok." #: contrib/admin/templates/admin/index.html:52 msgid "Recent Actions" -msgstr "Son yapılanlar" +msgstr "Geçmiş İşlemler" #: contrib/admin/templates/admin/index.html:53 msgid "My Actions" -msgstr "Hareketlerim" +msgstr "İşlemlerim" #: contrib/admin/templates/admin/index.html:57 msgid "None available" -msgstr "Yok" +msgstr "Hiç yok" -#: contrib/admin/templates/admin/change_list.html:11 -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s ekle" +#: contrib/admin/templates/admin/404.html:4 +#: contrib/admin/templates/admin/404.html:8 +msgid "Page not found" +msgstr "Sayfa bulunamadı" + +#: contrib/admin/templates/admin/404.html:10 +msgid "We're sorry, but the requested page could not be found." +msgstr "Üzgünüm, aradığınız sayfa bulunamadı." + +#: contrib/admin/templates/admin/filters.html:4 +msgid "Filter" +msgstr "Filtrele" + +#: contrib/admin/templates/admin/change_form.html:21 +msgid "View on site" +msgstr "Sitede görüntüle" + +#: contrib/admin/templates/admin/change_form.html:30 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Lütfen aşağıdaki hatayı düzeltin." +msgstr[1] "Lütfen aşağıdaki hataları düzeltin." + +#: contrib/admin/templates/admin/change_form.html:48 +msgid "Ordering" +msgstr "Sıralama:" + +#: contrib/admin/templates/admin/change_form.html:51 +msgid "Order:" +msgstr "Sıra:" #: contrib/admin/templates/admin/login.html:22 msgid "Have you forgotten your password?" -msgstr "Şifremi unuttum" - -#: contrib/admin/templates/admin/base.html:23 -msgid "Welcome," -msgstr "Hoş geldiniz," +msgstr "Şifrenizi mi unuttunuz?" #: contrib/admin/templates/admin/delete_confirmation.html:9 #: contrib/admin/templates/admin/submit_line.html:3 @@ -778,48 +1963,30 @@ msgstr "Sil" #: 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' silinmesi, ilgili nesnelerin silinmesini gerektirir, ancak şu nesneleri silmeye yetkiniz yoktur:" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"'%(escaped_object)s' isimli %(object_name)s nesnesini silmek, bağlantılı " +"nesnelerin silinmesini gerektiriyor, ancak aşağıdaki nesneleri silme " +"yetkiniz yok." #: 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\" silmek istediğinizden emin misiniz? Şunların tamamı silinecektir:" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"\"%(escaped_object)s\" isimli %(object_name)s nesnesini silmek " +"istediğinizdenemin misiniz? Aşağıdaki bağlantılı öğeler silinecek:" #: contrib/admin/templates/admin/delete_confirmation.html:26 msgid "Yes, I'm sure" msgstr "Evet, eminim" -#: contrib/admin/templates/admin/filter.html:2 -#, python-format -msgid " By %(title)s " -msgstr " By %(title)s " - -#: contrib/admin/templates/admin/search_form.html:8 -msgid "Go" -msgstr "Yap" - -#: contrib/admin/templates/admin/change_form.html:21 -msgid "View on site" -msgstr "Görüntüle" - -#: contrib/admin/templates/admin/change_form.html:30 -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Aşağıdaki hatayı düzeltin." -msgstr[1] "Aşağıdaki hataları düzeltin." - -#: contrib/admin/templates/admin/change_form.html:48 -msgid "Ordering" -msgstr "Sıralama" - -#: contrib/admin/templates/admin/change_form.html:51 -msgid "Order:" -msgstr "Sırala:" +#: contrib/admin/templates/admin/base.html:25 +msgid "Welcome," +msgstr "Hoşgeldin," #: contrib/admin/templates/admin/submit_line.html:4 msgid "Save as new" @@ -827,7 +1994,7 @@ msgstr "Yeni olarak kaydet" #: contrib/admin/templates/admin/submit_line.html:5 msgid "Save and add another" -msgstr "Kaydet ve bir tane daha ekle" +msgstr "Kaydet ve yeni bir tane ekle" #: contrib/admin/templates/admin/submit_line.html:6 msgid "Save and continue editing" @@ -837,122 +2004,152 @@ msgstr "Kaydet ve düzenlemeye devam et" msgid "Save" msgstr "Kaydet" +#: contrib/admin/templates/admin/auth/user/add_form.html:6 +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "Önce bir kullanıcı adı ve parola girin. Daha sonra daha fazla bilgi girebilirsiniz." + +#: contrib/admin/templates/admin/auth/user/add_form.html:12 +msgid "Username" +msgstr "Kullanıcı" + +#: contrib/admin/templates/admin/auth/user/add_form.html:18 +msgid "Password" +msgstr "Parola" + +#: contrib/admin/templates/admin/auth/user/add_form.html:23 +msgid "Password (again)" +msgstr "Parola (tekrar)" + +#: contrib/admin/templates/admin/auth/user/add_form.html:24 +msgid "Enter the same password as above, for verification." +msgstr "Onaylamak için, yukarıdaki parolanın aynısını girin." + #: 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 msgid "Password change" -msgstr "Şifre değişikliği" +msgstr "Parola değişimi" #: contrib/admin/templates/registration/password_change_done.html:6 #: contrib/admin/templates/registration/password_change_done.html:10 msgid "Password change successful" -msgstr "Şifre değiştirilmiştir" +msgstr "Parola değişimi başarılı" #: contrib/admin/templates/registration/password_change_done.html:12 msgid "Your password was changed." -msgstr "Şifreniz değiştirilmiştir" +msgstr "Parolanız değiştirildi." #: 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 "Şifreyi resetle" +msgstr "Parolayı sıfırla" #: 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 "Şifrenizi unuttuysanız, aşağıdaki alana e-posta adresinizi giriniz. Yeni bir şifre otomatik olarak üretilir ve e-posta ile gönderilir." +msgstr "" +"Parolanızı mı unuttunuz? E-posta adresinizi aşağıya girin, parolanızı " +"sıfırlayalım ve e-posta adresinize gönderelim." #: contrib/admin/templates/registration/password_reset_form.html:16 msgid "E-mail address:" -msgstr "E-posta:" +msgstr "E-posta adresi:" #: contrib/admin/templates/registration/password_reset_form.html:16 msgid "Reset my password" -msgstr "Şifremi resetle" +msgstr "Parolamı sıfırla" #: contrib/admin/templates/registration/logged_out.html:8 msgid "Thanks for spending some quality time with the Web site today." -msgstr "Sitemizde zaman geçirdiğiniz için teşekkür ederiz." +msgstr "Web sitesinde zaman geçirdiğiniz için teşekkür ederiz." #: contrib/admin/templates/registration/logged_out.html:10 msgid "Log in again" -msgstr "Yeniden giriniz" +msgstr "Tekrar giriş yap" #: contrib/admin/templates/registration/password_reset_done.html:6 #: contrib/admin/templates/registration/password_reset_done.html:10 msgid "Password reset successful" -msgstr "Şifre resetlendi" +msgstr "Parola sıfırlandı." #: 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 "Yeni şifre, verdiğiniz e-posta adresine gönderilmiştir." +msgstr "" +"Yeni şifreniz, e-posta adresinize gönderildi, kısa süre içinde size " +"ulaşacaktır." #: 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 "Güvenliğiniz için eski şifrenizi giriniz, daha sonra yeni şifrenizi iki kez giriniz." +msgstr "" +"Güvenliğiniz için, lütfen eski parolanızı girin, sonra da yeni şifrenizi iki " +"kere girin ve böylece doğru yazdığınızdan emin olun." #: contrib/admin/templates/registration/password_change_form.html:17 msgid "Old password:" -msgstr "Eski şifre:" +msgstr "Eski parola:" #: contrib/admin/templates/registration/password_change_form.html:19 msgid "New password:" -msgstr "Yeni şifre:" +msgstr "Yeni parola:" #: contrib/admin/templates/registration/password_change_form.html:21 msgid "Confirm password:" -msgstr "Yeni şifre (tekrar):" +msgstr "Parolayı onayla:" #: contrib/admin/templates/registration/password_change_form.html:23 msgid "Change my password" -msgstr "Şifremi değiştir" +msgstr "Parolamı değiştir" #: contrib/admin/templates/registration/password_reset_email.html:2 msgid "You're receiving this e-mail because you requested a password reset" -msgstr "Bu mektubu, %(site_name)s'daki kullanıcı hesabınız için yeni şifrenin" +msgstr "Bu e-postayı aldınız çünkü " #: contrib/admin/templates/registration/password_reset_email.html:3 #, python-format msgid "for your user account at %(site_name)s" -msgstr "üretilmesini istediğiniz için aldınız" +msgstr "" +"%(site_name)s adresindeki kullanıcı hesabınız için parola sıfırlama " +"talebinde bulundunuz." #: contrib/admin/templates/registration/password_reset_email.html:5 #, python-format msgid "Your new password is: %(new_password)s" -msgstr "Yeni şifreniz: %(new_password)s" +msgstr "Yeni parolanız: %(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 "Şifrenizi şu sayfadan değiştirebilirsiniz:" +msgstr "Parolanızı değiştirmek için bu adrese gidebilirsiniz:" #: contrib/admin/templates/registration/password_reset_email.html:11 msgid "Your username, in case you've forgotten:" -msgstr "" +msgstr "Unutma ihtimaline karşı, kullanıcı adınız:" #: contrib/admin/templates/registration/password_reset_email.html:13 msgid "Thanks for using our site!" -msgstr "" +msgstr "Teşekkürler!" #: contrib/admin/templates/registration/password_reset_email.html:15 #, python-format msgid "The %(site_name)s team" -msgstr "" +msgstr "%(site_name)s Ekibi" #: contrib/admin/templates/admin_doc/bookmarklets.html:3 msgid "Bookmarklets" -msgstr "" +msgstr "Kısayollar" #: contrib/admin/templates/admin_doc/bookmarklets.html:5 msgid "Documentation bookmarklets" -msgstr "" +msgstr "Döküman kısayolları" #: contrib/admin/templates/admin_doc/bookmarklets.html:9 msgid "" @@ -964,935 +2161,49 @@ msgid "" "as \"internal\" (talk to your system administrator if you aren't sure if\n" "your computer is \"internal\").

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

        Kısayolları kullanabilmek için, bağlantıyı tarayıcınızdaki " +"araç çubuğuna sürükleyin, ya da sağ tıklayıp sık kullanılan adresler " +"listenize ekleyin. Bazı kısayollar, uygulamayı çalıştıran sunucu ile aynı " +"adreste bulunan istemciler tarafından kullanılabilir.

        \n" #: contrib/admin/templates/admin_doc/bookmarklets.html:19 msgid "Documentation for this page" -msgstr "" +msgstr "Bu sayfa için dökümantasyon" #: 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 "" +msgstr "Sizi, bu sayfayı üreten betiğin dökümantasyonuna yönlendirir." #: contrib/admin/templates/admin_doc/bookmarklets.html:22 msgid "Show object ID" -msgstr "" +msgstr "Nesne numarasını göster" #: contrib/admin/templates/admin_doc/bookmarklets.html:23 msgid "" "Shows the content-type and unique ID for pages that represent a single " "object." -msgstr "" +msgstr "Tek bir nesneyi temsil eden sayfaların içerik türünü ve numarasını gösterir." #: contrib/admin/templates/admin_doc/bookmarklets.html:25 msgid "Edit this object (current window)" -msgstr "" +msgstr "Nesneyi düzenle (aynı pencerede)" #: contrib/admin/templates/admin_doc/bookmarklets.html:26 msgid "Jumps to the admin page for pages that represent a single object." -msgstr "" +msgstr "Tek bir nesneyi temsil eden sayfaların yönetim sayfasını gösterir." #: contrib/admin/templates/admin_doc/bookmarklets.html:28 msgid "Edit this object (new window)" -msgstr "" +msgstr "Nesneyi düzenle (yeni pencerede)" #: contrib/admin/templates/admin_doc/bookmarklets.html:29 msgid "As above, but opens the admin page in a new window." -msgstr "" +msgstr "Yukarıdaki gibi, ancak yönetim sayfasını yeni bir pencerede açar." -#: contrib/admin/templates/widget/date_time.html:3 -msgid "Date:" -msgstr "" - -#: contrib/admin/templates/widget/date_time.html:4 -msgid "Time:" -msgstr "" - -#: contrib/admin/templates/widget/file.html:2 -msgid "Currently:" -msgstr "" - -#: contrib/admin/templates/widget/file.html:3 -msgid "Change:" -msgstr "" - -#: contrib/redirects/models.py:7 -msgid "redirect from" -msgstr "" - -#: contrib/redirects/models.py:8 -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" - -#: contrib/redirects/models.py:9 -msgid "redirect to" -msgstr "" - -#: contrib/redirects/models.py:10 -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" - -#: contrib/redirects/models.py:12 -msgid "redirect" -msgstr "" - -#: contrib/redirects/models.py:13 -msgid "redirects" -msgstr "" - -#: contrib/flatpages/models.py:8 -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" - -#: 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 -msgid "" -"Example: 'flatpages/contact_page'. If this isn't provided, the system will " -"use 'flatpages/default'." -msgstr "" - -#: 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 "" - -#: contrib/flatpages/models.py:18 -msgid "flat page" -msgstr "" - -#: contrib/flatpages/models.py:19 -msgid "flat pages" -msgstr "" - -#: contrib/auth/models.py:13 contrib/auth/models.py:26 -msgid "name" -msgstr "" - -#: contrib/auth/models.py:15 -msgid "codename" -msgstr "" - -#: contrib/auth/models.py:17 -msgid "permission" -msgstr "" - -#: contrib/auth/models.py:18 contrib/auth/models.py:27 -msgid "permissions" -msgstr "" - -#: contrib/auth/models.py:29 -msgid "group" -msgstr "" - -#: contrib/auth/models.py:30 contrib/auth/models.py:65 -msgid "groups" -msgstr "" - -#: contrib/auth/models.py:55 -msgid "username" -msgstr "" - -#: contrib/auth/models.py:56 -msgid "first name" -msgstr "" - -#: contrib/auth/models.py:57 -msgid "last name" -msgstr "" - -#: contrib/auth/models.py:58 -msgid "e-mail address" -msgstr "" - -#: contrib/auth/models.py:59 -msgid "password" -msgstr "" - -#: contrib/auth/models.py:59 -msgid "Use '[algo]$[salt]$[hexdigest]'" -msgstr "" - -#: contrib/auth/models.py:60 -msgid "staff status" -msgstr "" - -#: contrib/auth/models.py:60 -msgid "Designates whether the user can log into this admin site." -msgstr "" - -#: contrib/auth/models.py:61 -msgid "active" -msgstr "" - -#: contrib/auth/models.py:62 -msgid "superuser status" -msgstr "" - -#: contrib/auth/models.py:63 -msgid "last login" -msgstr "" - -#: contrib/auth/models.py:64 -msgid "date joined" -msgstr "" - -#: 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 "" - -#: contrib/auth/models.py:67 -msgid "user permissions" -msgstr "" - -#: contrib/auth/models.py:70 -msgid "user" -msgstr "" - -#: contrib/auth/models.py:71 -msgid "users" -msgstr "" - -#: contrib/auth/models.py:76 -msgid "Personal info" -msgstr "" - -#: contrib/auth/models.py:77 -msgid "Permissions" -msgstr "" - -#: contrib/auth/models.py:78 -msgid "Important dates" -msgstr "" - -#: contrib/auth/models.py:79 -msgid "Groups" -msgstr "" - -#: contrib/auth/models.py:219 -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 "" - -#: 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 "" - -#: contrib/sessions/models.py:36 -msgid "session data" -msgstr "" - -#: 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 "j N Y" - -#: utils/translation.py:361 -msgid "DATETIME_FORMAT" -msgstr "j N Y, H:i" - -#: utils/translation.py:362 -msgid "TIME_FORMAT" -msgstr "H:i" - -#: 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" -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] "" - -#: conf/global_settings.py:37 -msgid "Bengali" -msgstr "" - -#: conf/global_settings.py:38 -msgid "Czech" -msgstr "" - -#: conf/global_settings.py:39 -msgid "Welsh" -msgstr "" - -#: conf/global_settings.py:40 -msgid "Danish" -msgstr "" - -#: conf/global_settings.py:41 -msgid "German" -msgstr "" - -#: conf/global_settings.py:42 -msgid "Greek" -msgstr "" - -#: conf/global_settings.py:43 -msgid "English" -msgstr "" - -#: conf/global_settings.py:44 -msgid "Spanish" -msgstr "" - -#: conf/global_settings.py:45 -msgid "French" -msgstr "" - -#: conf/global_settings.py:46 -msgid "Galician" -msgstr "" - -#: conf/global_settings.py:47 -msgid "Hungarian" -msgstr "" - -#: conf/global_settings.py:48 -msgid "Hebrew" -msgstr "" - -#: conf/global_settings.py:49 -msgid "Icelandic" -msgstr "" - -#: conf/global_settings.py:50 -msgid "Italian" -msgstr "" - -#: conf/global_settings.py:51 -msgid "Japanese" -msgstr "" - -#: conf/global_settings.py:52 -msgid "Dutch" -msgstr "" - -#: conf/global_settings.py:53 -msgid "Norwegian" -msgstr "" - -#: conf/global_settings.py:54 -msgid "Brazilian" -msgstr "" - -#: conf/global_settings.py:55 -msgid "Romanian" -msgstr "" - -#: conf/global_settings.py:56 -msgid "Russian" -msgstr "" - -#: conf/global_settings.py:57 -msgid "Slovak" -msgstr "" - -#: conf/global_settings.py:58 -msgid "Slovenian" -msgstr "" - -#: conf/global_settings.py:59 -msgid "Serbian" -msgstr "" - -#: conf/global_settings.py:60 -msgid "Swedish" -msgstr "" - -#: conf/global_settings.py:61 -msgid "Ukrainian" -msgstr "" - -#: conf/global_settings.py:62 -msgid "Simplified Chinese" -msgstr "" - -#: conf/global_settings.py:63 -msgid "Traditional Chinese" -msgstr "" - -#: 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 "" - -#: 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 "" - -#: core/validators.py:128 -msgid "Enter a valid time in HH:MM format." -msgstr "" - -#: core/validators.py:132 db/models/fields/__init__.py:468 -msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format." -msgstr "" - -#: 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 "" - -#: core/validators.py:159 -#, python-format -msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid." -msgstr "" - -#: core/validators.py:167 -#, python-format -msgid "The URL %s does not point to a valid QuickTime video." -msgstr "" - -#: core/validators.py:171 -msgid "A valid URL is required." -msgstr "" - -#: core/validators.py:185 -#, python-format -msgid "" -"Valid HTML is required. Specific errors are:\n" -"%s" -msgstr "" - -#: core/validators.py:192 -#, python-format -msgid "Badly formed XML: %s" -msgstr "" - -#: core/validators.py:202 -#, python-format -msgid "Invalid URL: %s" -msgstr "" - -#: core/validators.py:206 core/validators.py:208 -#, python-format -msgid "The URL %s is a broken link." -msgstr "" - -#: 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." -msgid_plural "Watch your mouth! The words %s are not allowed here." -msgstr[0] "" -msgstr[1] "" - -#: core/validators.py:236 -#, python-format -msgid "This field must match the '%s' field." -msgstr "" - -#: 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 "" - -#: core/validators.py:294 -#, python-format -msgid "This field must be given if %(field)s is not %(value)s" -msgstr "" - -#: 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 "" - -#: 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." -msgid_plural "" -"Please enter a valid decimal number with at most %s total digits." -msgstr[0] "" -msgstr[1] "" - -#: 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] "" -msgstr[1] "" - -#: core/validators.py:362 -#, python-format -msgid "Make sure your uploaded file is at least %s bytes big." -msgstr "" - -#: core/validators.py:363 -#, python-format -msgid "Make sure your uploaded file is at most %s bytes big." -msgstr "" - -#: 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 "" - -#: core/validators.py:429 -#, python-format -msgid "" -"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." -msgstr "" - -#: core/validators.py:462 -#, python-format -msgid "" -"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with " -"\"%(start)s\".)" -msgstr "" - -#: 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 "" - -#: core/validators.py:471 -#, python-format -msgid "" -"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%" -"(start)s\".)" -msgstr "" - -#: core/validators.py:476 -#, python-format -msgid "" -"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%" -"(start)s\".)" -msgstr "" - -#: 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 "" - -#: core/validators.py:485 -#, python-format -msgid "" -"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line " -"starts with \"%(start)s\".)" -msgstr "" - -#: db/models/manipulators.py:302 -#, python-format -msgid "%(object)s with this %(type)s already exists for the given %(field)s." -msgstr "" - -#: db/models/fields/__init__.py:40 -#, python-format -msgid "%(optname)s with this %(fieldname)s already exists." -msgstr "" - -#: 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 "" - -#: db/models/fields/__init__.py:385 -msgid "This field cannot be null." -msgstr "" - -#: db/models/fields/__init__.py:562 -msgid "Enter a valid filename." -msgstr "" - -#: db/models/fields/related.py:43 -#, python-format -msgid "Please enter a valid %s." -msgstr "" - -#: 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 "" - -#: 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] "" -msgstr[1] "" - -#: 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] "" -msgstr[1] "" - -#: 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 "" - -#: forms/__init__.py:645 -msgid "The submitted file is empty." -msgstr "" - -#: forms/__init__.py:699 -msgid "Enter a whole number between -32,768 and 32,767." -msgstr "" - -#: forms/__init__.py:708 -msgid "Enter a positive number." -msgstr "" - -#: forms/__init__.py:717 -msgid "Enter a whole number between 0 and 32,767." -msgstr "" - -#: template/defaultfilters.py:379 +#: template/defaultfilters.py:401 msgid "yes,no,maybe" -msgstr "" +msgstr "evet,hayır,olabilir" + diff --git a/django/conf/locale/tr/LC_MESSAGES/djangojs.mo b/django/conf/locale/tr/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000000000000000000000000000000000000..11192039258cb5294d29ef7ef959a61ca5e4b542 GIT binary patch literal 1508 zcmb7@&ub(_6vs{s2MYiHI)J<79&&8KXEmN!(wP44K{ydlBAr*Ur>Vchyi` zJvza=e}Je5VIy7yz3hMo!M$a25WMWoi+UFX_2j{W-`B~yco8h7-lu-NpIvW$S~&5M z!gw0xcKQFa~G6&?|_eh zSHb7O5?lp80Y(4TF@FHX@6RC8t=3P0w}-p~uKqP7pT{s!T2;#eDBnivm)Q6uRc;bT za(EK+2}~LC7E-5-$3-j?*Ymn+rKxI7*ks(#G`(1;HfP$V?6I(k&QyEoT%n06m|Xv} z%c_e)+sY)BtCZi5d>3nH5L^h>XIVg)jJv|OO z?`u!nNpQj~H#s_3*GaWd9g|u!7zVZFoP~H-?dTj@sz)7)X%};oda9>0odlY?(o-^Y zCebe!r-*GzNoJA}sa}clrqpp2;!+o~-PNf*TE)ZCS4W%P$W4z!>9J6;JCeEc9?`Gp zBIxR(>)kcPjLxOeW$g>&Y?Icnu^l*S)K_1t?dY-dA?g$ZlSXICK@r8SNww~F9JRgX z0E1|qgKpC4Mq@c@tVT->YAiOF7GG&BH5yQicJ#!E)d!+>&ubxZ;jcfWl?v2P!Imi+C^kr@<2zi=KTK{cFuJ+?o_>4Z`9h(25phZ zbc~9EelNT_&e+)3@f_?69p1PUZ$>M3^d#Y{+D98UajCI`Cav^MsHq+!Sz1;bqfD!g zo+M?EZi{&|F}a%G7zfUv#DNNZ@P)DJtR5G}nre$az!_RuOm1JG$IKp_iILh)ctnTS z%RU^SK?7}>g01xDd{)p|-ZMyyVx8yZ9<}EC=u=nF#xy&)nbF3`, 2006. +# +msgid "" +msgstr "" +"Project-Id-Version: Django 0.95\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-09-30 01:31+0300\n" +"PO-Revision-Date: 2006-09-30 01:31+0300\n" +"Last-Translator: Bahadır Kandemir \n" +"Language-Team: Bahadır Kandemir \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: contrib/admin/media/js/SelectFilter2.js:33 +#, perl-format +msgid "Available %s" +msgstr "Mevcut %s" + +#: contrib/admin/media/js/SelectFilter2.js:41 +msgid "Choose all" +msgstr "Hepsini seç" + +#: contrib/admin/media/js/SelectFilter2.js:46 +msgid "Add" +msgstr "Ekle" + +#: contrib/admin/media/js/SelectFilter2.js:48 +msgid "Remove" +msgstr "Kaldır" + +#: contrib/admin/media/js/SelectFilter2.js:53 +#, perl-format +msgid "Chosen %s" +msgstr "Seçilen %s" + +#: contrib/admin/media/js/SelectFilter2.js:54 +msgid "Select your choice(s) and click " +msgstr "Seçiminizi yapın ve tıklayın " + +#: contrib/admin/media/js/SelectFilter2.js:59 +msgid "Clear all" +msgstr "Hepsini temizle" + +#: contrib/admin/media/js/dateparse.js:26 +#: contrib/admin/media/js/calendar.js:24 +msgid "" +"January February March April May June July August September October November " +"December" +msgstr "Ocak Şubat Mart Nisan Mayıs Haziran Temmuz Ağustos Eylül Ekim Kasım " +"Aralık" + +#: contrib/admin/media/js/dateparse.js:27 +msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday" +msgstr "Pazar Pazartesi Salı Çarşamba Perşembe Cuma Cumartesi" + +#: contrib/admin/media/js/calendar.js:25 +msgid "S M T W T F S" +msgstr "P P S Ç P C C" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80 +msgid "Now" +msgstr "Şimdi" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48 +msgid "Clock" +msgstr "Saat" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77 +msgid "Choose a time" +msgstr "Saat seçin" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81 +msgid "Midnight" +msgstr "Geceyarısı" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82 +msgid "6 a.m." +msgstr "Sabah 6" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83 +msgid "Noon" +msgstr "Öğle" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168 +msgid "Cancel" +msgstr "İptal" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111 +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162 +msgid "Today" +msgstr "Bugün" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114 +msgid "Calendar" +msgstr "Takvim" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160 +msgid "Yesterday" +msgstr "Dün" + +#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164 +msgid "Tomorrow" +msgstr "Yarın" diff --git a/django/contrib/admin/templates/admin_doc/view_detail.html b/django/contrib/admin/templates/admin_doc/view_detail.html index ed90657361..ba90399358 100644 --- a/django/contrib/admin/templates/admin_doc/view_detail.html +++ b/django/contrib/admin/templates/admin_doc/view_detail.html @@ -8,7 +8,7 @@

        {{ name }}

        -

        {{ summary|escape }}

        +

        {{ summary }}

        {{ body }}

        diff --git a/django/contrib/admin/views/decorators.py b/django/contrib/admin/views/decorators.py index fce50909f0..9dfe651fe6 100644 --- a/django/contrib/admin/views/decorators.py +++ b/django/contrib/admin/views/decorators.py @@ -87,7 +87,7 @@ def staff_member_required(view_func): # The user data is correct; log in the user in and continue. else: - if user.is_staff: + if user.is_active and user.is_staff: login(request, user) # TODO: set last_login with an event. user.last_login = datetime.datetime.now() diff --git a/django/contrib/auth/create_superuser.py b/django/contrib/auth/create_superuser.py index f42d30539e..2e93c35b93 100644 --- a/django/contrib/auth/create_superuser.py +++ b/django/contrib/auth/create_superuser.py @@ -46,6 +46,7 @@ def createsuperuser(username=None, email=None, password=None): if not username.isalnum(): sys.stderr.write("Error: That username is invalid. Use only letters, digits and underscores.\n") username = None + continue try: User.objects.get(username=username) except User.DoesNotExist: diff --git a/django/contrib/auth/decorators.py b/django/contrib/auth/decorators.py index 8164d8314e..37e948f8fe 100644 --- a/django/contrib/auth/decorators.py +++ b/django/contrib/auth/decorators.py @@ -29,8 +29,8 @@ login_required.__doc__ = ( def permission_required(perm, login_url=LOGIN_URL): """ - Decorator for views that checks if a user has a particular permission - enabled, redirectiing to the log-in page if necessary. + Decorator for views that checks whether a user has a particular permission + enabled, redirecting to the log-in page if necessary. """ return user_passes_test(lambda u: u.has_perm(perm), login_url=login_url) diff --git a/django/contrib/auth/forms.py b/django/contrib/auth/forms.py index 206cd06e06..24c69cb73e 100644 --- a/django/contrib/auth/forms.py +++ b/django/contrib/auth/forms.py @@ -13,7 +13,7 @@ class UserCreationForm(forms.Manipulator): validator_list=[validators.isAlphaNumeric, self.isValidUsername]), forms.PasswordField(field_name='password1', length=30, maxlength=60, is_required=True), forms.PasswordField(field_name='password2', length=30, maxlength=60, is_required=True, - validator_list=[validators.AlwaysMatchesOtherField('password1', "The two password fields didn't match.")]), + validator_list=[validators.AlwaysMatchesOtherField('password1', _("The two password fields didn't match."))]), ) def isValidUsername(self, field_data, all_data): @@ -21,7 +21,7 @@ class UserCreationForm(forms.Manipulator): User.objects.get(username=field_data) except User.DoesNotExist: return - raise validators.ValidationError, 'A user with that username already exists.' + raise validators.ValidationError, _('A user with that username already exists.') def save(self, new_data): "Creates the user." @@ -81,7 +81,7 @@ class PasswordResetForm(forms.Manipulator): try: self.user_cache = User.objects.get(email__iexact=new_data) except User.DoesNotExist: - raise validators.ValidationError, _("That e-mail address doesn't have an associated user acount. Are you sure you've registered?") + raise validators.ValidationError, _("That e-mail address doesn't have an associated user account. Are you sure you've registered?") def save(self, domain_override=None, email_template_name='registration/password_reset_email.html'): "Calculates a new password randomly and sends it to the user" diff --git a/django/contrib/auth/models.py b/django/contrib/auth/models.py index eb5713ba57..73bcfe92aa 100644 --- a/django/contrib/auth/models.py +++ b/django/contrib/auth/models.py @@ -216,6 +216,8 @@ class User(models.Model): def has_module_perms(self, app_label): "Returns True if the user has any permissions in the given app label." + if not self.is_active: + return False if self.is_superuser: return True return bool(len([p for p in self.get_all_permissions() if p[:p.index('.')] == app_label])) diff --git a/django/contrib/sitemaps/templates/sitemap.xml b/django/contrib/sitemaps/templates/sitemap.xml index 3ee4f914f7..ad24c045d4 100644 --- a/django/contrib/sitemaps/templates/sitemap.xml +++ b/django/contrib/sitemaps/templates/sitemap.xml @@ -1,5 +1,6 @@ +{% spaceless %} {% for url in urlset %} {{ url.location|escape }} @@ -8,4 +9,5 @@ {% if url.priority %}{{ url.priority }}{% endif %} {% endfor %} +{% endspaceless %} diff --git a/django/contrib/sitemaps/templates/sitemap_index.xml b/django/contrib/sitemaps/templates/sitemap_index.xml index e9d722ac7f..c89b192ecc 100644 --- a/django/contrib/sitemaps/templates/sitemap_index.xml +++ b/django/contrib/sitemaps/templates/sitemap_index.xml @@ -1,8 +1,4 @@ -{% for location in sitemaps %} - - {{ location|escape }} - -{% endfor %} +{% for location in sitemaps %}{{ location|escape }}{% endfor %} diff --git a/django/core/handlers/base.py b/django/core/handlers/base.py index 62217acdce..213c528952 100644 --- a/django/core/handlers/base.py +++ b/django/core/handlers/base.py @@ -48,7 +48,7 @@ class BaseHandler(object): if hasattr(mw_instance, 'process_exception'): self._exception_middleware.insert(0, mw_instance.process_exception) - def get_response(self, path, request): + def get_response(self, request): "Returns an HttpResponse object for the given HttpRequest" from django.core import exceptions, urlresolvers from django.core.mail import mail_admins @@ -62,7 +62,7 @@ class BaseHandler(object): resolver = urlresolvers.RegexURLResolver(r'^/', settings.ROOT_URLCONF) try: - callback, callback_args, callback_kwargs = resolver.resolve(path) + callback, callback_args, callback_kwargs = resolver.resolve(request.path) # Apply view middleware for middleware_method in self._view_middleware: @@ -89,7 +89,8 @@ class BaseHandler(object): return response except http.Http404, e: if settings.DEBUG: - return self.get_technical_error_response(request, is404=True, exception=e) + from django.views import debug + return debug.technical_404_response(request, e) else: callback, param_dict = resolver.resolve404() return callback(request, **param_dict) @@ -99,39 +100,23 @@ class BaseHandler(object): pass # See http://code.djangoproject.com/ticket/1023 except: # Handle everything else, including SuspiciousOperation, etc. if settings.DEBUG: - return self.get_technical_error_response(request) + from django.views import debug + return debug.technical_500_response(request, *sys.exc_info()) else: # Get the exception info now, in case another exception is thrown later. exc_info = sys.exc_info() receivers = dispatcher.send(signal=signals.got_request_exception) # When DEBUG is False, send an error message to the admins. - subject = 'Error (%s IP): %s' % ((request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS and 'internal' or 'EXTERNAL'), getattr(request, 'path', '')) + subject = 'Error (%s IP): %s' % ((request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS and 'internal' or 'EXTERNAL'), request.path) try: request_repr = repr(request) except: request_repr = "Request repr() unavailable" message = "%s\n\n%s" % (self._get_traceback(exc_info), request_repr) mail_admins(subject, message, fail_silently=True) - return self.get_friendly_error_response(request, resolver) - - def get_friendly_error_response(self, request, resolver): - """ - Returns an HttpResponse that displays a PUBLIC error message for a - fundamental error. - """ - callback, param_dict = resolver.resolve500() - return callback(request, **param_dict) - - def get_technical_error_response(self, request, is404=False, exception=None): - """ - Returns an HttpResponse that displays a TECHNICAL error message for a - fundamental error. - """ - from django.views import debug - if is404: - return debug.technical_404_response(request, exception) - else: - return debug.technical_500_response(request, *sys.exc_info()) + # Return an HttpResponse that displays a friendly error message. + callback, param_dict = resolver.resolve500() + return callback(request, **param_dict) def _get_traceback(self, exc_info=None): "Helper function to return the traceback as a string" diff --git a/django/core/handlers/modpython.py b/django/core/handlers/modpython.py index 41d9a578c5..bf759db068 100644 --- a/django/core/handlers/modpython.py +++ b/django/core/handlers/modpython.py @@ -102,7 +102,7 @@ class ModPythonRequest(http.HttpRequest): 'REQUEST_METHOD': self._req.method, 'SCRIPT_NAME': None, # Not supported 'SERVER_NAME': self._req.server.server_hostname, - 'SERVER_PORT': self._req.server.port, + 'SERVER_PORT': str(self._req.connection.local_addr[1]), 'SERVER_PROTOCOL': self._req.protocol, 'SERVER_SOFTWARE': 'mod_python' } @@ -139,10 +139,6 @@ class ModPythonHandler(BaseHandler): # that use settings now can work from django.conf import settings - if settings.ENABLE_PSYCO: - import psyco - psyco.profile() - # if we need to set up middleware, now that settings works we can do it now. if self._request_middleware is None: self.load_middleware() @@ -150,7 +146,7 @@ class ModPythonHandler(BaseHandler): dispatcher.send(signal=signals.request_started) try: request = ModPythonRequest(req) - response = self.get_response(req.uri, request) + response = self.get_response(request) # Apply response middleware for middleware_method in self._response_middleware: @@ -160,23 +156,20 @@ class ModPythonHandler(BaseHandler): dispatcher.send(signal=signals.request_finished) # Convert our custom HttpResponse object back into the mod_python req. - populate_apache_request(response, req) - return 0 # mod_python.apache.OK + req.content_type = response['Content-Type'] + for key, value in response.headers.items(): + if key != 'Content-Type': + req.headers_out[key] = value + for c in response.cookies.values(): + req.headers_out.add('Set-Cookie', c.output(header='')) + req.status = response.status_code + try: + for chunk in response: + req.write(chunk) + finally: + response.close() -def populate_apache_request(http_response, mod_python_req): - "Populates the mod_python request object with an HttpResponse" - mod_python_req.content_type = http_response['Content-Type'] - for key, value in http_response.headers.items(): - if key != 'Content-Type': - mod_python_req.headers_out[key] = value - for c in http_response.cookies.values(): - mod_python_req.headers_out.add('Set-Cookie', c.output(header='')) - mod_python_req.status = http_response.status_code - try: - for chunk in http_response: - mod_python_req.write(chunk) - finally: - http_response.close() + return 0 # mod_python.apache.OK def handler(req): # mod_python hooks into this function. diff --git a/django/core/handlers/wsgi.py b/django/core/handlers/wsgi.py index 85e234c8d2..2998bd31f6 100644 --- a/django/core/handlers/wsgi.py +++ b/django/core/handlers/wsgi.py @@ -74,7 +74,7 @@ class WSGIRequest(http.HttpRequest): def __init__(self, environ): self.environ = environ self.path = environ['PATH_INFO'] - self.META = environ + self.META = environ self.method = environ['REQUEST_METHOD'].upper() def __repr__(self): @@ -174,10 +174,6 @@ class WSGIHandler(BaseHandler): def __call__(self, environ, start_response): from django.conf import settings - if settings.ENABLE_PSYCO: - import psyco - psyco.profile() - # Set up middleware if needed. We couldn't do this earlier, because # settings weren't available. if self._request_middleware is None: @@ -186,7 +182,7 @@ class WSGIHandler(BaseHandler): dispatcher.send(signal=signals.request_started) try: request = WSGIRequest(environ) - response = self.get_response(request.path, request) + response = self.get_response(request) # Apply response middleware for middleware_method in self._response_middleware: diff --git a/django/core/management.py b/django/core/management.py index 87e5053791..5e709db6ac 100644 --- a/django/core/management.py +++ b/django/core/management.py @@ -103,7 +103,6 @@ def get_sql_create(app): known_models = set([model for model in _get_installed_models(_get_table_list()) if model not in app_models]) pending_references = {} - for model in app_models: output, references = _get_sql_model_create(model, known_models) final_output.extend(output) @@ -147,7 +146,7 @@ def _get_sql_model_create(model, known_models=set()): table_output = [] pending_references = {} for f in opts.fields: - if isinstance(f, models.ForeignKey): + if isinstance(f, (models.ForeignKey, models.OneToOneField)): rel_field = f.rel.get_related_field() data_type = get_rel_data_type(rel_field) else: @@ -398,32 +397,39 @@ get_sql_sequence_reset.help_doc = "Prints the SQL statements for resetting Postg get_sql_sequence_reset.args = APP_ARGS def get_sql_indexes(app): - "Returns a list of the CREATE INDEX SQL statements for the given app." - from django.db import backend, models + "Returns a list of the CREATE INDEX SQL statements for all models in the given app." + from django.db import models output = [] - for model in models.get_models(app): - for f in model._meta.fields: - if f.db_index: - unique = f.unique and 'UNIQUE ' or '' - output.append( - style.SQL_KEYWORD('CREATE %sINDEX' % unique) + ' ' + \ - style.SQL_TABLE('%s_%s' % (model._meta.db_table, f.column)) + ' ' + \ - style.SQL_KEYWORD('ON') + ' ' + \ - style.SQL_TABLE(backend.quote_name(model._meta.db_table)) + ' ' + \ - "(%s);" % style.SQL_FIELD(backend.quote_name(f.column)) - ) + output.extend(get_sql_indexes_for_model(model)) return output get_sql_indexes.help_doc = "Prints the CREATE INDEX SQL statements for the given model module name(s)." get_sql_indexes.args = APP_ARGS +def get_sql_indexes_for_model(model): + "Returns the CREATE INDEX SQL statements for a single model" + from django.db import backend + output = [] + + for f in model._meta.fields: + if f.db_index: + unique = f.unique and 'UNIQUE ' or '' + output.append( + style.SQL_KEYWORD('CREATE %sINDEX' % unique) + ' ' + \ + style.SQL_TABLE('%s_%s' % (model._meta.db_table, f.column)) + ' ' + \ + style.SQL_KEYWORD('ON') + ' ' + \ + style.SQL_TABLE(backend.quote_name(model._meta.db_table)) + ' ' + \ + "(%s);" % style.SQL_FIELD(backend.quote_name(f.column)) + ) + return output + def get_sql_all(app): "Returns a list of CREATE TABLE SQL, initial-data inserts, and CREATE INDEX SQL for the given module." return get_sql_create(app) + get_sql_initial_data(app) + get_sql_indexes(app) get_sql_all.help_doc = "Prints the CREATE TABLE, initial-data and CREATE INDEX SQL statements for the given model module name(s)." get_sql_all.args = APP_ARGS -def syncdb(verbosity=2, interactive=True): +def syncdb(verbosity=1, interactive=True): "Creates the database tables for all apps in INSTALLED_APPS whose tables haven't already been created." from django.db import connection, transaction, models, get_creation_module from django.db.models import signals @@ -457,21 +463,21 @@ def syncdb(verbosity=2, interactive=True): pending_references = {} for app in models.get_apps(): + app_name = app.__name__.split('.')[-2] model_list = models.get_models(app) for model in model_list: # Create the model's database table, if it doesn't already exist. + if verbosity >= 2: + print "Processing %s.%s model" % (app_name, model._meta.object_name) if model._meta.db_table in table_list: continue sql, references = _get_sql_model_create(model, seen_models) seen_models.add(model) created_models.add(model) for refto, refs in references.items(): - try: - pending_references[refto].extend(refs) - except KeyError: - pending_references[refto] = refs + pending_references.setdefault(refto, []).extend(refs) sql.extend(_get_sql_for_pending_references(model, pending_references)) - if verbosity >= 2: + if verbosity >= 1: print "Creating table %s" % model._meta.db_table for statement in sql: cursor.execute(statement) @@ -482,7 +488,7 @@ def syncdb(verbosity=2, interactive=True): sql = _get_many_to_many_sql_for_model(model) if sql: if verbosity >= 2: - print "Creating many-to-many tables for %s model" % model.__name__ + print "Creating many-to-many tables for %s.%s model" % (app_name, model._meta.object_name) for statement in sql: cursor.execute(statement) @@ -491,6 +497,9 @@ def syncdb(verbosity=2, interactive=True): # Send the post_syncdb signal, so individual apps can do whatever they need # to do at this point. for app in models.get_apps(): + app_name = app.__name__.split('.')[-2] + if verbosity >= 2: + print "Running post-sync handlers for application", app_name dispatcher.send(signal=signals.post_syncdb, sender=app, app=app, created_models=created_models, verbosity=verbosity, interactive=interactive) @@ -501,18 +510,37 @@ def syncdb(verbosity=2, interactive=True): if model in created_models: initial_sql = get_sql_initial_data_for_model(model) if initial_sql: - if verbosity >= 2: - print "Installing initial data for %s model" % model._meta.object_name + if verbosity >= 1: + print "Installing initial data for %s.%s model" % (app_name, model._meta.object_name) try: for sql in initial_sql: cursor.execute(sql) except Exception, e: - sys.stderr.write("Failed to install initial SQL data for %s model: %s" % \ - (model._meta.object_name, e)) + sys.stderr.write("Failed to install initial SQL data for %s.%s model: %s" % \ + (app_name, model._meta.object_name, e)) transaction.rollback_unless_managed() else: transaction.commit_unless_managed() + # Install SQL indicies for all newly created models + for app in models.get_apps(): + app_name = app.__name__.split('.')[-2] + for model in models.get_models(app): + if model in created_models: + index_sql = get_sql_indexes_for_model(model) + if index_sql: + if verbosity >= 1: + print "Installing index for %s.%s model" % (app_name, model._meta.object_name) + try: + for sql in index_sql: + cursor.execute(sql) + except Exception, e: + sys.stderr.write("Failed to install index for %s.%s model: %s" % \ + (app_name, model._meta.object_name, e)) + transaction.rollback_unless_managed() + else: + transaction.commit_unless_managed() + syncdb.args = '' def get_admin_index(app): @@ -596,7 +624,7 @@ The full error: """ % (app_name, app_name)) + style.ERROR_OUTPUT(str(e)) + '\n') install.help_doc = "Executes ``sqlall`` for the given app(s) in the current database." install.args = APP_ARGS -def reset(app): +def reset(app, interactive=True): "Executes the equivalent of 'get_sql_reset' in the current database." from django.db import connection, transaction app_name = app.__name__.split('.')[-2] @@ -607,21 +635,25 @@ def reset(app): _check_for_validation_errors(app) sql_list = get_sql_reset(app) - confirm = raw_input(""" + if interactive: + confirm = raw_input(""" You have requested a database reset. This will IRREVERSIBLY DESTROY any data in your database. Are you sure you want to do this? Type 'yes' to continue, or 'no' to cancel: """) + else: + confirm = 'yes' + if confirm == 'yes': try: cursor = connection.cursor() for sql in sql_list: cursor.execute(sql) except Exception, e: - sys.stderr.write(style.ERROR("""Error: %s couldn't be installed. Possible reasons: + sys.stderr.write(style.ERROR("""Error: %s couldn't be reset. Possible reasons: * The database isn't running or isn't configured correctly. - * At least one of the database tables already exists. + * At least one of the database tables doesn't exist. * The SQL was invalid. Hint: Look at the output of 'django-admin.py sqlreset %s'. That's the SQL this command wasn't able to run. The full error: """ % (app_name, app_name)) + style.ERROR_OUTPUT(str(e)) + '\n') @@ -820,7 +852,8 @@ def get_validation_errors(outfile, app=None): validates all models of all installed apps. Writes errors, if any, to outfile. Returns number of errors. """ - from django.db import models + from django.conf import settings + from django.db import models, connection from django.db.models.loading import get_app_errors from django.db.models.fields.related import RelatedObject @@ -862,6 +895,12 @@ def get_validation_errors(outfile, app=None): if f.db_index not in (None, True, False): e.add(opts, '"%s": "db_index" should be either None, True or False.' % f.name) + # Check that maxlength <= 255 if using older MySQL versions. + if settings.DATABASE_ENGINE == 'mysql': + db_version = connection.get_server_version() + if db_version < (5, 0, 3) and isinstance(f, (models.CharField, models.CommaSeparatedIntegerField, models.SlugField)) and f.maxlength > 255: + e.add(opts, '"%s": %s cannot have a "maxlength" greater than 255 when you are using a version of MySQL prior to 5.0.3 (you are using %s).' % (f.name, f.__class__.__name__, '.'.join([str(n) for n in db_version[:3]]))) + # Check to see if the related field will clash with any # existing fields, m2m fields, m2m related objects or related objects if f.rel: @@ -1169,7 +1208,7 @@ def runfcgi(args): runfastcgi(args) runfcgi.args = '[various KEY=val options, use `runfcgi help` for help]' -def test(verbosity, app_labels): +def test(app_labels, verbosity=1): "Runs the test suite for the specified applications" from django.conf import settings from django.db.models import get_app, get_apps @@ -1271,10 +1310,10 @@ def execute_from_command_line(action_mapping=DEFAULT_ACTION_MAPPING, argv=None): help='Tells Django to NOT prompt the user for input of any kind.') parser.add_option('--noreload', action='store_false', dest='use_reloader', default=True, help='Tells Django to NOT use the auto-reloader when running the development server.') - parser.add_option('--verbosity', action='store', dest='verbosity', default='2', + parser.add_option('--verbosity', action='store', dest='verbosity', default='1', type='choice', choices=['0', '1', '2'], help='Verbosity level; 0=minimal output, 1=normal output, 2=all output'), - parser.add_option('--adminmedia', dest='admin_media_path', default='', help='Lets you manually specify the directory to serve admin media from when running the development server.'), + parser.add_option('--adminmedia', dest='admin_media_path', default='', help='Specifies the directory from which to serve admin media for runserver.'), options, args = parser.parse_args(argv[1:]) @@ -1320,7 +1359,7 @@ def execute_from_command_line(action_mapping=DEFAULT_ACTION_MAPPING, argv=None): parser.print_usage_and_exit() elif action == 'test': try: - action_mapping[action](int(options.verbosity), args[1:]) + action_mapping[action](args[1:], int(options.verbosity)) except IndexError: parser.print_usage_and_exit() elif action in ('startapp', 'startproject'): @@ -1354,7 +1393,10 @@ def execute_from_command_line(action_mapping=DEFAULT_ACTION_MAPPING, argv=None): if action not in NO_SQL_TRANSACTION: print style.SQL_KEYWORD("BEGIN;") for mod in mod_list: - output = action_mapping[action](mod) + if action == 'reset': + output = action_mapping[action](mod, options.interactive) + else: + output = action_mapping[action](mod) if output: print '\n'.join(output) if action not in NO_SQL_TRANSACTION: diff --git a/django/core/servers/basehttp.py b/django/core/servers/basehttp.py index fe534d5da0..a16b8b675a 100644 --- a/django/core/servers/basehttp.py +++ b/django/core/servers/basehttp.py @@ -594,7 +594,7 @@ class AdminMediaHandler(object): Use this ONLY LOCALLY, for development! This hasn't been tested for security and is not super efficient. """ - def __init__(self, application, media_dir = None): + def __init__(self, application, media_dir=None): from django.conf import settings self.application = application if not media_dir: diff --git a/django/core/urlresolvers.py b/django/core/urlresolvers.py index 2f557b90a6..45705cb223 100644 --- a/django/core/urlresolvers.py +++ b/django/core/urlresolvers.py @@ -15,7 +15,8 @@ class Resolver404(Http404): pass class NoReverseMatch(Exception): - pass + # Don't make this raise an error when used in a template. + silent_variable_failure = True def get_mod_func(callback): # Converts 'django.views.news.stories.story_detail' to diff --git a/django/core/validators.py b/django/core/validators.py index f2f3f44914..4c3f59143e 100644 --- a/django/core/validators.py +++ b/django/core/validators.py @@ -249,7 +249,7 @@ def hasNoProfanities(field_data, all_data): Watch your mouth! The words "f--k" and "s--t" are not allowed here. """ field_data = field_data.lower() # normalize - words_seen = [w for w in settings.PROFANITIES_LIST if field_data.find(w) > -1] + words_seen = [w for w in settings.PROFANITIES_LIST if w in field_data] if words_seen: from django.utils.text import get_text_list plural = len(words_seen) > 1 @@ -377,7 +377,7 @@ class IsValidFloat(object): if len(data) > max_allowed_length: 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) > (max_allowed_length - self.decimal_places)) or ('.' in data and len(data) > (self.max_digits - (self.decimal_places - len(data.split('.')[1])) + 1)): + if (not '.' in data and len(data) > (max_allowed_length - self.decimal_places - 1)) or ('.' in data and len(data) > (max_allowed_length - (self.decimal_places - len(data.split('.')[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: diff --git a/django/db/backends/mysql/base.py b/django/db/backends/mysql/base.py index 23ea76316f..04e5814988 100644 --- a/django/db/backends/mysql/base.py +++ b/django/db/backends/mysql/base.py @@ -13,6 +13,7 @@ except ImportError, e: from MySQLdb.converters import conversions from MySQLdb.constants import FIELD_TYPE import types +import re DatabaseError = Database.DatabaseError @@ -24,6 +25,12 @@ django_conversions.update({ FIELD_TYPE.TIME: util.typecast_time, }) +# This should match the numerical portion of the version numbers (we can treat +# versions like 5.0.24 and 5.0.24a as the same). Based on the list of version +# at http://dev.mysql.com/doc/refman/4.1/en/news.html and +# http://dev.mysql.com/doc/refman/5.0/en/news.html . +server_version_re = re.compile(r'(\d{1,2})\.(\d{1,2})\.(\d{1,2})') + # This is an extra debug layer over MySQL queries, to display warnings. # It's only used when DEBUG=True. class MysqlDebugWrapper: @@ -61,6 +68,7 @@ class DatabaseWrapper(local): def __init__(self): self.connection = None self.queries = [] + self.server_version = None def _valid_connection(self): if self.connection is not None: @@ -110,6 +118,16 @@ class DatabaseWrapper(local): self.connection.close() self.connection = None + def get_server_version(self): + if not self.server_version: + if not self._valid_connection(): + self.cursor() + m = server_version_re.match(self.connection.get_server_info()) + if not m: + raise Exception('Unable to determine MySQL version from version string %r' % self.connection.get_server_info()) + self.server_version = tuple([int(x) for x in m.groups()]) + return self.server_version + supports_constraints = True def quote_name(name): diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 49eb594838..d82f38527d 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -5,6 +5,7 @@ from django.core import validators from django import forms from django.core.exceptions import ObjectDoesNotExist from django.utils.functional import curry +from django.utils.itercompat import tee from django.utils.text import capfirst from django.utils.translation import gettext, gettext_lazy import datetime, os, time @@ -80,7 +81,7 @@ class Field(object): self.prepopulate_from = prepopulate_from self.unique_for_date, self.unique_for_month = unique_for_date, unique_for_month self.unique_for_year = unique_for_year - self.choices = choices or [] + self._choices = choices or [] self.radio_admin = radio_admin self.help_text = help_text self.db_column = db_column @@ -324,6 +325,14 @@ class Field(object): def bind(self, fieldmapping, original, bound_field_class): return bound_field_class(self, fieldmapping, original) + def _get_choices(self): + if hasattr(self._choices, 'next'): + choices, self._choices = tee(self._choices) + return choices + else: + return self._choices + choices = property(_get_choices) + class AutoField(Field): empty_strings_allowed = False def __init__(self, *args, **kwargs): @@ -367,8 +376,8 @@ class BooleanField(Field): def to_python(self, value): if value in (True, False): return value - if value in ('t', 'True'): return True - if value in ('f', 'False'): return False + if value in ('t', 'True', '1'): return True + if value in ('f', 'False', '0'): return False raise validators.ValidationError, gettext("This value must be either True or False.") def get_manipulator_field_objs(self): diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index aa232c07f3..dfe9a8b81f 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -618,7 +618,7 @@ class ManyToManyField(RelatedField, Field): msg = gettext_lazy('Separate multiple IDs with commas.') else: msg = gettext_lazy('Hold down "Control", or "Command" on a Mac, to select more than one.') - self.help_text = string_concat(self.help_text, msg) + self.help_text = string_concat(self.help_text, ' ', msg) def get_manipulator_field_objs(self): if self.rel.raw_id_admin: diff --git a/django/db/models/manipulators.py b/django/db/models/manipulators.py index faf453b86b..83ddda844e 100644 --- a/django/db/models/manipulators.py +++ b/django/db/models/manipulators.py @@ -177,7 +177,7 @@ class AutomaticManipulator(forms.Manipulator): # case, because they'll be dealt with later. if f == related.field: - param = getattr(new_object, related.field.rel.field_name) + param = getattr(new_object, related.field.rel.get_related_field().attname) elif (not self.change) and isinstance(f, AutoField): param = None elif self.change and (isinstance(f, FileField) or not child_follow.get(f.name, None)): @@ -215,7 +215,10 @@ class AutomaticManipulator(forms.Manipulator): # Save many-to-many objects. for f in related.opts.many_to_many: if child_follow.get(f.name, None) and not f.rel.edit_inline: - setattr(new_rel_obj, f.name, f.rel.to.objects.filter(pk__in=rel_new_data[f.attname])) + new_value = rel_new_data[f.attname] + if f.rel.raw_id_admin: + new_value = new_value[0] + setattr(new_rel_obj, f.name, f.rel.to.objects.filter(pk__in=new_value)) if self.change: self.fields_changed.append('%s for %s "%s"' % (f.verbose_name, related.opts.verbose_name, new_rel_obj)) @@ -300,7 +303,7 @@ def manipulator_validator_unique_together(field_name_list, opts, self, field_dat pass else: raise validators.ValidationError, _("%(object)s with this %(type)s already exists for the given %(field)s.") % \ - {'object': capfirst(opts.verbose_name), 'type': field_list[0].verbose_name, 'field': get_text_list(field_name_list[1:], 'and')} + {'object': capfirst(opts.verbose_name), 'type': field_list[0].verbose_name, 'field': get_text_list([f.verbose_name for f in field_list[1:]], 'and')} def manipulator_validator_unique_for_date(from_field, date_field, opts, lookup_type, self, field_data, all_data): from django.db.models.fields.related import ManyToOneRel diff --git a/django/db/models/query.py b/django/db/models/query.py index eb4b3b63ae..53ed63ae5b 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -707,30 +707,35 @@ def parse_lookup(kwarg_items, opts): joins, where, params = SortedDict(), [], [] for kwarg, value in kwarg_items: - if value is not None: - path = kwarg.split(LOOKUP_SEPARATOR) - # Extract the last elements of the kwarg. - # The very-last is the lookup_type (equals, like, etc). - # The second-last is the table column on which the lookup_type is - # to be performed. If this name is 'pk', it will be substituted with - # the name of the primary key. - # If there is only one part, or the last part is not a query - # term, assume that the query is an __exact - lookup_type = path.pop() - if lookup_type == 'pk': - lookup_type = 'exact' - path.append(None) - elif len(path) == 0 or lookup_type not in QUERY_TERMS: - path.append(lookup_type) - lookup_type = 'exact' + path = kwarg.split(LOOKUP_SEPARATOR) + # Extract the last elements of the kwarg. + # The very-last is the lookup_type (equals, like, etc). + # The second-last is the table column on which the lookup_type is + # to be performed. If this name is 'pk', it will be substituted with + # the name of the primary key. + # If there is only one part, or the last part is not a query + # term, assume that the query is an __exact + lookup_type = path.pop() + if lookup_type == 'pk': + lookup_type = 'exact' + path.append(None) + elif len(path) == 0 or lookup_type not in QUERY_TERMS: + path.append(lookup_type) + lookup_type = 'exact' - if len(path) < 1: - raise TypeError, "Cannot parse keyword query %r" % kwarg + if len(path) < 1: + raise TypeError, "Cannot parse keyword query %r" % kwarg + + if value is None: + # Interpret '__exact=None' as the sql '= NULL'; otherwise, reject + # all uses of None as a query value. + if lookup_type != 'exact': + raise ValueError, "Cannot use None as a query value" - joins2, where2, params2 = lookup_inner(path, lookup_type, value, opts, opts.db_table, None) - joins.update(joins2) - where.extend(where2) - params.extend(params2) + joins2, where2, params2 = lookup_inner(path, lookup_type, value, opts, opts.db_table, None) + joins.update(joins2) + where.extend(where2) + params.extend(params2) return joins, where, params class FieldFound(Exception): diff --git a/django/forms/__init__.py b/django/forms/__init__.py index 759a32ba81..5f47059f03 100644 --- a/django/forms/__init__.py +++ b/django/forms/__init__.py @@ -54,6 +54,7 @@ class Manipulator(object): def get_validation_errors(self, new_data): "Returns dictionary mapping field_names to error-message lists" errors = {} + self.prepare(new_data) for field in self.fields: errors.update(field.get_validation_errors(new_data)) val_name = 'validate_%s' % field.field_name @@ -638,7 +639,7 @@ class CheckboxSelectMultipleField(SelectMultipleField): if str(value) in str_data_list: checked_html = ' checked="checked"' field_name = '%s%s' % (self.field_name, value) - output.append('
      • ' % \ + output.append('
      • ' % \ (self.get_id() + escape(value), self.__class__.__name__, field_name, checked_html, self.get_id() + escape(value), choice)) output.append('
      ') diff --git a/django/middleware/common.py b/django/middleware/common.py index 4f060b8590..6283214fad 100644 --- a/django/middleware/common.py +++ b/django/middleware/common.py @@ -2,6 +2,7 @@ from django.conf import settings from django import http from django.core.mail import mail_managers import md5 +import re class CommonMiddleware(object): """ @@ -61,12 +62,12 @@ class CommonMiddleware(object): # send a note to the managers. domain = http.get_host(request) referer = request.META.get('HTTP_REFERER', None) - is_internal = referer and (domain in referer) + is_internal = _is_internal_request(domain, referer) path = request.get_full_path() if referer and not _is_ignorable_404(path) and (is_internal or '?' not in referer): - ua = request.META.get('HTTP_USER_AGENT','') + ua = request.META.get('HTTP_USER_AGENT', '') mail_managers("Broken %slink on %s" % ((is_internal and 'INTERNAL ' or ''), domain), - "Referrer: %s\nRequested URL: %s\nUser Agent: %s\n" % (referer, request.get_full_path(), ua)) + "Referrer: %s\nRequested URL: %s\nUser agent: %s\n" % (referer, request.get_full_path(), ua)) return response # Use ETags, if requested. @@ -88,3 +89,8 @@ def _is_ignorable_404(uri): if uri.endswith(end): return True return False + +def _is_internal_request(domain, referer): + "Return true if the referring URL is the same domain as the current request" + # Different subdomains are treated as different domains. + return referer is not None and re.match("^https?://%s/" % re.escape(domain), referer) diff --git a/django/template/__init__.py b/django/template/__init__.py index fa75f6c2f5..af8f37a474 100644 --- a/django/template/__init__.py +++ b/django/template/__init__.py @@ -532,7 +532,7 @@ class FilterExpression(object): constant_arg, i18n_arg, var_arg = match.group("constant_arg", "i18n_arg", "var_arg") if i18n_arg: args.append((False, _(i18n_arg.replace(r'\"', '"')))) - elif constant_arg: + elif constant_arg is not None: args.append((False, constant_arg.replace(r'\"', '"'))) elif var_arg: args.append((True, var_arg)) diff --git a/django/test/client.py b/django/test/client.py index 3dfe764a38..6e0b443f83 100644 --- a/django/test/client.py +++ b/django/test/client.py @@ -8,7 +8,7 @@ from django.utils.functional import curry class ClientHandler(BaseHandler): """ - A HTTP Handler that can be used for testing purposes. + A HTTP Handler that can be used for testing purposes. Uses the WSGI interface to compose requests, but returns the raw HttpResponse object """ @@ -24,7 +24,7 @@ class ClientHandler(BaseHandler): dispatcher.send(signal=signals.request_started) try: request = WSGIRequest(environ) - response = self.get_response(request.path, request) + response = self.get_response(request) # Apply response middleware for middleware_method in self._response_middleware: @@ -32,7 +32,7 @@ class ClientHandler(BaseHandler): finally: dispatcher.send(signal=signals.request_finished) - + return response def store_rendered_templates(store, signal, sender, template, context): @@ -44,7 +44,7 @@ def encode_multipart(boundary, data): """ A simple method for encoding multipart POST data from a dictionary of form values. - + The key will be used as the form data name; the value will be transmitted as content. If the value is a file, the contents of the file will be sent as an application/octet-stream; otherwise, str(value) will be sent. @@ -69,7 +69,7 @@ def encode_multipart(boundary, data): '', str(value) ]) - + lines.extend([ '--' + boundary + '--', '', @@ -78,8 +78,8 @@ def encode_multipart(boundary, data): class Client: """ - A class that can act as a client for testing purposes. - + A class that can act as a client for testing purposes. + It allows the user to compose GET and POST requests, and obtain the response that the server gave to those requests. The server Response objects are annotated with the details @@ -88,7 +88,7 @@ class Client: Client objects are stateful - they will retain cookie (and thus session) details for the lifetime of the Client instance. - + This is not intended as a replacement for Twill/Selenium or the like - it is here to allow testing against the contexts and templates produced by a view, rather than the @@ -98,10 +98,10 @@ class Client: self.handler = ClientHandler() self.defaults = defaults self.cookie = SimpleCookie() - + def request(self, **request): """ - The master request method. Composes the environment dictionary + The master request method. Composes the environment dictionary and passes to the handler, returning the result of the handler. Assumes defaults for the query environment, which can be overridden using the arguments to the request. @@ -112,24 +112,24 @@ class Client: 'PATH_INFO': '/', 'QUERY_STRING': '', 'REQUEST_METHOD': 'GET', - 'SCRIPT_NAME': None, + 'SCRIPT_NAME': None, 'SERVER_NAME': 'testserver', 'SERVER_PORT': 80, 'SERVER_PROTOCOL': 'HTTP/1.1', - } + } environ.update(self.defaults) - environ.update(request) + environ.update(request) # Curry a data dictionary into an instance of # the template renderer callback function data = {} on_template_render = curry(store_rendered_templates, data) dispatcher.connect(on_template_render, signal=signals.template_rendered) - + response = self.handler(environ) - + # Add any rendered template detail to the response - # If there was only one template rendered (the most likely case), + # If there was only one template rendered (the most likely case), # flatten the list to a single element for detail in ('template', 'context'): if data.get(detail): @@ -139,12 +139,12 @@ class Client: setattr(response, detail, data[detail]) else: setattr(response, detail, None) - + if response.cookies: self.cookie.update(response.cookies) return response - + def get(self, path, data={}, **extra): "Request a response from the server using GET." r = { @@ -155,12 +155,12 @@ class Client: 'REQUEST_METHOD': 'GET', } r.update(extra) - + return self.request(**r) - + def post(self, path, data={}, **extra): "Request a response from the server using POST." - + BOUNDARY = 'BoUnDaRyStRiNg' encoded = encode_multipart(BOUNDARY, data) @@ -173,25 +173,25 @@ class Client: 'wsgi.input': stream, } r.update(extra) - + return self.request(**r) def login(self, path, username, password, **extra): """ A specialized sequence of GET and POST to log into a view that is protected by a @login_required access decorator. - + path should be the URL of the page that is login protected. - - Returns the response from GETting the requested URL after + + Returns the response from GETting the requested URL after login is complete. Returns False if login process failed. """ - # First, GET the page that is login protected. + # First, GET the page that is login protected. # This page will redirect to the login page. response = self.get(path) if response.status_code != 302: return False - + login_path, data = response['Location'].split('?') next = data.split('=')[1] @@ -199,7 +199,7 @@ class Client: response = self.get(login_path, **extra) if response.status_code != 200: return False - + # Last, POST the login data. form_data = { 'username': username, diff --git a/django/utils/itercompat.py b/django/utils/itercompat.py new file mode 100644 index 0000000000..370988bedb --- /dev/null +++ b/django/utils/itercompat.py @@ -0,0 +1,31 @@ +""" +Providing iterator functions that are not in all version of Python we support. +Where possible, we try to use the system-native version and only fall back to +these implementations if necessary. +""" + +import itertools + +def compat_tee(iterable): + """Return two independent iterators from a single iterable. + + Based on http://www.python.org/doc/2.3.5/lib/itertools-example.html + """ + # Note: Using a dictionary and a list as the default arguments here is + # deliberate and safe in this instance. + def gen(next, data={}, cnt=[0]): + dpop = data.pop + for i in itertools.count(): + if i == cnt[0]: + item = data[i] = next() + cnt[0] += 1 + else: + item = dpop(i) + yield item + next = iter(iterable).next + return gen(next), gen(next) + +if hasattr(itertools, 'tee'): + tee = itertools.tee +else: + tee = compat_tee diff --git a/django/views/generic/create_update.py b/django/views/generic/create_update.py index 034253a549..3a03fa59e4 100644 --- a/django/views/generic/create_update.py +++ b/django/views/generic/create_update.py @@ -102,7 +102,7 @@ def update_object(request, model, object_id=None, slug=None, except ObjectDoesNotExist: raise Http404, "No %s found for %s" % (model._meta.verbose_name, lookup_kwargs) - manipulator = model.ChangeManipulator(getattr(object, object._meta.pk.name), follow=follow) + manipulator = model.ChangeManipulator(getattr(object, object._meta.pk.attname), follow=follow) if request.POST: new_data = request.POST.copy() @@ -142,7 +142,7 @@ def update_object(request, model, object_id=None, slug=None, else: c[key] = value response = HttpResponse(t.render(c)) - populate_xheaders(request, response, model, getattr(object, object._meta.pk.name)) + populate_xheaders(request, response, model, getattr(object, object._meta.pk.attname)) return response def delete_object(request, model, post_delete_redirect, @@ -196,5 +196,5 @@ def delete_object(request, model, post_delete_redirect, else: c[key] = value response = HttpResponse(t.render(c)) - populate_xheaders(request, response, model, getattr(object, object._meta.pk.name)) + populate_xheaders(request, response, model, getattr(object, object._meta.pk.attname)) return response diff --git a/docs/admin_css.txt b/docs/admin_css.txt index ec402f7142..5822e26e45 100644 --- a/docs/admin_css.txt +++ b/docs/admin_css.txt @@ -82,7 +82,7 @@ There are also a few styles for styling text. .help This is a custom class for blocks of inline help text explaining the function of form elements. It makes text smaller and gray, and when applied - to ``p`` elements withing ``.form-row`` elements (see Form Styles below), + to ``p`` elements within ``.form-row`` elements (see Form Styles below), it will offset the text to align with the form field. Use this for help text, instead of ``small quiet``. It works on other elements, but try to put the class on a ``p`` whenever you can. @@ -170,4 +170,4 @@ Labels Form labels should always precede the field, except in the case of checkboxes and radio buttons, where the ``input`` should come first. Any explanation or help text should follow the ``label`` in a ``p`` with class -``.help``. \ No newline at end of file +``.help``. diff --git a/docs/apache_auth.txt b/docs/apache_auth.txt index 72e0841305..b85057924b 100644 --- a/docs/apache_auth.txt +++ b/docs/apache_auth.txt @@ -6,7 +6,7 @@ Since keeping multiple authentication databases in sync is a common problem when dealing with Apache, you can configuring Apache to authenticate against Django's `authentication system`_ directly. For example, you could: - * Serve media files directly from Apache only to authenticated users. + * Serve static/media files directly from Apache only to authenticated users. * Authenticate access to a Subversion_ repository against Django users with a certain permission. diff --git a/docs/api_stability.txt b/docs/api_stability.txt index a9d6904735..18885fbe63 100644 --- a/docs/api_stability.txt +++ b/docs/api_stability.txt @@ -82,7 +82,7 @@ that 90% of Django can be considered forwards-compatible at this point. That said, these APIs should *not* be considered stable, and are likely to change: - - `Forms and validation`_ will most likely be compeltely rewritten to + - `Forms and validation`_ will most likely be completely rewritten to deemphasize Manipulators in favor of validation-aware models. - `Serialization`_ is under heavy development; changes are likely. @@ -91,7 +91,7 @@ change: API changes may be necessary. - Generic relations will most likely be moved out of core and into the - content-types contrib package to avoid core dependacies on optional + content-types contrib package to avoid core dependancies on optional components. - The comments framework, which is yet undocumented, will likely get a complete diff --git a/docs/authentication.txt b/docs/authentication.txt index 31a894512a..2a61ec82b5 100644 --- a/docs/authentication.txt +++ b/docs/authentication.txt @@ -66,8 +66,8 @@ Fields long and can contain any character. See the "Passwords" section below. * ``is_staff`` -- Boolean. Designates whether this user can access the admin site. - * ``is_active`` -- Boolean. Designates whether this user can log into the - Django admin. Set this to ``False`` instead of deleting accounts. + * ``is_active`` -- Boolean. Designates whether this account can be used + to log in. Set this flag to ``False`` instead of deleting accounts. * ``is_superuser`` -- Boolean. Designates that this user has all permissions without explicitly assigning them. * ``last_login`` -- A datetime of the user's last login. Is set to the @@ -99,7 +99,9 @@ custom methods: should prefer using ``is_authenticated()`` to this method. * ``is_authenticated()`` -- Always returns ``True``. This is a way to - tell if the user has been authenticated. + tell if the user has been authenticated. This does not imply any + permissions, and doesn't check if the user is active - it only indicates + that the user has provided a valid username and password. * ``get_full_name()`` -- Returns the ``first_name`` plus the ``last_name``, with a space in between. @@ -120,13 +122,16 @@ custom methods: * ``has_perm(perm)`` -- Returns ``True`` if the user has the specified permission, where perm is in the format ``"package.codename"``. + If the user is inactive, this method will always return ``False``. * ``has_perms(perm_list)`` -- Returns ``True`` if the user has each of the specified permissions, where each perm is in the format - ``"package.codename"``. + ``"package.codename"``. If the user is inactive, this method will + always return ``False``. * ``has_module_perms(package_name)`` -- Returns ``True`` if the user has any permissions in the given package (the Django app label). + If the user is inactive, this method will always return ``False``. * ``get_and_delete_messages()`` -- Returns a list of ``Message`` objects in the user's queue and deletes the messages from the queue. @@ -283,7 +288,10 @@ password is invalid, ``authenticate()`` returns ``None``. Example:: from django.contrib.auth import authenticate user = authenticate(username='john', password='secret') if user is not None: - print "You provided a correct username and password!" + if user.is_active: + print "You provided a correct username and password!" + else: + print "Your account has been disabled!" else: print "Your username and password were incorrect." @@ -301,10 +309,13 @@ This example shows how you might use both ``authenticate()`` and ``login()``:: password = request.POST['password'] user = authenticate(username=username, password=password) if user is not None: - login(request, user) - # Redirect to a success page. + if user.is_active: + login(request, user) + # Redirect to a success page. + else: + # Return a 'disabled account' error message else: - # Return an error message. + # Return an 'invalid login' error message. How to log a user out --------------------- @@ -456,9 +467,9 @@ As a shortcut, you can use the convenient ``user_passes_test`` decorator:: # ... my_view = user_passes_test(lambda u: u.has_perm('polls.can_vote'))(my_view) -We are using this particular test as a relatively simple example, however be -aware that if you just want to test if a permission is available to a user, -you can use the ``permission_required()`` decorator described below. +We're using this particular test as a relatively simple example. However, if +you just want to test whether a permission is available to a user, you can use +the ``permission_required()`` decorator, described later in this document. Here's the same thing, using Python 2.4's decorator syntax:: @@ -495,20 +506,30 @@ Example in Python 2.4 syntax:: The permission_required decorator ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Since checking whether a user has a particular permission available to them is a -relatively common operation, Django provides a shortcut for that particular -case: the ``permission_required()`` decorator. Using this decorator, the -earlier example can be written as:: +**New in Django development version** + +It's a relatively common task to check whether a user has a particular +permission. For that reason, Django provides a shortcut for that case: the +``permission_required()`` decorator. Using this decorator, the earlier example +can be written as:: from django.contrib.auth.decorators import permission_required - + def my_view(request): # ... - my_view = permission_required('polls.can_vote')(my_view) Note that ``permission_required()`` also takes an optional ``login_url`` -parameter. +parameter. Example:: + + from django.contrib.auth.decorators import permission_required + + def my_view(request): + # ... + my_view = permission_required('polls.can_vote', login_url='/loginpage/')(my_view) + +As in the ``login_required`` decorator, ``login_url`` defaults to +``'/accounts/login/'``. Limiting access to generic views -------------------------------- @@ -633,7 +654,7 @@ The currently logged-in user, either a ``User`` instance or an``AnonymousUser`` instance, is stored in the template variable ``{{ user }}``:: {% if user.is_authenticated %} -

      Welcome, {{ user.username }}. Thanks for logging in.

      +

      Welcome, {{ user.username }}. Thanks for logging in.

      {% else %}

      Welcome, new user. Please log in.

      {% endif %} diff --git a/docs/contributing.txt b/docs/contributing.txt index 7ecda7425c..6ff0b038a3 100644 --- a/docs/contributing.txt +++ b/docs/contributing.txt @@ -259,10 +259,10 @@ The tests cover: We appreciate any and all contributions to the test suite! The Django tests all use the testing infrastructure that ships with Django for -testing applications. See `Testing Django Applications`_ for an explanation of +testing applications. See `Testing Django applications`_ for an explanation of how to write new tests. -.. _Testing Django Applications: http://www.djangoproject.com/documentation/testing/ +.. _Testing Django applications: http://www.djangoproject.com/documentation/testing/ Running the unit tests ---------------------- @@ -273,7 +273,7 @@ To run the tests, ``cd`` to the ``tests/`` directory and type:: Yes, the unit tests need a settings module, but only for database connection info -- the ``DATABASE_ENGINE``, ``DATABASE_USER`` and ``DATABASE_PASSWORD``. -You will also need a ``ROOT_URLCONF`` setting (it's value is ignored; it just +You will also need a ``ROOT_URLCONF`` setting (its value is ignored; it just needs to be present) and a ``SITE_ID`` setting (any integer value will do) in order for all the tests to pass. diff --git a/docs/db-api.txt b/docs/db-api.txt index 0d1f049601..2f0c8b0589 100644 --- a/docs/db-api.txt +++ b/docs/db-api.txt @@ -876,15 +876,18 @@ The database API supports the following lookup types: exact ~~~~~ -Exact match. +Exact match. If the value provided for comparison is ``None``, it will +be interpreted as an SQL ``NULL`` (See isnull_ for more details). -Example:: +Examples:: Entry.objects.get(id__exact=14) + Entry.objects.get(id__exact=None) -SQL equivalent:: +SQL equivalents:: SELECT ... WHERE id = 14; + SELECT ... WHERE id = NULL; iexact ~~~~~~ @@ -1103,8 +1106,8 @@ such as January 3, July 3, etc. isnull ~~~~~~ -``NULL`` or ``IS NOT NULL`` match. Takes either ``True`` or ``False``, which -correspond to ``IS NULL`` and ``IS NOT NULL``, respectively. +Takes either ``True`` or ``False``, which correspond to SQL queries of +``IS NULL`` and ``IS NOT NULL``, respectively. Example:: @@ -1114,6 +1117,14 @@ SQL equivalent:: SELECT ... WHERE pub_date IS NULL; +.. admonition:: ``__isnull=True`` vs ``__exact=None`` + + There is an important difference between ``__isnull=True`` and + ``__exact=None``. ``__exact=None`` will *always* return an empty result + set, because SQL requires that no value is equal to ``NULL``. + ``__isnull`` determines if the field is currently holding the value + of ``NULL`` without performing a comparison. + search ~~~~~~ diff --git a/docs/django-admin.txt b/docs/django-admin.txt index ed162f0520..7f9682b443 100644 --- a/docs/django-admin.txt +++ b/docs/django-admin.txt @@ -392,10 +392,10 @@ and `2` is verbose output. Example usage:: django-admin.py manage.py --adminmedia=/tmp/new-admin-style/ -Tell Django where to find the various stylesheets and Javascript files for the -admin interface when running the development server. Normally these files are -served out of the Django source tree, but since some designers change these -files for their site, this option allows you to test against custom versions. +Tells Django where to find the various CSS and JavaScript files for the admin +interface when running the development server. Normally these files are served +out of the Django source tree, but because some designers customize these files +for their site, this option allows you to test against custom versions. Extra niceties ============== diff --git a/docs/faq.txt b/docs/faq.txt index 204c69244d..eaccc6be43 100644 --- a/docs/faq.txt +++ b/docs/faq.txt @@ -227,9 +227,7 @@ When will you release Django 1.0? Short answer: When we're comfortable with Django's APIs, have added all features that we feel are necessary to earn a "1.0" status, and are ready to -begin maintaining backwards compatibility. This should happen in a couple of -months or so, although it's entirely possible that it could happen earlier. -That translates into summer 2006. +begin maintaining backwards compatibility. The merging of Django's `magic-removal branch`_ went a long way toward Django 1.0. @@ -313,6 +311,18 @@ PostgreSQL fans, and MySQL_ and `SQLite 3`_ are also supported. .. _MySQL: http://www.mysql.com/ .. _`SQLite 3`: http://www.sqlite.org/ +Do I lose anything by using Python 2.3 versus newer Python versions, such as Python 2.5? +---------------------------------------------------------------------------------------- + +No. Django itself is guaranteed to work with any version of Python from 2.3 +and higher. + +If you use a Python version newer than 2.3, you will, of course, be able to +take advantage of newer Python features in your own code, along with the speed +improvements and other optimizations that have been made to the Python language +itself. But the Django framework itself should work equally well on 2.3 as it +does on 2.4 or 2.5. + Do I have to use mod_python? ---------------------------- @@ -487,7 +497,7 @@ specify an object to edit or delete. How do I add database-specific options to my CREATE TABLE statements, such as specifying MyISAM as the table type? ------------------------------------------------------------------------------------------------------------------ -We try to avoid adding special cases in the Django code to accomodate all the +We try to avoid adding special cases in the Django code to accommodate all the database-specific options such as table type, etc. If you'd like to use any of these options, create an `SQL initial data file`_ that contains ``ALTER TABLE`` statements that do what you want to do. The initial data files are executed in diff --git a/docs/forms.txt b/docs/forms.txt index 0ffb0bdcb7..4a4ba37289 100644 --- a/docs/forms.txt +++ b/docs/forms.txt @@ -211,7 +211,7 @@ Below is the finished view:: def create_place(request): manipulator = Place.AddManipulator() - if request.POST: + if request.method == 'POST': # If data was POSTed, we're trying to create a new Place. new_data = request.POST.copy() @@ -309,7 +309,7 @@ about editing an existing one? It's shockingly similar to creating a new one:: # Grab the Place object in question for future use. place = manipulator.original_object - if request.POST: + if request.method == 'POST': new_data = request.POST.copy() errors = manipulator.get_validation_errors(new_data) if not errors: @@ -337,8 +337,8 @@ The only real differences are: object being edited. * We set ``new_data`` based upon ``flatten_data()`` from the manipulator. - ``flatten_data()`` takes the data from the original object under - manipulation, and converts it into a data dictionary that can be used + ``flatten_data()`` takes the data from the original object under + manipulation, and converts it into a data dictionary that can be used to populate form elements with the existing values for the object. * The above example uses a different template, so create and edit can be @@ -391,7 +391,7 @@ Here's a simple function that might drive the above form:: def contact_form(request): manipulator = ContactManipulator() - if request.POST: + if request.method == 'POST': new_data = request.POST.copy() errors = manipulator.get_validation_errors(new_data) if not errors: @@ -404,7 +404,7 @@ Here's a simple function that might drive the above form:: errors = new_data = {} form = forms.FormWrapper(manipulator, new_data, errors) return render_to_response('contact_form.html', {'form': form}) - + ``FileField`` and ``ImageField`` special cases ============================================== @@ -481,15 +481,15 @@ the data being validated. Also, because consistency in user interfaces is important, we strongly urge you to put punctuation at the end of your validation messages. -When Are Validators Called? +When are validators called? --------------------------- After a form has been submitted, Django first checks to see that all the required fields are present and non-empty. For each field that passes that test *and if the form submission contained data* for that field, all the -validators for that field are called in turn. The emphasised portion in the +validators for that field are called in turn. The emphasized portion in the last sentence is important: if a form field is not submitted (because it -contains no data -- which is normal HTML behaviour), the validators are not +contains no data -- which is normal HTML behavior), the validators are not run against the field. This feature is particularly important for models using @@ -497,18 +497,17 @@ This feature is particularly important for models using ``forms.CheckBoxField``. If the checkbox is not selected, it will not contribute to the form submission. -If you would like your validator to *always* run, regardless of whether the -field it is attached to contains any data, set the ``always_test`` attribute -on the validator function. For example:: +If you would like your validator to run *always*, regardless of whether its +attached field contains any data, set the ``always_test`` attribute on the +validator function. For example:: def my_custom_validator(field_data, all_data): # ... - my_custom_validator.always_test = True This validator will always be executed for any field it is attached to. -Ready-made Validators +Ready-made validators --------------------- Writing your own validator is not difficult, but there are some situations @@ -580,7 +579,7 @@ fails. If no message is passed in, a default message is used. ``ValidateIfOtherFieldEquals`` Takes three parameters: ``other_field``, ``other_value`` and ``validator_list``, in that order. If ``other_field`` has a value of - ``other_vaue``, then the validators in ``validator_list`` are all run + ``other_value``, then the validators in ``validator_list`` are all run against the current field. ``RequiredIfOtherFieldNotGiven`` diff --git a/docs/generic_views.txt b/docs/generic_views.txt index fdab97de27..99a9b7cf6b 100644 --- a/docs/generic_views.txt +++ b/docs/generic_views.txt @@ -184,7 +184,7 @@ a date in the *future* are not included unless you set ``allow_future`` to the view's template. See the `RequestContext docs`_. * ``mimetype``: The MIME type to use for the resulting document. Defaults - to the value of the ``DEFAULT_MIME_TYPE`` setting. + to the value of the ``DEFAULT_CONTENT_TYPE`` setting. * ``allow_future``: A boolean specifying whether to include "future" objects on this page, where "future" means objects in which the field @@ -270,7 +270,7 @@ to ``True``. this is ``False``. * ``mimetype``: The MIME type to use for the resulting document. Defaults - to the value of the ``DEFAULT_MIME_TYPE`` setting. + to the value of the ``DEFAULT_CONTENT_TYPE`` setting. * ``allow_future``: A boolean specifying whether to include "future" objects on this page, where "future" means objects in which the field @@ -357,7 +357,7 @@ date in the *future* are not displayed unless you set ``allow_future`` to determining the variable's name. * ``mimetype``: The MIME type to use for the resulting document. Defaults - to the value of the ``DEFAULT_MIME_TYPE`` setting. + to the value of the ``DEFAULT_CONTENT_TYPE`` setting. * ``allow_future``: A boolean specifying whether to include "future" objects on this page, where "future" means objects in which the field @@ -438,7 +438,7 @@ in the *future* are not displayed unless you set ``allow_future`` to ``True``. determining the variable's name. * ``mimetype``: The MIME type to use for the resulting document. Defaults - to the value of the ``DEFAULT_MIME_TYPE`` setting. + to the value of the ``DEFAULT_CONTENT_TYPE`` setting. * ``allow_future``: A boolean specifying whether to include "future" objects on this page, where "future" means objects in which the field @@ -523,7 +523,7 @@ you set ``allow_future`` to ``True``. determining the variable's name. * ``mimetype``: The MIME type to use for the resulting document. Defaults - to the value of the ``DEFAULT_MIME_TYPE`` setting. + to the value of the ``DEFAULT_CONTENT_TYPE`` setting. * ``allow_future``: A boolean specifying whether to include "future" objects on this page, where "future" means objects in which the field @@ -633,7 +633,7 @@ future, the view will throw a 404 error by default, unless you set to use in the template context. By default, this is ``'object'``. * ``mimetype``: The MIME type to use for the resulting document. Defaults - to the value of the ``DEFAULT_MIME_TYPE`` setting. + to the value of the ``DEFAULT_CONTENT_TYPE`` setting. * ``allow_future``: A boolean specifying whether to include "future" objects on this page, where "future" means objects in which the field @@ -707,7 +707,7 @@ A page representing a list of objects. determining the variable's name. * ``mimetype``: The MIME type to use for the resulting document. Defaults - to the value of the ``DEFAULT_MIME_TYPE`` setting. + to the value of the ``DEFAULT_CONTENT_TYPE`` setting. **Template name:** @@ -819,7 +819,7 @@ A page representing an individual object. to use in the template context. By default, this is ``'object'``. * ``mimetype``: The MIME type to use for the resulting document. Defaults - to the value of the ``DEFAULT_MIME_TYPE`` setting. + to the value of the ``DEFAULT_CONTENT_TYPE`` setting. **Template name:** diff --git a/docs/install.txt b/docs/install.txt index fb1bd73122..ff8e1a8318 100644 --- a/docs/install.txt +++ b/docs/install.txt @@ -84,9 +84,12 @@ Installing the official version Note that the last command will automatically download and install setuptools_ if you don't already have it installed. This requires a working Internet +connection and may cause problems on Python 2.5. If you run into problems, +try using our development version by following the instructions below. The +development version no longer uses setuptools nor requires an Internet connection. -This will install Django in your Python installation's ``site-packages`` +The command will install Django in your Python installation's ``site-packages`` directory. .. _setuptools: http://peak.telecommunity.com/DevCenter/setuptools @@ -94,19 +97,34 @@ directory. Installing the development version ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -1. Make sure you have Subversion_ installed. -2. ``svn co http://code.djangoproject.com/svn/django/trunk/ django_src`` -3. Symlink ``django_src/django`` so that ``django`` is within your Python - ``site-packages`` directory: +If you'd like to be able to update your Django code occasionally with the +latest bug fixes and improvements, follow these instructions: - ``ln -s `pwd`/django_src/django /usr/lib/python2.3/site-packages/django`` +1. Make sure you have Subversion_ installed. +2. Check out the Django code into your Python ``site-packages`` directory. + On Linux / Mac OSX / Unix, do this:: + + svn co http://code.djangoproject.com/svn/django/trunk/ django_src + ln -s `pwd`/django_src/django /usr/lib/python2.3/site-packages/django (In the above line, change ``python2.3`` to match your current Python version.) -You don't have to run ``python setup.py install``. + On Windows, do this:: -When you want to update your code, just run the command ``svn update`` from -within the ``django_src`` directory. + svn co http://code.djangoproject.com/svn/django/trunk/django c:\Python24\lib\site-packages\django + +4. Copy the file ``django_src/django/bin/django-admin.py`` to somewhere on your + system path, such as ``/usr/local/bin`` (Unix) or ``C:\Python24\Scripts`` + (Windows). This step simply lets you type ``django-admin.py`` from within + any directory, rather than having to qualify the command with the full path + to the file. + +You *don't* have to run ``python setup.py install``, because that command +takes care of steps 3 and 4 for you. + +When you want to update your copy of the Django source code, just run the +command ``svn update`` from within the ``django`` directory. When you do this, +Subversion will automatically download any changes. .. _`download page`: http://www.djangoproject.com/download/ .. _Subversion: http://subversion.tigris.org/ diff --git a/docs/model-api.txt b/docs/model-api.txt index c6c4200239..1aa8c811f4 100644 --- a/docs/model-api.txt +++ b/docs/model-api.txt @@ -188,7 +188,8 @@ JavaScript shortcuts. ~~~~~~~~~~~~~~ A ``CharField`` that checks that the value is a valid e-mail address. -This doesn't accept ``maxlength``. +This doesn't accept ``maxlength``; its ``maxlength`` is automatically set to +75. ``FileField`` ~~~~~~~~~~~~~ @@ -545,7 +546,7 @@ The default value for the field. If ``False``, the field will not be editable in the admin or via form processing using the object's ``AddManipulator`` or ``ChangeManipulator`` -classes. Default is ``True``. +classes. Default is ``True``. ``help_text`` ~~~~~~~~~~~~~ diff --git a/docs/release_notes_0.95.txt b/docs/release_notes_0.95.txt index e5b89e5a7a..3709cacf5a 100644 --- a/docs/release_notes_0.95.txt +++ b/docs/release_notes_0.95.txt @@ -110,7 +110,7 @@ many common questions appear with some regularity, and any particular problem may already have been answered. Finally, for those who prefer the more immediate feedback offered by IRC, -there's a #django channel or irc.freenode.net that is regularly populated by +there's a #django channel on irc.freenode.net that is regularly populated by Django users and developers from around the world. Friendly people are usually available at any hour of the day -- to help, or just to chat. diff --git a/docs/request_response.txt b/docs/request_response.txt index 1f3b9d5804..006ac6b648 100644 --- a/docs/request_response.txt +++ b/docs/request_response.txt @@ -341,9 +341,9 @@ hard-coded strings. If you use this technique, follow these guidelines: Methods ------- -``__init__(content='', mimetype=DEFAULT_MIME_TYPE)`` +``__init__(content='', mimetype=DEFAULT_CONTENT_TYPE)`` Instantiates an ``HttpResponse`` object with the given page content (a - string) and MIME type. The ``DEFAULT_MIME_TYPE`` is ``'text/html'``. + string) and MIME type. The ``DEFAULT_CONTENT_TYPE`` is ``'text/html'``. ``content`` can be an iterator or a string. If it's an iterator, it should return strings, and those strings will be joined together to form the diff --git a/docs/serialization.txt b/docs/serialization.txt index 694e2d25db..aee1b9a3bb 100644 --- a/docs/serialization.txt +++ b/docs/serialization.txt @@ -3,12 +3,12 @@ Serializing Django objects ========================== .. note:: - + This API is currently under heavy development and may change -- perhaps drastically -- in the future. - + You have been warned. - + Django's serialization framework provides a mechanism for "translating" Django objects into other formats. Usually these other formats will be text-based and used for sending Django objects over a wire, but it's possible for a @@ -21,7 +21,7 @@ At the highest level, serializing data is a very simple operation:: from django.core import serializers data = serializers.serialize("xml", SomeModel.objects.all()) - + The arguments to the ``serialize`` function are the format to serialize the data to (see `Serialization formats`_) and a QuerySet_ to serialize. (Actually, the second argument can be any iterator that yields Django objects, @@ -34,7 +34,7 @@ You can also use a serializer object directly:: xml_serializer = serializers.get_serializer("xml") xml_serializer.serialize(queryset) data = xml_serializer.getvalue() - + This is useful if you want to serialize data directly to a file-like object (which includes a HTTPResponse_):: @@ -50,7 +50,7 @@ Deserializing data is also a fairly simple operation:: for obj in serializers.deserialize("xml", data): do_something_with(obj) - + As you can see, the ``deserialize`` function takes the same format argument as ``serialize``, a string or stream of data, and returns an iterator. @@ -69,7 +69,7 @@ something like:: for deserialized_object in serializers.deserialize("xml", data): if object_should_be_saved(deserialized_object): obj.save() - + In other words, the usual use is to examine the deserialized objects to make sure that they are "appropriate" for saving before doing so. Of course, if you trust your data source you could just save the object and move on. @@ -89,22 +89,22 @@ Django "ships" with a few included serializers: bundled with Django). ``python`` Translates to and from "simple" Python objects (lists, dicts, - strings, etc.). Not really all that useful on its own, but + strings, etc.). Not really all that useful on its own, but used as a base for other serializers. ========== ============================================================== .. _json: http://json.org/ .. _simplejson: http://undefined.org/python/#simplejson -Notes For Specific Serialization Formats +Notes for specific serialization formats ---------------------------------------- json ~~~~ -If you are using UTF-8 (or any other non-ASCII encoding) data with the JSON +If you're using UTF-8 (or any other non-ASCII encoding) data with the JSON serializer, you must pass ``ensure_ascii=False`` as a parameter to the -``serialize()`` call. Otherwise the output will not be encoded correctly. +``serialize()`` call. Otherwise, the output won't be encoded correctly. For example:: diff --git a/docs/settings.txt b/docs/settings.txt index 65113b3c30..0e808c018b 100644 --- a/docs/settings.txt +++ b/docs/settings.txt @@ -401,15 +401,6 @@ Subject-line prefix for e-mail messages sent with ``django.core.mail.mail_admins or ``django.core.mail.mail_managers``. You'll probably want to include the trailing space. -ENABLE_PSYCO ------------- - -Default: ``False`` - -Whether to enable Psyco, which optimizes Python code. Requires Psyco_. - -.. _Psyco: http://psyco.sourceforge.net/ - IGNORABLE_404_ENDS ------------------ @@ -599,8 +590,11 @@ See also ``APPEND_SLASH``. PROFANITIES_LIST ---------------- -A list of profanities that will trigger a validation error when the -``hasNoProfanities`` validator is called. +A tuple of profanities, as strings, that will trigger a validation error when +the ``hasNoProfanities`` validator is called. + +We don't list the default values here, because that would be profane. To see +the default values, see the file ``django/conf/global_settings.py``. ROOT_URLCONF ------------ diff --git a/docs/templates.txt b/docs/templates.txt index c9e76d6c94..b263a64aec 100644 --- a/docs/templates.txt +++ b/docs/templates.txt @@ -540,6 +540,11 @@ The arguments can be hard-coded strings, so the following is valid:: ... {% endifequal %} +It is only possible to compare an argument to template variables or strings. +You cannot check for equality with Python objects such as ``True`` or +``False``. If you need to test if something is true or false, use the ``if`` +and ``ifnot`` tags instead. + ifnotequal ~~~~~~~~~~ @@ -1051,7 +1056,7 @@ Formats a date as the time since that date (i.e. "4 days, 6 hours"). Takes an optional argument that is a variable containing the date to use as the comparison point (without the argument, the comparison point is *now*). For example, if ``blog_date`` is a date instance representing midnight on 1 -June 2006, and ``comment_date`` is a date instanace for 08:00 on 1 June 2006, +June 2006, and ``comment_date`` is a date instance for 08:00 on 1 June 2006, then ``{{ comment_date|timesince:blog_date }}`` would return "8 hours". timeuntil diff --git a/docs/templates_python.txt b/docs/templates_python.txt index bc05d769ad..81e7d45133 100644 --- a/docs/templates_python.txt +++ b/docs/templates_python.txt @@ -212,6 +212,21 @@ template tags. If an invalid variable is provided to one of these template tags, the variable will be interpreted as ``None``. Filters are always applied to invalid variables within these template tags. +.. admonition:: For debug purposes only! + + While ``TEMPLATE_STRING_IF_INVALID`` can be a useful debugging tool, + it is a bad idea to turn it on as a 'development default'. + + Many templates, including those in the Admin site, rely upon the + silence of the template system when a non-existent variable is + encountered. If you assign a value other than ``''`` to + ``TEMPLATE_STRING_IF_INVALID``, you will experience rendering + problems with these templates and sites. + + Generally, ``TEMPLATE_STRING_IF_INVALID`` should only be enabled + in order to debug a specific template problem, then cleared + once debugging is complete. + Playing with Context objects ---------------------------- @@ -296,6 +311,20 @@ optional, third positional argument, ``processors``. In this example, the 'foo': 'bar', }, [ip_address_processor]) +Note:: + If you are using Django's ``render_to_response()`` shortcut to populate a + template with the contents of a dictionary, your template will be passed a + ``Context`` instance by default (not a ``RequestContext``). If you wish to + use a ``RequestContext`` in your template rendering, you need to pass an + optional third argument to ``render_to_response()``: a ``RequestContext`` + instance. Your code might look like this:: + + def some_view(request): + # ... + return render_to_response('my_template'html', + my_data_dictionary, + context_instance = RequestContext(request)) + Here's what each of the default processors does: .. _HttpRequest object: http://www.djangoproject.com/documentation/request_response/#httprequest-objects @@ -366,6 +395,18 @@ If ``TEMPLATE_CONTEXT_PROCESSORS`` contains this processor, every `HttpRequest object`_. Note that this processor is not enabled by default; you'll have to activate it. +Writing your own context processors +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A context processor has a very simple interface: It's just a Python function +that takes one argument, an ``HttpRequest`` object, and returns a dictionary +that gets added to the template context. Each context processor *must* return +a dictionary. + +Custom context processors can live anywhere in your code base. All Django cares +about is that your custom context processors are pointed-to by your +``TEMPLATE_CONTEXT_PROCESSORS`` setting. + Loading templates ----------------- @@ -805,7 +846,7 @@ Inclusion tags Another common type of template tag is the type that displays some data by rendering *another* template. For example, Django's admin interface uses custom -template tags to display the buttons along the botton of the "add/change" form +template tags to display the buttons along the bottom of the "add/change" form pages. Those buttons always look the same, but the link targets change depending on the object being edited -- so they're a perfect case for using a small template that is filled with details from the current object. (In the admin's diff --git a/docs/testing.txt b/docs/testing.txt index b1ede3e4cc..19eef9f071 100644 --- a/docs/testing.txt +++ b/docs/testing.txt @@ -389,7 +389,7 @@ an alternative framework as if they were normal Django tests. When you run ``./manage.py test``, Django looks at the ``TEST_RUNNER`` setting to determine what to do. By default, ``TEST_RUNNER`` points to ``django.test.simple.run_tests``. This method defines the default Django -testing behaviour. This behaviour involves: +testing behavior. This behavior involves: #. Performing global pre-test setup #. Creating the test database @@ -435,7 +435,7 @@ a number of utility methods in the ``django.test.utils`` module. ``create_test_db(verbosity=1, autoclobber=False)`` Creates a new test database, and run ``syncdb`` against it. - ``verbosity`` has the same behaviour as in the test runner. + ``verbosity`` has the same behavior as in the test runner. ``Autoclobber`` describes the behavior that will occur if a database with the same name as the test database is discovered. If ``autoclobber`` is False, @@ -450,4 +450,4 @@ a number of utility methods in the ``django.test.utils`` module. Destroys the database with the name ``settings.DATABASE_NAME`` matching, and restores the value of ``settings.DATABASE_NAME`` to the provided name. - ``verbosity`` has the same behaviour as in the test runner. + ``verbosity`` has the same behavior as in the test runner. diff --git a/docs/tutorial02.txt b/docs/tutorial02.txt index bc1717e67c..06cde251e5 100644 --- a/docs/tutorial02.txt +++ b/docs/tutorial02.txt @@ -377,7 +377,7 @@ By default, ``TEMPLATE_DIRS`` is empty. So, let's add a line to it, to tell Django where our templates live:: TEMPLATE_DIRS = ( - "/home/mytemplates", # Change this to your own directory. + "/home/my_username/mytemplates", # Change this to your own directory. ) Now copy the template ``admin/base_site.html`` from within the default Django diff --git a/docs/tutorial03.txt b/docs/tutorial03.txt index 248d234043..c4c1b4c546 100644 --- a/docs/tutorial03.txt +++ b/docs/tutorial03.txt @@ -91,7 +91,7 @@ Finally, it calls that ``detail()`` function like so:: The ``poll_id='23'`` part comes from ``(?P\d+)``. Using parenthesis around a pattern "captures" the text matched by that pattern and sends it as an argument to the view function; the ``?P`` defines the name that will be used to -identify the matched pattern; and ``\d+`` is a regular experession to match a sequence of +identify the matched pattern; and ``\d+`` is a regular expression to match a sequence of digits (i.e., a number). Because the URL patterns are regular expressions, there really is no limit on @@ -257,7 +257,7 @@ provides a shortcut. Here's the full ``index()`` view, rewritten:: from mysite.polls.models import Poll def index(request): - latest_poll_list = Poll.objects.all().order_by('-pub_date') + latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5] return render_to_response('polls/index.html', {'latest_poll_list': latest_poll_list}) Note that we no longer need to import ``loader``, ``Context`` or diff --git a/docs/tutorial04.txt b/docs/tutorial04.txt index f234ed0ce1..c5e2ea3cea 100644 --- a/docs/tutorial04.txt +++ b/docs/tutorial04.txt @@ -207,7 +207,7 @@ for the polls app, we manually specify a template name for the results view: template. Note that we use ``dict()`` to return an altered dictionary in place. In previous parts of the tutorial, the templates have been provided with a context -that contains the ``poll` and ``latest_poll_list`` context variables. However, +that contains the ``poll`` and ``latest_poll_list`` context variables. However, the generic views provide the variables ``object`` and ``object_list`` as context. Therefore, you need to change your templates to match the new context variables. Go through your templates, and modify any reference to ``latest_poll_list`` to diff --git a/ez_setup.py b/ez_setup.py deleted file mode 100644 index 33675107b2..0000000000 --- a/ez_setup.py +++ /dev/null @@ -1,217 +0,0 @@ -#!python -"""Bootstrap setuptools installation - -If you want to use setuptools in your package's setup.py, just include this -file in the same directory with it, and add this to the top of your setup.py:: - - from ez_setup import use_setuptools - use_setuptools() - -If you want to require a specific version of setuptools, set a download -mirror, or use an alternate download directory, you can do so by supplying -the appropriate options to ``use_setuptools()``. - -This file can also be run as a script to install or upgrade setuptools. -""" -import sys -DEFAULT_VERSION = "0.6c1" -DEFAULT_URL = "http://cheeseshop.python.org/packages/%s/s/setuptools/" % sys.version[:3] - -md5_data = { - 'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca', - 'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb', - 'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b', - 'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a', - 'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618', - 'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac', - 'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5', - 'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4', - 'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c', - 'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b', -} - -import sys, os - -def _validate_md5(egg_name, data): - if egg_name in md5_data: - from md5 import md5 - digest = md5(data).hexdigest() - if digest != md5_data[egg_name]: - print >>sys.stderr, ( - "md5 validation of %s failed! (Possible download problem?)" - % egg_name - ) - sys.exit(2) - return data - - -def use_setuptools( - version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, - download_delay=15 -): - """Automatically find/download setuptools and make it available on sys.path - - `version` should be a valid setuptools version number that is available - as an egg for download under the `download_base` URL (which should end with - a '/'). `to_dir` is the directory where setuptools will be downloaded, if - it is not already available. If `download_delay` is specified, it should - be the number of seconds that will be paused before initiating a download, - should one be required. If an older version of setuptools is installed, - this routine will print a message to ``sys.stderr`` and raise SystemExit in - an attempt to abort the calling script. - """ - try: - import setuptools - if setuptools.__version__ == '0.0.1': - print >>sys.stderr, ( - "You have an obsolete version of setuptools installed. Please\n" - "remove it from your system entirely before rerunning this script." - ) - sys.exit(2) - except ImportError: - egg = download_setuptools(version, download_base, to_dir, download_delay) - sys.path.insert(0, egg) - import setuptools; setuptools.bootstrap_install_from = egg - - import pkg_resources - try: - pkg_resources.require("setuptools>="+version) - - except pkg_resources.VersionConflict: - # XXX could we install in a subprocess here? - print >>sys.stderr, ( - "The required version of setuptools (>=%s) is not available, and\n" - "can't be installed while this script is running. Please install\n" - " a more recent version first." - ) % version - sys.exit(2) - -def download_setuptools( - version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, - delay = 15 -): - """Download setuptools from a specified location and return its filename - - `version` should be a valid setuptools version number that is available - as an egg for download under the `download_base` URL (which should end - with a '/'). `to_dir` is the directory where the egg will be downloaded. - `delay` is the number of seconds to pause before an actual download attempt. - """ - import urllib2, shutil - egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3]) - url = download_base + egg_name - saveto = os.path.join(to_dir, egg_name) - src = dst = None - if not os.path.exists(saveto): # Avoid repeated downloads - try: - from distutils import log - if delay: - log.warn(""" ---------------------------------------------------------------------------- -This script requires setuptools version %s to run (even to display -help). I will attempt to download it for you (from -%s), but -you may need to enable firewall access for this script first. -I will start the download in %d seconds. - -(Note: if this machine does not have network access, please obtain the file - - %s - -and place it in this directory before rerunning this script.) ----------------------------------------------------------------------------""", - version, download_base, delay, url - ); from time import sleep; sleep(delay) - log.warn("Downloading %s", url) - src = urllib2.urlopen(url) - # Read/write all in one block, so we don't create a corrupt file - # if the download is interrupted. - data = _validate_md5(egg_name, src.read()) - dst = open(saveto,"wb"); dst.write(data) - finally: - if src: src.close() - if dst: dst.close() - return os.path.realpath(saveto) - -def main(argv, version=DEFAULT_VERSION): - """Install or upgrade setuptools and EasyInstall""" - - try: - import setuptools - except ImportError: - import tempfile, shutil - tmpdir = tempfile.mkdtemp(prefix="easy_install-") - try: - egg = download_setuptools(version, to_dir=tmpdir, delay=0) - sys.path.insert(0,egg) - from setuptools.command.easy_install import main - return main(list(argv)+[egg]) # we're done here - finally: - shutil.rmtree(tmpdir) - else: - if setuptools.__version__ == '0.0.1': - # tell the user to uninstall obsolete version - use_setuptools(version) - - req = "setuptools>="+version - import pkg_resources - try: - pkg_resources.require(req) - except pkg_resources.VersionConflict: - try: - from setuptools.command.easy_install import main - except ImportError: - from easy_install import main - main(list(argv)+[download_setuptools(delay=0)]) - sys.exit(0) # try to force an exit - else: - if argv: - from setuptools.command.easy_install import main - main(argv) - else: - print "Setuptools version",version,"or greater has been installed." - print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)' - - - -def update_md5(filenames): - """Update our built-in md5 registry""" - - import re - from md5 import md5 - - for name in filenames: - base = os.path.basename(name) - f = open(name,'rb') - md5_data[base] = md5(f.read()).hexdigest() - f.close() - - data = [" %r: %r,\n" % it for it in md5_data.items()] - data.sort() - repl = "".join(data) - - import inspect - srcfile = inspect.getsourcefile(sys.modules[__name__]) - f = open(srcfile, 'rb'); src = f.read(); f.close() - - match = re.search("\nmd5_data = {\n([^}]+)}", src) - if not match: - print >>sys.stderr, "Internal error!" - sys.exit(2) - - src = src[:match.start(1)] + repl + src[match.end(1):] - f = open(srcfile,'w') - f.write(src) - f.close() - - -if __name__=='__main__': - if len(sys.argv)>2 and sys.argv[1]=='--md5update': - update_md5(sys.argv[2:]) - else: - main(sys.argv[1:]) - - - - - diff --git a/setup.py b/setup.py index a8d3e9fbb7..9dd5fd9144 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,25 @@ -import ez_setup # From http://peak.telecommunity.com/DevCenter/setuptools -ez_setup.use_setuptools() +from distutils.core import setup +from distutils.command.install import INSTALL_SCHEMES +import os -from setuptools import setup, find_packages +# Tell distutils to put the data_files in platform-specific installation +# locations. See here for an explanation: +# http://groups.google.com/group/comp.lang.python/browse_thread/thread/35ec7b2fed36eaec/2105ee4d9e8042cb +for scheme in INSTALL_SCHEMES.values(): + scheme['data'] = scheme['purelib'] + +# Compile the list of packages available, because distutils doesn't have +# an easy way to do this. +packages, data_files = [], [] +root_dir = os.path.join(os.path.dirname(__file__), 'django') +for dirpath, dirnames, filenames in os.walk(root_dir): + # Ignore dirnames that start with '.' + for i, dirname in enumerate(dirnames): + if dirname.startswith('.'): del dirnames[i] + if '__init__.py' in filenames: + packages.append(dirpath.replace('/', '.')) + else: + data_files.append((dirpath, [os.path.join(dirpath, f) for f in filenames])) setup( name = "Django", @@ -10,24 +28,7 @@ setup( author = 'Lawrence Journal-World', author_email = 'holovaty@gmail.com', description = 'A high-level Python Web framework that encourages rapid development and clean, pragmatic design.', - license = 'BSD', - packages = find_packages(exclude=['examples', 'examples.*']), - package_data = { - '': ['*.TXT'], - 'django.conf': ['locale/*/LC_MESSAGES/*'], - 'django.contrib.admin': ['templates/admin/*.html', - 'templates/admin/auth/user/*.html', - 'templates/admin_doc/*.html', - 'templates/registration/*.html', - 'templates/widget/*.html', - 'media/css/*.css', - 'media/img/admin/*.gif', - 'media/img/admin/*.png', - 'media/js/*.js', - 'media/js/admin/*js'], - 'django.contrib.comments': ['templates/comments/*.html'], - 'django.contrib.sitemaps': ['templates/*.xml'], - }, + packages = packages, + data_files = data_files, scripts = ['django/bin/django-admin.py'], - zip_safe = False, ) diff --git a/tests/modeltests/one_to_one/models.py b/tests/modeltests/one_to_one/models.py index 8afa74454d..7488204ff1 100644 --- a/tests/modeltests/one_to_one/models.py +++ b/tests/modeltests/one_to_one/models.py @@ -30,6 +30,14 @@ class Waiter(models.Model): def __str__(self): return "%s the waiter at %s" % (self.name, self.restaurant) +class ManualPrimaryKey(models.Model): + primary_key = models.CharField(maxlength=10, primary_key=True) + name = models.CharField(maxlength = 50) + +class RelatedModel(models.Model): + link = models.OneToOneField(ManualPrimaryKey) + name = models.CharField(maxlength = 50) + __test__ = {'API_TESTS':""" # Create a couple of Places. >>> p1 = Place(name='Demon Dogs', address='944 W. Fullerton') @@ -151,4 +159,10 @@ DoesNotExist: Restaurant matching query does not exist. # Delete the restaurant; the waiter should also be removed >>> r = Restaurant.objects.get(pk=1) >>> r.delete() + +# One-to-one fields still work if you create your own primary key +>>> o1 = ManualPrimaryKey(primary_key="abc123", name="primary") +>>> o1.save() +>>> o2 = RelatedModel(link=o1, name="secondary") +>>> o2.save() """} diff --git a/tests/regressiontests/dateformat/tests.py b/tests/regressiontests/dateformat/tests.py index 0287587b4a..6e28759a92 100644 --- a/tests/regressiontests/dateformat/tests.py +++ b/tests/regressiontests/dateformat/tests.py @@ -21,22 +21,22 @@ r""" '7' >>> format(my_birthday, 'N') 'July' ->>> format(my_birthday, 'O') -'+0100' +>>> no_tz or format(my_birthday, 'O') == '+0100' +True >>> format(my_birthday, 'P') '10 p.m.' ->>> format(my_birthday, 'r') -'Sun, 8 Jul 1979 22:00:00 +0100' +>>> no_tz or format(my_birthday, 'r') == 'Sun, 8 Jul 1979 22:00:00 +0100' +True >>> format(my_birthday, 's') '00' >>> format(my_birthday, 'S') 'th' >>> format(my_birthday, 't') '31' ->>> format(my_birthday, 'T') -'CET' ->>> format(my_birthday, 'U') -'300531600' +>>> no_tz or format(my_birthday, 'T') == 'CET' +True +>>> no_tz or format(my_birthday, 'U') == '300531600' +True >>> format(my_birthday, 'w') '0' >>> format(my_birthday, 'W') @@ -47,17 +47,17 @@ r""" '1979' >>> format(my_birthday, 'z') '189' ->>> format(my_birthday, 'Z') -'3600' +>>> no_tz or format(my_birthday, 'Z') == '3600' +True ->>> format(summertime, 'I') -'1' ->>> format(summertime, 'O') -'+0200' ->>> format(wintertime, 'I') -'0' ->>> format(wintertime, 'O') -'+0100' +>>> no_tz or format(summertime, 'I') == '1' +True +>>> no_tz or format(summertime, 'O') == '+0200' +True +>>> no_tz or format(wintertime, 'I') == '0' +True +>>> no_tz or format(wintertime, 'O') == '+0100' +True >>> format(my_birthday, r'Y z \C\E\T') '1979 189 CET' @@ -73,7 +73,11 @@ format = dateformat.format os.environ['TZ'] = 'Europe/Copenhagen' translation.activate('en-us') -time.tzset() +try: + time.tzset() + no_tz = False +except AttributeError: + no_tz = True my_birthday = datetime.datetime(1979, 7, 8, 22, 00) summertime = datetime.datetime(2005, 10, 30, 1, 00) diff --git a/tests/regressiontests/null_queries/__init__.py b/tests/regressiontests/null_queries/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/regressiontests/null_queries/models.py b/tests/regressiontests/null_queries/models.py new file mode 100644 index 0000000000..09024f18c2 --- /dev/null +++ b/tests/regressiontests/null_queries/models.py @@ -0,0 +1,54 @@ +from django.db import models + +class Poll(models.Model): + question = models.CharField(maxlength=200) + + def __str__(self): + return "Q: %s " % self.question + +class Choice(models.Model): + poll = models.ForeignKey(Poll) + choice = models.CharField(maxlength=200) + + def __str__(self): + return "Choice: %s in poll %s" % (self.choice, self.poll) + +__test__ = {'API_TESTS':""" +# Regression test for the use of None as a query value. None is interpreted as +# an SQL NULL, but only in __exact queries. +# Set up some initial polls and choices +>>> p1 = Poll(question='Why?') +>>> p1.save() +>>> c1 = Choice(poll=p1, choice='Because.') +>>> c1.save() +>>> c2 = Choice(poll=p1, choice='Why Not?') +>>> c2.save() + +# Exact query with value None returns nothing (=NULL in sql) +>>> Choice.objects.filter(id__exact=None) +[] + +# Valid query, but fails because foo isn't a keyword +>>> Choice.objects.filter(foo__exact=None) +Traceback (most recent call last): +... +TypeError: Cannot resolve keyword 'foo' into field + +# Can't use None on anything other than __exact +>>> Choice.objects.filter(id__gt=None) +Traceback (most recent call last): +... +ValueError: Cannot use None as a query value + +# Can't use None on anything other than __exact +>>> Choice.objects.filter(foo__gt=None) +Traceback (most recent call last): +... +ValueError: Cannot use None as a query value + +# Related managers use __exact=None implicitly if the object hasn't been saved. +>>> p2 = Poll(question="How?") +>>> p2.choice_set.all() +[] + +"""} diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py index 368a46b8fb..e46b715490 100644 --- a/tests/regressiontests/templates/tests.py +++ b/tests/regressiontests/templates/tests.py @@ -170,6 +170,9 @@ class Templates(unittest.TestCase): # Escaped backslash using known escape char 'basic-syntax35': (r'{{ var|default_if_none:"foo\now" }}', {"var": None}, r'foo\now'), + # Empty strings can be passed as arguments to filters + 'basic-syntax36': (r'{{ var|join:"" }}', {'var': ['a', 'b', 'c']}, 'abc'), + ### COMMENT TAG ########################################################### 'comment-tag01': ("{% comment %}this is hidden{% endcomment %}hello", {}, "hello"), 'comment-tag02': ("{% comment %}this is hidden{% endcomment %}hello{% comment %}foo{% endcomment %}", {}, "hello"),