summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell Keith-Magee <russell@keith-magee.com>2007-08-07 13:43:49 +0000
committerRussell Keith-Magee <russell@keith-magee.com>2007-08-07 13:43:49 +0000
commit83861364dd31063d8ff9169514c5f90a0c224482 (patch)
tree6965204a72e3293a8ae6afef1a811dcdc1dc3327
parenta704a382924eb6d2936e5ac4521acacd485984fe (diff)
Merged revisions 4350-4357,4359-4365,4371-4372,4374-4377,4380-4386,4388,4390-4391,4400-4402,4404-4408,4410,4412-4419,4426-4427,4430-4432,4434,4441,4443-4444,4446-4447,4450,4452-4453,4455-4458,4476,4503,4546,4564-4569,4580-4586,4617,4630,4641-4643,4653-4655,4657,4669,4673-4675,4694-4696,4713-4714,4720-4723,4725-4732,4735-4741,4750,4755,4758,4769-4770,4776-4777,4783-4795,4798,4805-4808,4810,4813-4815,4817,4824,4836,4838-4843,4851-4855,4869,4872,4882-4884,4906,4916,4935-4936,4940-4944,4946-4953,4962-4963,4969,4971-4973,4990,4994-4997,5000-5003,5006-5008,5013-5014,5019-5024,5026-5036,5046-5047,5054-5059,5062,5079,5081-5083,5090,5100-5101,5114,5122-5123,5126,5128,5134-5136,5148-5149,5151,5157,5174,5178,5183-5185,5192-5195,5197-5200,5203,5205,5208,5214,5223-5224,5226-5227,5229-5230,5235-5236,5238-5244,5246-5249,5251,5254-5262,5266-5280,5282-5284,5286,5301,5307,5309-5310,5312,5314-5317,5319-5332,5334-5345,5372-5378,5381-5382,5384,5386,5388-5390,5393-5397,5399-5400,5416,5419-5430,5440-5441,5444-5448,5461-5464,5467,5473-5481,5487-5489,5491-5492,5498-5499,5507-5510,5512,5527,5529,5531-5535,5540-5541,5546,5570,5572-5574,5576-5578,5580-5581,5583-5589,5591,5595-5597,5601-5608,5613,5626-5826 via svnmerge from
http://code.djangoproject.com/svn/django/trunk ........ r5626 | russellm | 2007-07-07 10:16:23 +0800 (Sat, 07 Jul 2007) | 2 lines Added some uncredited authors that worked on the Oracle branch. ........ r5629 | mtredinnick | 2007-07-08 01:15:54 +0800 (Sun, 08 Jul 2007) | 8 lines Changed HttpRequest.path to be a Unicode object. It has already been URL-decoded by the time we see it anyway, so keeping it as a UTF-8 bytestring was causing unnecessary problems. Also added handling for non-ASCII URL fragments in feed creation (the portion that was outside the control of the Feed class was messed up). ........ r5630 | mtredinnick | 2007-07-08 02:24:27 +0800 (Sun, 08 Jul 2007) | 4 lines Fixed #4772 -- Fixed reverse URL creation to work with non-ASCII arguments. Also included a test for non-ASCII strings in URL patterns, although that already worked correctly. ........ r5631 | mtredinnick | 2007-07-08 02:39:23 +0800 (Sun, 08 Jul 2007) | 3 lines Corrected misleading comment from [5619]. Not sure what I was smoking at the time. ........ r5632 | mtredinnick | 2007-07-08 08:39:32 +0800 (Sun, 08 Jul 2007) | 5 lines Fixed reverse URL lookup using functions when the original URL pattern was a string. This is now just as fragile as it was prior to [5609], but works in a few cases that people were relying on, apparently. ........ r5636 | mtredinnick | 2007-07-08 19:22:53 +0800 (Sun, 08 Jul 2007) | 4 lines Fixed #4798-- Made sure that function keyword arguments are strings (for the keywords themselves) when using Unicode URL patterns. ........ r5638 | gwilson | 2007-07-10 10:34:42 +0800 (Tue, 10 Jul 2007) | 2 lines Fixed #4817 -- Removed leading forward slashes from some urlconf examples in the documentation. ........ r5639 | gwilson | 2007-07-10 10:45:11 +0800 (Tue, 10 Jul 2007) | 2 lines Fixed #4814 -- Fixed some whitespace issues in tutorial01, thanks John Shaffer. ........ r5640 | gwilson | 2007-07-10 11:26:26 +0800 (Tue, 10 Jul 2007) | 2 lines Fixed #4812 -- Fixed an octal escape in regular expression that is used in the `isValidEmail` validator, thanks batchman@free.fr. ........ r5641 | mtredinnick | 2007-07-10 20:02:06 +0800 (Tue, 10 Jul 2007) | 3 lines Fixed #4823 -- Fixed a Python 2.3 incompatibility from [5636] (it was even demonstrated by existing tests, so I really screwed this up). ........ r5642 | mtredinnick | 2007-07-10 20:03:36 +0800 (Tue, 10 Jul 2007) | 3 lines Fixed #4804 -- Fixed a problem when validating choice lists with non-ASCII data. Thanks, django@vonposer.de. ........ r5643 | mtredinnick | 2007-07-10 20:33:55 +0800 (Tue, 10 Jul 2007) | 4 lines Fixed #3760 -- Added the ability to manually set feed- and item-level id elements in Atom feeds. This is fully backwards compatible. Based on a patch from spark343@cs.ubc.ca. ........ r5644 | mtredinnick | 2007-07-11 14:55:12 +0800 (Wed, 11 Jul 2007) | 3 lines Fixed #4815 -- Fixed decoding of request parameters when the input encoding is not UTF-8. Thanks, Jordan Dimov. ........ r5645 | mtredinnick | 2007-07-11 15:00:27 +0800 (Wed, 11 Jul 2007) | 3 lines Fixed #4802 -- Updated French translation. Combined contribution from baptiste.goupil@gmail.com and rocherl@club-internet.fr. ........ r5646 | mtredinnick | 2007-07-11 15:12:50 +0800 (Wed, 11 Jul 2007) | 2 lines Fixed #4753 -- Small update to Spanish translation from Mario Gonzalez. ........ r5649 | jacob | 2007-07-12 08:33:44 +0800 (Thu, 12 Jul 2007) | 1 line Fixed #4615: corrected reverse URL resolution examples in tutorial 4. Thanks for the patch, simeonf. ........ r5650 | adrian | 2007-07-12 12:43:29 +0800 (Thu, 12 Jul 2007) | 1 line Added 'New in Django development version' note to docs/syndication_feeds.txt changes from [5643] ........ r5651 | adrian | 2007-07-12 12:44:45 +0800 (Thu, 12 Jul 2007) | 1 line Edited changes to docs/tutorial04.txt from [5649] ........ r5652 | adrian | 2007-07-12 13:23:47 +0800 (Thu, 12 Jul 2007) | 1 line Added helpful error message to SiteManager.get_current() if the user hasn't set SITE_ID ........ r5653 | adrian | 2007-07-12 13:28:04 +0800 (Thu, 12 Jul 2007) | 1 line Added RequestSite class to sites framework ........ r5654 | adrian | 2007-07-12 13:29:32 +0800 (Thu, 12 Jul 2007) | 1 line Improved syndication feed framework to use RequestSite if the sites framework is not installed -- i.e., the sites framework is no longer required to use the syndication feed framework. This is backwards incompatible if anybody has subclassed Feed and overridden __init__(), because the second parameter is now expected to be an HttpRequest object instead of request.path ........ r5658 | russellm | 2007-07-12 15:45:35 +0800 (Thu, 12 Jul 2007) | 2 lines Fixed #4459 -- Added 'raw' argument to save method, to override any pre-save processing, and modified serializers to use a raw-save. This enables serialization of DateFields with auto_now/auto_now_add. Also modified serializers to invoke save() directly on the model baseclass, to avoid any (potentially order-dependent, data modifying) behavior in a custom save() method. ........ r5659 | russellm | 2007-07-12 19:24:16 +0800 (Thu, 12 Jul 2007) | 2 lines Fixed #3770 -- Remove null=True tag from OneToOne serialization test. OneToOne fields can't have a value of null. ........ r5660 | russellm | 2007-07-12 19:27:38 +0800 (Thu, 12 Jul 2007) | 2 lines Fixed #3768 -- Disabled NullBooleanField PK serialization test. We can't and don't test null PK values. ........ r5662 | russellm | 2007-07-12 20:33:24 +0800 (Thu, 12 Jul 2007) | 2 lines Fixed #4837 -- Updated Debian packaging details. Thanks for the suggestion, Yasushi Masuda <whosaysni@gmail.com>. ........ r5663 | russellm | 2007-07-12 20:44:05 +0800 (Thu, 12 Jul 2007) | 2 lines Fixed #4808 -- Added Chilean regions in localflavor. Thanks, Marijn Vriens <marijn@metronomo.cl>. ........ r5664 | russellm | 2007-07-12 20:48:27 +0800 (Thu, 12 Jul 2007) | 2 lines Fixed #4745 -- Updated docs to point out that 0 is not a valid SITE_ID when running the tests. Thanks for the suggestion, Lars Stavholm <stava@telcotec.se>. ........ r5665 | russellm | 2007-07-12 20:50:02 +0800 (Thu, 12 Jul 2007) | 2 lines Fixed #4763 -- Minor typo in cache documentations. Thanks, dan@coffeecode.net. ........ r5666 | russellm | 2007-07-12 20:55:28 +0800 (Thu, 12 Jul 2007) | 2 lines Fixed #4627 -- Added details on MacPorts packaging of Django. Thanks, Paul Bissex. ........ r5667 | russellm | 2007-07-12 21:23:11 +0800 (Thu, 12 Jul 2007) | 2 lines Fixed #4640 -- Fixed import to stringfilter in docs. Proposed solution to move stringfilter into django.template.__init__ introduces a circular import problem. ........ r5668 | russellm | 2007-07-12 21:32:00 +0800 (Thu, 12 Jul 2007) | 2 lines Fixed #4722 -- Clarified discussion about PYTHONPATH in modpython docs. Thanks for the suggestion, Collin Grady <cgrady@the-magi.us>. ........ r5669 | russellm | 2007-07-12 21:37:59 +0800 (Thu, 12 Jul 2007) | 2 lines Fixed #4755 -- Modified newforms MultipleChoiceField to use list comprehension, rather than iteration. ........ r5670 | russellm | 2007-07-12 21:41:27 +0800 (Thu, 12 Jul 2007) | 2 lines Fixed #4764 -- Added reference to Locale middleware in middleware docs. Thanks, dan@coffeecode.net. ........ r5671 | russellm | 2007-07-12 21:55:19 +0800 (Thu, 12 Jul 2007) | 2 lines Fixed #4768 -- Converted timesince and dateformat to use explicit floor division (pre-emptive avoidance of Python 3000 compatibility problem), and removed a redundant millisecond check. Thanks, John Shaffer <jshaffer2112@gmail.com>. ........ r5672 | russellm | 2007-07-12 22:00:13 +0800 (Thu, 12 Jul 2007) | 2 lines Fixed #4775 -- Added some missing Hungarian accents to the urlify.js LATIN_MAP. Thanks, Pistahh <szekeres@iii.hu>. ........ r5673 | russellm | 2007-07-12 22:05:16 +0800 (Thu, 12 Jul 2007) | 2 lines Fixed #4502 -- Clarified reference to view in tutorial. Thanks for the suggestion, Carl Karsten <carl@personnelware.com>. ........ r5674 | russellm | 2007-07-12 22:11:41 +0800 (Thu, 12 Jul 2007) | 2 lines Fixed #4522 -- Clarified the allowed filter arguments on the time and date filters. Thanks for the suggestion, admackin@gmail.com. ........ r5675 | russellm | 2007-07-12 22:21:51 +0800 (Thu, 12 Jul 2007) | 2 lines Fixed #4525 -- Fixed mistaken documentation on arguments to runfcgi. Thanks, Johan Bergstrom <bugs@bergstroem.nu>. ........ r5676 | russellm | 2007-07-12 22:41:32 +0800 (Thu, 12 Jul 2007) | 2 lines Fixed #4538 -- Split the installation instructions to differentiate between installing a distribution package and installing an official release. Thanks to Carl Karsten for the idea, and Paul Bissex for the patch. ........ r5677 | russellm | 2007-07-12 23:26:37 +0800 (Thu, 12 Jul 2007) | 2 lines Fixed #4526 -- Modified the test Client login method to fail when a user is inactive. Thanks, marcin@elksoft.pl. ........ r5678 | russellm | 2007-07-13 13:03:33 +0800 (Fri, 13 Jul 2007) | 2 lines Fixed #3505 -- Added handling for the error raised when the user forgets the comma in a single element tuple when defining AUTHENTICATION_BACKENDS. Thanks for the help identifying this problem, Mario Gonzalez <gonzalemario@gmail.com>. ........ r5679 | mtredinnick | 2007-07-13 16:52:07 +0800 (Fri, 13 Jul 2007) | 3 lines Fixed #2591 -- Fixed a problem with inspectdb with psycopg2 (only). Patch from Gary Wilson. ........ r5680 | mtredinnick | 2007-07-13 17:09:59 +0800 (Fri, 13 Jul 2007) | 3 lines Fixed #4807 -- Fixed a couple of corner cases in decimal form input validation. Based on a suggestion from Chriss Moffit. ........ r5681 | mtredinnick | 2007-07-13 17:14:51 +0800 (Fri, 13 Jul 2007) | 3 lines Fixed #4839 -- Added __repr__ methods to URL classes that show the pattern they contain. Thanks, Thomas G?\195?\188ttler. ........ r5682 | mtredinnick | 2007-07-13 18:56:30 +0800 (Fri, 13 Jul 2007) | 3 lines Fixed #4842 -- Added slightly more robust error reporting. Thanks, Thomas G?\195?\188ttler. ........ r5683 | mtredinnick | 2007-07-13 19:05:01 +0800 (Fri, 13 Jul 2007) | 3 lines Fixed #4846 -- Fixed some Python 2.3 encoding problems in the admin interface. Based on a patch from daybreaker12@gmail.com. ........ r5684 | mtredinnick | 2007-07-13 20:03:20 +0800 (Fri, 13 Jul 2007) | 3 lines Fixed #4861 -- Removed some duplicated logic from the newforms RegexField by making it a subclass of CharField. Thanks, Collin Grady. ........ r5685 | mtredinnick | 2007-07-13 21:15:35 +0800 (Fri, 13 Jul 2007) | 3 lines Fixed #4865 -- Replaced a stray generator comprehension with a list comprehension so that we don't break Python 2.3. ........ r5686 | mtredinnick | 2007-07-13 22:13:35 +0800 (Fri, 13 Jul 2007) | 3 lines Fixed #4469 -- Added slightly more informative error messages to max- and min-length newform validation. Based on a patch from A. Murat Eren. ........ r5687 | mtredinnick | 2007-07-13 22:14:47 +0800 (Fri, 13 Jul 2007) | 2 lines Added author credit for [5686]. Refs #4469. ........ r5688 | mtredinnick | 2007-07-13 22:33:46 +0800 (Fri, 13 Jul 2007) | 3 lines Fixed #4484 -- Fixed APPEND_SLASH handling to handle an empty path value. Thanks, VesselinK. ........ r5689 | mtredinnick | 2007-07-13 22:40:39 +0800 (Fri, 13 Jul 2007) | 2 lines Fixed #4556 -- Stylistic changes to [5500]. Thanks, glin@seznam.cz. ........ r5690 | gwilson | 2007-07-14 04:36:01 +0800 (Sat, 14 Jul 2007) | 2 lines Refs #2591 -- Removed int conversion and try/except since the value in the single-item list is already an int. I overlooked this in my original patch, which was applied in [5679]. ........ r5691 | adrian | 2007-07-14 05:20:07 +0800 (Sat, 14 Jul 2007) | 1 line Documented the 'commit' argument to save() methods on forms created via form_for_model() or form_for_instance() ........ r5692 | mtredinnick | 2007-07-14 13:27:22 +0800 (Sat, 14 Jul 2007) | 3 lines Fixed #4869 -- Added a note that syncdb does not alter existing tables. Thanks, James Bennett. ........ r5693 | mtredinnick | 2007-07-14 20:48:24 +0800 (Sat, 14 Jul 2007) | 3 lines Fixed #4863 -- Removed comment references to a no-longer present link. Pointed out by Thomas G?\195?\188ttler. ........ r5694 | mtredinnick | 2007-07-14 21:14:28 +0800 (Sat, 14 Jul 2007) | 2 lines Fixed #4862 -- Fixed invalid Javascript creation in popup windows in admin. ........ r5695 | mtredinnick | 2007-07-14 21:39:41 +0800 (Sat, 14 Jul 2007) | 2 lines Fixed a problem with translatable strings from [5686]. ........ r5696 | mtredinnick | 2007-07-14 22:47:14 +0800 (Sat, 14 Jul 2007) | 3 lines Fixed #4731 -- Changed management.setup_environ() so that it no longer assumes the settings module is called "settings". Patch from SmileyChris. ........ r5697 | mtredinnick | 2007-07-14 22:50:35 +0800 (Sat, 14 Jul 2007) | 3 lines Fixed #4870 -- Removed unneeded import and fixed a docstring in an example. Thanks, Collin Grady. ........ r5698 | adrian | 2007-07-15 00:58:54 +0800 (Sun, 15 Jul 2007) | 1 line Edited docs/db-api.txt changes from [5658] ........ r5699 | adrian | 2007-07-15 01:04:30 +0800 (Sun, 15 Jul 2007) | 1 line Negligible capitalization fix in test/client.py docstring ........ r5700 | russellm | 2007-07-15 12:41:59 +0800 (Sun, 15 Jul 2007) | 2 lines Clarified the documentation on the steps that happen during a save, and how raw save affects those steps. ........ r5701 | gwilson | 2007-07-15 13:03:28 +0800 (Sun, 15 Jul 2007) | 2 lines Fixed #4310 -- Fixed a regular expression bug in `strip_entities` function and added tests for several `django.utils.html` functions. Based on patch from Brian Harring. ........ r5702 | gwilson | 2007-07-15 13:11:06 +0800 (Sun, 15 Jul 2007) | 2 lines Fixed #4877 -- Fixed typo in testing documentation, patch from John Shaffer. ........ r5703 | gwilson | 2007-07-15 14:24:54 +0800 (Sun, 15 Jul 2007) | 2 lines Fixed #3012 -- Changed the locmem cache backend to use pickle instead of deepcopy to make it compatible with iterators (which cannot be copied). Patch from Sundance. ........ r5704 | gwilson | 2007-07-15 14:29:45 +0800 (Sun, 15 Jul 2007) | 2 lines Changed imports to adhere to PEP 8. ........ r5705 | mtredinnick | 2007-07-15 17:39:13 +0800 (Sun, 15 Jul 2007) | 3 lines Fixed #4880 -- Updated Spanish translation (includes re-encoding to UTF-8). Thanks, Jorge Gajon. ........ r5706 | mtredinnick | 2007-07-15 17:46:42 +0800 (Sun, 15 Jul 2007) | 3 lines Fixed #4882 -- Updated Argentinean Spanish translation (includes re-encoding to UTF-8). Thanks, Ramiro Morales. ........ r5707 | mtredinnick | 2007-07-15 18:08:05 +0800 (Sun, 15 Jul 2007) | 3 lines Re-encoded djangojs.po for French and German locales to UTF-8. These were the last two non-UTF-8 PO files. ........ r5708 | mtredinnick | 2007-07-15 18:10:44 +0800 (Sun, 15 Jul 2007) | 6 lines Fixed #4734 -- Changed message extraction to permit non-ACSII msgid strings. Thanks, krzysiek.pawlik@silvermedia.pl. This is slightly backwards-incompatible for translators: PO files are now assumed to be in UTF-8 encoding. ........ r5709 | adrian | 2007-07-16 03:34:21 +0800 (Mon, 16 Jul 2007) | 1 line Edited docs/db-api.txt changes from [5700] ........ r5710 | adrian | 2007-07-16 05:16:32 +0800 (Mon, 16 Jul 2007) | 1 line Improved docs/templates.txt section on the 'regroup' tag ........ r5711 | mtredinnick | 2007-07-16 11:48:03 +0800 (Mon, 16 Jul 2007) | 2 lines Updated AUTHORS for [5708]. ........ r5712 | mtredinnick | 2007-07-16 11:50:22 +0800 (Mon, 16 Jul 2007) | 3 lines Fixed #4199 -- Changed date formatting in HTTP expires header to be spec compliant. Thanks, Chris Bennett. ........ r5713 | mtredinnick | 2007-07-16 12:45:45 +0800 (Mon, 16 Jul 2007) | 3 lines Fixed #4884 -- Fixed an initialisation problem when assigned to settings before accessing them. Thanks, Noam Raphael. ........ r5714 | mtredinnick | 2007-07-16 12:47:52 +0800 (Mon, 16 Jul 2007) | 2 lines Fixed #4806 -- Updated Simplified Chinese translation. Thanks, limodou. ........ r5715 | mtredinnick | 2007-07-16 12:54:49 +0800 (Mon, 16 Jul 2007) | 3 lines Fixed #4887 -- Fixed another place where template tag arguments are used directly as function keyword args. Thanks, Brian Rosner. ........ r5716 | gwilson | 2007-07-16 13:00:18 +0800 (Mon, 16 Jul 2007) | 2 lines Refs #3012 -- Removed iterator from `test_data_types` cache test that I added in [5703]. Iterators cannot be pickled either. Left the rest of [5703] there though since it fixed another issue that was causing the `test_data_types` cache test to fail with the `locmem` cache backend, the fact that functions cannot be copied. ........ r5717 | gwilson | 2007-07-16 13:28:13 +0800 (Mon, 16 Jul 2007) | 2 lines Cleaned up a couple unused imports and fixed docstrings to follow Python Style Guide. ........ r5718 | mtredinnick | 2007-07-16 17:36:10 +0800 (Mon, 16 Jul 2007) | 3 lines Fixed #4845 -- Fixed some problems with Unicode usage and caching. Thanks, Jeremy Dunck. ........ r5719 | gwilson | 2007-07-16 21:47:43 +0800 (Mon, 16 Jul 2007) | 2 lines Removed unused variable and changed comments about `permalink` decorator into a docstring. ........ r5720 | gwilson | 2007-07-17 06:29:09 +0800 (Tue, 17 Jul 2007) | 2 lines Fixed #4851 -- Fixed description of an example query in `db-api` docs. ........ r5721 | mtredinnick | 2007-07-17 12:22:11 +0800 (Tue, 17 Jul 2007) | 2 lines Fixed #4898 -- Fixed a precendence problem when constructing HTTP Date header. ........ r5722 | mtredinnick | 2007-07-17 18:25:43 +0800 (Tue, 17 Jul 2007) | 3 lines Fixed #4899 -- Fixed a problem with PO file header generation caused by [5708]. Thanks, Ramiro Morales. ........ r5723 | mtredinnick | 2007-07-19 17:23:45 +0800 (Thu, 19 Jul 2007) | 2 lines Fixed #4917 -- Updated Swedish translation. Thanks, Pilip Lindborg. ........ r5724 | mtredinnick | 2007-07-19 17:24:36 +0800 (Thu, 19 Jul 2007) | 2 lines Fixed #3925 -- Added Slovak localflavor items. Thanks, Martin Kos?\195?\173r. ........ r5725 | adrian | 2007-07-20 14:28:56 +0800 (Fri, 20 Jul 2007) | 1 line Added a db_type() method to the database Field class. This is a hook for calculating the database column type for a given Field. Also converted all management.py CREATE TABLE statements to use db_type(), which made that code cleaner. The Field.get_internal_type() hook still exists, but we should consider removing it at some point, because db_type() is more general. Also added docs -- the beginnings of docs on how to create custom database Field classes. This is backwards-compatible. ........ r5726 | adrian | 2007-07-20 14:34:26 +0800 (Fri, 20 Jul 2007) | 1 line Simplified the indent level in management.py _get_sql_model_create() by using a 'continue' statement rather than nesting everything in an 'if' ........ r5727 | russellm | 2007-07-20 20:07:58 +0800 (Fri, 20 Jul 2007) | 2 lines Fixed #4558 -- Modified XML serializer to handle whitespace better around None tags. Thanks to Bill Fenner <fenner@gmail.com> for the report and fix. ........ r5728 | russellm | 2007-07-20 20:15:02 +0800 (Fri, 20 Jul 2007) | 2 lines Fixed #4897 -- Fixed minor typo in doctest comment. ........ r5729 | russellm | 2007-07-20 21:57:49 +0800 (Fri, 20 Jul 2007) | 2 lines Fixed #3782 -- Added support for the suite() method recommended by the Python unittest docs. Thanks for the suggestion, rene.puls@repro-mayr.de. ........ r5730 | russellm | 2007-07-20 22:07:54 +0800 (Fri, 20 Jul 2007) | 2 lines Refs #3782 -- Added documentation note that suite() handling is only in development version. ........ r5731 | russellm | 2007-07-20 22:32:20 +0800 (Fri, 20 Jul 2007) | 2 lines Fixed #4901 -- Modified assertContains to provide a default check of 'any instances of text in content'. Thanks for the suggestion, nis@superlativ.dk. ........ r5732 | russellm | 2007-07-20 22:42:57 +0800 (Fri, 20 Jul 2007) | 2 lines Fixed #4738 -- Modified the prompt that is displayed when a test database cannot be created. The existing prompt was misleading if the issue wasn't a pre-existing database. Thanks for the suggestion, John Shaffer <jshaffer2112@gmail.com>. ........ r5733 | adrian | 2007-07-20 23:40:54 +0800 (Fri, 20 Jul 2007) | 1 line Fixed negligible typo in docstring in tests/regressiontests/test_client_regress/models.py from [5731] ........ r5736 | adrian | 2007-07-21 05:24:30 +0800 (Sat, 21 Jul 2007) | 1 line Added some additional docs to docs/model-api.txt db_type() section ........ r5738 | russellm | 2007-07-21 11:30:38 +0800 (Sat, 21 Jul 2007) | 2 lines Fixed #4304 -- Modified sys.exit to os._exit to make sure development server quits when an error occurs attempting to bind to the requested port (e.g., if another server is already running). Thanks, Mario Gonzalez <gonzalemario@gmail.com>. ........ r5739 | russellm | 2007-07-21 12:36:28 +0800 (Sat, 21 Jul 2007) | 2 lines Minor fix to allow for count=0 in assertContains. ........ r5740 | russellm | 2007-07-21 13:15:19 +0800 (Sat, 21 Jul 2007) | 2 lines Added test cases for change [5739]. ........ r5741 | russellm | 2007-07-21 13:17:20 +0800 (Sat, 21 Jul 2007) | 2 lines Fixed #4402 -- Modified test client to allow multi-valued inputs on GET requests. Thanks for the suggestion, eddymul@gmail.com. ........ r5743 | gwilson | 2007-07-22 10:18:36 +0800 (Sun, 22 Jul 2007) | 2 lines Fixed #4945 -- Removed unused `GET_ITERATOR_CHUNK_SIZE` definition from manager.py. `GET_ITERATOR_CHUNK_SIZE` is already defined in query.py. Thanks zigiDev@mac.com. ........ r5744 | gwilson | 2007-07-22 11:09:24 +0800 (Sun, 22 Jul 2007) | 2 lines Added docstrings to shortcuts module and functions. ........ r5745 | gwilson | 2007-07-22 11:12:50 +0800 (Sun, 22 Jul 2007) | 2 lines Shortcut functions do not accept `QuerySet` objects, yet :) ........ r5746 | gwilson | 2007-07-22 11:41:11 +0800 (Sun, 22 Jul 2007) | 2 lines Fixed #4373 -- Modified the get_object_or_404/get_list_or_404 shortcuts to also accept `QuerySet`s. Thanks SuperJared. ........ r5747 | gwilson | 2007-07-22 11:45:03 +0800 (Sun, 22 Jul 2007) | 2 lines Corrected typo in [5746]. ........ r5750 | gwilson | 2007-07-23 12:45:01 +0800 (Mon, 23 Jul 2007) | 2 lines Fixed #4952 -- Fixed the `get_template_sources` functions of the `app_directories` and `filesystem` template loaders to not return paths outside of given template directories. Both functions now make use of a new `safe_join` utility function. Thanks to SmileyChris for help with the patch. ........ r5752 | russellm | 2007-07-23 20:14:32 +0800 (Mon, 23 Jul 2007) | 2 lines Fixed #3771 -- Modified the test runner to observe the --noinput argument controlling script interactivity. This means that test scripts can now be put in a buildbot environment. This is a backwards incompatible change for anyone that has written a custom test runner. Thanks for the suggestion, moof@metamoof.net. ........ r5753 | russellm | 2007-07-23 21:52:59 +0800 (Mon, 23 Jul 2007) | 2 lines Added documentation for a test runner argument that has always been present, but was undocumented. ........ r5756 | adrian | 2007-07-25 11:12:31 +0800 (Wed, 25 Jul 2007) | 1 line Changed docstring additions from [5744] to use active verbs ('returns' instead of 'return') ........ r5757 | adrian | 2007-07-25 11:15:05 +0800 (Wed, 25 Jul 2007) | 1 line Added 'New in Django development version' to docs/db-api.txt change from [5746] ........ r5758 | adrian | 2007-07-25 11:18:17 +0800 (Wed, 25 Jul 2007) | 1 line Changed safe_join() docstring from [5750] to use active verbs. See also [5756] ........ r5764 | gwilson | 2007-07-26 13:01:53 +0800 (Thu, 26 Jul 2007) | 2 lines Fixed #4971 -- Fixed some escaping and quoting problems in the databrowse contrib app. Based on patch from Johann Queuniet. ........ r5765 | adrian | 2007-07-27 01:16:34 +0800 (Fri, 27 Jul 2007) | 1 line Added section to docs/contributing.txt about docstring coding style ........ r5766 | mtredinnick | 2007-07-27 06:59:34 +0800 (Fri, 27 Jul 2007) | 2 lines Added support for database cache table in test database. ........ r5767 | adrian | 2007-07-28 05:53:02 +0800 (Sat, 28 Jul 2007) | 1 line Added unit test that confirms a bug in ValuesQuerySets that have extra(select) specified. If the select dictionary has several fields, Django assigns the wrong values to the select-field names ........ r5768 | adrian | 2007-07-28 06:07:42 +0800 (Sat, 28 Jul 2007) | 1 line Fixed bug with using values() and extra(select) in the same QuerySet, with a select dictionary containing more than a few elements. This bug was identified in unit test from [5767]. The problem was that we were relying on the dictionary's .items() ordering, which is undefined ........ r5769 | russellm | 2007-07-28 12:02:52 +0800 (Sat, 28 Jul 2007) | 2 lines Fixed #4460 -- Added the ability to be more specific in the test cases that are executed. This is a backwards incompatible change for any user with a custom test runner. See the wiki for details. ........ r5770 | russellm | 2007-07-28 15:27:53 +0800 (Sat, 28 Jul 2007) | 2 lines Fixed #4995 -- Fixed some problems in documentation ReST formatting. Thanks, Simon G. ........ r5771 | simon | 2007-07-29 02:30:40 +0800 (Sun, 29 Jul 2007) | 1 line After discussing with Malcolm, added set_unusable_password() and has_usable_password() methods to the User object, plus tests and updated documentation ........ r5774 | adrian | 2007-07-30 02:21:16 +0800 (Mon, 30 Jul 2007) | 1 line Added 'New in Django development version' to changes in docs/authentication.txt from [5771] ........ r5778 | gwilson | 2007-07-31 01:25:35 +0800 (Tue, 31 Jul 2007) | 4 lines Fixed call to `ugettext`, which is imported as `_`. Changed raise to conform to PEP 3109 and wrapped the long line. Added beginnings of tests for model fields. ........ r5782 | gwilson | 2007-08-01 13:41:32 +0800 (Wed, 01 Aug 2007) | 2 lines Fixed #4228 -- Removed hardcoding of `RadioFieldRenderer` in the `RadioSelect` Widget so that the display of `RadioSelect`s can be more easily customized. `BoundField.__unicode__` also no longer special cases `RadioSelect` since `RadioSelect.render()` now returns a string like every other Widget. ........ r5783 | gwilson | 2007-08-01 13:52:18 +0800 (Wed, 01 Aug 2007) | 2 lines Fixed #5037 -- Fixed use of wrong field type in a db-api docs example, thanks ubernostrum. ........ r5796 | gwilson | 2007-08-04 11:19:14 +0800 (Sat, 04 Aug 2007) | 2 lines Fixed #5078 -- Fixed several broken links to the syndication documentation. ........ r5797 | gwilson | 2007-08-04 11:36:58 +0800 (Sat, 04 Aug 2007) | 2 lines Changed the 0.95 release notes to point to the 0.95 documentation index. ........ r5798 | gwilson | 2007-08-04 11:39:24 +0800 (Sat, 04 Aug 2007) | 2 lines Changed several documentation links to be relative. ........ r5799 | gwilson | 2007-08-04 22:41:49 +0800 (Sat, 04 Aug 2007) | 2 lines Refs #3397 -- Corrected the Exception that is caught when ordering by non-fields (added in [4596]), thanks glin@seznam.cz. ........ r5800 | gwilson | 2007-08-04 22:52:13 +0800 (Sat, 04 Aug 2007) | 2 lines Fixed #5083 -- Fixed typo in newforms documentation, thanks Rik. ........ r5801 | gwilson | 2007-08-05 12:39:52 +0800 (Sun, 05 Aug 2007) | 2 lines Refs #5089 -- Added file name to poll detail template examples in the tutorial. ........ r5802 | gwilson | 2007-08-05 12:42:26 +0800 (Sun, 05 Aug 2007) | 2 lines Changed some more links to be relative in the documentation. I had a couple unsaved files that didn't get in with [5798]. ........ r5803 | gwilson | 2007-08-05 13:14:46 +0800 (Sun, 05 Aug 2007) | 2 lines Fixed #2101 -- Renamed `maxlength` argument to `max_length` for oldforms `FormField`s and db model `Field`s. This is fully backwards compatible at the moment since the legacy `maxlength` argument is still supported. Using `maxlength` will, however, issue a `PendingDeprecationWarning` when used. ........ r5804 | russellm | 2007-08-05 15:39:36 +0800 (Sun, 05 Aug 2007) | 2 lines Fixed #4001 -- Added dynamic save_m2m method() to forms created with form_for_model and form_for_instance on save(commit=False). ........ r5807 | adrian | 2007-08-06 12:36:43 +0800 (Mon, 06 Aug 2007) | 1 line Fixed #5074 -- Added link to audio clip of 'Django' pronunciation ........ r5808 | adrian | 2007-08-06 12:52:14 +0800 (Mon, 06 Aug 2007) | 1 line Edited docs/newforms.txt changes from [5804] ........ r5809 | adrian | 2007-08-06 13:04:27 +0800 (Mon, 06 Aug 2007) | 1 line Fixed #5082 -- Enabled tab completion in 'django-admin.py shell' for objects that were imported into the global namespace at runtime. Thanks, dusk@woofle.net ........ r5810 | adrian | 2007-08-06 13:06:15 +0800 (Mon, 06 Aug 2007) | 1 line Fixed #5077 -- django/utils/encoding.py no longer imports settings, as it doesn't use that module. Thanks, Collin Grady ........ r5811 | adrian | 2007-08-06 13:07:38 +0800 (Mon, 06 Aug 2007) | 1 line Fixed #5071 -- Fixed 'global name ugettext is not defined' error in django.core.validators. Thanks, Marco Bonetti ........ r5812 | adrian | 2007-08-06 13:13:06 +0800 (Mon, 06 Aug 2007) | 1 line Fixed #5064 -- Fixed potentially confusing sentence in docs/authentication.txt. Thanks, Collin Grady ........ r5813 | adrian | 2007-08-06 13:16:35 +0800 (Mon, 06 Aug 2007) | 1 line Fixed #5053 -- Added 'action' attribute to <form> tags that didn't have that attribute in docs/newforms.txt examples. Perfectionism appreciated, trickyb ........ r5814 | adrian | 2007-08-06 13:27:58 +0800 (Mon, 06 Aug 2007) | 1 line Added a closing </p>' to a code example in docs/email.txt ........ r5815 | adrian | 2007-08-06 13:28:45 +0800 (Mon, 06 Aug 2007) | 1 line Fixed #5006 -- Fixed incorrect/outdated docstring for the 'if' template tag. Thanks, Thomas Petazzoni ........ r5816 | adrian | 2007-08-06 13:33:18 +0800 (Mon, 06 Aug 2007) | 1 line Added note to docs/model-api.txt about help_text not being escaped in the admin interface ........ r5817 | adrian | 2007-08-06 13:34:45 +0800 (Mon, 06 Aug 2007) | 1 line Fixed #4985 -- Clarified location of HttpResponse in docs/request_response.txt. Thanks for raising the issue, rainer.mansfeld@romulo.de ........ r5818 | adrian | 2007-08-06 13:37:17 +0800 (Mon, 06 Aug 2007) | 1 line Fixed #4980 -- Removed 'forms' from the 'not considered stable and will be rewritten' section of docs/api_stability.txt. They've already been rewritten. ........ r5819 | russellm | 2007-08-06 21:58:56 +0800 (Mon, 06 Aug 2007) | 2 lines Fixed #3297 -- Implemented FileField and ImageField for newforms. Thanks to the many users that contributed to and tested this patch. ........ r5820 | russellm | 2007-08-06 22:17:10 +0800 (Mon, 06 Aug 2007) | 2 lines Added note that FileField and ImageField are only in development version. There are also some minor backwards compatibility issues with the changes introduced in [5819] - see the wiki for details. ........ r5823 | adrian | 2007-08-07 04:27:04 +0800 (Tue, 07 Aug 2007) | 1 line Fixed British spelling of 'customize' and 'behavior' in Manager.get_query_set() docstring ........ r5824 | adrian | 2007-08-07 10:18:36 +0800 (Tue, 07 Aug 2007) | 1 line Fixed #5105 -- Fixed two ReST errors in docs/newforms.txt. Thanks, Ramiro Morales ........ r5825 | adrian | 2007-08-07 10:33:11 +0800 (Tue, 07 Aug 2007) | 1 line Fixed #5097 -- Made various updates and corrections to the documentation. Thanks, Nicola Larosa ........ r5826 | russellm | 2007-08-07 19:20:15 +0800 (Tue, 07 Aug 2007) | 2 lines Removed a redundant directory join during FileField form saving. Thanks to David Danier's eagle eyes for picking up this one. ........ git-svn-id: http://code.djangoproject.com/svn/django/branches/newforms-admin@5828 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--AUTHORS19
-rwxr-xr-xdjango/bin/make-messages.py12
-rw-r--r--django/conf/__init__.py2
-rw-r--r--django/conf/global_settings.py1
-rw-r--r--django/conf/locale/de/LC_MESSAGES/djangojs.mobin1569 -> 1571 bytes
-rw-r--r--django/conf/locale/de/LC_MESSAGES/djangojs.po16
-rw-r--r--django/conf/locale/es/LC_MESSAGES/django.mobin47156 -> 49337 bytes
-rw-r--r--django/conf/locale/es/LC_MESSAGES/django.po3307
-rw-r--r--django/conf/locale/es/LC_MESSAGES/djangojs.mobin1427 -> 1561 bytes
-rw-r--r--django/conf/locale/es/LC_MESSAGES/djangojs.po83
-rw-r--r--django/conf/locale/es_AR/LC_MESSAGES/django.mobin44251 -> 49719 bytes
-rw-r--r--django/conf/locale/es_AR/LC_MESSAGES/django.po3607
-rw-r--r--django/conf/locale/es_AR/LC_MESSAGES/djangojs.mobin1576 -> 1633 bytes
-rw-r--r--django/conf/locale/es_AR/LC_MESSAGES/djangojs.po22
-rw-r--r--django/conf/locale/fr/LC_MESSAGES/django.mobin46214 -> 49591 bytes
-rw-r--r--django/conf/locale/fr/LC_MESSAGES/django.po1077
-rw-r--r--django/conf/locale/fr/LC_MESSAGES/djangojs.mobin1533 -> 1533 bytes
-rw-r--r--django/conf/locale/fr/LC_MESSAGES/djangojs.po14
-rw-r--r--django/conf/locale/sv/LC_MESSAGES/django.mobin45632 -> 47968 bytes
-rw-r--r--django/conf/locale/sv/LC_MESSAGES/django.po1383
-rw-r--r--django/conf/locale/zh_CN/LC_MESSAGES/django.mobin30798 -> 41991 bytes
-rw-r--r--django/conf/locale/zh_CN/LC_MESSAGES/django.po3042
-rw-r--r--django/conf/project_template/settings.py1
-rw-r--r--django/contrib/admin/media/js/admin/RelatedObjectLookups.js9
-rw-r--r--django/contrib/admin/media/js/urlify.js12
-rw-r--r--django/contrib/admin/models.py2
-rw-r--r--django/contrib/admin/templatetags/admin_list.py6
-rw-r--r--django/contrib/admin/views/main.py2
-rw-r--r--django/contrib/auth/__init__.py2
-rw-r--r--django/contrib/auth/forms.py20
-rw-r--r--django/contrib/auth/models.py33
-rw-r--r--django/contrib/auth/tests.py19
-rw-r--r--django/contrib/comments/models.py8
-rw-r--r--django/contrib/comments/templatetags/comments.py2
-rw-r--r--django/contrib/comments/views/comments.py6
-rw-r--r--django/contrib/contenttypes/models.py6
-rw-r--r--django/contrib/databrowse/plugins/fieldchoices.py3
-rw-r--r--django/contrib/databrowse/templates/databrowse/calendar_day.html2
-rw-r--r--django/contrib/databrowse/templates/databrowse/calendar_month.html2
-rw-r--r--django/contrib/databrowse/templates/databrowse/choice_detail.html2
-rw-r--r--django/contrib/databrowse/templates/databrowse/choice_list.html2
-rw-r--r--django/contrib/databrowse/templates/databrowse/homepage.html2
-rw-r--r--django/contrib/databrowse/templates/databrowse/model_detail.html2
-rw-r--r--django/contrib/databrowse/templates/databrowse/object_detail.html10
-rw-r--r--django/contrib/flatpages/models.py6
-rw-r--r--django/contrib/localflavor/cl/cl_regions.py25
-rw-r--r--django/contrib/localflavor/cl/forms.py12
-rw-r--r--django/contrib/localflavor/no/forms.py3
-rw-r--r--django/contrib/localflavor/sk/__init__.py0
-rw-r--r--django/contrib/localflavor/sk/forms.py41
-rw-r--r--django/contrib/localflavor/sk/sk_districts.py87
-rw-r--r--django/contrib/localflavor/sk/sk_regions.py16
-rw-r--r--django/contrib/redirects/models.py4
-rw-r--r--django/contrib/sessions/middleware.py10
-rw-r--r--django/contrib/sessions/models.py2
-rw-r--r--django/contrib/sites/models.py28
-rw-r--r--django/contrib/syndication/feeds.py20
-rw-r--r--django/contrib/syndication/views.py2
-rw-r--r--django/core/cache/backends/filebased.py5
-rw-r--r--django/core/cache/backends/locmem.py17
-rw-r--r--django/core/cache/backends/memcached.py16
-rw-r--r--django/core/handlers/modpython.py3
-rw-r--r--django/core/handlers/wsgi.py3
-rw-r--r--django/core/management.py156
-rw-r--r--django/core/serializers/base.py7
-rw-r--r--django/core/serializers/xml_serializer.py4
-rw-r--r--django/core/servers/basehttp.py10
-rw-r--r--django/core/urlresolvers.py53
-rw-r--r--django/core/validators.py23
-rw-r--r--django/db/backends/ado_mssql/creation.py7
-rw-r--r--django/db/backends/mysql/creation.py7
-rw-r--r--django/db/backends/mysql_old/creation.py7
-rw-r--r--django/db/backends/oracle/creation.py5
-rw-r--r--django/db/backends/postgresql/creation.py7
-rw-r--r--django/db/backends/postgresql_psycopg2/introspection.py7
-rw-r--r--django/db/backends/sqlite3/creation.py7
-rw-r--r--django/db/backends/sqlite3/introspection.py2
-rw-r--r--django/db/models/__init__.py14
-rw-r--r--django/db/models/base.py8
-rw-r--r--django/db/models/fields/__init__.py77
-rw-r--r--django/db/models/fields/related.py30
-rw-r--r--django/db/models/manager.py6
-rw-r--r--django/db/models/query.py26
-rw-r--r--django/http/__init__.py7
-rw-r--r--django/middleware/common.py2
-rw-r--r--django/middleware/http.py5
-rw-r--r--django/newforms/extras/widgets.py2
-rw-r--r--django/newforms/fields.py103
-rw-r--r--django/newforms/forms.py36
-rw-r--r--django/newforms/models.py22
-rw-r--r--django/newforms/widgets.py52
-rw-r--r--django/oldforms/__init__.py120
-rw-r--r--django/shortcuts/__init__.py60
-rw-r--r--django/template/__init__.py4
-rw-r--r--django/template/defaultfilters.py2
-rw-r--r--django/template/defaulttags.py31
-rw-r--r--django/template/loaders/app_directories.py19
-rw-r--r--django/template/loaders/filesystem.py12
-rw-r--r--django/test/client.py7
-rw-r--r--django/test/simple.py129
-rw-r--r--django/test/testcases.py14
-rw-r--r--django/test/utils.py6
-rw-r--r--django/utils/_os.py23
-rw-r--r--django/utils/cache.py17
-rw-r--r--django/utils/dateformat.py2
-rw-r--r--django/utils/decorators.py7
-rw-r--r--django/utils/encoding.py1
-rw-r--r--django/utils/feedgenerator.py5
-rw-r--r--django/utils/functional.py12
-rw-r--r--django/utils/html.py45
-rw-r--r--django/utils/http.py7
-rw-r--r--django/utils/maxlength.py67
-rw-r--r--django/utils/timesince.py6
-rw-r--r--docs/add_ons.txt2
-rw-r--r--docs/api_stability.txt5
-rw-r--r--docs/authentication.txt26
-rw-r--r--docs/cache.txt2
-rw-r--r--docs/contributing.txt44
-rw-r--r--docs/databases.txt2
-rw-r--r--docs/db-api.txt107
-rw-r--r--docs/distributions.txt24
-rw-r--r--docs/django-admin.txt13
-rw-r--r--docs/email.txt2
-rw-r--r--docs/faq.txt3
-rw-r--r--docs/fastcgi.txt2
-rw-r--r--docs/forms.txt10
-rw-r--r--docs/i18n.txt2
-rw-r--r--docs/install.txt28
-rw-r--r--docs/middleware.txt8
-rw-r--r--docs/model-api.txt245
-rw-r--r--docs/modpython.txt4
-rw-r--r--docs/newforms.txt158
-rw-r--r--docs/overview.txt24
-rw-r--r--docs/release_notes_0.95.txt2
-rw-r--r--docs/request_response.txt2
-rw-r--r--docs/sitemaps.txt2
-rw-r--r--docs/sites.txt28
-rw-r--r--docs/static_files.txt8
-rw-r--r--docs/syndication_feeds.txt50
-rw-r--r--docs/templates.txt101
-rw-r--r--docs/templates_python.txt4
-rw-r--r--docs/testing.txt74
-rw-r--r--docs/tutorial01.txt50
-rw-r--r--docs/tutorial02.txt8
-rw-r--r--docs/tutorial03.txt5
-rw-r--r--docs/tutorial04.txt21
-rw-r--r--docs/url_dispatch.txt8
-rw-r--r--tests/modeltests/basic/models.py2
-rw-r--r--tests/modeltests/choices/models.py4
-rw-r--r--tests/modeltests/custom_columns/models.py6
-rw-r--r--tests/modeltests/custom_managers/models.py10
-rw-r--r--tests/modeltests/custom_methods/models.py2
-rw-r--r--tests/modeltests/custom_pk/models.py8
-rw-r--r--tests/modeltests/field_defaults/models.py2
-rw-r--r--tests/modeltests/fixtures/models.py2
-rw-r--r--tests/modeltests/generic_relations/models.py8
-rw-r--r--tests/modeltests/get_latest/models.py4
-rw-r--r--tests/modeltests/get_object_or_404/models.py31
-rw-r--r--tests/modeltests/get_or_create/models.py4
-rw-r--r--tests/modeltests/invalid_models/models.py46
-rw-r--r--tests/modeltests/lookup/models.py24
-rw-r--r--tests/modeltests/m2m_and_m2o/models.py2
-rw-r--r--tests/modeltests/m2m_intermediary/models.py8
-rw-r--r--tests/modeltests/m2m_multiple/models.py4
-rw-r--r--tests/modeltests/m2m_recursive/models.py2
-rw-r--r--tests/modeltests/m2o_recursive/models.py2
-rw-r--r--tests/modeltests/m2o_recursive2/models.py2
-rw-r--r--tests/modeltests/manipulators/models.py8
-rw-r--r--tests/modeltests/many_to_many/models.py4
-rw-r--r--tests/modeltests/many_to_one/models.py6
-rw-r--r--tests/modeltests/many_to_one_null/models.py4
-rw-r--r--tests/modeltests/model_forms/models.py32
-rw-r--r--tests/modeltests/model_inheritance/models.py4
-rw-r--r--tests/modeltests/mutually_referential/models.py4
-rw-r--r--tests/modeltests/one_to_one/models.py12
-rw-r--r--tests/modeltests/or_lookups/models.py2
-rw-r--r--tests/modeltests/ordering/models.py2
-rw-r--r--tests/modeltests/pagination/models.py2
-rw-r--r--tests/modeltests/properties/models.py4
-rw-r--r--tests/modeltests/reserved_names/models.py16
-rw-r--r--tests/modeltests/reverse_lookup/models.py6
-rw-r--r--tests/modeltests/save_delete_hooks/models.py4
-rw-r--r--tests/modeltests/select_related/models.py16
-rw-r--r--tests/modeltests/serializers/models.py6
-rw-r--r--tests/modeltests/str/models.py7
-rw-r--r--tests/modeltests/test_client/fixtures/testdata.json18
-rw-r--r--tests/modeltests/test_client/models.py18
-rw-r--r--tests/modeltests/test_client/tests.py20
-rw-r--r--tests/modeltests/test_client/views.py3
-rw-r--r--tests/modeltests/transactions/models.py4
-rw-r--r--tests/modeltests/validation/models.py2
-rw-r--r--tests/regressiontests/bug639/models.py2
-rw-r--r--tests/regressiontests/cache/tests.py41
-rw-r--r--tests/regressiontests/datatypes/models.py2
-rw-r--r--tests/regressiontests/fixtures_regress/fixtures/pretty.xml11
-rw-r--r--tests/regressiontests/fixtures_regress/models.py23
-rw-r--r--tests/regressiontests/forms/localflavor.py49
-rw-r--r--tests/regressiontests/forms/tests.py129
-rw-r--r--tests/regressiontests/initial_sql_regress/models.py2
-rw-r--r--tests/regressiontests/invalid_admin_options/models.py72
-rw-r--r--tests/regressiontests/many_to_one_regress/models.py6
-rw-r--r--tests/regressiontests/maxlength/__init__.py0
-rw-r--r--tests/regressiontests/maxlength/models.py0
-rw-r--r--tests/regressiontests/maxlength/tests.py160
-rw-r--r--tests/regressiontests/model_fields/__init__.py0
-rw-r--r--tests/regressiontests/model_fields/models.py0
-rw-r--r--tests/regressiontests/model_fields/tests.py18
-rw-r--r--tests/regressiontests/model_regress/models.py2
-rw-r--r--tests/regressiontests/null_queries/models.py4
-rw-r--r--tests/regressiontests/one_to_one_regress/models.py6
-rw-r--r--tests/regressiontests/serializers_regress/models.py37
-rw-r--r--tests/regressiontests/serializers_regress/tests.py28
-rw-r--r--tests/regressiontests/string_lookup/models.py12
-rw-r--r--tests/regressiontests/templates/tests.py53
-rw-r--r--tests/regressiontests/templates/urls.py4
-rw-r--r--tests/regressiontests/test_client_regress/models.py41
-rw-r--r--tests/regressiontests/test_client_regress/views.py2
-rw-r--r--tests/regressiontests/utils/__init__.py0
-rw-r--r--tests/regressiontests/utils/models.py1
-rw-r--r--tests/regressiontests/utils/tests.py115
-rwxr-xr-xtests/runtests.py13
221 files changed, 9821 insertions, 6789 deletions
diff --git a/AUTHORS b/AUTHORS
index 6758ac29f2..d2c799ad3e 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -57,10 +57,12 @@ answer newbie questions, and generally made Django that much better:
Ned Batchelder <http://www.nedbatchelder.com/>
Shannon -jj Behrens <http://jjinux.blogspot.com/>
Esdras Beleza <linux@esdrasbeleza.com>
+ Chris Bennett <chrisrbennett@yahoo.com>
James Bennett
Ben <afternoon@uk2.net>
Paul Bissex <http://e-scribe.com/>
Simon Blanchard
+ Matt Boersma <ogghead@gmail.com>
boobsd@gmail.com
Andrew Brehaut <http://brehaut.net/blog>
brut.alll@gmail.com
@@ -94,10 +96,12 @@ answer newbie questions, and generally made Django that much better:
Maximillian Dornseif <md@hudora.de>
Jeremy Dunck <http://dunck.us/>
Andrew Durdin <adurdin@gmail.com>
+ dusk@woofle.net
Andy Dustman <farcepest@gmail.com>
Clint Ecker
enlight
Enrico <rico.bl@gmail.com>
+ A. Murat Eren <meren@pardus.org.tr>
Ludvig Ericson <ludvig.ericson@gmail.com>
Dirk Eschler <dirk.eschler@gmx.net>
Marc Fargas <telenieko@telenieko.com>
@@ -114,7 +118,7 @@ answer newbie questions, and generally made Django that much better:
glin@seznam.cz
martin.glueck@gmail.com
GomoX <gomo@datafull.com>
- Mario Gonzalez <gonzalemario @t gmail.com>
+ Mario Gonzalez <gonzalemario@gmail.com>
Simon Greenhill <dev@simon.net.nz>
Owen Griffiths
Espen Grindhaug <http://grindhaug.org/>
@@ -141,7 +145,8 @@ answer newbie questions, and generally made Django that much better:
junzhang.jn@gmail.com
Antti Kaihola <http://akaihola.blogspot.com/>
Ben Dean Kawamura <ben.dean.kawamura@gmail.com>
- ian.g.kelly@gmail.com
+ Ian G. Kelly <ian.g.kelly@gmail.com>
+ Ben Khoo <khoobks@westnet.com.au>
Garth Kidd <http://www.deadlybloodyserious.com/>
kilian <kilian.cavalotti@lip6.fr>
Sune Kirkeby <http://ibofobi.dk/>
@@ -153,6 +158,7 @@ answer newbie questions, and generally made Django that much better:
Martin Kosír <martin@martinkosir.net>
Meir Kriheli <http://mksoft.co.il/>
Bruce Kroeze <http://coderseye.com/>
+ krzysiek.pawlik@silvermedia.pl
Joseph Kocherhans
konrad@gwu.edu
kurtiss@meetro.com
@@ -167,13 +173,14 @@ answer newbie questions, and generally made Django that much better:
lerouxb@gmail.com
Waylan Limberg <waylan@gmail.com>
limodou
+ Philip Lindborg <philip.lindborg@gmail.com>
Matt McClanahan <http://mmcc.cx/>
Martin Maney <http://www.chipy.org/Martin_Maney>
masonsimon+django@gmail.com
Manuzhai
Petar Marić <http://www.petarmaric.com/>
Nuno Mariz <nmariz@gmail.com>
- marijn@metronomo.cl
+ Marijn Vriens <marijn@metronomo.cl>
mark@junklight.com
Yasushi Masuda <whosaysni@gmail.com>
mattycakes@gmail.com
@@ -183,6 +190,7 @@ answer newbie questions, and generally made Django that much better:
mikko@sorl.net
mitakummaa@gmail.com
mmarshall
+ Andreas Mock <andreas.mock@web.de>
Reza Mohammadi <reza@zeerak.ir>
Eric Moritz <http://eric.themoritzfamily.com/>
mrmachine <real.human@mrmachine.net>
@@ -207,6 +215,7 @@ answer newbie questions, and generally made Django that much better:
plisk
Daniel Poelzleithner <http://poelzi.org/>
polpak@yahoo.com
+ Johann Queuniet <johann.queuniet@adh.naellia.eu>
J. Rademaker
Michael Radziej <mir@noris.de>
Ramiro Morales <rm0@gmx.net>
@@ -216,12 +225,14 @@ answer newbie questions, and generally made Django that much better:
rhettg@gmail.com
Henrique Romano <onaiort@gmail.com>
Armin Ronacher
+ Brian Rosner <brosner@gmail.com>
Oliver Rutherfurd <http://rutherfurd.net/>
Ivan Sagalaev (Maniac) <http://www.softwaremaniacs.org/>
Vinay Sajip <vinay_sajip@yahoo.co.uk>
David Schein
scott@staplefish.com
serbaut@gmail.com
+ John Shaffer <jshaffer2112@gmail.com>
Pete Shinners <pete@shinners.org>
Jozko Skrablin <jozko.skrablin@gmail.com>
SmileyChris <smileychris@gmail.com>
@@ -232,6 +243,8 @@ answer newbie questions, and generally made Django that much better:
Vasiliy Stavenko <stavenko@gmail.com>
Thomas Steinacher <http://www.eggdrop.ch/>
nowell strite
+ Sundance
+ SuperJared
Radek Švarz <http://www.svarz.cz/translate/>
Swaroop C H <http://www.swaroopch.info>
Aaron Swartz <http://www.aaronsw.com/>
diff --git a/django/bin/make-messages.py b/django/bin/make-messages.py
index 3e5acb70cb..e824611ca3 100755
--- a/django/bin/make-messages.py
+++ b/django/bin/make-messages.py
@@ -9,6 +9,7 @@ import re
import os
import sys
import getopt
+from itertools import dropwhile
pythonize_re = re.compile(r'\n\s*//')
@@ -103,8 +104,8 @@ def make_messages():
open(os.path.join(dirpath, '%s.py' % file), "wb").write(templatize(src))
thefile = '%s.py' % file
if verbose: sys.stdout.write('processing file %s in %s\n' % (file, dirpath))
- cmd = 'xgettext %s -d %s -L Python --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy:1,2 --keyword=ugettext_noop --keyword=ugettext_lazy --keyword=ungettext_lazy:1,2 --from-code UTF-8 -o - "%s"' % (
- os.path.exists(potfile) and '--omit-header' or '', domain, os.path.join(dirpath, thefile))
+ cmd = 'xgettext -d %s -L Python --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy:1,2 --keyword=ugettext_noop --keyword=ugettext_lazy --keyword=ungettext_lazy:1,2 --from-code UTF-8 -o - "%s"' % (
+ domain, os.path.join(dirpath, thefile))
(stdin, stdout, stderr) = os.popen3(cmd, 'b')
msgs = stdout.read()
errors = stderr.read()
@@ -116,13 +117,18 @@ def make_messages():
old = '#: '+os.path.join(dirpath, thefile)[2:]
new = '#: '+os.path.join(dirpath, file)[2:]
msgs = msgs.replace(old, new)
+ if os.path.exists(potfile):
+ # Strip the header
+ msgs = '\n'.join(dropwhile(len, msgs.split('\n')))
+ else:
+ msgs = msgs.replace('charset=CHARSET', 'charset=UTF-8')
if msgs:
open(potfile, 'ab').write(msgs)
if thefile != file:
os.unlink(os.path.join(dirpath, thefile))
if os.path.exists(potfile):
- (stdin, stdout, stderr) = os.popen3('msguniq "%s"' % potfile, 'b')
+ (stdin, stdout, stderr) = os.popen3('msguniq --to-code=utf-8 "%s"' % potfile, 'b')
msgs = stdout.read()
errors = stderr.read()
if errors:
diff --git a/django/conf/__init__.py b/django/conf/__init__.py
index 021ecc8131..f28da2d764 100644
--- a/django/conf/__init__.py
+++ b/django/conf/__init__.py
@@ -37,6 +37,8 @@ class LazySettings(object):
# __setattr__(), which would be an infinite loop.
self.__dict__['_target'] = value
else:
+ if self._target is None:
+ self._import_settings()
setattr(self._target, name, value)
def _import_settings(self):
diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py
index 2a7df569fb..33f7aebb6b 100644
--- a/django/conf/global_settings.py
+++ b/django/conf/global_settings.py
@@ -30,7 +30,6 @@ TIME_ZONE = 'America/Chicago'
# Language code for this installation. All choices can be found here:
# http://www.w3.org/TR/REC-html40/struct/dirlang.html#langcodes
-# http://blogs.law.harvard.edu/tech/stories/storyReader$15
LANGUAGE_CODE = 'en-us'
# Languages we provide translations for, out of the box. The language name
diff --git a/django/conf/locale/de/LC_MESSAGES/djangojs.mo b/django/conf/locale/de/LC_MESSAGES/djangojs.mo
index 9f39c16444..896847bb99 100644
--- a/django/conf/locale/de/LC_MESSAGES/djangojs.mo
+++ b/django/conf/locale/de/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/de/LC_MESSAGES/djangojs.po b/django/conf/locale/de/LC_MESSAGES/djangojs.po
index 3c0852ebac..936dcb454f 100644
--- a/django/conf/locale/de/LC_MESSAGES/djangojs.po
+++ b/django/conf/locale/de/LC_MESSAGES/djangojs.po
@@ -11,21 +11,21 @@ msgstr ""
"PO-Revision-Date: 2005-12-04 13:21+0100\n"
"Last-Translator: Dirk Eschler <dirk.eschler@gmx.net>\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: contrib/admin/media/js/SelectFilter2.js:33
#, perl-format
msgid "Available %s"
-msgstr "Verfgbare %s"
+msgstr "Verfügbare %s"
#: contrib/admin/media/js/SelectFilter2.js:41
msgid "Choose all"
-msgstr "Alles auswhlen"
+msgstr "Alles auswählen"
#: contrib/admin/media/js/SelectFilter2.js:46
msgid "Add"
-msgstr "Hinzufgen"
+msgstr "Hinzufügen"
#: contrib/admin/media/js/SelectFilter2.js:48
msgid "Remove"
@@ -34,15 +34,15 @@ msgstr "Entfernen"
#: contrib/admin/media/js/SelectFilter2.js:53
#, perl-format
msgid "Chosen %s"
-msgstr "Ausgewhlte %s"
+msgstr "Ausgewählte %s"
#: contrib/admin/media/js/SelectFilter2.js:54
msgid "Select your choice(s) and click "
-msgstr "Gewnschte Auswahl treffen und "
+msgstr "Gewünschte Auswahl treffen und "
#: contrib/admin/media/js/SelectFilter2.js:59
msgid "Clear all"
-msgstr "Alles abwhlen"
+msgstr "Alles abwählen"
#: contrib/admin/media/js/dateparse.js:26
#: contrib/admin/media/js/calendar.js:24
@@ -50,7 +50,7 @@ msgid ""
"January February March April May June July August September October November "
"December"
msgstr ""
-"Januar Februar Mrz April Mai Juni Juli August September Oktober November "
+"Januar Februar März April Mai Juni Juli August September Oktober November "
"Dezember"
#: contrib/admin/media/js/dateparse.js:27
diff --git a/django/conf/locale/es/LC_MESSAGES/django.mo b/django/conf/locale/es/LC_MESSAGES/django.mo
index d1c1edab1e..4b8254b95a 100644
--- a/django/conf/locale/es/LC_MESSAGES/django.mo
+++ b/django/conf/locale/es/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/es/LC_MESSAGES/django.po b/django/conf/locale/es/LC_MESSAGES/django.po
index ea15352d4d..4dcc433098 100644
--- a/django/conf/locale/es/LC_MESSAGES/django.po
+++ b/django/conf/locale/es/LC_MESSAGES/django.po
@@ -6,1181 +6,804 @@ msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2007-06-29 10:15-0400\n"
-"PO-Revision-Date: 2007-02-24 18:02-0600\n"
+"POT-Creation-Date: 2007-07-14 13:46-0500\n"
+"PO-Revision-Date: 2007-07-14 13:00-0500\n"
"Last-Translator: Mario Gonzalez <gonzalemario @t gmail.com>\n"
"Language-Team: Castellano <Django-I18N@googlegroups.com>\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: oldforms/__init__.py:357 db/models/fields/__init__.py:126
-#: db/models/fields/__init__.py:283 db/models/fields/__init__.py:680
-#: db/models/fields/__init__.py:691 newforms/models.py:185
-#: newforms/fields.py:87 newforms/fields.py:444 newforms/fields.py:522
-#: newforms/fields.py:533
-msgid "This field is required."
-msgstr "Este campo es obligatorio."
-
-#: oldforms/__init__.py:392
+#: db/models/manipulators.py:309
#, python-format
-msgid "Ensure your text is less than %s character."
-msgid_plural "Ensure your text is less than %s characters."
-msgstr[0] "Asegrese de que su texto tiene menos de %s carcter."
-msgstr[1] "Asegrese de que su texto tiene menos de %s caracteres."
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s de este %(type)s ya existen en este %(field)s."
-#: oldforms/__init__.py:397
-msgid "Line breaks are not allowed here."
-msgstr "No se permiten saltos de lnea."
+#: db/models/manipulators.py:310 contrib/admin/views/main.py:342
+#: contrib/admin/views/main.py:344 contrib/admin/views/main.py:346
+msgid "and"
+msgstr "y"
-#: oldforms/__init__.py:498 oldforms/__init__.py:571 oldforms/__init__.py:610
+#: db/models/fields/related.py:55
#, python-format
-msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
-msgstr "Escoja una opcin vlida; '%(data)s' no est en %(choices)s."
-
-#: oldforms/__init__.py:577 newforms/widgets.py:181
-#: contrib/admin/filterspecs.py:150
-msgid "Unknown"
-msgstr "Desconocido"
-
-#: oldforms/__init__.py:577 newforms/widgets.py:181
-#: contrib/admin/filterspecs.py:143
-msgid "Yes"
-msgstr "S"
+msgid "Please enter a valid %s."
+msgstr "Por favor, introduzca un %s válido."
-#: oldforms/__init__.py:577 newforms/widgets.py:181
-#: contrib/admin/filterspecs.py:143
-msgid "No"
-msgstr "No"
+#: db/models/fields/related.py:641
+msgid "Separate multiple IDs with commas."
+msgstr "Separe múltiples IDs con comas."
-#: oldforms/__init__.py:672 core/validators.py:175 core/validators.py:453
-msgid "No file was submitted. Check the encoding type on the form."
+#: db/models/fields/related.py:643
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr ""
-"No se ha enviado ningn fichero. Compruebe el tipo de codificacin en el "
-"formulario."
-
-#: oldforms/__init__.py:674
-msgid "The submitted file is empty."
-msgstr "El fichero enviado est vaco."
-
-#: oldforms/__init__.py:730
-msgid "Enter a whole number between -32,768 and 32,767."
-msgstr "Introduzca un nmero entero entre -32,768 y 32,767."
-
-#: oldforms/__init__.py:740
-msgid "Enter a positive number."
-msgstr "Introduzca un nmero positivo."
-
-#: oldforms/__init__.py:750
-msgid "Enter a whole number between 0 and 32,767."
-msgstr "Introduzca un nmero entero entre 0 y 32,767."
+"Mantenga presionado \"Control\", o \"Command\" en un Mac, para seleccionar "
+"más de uno."
-#: db/models/manipulators.py:307
+#: db/models/fields/related.py:690
#, python-format
-msgid "%(object)s with this %(type)s already exists for the given %(field)s."
-msgstr "%(object)s de este %(type)s ya existen en este %(field)s."
-
-#: db/models/manipulators.py:308 contrib/admin/views/main.py:340
-#: contrib/admin/views/main.py:342 contrib/admin/views/main.py:344
-msgid "and"
-msgstr "y"
+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] ""
+"Por favor, introduzca IDs de %(self)s válidos. El valor %(value)r no es "
+"válido."
+msgstr[1] ""
+"Por favor, introduzca IDs de %(self)s válidos. Los valores %(value)r no son "
+"válidos."
-#: db/models/fields/__init__.py:46
+#: db/models/fields/__init__.py:47
#, python-format
msgid "%(optname)s with this %(fieldname)s already exists."
msgstr "Ya existe %(optname)s con este %(fieldname)s."
-#: db/models/fields/__init__.py:378
+#: db/models/fields/__init__.py:127 db/models/fields/__init__.py:284
+#: db/models/fields/__init__.py:681 db/models/fields/__init__.py:692
+#: oldforms/__init__.py:369 newforms/fields.py:92 newforms/fields.py:440
+#: newforms/fields.py:516 newforms/fields.py:527 newforms/models.py:187
+msgid "This field is required."
+msgstr "Este campo es obligatorio."
+
+#: db/models/fields/__init__.py:379
msgid "This value must be an integer."
msgstr "Este valor debe ser un entero."
-#: db/models/fields/__init__.py:413
+#: db/models/fields/__init__.py:414
msgid "This value must be either True or False."
msgstr "Este valor debe ser Verdadero o Falso."
-#: db/models/fields/__init__.py:434
+#: db/models/fields/__init__.py:435
msgid "This field cannot be null."
-msgstr "Este campo no puede estar vaco."
+msgstr "Este campo no puede estar vacío."
-#: db/models/fields/__init__.py:468 core/validators.py:149
+#: db/models/fields/__init__.py:469 core/validators.py:155
msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr "Introduzca una fecha vlida en formato AAAA-MM-DD."
+msgstr "Introduzca una fecha válida en formato AAAA-MM-DD."
-#: db/models/fields/__init__.py:537 core/validators.py:158
+#: db/models/fields/__init__.py:538 core/validators.py:164
msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
-msgstr "Introduzca una fecha/hora vlida en formato AAAA-MM-DD HH:MM."
+msgstr "Introduzca una fecha/hora válida en formato AAAA-MM-DD HH:MM."
-#: db/models/fields/__init__.py:597
+#: db/models/fields/__init__.py:598
msgid "This value must be a decimal number."
msgstr "Este valor debe ser un entero."
-#: db/models/fields/__init__.py:700
+#: db/models/fields/__init__.py:701
msgid "Enter a valid filename."
-msgstr "Introduzca un nombre de fichero vlido"
+msgstr "Introduzca un nombre de fichero válido"
-#: db/models/fields/__init__.py:825
+#: db/models/fields/__init__.py:826
msgid "This value must be either None, True or False."
msgstr "Este valor debe ser Verdadero o Falso."
-#: db/models/fields/related.py:54
-#, python-format
-msgid "Please enter a valid %s."
-msgstr "Por favor, introduzca un %s vlido."
-
-#: db/models/fields/related.py:640
-msgid "Separate multiple IDs with commas."
-msgstr "Separe mltiples IDs con comas."
-
-#: db/models/fields/related.py:642
-msgid ""
-"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
-msgstr ""
-"Mantenga presionado \"Control\", o \"Command\" en un Mac, para seleccionar "
-"ms de uno."
-
-#: db/models/fields/related.py:689
-#, 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] ""
-"Por favor, introduzca IDs de %(self)s vlidos. El valor %(value)r no es "
-"vlido."
-msgstr[1] ""
-"Por favor, introduzca IDs de %(self)s vlidos. Los valores %(value)r no son "
-"vlidos."
-
-#: conf/global_settings.py:39
+#: conf/global_settings.py:38
msgid "Arabic"
-msgstr "rabe"
+msgstr "Árabe"
-#: conf/global_settings.py:40
+#: conf/global_settings.py:39
msgid "Bengali"
-msgstr "Bengal"
+msgstr "Bengalí"
-#: conf/global_settings.py:41
+#: conf/global_settings.py:40
msgid "Bulgarian"
-msgstr "Blgaro"
+msgstr "Búlgaro"
-#: conf/global_settings.py:42
+#: conf/global_settings.py:41
msgid "Catalan"
-msgstr "Cataln"
+msgstr "Catalán"
-#: conf/global_settings.py:43
+#: conf/global_settings.py:42
msgid "Czech"
msgstr "Checo"
-#: conf/global_settings.py:44
+#: conf/global_settings.py:43
msgid "Welsh"
-msgstr "Gals"
+msgstr "Galés"
-#: conf/global_settings.py:45
+#: conf/global_settings.py:44
msgid "Danish"
-msgstr "Dans"
+msgstr "Danés"
-#: conf/global_settings.py:46
+#: conf/global_settings.py:45
msgid "German"
-msgstr "Alemn"
+msgstr "Alemán"
-#: conf/global_settings.py:47
+#: conf/global_settings.py:46
msgid "Greek"
msgstr "Griego"
-#: conf/global_settings.py:48
+#: conf/global_settings.py:47
msgid "English"
-msgstr "Ingls"
+msgstr "Inglés"
-#: conf/global_settings.py:49
+#: conf/global_settings.py:48
msgid "Spanish"
-msgstr "Espaol"
+msgstr "Español"
-#: conf/global_settings.py:50
+#: conf/global_settings.py:49
msgid "Argentinean Spanish"
-msgstr "Espaol Argentino"
+msgstr "Español Argentino"
-#: conf/global_settings.py:51
-#, fuzzy
+#: conf/global_settings.py:50
msgid "Persian"
-msgstr "Serbio"
+msgstr "Persa"
-#: conf/global_settings.py:52
+#: conf/global_settings.py:51
msgid "Finnish"
-msgstr "Fins"
+msgstr "Finés"
-#: conf/global_settings.py:53
+#: conf/global_settings.py:52
msgid "French"
-msgstr "Francs"
+msgstr "Francés"
-#: conf/global_settings.py:54
+#: conf/global_settings.py:53
msgid "Galician"
msgstr "Gallego"
-#: conf/global_settings.py:55
+#: conf/global_settings.py:54
msgid "Hungarian"
-msgstr "Hngaro"
+msgstr "Húngaro"
-#: conf/global_settings.py:56
+#: conf/global_settings.py:55
msgid "Hebrew"
msgstr "Hebreo"
-#: conf/global_settings.py:57
+#: conf/global_settings.py:56
msgid "Icelandic"
-msgstr "Islands"
+msgstr "Islandés"
-#: conf/global_settings.py:58
+#: conf/global_settings.py:57
msgid "Italian"
msgstr "Italiano"
-#: conf/global_settings.py:59
+#: conf/global_settings.py:58
msgid "Japanese"
-msgstr "Japons"
+msgstr "Japonés"
-#: conf/global_settings.py:60
+#: conf/global_settings.py:59
msgid "Korean"
msgstr "Koreano"
-#: conf/global_settings.py:61
+#: conf/global_settings.py:60
msgid "Kannada"
msgstr "Kannada"
-#: conf/global_settings.py:62
+#: conf/global_settings.py:61
msgid "Latvian"
msgstr "Latvio"
-#: conf/global_settings.py:63
+#: conf/global_settings.py:62
msgid "Macedonian"
msgstr "Macedonio"
-#: conf/global_settings.py:64
+#: conf/global_settings.py:63
msgid "Dutch"
-msgstr "Alemn"
+msgstr "Alemán"
-#: conf/global_settings.py:65
+#: conf/global_settings.py:64
msgid "Norwegian"
msgstr "Noruego"
-#: conf/global_settings.py:66
+#: conf/global_settings.py:65
msgid "Polish"
msgstr "Polaco"
-#: conf/global_settings.py:67
+#: conf/global_settings.py:66
msgid "Portugese"
-msgstr "Portugs"
+msgstr "Portugés"
-#: conf/global_settings.py:68
+#: conf/global_settings.py:67
msgid "Brazilian"
-msgstr "Brasileo"
+msgstr "Brasileño"
-#: conf/global_settings.py:69
+#: conf/global_settings.py:68
msgid "Romanian"
msgstr "Rumano"
-#: conf/global_settings.py:70
+#: conf/global_settings.py:69
msgid "Russian"
msgstr "Ruso"
-#: conf/global_settings.py:71
+#: conf/global_settings.py:70
msgid "Slovak"
msgstr "Eslovaco"
-#: conf/global_settings.py:72
+#: conf/global_settings.py:71
msgid "Slovenian"
msgstr "Esloveno"
-#: conf/global_settings.py:73
+#: conf/global_settings.py:72
msgid "Serbian"
msgstr "Serbio"
-#: conf/global_settings.py:74
+#: conf/global_settings.py:73
msgid "Swedish"
msgstr "Sueco"
-#: conf/global_settings.py:75
+#: conf/global_settings.py:74
msgid "Tamil"
msgstr "Tamil"
-#: conf/global_settings.py:76
+#: conf/global_settings.py:75
msgid "Telugu"
-msgstr ""
+msgstr "Telugu"
-#: conf/global_settings.py:77
+#: conf/global_settings.py:76
msgid "Turkish"
msgstr "Turco"
-#: conf/global_settings.py:78
+#: conf/global_settings.py:77
msgid "Ukrainian"
msgstr "Ucraniano"
-#: conf/global_settings.py:79
+#: conf/global_settings.py:78
msgid "Simplified Chinese"
msgstr "Chino simplificado"
-#: conf/global_settings.py:80
+#: conf/global_settings.py:79
msgid "Traditional Chinese"
msgstr "Chino tradicional"
-#: core/validators.py:65
+#: core/validators.py:71
msgid "This value must contain only letters, numbers and underscores."
-msgstr "Este valor debe contener slo letras, nmeros y guiones bajos."
+msgstr "Este valor debe contener sólo letras, números y guiones bajos."
-#: core/validators.py:69
+#: core/validators.py:75
msgid ""
"This value must contain only letters, numbers, underscores, dashes or "
"slashes."
msgstr ""
-"Este valor debe contener letras, nmeros, guiones bajos o barras solamente."
+"Este valor debe contener letras, números, guiones bajos o barras solamente."
-#: core/validators.py:73
+#: core/validators.py:79
msgid "This value must contain only letters, numbers, underscores or hyphens."
-msgstr "Este valor debe contener slo letras, nmeros, guiones bajos o medios."
+msgstr "Este valor debe contener sólo letras, números, guiones bajos o medios."
-#: core/validators.py:77
+#: core/validators.py:83
msgid "Uppercase letters are not allowed here."
-msgstr "No se admiten letras maysculas."
+msgstr "No se admiten letras mayúsculas."
-#: core/validators.py:81
+#: core/validators.py:87
msgid "Lowercase letters are not allowed here."
-msgstr "No se admiten letras minsculas."
+msgstr "No se admiten letras minúsculas."
-#: core/validators.py:88
+#: core/validators.py:94
msgid "Enter only digits separated by commas."
-msgstr "Introduzca slo dgitos separados por comas."
+msgstr "Introduzca sólo dígitos separados por comas."
-#: core/validators.py:100
+#: core/validators.py:106
msgid "Enter valid e-mail addresses separated by commas."
-msgstr "Introduzca direcciones de correo vlidas separadas por comas."
+msgstr "Introduzca direcciones de correo válidas separadas por comas."
-#: core/validators.py:104
+#: core/validators.py:110
msgid "Please enter a valid IP address."
-msgstr "Por favor introduzca una direccin IP vlida."
+msgstr "Por favor introduzca una dirección IP válida."
-#: core/validators.py:108
+#: core/validators.py:114
msgid "Empty values are not allowed here."
-msgstr "No se admiten valores vacos."
+msgstr "No se admiten valores vacíos."
-#: core/validators.py:112
+#: core/validators.py:118
msgid "Non-numeric characters aren't allowed here."
-msgstr "No se admiten caracteres no numricos."
+msgstr "No se admiten caracteres no numéricos."
-#: core/validators.py:116
+#: core/validators.py:122
msgid "This value can't be comprised solely of digits."
-msgstr "Este valor no puede comprender slo dgitos."
+msgstr "Este valor no puede comprender sólo dígitos."
-#: core/validators.py:121 newforms/fields.py:135
+#: core/validators.py:127 newforms/fields.py:141
msgid "Enter a whole number."
-msgstr "Introduzca un nmero entero."
+msgstr "Introduzca un número entero."
-#: core/validators.py:125
+#: core/validators.py:131
msgid "Only alphabetical characters are allowed here."
-msgstr "Slo se admiten caracteres alfabticos."
+msgstr "Sólo se admiten caracteres alfabéticos."
-#: core/validators.py:140
+#: core/validators.py:146
msgid "Year must be 1900 or later."
-msgstr "El ao debe ser 1900 o posterior."
+msgstr "El año debe ser 1900 o posterior."
-#: core/validators.py:144
+#: core/validators.py:150
+#, python-format
msgid "Invalid date: %s"
-msgstr "Fecha no vlida: %s"
+msgstr "Fecha no válida: %s"
-#: core/validators.py:154
+#: core/validators.py:160
msgid "Enter a valid time in HH:MM format."
-msgstr "Introduzca una hora vlida en formato HH:MM."
+msgstr "Introduzca una hora válida en formato HH:MM."
-#: core/validators.py:163 newforms/fields.py:339
+#: core/validators.py:169 newforms/fields.py:335
msgid "Enter a valid e-mail address."
-msgstr "Introduzca una direccin de correo electrnico vlida"
+msgstr "Introduzca una dirección de correo electrónico válida"
+
+#: core/validators.py:181 core/validators.py:461 oldforms/__init__.py:682
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"No se ha enviado ningún fichero. Compruebe el tipo de codificación en el "
+"formulario."
-#: core/validators.py:179
+#: core/validators.py:185
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-"Enve una imagen vlida. El fichero que ha enviado no era una imagen o se "
+"Envíe una imagen válida. El fichero que ha enviado no era una imagen o se "
"trataba de una imagen corrupta."
-#: core/validators.py:186
+#: core/validators.py:192
#, python-format
msgid "The URL %s does not point to a valid image."
-msgstr "La URL %s no apunta a una imagen vlida."
+msgstr "La URL %s no apunta a una imagen válida."
-#: core/validators.py:190
+#: core/validators.py:196
#, python-format
msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
msgstr ""
-"Los nmeros de telfono deben guardar el formato XXX-XXX-XXXX. \"%s\" no es "
-"vlido."
+"Los números de teléfono deben guardar el formato XXX-XXX-XXXX. \"%s\" no es "
+"válido."
-#: core/validators.py:198
+#: core/validators.py:204
#, python-format
msgid "The URL %s does not point to a valid QuickTime video."
-msgstr "La URL %s no apunta a un vdeo QuickTime vlido."
+msgstr "La URL %s no apunta a un vídeo QuickTime válido."
-#: core/validators.py:202
+#: core/validators.py:208
msgid "A valid URL is required."
-msgstr "Se precisa una URL vlida."
+msgstr "Se precisa una URL válida."
-#: core/validators.py:216
+#: core/validators.py:222
#, python-format
msgid ""
"Valid HTML is required. Specific errors are:\n"
"%s"
msgstr ""
-"Se precisa HTML vlido. Los errores especficos son:\n"
+"Se precisa HTML válido. Los errores específicos son:\n"
"%s"
-#: core/validators.py:223
+#: core/validators.py:229
#, python-format
msgid "Badly formed XML: %s"
msgstr "XML mal formado: %s"
-#: core/validators.py:240
+#: core/validators.py:246
#, python-format
msgid "Invalid URL: %s"
-msgstr "URL no vlida: %s"
+msgstr "URL no válida: %s"
-#: core/validators.py:245 core/validators.py:247
+#: core/validators.py:251 core/validators.py:253
#, python-format
msgid "The URL %s is a broken link."
msgstr "La URL %s es un enlace roto."
-#: core/validators.py:253
+#: core/validators.py:259
msgid "Enter a valid U.S. state abbreviation."
-msgstr "Introduzca una abreviatura vlida de estado de los EEUU."
+msgstr "Introduzca una abreviatura válida de estado de los EEUU."
-#: core/validators.py:267
+#: core/validators.py:273
#, 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] "Cuida tu vocabulario! Aqu no admitimos la palabra %s."
-msgstr[1] "Cuida tu vocabulario! Aqu no admitimos las palabras %s."
+msgstr[0] "¡Cuida tu vocabulario! Aquí no admitimos la palabra %s."
+msgstr[1] "¡Cuida tu vocabulario! Aquí no admitimos las palabras %s."
-#: core/validators.py:274
+#: core/validators.py:280
#, python-format
msgid "This field must match the '%s' field."
msgstr "Este campo debe concordar con el campo '%s'."
-#: core/validators.py:293
+#: core/validators.py:299
msgid "Please enter something for at least one field."
msgstr "Por favor, introduzca algo en al menos un campo."
-#: core/validators.py:302 core/validators.py:313
+#: core/validators.py:308 core/validators.py:319
msgid "Please enter both fields or leave them both empty."
-msgstr "Por favor, rellene ambos campos o deje ambos vacos."
+msgstr "Por favor, rellene ambos campos o deje ambos vacíos."
-#: core/validators.py:321
+#: core/validators.py:327
#, python-format
msgid "This field must be given if %(field)s is %(value)s"
msgstr "Se debe proporcionar este campo si %(field)s es %(value)s"
-#: core/validators.py:334
+#: core/validators.py:340
#, python-format
msgid "This field must be given if %(field)s is not %(value)s"
msgstr "Se debe proporcionar este campo si %(field)s no es %(value)s"
-#: core/validators.py:353
+#: core/validators.py:359
msgid "Duplicate values are not allowed."
msgstr "No se admiten valores duplicados."
-#: core/validators.py:368
+#: core/validators.py:374
#, python-format
msgid "This value must be between %(lower)s and %(upper)s."
msgstr "Este valor debe estar entre %(lower)s y %(upper)s."
-#: core/validators.py:370
+#: core/validators.py:376
#, python-format
msgid "This value must be at least %s."
-msgstr "Este valor debe ser como mnimo %s."
+msgstr "Este valor debe ser como mínimo %s."
-#: core/validators.py:372
+#: core/validators.py:378
#, python-format
msgid "This value must be no more than %s."
msgstr "Este valor no debe ser mayor que %s."
-#: core/validators.py:408
+#: core/validators.py:414
#, python-format
msgid "This value must be a power of %s."
msgstr "Este valor debe ser una potencia de %s."
-#: core/validators.py:417
+#: core/validators.py:424
msgid "Please enter a valid decimal number."
-msgstr "Por favor, introduzca un nmero decimal vlido."
+msgstr "Por favor, introduzca un número decimal válido."
-#: core/validators.py:423
+#: core/validators.py:431
#, 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] ""
-"Por favor, introduzca un nmero decimal vlido con a lo ms %s dgito en "
+"Por favor, introduzca un número decimal válido con a lo más %s dígito en "
"total."
msgstr[1] ""
-"Por favor, introduzca un nmero decimal vlido con a lo ms %s dgitos en "
+"Por favor, introduzca un número decimal válido con a lo más %s dígitos en "
"total."
-#: core/validators.py:426
+#: core/validators.py:434
#, 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] ""
-"Por favor, introduzca un nmero decimal vlido con a lo ms %s dgito en su "
+"Por favor, introduzca un número decimal válido con a lo más %s dígito en su "
"parte entera."
msgstr[1] ""
-"Por favor, introduzca un nmero decimal vlido con a lo ms %s dgitos en su "
+"Por favor, introduzca un número decimal válido con a lo más %s dígitos en su "
"parte entera."
-#: core/validators.py:429
+#: core/validators.py:437
#, 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] ""
-"Por favor, introduzca un nmero decimal vlido con a lo ms %s dgito "
+"Por favor, introduzca un número decimal válido con a lo más %s dígito "
"decimal."
msgstr[1] ""
-"Por favor, introduzca un nmero decimal vlido con a lo ms %s dgitos "
+"Por favor, introduzca un número decimal válido con a lo más %s dígitos "
"decimales."
-#: core/validators.py:437
-#, fuzzy
+#: core/validators.py:445
msgid "Please enter a valid floating point number."
-msgstr "Por favor, introduzca un nmero decimal vlido."
+msgstr "Por favor, introduzca un número decimal válido."
-#: core/validators.py:446
+#: core/validators.py:454
#, python-format
msgid "Make sure your uploaded file is at least %s bytes big."
-msgstr "Asegrese de que el fichero que enva tiene al menos %s bytes."
+msgstr "Asegúrese de que el fichero que envía tiene al menos %s bytes."
-#: core/validators.py:447
+#: core/validators.py:455
#, python-format
msgid "Make sure your uploaded file is at most %s bytes big."
-msgstr "Asegrese de que el fichero que enva tiene como mximo %s bytes."
+msgstr "Asegúrese de que el fichero que envía tiene como máximo %s bytes."
-#: core/validators.py:464
+#: core/validators.py:472
msgid "The format for this field is wrong."
msgstr "El formato de este campo es incorrecto."
-#: core/validators.py:479
+#: core/validators.py:487
msgid "This field is invalid."
-msgstr "Este campo no es vlido."
+msgstr "Este campo no es válido."
-#: core/validators.py:515
+#: core/validators.py:523
#, python-format
msgid "Could not retrieve anything from %s."
msgstr "No pude obtener nada de %s."
-#: core/validators.py:518
+#: core/validators.py:526
#, python-format
msgid ""
"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
msgstr ""
-"La URL %(url)s devolvi la cabecera Content-Type '%(contenttype)s', que no "
-"es vlida."
+"La URL %(url)s devolvió la cabecera Content-Type '%(contenttype)s', que no "
+"es válida."
-#: core/validators.py:551
+#: core/validators.py:559
#, python-format
msgid ""
"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
"\"%(start)s\".)"
msgstr ""
-"Por favor, cierre la etiqueta %(tag)s de la lnea %(line)s. (La lnea "
+"Por favor, cierre la etiqueta %(tag)s de la línea %(line)s. (La línea "
"empieza por \"%(start)s\".)"
-#: core/validators.py:555
+#: core/validators.py:563
#, python-format
msgid ""
"Some text starting on line %(line)s is not allowed in that context. (Line "
"starts with \"%(start)s\".)"
msgstr ""
-"Parte del texto que comienza en la lnea %(line)s no est permitido en ese "
-"contexto. (La lnea empieza por \"%(start)s\".)"
+"Parte del texto que comienza en la línea %(line)s no está permitido en ese "
+"contexto. (La línea empieza por \"%(start)s\".)"
-#: core/validators.py:560
+#: core/validators.py:568
#, python-format
msgid ""
"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
"(start)s\".)"
msgstr ""
-"El \"%(attr)s\" de la lnea %(line)s no es un atributo vlido. (La lnea "
+"El \"%(attr)s\" de la línea %(line)s no es un atributo válido. (La línea "
"empieza por \"%(start)s\".)"
-#: core/validators.py:565
+#: core/validators.py:573
#, python-format
msgid ""
"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
"(start)s\".)"
msgstr ""
-"La \"<%(tag)s>\" de la lnea %(line)s no es una etiqueta vlida. (La lnea "
+"La \"<%(tag)s>\" de la línea %(line)s no es una etiqueta válida. (La línea "
"empieza por \"%(start)s\".)"
-#: core/validators.py:569
+#: core/validators.py:577
#, python-format
msgid ""
"A tag on line %(line)s is missing one or more required attributes. (Line "
"starts with \"%(start)s\".)"
msgstr ""
-"A una etiqueta de la lnea %(line)s le faltan uno o ms atributos "
-"requeridos. (La lnea empieza por \"%(start)s\".)"
+"A una etiqueta de la línea %(line)s le faltan uno o más atributos "
+"requeridos. (La línea empieza por \"%(start)s\".)"
-#: core/validators.py:574
+#: core/validators.py:582
#, python-format
msgid ""
"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
"starts with \"%(start)s\".)"
msgstr ""
-"El atributo \"%(attr)s\" de la lnea %(line)s tiene un valor que no es "
-"vlido. (La lnea empieza por \"%(start)s\".)"
-
-#: views/generic/create_update.py:43
-#, python-format
-msgid "The %(verbose_name)s was created successfully."
-msgstr "El %(verbose_name)s se ha creado correctamente."
-
-#: views/generic/create_update.py:117
-#, python-format
-msgid "The %(verbose_name)s was updated successfully."
-msgstr "Se actualiz con xito el %(verbose_name)s."
-
-#: views/generic/create_update.py:184
-#, python-format
-msgid "The %(verbose_name)s was deleted."
-msgstr "El %(verbose_name)s ha sido eliminado."
-
-#: newforms/models.py:172 newforms/fields.py:432
-msgid "Select a valid choice. That choice is not one of the available choices."
-msgstr "Escoja una opcin vlida. Esa opcin no est entre las aceptadas."
-
-#: newforms/models.py:189 newforms/fields.py:448 newforms/fields.py:526
-msgid "Enter a list of values."
-msgstr "Introduzca una lista de valores."
-
-#: newforms/models.py:195 newforms/fields.py:457
-#, python-format
-msgid "Select a valid choice. %s is not one of the available choices."
-msgstr "Escoja una opcin vlida; '%s' no es una de las opciones disponibles."
-
-#: newforms/fields.py:110 newforms/fields.py:324
-#, python-format
-msgid "Ensure this value has at most %d characters."
-msgstr "Asegrese de que su texto tiene a lo ms %d caracteres."
-
-#: newforms/fields.py:112 newforms/fields.py:326
-#, python-format
-msgid "Ensure this value has at least %d characters."
-msgstr "Asegrese de que su texto tiene al menos %d caracteres."
-
-#: newforms/fields.py:137 newforms/fields.py:160 newforms/fields.py:192
-#, python-format
-msgid "Ensure this value is less than or equal to %s."
-msgstr "Asegrese de que este valor es menor o igual a %s."
-
-#: newforms/fields.py:139 newforms/fields.py:162 newforms/fields.py:194
-#, python-format
-msgid "Ensure this value is greater than or equal to %s."
-msgstr "Asegrese de que este valor es mayor o igual a %s."
-
-#: newforms/fields.py:158 newforms/fields.py:186
-msgid "Enter a number."
-msgstr "Introduzca un nmero."
-
-#: newforms/fields.py:196
-#, python-format
-msgid "Ensure that there are no more than %s digits in total."
-msgstr "Asegrese de que no hay ms de %s dgitos en total."
-
-#: newforms/fields.py:198
-#, python-format
-msgid "Ensure that there are no more than %s decimal places."
-msgstr "Asegrese de que no hay ms de %s decimales."
-
-#: newforms/fields.py:200
-#, fuzzy, python-format
-msgid "Ensure that there are no more than %s digits before the decimal point."
-msgstr "Asegrese de que no hay ms de %s dgitos antes del nmero decimal."
-
-#: newforms/fields.py:233 newforms/fields.py:566
-msgid "Enter a valid date."
-msgstr "Introduzca una fecha vlida."
-
-#: newforms/fields.py:260 newforms/fields.py:568
-msgid "Enter a valid time."
-msgstr "Introduzca una hora vlida."
-
-#: newforms/fields.py:296
-msgid "Enter a valid date/time."
-msgstr "Introduzca una fecha/hora vlida."
-
-#: newforms/fields.py:310
-msgid "Enter a valid value."
-msgstr "Introduzca un valor correcto."
-
-#: newforms/fields.py:357 newforms/fields.py:379
-msgid "Enter a valid URL."
-msgstr "Introduzca una URL vlida."
-
-#: newforms/fields.py:381
-msgid "This URL appears to be a broken link."
-msgstr "La URL parece ser un enlace roto."
-
-#: contrib/humanize/templatetags/humanize.py:17
-msgid "th"
-msgstr "th"
-
-#: contrib/humanize/templatetags/humanize.py:17
-#, fuzzy
-msgid "st"
-msgstr "st"
-
-#: contrib/humanize/templatetags/humanize.py:17
-#, fuzzy
-msgid "nd"
-msgstr "nd"
-
-#: contrib/humanize/templatetags/humanize.py:17
-msgid "rd"
-msgstr "rd"
-
-#: contrib/humanize/templatetags/humanize.py:47
-#, python-format
-msgid "%(value).1f million"
-msgid_plural "%(value).1f million"
-msgstr[0] "%(value).1f milln"
-msgstr[1] "%(value).1f millin"
-
-#: contrib/humanize/templatetags/humanize.py:50
-#, python-format
-msgid "%(value).1f billion"
-msgid_plural "%(value).1f billion"
-msgstr[0] "%(value).1f billin"
-msgstr[1] "%(value).1f billin"
-
-#: contrib/humanize/templatetags/humanize.py:53
-#, python-format
-msgid "%(value).1f trillion"
-msgid_plural "%(value).1f trillion"
-msgstr[0] "%(value).1f trillin"
-msgstr[1] "%(value).1f trillin"
-
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "one"
-msgstr "uno"
-
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "two"
-msgstr "dos"
-
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "three"
-msgstr "tres"
-
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "four"
-msgstr "cuatro"
-
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "five"
-msgstr "cinco"
-
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "six"
-msgstr "seis"
-
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "seven"
-msgstr "siete"
-
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "eight"
-msgstr "ocho"
+"El atributo \"%(attr)s\" de la línea %(line)s tiene un valor que no es "
+"válido. (La línea empieza por \"%(start)s\".)"
-#: contrib/humanize/templatetags/humanize.py:68
-msgid "nine"
-msgstr "nueve"
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Las dos contraseñas no coinciden."
-#: contrib/redirects/models.py:7
-msgid "redirect from"
-msgstr "redirigir desde"
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Ya existe un usuario con este nombre."
-#: contrib/redirects/models.py:8
+#: contrib/auth/forms.py:53
msgid ""
-"This should be an absolute path, excluding the domain name. Example: '/"
-"events/search/'."
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
msgstr ""
-"Esta ruta debera ser absoluta, excluyendo el nombre de dominio. Ejeplo: '/"
-"events/search/'."
-
-#: contrib/redirects/models.py:9
-msgid "redirect to"
-msgstr "redirigir a"
+"Tu navegador de internet parece no tener las cookies habilitadas. Las "
+"cookies se necesitan para poder ingresar."
-#: contrib/redirects/models.py:10
+#: contrib/auth/forms.py:60 contrib/admin/views/decorators.py:10
msgid ""
-"This can be either an absolute path (as above) or a full URL starting with "
-"'http://'."
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
msgstr ""
-"Esto puede ser bien una ruta absoluta (como antes) o una URL completa que "
-"empiece con 'http://'."
-
-#: contrib/redirects/models.py:13
-msgid "redirect"
-msgstr "redireccin"
-
-#: contrib/redirects/models.py:14
-msgid "redirects"
-msgstr "redirecciones"
-
-#: contrib/comments/models.py:67 contrib/comments/models.py:166
-msgid "object ID"
-msgstr "ID de objeto"
-
-#: contrib/comments/models.py:68
-msgid "headline"
-msgstr "encabezado"
-
-#: contrib/comments/models.py:69 contrib/comments/models.py:90
-#: contrib/comments/models.py:167
-msgid "comment"
-msgstr "comentario"
-
-#: contrib/comments/models.py:70
-msgid "rating #1"
-msgstr "calificacin 1"
-
-#: contrib/comments/models.py:71
-msgid "rating #2"
-msgstr "calificacin 2"
-
-#: contrib/comments/models.py:72
-msgid "rating #3"
-msgstr "calificacin 3"
-
-#: contrib/comments/models.py:73
-msgid "rating #4"
-msgstr "calificacin 4"
-
-#: contrib/comments/models.py:74
-msgid "rating #5"
-msgstr "calificacin 5"
+"Por favor, introduzca un correcto nombre de usuario y contraseña. Note que "
+"ambos campos son sensibles a mayúsculas/minúsculas."
-#: contrib/comments/models.py:75
-msgid "rating #6"
-msgstr "calificacin 6"
-
-#: contrib/comments/models.py:76
-msgid "rating #7"
-msgstr "calificacin 7"
-
-#: contrib/comments/models.py:77
-msgid "rating #8"
-msgstr "calificacin 8"
-
-#: contrib/comments/models.py:82
-msgid "is valid rating"
-msgstr "es calificacin vlida"
-
-#: contrib/comments/models.py:83 contrib/comments/models.py:169
-msgid "date/time submitted"
-msgstr "fecha/hora de envo"
-
-#: contrib/comments/models.py:84 contrib/comments/models.py:170
-msgid "is public"
-msgstr "es pblico"
-
-#: contrib/comments/models.py:85 contrib/admin/views/doc.py:305
-msgid "IP address"
-msgstr "Direccin IP"
-
-#: contrib/comments/models.py:86
-msgid "is removed"
-msgstr "est eliminado"
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Esta cuenta está inactiva."
-#: contrib/comments/models.py:86
+#: contrib/auth/forms.py:84
msgid ""
-"Check this box if the comment is inappropriate. A \"This comment has been "
-"removed\" message will be displayed instead."
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
msgstr ""
-"Marque esta caja si el comentario es inapropiado. En su lugar se mostrar "
-"\"Este comentario ha sido eliminado\"."
-
-#: contrib/comments/models.py:91
-msgid "comments"
-msgstr "comentarios"
-
-#: contrib/comments/models.py:131 contrib/comments/models.py:207
-msgid "Content object"
-msgstr "Objeto contenido"
+"Esta dirección de correo electrónico no tiene una cuenta de usuario "
+"asociada. ¿Está seguro de que se ha registrado?"
-#: contrib/comments/models.py:159
-#, python-format
-msgid ""
-"Posted by %(user)s at %(date)s\n"
-"\n"
-"%(comment)s\n"
-"\n"
-"http://%(domain)s%(url)s"
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
msgstr ""
-"Enviado por %(user)s en %(date)s\n"
-"\n"
-"%(comment)s\n"
-"\n"
-"http://%(domain)s%(url)s"
+"Las contraseñas introducidas en los campos 'nueva contraseña' no coinciden."
-#: contrib/comments/models.py:168
-msgid "person's name"
-msgstr "nombre de la persona"
-
-#: contrib/comments/models.py:171
-msgid "ip address"
-msgstr "direccin ip"
-
-#: contrib/comments/models.py:173
-msgid "approved by staff"
-msgstr "aprobado por el staff"
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr ""
+"Tu contraseña antigua es incorrecta. Por favor, vuelve a introducirla "
+"correctamente."
-#: contrib/comments/models.py:176
-msgid "free comment"
-msgstr "comentario libre"
+#: contrib/auth/models.py:51 contrib/auth/models.py:71
+msgid "name"
+msgstr "nombre"
-#: contrib/comments/models.py:177
-msgid "free comments"
-msgstr "comentarios libres"
+#: contrib/auth/models.py:53
+msgid "codename"
+msgstr "nombre en código"
-#: contrib/comments/models.py:233
-msgid "score"
-msgstr "puntuacin"
+#: contrib/auth/models.py:56
+msgid "permission"
+msgstr "permiso"
-#: contrib/comments/models.py:234
-msgid "score date"
-msgstr "fecha de la puntuacin"
+#: contrib/auth/models.py:57 contrib/auth/models.py:72
+msgid "permissions"
+msgstr "permisos"
-#: contrib/comments/models.py:237
-msgid "karma score"
-msgstr "punto karma"
+#: contrib/auth/models.py:75
+msgid "group"
+msgstr "grupo"
-#: contrib/comments/models.py:238
-msgid "karma scores"
-msgstr "puntos karma"
+#: contrib/auth/models.py:76 contrib/auth/models.py:116
+msgid "groups"
+msgstr "grupos"
-#: contrib/comments/models.py:242
-#, python-format
-msgid "%(score)d rating by %(user)s"
-msgstr "puntuado %(score)d por %(user)s"
+#: contrib/auth/models.py:106
+msgid "username"
+msgstr "nombre de usuario"
-#: contrib/comments/models.py:258
-#, python-format
+#: contrib/auth/models.py:106
msgid ""
-"This comment was flagged by %(user)s:\n"
-"\n"
-"%(text)s"
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
msgstr ""
-"Este comentario fue marcado por %(user)s:\n"
-"\n"
-"%(text)s"
-
-#: contrib/comments/models.py:265
-msgid "flag date"
-msgstr "fecha de la marca"
-
-#: contrib/comments/models.py:268
-msgid "user flag"
-msgstr "marca de usuario"
+"Requerido. 30 caracteres o menos. Sólo caracteres alfanuméricos (letras, "
+"dígitos y guiones bajos)."
-#: contrib/comments/models.py:269
-msgid "user flags"
-msgstr "marcas de usuario"
-
-#: contrib/comments/models.py:273
-#, python-format
-msgid "Flag by %r"
-msgstr "Marca de %r"
+#: contrib/auth/models.py:107
+msgid "first name"
+msgstr "nombre"
-#: contrib/comments/models.py:278
-msgid "deletion date"
-msgstr "fecha de eliminacin"
+#: contrib/auth/models.py:108
+msgid "last name"
+msgstr "apellidos"
-#: contrib/comments/models.py:280
-msgid "moderator deletion"
-msgstr "eliminacin de moderador"
+#: contrib/auth/models.py:109
+msgid "e-mail address"
+msgstr "dirección de correo"
-#: contrib/comments/models.py:281
-msgid "moderator deletions"
-msgstr "eliminaciones de moderador"
+#: contrib/auth/models.py:110
+msgid "password"
+msgstr "clave"
-#: contrib/comments/models.py:285
-#, python-format
-msgid "Moderator deletion by %r"
-msgstr "Eliminacin del moderador %r"
+#: contrib/auth/models.py:110
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Use'[algo]$[sal]$[hash hexadecimal]' o use <a href=\"password/\">el "
+"formulario para cambiar la contraseña</a>."
-#: contrib/comments/views/karma.py:19
-msgid "Anonymous users cannot vote"
-msgstr "Los usuarios annimos no pueden votar"
+#: contrib/auth/models.py:111
+msgid "staff status"
+msgstr "es staff"
-#: contrib/comments/views/karma.py:23
-msgid "Invalid comment ID"
-msgstr "ID de comentario no vlido"
+#: contrib/auth/models.py:111
+msgid "Designates whether the user can log into this admin site."
+msgstr "Indica si el usuario puede entrar en este sitio de administración."
-#: contrib/comments/views/karma.py:25
-msgid "No voting for yourself"
-msgstr "No puedes votarte t mismo"
+#: contrib/auth/models.py:112
+msgid "active"
+msgstr "activo"
-#: contrib/comments/views/comments.py:27
+#: contrib/auth/models.py:112
msgid ""
-"This rating is required because you've entered at least one other rating."
-msgstr "Se precisa esta puntuacin porque ha introducido al menos otra ms."
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Indica si el usuario puede entrar en este sitio de administración. Desmarque "
+"esto en lugar de borrar la cuenta."
-#: 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"
-"\n"
-"%(text)s"
-msgid_plural ""
-"This comment was posted by a user who has posted fewer than %(count)s "
-"comments:\n"
-"\n"
-"%(text)s"
-msgstr[0] ""
-"Este comentario lo envi un usuario que ha enviado menos de %(count)s "
-"comentario:\n"
-"\n"
-"%(text)s"
-msgstr[1] ""
-"Este comentario lo envi un usuario que ha enviado menos de %(count)s "
-"comentarios:\n"
-"\n"
-"%(text)s"
+#: contrib/auth/models.py:113
+msgid "superuser status"
+msgstr "es superusuario"
-#: contrib/comments/views/comments.py:116
-#, python-format
+#: contrib/auth/models.py:113
msgid ""
-"This comment was posted by a sketchy user:\n"
-"\n"
-"%(text)s"
+"Designates that this user has all permissions without explicitly assigning "
+"them."
msgstr ""
-"Este comentario ha sido colocado por un usuario poco preciso: \n"
-"\n"
-"%(text)s"
-
-#: contrib/comments/views/comments.py:188
-#: contrib/comments/views/comments.py:280
-msgid "Only POSTs are allowed"
-msgstr "Slo se admite POST"
+"Indica que este usuario tiene todos los permisos sin asignárselos "
+"explícitamente."
-#: contrib/comments/views/comments.py:192
-#: contrib/comments/views/comments.py:284
-msgid "One or more of the required fields wasn't submitted"
-msgstr "No se proporcion uno o ms de los siguientes campos requeridos"
+#: contrib/auth/models.py:114
+msgid "last login"
+msgstr "Último registro"
-#: contrib/comments/views/comments.py:196
-#: contrib/comments/views/comments.py:286
-msgid "Somebody tampered with the comment form (security violation)"
-msgstr ""
-"Alguien est jugando con el formulario de comentarios (violacin de "
-"seguridad)"
+#: contrib/auth/models.py:115
+msgid "date joined"
+msgstr "fecha de creación"
-#: contrib/comments/views/comments.py:206
-#: contrib/comments/views/comments.py:292
+#: contrib/auth/models.py:117
msgid ""
-"The comment form had an invalid 'target' parameter -- the object ID was "
-"invalid"
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
msgstr ""
-"El formulario de comentarios tiene un parmetro 'target' no vlido (el ID de "
-"objeto era invlido)"
+"Además de los permisos asignados manualmente, este usuario también tendrá "
+"todos los permisos de los grupos en los que esté."
-#: contrib/comments/views/comments.py:257
-#: contrib/comments/views/comments.py:321
-msgid "The comment form didn't provide either 'preview' or 'post'"
-msgstr "El formulario de comentario no proporcion 'previsualizar' ni 'enviar'"
+#: contrib/auth/models.py:118
+msgid "user permissions"
+msgstr "permisos"
-#: contrib/comments/templates/comments/form.html:6
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/login.html:17
-msgid "Username:"
-msgstr "Usuario:"
+#: contrib/auth/models.py:122
+msgid "user"
+msgstr "usuario"
-#: contrib/comments/templates/comments/form.html:6
-#: contrib/admin/templates/admin/change_list.html:5
-#: 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/admin/auth/user/change_password.html:9
-#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: 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 "Terminar sesin"
+#: contrib/auth/models.py:123
+msgid "users"
+msgstr "usuarios"
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/login.html:20
-msgid "Password:"
-msgstr "Clave:"
+#: contrib/auth/models.py:129
+msgid "Personal info"
+msgstr "Información personal"
-#: contrib/comments/templates/comments/form.html:8
-msgid "Forgotten your password?"
-msgstr "Has olvidado tu contrasea?"
+#: contrib/auth/models.py:130
+msgid "Permissions"
+msgstr "Permisos"
-#: contrib/comments/templates/comments/form.html:12
-msgid "Ratings"
-msgstr "Calificaciones"
+#: contrib/auth/models.py:131
+msgid "Important dates"
+msgstr "Fechas importantes"
-#: contrib/comments/templates/comments/form.html:12
-#: contrib/comments/templates/comments/form.html:23
-msgid "Required"
-msgstr "Requerido"
+#: contrib/auth/models.py:132
+msgid "Groups"
+msgstr "Grupos"
-#: contrib/comments/templates/comments/form.html:12
-#: contrib/comments/templates/comments/form.html:23
-msgid "Optional"
-msgstr "Opcional"
+#: contrib/auth/models.py:274
+msgid "message"
+msgstr "mensaje"
-#: contrib/comments/templates/comments/form.html:23
-msgid "Post a photo"
-msgstr "Postea una fotografa"
+#: contrib/auth/views.py:41
+msgid "Logged out"
+msgstr "Sesión terminada"
-#: contrib/comments/templates/comments/form.html:28
-#: contrib/comments/templates/comments/freeform.html:5
-msgid "Comment:"
-msgstr "Comentario:"
+#: contrib/admin/models.py:17
+msgid "action time"
+msgstr "hora de acción"
-#: contrib/comments/templates/comments/form.html:35
-#: contrib/comments/templates/comments/freeform.html:10
-msgid "Preview comment"
-msgstr "Previsualizar comentario"
+#: contrib/admin/models.py:20
+msgid "object id"
+msgstr "id de objeto"
-#: contrib/comments/templates/comments/freeform.html:4
-msgid "Your name:"
-msgstr "Tu nombre:"
+#: contrib/admin/models.py:21
+msgid "object repr"
+msgstr "repr de objeto"
-#: contrib/sites/models.py:10
-msgid "domain name"
-msgstr "nombre de dominio"
+#: contrib/admin/models.py:22
+msgid "action flag"
+msgstr "marca de acción"
-#: contrib/sites/models.py:11
-msgid "display name"
-msgstr "nombre para mostrar"
+#: contrib/admin/models.py:23
+msgid "change message"
+msgstr "mensaje de cambio"
-#: contrib/sites/models.py:15
-msgid "site"
-msgstr "sitio"
+#: contrib/admin/models.py:26
+msgid "log entry"
+msgstr "entrada de registro"
-#: contrib/sites/models.py:16
-msgid "sites"
-msgstr "sitios"
+#: contrib/admin/models.py:27
+msgid "log entries"
+msgstr "entradas de registro"
-#: contrib/admin/filterspecs.py:40
+#: contrib/admin/filterspecs.py:42
#, python-format
msgid ""
"<h3>By %s:</h3>\n"
@@ -1189,433 +812,541 @@ msgstr ""
"<h3>Por %s:</h3>\n"
"<ul>\n"
-#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
-#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
+#: contrib/admin/filterspecs.py:72 contrib/admin/filterspecs.py:90
+#: contrib/admin/filterspecs.py:145 contrib/admin/filterspecs.py:171
msgid "All"
msgstr "Todo"
-#: contrib/admin/filterspecs.py:109
+#: contrib/admin/filterspecs.py:111
msgid "Any date"
msgstr "Cualquier fecha"
-#: contrib/admin/filterspecs.py:110
+#: contrib/admin/filterspecs.py:112
msgid "Today"
msgstr "Hoy"
-#: contrib/admin/filterspecs.py:113
+#: contrib/admin/filterspecs.py:115
msgid "Past 7 days"
-msgstr "ltimos 7 das"
+msgstr "Últimos 7 días"
-#: contrib/admin/filterspecs.py:115
+#: contrib/admin/filterspecs.py:117
msgid "This month"
msgstr "Este mes"
-#: contrib/admin/filterspecs.py:117
+#: contrib/admin/filterspecs.py:119
msgid "This year"
-msgstr "Este ao"
+msgstr "Este año"
-#: contrib/admin/models.py:16
-msgid "action time"
-msgstr "hora de accin"
+#: contrib/admin/filterspecs.py:145 oldforms/__init__.py:587
+#: newforms/widgets.py:181
+msgid "Yes"
+msgstr "Sí"
-#: contrib/admin/models.py:19
-msgid "object id"
-msgstr "id de objeto"
+#: contrib/admin/filterspecs.py:145 oldforms/__init__.py:587
+#: newforms/widgets.py:181
+msgid "No"
+msgstr "No"
-#: contrib/admin/models.py:20
-msgid "object repr"
-msgstr "repr de objeto"
+#: contrib/admin/filterspecs.py:152 oldforms/__init__.py:587
+#: newforms/widgets.py:181
+msgid "Unknown"
+msgstr "Desconocido"
-#: contrib/admin/models.py:21
-msgid "action flag"
-msgstr "marca de accin"
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Identificarse"
-#: contrib/admin/models.py:22
-msgid "change message"
-msgstr "mensaje de cambio"
+#: 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 ""
+"Por favor, identifíquese de nuevo, porque su sesión ha caducado. No se "
+"preocupe: se ha guardado su envío."
-#: contrib/admin/models.py:25
-msgid "log entry"
-msgstr "entrada de registro"
+#: 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 ""
+"Parece que su navegador no está configurado para aceptar cookies. Actívelas "
+"por favor, recargue esta página, e inténtelo de nuevo."
-#: contrib/admin/models.py:26
-msgid "log entries"
-msgstr "entradas de registro"
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "Los nombres de usuario no pueden contener el carácter '@'."
-#: contrib/admin/templatetags/admin_list.py:249
-msgid "All dates"
-msgstr "Todas las fechas"
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"Su dirección de correo no es su nombre de usuario. Pruebe con '%s' en su "
+"lugar."
-#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:262
+#: contrib/admin/views/main.py:230
+msgid "Site administration"
+msgstr "Sitio administrativo"
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/auth.py:20
#, python-format
msgid "The %(name)s \"%(obj)s\" was added successfully."
-msgstr "Se aadi con xito el %(name)s \"%(obj)s\"."
+msgstr "Se añadió con éxito el %(name)s \"%(obj)s\"."
-#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:266
-#: contrib/admin/views/main.py:352
+#: contrib/admin/views/main.py:268 contrib/admin/views/main.py:354
+#: contrib/admin/views/auth.py:25
msgid "You may edit it again below."
msgstr "Puede editarlo de nuevo abajo."
-#: contrib/admin/views/auth.py:30
-msgid "Add user"
-msgstr "Aadir usuario"
-
-#: contrib/admin/views/auth.py:57
-msgid "Password changed successfully."
-msgstr "La clave se ha cambiado exitosamente."
-
-#: contrib/admin/views/auth.py:64
-#, python-format
-msgid "Change password: %s"
-msgstr "Cambiar clave: %s"
-
-#: contrib/admin/views/main.py:228
-msgid "Site administration"
-msgstr "Sitio administrativo"
-
-#: contrib/admin/views/main.py:276 contrib/admin/views/main.py:361
+#: contrib/admin/views/main.py:278 contrib/admin/views/main.py:363
#, python-format
msgid "You may add another %s below."
msgstr "Puede agregar otro %s abajo."
-#: contrib/admin/views/main.py:294
+#: contrib/admin/views/main.py:296
#, python-format
msgid "Add %s"
msgstr "Agregar %s"
-#: contrib/admin/views/main.py:340
+#: contrib/admin/views/main.py:342
#, python-format
msgid "Added %s."
msgstr "Agregado %s."
-#: contrib/admin/views/main.py:342
+#: contrib/admin/views/main.py:344
#, python-format
msgid "Changed %s."
msgstr "Modificado %s."
-#: contrib/admin/views/main.py:344
+#: contrib/admin/views/main.py:346
#, python-format
msgid "Deleted %s."
msgstr "Borrado %s."
-#: contrib/admin/views/main.py:347
+#: contrib/admin/views/main.py:349
msgid "No fields changed."
-msgstr "No ha cambiado ningn campo."
+msgstr "No ha cambiado ningún campo."
-#: contrib/admin/views/main.py:350
+#: contrib/admin/views/main.py:352
#, python-format
msgid "The %(name)s \"%(obj)s\" was changed successfully."
-msgstr "Se modific con xito el %(name)s \"%(obj)s."
+msgstr "Se modificó con éxito el %(name)s \"%(obj)s."
-#: contrib/admin/views/main.py:358
+#: contrib/admin/views/main.py:360
#, python-format
msgid ""
"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
msgstr ""
-"Se agreg con xito el %(name)s \"%(obj)s. Puede editarlo de nuevo abajo."
+"Se agregó con éxito el %(name)s \"%(obj)s. Puede editarlo de nuevo abajo."
-#: contrib/admin/views/main.py:396
+#: contrib/admin/views/main.py:398
#, python-format
msgid "Change %s"
msgstr "Modificar %s"
-#: contrib/admin/views/main.py:481
+#: contrib/admin/views/main.py:483
#, python-format
msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
-msgstr "Uno o ms %(fieldname)s en %(name)s: %(obj)s"
+msgstr "Uno o más %(fieldname)s en %(name)s: %(obj)s"
-#: contrib/admin/views/main.py:486
+#: contrib/admin/views/main.py:488
#, python-format
msgid "One or more %(fieldname)s in %(name)s:"
-msgstr "Uno o ms %(fieldname)s en %(name)s:"
+msgstr "Uno o más %(fieldname)s en %(name)s:"
-#: contrib/admin/views/main.py:518
+#: contrib/admin/views/main.py:520
#, python-format
msgid "The %(name)s \"%(obj)s\" was deleted successfully."
-msgstr "Se elimin con xito el %(name)s \"%(obj)s\"."
+msgstr "Se eliminó con éxito el %(name)s \"%(obj)s\"."
-#: contrib/admin/views/main.py:521
+#: contrib/admin/views/main.py:523
msgid "Are you sure?"
-msgstr "Est seguro?"
+msgstr "¿Está seguro?"
-#: contrib/admin/views/main.py:543
+#: contrib/admin/views/main.py:545
#, python-format
msgid "Change history: %s"
-msgstr "Modificar histrico: %s"
+msgstr "Modificar histórico: %s"
-#: contrib/admin/views/main.py:577
+#: contrib/admin/views/main.py:579
#, python-format
msgid "Select %s"
msgstr "Escoja %s"
-#: contrib/admin/views/main.py:577
+#: contrib/admin/views/main.py:579
#, python-format
msgid "Select %s to change"
msgstr "Escoja %s para modificar"
-#: contrib/admin/views/main.py:772
+#: contrib/admin/views/main.py:780
msgid "Database error"
msgstr "Erorr en la base de datos"
-#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:60
-msgid ""
-"Please enter a correct username and password. Note that both fields are case-"
-"sensitive."
-msgstr ""
-"Por favor, introduzca un correcto nombre de usuario y contrasea. Note que "
-"ambos campos son sensibles a maysculas/minsculas."
-
-#: contrib/admin/views/decorators.py:24
-#: contrib/admin/templates/admin/login.html:25
-msgid "Log in"
-msgstr "Identificarse"
-
-#: 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 ""
-"Por favor, identifquese de nuevo, porque su sesin ha caducado. No se "
-"preocupe: se ha guardado su envo."
-
-#: 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 ""
-"Parece que su navegador no est configurado para aceptar cookies. Actvelas "
-"por favor, recargue esta pgina, e intntelo de nuevo."
-
-#: contrib/admin/views/decorators.py:83
-msgid "Usernames cannot contain the '@' character."
-msgstr "Los nombres de usuario no pueden contener el carcter '@'."
-
-#: contrib/admin/views/decorators.py:85
-#, python-format
-msgid "Your e-mail address is not your username. Try '%s' instead."
-msgstr ""
-"Su direccin de correo no es su nombre de usuario. Pruebe con '%s' en su "
-"lugar."
-
-#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
-#: contrib/admin/views/doc.py:50
+#: contrib/admin/views/doc.py:47 contrib/admin/views/doc.py:49
+#: contrib/admin/views/doc.py:51
msgid "tag:"
msgstr "etiqueta:"
-#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
-#: contrib/admin/views/doc.py:81
+#: contrib/admin/views/doc.py:78 contrib/admin/views/doc.py:80
+#: contrib/admin/views/doc.py:82
msgid "filter:"
msgstr "filtro:"
-#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
-#: contrib/admin/views/doc.py:139
+#: contrib/admin/views/doc.py:136 contrib/admin/views/doc.py:138
+#: contrib/admin/views/doc.py:140
msgid "view:"
msgstr "vista:"
-#: contrib/admin/views/doc.py:164
+#: contrib/admin/views/doc.py:165
#, python-format
msgid "App %r not found"
-msgstr "Aplicacin %r no encontrada"
+msgstr "Aplicación %r no encontrada"
-#: contrib/admin/views/doc.py:171
+#: contrib/admin/views/doc.py:172
#, python-format
msgid "Model %(name)r not found in app %(label)r"
-msgstr ""
-"El modelo %(name)s no se ha encontrado en la aplicacin %(label)r"
+msgstr "El modelo %(name)s no se ha encontrado en la aplicación %(label)r"
-#: contrib/admin/views/doc.py:183
+#: contrib/admin/views/doc.py:184
#, python-format
msgid "the related `%(label)s.%(type)s` object"
msgstr "el objeto relacionado`%(label)s.%(type)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
+#: contrib/admin/views/doc.py:184 contrib/admin/views/doc.py:206
+#: contrib/admin/views/doc.py:220 contrib/admin/views/doc.py:225
msgid "model:"
msgstr "modelo:"
-#: contrib/admin/views/doc.py:214
+#: contrib/admin/views/doc.py:215
#, python-format
msgid "related `%(label)s.%(name)s` objects"
msgstr "los objetos relacionados `%(label)s.%(name)s`"
-#: contrib/admin/views/doc.py:219
+#: contrib/admin/views/doc.py:220
#, python-format
msgid "all %s"
msgstr "todo %s"
-#: contrib/admin/views/doc.py:224
+#: contrib/admin/views/doc.py:225
#, python-format
msgid "number of %s"
-msgstr "nmero de %s"
+msgstr "número de %s"
-#: contrib/admin/views/doc.py:229
+#: contrib/admin/views/doc.py:230
#, python-format
msgid "Fields on %s objects"
msgstr "Campos en %s objetos"
-#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:302
-#: contrib/admin/views/doc.py:304 contrib/admin/views/doc.py:310
-#: contrib/admin/views/doc.py:311 contrib/admin/views/doc.py:313
+#: contrib/admin/views/doc.py:292 contrib/admin/views/doc.py:303
+#: contrib/admin/views/doc.py:305 contrib/admin/views/doc.py:311
+#: contrib/admin/views/doc.py:312 contrib/admin/views/doc.py:314
msgid "Integer"
msgstr "Entero"
-#: contrib/admin/views/doc.py:292
+#: contrib/admin/views/doc.py:293
msgid "Boolean (Either True or False)"
msgstr "Booleano (Verdadero o Falso)"
-#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:312
+#: contrib/admin/views/doc.py:294 contrib/admin/views/doc.py:313
#, python-format
msgid "String (up to %(maxlength)s)"
-msgstr "Cadena (mximo %(maxlength)s)"
+msgstr "Cadena (máximo %(maxlength)s)"
-#: contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295
msgid "Comma-separated integers"
msgstr "Enteros separados por comas"
-#: contrib/admin/views/doc.py:295
+#: contrib/admin/views/doc.py:296
msgid "Date (without time)"
msgstr "Fecha (sin hora)"
-#: contrib/admin/views/doc.py:296
+#: contrib/admin/views/doc.py:297
msgid "Date (with time)"
msgstr "Fecha (con hora)"
-#: contrib/admin/views/doc.py:297
+#: contrib/admin/views/doc.py:298
msgid "Decimal number"
-msgstr "Nmero decimal"
+msgstr "Número decimal"
-#: contrib/admin/views/doc.py:298
+#: contrib/admin/views/doc.py:299
msgid "E-mail address"
-msgstr "Direccin de correo electrnico"
+msgstr "Dirección de correo electrónico"
-#: contrib/admin/views/doc.py:299 contrib/admin/views/doc.py:300
-#: contrib/admin/views/doc.py:303
+#: contrib/admin/views/doc.py:300 contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:304
msgid "File path"
msgstr "Ruta de fichero"
-#: contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:302
msgid "Floating point number"
-msgstr "Nmero decimal"
+msgstr "Número decimal"
+
+#: contrib/admin/views/doc.py:306 contrib/comments/models.py:85
+msgid "IP address"
+msgstr "Dirección IP"
-#: contrib/admin/views/doc.py:307
+#: contrib/admin/views/doc.py:308
msgid "Boolean (Either True, False or None)"
msgstr "Booleano (Verdadero, Falso o Nulo)"
-#: contrib/admin/views/doc.py:308
+#: contrib/admin/views/doc.py:309
msgid "Relation to parent model"
-msgstr "Relacin con el modelo padre"
+msgstr "Relación con el modelo padre"
-#: contrib/admin/views/doc.py:309
+#: contrib/admin/views/doc.py:310
msgid "Phone number"
-msgstr "Nmero de telfono"
+msgstr "Número de teléfono"
-#: contrib/admin/views/doc.py:314
+#: contrib/admin/views/doc.py:315
msgid "Text"
msgstr "Texto"
-#: contrib/admin/views/doc.py:315
+#: contrib/admin/views/doc.py:316
msgid "Time"
msgstr "Hora"
-#: contrib/admin/views/doc.py:316 contrib/flatpages/models.py:7
+#: contrib/admin/views/doc.py:317 contrib/flatpages/models.py:7
msgid "URL"
msgstr "URL"
-#: contrib/admin/views/doc.py:317
+#: contrib/admin/views/doc.py:318
msgid "U.S. state (two uppercase letters)"
-msgstr "Estado de los EEUU (dos letras maysculas)"
+msgstr "Estado de los EEUU (dos letras mayúsculas)"
-#: contrib/admin/views/doc.py:318
+#: contrib/admin/views/doc.py:319
msgid "XML text"
msgstr "Texto XML"
-#: contrib/admin/views/doc.py:344
+#: contrib/admin/views/doc.py:345
#, python-format
msgid "%s does not appear to be a urlpattern object"
msgstr "%s no parece ser un objeto urlpattern"
-#: contrib/admin/templates/widget/file.html:2
-msgid "Currently:"
-msgstr "Actualmente:"
+#: contrib/admin/views/auth.py:31
+msgid "Add user"
+msgstr "Añadir usuario"
-#: contrib/admin/templates/widget/file.html:3
-msgid "Change:"
-msgstr "Modificar:"
+#: contrib/admin/views/auth.py:58
+msgid "Password changed successfully."
+msgstr "La clave se ha cambiado exitosamente."
-#: contrib/admin/templates/widget/date_time.html:3
-msgid "Date:"
-msgstr "Fecha:"
+#: contrib/admin/views/auth.py:65
+#, python-format
+msgid "Change password: %s"
+msgstr "Cambiar clave: %s"
-#: contrib/admin/templates/widget/date_time.html:4
-msgid "Time:"
-msgstr "Hora:"
+#: contrib/admin/templatetags/admin_list.py:254
+msgid "All dates"
+msgstr "Todas las fechas"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Mostrarlo todo"
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
#: contrib/admin/templates/admin/change_list.html:5
#: 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/admin/auth/user/change_password.html:9
-#: 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
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
msgid "Documentation"
-msgstr "Documentacin"
+msgstr "Documentación"
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
#: contrib/admin/templates/admin/change_list.html:5
#: 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/admin/auth/user/change_password.html:9
#: contrib/admin/templates/admin/auth/user/change_password.html:15
#: contrib/admin/templates/admin/auth/user/change_password.html:46
-#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_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_tag_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/template_detail.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
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
msgid "Change password"
msgstr "Cambiar clave"
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Terminar sesión"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
#: 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/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/admin/auth/user/change_password.html:12
-#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
#: contrib/admin/templates/registration/password_reset_form.html:4
#: contrib/admin/templates/registration/logged_out.html:4
#: contrib/admin/templates/registration/password_reset_done.html:4
#: contrib/admin/templates/registration/password_change_form.html:4
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/password_change_done.html:4
msgid "Home"
msgstr "Inicio"
-#: contrib/admin/templates/admin/change_list.html:12
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Eliminar"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
#, python-format
-msgid "Add %(name)s"
-msgstr "Agregar %(name)s"
+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 ""
+"Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación "
+"de objetos relacionados, pero su cuenta no tiene permiso para borrar los "
+"siguientes tipos de objetos:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+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 ""
+"¿Está seguro de que quiere borrar los %(object_name)s \"%(escaped_object)s"
+"\"? Se borrarán los siguientes objetos relacionados:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Sí, estoy seguro"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Página no encontrada"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Lo sentimos, pero no se encuentra la página solicitada."
+
+#: contrib/admin/templates/admin/change_form.html:15
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "Agregar"
+
+#: contrib/admin/templates/admin/change_form.html:21
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Histórico"
+
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "Ver en el sitio"
+
+#: contrib/admin/templates/admin/change_form.html:32
+#: contrib/admin/templates/admin/auth/user/change_password.html:24
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Por favor, corrija el siguiente error."
+msgstr[1] "Por favor, corrija los siguientes errores."
+
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "Ordenación"
+
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "Orden:"
#: contrib/admin/templates/admin/filter.html:2
#, python-format
msgid " By %(filter_title)s "
msgstr " Por %(filter_title)s "
-#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/change_form.html:21
-msgid "History"
-msgstr "Histrico"
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Grabar como nuevo"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Grabar y añadir otro"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Grabar y continuar editando"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Grabar"
+
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Agregar %(name)s"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modelos disponibles en la aplicación %(name)s."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Modificar"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "No tiene permiso para editar nada."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Acciones recientes"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Mis acciones"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Ninguno disponible"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Sitio de administración de Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administración de Django"
#: contrib/admin/templates/admin/object_history.html:18
msgid "Date/time"
@@ -1627,7 +1358,7 @@ msgstr "Usuario"
#: contrib/admin/templates/admin/object_history.html:20
msgid "Action"
-msgstr "Accin"
+msgstr "Acción"
#: contrib/admin/templates/admin/object_history.html:26
msgid "DATE_WITH_TIME_FULL"
@@ -1638,36 +1369,8 @@ msgid ""
"This object doesn't have a change history. It probably wasn't added via this "
"admin site."
msgstr ""
-"Este objeto no tiene histrico de cambios. Probablemente no fue aadido "
-"usando este sitio de administracin."
-
-#: contrib/admin/templates/admin/search_form.html:8
-msgid "Go"
-msgstr "Buscar"
-
-#: contrib/admin/templates/admin/search_form.html:10
-#, python-format
-msgid "1 result"
-msgid_plural "%(counter)s results"
-msgstr[0] "1 resultado"
-msgstr[1] "%(counter)s resultados"
-
-#: contrib/admin/templates/admin/search_form.html:10
-#, python-format
-msgid "%(full_result_count)s total"
-msgstr "%(full_result_count)s total"
-
-#: contrib/admin/templates/admin/pagination.html:10
-msgid "Show all"
-msgstr "Mostrarlo todo"
-
-#: contrib/admin/templates/admin/base_site.html:4
-msgid "Django site admin"
-msgstr "Sitio de administracin de Django"
-
-#: contrib/admin/templates/admin/base_site.html:7
-msgid "Django administration"
-msgstr "Administracin de Django"
+"Este objeto no tiene histórico de cambios. Probablemente no fue añadido "
+"usando este sitio de administración."
#: contrib/admin/templates/admin/500.html:4
msgid "Server error"
@@ -1687,7 +1390,7 @@ msgid ""
"mail and should be fixed shortly. Thanks for your patience."
msgstr ""
"Ha ocurrido un error. Se ha informado a los administradores del sitio "
-"mediante correo electrnico y debera arreglarse en breve. Gracias por su "
+"mediante correo electrónico y debería arreglarse en breve. Gracias por su "
"paciencia."
#: contrib/admin/templates/admin/invalid_setup.html:8
@@ -1696,175 +1399,164 @@ msgid ""
"database tables have been created, and make sure the database is readable by "
"the appropriate user."
msgstr ""
-"Algo va mal con la instalacin de la base de datos. Asegrate que las tablas "
-"necesarias han sido creadas, y que la base de datos puede ser leda por el "
+"Algo va mal con la instalación de la base de datos. Asegúrate que las tablas "
+"necesarias han sido creadas, y que la base de datos puede ser leída por el "
"usuario apropiado."
-#: contrib/admin/templates/admin/index.html:17
-#, python-format
-msgid "Models available in the %(name)s application."
-msgstr "Modelos disponibles en la aplicacin %(name)s."
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Buscar"
-#: contrib/admin/templates/admin/index.html:18
+#: contrib/admin/templates/admin/search_form.html:10
#, 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"
-msgstr "Agregar"
-
-#: contrib/admin/templates/admin/index.html:34
-msgid "Change"
-msgstr "Modificar"
-
-#: contrib/admin/templates/admin/index.html:44
-msgid "You don't have permission to edit anything."
-msgstr "No tiene permiso para editar nada."
-
-#: contrib/admin/templates/admin/index.html:52
-msgid "Recent Actions"
-msgstr "Acciones recientes"
-
-#: contrib/admin/templates/admin/index.html:53
-msgid "My Actions"
-msgstr "Mis acciones"
-
-#: contrib/admin/templates/admin/index.html:57
-msgid "None available"
-msgstr "Ninguno disponible"
-
-#: contrib/admin/templates/admin/404.html:4
-#: contrib/admin/templates/admin/404.html:8
-msgid "Page not found"
-msgstr "Pgina no encontrada"
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 resultado"
+msgstr[1] "%(counter)s resultados"
-#: contrib/admin/templates/admin/404.html:10
-msgid "We're sorry, but the requested page could not be found."
-msgstr "Lo sentimos, pero no se encuentra la pgina solicitada."
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s total"
#: contrib/admin/templates/admin/filters.html:4
msgid "Filter"
msgstr "Filtro"
-#: contrib/admin/templates/admin/change_form.html:22
-msgid "View on site"
-msgstr "Ver en el sitio"
-
-#: contrib/admin/templates/admin/change_form.html:32
-#: contrib/admin/templates/admin/auth/user/change_password.html:24
-msgid "Please correct the error below."
-msgid_plural "Please correct the errors below."
-msgstr[0] "Por favor, corrija el siguiente error."
-msgstr[1] "Por favor, corrija los siguientes errores."
-
-#: contrib/admin/templates/admin/change_form.html:50
-msgid "Ordering"
-msgstr "Ordenacin"
-
-#: contrib/admin/templates/admin/change_form.html:53
-msgid "Order:"
-msgstr "Orden:"
-
-#: contrib/admin/templates/admin/delete_confirmation.html:9
-#: contrib/admin/templates/admin/submit_line.html:3
-msgid "Delete"
-msgstr "Eliminar"
-
-#: contrib/admin/templates/admin/delete_confirmation.html:14
-#, python-format
-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 ""
-"Eliminar el %(object_name)s '%(escaped_object)s' provocara la eliminacin "
-"de objetos relacionados, pero su cuenta no tiene permiso para borrar los "
-"siguientes tipos de objetos:"
-
-#: contrib/admin/templates/admin/delete_confirmation.html:21
-#, python-format
-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 ""
-"Est seguro de que quiere borrar los %(object_name)s \"%(escaped_object)s"
-"\"? Se borrarn los siguientes objetos relacionados:"
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Usuario:"
-#: contrib/admin/templates/admin/delete_confirmation.html:26
-msgid "Yes, I'm sure"
-msgstr "S, estoy seguro"
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Clave:"
#: contrib/admin/templates/admin/base.html:25
msgid "Welcome,"
msgstr "Bienvenido,"
-#: contrib/admin/templates/admin/submit_line.html:4
-msgid "Save as new"
-msgstr "Grabar como nuevo"
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Primero introduzca un nombre de usuario y una contraseña. Luego podrá editar "
+"el resto de opciones del usuario."
-#: contrib/admin/templates/admin/submit_line.html:5
-msgid "Save and add another"
-msgstr "Grabar y aadir otro"
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Nombre de usuario"
-#: contrib/admin/templates/admin/submit_line.html:6
-msgid "Save and continue editing"
-msgstr "Grabar y continuar editando"
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+msgid "Password"
+msgstr "Contraseña"
-#: contrib/admin/templates/admin/submit_line.html:7
-msgid "Save"
-msgstr "Grabar"
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Password (again)"
+msgstr "Contraseña (de nuevo)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr "Introduzca la misma contraseña que arriba, para verificación"
#: contrib/admin/templates/admin/auth/user/change_password.html:28
#, python-format
msgid "Enter a new password for the user <strong>%(username)s</strong>."
msgstr ""
-"Introduzca una nueva contrasea para el usuario <strong>%(username)s</"
+"Introduzca una nueva contraseña para el usuario <strong>%(username)s</"
"strong>."
-#: contrib/admin/templates/admin/auth/user/change_password.html:34
-#: contrib/admin/templates/admin/auth/user/add_form.html:18
-msgid "Password"
-msgstr "Contrasea"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklets"
-#: contrib/admin/templates/admin/auth/user/change_password.html:39
-#: contrib/admin/templates/admin/auth/user/add_form.html:23
-msgid "Password (again)"
-msgstr "Contrasea (de nuevo)"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Bookmarklets de documentación"
-#: contrib/admin/templates/admin/auth/user/change_password.html:40
-#: contrib/admin/templates/admin/auth/user/add_form.html:24
-msgid "Enter the same password as above, for verification."
-msgstr "Introduzca la misma contrasea que arriba, para verificacin"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site. Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Para instalar bookmarklets, arrastre el enlace a su barra\n"
+"de favoritos, o pulse con el botón derecho el enlace y añádalo a sus "
+"favoritos.\n"
+"Ahora puede escoger el bookmarklet desde cualquier página en el sitio.\n"
+"Observer que algunos de estos bookmarklets precisan que esté viendo\n"
+"el sitio desde un computador señalado como \"interno\" (hable\n"
+"con su administrador de sistemas si no está seguro de si el suyo lo es).</"
+"p>\n"
-#: contrib/admin/templates/admin/auth/user/add_form.html:6
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Documentación de esta página"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
msgid ""
-"First, enter a username and password. Then, you'll be able to edit more user "
-"options."
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
msgstr ""
-"Primero introduzca un nombre de usuario y una contrasea. Luego podr editar "
-"el resto de opciones del usuario."
+"Le lleva desde cualquier página a la documentación de la vista que la genera."
-#: contrib/admin/templates/admin/auth/user/add_form.html:12
-msgid "Username"
-msgstr "Nombre de usuario"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Mostrar ID de objeto"
-#: 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 "Cambio de clave"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Muestra el tipo de contenido e ID unívoco de las páginas que representan un "
+"único objeto."
-#: contrib/admin/templates/registration/password_change_done.html:6
-#: contrib/admin/templates/registration/password_change_done.html:10
-msgid "Password change successful"
-msgstr "Cambio de clave exitoso"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Editar este objeto (ventana actual)"
-#: contrib/admin/templates/registration/password_change_done.html:12
-msgid "Your password was changed."
-msgstr "Su clave ha sido cambiada."
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Le lleva a la página de administración de páginas que representan un único "
+"objeto."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Editar este objeto (nueva ventana)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr ""
+"Como antes, pero abre la página de administración en una nueva ventana."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Fecha:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Hora:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Actualmente:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Modificar:"
#: contrib/admin/templates/registration/password_reset_form.html:4
#: contrib/admin/templates/registration/password_reset_form.html:6
@@ -1878,17 +1570,48 @@ 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 ""
-"Ha olvidado su clave? Introduzca su direccin de correo electrnico, y "
+"¿Ha olvidado su clave? Introduzca su dirección de correo electrónico, y "
"crearemos una nueva que le enviaremos por correo."
#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "E-mail address:"
-msgstr "Direccin de correo electrnico:"
+msgstr "Dirección de correo electrónico:"
#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "Reset my password"
msgstr "Recuperar mi clave"
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Está recibiendo este mensaje debido a que solicitó recuperar la clave"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "de su cuenta de usuario en %(site_name)s."
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Su nueva clave es: %(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 "Puede cambiarla accediendo a esta página:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Su nombre de usuario, en caso de haberlo olvidado:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "¡Gracias por usar nuestro sitio!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "El equipo de %(site_name)s"
+
#: contrib/admin/templates/registration/logged_out.html:8
msgid "Thanks for spending some quality time with the Web site today."
msgstr "Gracias por el tiempo que ha dedicado al sitio web hoy."
@@ -1900,22 +1623,29 @@ msgstr "Identificarse de nuevo"
#: contrib/admin/templates/registration/password_reset_done.html:6
#: contrib/admin/templates/registration/password_reset_done.html:10
msgid "Password reset successful"
-msgstr "Recuperacin de clave exitosa"
+msgstr "Recuperación de clave exitosa"
#: 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 ""
-"Le hemos enviado una clave nueva a la direccin que ha suministrado. Debera "
+"Le hemos enviado una clave nueva a la dirección que ha suministrado. Debería "
"recibirla en breve."
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:4
+msgid "Password change"
+msgstr "Cambio de clave"
+
#: 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 ""
-"Por favor, introduzca su clave antigua, por seguridad, y despus introduzca "
+"Por favor, introduzca su clave antigua, por seguridad, y después introduzca "
"la nueva clave dos veces para verificar que la ha escrito correctamente."
#: contrib/admin/templates/registration/password_change_form.html:17
@@ -1934,324 +1664,494 @@ msgstr "Confirme clave:"
msgid "Change my password"
msgstr "Cambiar mi clave"
-#: contrib/admin/templates/registration/password_reset_email.html:2
-msgid "You're receiving this e-mail because you requested a password reset"
-msgstr "Est recibiendo este mensaje debido a que solicit recuperar la clave"
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Cambio de clave exitoso"
-#: contrib/admin/templates/registration/password_reset_email.html:3
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Su clave ha sido cambiada."
+
+#: contrib/sites/models.py:15
+msgid "domain name"
+msgstr "nombre de dominio"
+
+#: contrib/sites/models.py:16
+msgid "display name"
+msgstr "nombre para mostrar"
+
+#: contrib/sites/models.py:20
+msgid "site"
+msgstr "sitio"
+
+#: contrib/sites/models.py:21
+msgid "sites"
+msgstr "sitios"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr "th"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "st"
+msgstr "st"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "nd"
+msgstr "nd"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr "rd"
+
+#: contrib/humanize/templatetags/humanize.py:47
#, python-format
-msgid "for your user account at %(site_name)s"
-msgstr "de su cuenta de usuario en %(site_name)s."
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f millón"
+msgstr[1] "%(value).1f millión"
-#: contrib/admin/templates/registration/password_reset_email.html:5
+#: contrib/humanize/templatetags/humanize.py:50
#, python-format
-msgid "Your new password is: %(new_password)s"
-msgstr "Su nueva clave es: %(new_password)s"
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f billión"
+msgstr[1] "%(value).1f billión"
-#: contrib/admin/templates/registration/password_reset_email.html:7
-msgid "Feel free to change this password by going to this page:"
-msgstr "Puede cambiarla accediendo a esta pgina:"
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f trillión"
+msgstr[1] "%(value).1f trillión"
-#: contrib/admin/templates/registration/password_reset_email.html:11
-msgid "Your username, in case you've forgotten:"
-msgstr "Su nombre de usuario, en caso de haberlo olvidado:"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "uno"
-#: contrib/admin/templates/registration/password_reset_email.html:13
-msgid "Thanks for using our site!"
-msgstr "Gracias por usar nuestro sitio!"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "dos"
-#: contrib/admin/templates/registration/password_reset_email.html:15
-#, python-format
-msgid "The %(site_name)s team"
-msgstr "El equipo de %(site_name)s"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "tres"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-msgid "Bookmarklets"
-msgstr "Bookmarklets"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "cuatro"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:5
-msgid "Documentation bookmarklets"
-msgstr "Bookmarklets de documentacin"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "cinco"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:9
-msgid ""
-"\n"
-"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
-"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
-"select the bookmarklet from any page in the site. Note that some of these\n"
-"bookmarklets require you to be viewing the site from a computer designated\n"
-"as \"internal\" (talk to your system administrator if you aren't sure if\n"
-"your computer is \"internal\").</p>\n"
-msgstr ""
-"\n"
-"<p class=\"help\">Para instalar bookmarklets, arrastre el enlace a su barra\n"
-"de favoritos, o pulse con el botn derecho el enlace y adalo a sus "
-"favoritos.\n"
-"Ahora puede escoger el bookmarklet desde cualquier pgina en el sitio.\n"
-"Observer que algunos de estos bookmarklets precisan que est viendo\n"
-"el sitio desde un computador sealado como \"interno\" (hable\n"
-"con su administrador de sistemas si no est seguro de si el suyo lo es).</"
-"p>\n"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "seis"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:19
-msgid "Documentation for this page"
-msgstr "Documentacin de esta pgina"
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "siete"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "ocho"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "nueve"
+
+#: contrib/flatpages/models.py:8
msgid ""
-"Jumps you from any page to the documentation for the view that generates "
-"that page."
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
msgstr ""
-"Le lleva desde cualquier pgina a la documentacin de la vista que la genera."
+"Ejemplo: '/about/contact/'. Asegúrese de que pone barras al principio y al "
+"final."
-#: contrib/admin/templates/admin_doc/bookmarklets.html:22
-msgid "Show object ID"
-msgstr "Mostrar ID de objeto"
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "título"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "contenido"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "admitir comentarios"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nombre de plantilla"
+
+#: contrib/flatpages/models.py:13
msgid ""
-"Shows the content-type and unique ID for pages that represent a single "
-"object."
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
msgstr ""
-"Muestra el tipo de contenido e ID unvoco de las pginas que representan un "
-"nico objeto."
+"Ejemplo: 'flatpages/contact_page.html'. Si no es proporcionado, el sistema "
+"usará 'flatpages/default.html'."
-#: contrib/admin/templates/admin_doc/bookmarklets.html:25
-msgid "Edit this object (current window)"
-msgstr "Editar este objeto (ventana actual)"
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "debe estar registrado"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:26
-msgid "Jumps to the admin page for pages that represent a single object."
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Si está marcado, sólo los usuarios registrados podrán ver la página."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "página estática"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "páginas estáticas"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redirigir desde"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
msgstr ""
-"Le lleva a la pgina de administracin de pginas que representan un nico "
-"objeto."
+"Esta ruta debería ser absoluta, excluyendo el nombre de dominio. Ejeplo: '/"
+"events/search/'."
-#: contrib/admin/templates/admin_doc/bookmarklets.html:28
-msgid "Edit this object (new window)"
-msgstr "Editar este objeto (nueva ventana)"
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redirigir a"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:29
-msgid "As above, but opens the admin page in a new window."
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
msgstr ""
-"Como antes, pero abre la pgina de administracin en una nueva ventana."
+"Esto puede ser bien una ruta absoluta (como antes) o una URL completa que "
+"empiece con 'http://'."
-#: contrib/contenttypes/models.py:36
-msgid "python model class name"
-msgstr "nombre de mdulo python"
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "redirección"
-#: contrib/contenttypes/models.py:39
-msgid "content type"
-msgstr "tipo de contenido"
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "redirecciones"
-#: contrib/contenttypes/models.py:40
-msgid "content types"
-msgstr "tipos de contenido"
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID de objeto"
-#: contrib/auth/views.py:40
-msgid "Logged out"
-msgstr "Sesin terminada"
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "encabezado"
-#: contrib/auth/models.py:49 contrib/auth/models.py:69
-msgid "name"
-msgstr "nombre"
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "comentario"
-#: contrib/auth/models.py:51
-msgid "codename"
-msgstr "nombre en cdigo"
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "calificación 1"
-#: contrib/auth/models.py:54
-msgid "permission"
-msgstr "permiso"
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "calificación 2"
-#: contrib/auth/models.py:55 contrib/auth/models.py:70
-msgid "permissions"
-msgstr "permisos"
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "calificación 3"
-#: contrib/auth/models.py:73
-msgid "group"
-msgstr "grupo"
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "calificación 4"
-#: contrib/auth/models.py:74 contrib/auth/models.py:114
-msgid "groups"
-msgstr "grupos"
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "calificación 5"
-#: contrib/auth/models.py:104
-msgid "username"
-msgstr "nombre de usuario"
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "calificación 6"
-#: contrib/auth/models.py:104
-msgid ""
-"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
-"digits and underscores)."
-msgstr ""
-"Requerido. 30 caracteres o menos. Slo caracteres alfanumricos (letras, "
-"dgitos y guiones bajos)."
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "calificación 7"
-#: contrib/auth/models.py:105
-msgid "first name"
-msgstr "nombre"
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "calificación 8"
-#: contrib/auth/models.py:106
-msgid "last name"
-msgstr "apellidos"
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "es calificación válida"
-#: contrib/auth/models.py:107
-msgid "e-mail address"
-msgstr "direccin de correo"
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "fecha/hora de envío"
-#: contrib/auth/models.py:108
-msgid "password"
-msgstr "clave"
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "es público"
-#: contrib/auth/models.py:108
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "está eliminado"
+
+#: contrib/comments/models.py:86
msgid ""
-"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
-"password form</a>."
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
msgstr ""
-"Use'[algo]$[sal]$[hash hexadecimal]' o use <a href=\"password/\">el "
-"formulario para cambiar la contrasea</a>."
-
-#: contrib/auth/models.py:109
-msgid "staff status"
-msgstr "es staff"
+"Marque esta caja si el comentario es inapropiado. En su lugar se mostrará "
+"\"Este comentario ha sido eliminado\"."
-#: contrib/auth/models.py:109
-msgid "Designates whether the user can log into this admin site."
-msgstr "Indica si el usuario puede entrar en este sitio de administracin."
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "comentarios"
-#: contrib/auth/models.py:110
-msgid "active"
-msgstr "activo"
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Objeto contenido"
-#: contrib/auth/models.py:110
+#: contrib/comments/models.py:159
+#, python-format
msgid ""
-"Designates whether this user can log into the Django admin. Unselect this "
-"instead of deleting accounts."
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
msgstr ""
-"Indica si el usuario puede entrar en este sitio de administracin. Desmarque "
-"esto en lugar de borrar la cuenta."
+"Enviado por %(user)s en %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
-#: contrib/auth/models.py:111
-msgid "superuser status"
-msgstr "es superusuario"
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "nombre de la persona"
-#: contrib/auth/models.py:111
-msgid ""
-"Designates that this user has all permissions without explicitly assigning "
-"them."
-msgstr ""
-"Indica que este usuario tiene todos los permisos sin asignrselos "
-"explcitamente."
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "dirección ip"
-#: contrib/auth/models.py:112
-msgid "last login"
-msgstr "ltimo registro"
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "aprobado por el staff"
-#: contrib/auth/models.py:113
-msgid "date joined"
-msgstr "fecha de creacin"
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "comentario libre"
-#: contrib/auth/models.py:115
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "comentarios libres"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "puntuación"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "fecha de la puntuación"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "punto karma"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "puntos karma"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "puntuado %(score)d por %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
msgid ""
-"In addition to the permissions manually assigned, this user will also get "
-"all permissions granted to each group he/she is in."
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
msgstr ""
-"Adems de los permisos asignados manualmente, este usuario tambin tendr "
-"todos los permisos de los grupos en los que est."
+"Este comentario fue marcado por %(user)s:\n"
+"\n"
+"%(text)s"
-#: contrib/auth/models.py:116
-msgid "user permissions"
-msgstr "permisos"
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "fecha de la marca"
-#: contrib/auth/models.py:120
-msgid "user"
-msgstr "usuario"
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "marca de usuario"
-#: contrib/auth/models.py:121
-msgid "users"
-msgstr "usuarios"
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "marcas de usuario"
-#: contrib/auth/models.py:127
-msgid "Personal info"
-msgstr "Informacin personal"
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Marca de %r"
-#: contrib/auth/models.py:128
-msgid "Permissions"
-msgstr "Permisos"
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "fecha de eliminación"
-#: contrib/auth/models.py:129
-msgid "Important dates"
-msgstr "Fechas importantes"
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "eliminación de moderador"
-#: contrib/auth/models.py:130
-msgid "Groups"
-msgstr "Grupos"
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "eliminaciones de moderador"
-#: contrib/auth/models.py:272
-msgid "message"
-msgstr "mensaje"
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Eliminación del moderador %r"
-#: contrib/auth/models.py:285
-msgid "AnonymousUser"
-msgstr "UsuarioAnonimo"
+#: contrib/comments/views/karma.py:20
+msgid "Anonymous users cannot vote"
+msgstr "Los usuarios anónimos no pueden votar"
-#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
-msgid "The two password fields didn't match."
-msgstr "Las dos contraseas no coinciden."
+#: contrib/comments/views/karma.py:24
+msgid "Invalid comment ID"
+msgstr "ID de comentario no válido"
-#: contrib/auth/forms.py:25
-msgid "A user with that username already exists."
-msgstr "Ya existe un usuario con este nombre."
+#: contrib/comments/views/karma.py:26
+msgid "No voting for yourself"
+msgstr "No puedes votarte tú mismo"
-#: contrib/auth/forms.py:53
+#: contrib/comments/views/comments.py:28
msgid ""
-"Your Web browser doesn't appear to have cookies enabled. Cookies are "
-"required for logging in."
-msgstr ""
-"Tu navegador de internet parece no tener las cookies habilitadas. Las "
-"cookies se necesitan para poder ingresar."
+"This rating is required because you've entered at least one other rating."
+msgstr "Se precisa esta puntuación porque ha introducido al menos otra más."
-#: contrib/auth/forms.py:62
-msgid "This account is inactive."
-msgstr "Esta cuenta est inactiva."
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Este comentario lo envió un usuario que ha enviado menos de %(count)s "
+"comentario:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Este comentario lo envió un usuario que ha enviado menos de %(count)s "
+"comentarios:\n"
+"\n"
+"%(text)s"
-#: contrib/auth/forms.py:84
+#: contrib/comments/views/comments.py:117
+#, python-format
msgid ""
-"That e-mail address doesn't have an associated user account. Are you sure "
-"you've registered?"
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
msgstr ""
-"Esta direccin de correo electrnico no tiene una cuenta de usuario "
-"asociada. Est seguro de que se ha registrado?"
+"Este comentario ha sido colocado por un usuario poco preciso: \n"
+"\n"
+"%(text)s"
-#: contrib/auth/forms.py:117
-msgid "The two 'new password' fields didn't match."
-msgstr ""
-"Las contraseas introducidas en los campos 'nueva contrasea' no coinciden."
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:281
+msgid "Only POSTs are allowed"
+msgstr "Sólo se admite POST"
-#: contrib/auth/forms.py:124
-msgid "Your old password was entered incorrectly. Please enter it again."
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:285
+msgid "One or more of the required fields wasn't submitted"
+msgstr "No se proporcionó uno o más de los siguientes campos requeridos"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:287
+msgid "Somebody tampered with the comment form (security violation)"
msgstr ""
-"Tu contrasea antigua es incorrecta. Por favor, vuelve a introducirla "
-"correctamente."
+"Alguien está jugando con el formulario de comentarios (violación de "
+"seguridad)"
-#: contrib/localflavor/uk/forms.py:18
-msgid "Enter a postcode. A space is required between the two postcode parts."
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:293
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
msgstr ""
-"Introduzca un cdigo postal. Se necesita un espacio entre las dos partes del "
-"cdigo."
+"El formulario de comentarios tiene un parámetro 'target' no válido (el ID de "
+"objeto era inválido)"
+
+#: contrib/comments/views/comments.py:258
+#: contrib/comments/views/comments.py:322
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "El formulario de comentario no proporcionó 'previsualizar' ni 'enviar'"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "¿Has olvidado tu contraseña?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Calificaciones"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Requerido"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opcional"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Postea una fotografía"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Comentario:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Previsualizar comentario"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Tu nombre:"
+
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr "Introduzca un código postal de 4 dígitos."
#: contrib/localflavor/br/forms.py:18
msgid "Enter a zip code in the format XXXXX-XXX."
-msgstr "Introduzca un cdigo postal en el formato XXXX-XXXX."
+msgstr "Introduzca un código postal en el formato XXXX-XXXX."
#: contrib/localflavor/br/forms.py:30
msgid "Phone numbers must be in XX-XXXX-XXXX format."
-msgstr "Los nmeros de telfono deben tener el formato XXX-XXX-XXXX."
+msgstr "Los números de teléfono deben tener el formato XXX-XXX-XXXX."
#: contrib/localflavor/br/forms.py:72
-#, fuzzy
msgid "This field requires only numbers."
-msgstr "Este campo slo acepta nmeros."
+msgstr "Este campo sólo acepta números."
#: contrib/localflavor/br/forms.py:74
msgid "This field requires at most 11 digits or 14 characters."
@@ -2259,34 +2159,150 @@ msgstr "Este campo necesita al menos 11 o 14 caracteres"
#: contrib/localflavor/br/forms.py:84
msgid "Invalid CPF number."
-msgstr "Nmero CPF invlido."
+msgstr "Número CPF inválido."
#: contrib/localflavor/br/forms.py:106
msgid "This field requires at least 14 digits"
-msgstr "Este campo necesita 14 dgitos como mximo"
+msgstr "Este campo necesita 14 dígitos como máximo"
#: contrib/localflavor/br/forms.py:116
-#, fuzzy
msgid "Invalid CNPJ number."
-msgstr "Nmero CNPJ invlido"
+msgstr "Número CNPJ inválido"
-#: contrib/localflavor/au/forms.py:18
-msgid "Enter a 4 digit post code."
-msgstr "Introduzca un cdigo postal de 4 dgitos."
+#: contrib/localflavor/ch/forms.py:18 contrib/localflavor/no/forms.py:14
+msgid "Enter a zip code in the format XXXX."
+msgstr "Introduzca un código postal en el formato XXXX."
-#: contrib/localflavor/fr/forms.py:17 contrib/localflavor/de/forms.py:16
-#: contrib/localflavor/fi/forms.py:14
-#, fuzzy
-msgid "Enter a zip code in the format XXXXX."
-msgstr "Introduzca un cdigo postal en el formato XXXXX."
+#: contrib/localflavor/ch/forms.py:90
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
-#: contrib/localflavor/us/forms.py:18
-msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
-msgstr "Introduzca un cdigo postal en el formato XXXXX o XXXX-XXXX."
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Aargau"
-#: contrib/localflavor/us/forms.py:51
-msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
-msgstr "Introduzca un Nmero Seguro Social de EEUU vlido en el formato XXX-XX-XXXX"
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Innerrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Ausserrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Basel-Stadt"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "Basel-Land"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "Berne"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "Fribourg"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Geneva"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "Glarus"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "Graubuenden"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "Jura"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "Lucerne"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchatel"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwalden"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwalden"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Schaffhausen"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "Schwyz"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "Solothurn"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "St. Gallen"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Thurgau"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "Ticino"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "Zug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "Zurich"
+
+#: contrib/localflavor/cl/forms.py:32
+msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Introduzca un RUT chileno válido. El formato es XX.XXX.XXXX-X."
+
+#: contrib/localflavor/cl/forms.py:37
+msgid "Enter valid a Chilean RUT"
+msgstr "Introduzca un RUT chileno válido"
+
+#: contrib/localflavor/de/forms.py:16 contrib/localflavor/fi/forms.py:14
+#: contrib/localflavor/fr/forms.py:17
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Introduzca un código postal en el formato XXXXX."
+
+#: contrib/localflavor/de/forms.py:60
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"Introduzca un número de tarjeta de identidad de Alemania válida en el "
+"formato XXXXXXXXXXX-XXXXXXX-XXXXXXX-X."
#: contrib/localflavor/de/de_states.py:5
msgid "Baden-Wuerttemberg"
@@ -2297,9 +2313,8 @@ msgid "Bavaria"
msgstr "Bavaria"
#: contrib/localflavor/de/de_states.py:7
-#, fuzzy
msgid "Berlin"
-msgstr "Berlin"
+msgstr "Berlín"
#: contrib/localflavor/de/de_states.py:8
msgid "Brandenburg"
@@ -2353,11 +2368,25 @@ msgstr "Schleswig-Holstein"
msgid "Thuringia"
msgstr "Thuringia"
-#: contrib/localflavor/de/forms.py:60
-msgid ""
-"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
-"format."
-msgstr "Introduzca un nmero de tarjeta de identidad de Alemania vlida en el formato XXXXXXXXXXX-XXXXXXX-XXXXXXX-X."
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
+msgid "Enter a valid Finnish social security number."
+msgstr "Introduzca un número de seguro social finlandés válido."
+
+#: contrib/localflavor/it/forms.py:16
+msgid "Enter a valid zip code."
+msgstr "Introduzca un código postal válido."
+
+#: contrib/localflavor/it/forms.py:41
+msgid "Enter a valid Social Security number."
+msgstr "Introduzca un número de Seguro Social válido."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Introduzca un número VAT válido."
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Introduzca un código postal en el formato XXXXX o XXXX-XXXX."
#: contrib/localflavor/jp/jp_prefectures.py:4
msgid "Hokkaido"
@@ -2547,174 +2576,43 @@ msgstr "Kagoshima"
msgid "Okinawa"
msgstr "Okinawa"
-#: contrib/localflavor/jp/forms.py:21
-#, fuzzy
-msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
-msgstr "Introduzca un cdigo postal en el formato XXXXX o XXXX-XXXX."
-
-#: contrib/localflavor/it/forms.py:16
-#, fuzzy
-msgid "Enter a valid zip code."
-msgstr "Introduzca una fecha vlida."
-
-#: contrib/localflavor/it/forms.py:41
-msgid "Enter a valid Social Security number."
-msgstr "Introduzca un nmero de Seguro Social vlido."
-
-#: contrib/localflavor/it/forms.py:68
-#, fuzzy
-msgid "Enter a valid VAT number."
-msgstr "Introduzca un nmero VAT vlido."
-
-#: contrib/localflavor/no/forms.py:15 contrib/localflavor/ch/forms.py:18
-#, fuzzy
-msgid "Enter a zip code in the format XXXX."
-msgstr "Introduzca cdigo ZIP en el formato XXXX."
-
-#: contrib/localflavor/no/forms.py:36
+#: contrib/localflavor/no/forms.py:35
msgid "Enter a valid Norwegian social security number."
-msgstr "Introduzca un nmero de seguro social de Noruega vlido."
-
-#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
-msgid "Enter a valid Finnish social security number."
-msgstr "Introduzca un nmero de seguro social finlands vlido."
-
-#: contrib/localflavor/ch/ch_states.py:5
-msgid "Aargau"
-msgstr "Aargau"
-
-#: contrib/localflavor/ch/ch_states.py:6
-msgid "Appenzell Innerrhoden"
-msgstr "Appenzell Innerrhoden"
-
-#: contrib/localflavor/ch/ch_states.py:7
-msgid "Appenzell Ausserrhoden"
-msgstr "Appenzell Ausserrhoden"
-
-#: contrib/localflavor/ch/ch_states.py:8
-msgid "Basel-Stadt"
-msgstr "Basel-Stadt"
-
-#: contrib/localflavor/ch/ch_states.py:9
-msgid "Basel-Land"
-msgstr "Basel-Land"
-
-#: contrib/localflavor/ch/ch_states.py:10
-msgid "Berne"
-msgstr "Berne"
-
-#: contrib/localflavor/ch/ch_states.py:11
-msgid "Fribourg"
-msgstr "Fribourg"
-
-#: contrib/localflavor/ch/ch_states.py:12
-msgid "Geneva"
-msgstr "Geneva"
-
-#: contrib/localflavor/ch/ch_states.py:13
-msgid "Glarus"
-msgstr "Glarus"
-
-#: contrib/localflavor/ch/ch_states.py:14
-msgid "Graubuenden"
-msgstr "Graubuenden"
-
-#: contrib/localflavor/ch/ch_states.py:15
-msgid "Jura"
-msgstr "Jura"
-
-#: contrib/localflavor/ch/ch_states.py:16
-msgid "Lucerne"
-msgstr "Lucerne"
-
-#: contrib/localflavor/ch/ch_states.py:17
-msgid "Neuchatel"
-msgstr "Neuchatel"
-
-#: contrib/localflavor/ch/ch_states.py:18
-msgid "Nidwalden"
-msgstr "Nidwalden"
-
-#: contrib/localflavor/ch/ch_states.py:19
-msgid "Obwalden"
-msgstr "Obwalden"
-
-#: contrib/localflavor/ch/ch_states.py:20
-msgid "Schaffhausen"
-msgstr "Schaffhausen"
-
-#: contrib/localflavor/ch/ch_states.py:21
-msgid "Schwyz"
-msgstr "Schwyz"
-
-#: contrib/localflavor/ch/ch_states.py:22
-msgid "Solothurn"
-msgstr "Solothurn"
-
-#: contrib/localflavor/ch/ch_states.py:23
-msgid "St. Gallen"
-msgstr "St. Gallen"
-
-#: contrib/localflavor/ch/ch_states.py:24
-msgid "Thurgau"
-msgstr "Thurgau"
-
-#: contrib/localflavor/ch/ch_states.py:25
-msgid "Ticino"
-msgstr "Ticino"
-
-#: contrib/localflavor/ch/ch_states.py:26
-msgid "Uri"
-msgstr "Uri"
-
-#: contrib/localflavor/ch/ch_states.py:27
-msgid "Valais"
-msgstr "Valais"
+msgstr "Introduzca un número de seguro social de Noruega válido."
-#: contrib/localflavor/ch/ch_states.py:28
-msgid "Vaud"
-msgstr "Vaud"
-
-#: contrib/localflavor/ch/ch_states.py:29
-msgid "Zug"
-msgstr "Zug"
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr ""
+"Introduzca un código postal. Se necesita un espacio entre las dos partes del "
+"código."
-#: contrib/localflavor/ch/ch_states.py:30
-msgid "Zurich"
-msgstr "Zurich"
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Introduzca un código postal en el formato XXXXX o XXXX-XXXX."
-#: contrib/localflavor/ch/forms.py:90
-msgid ""
-"Enter a valid Swiss identity or passport card number in X1234567<0 or "
-"1234567890 format."
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
msgstr ""
+"Introduzca un Número Seguro Social de EEUU válido en el formato XXX-XX-XXXX"
-#: contrib/localflavor/is_/forms.py:16
-#, fuzzy
+#: contrib/localflavor/is_/forms.py:17
msgid ""
"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
-msgstr "Introduzca un cdigo postal en el formato XXXXX o XXXX-XXXX."
-
-#: contrib/localflavor/is_/forms.py:30
-msgid "The Icelandic identification number is not valid."
msgstr ""
+"Introduzca un número de identificación de Islandia válido. El formato es "
+"XXXXXX-XXXX."
-#: contrib/localflavor/cl/forms.py:21
-msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
-msgstr "Introduzca un RUT chileno vlido. El formato es XX.XXX.XXXX-X."
-
-#: contrib/localflavor/cl/forms.py:26
-#, fuzzy
-msgid "Enter valid a Chilean RUT"
-msgstr "Introduzca un nombre RUT chileno vlido"
+#: contrib/localflavor/is_/forms.py:31
+msgid "The Icelandic identification number is not valid."
+msgstr "El número de identificación de Islandia no es válido."
#: contrib/sessions/models.py:68
msgid "session key"
-msgstr "clave de sesin"
+msgstr "clave de sesión"
#: contrib/sessions/models.py:69
msgid "session data"
-msgstr "datos de sesin"
+msgstr "datos de sesión"
#: contrib/sessions/models.py:70
msgid "expire date"
@@ -2722,58 +2620,70 @@ msgstr "fecha de caducidad"
#: contrib/sessions/models.py:74
msgid "session"
-msgstr "sesin"
+msgstr "sesión"
#: contrib/sessions/models.py:75
msgid "sessions"
msgstr "sesiones"
-#: contrib/flatpages/models.py:8
-msgid ""
-"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
-msgstr ""
-"Ejemplo: '/about/contact/'. Asegrese de que pone barras al principio y al "
-"final."
+#: contrib/contenttypes/models.py:37
+msgid "python model class name"
+msgstr "nombre de módulo python"
-#: contrib/flatpages/models.py:9
-msgid "title"
-msgstr "ttulo"
+#: contrib/contenttypes/models.py:40
+msgid "content type"
+msgstr "tipo de contenido"
-#: contrib/flatpages/models.py:10
-msgid "content"
-msgstr "contenido"
+#: contrib/contenttypes/models.py:41
+msgid "content types"
+msgstr "tipos de contenido"
-#: contrib/flatpages/models.py:11
-msgid "enable comments"
-msgstr "admitir comentarios"
+#: oldforms/__init__.py:404
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Asegúrese de que su texto tiene menos de %s carácter."
+msgstr[1] "Asegúrese de que su texto tiene menos de %s caracteres."
-#: contrib/flatpages/models.py:12
-msgid "template name"
-msgstr "nombre de plantilla"
+#: oldforms/__init__.py:409
+msgid "Line breaks are not allowed here."
+msgstr "No se permiten saltos de línea."
-#: contrib/flatpages/models.py:13
-msgid ""
-"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
-"will use 'flatpages/default.html'."
-msgstr ""
-"Ejemplo: 'flatpages/contact_page.html'. Si no es proporcionado, el sistema "
-"usar 'flatpages/default.html'."
+#: oldforms/__init__.py:507 oldforms/__init__.py:581 oldforms/__init__.py:620
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Escoja una opción válida; '%(data)s' no está en %(choices)s."
-#: contrib/flatpages/models.py:14
-msgid "registration required"
-msgstr "debe estar registrado"
+#: oldforms/__init__.py:684
+msgid "The submitted file is empty."
+msgstr "El fichero enviado está vacío."
-#: contrib/flatpages/models.py:14
-msgid "If this is checked, only logged-in users will be able to view the page."
-msgstr "Si est marcado, slo los usuarios registrados podrn ver la pgina."
+#: oldforms/__init__.py:740
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Introduzca un número entero entre -32,768 y 32,767."
-#: contrib/flatpages/models.py:18
-msgid "flat page"
-msgstr "pgina esttica"
+#: oldforms/__init__.py:750
+msgid "Enter a positive number."
+msgstr "Introduzca un número positivo."
-#: contrib/flatpages/models.py:19
-msgid "flat pages"
-msgstr "pginas estticas"
+#: oldforms/__init__.py:760
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Introduzca un número entero entre 0 y 32,767."
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "El %(verbose_name)s se ha creado correctamente."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "Se actualizó con éxito el %(verbose_name)s."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "El %(verbose_name)s ha sido eliminado."
#: utils/dates.py:6
msgid "Monday"
@@ -2785,7 +2695,7 @@ msgstr "Martes"
#: utils/dates.py:6
msgid "Wednesday"
-msgstr "Mircoles"
+msgstr "Miércoles"
#: utils/dates.py:6
msgid "Thursday"
@@ -2797,141 +2707,169 @@ msgstr "Viernes"
#: utils/dates.py:7
msgid "Saturday"
-msgstr "Sbado"
+msgstr "Sábado"
#: utils/dates.py:7
msgid "Sunday"
msgstr "Domingo"
-#: utils/dates.py:14
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "Lun"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "Mar"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "Mie"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "Jue"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "Vie"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "Sab"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "Dom"
+
+#: utils/dates.py:18
msgid "January"
msgstr "Enero"
-#: utils/dates.py:14
+#: utils/dates.py:18
msgid "February"
msgstr "Febrero"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "March"
msgstr "Marzo"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "April"
msgstr "Abril"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "May"
msgstr "Mayo"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "June"
msgstr "Junio"
-#: utils/dates.py:15 utils/dates.py:27
+#: utils/dates.py:19 utils/dates.py:31
msgid "July"
msgstr "Julio"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "August"
msgstr "Agosto"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "September"
msgstr "Septiembre"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "October"
msgstr "Octubre"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "November"
msgstr "Noviembre"
-#: utils/dates.py:16
+#: utils/dates.py:20
msgid "December"
msgstr "Diciembre"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "jan"
msgstr "ene"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "feb"
msgstr "feb"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "mar"
msgstr "mar"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "apr"
msgstr "abr"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "may"
msgstr "may"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "jun"
msgstr "jun"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "jul"
msgstr "jul"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "aug"
msgstr "ago"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "sep"
msgstr "sep"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "oct"
msgstr "oct"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "nov"
msgstr "nov"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "dec"
msgstr "dic"
-#: utils/dates.py:27
+#: utils/dates.py:31
msgid "Jan."
msgstr "Ene."
-#: utils/dates.py:27
+#: utils/dates.py:31
msgid "Feb."
msgstr "Feb."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Aug."
msgstr "Ago."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Sept."
msgstr "Sept."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Oct."
msgstr "Oct."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Nov."
msgstr "Nov."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Dec."
msgstr "Dic."
#: utils/timesince.py:12
msgid "year"
msgid_plural "years"
-msgstr[0] "ao"
-msgstr[1] "aos"
+msgstr[0] "año"
+msgstr[1] "años"
#: utils/timesince.py:13
msgid "month"
@@ -2948,8 +2886,8 @@ msgstr[1] "semanas"
#: utils/timesince.py:15
msgid "day"
msgid_plural "days"
-msgstr[0] "da"
-msgstr[1] "das"
+msgstr[0] "día"
+msgstr[1] "días"
#: utils/timesince.py:16
msgid "hour"
@@ -2963,87 +2901,162 @@ msgid_plural "minutes"
msgstr[0] "minuto"
msgstr[1] "minutos"
-#: utils/timesince.py:40
-#, python-format
-msgid "%d milliseconds"
-msgstr ""
-
-#: utils/timesince.py:41
+#: utils/timesince.py:39
#, python-format
msgid "%(number)d %(type)s"
msgstr "%(number)d %(type)s"
-#: utils/timesince.py:47
+#: utils/timesince.py:45
#, python-format
msgid ", %(number)d %(type)s"
msgstr ", %(number)d %(type)s"
-#: utils/dateformat.py:40
+#: utils/dateformat.py:41
msgid "p.m."
msgstr "p.m"
-#: utils/dateformat.py:41
+#: utils/dateformat.py:42
msgid "a.m."
msgstr "a.m"
-#: utils/dateformat.py:46
+#: utils/dateformat.py:47
msgid "PM"
msgstr "PM"
-#: utils/dateformat.py:47
+#: utils/dateformat.py:48
msgid "AM"
msgstr "AM"
-#: utils/dateformat.py:95
+#: utils/dateformat.py:97
msgid "midnight"
msgstr "media noche"
-#: utils/dateformat.py:97
+#: utils/dateformat.py:99
msgid "noon"
-msgstr "medio da"
+msgstr "medio día"
-#: utils/translation/trans_real.py:358
+#: utils/translation/trans_real.py:391
msgid "DATE_FORMAT"
msgstr "j N Y"
-#: utils/translation/trans_real.py:359
+#: utils/translation/trans_real.py:392
msgid "DATETIME_FORMAT"
msgstr "j N Y P"
-#: utils/translation/trans_real.py:360
+#: utils/translation/trans_real.py:393
msgid "TIME_FORMAT"
msgstr "P"
-#: utils/translation/trans_real.py:376
+#: utils/translation/trans_real.py:409
msgid "YEAR_MONTH_FORMAT"
msgstr "F Y"
-#: utils/translation/trans_real.py:377
+#: utils/translation/trans_real.py:410
msgid "MONTH_DAY_FORMAT"
msgstr "j \\de F"
-#: template/defaultfilters.py:491
+#: template/defaultfilters.py:485
msgid "yes,no,maybe"
-msgstr "s,no,tal vez"
+msgstr "sí,no,tal vez"
-#: template/defaultfilters.py:520
+#: template/defaultfilters.py:514
#, python-format
msgid "%(size)d byte"
msgid_plural "%(size)d bytes"
msgstr[0] "%(size)d byte"
msgstr[1] "%(size)d bytes"
-#: template/defaultfilters.py:522
+#: template/defaultfilters.py:516
#, python-format
msgid "%.1f KB"
msgstr "%.1f KB"
-#: template/defaultfilters.py:524
+#: template/defaultfilters.py:518
#, python-format
msgid "%.1f MB"
msgstr "%.1f MB"
-#: template/defaultfilters.py:525
+#: template/defaultfilters.py:519
#, python-format
msgid "%.1f GB"
msgstr "%.1f GB"
+
+#: newforms/fields.py:116
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr ""
+"Asegúrese de que su texto tiene a lo más %(max)d caracteres (actualmente "
+"tiene %(length)d)."
+
+#: newforms/fields.py:118
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr ""
+"Asegúrese de que su texto tiene al menos %(min)d caracteres (actualmente "
+"tiene %(length)d)."
+
+#: newforms/fields.py:143 newforms/fields.py:166 newforms/fields.py:196
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Asegúrese de que este valor es menor o igual a %s."
+
+#: newforms/fields.py:145 newforms/fields.py:168 newforms/fields.py:198
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Asegúrese de que este valor es mayor o igual a %s."
+
+#: newforms/fields.py:164 newforms/fields.py:191
+msgid "Enter a number."
+msgstr "Introduzca un número."
+
+#: newforms/fields.py:200
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Asegúrese de que no hay más de %s dígitos en total."
+
+#: newforms/fields.py:202
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Asegúrese de que no hay más de %s decimales."
+
+#: newforms/fields.py:204
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Asegúrese de que no hay más de %s dígitos antes del punto decimal."
+
+#: newforms/fields.py:237 newforms/fields.py:560
+msgid "Enter a valid date."
+msgstr "Introduzca una fecha válida."
+
+#: newforms/fields.py:264 newforms/fields.py:562
+msgid "Enter a valid time."
+msgstr "Introduzca una hora válida."
+
+#: newforms/fields.py:300
+msgid "Enter a valid date/time."
+msgstr "Introduzca una fecha/hora válida."
+
+#: newforms/fields.py:313
+msgid "Enter a valid value."
+msgstr "Introduzca un valor correcto."
+
+#: newforms/fields.py:353 newforms/fields.py:375
+msgid "Enter a valid URL."
+msgstr "Introduzca una URL válida."
+
+#: newforms/fields.py:377
+msgid "This URL appears to be a broken link."
+msgstr "La URL parece ser un enlace roto."
+
+#: newforms/fields.py:428 newforms/models.py:174
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Escoja una opción válida. Esa opción no está entre las aceptadas."
+
+#: newforms/fields.py:444 newforms/fields.py:520 newforms/models.py:191
+msgid "Enter a list of values."
+msgstr "Introduzca una lista de valores."
+
+#: newforms/fields.py:450 newforms/models.py:197
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Escoja una opción válida; '%s' no es una de las opciones disponibles."
diff --git a/django/conf/locale/es/LC_MESSAGES/djangojs.mo b/django/conf/locale/es/LC_MESSAGES/djangojs.mo
index 701443cace..6d098c5041 100644
--- a/django/conf/locale/es/LC_MESSAGES/djangojs.mo
+++ b/django/conf/locale/es/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/es/LC_MESSAGES/djangojs.po b/django/conf/locale/es/LC_MESSAGES/djangojs.po
index 99856cec36..d193cf660e 100644
--- a/django/conf/locale/es/LC_MESSAGES/djangojs.po
+++ b/django/conf/locale/es/LC_MESSAGES/djangojs.po
@@ -1,26 +1,41 @@
# Spanish translation for the django-admin JS files.
# Copyright (C)
# This file is distributed under the same license as the PACKAGE package.
-# Jorge Gajon <gajon@gajon.org>, 2005.
#
msgid ""
msgstr ""
"Project-Id-Version: Django JavaScript 1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2005-12-09 11:51+0100\n"
-"PO-Revision-Date: 2005-12-06 21:32+0100\n"
+"POT-Creation-Date: 2007-07-14 13:47-0500\n"
+"PO-Revision-Date: 2007-07-14 13:41-0500\n"
"Last-Translator: Jorge Gajon <gajon@gajon.org>\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Enero Febrero Marzo Abril Mayo Junio Julio Agosto Septiembre Octubre "
+"Noviembre Diciembre"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "D L M M J V S"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Domingo Lunes Martes Miércoles Jueves Viernes Sábado"
+
#: contrib/admin/media/js/SelectFilter2.js:33
#, perl-format
msgid "Available %s"
msgstr "%s Disponibles"
#: contrib/admin/media/js/SelectFilter2.js:41
-#, fuzzy
msgid "Choose all"
msgstr "Selecciona todos"
@@ -45,66 +60,58 @@ msgstr "Haz tus elecciones y da click en "
msgid "Clear all"
msgstr "Elimina todos"
-#: 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 ""
-"Enero Febrero Marzo Abril Mayo Junio Julio Agosto Septiembre Octubre "
-"Noviembre Diciembre"
-
-#: contrib/admin/media/js/dateparse.js:27
-msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
-msgstr "Domingo Lunes Martes Mircoles Jueves Viernes Sbado"
-
-#: contrib/admin/media/js/calendar.js:25
-msgid "S M T W T F S"
-msgstr "D L M M J V S"
-
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
msgid "Now"
msgstr "Ahora"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
msgid "Clock"
msgstr "Reloj"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
msgid "Choose a time"
msgstr "Elige una hora"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
msgid "Midnight"
msgstr "Medianoche"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
msgid "6 a.m."
msgstr "6 a.m."
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
msgid "Noon"
-msgstr "Medioda"
+msgstr "Mediodía"
-#: 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 "Cancelar"
-#: 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 "Hoy"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
msgid "Calendar"
msgstr "Calendario"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
msgid "Yesterday"
msgstr "Ayer"
-#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
msgid "Tomorrow"
-msgstr "Maana"
+msgstr "Mañana"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Mostrar"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Esconder"
diff --git a/django/conf/locale/es_AR/LC_MESSAGES/django.mo b/django/conf/locale/es_AR/LC_MESSAGES/django.mo
index 717bbcbd05..5c12160a7c 100644
--- a/django/conf/locale/es_AR/LC_MESSAGES/django.mo
+++ b/django/conf/locale/es_AR/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/es_AR/LC_MESSAGES/django.po b/django/conf/locale/es_AR/LC_MESSAGES/django.po
index 02f80682e7..93beac1e1b 100644
--- a/django/conf/locale/es_AR/LC_MESSAGES/django.po
+++ b/django/conf/locale/es_AR/LC_MESSAGES/django.po
@@ -4,182 +4,333 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: django\n"
+"Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2007-05-19 13:22-0300\n"
-"PO-Revision-Date: 2007-05-19 13:33-0300\n"
+"POT-Creation-Date: 2007-07-14 12:13-0300\n"
+"PO-Revision-Date: 2007-07-14 14:37-0300\n"
"Last-Translator: Ramiro Morales <rm0@gmx.net>\n"
-"Language-Team: Spanish <es@li.org>\n"
+"Language-Team: Django-I18N <django-i18n@googlegroups.com>\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: newforms/fields.py:82 newforms/fields.py:378 newforms/fields.py:454
-#: newforms/fields.py:465 newforms/models.py:186
-#: db/models/fields/__init__.py:117 db/models/fields/__init__.py:274
-#: db/models/fields/__init__.py:612 db/models/fields/__init__.py:623
-#: oldforms/__init__.py:357
-msgid "This field is required."
-msgstr "Este campo es obligatorio."
-
-#: newforms/fields.py:105 newforms/fields.py:258
+#: views/generic/create_update.py:43
#, python-format
-msgid "Ensure this value has at most %d characters."
-msgstr "Asegrese de que este valor tenga como mximo %d caracteres."
+msgid "The %(verbose_name)s was created successfully."
+msgstr "Se creó con éxito %(verbose_name)s."
-#: newforms/fields.py:107 newforms/fields.py:260
+#: views/generic/create_update.py:117
#, python-format
-msgid "Ensure this value has at least %d characters."
-msgstr "Asegrese de que este valor tenga al menos %d caracteres."
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "Se actualizó con éxito %(verbose_name)s."
-#: newforms/fields.py:130 core/validators.py:120
-msgid "Enter a whole number."
-msgstr "Introduzca un nmero entero."
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "Se eliminó %(verbose_name)s."
-#: newforms/fields.py:132
+#: db/models/manipulators.py:309
#, python-format
-msgid "Ensure this value is less than or equal to %s."
-msgstr "Asegrese de que este valor sea menor o igual a %s."
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "Ya existe un(a) %(object)s con este/a %(type)s para %(field)s."
-#: newforms/fields.py:134
+#: db/models/manipulators.py:310 contrib/admin/views/main.py:342
+#: contrib/admin/views/main.py:344 contrib/admin/views/main.py:346
+msgid "and"
+msgstr "y"
+
+#: db/models/fields/__init__.py:47
#, python-format
-msgid "Ensure this value is greater than or equal to %s."
-msgstr "Asegrese de que este valor sea mayor o igual a %s."
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "Ya existe %(optname)s con este %(fieldname)s."
-#: newforms/fields.py:167
-msgid "Enter a valid date."
-msgstr "Introduzca una fecha vlida."
+#: db/models/fields/__init__.py:127 db/models/fields/__init__.py:284
+#: db/models/fields/__init__.py:681 db/models/fields/__init__.py:692
+#: oldforms/__init__.py:369 newforms/fields.py:92 newforms/fields.py:440
+#: newforms/fields.py:516 newforms/fields.py:527 newforms/models.py:187
+msgid "This field is required."
+msgstr "Este campo es obligatorio."
-#: newforms/fields.py:194
-msgid "Enter a valid time."
-msgstr "Introduzca una hora vlida."
+#: db/models/fields/__init__.py:379
+msgid "This value must be an integer."
+msgstr "Este valor debe ser un número entero."
-#: newforms/fields.py:230
-msgid "Enter a valid date/time."
-msgstr "Introduzca una fecha/hora vlida."
+#: db/models/fields/__init__.py:414
+msgid "This value must be either True or False."
+msgstr "Este valor debe ser True o False."
-#: newforms/fields.py:244
-msgid "Enter a valid value."
-msgstr "Introduzca un valor vlido."
+#: db/models/fields/__init__.py:435
+msgid "This field cannot be null."
+msgstr "Este campo no puede ser nulo."
-#: newforms/fields.py:273 core/validators.py:162
-msgid "Enter a valid e-mail address."
-msgstr "Introduzca una direccin de correo electrnico vlida"
+#: db/models/fields/__init__.py:469 core/validators.py:155
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Introduzca una fecha válida en formato AAAA-MM-DD."
-#: newforms/fields.py:291 newforms/fields.py:313
-msgid "Enter a valid URL."
-msgstr "Introduzca una URL vlida."
+#: db/models/fields/__init__.py:538 core/validators.py:164
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Introduzca una fecha/hora válida en formato AAAA-MM-DD HH:MM."
-#: newforms/fields.py:315
-msgid "This URL appears to be a broken link."
-msgstr "La URL parece ser un enlace roto."
+#: db/models/fields/__init__.py:598
+msgid "This value must be a decimal number."
+msgstr "Este valor debe ser un número decimal."
-#: newforms/fields.py:366 newforms/models.py:173
-msgid "Select a valid choice. That choice is not one of the available choices."
-msgstr ""
-"Seleccione una opcin vlida. Esa opcin no es una de las opciones "
-"disponibles."
+#: db/models/fields/__init__.py:701
+msgid "Enter a valid filename."
+msgstr "Introduzca un nombre de archivo válido."
-#: newforms/fields.py:382 newforms/fields.py:458 newforms/models.py:190
-msgid "Enter a list of values."
-msgstr "Introduzca una lista de valores."
+#: db/models/fields/__init__.py:826
+msgid "This value must be either None, True or False."
+msgstr "Este valor debe ser None, True o False."
-#: newforms/fields.py:391 newforms/models.py:196
+#: db/models/fields/related.py:55
#, python-format
-msgid "Select a valid choice. %s is not one of the available choices."
+msgid "Please enter a valid %s."
+msgstr "Por favor, introduzca un %s válido."
+
+#: db/models/fields/related.py:641
+msgid "Separate multiple IDs with commas."
+msgstr " Separe múltiples identificadores con comas."
+
+#: db/models/fields/related.py:643
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr ""
-"Seleccione una opcin vlida. %s no es una de las opciones disponibles."
+"Mantenga presionada \"Control\" (\"Command\" en una Mac) para seleccionar "
+"más de uno."
-#: newforms/widgets.py:182 contrib/admin/filterspecs.py:150
-#: oldforms/__init__.py:577
+#: db/models/fields/related.py:690
+#, 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] ""
+"Por favor, introduzca IDs de %(self)s válidos. El valor %(value)r no es "
+"válido."
+msgstr[1] ""
+"Por favor, introduzca IDs de %(self)s válidos. Los valores %(value)r no son "
+"válidos."
+
+#: oldforms/__init__.py:404
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Asegúrese de que su texto tiene menos de %s caracter."
+msgstr[1] "Asegúrese de que su texto tiene menos de %s caracteres."
+
+#: oldforms/__init__.py:409
+msgid "Line breaks are not allowed here."
+msgstr "No se permiten saltos de línea."
+
+#: oldforms/__init__.py:507 oldforms/__init__.py:581 oldforms/__init__.py:620
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Seleccione una opción válida; '%(data)s' no está en %(choices)s."
+
+#: oldforms/__init__.py:587 contrib/admin/filterspecs.py:152
+#: newforms/widgets.py:181
msgid "Unknown"
msgstr "Desconocido"
-#: newforms/widgets.py:182 contrib/admin/filterspecs.py:143
-#: oldforms/__init__.py:577
+#: oldforms/__init__.py:587 contrib/admin/filterspecs.py:145
+#: newforms/widgets.py:181
msgid "Yes"
-msgstr "S"
+msgstr "Sí"
-#: newforms/widgets.py:182 contrib/admin/filterspecs.py:143
-#: oldforms/__init__.py:577
+#: oldforms/__init__.py:587 contrib/admin/filterspecs.py:145
+#: newforms/widgets.py:181
msgid "No"
msgstr "No"
-#: utils/dateformat.py:40
-msgid "p.m."
+#: oldforms/__init__.py:682 core/validators.py:181 core/validators.py:461
+msgid "No file was submitted. Check the encoding type on the form."
msgstr ""
+"No se envió un archivo. Verifique el tipo de codificación en el formulario."
-#: utils/dateformat.py:41
-msgid "a.m."
-msgstr ""
+#: oldforms/__init__.py:684
+msgid "The submitted file is empty."
+msgstr "El archivo enviado está vacío."
-#: utils/dateformat.py:46
-msgid "PM"
-msgstr ""
+#: oldforms/__init__.py:740
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Introduzca un número entero entre -32.768 y 32.767."
-#: utils/dateformat.py:47
-msgid "AM"
-msgstr ""
+#: oldforms/__init__.py:750
+msgid "Enter a positive number."
+msgstr "Introduzca un número positivo."
-#: utils/dateformat.py:95
-msgid "midnight"
-msgstr "medianoche"
+#: oldforms/__init__.py:760
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Introduzca un número entero entre 0 y 32.767."
-#: utils/dateformat.py:97
-msgid "noon"
-msgstr "medioda"
+#: conf/global_settings.py:38
+msgid "Arabic"
+msgstr "Árabe"
-#: utils/timesince.py:12
-msgid "year"
-msgid_plural "years"
-msgstr[0] "ao"
-msgstr[1] "aos"
+#: conf/global_settings.py:39
+msgid "Bengali"
+msgstr "Bengalí"
-#: utils/timesince.py:13
-msgid "month"
-msgid_plural "months"
-msgstr[0] "mes"
-msgstr[1] "meses"
+#: conf/global_settings.py:40
+msgid "Bulgarian"
+msgstr "Búlgaro"
-#: utils/timesince.py:14
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] "semana"
-msgstr[1] "semanas"
+#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr "Catalán"
-#: utils/timesince.py:15
-msgid "day"
-msgid_plural "days"
-msgstr[0] "da"
-msgstr[1] "das"
+#: conf/global_settings.py:42
+msgid "Czech"
+msgstr "Checo"
-#: utils/timesince.py:16
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] "hora"
-msgstr[1] "horas"
+#: conf/global_settings.py:43
+msgid "Welsh"
+msgstr "Galés"
-#: utils/timesince.py:17
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "minuto"
-msgstr[1] "minutos"
+#: conf/global_settings.py:44
+msgid "Danish"
+msgstr "Danés"
-#: utils/timesince.py:40
-#, python-format
-msgid "%d milliseconds"
-msgstr "%d milisegundos"
+#: conf/global_settings.py:45
+msgid "German"
+msgstr "Alemán"
-#: utils/timesince.py:41
-#, python-format
-msgid "%(number)d %(type)s"
-msgstr ""
+#: conf/global_settings.py:46
+msgid "Greek"
+msgstr "Griego"
-#: utils/timesince.py:47
-#, python-format
-msgid ", %(number)d %(type)s"
-msgstr ""
+#: conf/global_settings.py:47
+msgid "English"
+msgstr "Inglés"
+
+#: conf/global_settings.py:48
+msgid "Spanish"
+msgstr "Español"
+
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
+msgstr "Español Argentino"
+
+#: conf/global_settings.py:50
+msgid "Persian"
+msgstr "Persa"
+
+#: conf/global_settings.py:51
+msgid "Finnish"
+msgstr "Finlandés"
+
+#: conf/global_settings.py:52
+msgid "French"
+msgstr "Francés"
+
+#: conf/global_settings.py:53
+msgid "Galician"
+msgstr "Gallego"
+
+#: conf/global_settings.py:54
+msgid "Hungarian"
+msgstr "Húngaro"
+
+#: conf/global_settings.py:55
+msgid "Hebrew"
+msgstr "Hebreo"
+
+#: conf/global_settings.py:56
+msgid "Icelandic"
+msgstr "Islandés"
+
+#: conf/global_settings.py:57
+msgid "Italian"
+msgstr "Italiano"
+
+#: conf/global_settings.py:58
+msgid "Japanese"
+msgstr "Japonés"
+
+#: conf/global_settings.py:59
+msgid "Korean"
+msgstr "Koreano"
+
+#: conf/global_settings.py:60
+msgid "Kannada"
+msgstr "Canarés"
+
+#: conf/global_settings.py:61
+msgid "Latvian"
+msgstr "Letón"
+
+#: conf/global_settings.py:62
+msgid "Macedonian"
+msgstr "Macedonio"
+
+#: conf/global_settings.py:63
+msgid "Dutch"
+msgstr "Holandés"
+
+#: conf/global_settings.py:64
+msgid "Norwegian"
+msgstr "Noruego"
+
+#: conf/global_settings.py:65
+msgid "Polish"
+msgstr "Polaco"
+
+#: conf/global_settings.py:66
+msgid "Portugese"
+msgstr "Portugués"
+
+#: conf/global_settings.py:67
+msgid "Brazilian"
+msgstr "Brasileño"
+
+#: conf/global_settings.py:68
+msgid "Romanian"
+msgstr "Rumano"
+
+#: conf/global_settings.py:69
+msgid "Russian"
+msgstr "Ruso"
+
+#: conf/global_settings.py:70
+msgid "Slovak"
+msgstr "Eslovaco"
+
+#: conf/global_settings.py:71
+msgid "Slovenian"
+msgstr "Esloveno"
+
+#: conf/global_settings.py:72
+msgid "Serbian"
+msgstr "Serbio"
+
+#: conf/global_settings.py:73
+msgid "Swedish"
+msgstr "Sueco"
+
+#: conf/global_settings.py:74
+msgid "Tamil"
+msgstr "Tamil"
+
+#: conf/global_settings.py:75
+msgid "Telugu"
+msgstr "Telugu"
+
+#: conf/global_settings.py:76
+msgid "Turkish"
+msgstr "Turco"
+
+#: conf/global_settings.py:77
+msgid "Ukrainian"
+msgstr "Ucraniano"
+
+#: conf/global_settings.py:78
+msgid "Simplified Chinese"
+msgstr "Chino simplificado"
+
+#: conf/global_settings.py:79
+msgid "Traditional Chinese"
+msgstr "Chino tradicional"
#: utils/dates.py:6
msgid "Monday"
@@ -191,7 +342,7 @@ msgstr "Martes"
#: utils/dates.py:6
msgid "Wednesday"
-msgstr "Mircoles"
+msgstr "Miércoles"
#: utils/dates.py:6
msgid "Thursday"
@@ -203,383 +354,794 @@ msgstr "Viernes"
#: utils/dates.py:7
msgid "Saturday"
-msgstr "Sbado"
+msgstr "Sábado"
#: utils/dates.py:7
msgid "Sunday"
msgstr "Domingo"
-#: utils/dates.py:14
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "Lun"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "Mar"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "Mie"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "Jue"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "Vie"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "Sab"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "Dom"
+
+#: utils/dates.py:18
msgid "January"
msgstr "Enero"
-#: utils/dates.py:14
+#: utils/dates.py:18
msgid "February"
msgstr "Febrero"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "March"
msgstr "Marzo"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "April"
msgstr "Abril"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "May"
msgstr "Mayo"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "June"
msgstr "Junio"
-#: utils/dates.py:15 utils/dates.py:27
+#: utils/dates.py:19 utils/dates.py:31
msgid "July"
msgstr "Julio"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "August"
msgstr "Agosto"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "September"
msgstr "Setiembre"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "October"
msgstr "Octubre"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "November"
msgstr "Noviembre"
-#: utils/dates.py:16
+#: utils/dates.py:20
msgid "December"
msgstr "Diciembre"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "jan"
msgstr "ene"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "feb"
msgstr "feb"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "mar"
msgstr "mar"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "apr"
msgstr "abr"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "may"
msgstr "may"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "jun"
msgstr "jun"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "jul"
msgstr "jul"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "aug"
msgstr "ago"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "sep"
msgstr "set"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "oct"
msgstr "oct"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "nov"
msgstr "nov"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "dec"
msgstr "dic"
-#: utils/dates.py:27
+#: utils/dates.py:31
msgid "Jan."
msgstr "Enero"
-#: utils/dates.py:27
+#: utils/dates.py:31
msgid "Feb."
msgstr "Feb."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Aug."
msgstr "Ago."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Sept."
msgstr "Set."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Oct."
msgstr "Oct."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Nov."
msgstr "Nov."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Dec."
msgstr "Dic."
-#: utils/translation/trans_real.py:358
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "año"
+msgstr[1] "años"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mes"
+msgstr[1] "meses"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "semana"
+msgstr[1] "semanas"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "día"
+msgstr[1] "días"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "horas"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minutos"
+
+#: utils/timesince.py:39
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:45
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "p.m."
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "a.m."
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "PM"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "AM"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "medianoche"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "mediodía"
+
+#: utils/translation/trans_real.py:391
msgid "DATE_FORMAT"
msgstr "j N Y"
-#: utils/translation/trans_real.py:359
+#: utils/translation/trans_real.py:392
msgid "DATETIME_FORMAT"
msgstr "j N Y P"
-#: utils/translation/trans_real.py:360
+#: utils/translation/trans_real.py:393
msgid "TIME_FORMAT"
msgstr "P"
-#: utils/translation/trans_real.py:376
+#: utils/translation/trans_real.py:409
msgid "YEAR_MONTH_FORMAT"
msgstr "F Y"
-#: utils/translation/trans_real.py:377
+#: utils/translation/trans_real.py:410
msgid "MONTH_DAY_FORMAT"
msgstr "j \\de F"
-#: contrib/redirects/models.py:7
-msgid "redirect from"
-msgstr "redirigir desde"
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Los dos campos de contraseñas no coinciden entre si."
-#: contrib/redirects/models.py:8
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Ya existe un usuario con ese nombre."
+
+#: contrib/auth/forms.py:53
msgid ""
-"This should be an absolute path, excluding the domain name. Example: '/"
-"events/search/'."
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
msgstr ""
-"Esta ruta debera ser absoluta, excluyendo el nombre de dominio. Ejemplo: '/"
-"events/search/'."
+"Su navegador Web aparenta no tener cookies activas. Las cookies son un "
+"requerimiento para poder ingresar."
-#: contrib/redirects/models.py:9
-msgid "redirect to"
-msgstr "redirigir a"
+#: contrib/auth/forms.py:60 contrib/admin/views/decorators.py:10
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Por favor introduzca un nombre de usuario y una contraseña correctos. Note "
+"que ambos campos son sensibles a mayúsculas/minúsculas."
-#: contrib/redirects/models.py:10
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Esta cuenta está inactiva"
+
+#: contrib/auth/forms.py:84
msgid ""
-"This can be either an absolute path (as above) or a full URL starting with "
-"'http://'."
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
msgstr ""
-"Esto puede ser bien una ruta absoluta (como antes) o una URL completa que "
-"empiece con 'http://'."
+"Esa dirección de e-mail no está asociada a ninguna cuenta de usuario. ¿Está "
+"seguro de que ya se ha registrado?"
-#: contrib/redirects/models.py:13
-msgid "redirect"
-msgstr "redireccin"
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Los dos campos 'nueva contraseña' no coinciden entre si."
-#: contrib/redirects/models.py:14
-msgid "redirects"
-msgstr "redirecciones"
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr ""
+"La antigua contraseña ingresada es incorrecta. Por favor ingrésela "
+"nuevamente."
-#: contrib/auth/models.py:44 contrib/auth/models.py:64
+#: contrib/auth/models.py:51 contrib/auth/models.py:71
msgid "name"
msgstr "nombre"
-#: contrib/auth/models.py:46
+#: contrib/auth/models.py:53
msgid "codename"
-msgstr "nombre en cdigo"
+msgstr "nombre en código"
-#: contrib/auth/models.py:49
+#: contrib/auth/models.py:56
msgid "permission"
msgstr "permiso"
-#: contrib/auth/models.py:50 contrib/auth/models.py:65
+#: contrib/auth/models.py:57 contrib/auth/models.py:72
msgid "permissions"
msgstr "permisos"
-#: contrib/auth/models.py:68
+#: contrib/auth/models.py:75
msgid "group"
msgstr "grupo"
-#: contrib/auth/models.py:69 contrib/auth/models.py:109
+#: contrib/auth/models.py:76 contrib/auth/models.py:116
msgid "groups"
msgstr "grupos"
-#: contrib/auth/models.py:99
+#: contrib/auth/models.py:106
msgid "username"
msgstr "nombre de usuario"
-#: contrib/auth/models.py:99
+#: contrib/auth/models.py:106
msgid ""
"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
"digits and underscores)."
msgstr ""
-"Requerido. Longitud mxima 30 caracteres alfanumricos (letras, dgitos y "
+"Requerido. Longitud máxima 30 caracteres alfanuméricos (letras, dígitos y "
"guiones bajos)."
-#: contrib/auth/models.py:100
+#: contrib/auth/models.py:107
msgid "first name"
msgstr "nombre"
-#: contrib/auth/models.py:101
+#: contrib/auth/models.py:108
msgid "last name"
msgstr "apellido"
-#: contrib/auth/models.py:102
+#: contrib/auth/models.py:109
msgid "e-mail address"
-msgstr "direccin de correo"
+msgstr "dirección de correo"
-#: contrib/auth/models.py:103
+#: contrib/auth/models.py:110
msgid "password"
-msgstr "contrasea"
+msgstr "contraseña"
-#: contrib/auth/models.py:103
+#: contrib/auth/models.py:110
msgid ""
"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
"password form</a>."
msgstr ""
"Use '[algo]$[salt]$[hexdigest]' o use el <a href=\"password/\">formulario de "
-"cambio de contrasea</a>."
+"cambio de contraseña</a>."
-#: contrib/auth/models.py:104
+#: contrib/auth/models.py:111
msgid "staff status"
msgstr "es staff"
-#: contrib/auth/models.py:104
+#: contrib/auth/models.py:111
msgid "Designates whether the user can log into this admin site."
-msgstr "Indica si el usuario puede ingresar a este sitio de administracin."
+msgstr "Indica si el usuario puede ingresar a este sitio de administración."
-#: contrib/auth/models.py:105
+#: contrib/auth/models.py:112
msgid "active"
msgstr "activo"
-#: contrib/auth/models.py:105
+#: contrib/auth/models.py:112
msgid ""
"Designates whether this user can log into the Django admin. Unselect this "
"instead of deleting accounts."
msgstr ""
-"Indica si el usuario puede ingresar al sitio de administracin Django."
+"Indica si el usuario puede ingresar al sitio de administración Django. "
"Desactive este campo en lugar de eliminar usuarios."
-#: contrib/auth/models.py:106
+#: contrib/auth/models.py:113
msgid "superuser status"
msgstr "es superusuario"
-#: contrib/auth/models.py:106
+#: contrib/auth/models.py:113
msgid ""
"Designates that this user has all permissions without explicitly assigning "
"them."
msgstr ""
-"Indica que este usuario posee todos los permisos, sin asignarle los mismos "
-"explcitamente."
+"Indica que este usuario posee todos los permisos, sin que sea neceario "
+"asignarle los mismos en forma explícita."
-#: contrib/auth/models.py:107
+#: contrib/auth/models.py:114
msgid "last login"
-msgstr "ltimo ingreso"
+msgstr "último ingreso"
-#: contrib/auth/models.py:108
+#: contrib/auth/models.py:115
msgid "date joined"
-msgstr "fecha de creacin"
+msgstr "fecha de creación"
-#: contrib/auth/models.py:110
+#: contrib/auth/models.py:117
msgid ""
"In addition to the permissions manually assigned, this user will also get "
"all permissions granted to each group he/she is in."
msgstr ""
-"Adems de los permisos asignados manualmente, este usuario tambin poseer "
+"Además de los permisos asignados manualmente, este usuario también poseerá "
"todos los permisos de los grupos a los que pertenezca."
-#: contrib/auth/models.py:111
+#: contrib/auth/models.py:118
msgid "user permissions"
msgstr "permisos de usuario"
-#: contrib/auth/models.py:115
+#: contrib/auth/models.py:122
msgid "user"
msgstr "usuario"
-#: contrib/auth/models.py:116
+#: contrib/auth/models.py:123
msgid "users"
msgstr "usuarios"
-#: contrib/auth/models.py:122
+#: contrib/auth/models.py:129
msgid "Personal info"
-msgstr "Informacin personal"
+msgstr "Información personal"
-#: contrib/auth/models.py:123
+#: contrib/auth/models.py:130
msgid "Permissions"
msgstr "Permisos"
-#: contrib/auth/models.py:124
+#: contrib/auth/models.py:131
msgid "Important dates"
msgstr "Fechas importantes"
-#: contrib/auth/models.py:125
+#: contrib/auth/models.py:132
msgid "Groups"
msgstr "Grupos"
-#: contrib/auth/models.py:269
+#: contrib/auth/models.py:274
msgid "message"
msgstr "mensaje"
-#: contrib/auth/models.py:282
-msgid "AnonymousUser"
-msgstr "UsuarioAnonimo"
+#: contrib/auth/views.py:41
+msgid "Logged out"
+msgstr "Sesión cerrada"
-#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
-msgid "The two password fields didn't match."
-msgstr "Los dos campos de contraseas no coinciden entre si."
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID de objeto"
-#: contrib/auth/forms.py:25
-msgid "A user with that username already exists."
-msgstr "Ya existe un usuario con ese nombre."
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "encabezado"
-#: contrib/auth/forms.py:53
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "comentario"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "calificación 1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "calificación 2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "calificación 3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "calificación 4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "calificación 5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "calificación 6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "calificación 7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "calificación 8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "es calificación válida"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "fecha/hora de envío"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "es público"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:306
+msgid "IP address"
+msgstr "Dirección IP"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "se ha eliminado"
+
+#: contrib/comments/models.py:86
msgid ""
-"Your Web browser doesn't appear to have cookies enabled. Cookies are "
-"required for logging in."
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
msgstr ""
-"Su navegador Web aparenta no tener cookies activas. Las cookies son un "
-"requerimiento para poder ingresar."
+"Marque esta caja si el comentario es inapropiado. En su lugar se mostrará un "
+"mensaje \"Este comentario ha sido eliminado\"."
-#: contrib/auth/forms.py:60 contrib/admin/views/decorators.py:10
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "comentarios"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Objeto contenido"
+
+#: contrib/comments/models.py:159
+#, python-format
msgid ""
-"Please enter a correct username and password. Note that both fields are case-"
-"sensitive."
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
msgstr ""
-"Por favor introduzca un nombre de usuario y una contrasea correctos. Note "
-"que ambos campos son sensibles a maysculas/minsculas."
+"Enviado por %(user)s el %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
-#: contrib/auth/forms.py:62
-msgid "This account is inactive."
-msgstr "Esta cuenta est inactiva"
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "nombre de la persona"
-#: contrib/auth/forms.py:85
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "dirección ip"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "aprobado por el staff"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "comentario libre"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "comentarios libres"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "puntuación"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "fecha de la puntuación"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "punto karma"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "puntos karma"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "puntuado %(score)d por %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
msgid ""
-"That e-mail address doesn't have an associated user account. Are you sure "
-"you've registered?"
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
msgstr ""
-"Esa direccin de e-mail no est asociada a ninguna cuenta de usuario. Est "
-"seguro de que ya se ha registrado?"
+"Este comentario fue marcado por %(user)s:\n"
+"\n"
+"%(text)s"
-#: contrib/auth/forms.py:117
-msgid "The two 'new password' fields didn't match."
-msgstr "Los dos campos 'nueva contrasea' no coinciden entre si."
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "fecha de la marca"
-#: contrib/auth/forms.py:124
-msgid "Your old password was entered incorrectly. Please enter it again."
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "marca de usuario"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "marcas de usuario"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Marca de %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "fecha de eliminación"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "Eliminación por moderador"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "eliminaciones por moderador"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Eliminación del moderador %r"
+
+#: contrib/comments/views/karma.py:20
+msgid "Anonymous users cannot vote"
+msgstr "Los usuarios anónimos no pueden votar"
+
+#: contrib/comments/views/karma.py:24
+msgid "Invalid comment ID"
+msgstr "ID de comentario no válido"
+
+#: contrib/comments/views/karma.py:26
+msgid "No voting for yourself"
+msgstr "Ud. no puede votarse a sí mismo"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Se precisa esta puntuación porque ha introducido al menos otra más."
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Este comentario lo envió un usuario que ha enviado menos de %(count)s "
+"comentario:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Este comentario lo envió un usuario que ha enviado menos de %(count)s "
+"comentarios:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
msgstr ""
-"La antigua contrasea ingresada es incorrecta. Por favor ingrsela "
-"nuevamente."
+"Este comentario ha sido enviado por un usuario 'semi-anónimo':\n"
+"\n"
+"%(text)s"
-#: contrib/auth/views.py:40
-msgid "Logged out"
-msgstr "Sesin cerrada"
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:281
+msgid "Only POSTs are allowed"
+msgstr "Sólo se admiten POSTs"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:285
+msgid "One or more of the required fields wasn't submitted"
+msgstr "No se proporcionó uno o más de los siguientes campos requeridos"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:287
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+"Alguien está jugando con el formulario de comentarios (violación de "
+"seguridad)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:293
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"El formulario de comentarios tiene un parámetro 'target' no válido (el ID de "
+"objeto era inválido)"
+
+#: contrib/comments/views/comments.py:258
+#: contrib/comments/views/comments.py:322
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "El formulario de comentario no proporcionó 'previsualizar' ni 'enviar'"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Su nombre:"
+
+#: contrib/comments/templates/comments/freeform.html:5
+#: contrib/comments/templates/comments/form.html:28
+msgid "Comment:"
+msgstr "Comentario:"
-#: contrib/admin/filterspecs.py:40
+#: contrib/comments/templates/comments/freeform.html:10
+#: contrib/comments/templates/comments/form.html:35
+msgid "Preview comment"
+msgstr "Previsualizar comentario"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Usuario:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+msgid "Log out"
+msgstr "Cerrar sesión"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Contraseña:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Olvidó su contraseña?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Calificaciones"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Requerido"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opcional"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Enviar una foto"
+
+#: contrib/sites/models.py:15
+msgid "domain name"
+msgstr "nombre de dominio"
+
+#: contrib/sites/models.py:16
+msgid "display name"
+msgstr "nombre para visualizar"
+
+#: contrib/sites/models.py:20
+msgid "site"
+msgstr "sitio"
+
+#: contrib/sites/models.py:21
+msgid "sites"
+msgstr "sitios"
+
+#: contrib/admin/filterspecs.py:42
#, python-format
msgid ""
"<h3>By %s:</h3>\n"
@@ -588,506 +1150,502 @@ msgstr ""
"<h3>Por %s:</h3>\n"
"<ul>\n"
-#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
-#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
+#: contrib/admin/filterspecs.py:72 contrib/admin/filterspecs.py:90
+#: contrib/admin/filterspecs.py:145 contrib/admin/filterspecs.py:171
msgid "All"
msgstr "Todos/as"
-#: contrib/admin/filterspecs.py:109
+#: contrib/admin/filterspecs.py:111
msgid "Any date"
msgstr "Cualquier fecha"
-#: contrib/admin/filterspecs.py:110
+#: contrib/admin/filterspecs.py:112
msgid "Today"
msgstr "Hoy"
-#: contrib/admin/filterspecs.py:113
+#: contrib/admin/filterspecs.py:115
msgid "Past 7 days"
-msgstr "ltimos 7 das"
+msgstr "Últimos 7 días"
-#: contrib/admin/filterspecs.py:115
+#: contrib/admin/filterspecs.py:117
msgid "This month"
msgstr "Este mes"
-#: contrib/admin/filterspecs.py:117
+#: contrib/admin/filterspecs.py:119
msgid "This year"
-msgstr "Este ao"
+msgstr "Este año"
-#: contrib/admin/models.py:16
+#: contrib/admin/models.py:17
msgid "action time"
-msgstr "hora de accin"
+msgstr "hora de acción"
-#: contrib/admin/models.py:19
+#: contrib/admin/models.py:20
msgid "object id"
msgstr "id de objeto"
-#: contrib/admin/models.py:20
+#: contrib/admin/models.py:21
msgid "object repr"
msgstr "repr de objeto"
-#: contrib/admin/models.py:21
+#: contrib/admin/models.py:22
msgid "action flag"
-msgstr "marca de accin"
+msgstr "marca de acción"
-#: contrib/admin/models.py:22
+#: contrib/admin/models.py:23
msgid "change message"
msgstr "mensaje de cambio"
-#: contrib/admin/models.py:25
+#: contrib/admin/models.py:26
msgid "log entry"
msgstr "entrada de registro"
-#: contrib/admin/models.py:26
+#: contrib/admin/models.py:27
msgid "log entries"
msgstr "entradas de registro"
-#: contrib/admin/views/decorators.py:24
-#: contrib/admin/templates/admin/login.html:25
-msgid "Log in"
-msgstr "Identificarse"
-
-#: 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 ""
-"Por favor, identifquese de nuevo porque su sesin ha caducado. No se "
-"preocupe: se ha guardado su envo."
-
-#: 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 ""
-"Parece que su navegador no est configurado para aceptar cookies. Actvelas "
-"por favor, recargue esta pgina, e intntelo de nuevo."
-
-#: contrib/admin/views/decorators.py:83
-msgid "Usernames cannot contain the '@' character."
-msgstr "Los nombres de usuario no pueden contener el carcter '@'."
-
-#: contrib/admin/views/decorators.py:85
-#, python-format
-msgid "Your e-mail address is not your username. Try '%s' instead."
-msgstr ""
-"Su direccin de correo no es su nombre de usuario. Intente nuevamente usando "
-"'%s'."
-
-#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was added successfully."
-msgstr "Se agreg con xito %(name)s \"%(obj)s\"."
-
-#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261
-#: contrib/admin/views/main.py:347
-msgid "You may edit it again below."
-msgstr "Puede modificarlo nuevamente abajo."
-
-#: contrib/admin/views/auth.py:30
-msgid "Add user"
-msgstr "Agregar usuario"
-
-#: contrib/admin/views/auth.py:57
-msgid "Password changed successfully."
-msgstr "Cambio de contrasea exitoso"
-
-#: contrib/admin/views/auth.py:64
-#, python-format
-msgid "Change password: %s"
-msgstr "Cambiar contrasea: %s"
-
-#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
-#: contrib/admin/views/doc.py:50
+#: contrib/admin/views/doc.py:47 contrib/admin/views/doc.py:49
+#: contrib/admin/views/doc.py:51
msgid "tag:"
msgstr "etiqueta:"
-#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
-#: contrib/admin/views/doc.py:81
+#: contrib/admin/views/doc.py:78 contrib/admin/views/doc.py:80
+#: contrib/admin/views/doc.py:82
msgid "filter:"
msgstr "filtrar:"
-#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
-#: contrib/admin/views/doc.py:139
+#: contrib/admin/views/doc.py:136 contrib/admin/views/doc.py:138
+#: contrib/admin/views/doc.py:140
msgid "view:"
msgstr "ver:"
-#: contrib/admin/views/doc.py:164
+#: contrib/admin/views/doc.py:165
#, python-format
msgid "App %r not found"
-msgstr "Aplicacin %r no encontrada"
+msgstr "Aplicación %r no encontrada"
-#: contrib/admin/views/doc.py:171
+#: contrib/admin/views/doc.py:172
#, python-format
msgid "Model %(name)r not found in app %(label)r"
-msgstr "Modelo %(name)r no encontrado en aplicacin %(label)r"
+msgstr "Modelo %(name)r no encontrado en aplicación %(label)r"
-#: contrib/admin/views/doc.py:183
+#: contrib/admin/views/doc.py:184
#, python-format
msgid "the related `%(label)s.%(type)s` object"
-msgstr "el objeto relacionado `%(label)s%(type)s`"
+msgstr "el objeto `%(label)s.%(type)s` relacionado"
-#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
-#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
+#: contrib/admin/views/doc.py:184 contrib/admin/views/doc.py:206
+#: contrib/admin/views/doc.py:220 contrib/admin/views/doc.py:225
msgid "model:"
msgstr "modelo:"
-#: contrib/admin/views/doc.py:214
+#: contrib/admin/views/doc.py:215
#, python-format
msgid "related `%(label)s.%(name)s` objects"
-msgstr "objetos relacionados `%(label)s.%(name)s`"
+msgstr "objetos `%(label)s.%(name)s` relacionados"
-#: contrib/admin/views/doc.py:219
+#: contrib/admin/views/doc.py:220
#, python-format
msgid "all %s"
-msgstr "todos %s"
+msgstr "todos los %s"
-#: contrib/admin/views/doc.py:224
+#: contrib/admin/views/doc.py:225
#, python-format
msgid "number of %s"
-msgstr "nmero de %s"
+msgstr "número de %s"
-#: contrib/admin/views/doc.py:229
+#: contrib/admin/views/doc.py:230
#, python-format
msgid "Fields on %s objects"
-msgstr "Campos en %s objetos"
+msgstr "Campos en objetos %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
+#: contrib/admin/views/doc.py:292 contrib/admin/views/doc.py:303
+#: contrib/admin/views/doc.py:305 contrib/admin/views/doc.py:311
+#: contrib/admin/views/doc.py:312 contrib/admin/views/doc.py:314
msgid "Integer"
msgstr "Entero"
-#: contrib/admin/views/doc.py:292
+#: contrib/admin/views/doc.py:293
msgid "Boolean (Either True or False)"
msgstr "Booleano (Verdadero o Falso)"
-#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
+#: contrib/admin/views/doc.py:294 contrib/admin/views/doc.py:313
#, python-format
msgid "String (up to %(maxlength)s)"
-msgstr "Cadena (mximo %(maxlength)s)"
+msgstr "Cadena (máximo %(maxlength)s)"
-#: contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295
msgid "Comma-separated integers"
msgstr "Enteros separados por comas"
-#: contrib/admin/views/doc.py:295
+#: contrib/admin/views/doc.py:296
msgid "Date (without time)"
msgstr "Fecha (sin hora)"
-#: contrib/admin/views/doc.py:296
+#: contrib/admin/views/doc.py:297
msgid "Date (with time)"
msgstr "Fecha (con hora)"
-#: contrib/admin/views/doc.py:297
+#: contrib/admin/views/doc.py:298
+msgid "Decimal number"
+msgstr "Número decimal"
+
+#: contrib/admin/views/doc.py:299
msgid "E-mail address"
-msgstr "Direccin de correo electrnico"
+msgstr "Dirección de correo electrónico"
-#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
-#: contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:300 contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:304
msgid "File path"
msgstr "Ruta de archivo"
-#: contrib/admin/views/doc.py:300
-msgid "Decimal number"
-msgstr "Nmero decimal"
-
-#: contrib/admin/views/doc.py:304 contrib/comments/models.py:85
-msgid "IP address"
-msgstr "Direccin IP"
+#: contrib/admin/views/doc.py:302
+msgid "Floating point number"
+msgstr "Número de punto flotante"
-#: contrib/admin/views/doc.py:306
+#: contrib/admin/views/doc.py:308
msgid "Boolean (Either True, False or None)"
msgstr "Booleano (Verdadero, Falso o Nulo)"
-#: contrib/admin/views/doc.py:307
+#: contrib/admin/views/doc.py:309
msgid "Relation to parent model"
-msgstr "Relacin con el modelo padre"
+msgstr "Relación con el modelo padre"
-#: contrib/admin/views/doc.py:308
+#: contrib/admin/views/doc.py:310
msgid "Phone number"
-msgstr "Nmero de telfono"
+msgstr "Número de teléfono"
-#: contrib/admin/views/doc.py:313
+#: contrib/admin/views/doc.py:315
msgid "Text"
msgstr "Texto"
-#: contrib/admin/views/doc.py:314
+#: contrib/admin/views/doc.py:316
msgid "Time"
msgstr "Hora"
-#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
+#: contrib/admin/views/doc.py:317 contrib/flatpages/models.py:7
msgid "URL"
msgstr "URL"
-#: contrib/admin/views/doc.py:316
+#: contrib/admin/views/doc.py:318
msgid "U.S. state (two uppercase letters)"
-msgstr "Estado de los EE.UU. (dos letras maysculas)"
+msgstr "Estado de los EE.UU. (dos letras mayúsculas)"
-#: contrib/admin/views/doc.py:317
+#: contrib/admin/views/doc.py:319
msgid "XML text"
msgstr "Texto XML"
-#: contrib/admin/views/doc.py:343
+#: contrib/admin/views/doc.py:345
#, python-format
msgid "%s does not appear to be a urlpattern object"
msgstr "%s no parece ser un objeto urlpattern"
-#: contrib/admin/views/main.py:223
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Identificarse"
+
+#: 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 ""
+"Por favor, identifíquese de nuevo porque su sesión ha caducado. No se "
+"preocupe: se ha guardado su envío."
+
+#: 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 ""
+"Parece que su navegador no está configurado para aceptar cookies. Actívelas "
+"por favor, recargue esta página, e inténtelo de nuevo."
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "Los nombres de usuario no pueden contener el carácter '@'."
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"Su dirección de correo no es su nombre de usuario. Intente nuevamente usando "
+"'%s'."
+
+#: contrib/admin/views/auth.py:20 contrib/admin/views/main.py:264
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Se agregó con éxito %(name)s \"%(obj)s\"."
+
+#: contrib/admin/views/auth.py:25 contrib/admin/views/main.py:268
+#: contrib/admin/views/main.py:354
+msgid "You may edit it again below."
+msgstr "Puede modificarlo nuevamente abajo."
+
+#: contrib/admin/views/auth.py:31
+msgid "Add user"
+msgstr "Agregar usuario"
+
+#: contrib/admin/views/auth.py:58
+msgid "Password changed successfully."
+msgstr "Cambio de contraseña exitoso"
+
+#: contrib/admin/views/auth.py:65
+#, python-format
+msgid "Change password: %s"
+msgstr "Cambiar contraseña: %s"
+
+#: contrib/admin/views/main.py:230
msgid "Site administration"
-msgstr "Sitio administrativo"
+msgstr "Administración de sitio"
-#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
+#: contrib/admin/views/main.py:278 contrib/admin/views/main.py:363
#, python-format
msgid "You may add another %s below."
msgstr "Puede agregar otro %s abajo."
-#: contrib/admin/views/main.py:289
+#: contrib/admin/views/main.py:296
#, python-format
msgid "Add %s"
msgstr "Agregar %s"
-#: contrib/admin/views/main.py:335
+#: contrib/admin/views/main.py:342
#, python-format
msgid "Added %s."
msgstr "Agregado %s."
-#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337
-#: contrib/admin/views/main.py:339 db/models/manipulators.py:308
-msgid "and"
-msgstr "y"
-
-#: contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:344
#, python-format
msgid "Changed %s."
msgstr "Modifica %s."
-#: contrib/admin/views/main.py:339
+#: contrib/admin/views/main.py:346
#, python-format
msgid "Deleted %s."
msgstr "Elimina %s."
-#: contrib/admin/views/main.py:342
+#: contrib/admin/views/main.py:349
msgid "No fields changed."
-msgstr "No ha modificado ningn campo."
+msgstr "No ha modificado ningún campo."
-#: contrib/admin/views/main.py:345
+#: contrib/admin/views/main.py:352
#, python-format
msgid "The %(name)s \"%(obj)s\" was changed successfully."
-msgstr "Se modific con xito %(name)s \"%(obj)s\"."
+msgstr "Se modificó con éxito %(name)s \"%(obj)s\"."
-#: contrib/admin/views/main.py:353
+#: contrib/admin/views/main.py:360
#, python-format
msgid ""
"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
msgstr ""
-"Se agreg con xito %(name)s \"%(obj)s\". Puede modificarlo nuevamente abajo."
+"Se agregó con éxito %(name)s \"%(obj)s\". Puede modificarlo nuevamente abajo."
-#: contrib/admin/views/main.py:391
+#: contrib/admin/views/main.py:398
#, python-format
msgid "Change %s"
msgstr "Modificar %s"
-#: contrib/admin/views/main.py:476
+#: contrib/admin/views/main.py:483
#, python-format
msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
-msgstr "Uno o ms %(fieldname)s en %(name)s: %(obj)s"
+msgstr "Uno o más %(fieldname)s en %(name)s: %(obj)s"
-#: contrib/admin/views/main.py:481
+#: contrib/admin/views/main.py:488
#, python-format
msgid "One or more %(fieldname)s in %(name)s:"
-msgstr "Uno o ms %(fieldname)s en %(name)s:"
+msgstr "Uno o más %(fieldname)s en %(name)s:"
-#: contrib/admin/views/main.py:514
+#: contrib/admin/views/main.py:520
#, python-format
msgid "The %(name)s \"%(obj)s\" was deleted successfully."
-msgstr "Se elimin con xito %(name)s \"%(obj)s\"."
+msgstr "Se eliminó con éxito %(name)s \"%(obj)s\"."
-#: contrib/admin/views/main.py:517
+#: contrib/admin/views/main.py:523
msgid "Are you sure?"
-msgstr "Est seguro?"
+msgstr "¿Está seguro?"
-#: contrib/admin/views/main.py:539
+#: contrib/admin/views/main.py:545
#, python-format
msgid "Change history: %s"
msgstr "Historia de modificaciones: %s"
-#: contrib/admin/views/main.py:573
+#: contrib/admin/views/main.py:579
#, python-format
msgid "Select %s"
msgstr "Seleccione %s"
-#: contrib/admin/views/main.py:573
+#: contrib/admin/views/main.py:579
#, python-format
msgid "Select %s to change"
msgstr "Seleccione %s a modificar"
-#: contrib/admin/views/main.py:768
+#: contrib/admin/views/main.py:780
msgid "Database error"
msgstr "Error de base de datos"
-#: contrib/admin/templatetags/admin_list.py:247
-msgid "All dates"
-msgstr "Todas las fechas"
-
-#: contrib/admin/templates/widget/date_time.html:3
-msgid "Date:"
-msgstr "Fecha:"
-
-#: contrib/admin/templates/widget/date_time.html:4
-msgid "Time:"
-msgstr "Hora:"
-
-#: contrib/admin/templates/widget/file.html:2
-msgid "Currently:"
-msgstr "Actualmente"
-
-#: contrib/admin/templates/widget/file.html:3
-msgid "Change:"
-msgstr "Modificar:"
-
-#: contrib/admin/templates/admin/index.html:17
-#, python-format
-msgid "Models available in the %(name)s application."
-msgstr "Modelos disponibles en la aplicacin %(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"
-msgstr "Agregar"
-
-#: contrib/admin/templates/admin/index.html:34
-msgid "Change"
-msgstr "Modificar"
-
-#: contrib/admin/templates/admin/index.html:44
-msgid "You don't have permission to edit anything."
-msgstr "No tiene permiso para editar nada."
-
-#: contrib/admin/templates/admin/index.html:52
-msgid "Recent Actions"
-msgstr "Acciones recientes"
-
-#: contrib/admin/templates/admin/index.html:53
-msgid "My Actions"
-msgstr "Mis acciones"
-
-#: contrib/admin/templates/admin/index.html:57
-msgid "None available"
-msgstr "Ninguna disponible"
-
-#: contrib/admin/templates/admin/filters.html:4
-msgid "Filter"
-msgstr "Filtrar"
-
-#: contrib/admin/templates/admin/search_form.html:8
-msgid "Go"
-msgstr "Buscar"
-
-#: contrib/admin/templates/admin/search_form.html:10
-#, python-format
-msgid "1 result"
-msgid_plural "%(counter)s results"
-msgstr[0] "un resultado"
-msgstr[1] "%(counter)s resultados"
-
-#: contrib/admin/templates/admin/search_form.html:10
-#, python-format
-msgid "%(full_result_count)s total"
-msgstr "total: %(full_result_count)s"
-
-#: contrib/admin/templates/admin/filter.html:2
-#, python-format
-msgid " By %(filter_title)s "
-msgstr " Por %(filter_title)s "
-
-#: contrib/admin/templates/admin/pagination.html:10
-msgid "Show all"
-msgstr "Mostrar todos/as"
-
-#: contrib/admin/templates/admin/change_form.html:10
#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:25
#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/auth/user/change_password.html:9
-#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
msgid "Documentation"
-msgstr "Documentacin"
+msgstr "Documentación"
-#: contrib/admin/templates/admin/change_form.html:10
#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:25
#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/admin/auth/user/change_password.html:15
#: contrib/admin/templates/admin/auth/user/change_password.html:46
-#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/index.html:4
-#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
#: contrib/admin/templates/admin_doc/missing_docutils.html:4
#: contrib/admin/templates/admin_doc/model_index.html:5
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/model_detail.html:3
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
#: contrib/admin/templates/admin_doc/view_index.html:5
-#: contrib/admin/templates/admin_doc/template_detail.html:4
#: contrib/admin/templates/admin_doc/template_tag_index.html:5
-msgid "Change password"
-msgstr "Cambiar contrasea"
-
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:25
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/auth/user/change_password.html:9
-#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/missing_docutils.html:4
-#: contrib/admin/templates/admin_doc/model_index.html:5
#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/model_detail.html:3
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
-#: contrib/admin/templates/admin_doc/view_index.html:5
#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
-#: contrib/comments/templates/comments/form.html:6
-msgid "Log out"
-msgstr "Cerrar sesin"
+msgid "Change password"
+msgstr "Cambiar contraseña"
-#: contrib/admin/templates/admin/change_form.html:13
#: contrib/admin/templates/admin/change_list.html:6
-#: contrib/admin/templates/admin/base.html:30
#: contrib/admin/templates/admin/object_history.html:5
#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/base.html:30
#: contrib/admin/templates/admin/delete_confirmation.html:6
#: contrib/admin/templates/admin/invalid_setup.html:4
#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_reset_form.html:4
-#: contrib/admin/templates/registration/password_reset_done.html:4
-#: contrib/admin/templates/registration/password_change_form.html:4
-#: contrib/admin/templates/registration/logged_out.html:4
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
msgid "Home"
msgstr "Inicio"
-#: contrib/admin/templates/admin/change_form.html:21
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Agregar %(name)s"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Página no encontrada"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Lo sentimos, pero no se encuentra la página solicitada."
+
#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:21
msgid "History"
msgstr "Historia"
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Fecha/hora"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Usuario"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Acción"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j M Y P"
+
+#: 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 ""
+"Este objeto no tiene historia de modificaciones. Probablemente no fué "
+"añadido usando este sitio de administración."
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Error del servidor"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Error del servidor (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Error de servidor <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Ha ocurrido un error. Se ha informado a los administradores del sitio "
+"mediante correo electrónico y debería ser solucionado en breve. Gracias por "
+"su paciencia."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Sitio de administración de Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administración de Django"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Por %(filter_title)s "
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modelos disponibles en la aplicación %(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"
+msgstr "Agregar"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Modificar"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "No tiene permiso para editar nada."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Acciones recientes"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Mis acciones"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Ninguna disponible"
+
#: contrib/admin/templates/admin/change_form.html:22
msgid "View on site"
msgstr "Ver en el sitio"
@@ -1101,44 +1659,15 @@ msgstr[1] "Por favor, corrija los siguientes errores."
#: contrib/admin/templates/admin/change_form.html:50
msgid "Ordering"
-msgstr "Ordenacin"
+msgstr "Ordenación"
#: contrib/admin/templates/admin/change_form.html:53
msgid "Order:"
msgstr "Orden:"
-#: contrib/admin/templates/admin/404.html:4
-#: contrib/admin/templates/admin/404.html:8
-msgid "Page not found"
-msgstr "Pgina no encontrada"
-
-#: contrib/admin/templates/admin/404.html:10
-msgid "We're sorry, but the requested page could not be found."
-msgstr "Lo sentimos, pero no se encuentra la pgina solicitada."
-
-#: contrib/admin/templates/admin/base_site.html:4
-msgid "Django site admin"
-msgstr "Sitio de administracin de Django"
-
-#: contrib/admin/templates/admin/base_site.html:7
-msgid "Django administration"
-msgstr "Administracin de Django"
-
-#: contrib/admin/templates/admin/change_list.html:12
-#, python-format
-msgid "Add %(name)s"
-msgstr "Agregar %(name)s"
-
-#: contrib/admin/templates/admin/login.html:17
-#: contrib/comments/templates/comments/form.html:6
-#: contrib/comments/templates/comments/form.html:8
-msgid "Username:"
-msgstr "Usuario:"
-
-#: contrib/admin/templates/admin/login.html:20
-#: contrib/comments/templates/comments/form.html:8
-msgid "Password:"
-msgstr "Contrasea:"
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Mostrar todos/as"
#: contrib/admin/templates/admin/base.html:25
msgid "Welcome,"
@@ -1155,7 +1684,7 @@ msgstr "Grabar como nuevo"
#: contrib/admin/templates/admin/submit_line.html:5
msgid "Save and add another"
-msgstr "Grabar y aadir otro"
+msgstr "Grabar y añadir otro"
#: contrib/admin/templates/admin/submit_line.html:6
msgid "Save and continue editing"
@@ -1165,50 +1694,25 @@ msgstr "Grabar y continuar editando"
msgid "Save"
msgstr "Grabar"
-#: contrib/admin/templates/admin/object_history.html:18
-msgid "Date/time"
-msgstr "Fecha/hora"
-
-#: contrib/admin/templates/admin/object_history.html:19
-msgid "User"
-msgstr "Usuario"
-
-#: contrib/admin/templates/admin/object_history.html:20
-msgid "Action"
-msgstr "Accin"
-
-#: contrib/admin/templates/admin/object_history.html:26
-msgid "DATE_WITH_TIME_FULL"
-msgstr "j M Y P"
-
-#: 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 ""
-"Este objeto no tiene historia de modificaciones. Probablemente no fu "
-"aadido usando este sitio de administracin."
-
-#: contrib/admin/templates/admin/500.html:4
-msgid "Server error"
-msgstr "Error del servidor"
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Buscar"
-#: contrib/admin/templates/admin/500.html:6
-msgid "Server error (500)"
-msgstr "Error del servidor (500)"
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "un resultado"
+msgstr[1] "%(counter)s resultados"
-#: contrib/admin/templates/admin/500.html:9
-msgid "Server Error <em>(500)</em>"
-msgstr "Error de servidor <em>(500)</em>"
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "total: %(full_result_count)s"
-#: 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 ""
-"Ha ocurrido un error. Se ha informado a los administradores del sitio "
-"mediante correo electrnico y debera ser solucionado en breve. Gracias por "
-"su paciencia."
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filtrar"
#: contrib/admin/templates/admin/delete_confirmation.html:14
#, python-format
@@ -1217,7 +1721,7 @@ msgid ""
"related objects, but your account doesn't have permission to delete the "
"following types of objects:"
msgstr ""
-"Eliminar el %(object_name)s '%(escaped_object)s' provocara la eliminacin "
+"Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación "
"de objetos relacionados, pero su cuenta no tiene permiso para eliminar los "
"siguientes tipos de objetos:"
@@ -1227,12 +1731,12 @@ 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 ""
-"Est seguro de que quiere eliminar los %(object_name)s \"%(escaped_object)s"
-"\"? Se eliminarn los siguientes objetos relacionados:"
+"¿Está seguro de que quiere eliminar los %(object_name)s \"%(escaped_object)s"
+"\"? Se eliminarán los siguientes objetos relacionados:"
#: contrib/admin/templates/admin/delete_confirmation.html:26
msgid "Yes, I'm sure"
-msgstr "S, estoy seguro"
+msgstr "Sí, estoy seguro"
#: contrib/admin/templates/admin/invalid_setup.html:8
msgid ""
@@ -1240,125 +1744,124 @@ msgid ""
"database tables have been created, and make sure the database is readable by "
"the appropriate user."
msgstr ""
-"Hay algn problema con su instalacin de base de datos. Asegrese de que las "
-"tablas de la misma hayan sido creadas, y asegrese de que el usuario "
+"Hay algún problema con su instalación de base de datos. Asegúrese de que las "
+"tablas de la misma hayan sido creadas, y asegúrese de que el usuario "
"apropiado tenga permisos de lectura en la base de datos."
#: contrib/admin/templates/admin/auth/user/change_password.html:28
#, python-format
msgid "Enter a new password for the user <strong>%(username)s</strong>."
msgstr ""
-"Introduzca una nueva contrasea para el usuario <strong>%(username)s</"
+"Introduzca una nueva contraseña para el usuario <strong>%(username)s</"
"strong>."
#: contrib/admin/templates/admin/auth/user/change_password.html:34
#: contrib/admin/templates/admin/auth/user/add_form.html:18
msgid "Password"
-msgstr "Contrasea:"
+msgstr "Contraseña:"
#: contrib/admin/templates/admin/auth/user/change_password.html:39
#: contrib/admin/templates/admin/auth/user/add_form.html:23
msgid "Password (again)"
-msgstr "Contrasea (de nuevo)"
+msgstr "Contraseña (de nuevo)"
#: contrib/admin/templates/admin/auth/user/change_password.html:40
#: contrib/admin/templates/admin/auth/user/add_form.html:24
msgid "Enter the same password as above, for verification."
-msgstr "Para verificacin, introduzca la misma contrasea que ingres arriba."
+msgstr "Para verificación, introduzca la misma contraseña que ingresó arriba."
#: contrib/admin/templates/admin/auth/user/add_form.html:6
msgid ""
"First, enter a username and password. Then, you'll be able to edit more user "
"options."
msgstr ""
-"Primero, introduzca un nombre de usuario y una contrasea. Luego podr "
+"Primero, introduzca un nombre de usuario y una contraseña. Luego podrá "
"configurar opciones adicionales."
#: contrib/admin/templates/admin/auth/user/add_form.html:12
msgid "Username"
msgstr "Nombre de usuario:"
-#: 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 "Cambio de contrasea"
-
-#: contrib/admin/templates/registration/password_change_done.html:6
-#: contrib/admin/templates/registration/password_change_done.html:10
-msgid "Password change successful"
-msgstr "Cambio de contrasea exitoso"
-
-#: contrib/admin/templates/registration/password_change_done.html:12
-msgid "Your password was changed."
-msgstr "Su contrasea ha sido cambiada."
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Actualmente"
-#: 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 "Recuperar contrasea"
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Modificar:"
-#: 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 ""
-"Ha olvidado su contrasea? Introduzca su direccin de correo electrnico, y "
-"crearemos una nueva que le enviaremos por correo."
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Fecha:"
-#: contrib/admin/templates/registration/password_reset_form.html:16
-msgid "E-mail address:"
-msgstr "Direccin de correo electrnico:"
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Hora:"
-#: contrib/admin/templates/registration/password_reset_form.html:16
-msgid "Reset my password"
-msgstr "Recuperar mi contrasea"
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Gracias por el tiempo que ha dedicado al sitio web hoy."
-#: contrib/admin/templates/registration/password_reset_done.html:6
-#: contrib/admin/templates/registration/password_reset_done.html:10
-msgid "Password reset successful"
-msgstr "Recuperacin de contrasea exitosa"
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Identificarse de nuevo"
-#: 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 ""
-"Le hemos enviado una nueva contrasea a la direccin que ha suministrado. "
-"Debera recibirla en breve."
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:4
+msgid "Password change"
+msgstr "Cambio de contraseña"
#: 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 ""
-"Por favor, por razones de seguridad, introduzca su contrasea antigua, y "
-"luego introduzca la nueva contrasea dos veces para verificar que la ha "
+"Por favor, por razones de seguridad, introduzca su contraseña antigua, y "
+"luego introduzca la nueva contraseña dos veces para verificar que la ha "
"escrito correctamente."
#: contrib/admin/templates/registration/password_change_form.html:17
msgid "Old password:"
-msgstr "Contrasea antigua:"
+msgstr "Contraseña antigua:"
#: contrib/admin/templates/registration/password_change_form.html:19
msgid "New password:"
-msgstr "Contrasea nueva:"
+msgstr "Contraseña nueva:"
#: contrib/admin/templates/registration/password_change_form.html:21
msgid "Confirm password:"
-msgstr "Confirme contrasea:"
+msgstr "Confirme contraseña:"
#: contrib/admin/templates/registration/password_change_form.html:23
msgid "Change my password"
-msgstr "Cambiar mi contrasea"
+msgstr "Cambiar mi contraseña"
+
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Recuperar contraseña"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Recuperación de contraseña exitosa"
+
+#: 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 ""
+"Le hemos enviado una nueva contraseña a la dirección que ha suministrado. "
+"Debería recibirla en breve."
#: contrib/admin/templates/registration/password_reset_email.html:2
msgid "You're receiving this e-mail because you requested a password reset"
msgstr ""
-"Est recibiendo este mensaje debido a que solicit recuperar la contrasea"
+"Está recibiendo este mensaje debido a que solicitó recuperar la contraseña"
#: contrib/admin/templates/registration/password_reset_email.html:3
#, python-format
@@ -1368,11 +1871,11 @@ msgstr "de su cuenta de usuario en %(site_name)s."
#: contrib/admin/templates/registration/password_reset_email.html:5
#, python-format
msgid "Your new password is: %(new_password)s"
-msgstr "Su nueva contrasea es: %(new_password)s"
+msgstr "Su nueva contraseña es: %(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 "Puede cambiarla accediendo a esta pgina:"
+msgstr "Puede cambiarla accediendo a esta página:"
#: contrib/admin/templates/registration/password_reset_email.html:11
msgid "Your username, in case you've forgotten:"
@@ -1380,20 +1883,37 @@ msgstr "Su nombre de usuario, en caso de haberlo olvidado:"
#: contrib/admin/templates/registration/password_reset_email.html:13
msgid "Thanks for using our site!"
-msgstr "Gracias por usar nuestro sitio!"
+msgstr "¡Gracias por usar nuestro sitio!"
#: contrib/admin/templates/registration/password_reset_email.html:15
#, python-format
msgid "The %(site_name)s team"
msgstr "El equipo de %(site_name)s"
-#: contrib/admin/templates/registration/logged_out.html:8
-msgid "Thanks for spending some quality time with the Web site today."
-msgstr "Gracias por el tiempo que ha dedicado al sitio web hoy."
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Cambio de contraseña exitoso"
-#: contrib/admin/templates/registration/logged_out.html:10
-msgid "Log in again"
-msgstr "Identificarse de nuevo"
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Su contraseña ha sido cambiada."
+
+#: 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 ""
+"¿Ha olvidado su contraseña? Introduzca su dirección de correo electrónico, y "
+"crearemos una nueva que le enviaremos por correo."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Dirección de correo electrónico:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Recuperar mi contraseña"
#: contrib/admin/templates/admin_doc/bookmarklets.html:3
msgid "Bookmarklets"
@@ -1401,7 +1921,7 @@ msgstr "Bookmarklets"
#: contrib/admin/templates/admin_doc/bookmarklets.html:5
msgid "Documentation bookmarklets"
-msgstr "Bookmarklets de documentacin"
+msgstr "Bookmarklets de documentación"
#: contrib/admin/templates/admin_doc/bookmarklets.html:9
msgid ""
@@ -1415,24 +1935,24 @@ msgid ""
msgstr ""
"\n"
"<p class=\"help\">Para instalar bookmarklets, arrastre el enlace a su barra\n"
-"de favoritos, o pulse con el botn derecho el enlace y adalo a sus "
+"de favoritos, o pulse con el botón derecho el enlace y añádalo a sus "
"favoritos.\n"
-"Ahora puede seleccionar el bookmarklet desde cualquier pgina en el sitio.\n"
-"Tenga en cuenta que algunos de estos bookmarklets precisan que est viendo\n"
-"el sitio desde un equipo sealado como \"interno\" (hable\n"
-"con su administrador de sistemas si no est seguro de si el suyo lo es).</"
+"Ahora puede seleccionar el bookmarklet desde cualquier página en el sitio.\n"
+"Tenga en cuenta que algunos de estos bookmarklets precisan que esté viendo\n"
+"el sitio desde un equipo señalado como \"interno\" (hable\n"
+"con su administrador de sistemas si no está seguro de si el suyo lo es).</"
"p>\n"
#: contrib/admin/templates/admin_doc/bookmarklets.html:19
msgid "Documentation for this page"
-msgstr "Documentacin de esta pgina"
+msgstr "Documentación de esta página"
#: 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 ""
-"Le lleva desde cualquier pgina a la documentacin de la vista que la genera."
+"Le lleva desde cualquier página a la documentación de la vista que la genera."
#: contrib/admin/templates/admin_doc/bookmarklets.html:22
msgid "Show object ID"
@@ -1443,8 +1963,8 @@ msgid ""
"Shows the content-type and unique ID for pages that represent a single "
"object."
msgstr ""
-"Muestra el tipo de contenido e ID unvoco de las pginas que representan un "
-"nico objeto."
+"Muestra el tipo de contenido e ID unívoco de las páginas que representan un "
+"único objeto."
#: contrib/admin/templates/admin_doc/bookmarklets.html:25
msgid "Edit this object (current window)"
@@ -1453,7 +1973,7 @@ msgstr "Editar este objeto (ventana actual)"
#: contrib/admin/templates/admin_doc/bookmarklets.html:26
msgid "Jumps to the admin page for pages that represent a single object."
msgstr ""
-"Le lleva a la pgina de administracin de pginas que representan un nico "
+"Le lleva a la página de administración de páginas que representan un único "
"objeto."
#: contrib/admin/templates/admin_doc/bookmarklets.html:28
@@ -1463,110 +1983,273 @@ msgstr "Editar este objeto (nueva ventana)"
#: contrib/admin/templates/admin_doc/bookmarklets.html:29
msgid "As above, but opens the admin page in a new window."
msgstr ""
-"Como antes, pero abre la pgina de administracin en una nueva ventana."
+"Como antes, pero abre la página de administración en una nueva ventana."
-#: contrib/sites/models.py:10
-msgid "domain name"
-msgstr "nombre de dominio"
+#: contrib/admin/templatetags/admin_list.py:254
+msgid "All dates"
+msgstr "Todas las fechas"
-#: contrib/sites/models.py:11
-msgid "display name"
-msgstr "nombre para visualizar"
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+"Introduzca un número de identificación islandés válido. El formato es XXXXXX-"
+"XXXX."
-#: contrib/sites/models.py:15
-msgid "site"
-msgstr "sitio"
+#: contrib/localflavor/is_/forms.py:31
+msgid "The Icelandic identification number is not valid."
+msgstr "El número de identificación islandés no es válido."
-#: contrib/sites/models.py:16
-msgid "sites"
-msgstr "sitios"
+#: contrib/localflavor/fi/forms.py:14 contrib/localflavor/de/forms.py:16
+#: contrib/localflavor/fr/forms.py:17
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Introduzca un zip code en formato XXXXX."
-#: contrib/sessions/models.py:68
-msgid "session key"
-msgstr "clave de sesin"
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
+msgid "Enter a valid Finnish social security number."
+msgstr "Introduzca un número de seguridad social finlandés válido."
-#: contrib/sessions/models.py:69
-msgid "session data"
-msgstr "datos de sesin"
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Introduzca un zip code en formato XXXXX-XXX."
-#: contrib/sessions/models.py:70
-msgid "expire date"
-msgstr "fecha de caducidad"
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Los números telefónicos deben respetar el formato XX-XXXX-XXXX."
-#: contrib/sessions/models.py:74
-msgid "session"
-msgstr "sesin"
+#: contrib/localflavor/br/forms.py:72
+msgid "This field requires only numbers."
+msgstr "Este campo permite sólo valores numéricos."
-#: contrib/sessions/models.py:75
-msgid "sessions"
-msgstr "sesiones"
+#: contrib/localflavor/br/forms.py:74
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Este campo requiere como máximo 11 dígitos o 14 caracteres."
-#: contrib/contenttypes/models.py:36
-msgid "python model class name"
-msgstr "nombre de la clase python del modelo"
+#: contrib/localflavor/br/forms.py:84
+msgid "Invalid CPF number."
+msgstr "Número CPF inválido."
-#: contrib/contenttypes/models.py:39
-msgid "content type"
-msgstr "tipo de contenido"
+#: contrib/localflavor/br/forms.py:106
+msgid "This field requires at least 14 digits"
+msgstr "Este campo requiere al menos 14 dígitos."
-#: contrib/contenttypes/models.py:40
-msgid "content types"
-msgstr "tipos de contenido"
+#: contrib/localflavor/br/forms.py:116
+msgid "Invalid CNPJ number."
+msgstr "Número CNPJ inválido."
-#: contrib/flatpages/models.py:8
+#: contrib/localflavor/it/forms.py:16
+msgid "Enter a valid zip code."
+msgstr "Introduzca un zip code válido."
+
+#: contrib/localflavor/it/forms.py:41
+msgid "Enter a valid Social Security number."
+msgstr "Introduzca un número de Seguridad Social válido."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Introduzca un número VAT válido."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "Baden-Wuerttemberg"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Bavaria"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berlin"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandenburg"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Bremen"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hamburg"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Hessen"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Mecklenburg-Western Pomerania"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Lower Saxony"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "North Rhine-Westphalia"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Rhineland-Palatinate"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "Saarland"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Saxony"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Saxony-Anhalt"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "Schleswig-Holstein"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "Thuringia"
+
+#: contrib/localflavor/de/forms.py:60
msgid ""
-"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
msgstr ""
-"Ejemplo: '/about/contact/'. Asegrese de que pone barras al principio y al "
-"final."
+"Introduzca un número de tarjeta de identidad alemán válido en formato "
+"XXXXXXXXXXX-XXXXXXX-XXXXXXX-X."
-#: contrib/flatpages/models.py:9
-msgid "title"
-msgstr "ttulo"
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr ""
+"Introduzca un postcode. Se requiere un espacio entre las dos secciones del "
+"mismo."
-#: contrib/flatpages/models.py:10
-msgid "content"
-msgstr "contenido"
+#: contrib/localflavor/cl/forms.py:32
+msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Introduzca un RUT chileno válido. EL formato es XX.XXX.XXX-X."
-#: contrib/flatpages/models.py:11
-msgid "enable comments"
-msgstr "activar comentarios"
+#: contrib/localflavor/cl/forms.py:37
+msgid "Enter valid a Chilean RUT"
+msgstr "Introduzca un RUT chileno válido."
-#: contrib/flatpages/models.py:12
-msgid "template name"
-msgstr "nombre de plantilla"
+#: contrib/localflavor/ch/forms.py:18 contrib/localflavor/no/forms.py:14
+msgid "Enter a zip code in the format XXXX."
+msgstr "Introduzca un zip code en formato XXX."
-#: contrib/flatpages/models.py:13
+#: contrib/localflavor/ch/forms.py:90
msgid ""
-"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
-"will use 'flatpages/default.html'."
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
msgstr ""
-"Ejemplo: 'flatpages/contact_page.html'. Si no lo proporciona, el sistema "
-"usar 'flatpages/default.html'."
+"Introduzca un número válido de tarjeta de identidad o pasaporte Suizos en "
+"formato X1234567<0 o 1234567890."
-#: contrib/flatpages/models.py:14
-msgid "registration required"
-msgstr "debe estar registrado"
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Aargau"
-#: contrib/flatpages/models.py:14
-msgid "If this is checked, only logged-in users will be able to view the page."
-msgstr "Si est marcado, slo los usuarios registrados podrn ver la pgina."
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Innerrhoden"
-#: contrib/flatpages/models.py:18
-msgid "flat page"
-msgstr "pgina esttica"
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Ausserrhoden"
-#: contrib/flatpages/models.py:19
-msgid "flat pages"
-msgstr "pginas estticas"
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Basel-Stadt"
-#: contrib/localflavor/no/forms.py:15 contrib/localflavor/ch/forms.py:18
-msgid "Enter a zip code in the format XXXX."
-msgstr "Introduzca un zip code en formato XXX."
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "Basel-Land"
-#: contrib/localflavor/no/forms.py:36
-msgid "Enter a valid Norwegian social security number."
-msgstr "Introduzca un nmero de seguridad social Noruego vlido."
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "Berne"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "Fribourg"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Geneva"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "Glarus"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "Graubuenden"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "Jura"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "Lucerne"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchatel"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwalden"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwalden"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Schaffhausen"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "Schwyz"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "Solothurn"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "St. Gallen"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Thurgau"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "Ticino"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "Zug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "Zurich"
#: contrib/localflavor/us/forms.py:18
msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
@@ -1574,779 +2257,308 @@ msgstr "Introduzca un zip code en el formato XXXXX o XXXXX-XXXX."
#: contrib/localflavor/us/forms.py:51
msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
-msgstr "Introduzca un Nmero de Seguridad Social en formato XXX-XX-XXXX."
+msgstr "Introduzca un Número de Seguridad Social en formato XXX-XX-XXXX."
+
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr "Introduzca un post code de 4 dígitos."
#: contrib/localflavor/jp/jp_prefectures.py:4
msgid "Hokkaido"
-msgstr ""
+msgstr "Hokkaido"
#: contrib/localflavor/jp/jp_prefectures.py:5
msgid "Aomori"
-msgstr ""
+msgstr "Aomori"
#: contrib/localflavor/jp/jp_prefectures.py:6
msgid "Iwate"
-msgstr ""
+msgstr "Iwate"
#: contrib/localflavor/jp/jp_prefectures.py:7
msgid "Miyagi"
-msgstr ""
+msgstr "Miyagi"
#: contrib/localflavor/jp/jp_prefectures.py:8
msgid "Akita"
-msgstr ""
+msgstr "Akita"
#: contrib/localflavor/jp/jp_prefectures.py:9
msgid "Yamagata"
-msgstr ""
+msgstr "Yamagata"
#: contrib/localflavor/jp/jp_prefectures.py:10
msgid "Fukushima"
-msgstr ""
+msgstr "Fukushima"
#: contrib/localflavor/jp/jp_prefectures.py:11
msgid "Ibaraki"
-msgstr ""
+msgstr "Ibaraki"
#: contrib/localflavor/jp/jp_prefectures.py:12
msgid "Tochigi"
-msgstr ""
+msgstr "Tochigi"
#: contrib/localflavor/jp/jp_prefectures.py:13
msgid "Gunma"
-msgstr ""
+msgstr "Gunma"
#: contrib/localflavor/jp/jp_prefectures.py:14
msgid "Saitama"
-msgstr ""
+msgstr "Saitama"
#: contrib/localflavor/jp/jp_prefectures.py:15
msgid "Chiba"
-msgstr ""
+msgstr "Chiba"
#: contrib/localflavor/jp/jp_prefectures.py:16
msgid "Tokyo"
-msgstr ""
+msgstr "Tokyo"
#: contrib/localflavor/jp/jp_prefectures.py:17
msgid "Kanagawa"
-msgstr ""
+msgstr "Kanagawa"
#: contrib/localflavor/jp/jp_prefectures.py:18
msgid "Yamanashi"
-msgstr ""
+msgstr "Yamanashi"
#: contrib/localflavor/jp/jp_prefectures.py:19
msgid "Nagano"
-msgstr ""
+msgstr "Nagano"
#: contrib/localflavor/jp/jp_prefectures.py:20
msgid "Niigata"
-msgstr ""
+msgstr "Niigata"
#: contrib/localflavor/jp/jp_prefectures.py:21
msgid "Toyama"
-msgstr ""
+msgstr "Toyama"
#: contrib/localflavor/jp/jp_prefectures.py:22
msgid "Ishikawa"
-msgstr ""
+msgstr "Ishikawa"
#: contrib/localflavor/jp/jp_prefectures.py:23
msgid "Fukui"
-msgstr ""
+msgstr "Fukui"
#: contrib/localflavor/jp/jp_prefectures.py:24
msgid "Gifu"
-msgstr ""
+msgstr "Gifu"
#: contrib/localflavor/jp/jp_prefectures.py:25
msgid "Shizuoka"
-msgstr ""
+msgstr "Shizuoka"
#: contrib/localflavor/jp/jp_prefectures.py:26
msgid "Aichi"
-msgstr ""
+msgstr "Aichi"
#: contrib/localflavor/jp/jp_prefectures.py:27
msgid "Mie"
-msgstr ""
+msgstr "Mie"
#: contrib/localflavor/jp/jp_prefectures.py:28
msgid "Shiga"
-msgstr ""
+msgstr "Shiga"
#: contrib/localflavor/jp/jp_prefectures.py:29
msgid "Kyoto"
-msgstr ""
+msgstr "Kyoto"
#: contrib/localflavor/jp/jp_prefectures.py:30
msgid "Osaka"
-msgstr ""
+msgstr "Osaka"
#: contrib/localflavor/jp/jp_prefectures.py:31
msgid "Hyogo"
-msgstr ""
+msgstr "Hyogo"
#: contrib/localflavor/jp/jp_prefectures.py:32
msgid "Nara"
-msgstr ""
+msgstr "Nara"
#: contrib/localflavor/jp/jp_prefectures.py:33
msgid "Wakayama"
-msgstr ""
+msgstr "Wakayama"
#: contrib/localflavor/jp/jp_prefectures.py:34
msgid "Tottori"
-msgstr ""
+msgstr "Tottori"
#: contrib/localflavor/jp/jp_prefectures.py:35
msgid "Shimane"
-msgstr ""
+msgstr "Shimane"
#: contrib/localflavor/jp/jp_prefectures.py:36
msgid "Okayama"
-msgstr ""
+msgstr "Okayama"
#: contrib/localflavor/jp/jp_prefectures.py:37
msgid "Hiroshima"
-msgstr ""
+msgstr "Hiroshima"
#: contrib/localflavor/jp/jp_prefectures.py:38
msgid "Yamaguchi"
-msgstr ""
+msgstr "Yamaguchi"
#: contrib/localflavor/jp/jp_prefectures.py:39
msgid "Tokushima"
-msgstr ""
+msgstr "Tokushima"
#: contrib/localflavor/jp/jp_prefectures.py:40
msgid "Kagawa"
-msgstr ""
+msgstr "Kagawa"
#: contrib/localflavor/jp/jp_prefectures.py:41
msgid "Ehime"
-msgstr ""
+msgstr "Ehime"
#: contrib/localflavor/jp/jp_prefectures.py:42
msgid "Kochi"
-msgstr ""
+msgstr "Kochi"
#: contrib/localflavor/jp/jp_prefectures.py:43
msgid "Fukuoka"
-msgstr ""
+msgstr "Fukuoka"
#: contrib/localflavor/jp/jp_prefectures.py:44
msgid "Saga"
-msgstr ""
+msgstr "Saga"
#: contrib/localflavor/jp/jp_prefectures.py:45
msgid "Nagasaki"
-msgstr ""
+msgstr "Nagasaki"
#: contrib/localflavor/jp/jp_prefectures.py:46
msgid "Kumamoto"
-msgstr ""
+msgstr "Kumamoto"
#: contrib/localflavor/jp/jp_prefectures.py:47
msgid "Oita"
-msgstr ""
+msgstr "Oita"
#: contrib/localflavor/jp/jp_prefectures.py:48
msgid "Miyazaki"
-msgstr ""
+msgstr "Miyazaki"
#: contrib/localflavor/jp/jp_prefectures.py:49
msgid "Kagoshima"
-msgstr ""
+msgstr "Kagoshima"
#: contrib/localflavor/jp/jp_prefectures.py:50
msgid "Okinawa"
-msgstr ""
+msgstr "Okinawa"
#: contrib/localflavor/jp/forms.py:21
msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
-msgstr "Introduzca un cdigo postal en formato XXXXXX o XXX-XXXX."
-
-#: contrib/localflavor/ch/forms.py:90
-msgid ""
-"Enter a valid Swiss identity or passport card number in X1234567<0 or "
-"1234567890 format."
-msgstr ""
-"Introduzca un nmero vlido de tarjeta de identidad o pasaporte Suizos en "
-"formato X1234567<0 o 1234567890."
-
-#: contrib/localflavor/ch/ch_states.py:5
-msgid "Aargau"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:6
-msgid "Appenzell Innerrhoden"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:7
-msgid "Appenzell Ausserrhoden"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:8
-msgid "Basel-Stadt"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:9
-msgid "Basel-Land"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:10
-msgid "Berne"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:11
-msgid "Fribourg"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:12
-msgid "Geneva"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:13
-msgid "Glarus"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:14
-msgid "Graubuenden"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:15
-msgid "Jura"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:16
-msgid "Lucerne"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:17
-msgid "Neuchatel"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:18
-msgid "Nidwalden"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:19
-msgid "Obwalden"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:20
-msgid "Schaffhausen"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:21
-msgid "Schwyz"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:22
-msgid "Solothurn"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:23
-msgid "St. Gallen"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:24
-msgid "Thurgau"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:25
-msgid "Ticino"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:26
-msgid "Uri"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:27
-msgid "Valais"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:28
-msgid "Vaud"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:29
-msgid "Zug"
-msgstr ""
-
-#: contrib/localflavor/ch/ch_states.py:30
-msgid "Zurich"
-msgstr ""
-
-#: contrib/localflavor/fi/forms.py:14 contrib/localflavor/de/forms.py:16
-#: contrib/localflavor/fr/forms.py:17
-msgid "Enter a zip code in the format XXXXX."
-msgstr "Introduzca un zip code en formato XXXXX."
-
-#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
-msgid "Enter a valid Finnish social security number."
-msgstr "Introduzca un nmero de seguridad social finlands vlido."
-
-#: contrib/localflavor/au/forms.py:18
-msgid "Enter a 4 digit post code."
-msgstr "Introduzca un post code de 4 dgitos."
-
-#: contrib/localflavor/is_/forms.py:16
-msgid ""
-"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
-msgstr ""
-"Introduzca un nmero de identificacin islands vlido. El formato es XXXXXX-"
-"XXXX."
-
-#: contrib/localflavor/is_/forms.py:30
-msgid "The Icelandic identification number is not valid."
-msgstr "El nmero de identificacin islands no es vlido."
-
-#: contrib/localflavor/uk/forms.py:18
-msgid "Enter a postcode. A space is required between the two postcode parts."
-msgstr ""
-"Introduzca un postcode. Se requiere un espacio entre las dos secciones del "
-"mismo."
-
-#: contrib/localflavor/de/de_states.py:5
-msgid "Baden-Wuerttemberg"
-msgstr ""
-
-#: contrib/localflavor/de/de_states.py:6
-msgid "Bavaria"
-msgstr ""
+msgstr "Introduzca un código postal en formato XXXXXX o XXX-XXXX."
-#: contrib/localflavor/de/de_states.py:7
-msgid "Berlin"
-msgstr ""
-
-#: contrib/localflavor/de/de_states.py:8
-msgid "Brandenburg"
-msgstr ""
-
-#: contrib/localflavor/de/de_states.py:9
-msgid "Bremen"
-msgstr ""
-
-#: contrib/localflavor/de/de_states.py:10
-msgid "Hamburg"
-msgstr ""
-
-#: contrib/localflavor/de/de_states.py:11
-msgid "Hessen"
-msgstr ""
-
-#: contrib/localflavor/de/de_states.py:12
-msgid "Mecklenburg-Western Pomerania"
-msgstr ""
-
-#: contrib/localflavor/de/de_states.py:13
-msgid "Lower Saxony"
-msgstr ""
-
-#: contrib/localflavor/de/de_states.py:14
-msgid "North Rhine-Westphalia"
-msgstr ""
-
-#: contrib/localflavor/de/de_states.py:15
-msgid "Rhineland-Palatinate"
-msgstr ""
-
-#: contrib/localflavor/de/de_states.py:16
-msgid "Saarland"
-msgstr ""
-
-#: contrib/localflavor/de/de_states.py:17
-msgid "Saxony"
-msgstr ""
-
-#: contrib/localflavor/de/de_states.py:18
-msgid "Saxony-Anhalt"
-msgstr ""
-
-#: contrib/localflavor/de/de_states.py:19
-msgid "Schleswig-Holstein"
-msgstr ""
-
-#: contrib/localflavor/de/de_states.py:20
-msgid "Thuringia"
-msgstr ""
-
-#: contrib/localflavor/de/forms.py:60
-msgid ""
-"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
-"format."
-msgstr ""
-"Introduzca un nmero de tarjeta de identidad alemn vlido en formato "
-"XXXXXXXXXXX-XXXXXXX-XXXXXXX-X."
-
-#: contrib/localflavor/br/forms.py:18
-msgid "Enter a zip code in the format XXXXX-XXX."
-msgstr "Introduzca un zip code en formato XXXXX-XXX."
-
-#: contrib/localflavor/br/forms.py:30
-msgid "Phone numbers must be in XX-XXXX-XXXX format."
-msgstr "Los nmeros telefnicos deben respetar el formato XX-XXXX-XXXX."
-
-#: contrib/localflavor/br/forms.py:72
-msgid "This field requires only numbers."
-msgstr "Este campo permite slo valores numricos."
-
-#: contrib/localflavor/br/forms.py:74
-msgid "This field requires at most 11 digits or 14 characters."
-msgstr "Este campo requiere como mximo 11 dgitos o 14 caracteres."
-
-#: contrib/localflavor/br/forms.py:84
-msgid "Invalid CPF number."
-msgstr "Nmero CPF invlido."
-
-#: contrib/localflavor/br/forms.py:106
-msgid "This field requires at least 14 digits"
-msgstr "Este campo requiere al menos 14 dgitos."
-
-#: contrib/localflavor/br/forms.py:116
-msgid "Invalid CNPJ number."
-msgstr "Nmero CNPJ invlido."
-
-#: contrib/localflavor/cl/forms.py:21
-msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
-msgstr "Introduzca un RUT chileno vlido. EL formato es XX.XXX.XXX-X."
-
-#: contrib/localflavor/cl/forms.py:26
-msgid "Enter valid a Chilean RUT"
-msgstr "Introduzca un RUT chileno vlido."
-
-#: contrib/localflavor/it/forms.py:16
-msgid "Enter a valid zip code."
-msgstr "Introduzca un zip code vlido."
-
-#: contrib/localflavor/it/forms.py:41
-msgid "Enter a valid Social Security number."
-msgstr "Introduzca un nmero de Seguridad Social vlido."
-
-#: contrib/localflavor/it/forms.py:68
-msgid "Enter a valid VAT number."
-msgstr "Introduzca un nmero VAT vlido."
-
-#: contrib/comments/models.py:67 contrib/comments/models.py:166
-msgid "object ID"
-msgstr "ID de objeto"
-
-#: contrib/comments/models.py:68
-msgid "headline"
-msgstr "encabezado"
-
-#: contrib/comments/models.py:69 contrib/comments/models.py:90
-#: contrib/comments/models.py:167
-msgid "comment"
-msgstr "comentario"
-
-#: contrib/comments/models.py:70
-msgid "rating #1"
-msgstr "calificacin 1"
-
-#: contrib/comments/models.py:71
-msgid "rating #2"
-msgstr "calificacin 2"
-
-#: contrib/comments/models.py:72
-msgid "rating #3"
-msgstr "calificacin 3"
-
-#: contrib/comments/models.py:73
-msgid "rating #4"
-msgstr "calificacin 4"
-
-#: contrib/comments/models.py:74
-msgid "rating #5"
-msgstr "calificacin 5"
-
-#: contrib/comments/models.py:75
-msgid "rating #6"
-msgstr "calificacin 6"
-
-#: contrib/comments/models.py:76
-msgid "rating #7"
-msgstr "calificacin 7"
-
-#: contrib/comments/models.py:77
-msgid "rating #8"
-msgstr "calificacin 8"
-
-#: contrib/comments/models.py:82
-msgid "is valid rating"
-msgstr "es calificacin vlida"
-
-#: contrib/comments/models.py:83 contrib/comments/models.py:169
-msgid "date/time submitted"
-msgstr "fecha/hora de envo"
-
-#: contrib/comments/models.py:84 contrib/comments/models.py:170
-msgid "is public"
-msgstr "es pblico"
-
-#: contrib/comments/models.py:86
-msgid "is removed"
-msgstr "est eliminado"
-
-#: 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 ""
-"Marque esta caja si el comentario es inapropiado. En su lugar se mostrar "
-"\"Este comentario ha sido eliminado\"."
-
-#: contrib/comments/models.py:91
-msgid "comments"
-msgstr "comentarios"
-
-#: contrib/comments/models.py:131 contrib/comments/models.py:207
-msgid "Content object"
-msgstr "Objeto contenido"
-
-#: contrib/comments/models.py:159
-#, python-format
-msgid ""
-"Posted by %(user)s at %(date)s\n"
-"\n"
-"%(comment)s\n"
-"\n"
-"http://%(domain)s%(url)s"
-msgstr ""
-"Enviado por %(user)s el %(date)s\n"
-"\n"
-"%(comment)s\n"
-"\n"
-"http://%(domain)s%(url)s"
-
-#: contrib/comments/models.py:168
-msgid "person's name"
-msgstr "nombre de la persona"
-
-#: contrib/comments/models.py:171
-msgid "ip address"
-msgstr "direccin ip"
-
-#: contrib/comments/models.py:173
-msgid "approved by staff"
-msgstr "aprobado por el staff"
-
-#: contrib/comments/models.py:176
-msgid "free comment"
-msgstr "comentario libre"
-
-#: contrib/comments/models.py:177
-msgid "free comments"
-msgstr "comentarios libres"
-
-#: contrib/comments/models.py:233
-msgid "score"
-msgstr "puntuacin"
-
-#: contrib/comments/models.py:234
-msgid "score date"
-msgstr "fecha de la puntuacin"
+#: contrib/localflavor/no/forms.py:35
+msgid "Enter a valid Norwegian social security number."
+msgstr "Introduzca un número de seguridad social Noruego válido."
-#: contrib/comments/models.py:237
-msgid "karma score"
-msgstr "punto karma"
+#: contrib/contenttypes/models.py:37
+msgid "python model class name"
+msgstr "nombre de la clase python del modelo"
-#: contrib/comments/models.py:238
-msgid "karma scores"
-msgstr "puntos karma"
+#: contrib/contenttypes/models.py:40
+msgid "content type"
+msgstr "tipo de contenido"
-#: contrib/comments/models.py:242
-#, python-format
-msgid "%(score)d rating by %(user)s"
-msgstr "puntuado %(score)d por %(user)s"
+#: contrib/contenttypes/models.py:41
+msgid "content types"
+msgstr "tipos de contenido"
-#: contrib/comments/models.py:258
-#, python-format
+#: contrib/flatpages/models.py:8
msgid ""
-"This comment was flagged by %(user)s:\n"
-"\n"
-"%(text)s"
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
msgstr ""
-"Este comentario fue marcado por %(user)s:\n"
-"\n"
-"%(text)s"
-
-#: contrib/comments/models.py:265
-msgid "flag date"
-msgstr "fecha de la marca"
-
-#: contrib/comments/models.py:268
-msgid "user flag"
-msgstr "marca de usuario"
-
-#: contrib/comments/models.py:269
-msgid "user flags"
-msgstr "marcas de usuario"
-
-#: contrib/comments/models.py:273
-#, python-format
-msgid "Flag by %r"
-msgstr "Marca de %r"
-
-#: contrib/comments/models.py:278
-msgid "deletion date"
-msgstr "fecha de eliminacin"
-
-#: contrib/comments/models.py:280
-msgid "moderator deletion"
-msgstr "Eliminacin por moderador"
-
-#: contrib/comments/models.py:281
-msgid "moderator deletions"
-msgstr "eliminaciones por moderador"
-
-#: contrib/comments/models.py:285
-#, python-format
-msgid "Moderator deletion by %r"
-msgstr "Eliminacin del moderador %r"
-
-#: contrib/comments/views/karma.py:19
-msgid "Anonymous users cannot vote"
-msgstr "Los usuarios annimos no pueden votar"
-
-#: contrib/comments/views/karma.py:23
-msgid "Invalid comment ID"
-msgstr "ID de comentario no vlido"
-
-#: contrib/comments/views/karma.py:25
-msgid "No voting for yourself"
-msgstr "Ud. no puede votarse a s mismo"
-
-#: contrib/comments/views/comments.py:27
-msgid ""
-"This rating is required because you've entered at least one other rating."
-msgstr "Se precisa esta puntuacin porque ha introducido al menos otra ms."
-
-#: 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"
-"\n"
-"%(text)s"
-msgid_plural ""
-"This comment was posted by a user who has posted fewer than %(count)s "
-"comments:\n"
-"\n"
-"%(text)s"
-msgstr[0] ""
-"Este comentario lo envi un usuario que ha enviado menos de %(count)s "
-"comentario:\n"
-"\n"
-"%(text)s"
-msgstr[1] ""
-"Este comentario lo envi un usuario que ha enviado menos de %(count)s "
-"comentarios:\n"
-"\n"
-"%(text)s"
+"Ejemplo: '/about/contact/'. Asegúrese de usar barras '/' al principio y al "
+"final."
-#: contrib/comments/views/comments.py:116
-#, python-format
-msgid ""
-"This comment was posted by a sketchy user:\n"
-"\n"
-"%(text)s"
-msgstr ""
-"Este comentario ha sido enviado por un usuario 'semi-annimo':\n"
-"\n"
-"%(text)s"
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "título"
-#: contrib/comments/views/comments.py:188
-#: contrib/comments/views/comments.py:280
-msgid "Only POSTs are allowed"
-msgstr "Slo se admiten POSTs"
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "contenido"
-#: contrib/comments/views/comments.py:192
-#: contrib/comments/views/comments.py:284
-msgid "One or more of the required fields wasn't submitted"
-msgstr "No se proporcion uno o ms de los siguientes campos requeridos"
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "activar comentarios"
-#: contrib/comments/views/comments.py:196
-#: contrib/comments/views/comments.py:286
-msgid "Somebody tampered with the comment form (security violation)"
-msgstr ""
-"Alguien est jugando con el formulario de comentarios (violacin de "
-"seguridad)"
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nombre de plantilla"
-#: contrib/comments/views/comments.py:206
-#: contrib/comments/views/comments.py:292
+#: contrib/flatpages/models.py:13
msgid ""
-"The comment form had an invalid 'target' parameter -- the object ID was "
-"invalid"
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
msgstr ""
-"El formulario de comentarios tiene un parmetro 'target' no vlido (el ID de "
-"objeto era invlido)"
+"Ejemplo: 'flatpages/contact_page.html'. Si no lo proporciona, el sistema "
+"usará 'flatpages/default.html'."
-#: contrib/comments/views/comments.py:257
-#: contrib/comments/views/comments.py:321
-msgid "The comment form didn't provide either 'preview' or 'post'"
-msgstr "El formulario de comentario no proporcion 'previsualizar' ni 'enviar'"
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "debe estar registrado"
-#: contrib/comments/templates/comments/form.html:8
-msgid "Forgotten your password?"
-msgstr "Olvid su contrasea?"
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Si está marcado, sólo los usuarios registrados podrán ver la página."
-#: contrib/comments/templates/comments/form.html:12
-msgid "Ratings"
-msgstr "Calificaciones"
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "página estática"
-#: contrib/comments/templates/comments/form.html:12
-#: contrib/comments/templates/comments/form.html:23
-msgid "Required"
-msgstr "Requerido"
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "páginas estáticas"
-#: contrib/comments/templates/comments/form.html:12
-#: contrib/comments/templates/comments/form.html:23
-msgid "Optional"
-msgstr "Opcional"
+#: contrib/sessions/models.py:68
+msgid "session key"
+msgstr "clave de sesión"
-#: contrib/comments/templates/comments/form.html:23
-msgid "Post a photo"
-msgstr "Enviar una foto"
+#: contrib/sessions/models.py:69
+msgid "session data"
+msgstr "datos de sesión"
-#: contrib/comments/templates/comments/form.html:28
-#: contrib/comments/templates/comments/freeform.html:5
-msgid "Comment:"
-msgstr "Comentario:"
+#: contrib/sessions/models.py:70
+msgid "expire date"
+msgstr "fecha de caducidad"
-#: contrib/comments/templates/comments/form.html:35
-#: contrib/comments/templates/comments/freeform.html:10
-msgid "Preview comment"
-msgstr "Previsualizar comentario"
+#: contrib/sessions/models.py:74
+msgid "session"
+msgstr "sesión"
-#: contrib/comments/templates/comments/freeform.html:4
-msgid "Your name:"
-msgstr "Su nombre:"
+#: contrib/sessions/models.py:75
+msgid "sessions"
+msgstr "sesiones"
#: contrib/humanize/templatetags/humanize.py:17
msgid "th"
-msgstr ""
+msgstr "th"
#: contrib/humanize/templatetags/humanize.py:17
msgid "st"
-msgstr ""
+msgstr "st"
#: contrib/humanize/templatetags/humanize.py:17
msgid "nd"
-msgstr ""
+msgstr "nd"
#: contrib/humanize/templatetags/humanize.py:17
msgid "rd"
-msgstr ""
+msgstr "rd"
#: contrib/humanize/templatetags/humanize.py:47
#, python-format
msgid "%(value).1f million"
msgid_plural "%(value).1f million"
-msgstr[0] "%(value).1f milln"
+msgstr[0] "%(value).1f millón"
msgstr[1] "%(value).1f millones"
#: contrib/humanize/templatetags/humanize.py:50
@@ -2360,7 +2572,7 @@ msgstr[1] "%(value).1f millardos"
#, python-format
msgid "%(value).1f trillion"
msgid_plural "%(value).1f trillion"
-msgstr[0] "%(value).1f billn"
+msgstr[0] "%(value).1f billón"
msgstr[1] "%(value).1f billones"
#: contrib/humanize/templatetags/humanize.py:68
@@ -2399,624 +2611,471 @@ msgstr "ocho"
msgid "nine"
msgstr "nueve"
-#: db/models/manipulators.py:307
-#, python-format
-msgid "%(object)s with this %(type)s already exists for the given %(field)s."
-msgstr "Ya existe un(a) %(object)s con este/a %(type)s para %(field)s."
-
-#: db/models/fields/__init__.py:42
-#, python-format
-msgid "%(optname)s with this %(fieldname)s already exists."
-msgstr "Ya existe %(optname)s con este %(fieldname)s."
-
-#: db/models/fields/__init__.py:369
-msgid "This value must be an integer."
-msgstr "Este valor debe ser un nmero entero."
-
-#: db/models/fields/__init__.py:404
-msgid "This value must be either True or False."
-msgstr "Este valor debe ser True o False."
-
-#: db/models/fields/__init__.py:425
-msgid "This field cannot be null."
-msgstr "Este campo no puede ser nulo."
-
-#: db/models/fields/__init__.py:459 core/validators.py:148
-msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr "Introduzca una fecha vlida en formato AAAA-MM-DD."
-
-#: db/models/fields/__init__.py:528 core/validators.py:157
-msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
-msgstr "Introduzca una fecha/hora vlida en formato AAAA-MM-DD HH:MM."
-
-#: db/models/fields/__init__.py:632
-msgid "Enter a valid filename."
-msgstr "Introduzca un nombre de archivo vlido."
-
-#: db/models/fields/__init__.py:753
-msgid "This value must be either None, True or False."
-msgstr "Este valor debe ser None, True o False."
-
-#: db/models/fields/related.py:53
-#, python-format
-msgid "Please enter a valid %s."
-msgstr "Por favor, introduzca un %s vlido."
-
-#: db/models/fields/related.py:642
-msgid "Separate multiple IDs with commas."
-msgstr " Separe mltiples identificadores con comas."
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redirigir desde"
-#: db/models/fields/related.py:644
+#: contrib/redirects/models.py:8
msgid ""
-"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
-msgstr ""
-"Mantenga presionada \"Control\" (\"Command\" en una Mac) para seleccionar "
-"ms de uno."
-
-#: db/models/fields/related.py:691
-#, 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] ""
-"Por favor, introduzca IDs de %(self)s vlidos. El valor %(value)r no es "
-"vlido."
-msgstr[1] ""
-"Por favor, introduzca IDs de %(self)s vlidos. Los valores %(value)r no son "
-"vlidos."
-
-#: oldforms/__init__.py:392
-#, python-format
-msgid "Ensure your text is less than %s character."
-msgid_plural "Ensure your text is less than %s characters."
-msgstr[0] "Asegrese de que su texto tiene menos de %s caracter."
-msgstr[1] "Asegrese de que su texto tiene menos de %s caracteres."
-
-#: oldforms/__init__.py:397
-msgid "Line breaks are not allowed here."
-msgstr "No se permiten saltos de lnea."
-
-#: oldforms/__init__.py:498 oldforms/__init__.py:571 oldforms/__init__.py:610
-#, python-format
-msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
-msgstr "Seleccione una opcin vlida; '%(data)s' no est en %(choices)s."
-
-#: oldforms/__init__.py:672 core/validators.py:174 core/validators.py:445
-msgid "No file was submitted. Check the encoding type on the form."
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
msgstr ""
-"No se envi un archivo. Verifique el tipo de codificacin en el formulario."
-
-#: oldforms/__init__.py:674
-msgid "The submitted file is empty."
-msgstr "El archivo enviado est vaco."
-
-#: oldforms/__init__.py:730
-msgid "Enter a whole number between -32,768 and 32,767."
-msgstr "Introduzca un nmero entero entre -32.768 y 32.767."
-
-#: oldforms/__init__.py:740
-msgid "Enter a positive number."
-msgstr "Introduzca un nmero positivo."
-
-#: oldforms/__init__.py:750
-msgid "Enter a whole number between 0 and 32,767."
-msgstr "Introduzca un nmero entero entre 0 y 32.767."
-
-#: views/generic/create_update.py:43
-#, python-format
-msgid "The %(verbose_name)s was created successfully."
-msgstr "Se cre con xito %(verbose_name)s."
-
-#: views/generic/create_update.py:117
-#, python-format
-msgid "The %(verbose_name)s was updated successfully."
-msgstr "Se actualiz con xito %(verbose_name)s."
-
-#: views/generic/create_update.py:184
-#, python-format
-msgid "The %(verbose_name)s was deleted."
-msgstr "Se elimin %(verbose_name)s."
-
-#: conf/global_settings.py:39
-msgid "Arabic"
-msgstr "rabe"
-
-#: conf/global_settings.py:40
-msgid "Bengali"
-msgstr "Bengal"
-
-#: conf/global_settings.py:41
-msgid "Bulgarian"
-msgstr "Blgaro"
-
-#: conf/global_settings.py:42
-msgid "Catalan"
-msgstr "Cataln"
-
-#: conf/global_settings.py:43
-msgid "Czech"
-msgstr "Checo"
-
-#: conf/global_settings.py:44
-msgid "Welsh"
-msgstr "Gals"
-
-#: conf/global_settings.py:45
-msgid "Danish"
-msgstr "Dans"
-
-#: conf/global_settings.py:46
-msgid "German"
-msgstr "Alemn"
-
-#: conf/global_settings.py:47
-msgid "Greek"
-msgstr "Griego"
-
-#: conf/global_settings.py:48
-msgid "English"
-msgstr "Ingls"
-
-#: conf/global_settings.py:49
-msgid "Spanish"
-msgstr "Espaol"
-
-#: conf/global_settings.py:50
-msgid "Argentinean Spanish"
-msgstr "Espaol Argentino"
-
-#: conf/global_settings.py:51
-msgid "Finnish"
-msgstr "Finlands"
-
-#: conf/global_settings.py:52
-msgid "French"
-msgstr "Francs"
-
-#: conf/global_settings.py:53
-msgid "Galician"
-msgstr "Gallego"
-
-#: conf/global_settings.py:54
-msgid "Hungarian"
-msgstr "Hngaro"
-
-#: conf/global_settings.py:55
-msgid "Hebrew"
-msgstr "Hebreo"
-
-#: conf/global_settings.py:56
-msgid "Icelandic"
-msgstr "Islands"
-
-#: conf/global_settings.py:57
-msgid "Italian"
-msgstr "Italiano"
-
-#: conf/global_settings.py:58
-msgid "Japanese"
-msgstr "Japons"
-
-#: conf/global_settings.py:59
-msgid "Korean"
-msgstr "Koreano"
-
-#: conf/global_settings.py:60
-msgid "Kannada"
-msgstr "Canars"
-
-#: conf/global_settings.py:61
-msgid "Latvian"
-msgstr "Letn"
-
-#: conf/global_settings.py:62
-msgid "Macedonian"
-msgstr "Macedonio"
-
-#: conf/global_settings.py:63
-msgid "Dutch"
-msgstr "Holands"
-
-#: conf/global_settings.py:64
-msgid "Norwegian"
-msgstr "Noruego"
-
-#: conf/global_settings.py:65
-msgid "Polish"
-msgstr "Polaco"
-
-#: conf/global_settings.py:66
-msgid "Portugese"
-msgstr "Portugus"
-
-#: conf/global_settings.py:67
-msgid "Brazilian"
-msgstr "Brasileo"
-
-#: conf/global_settings.py:68
-msgid "Romanian"
-msgstr "Rumano"
-
-#: conf/global_settings.py:69
-msgid "Russian"
-msgstr "Ruso"
-
-#: conf/global_settings.py:70
-msgid "Slovak"
-msgstr "Eslovaco"
-
-#: conf/global_settings.py:71
-msgid "Slovenian"
-msgstr "Esloveno"
-
-#: conf/global_settings.py:72
-msgid "Serbian"
-msgstr "Serbio"
-
-#: conf/global_settings.py:73
-msgid "Swedish"
-msgstr "Sueco"
-
-#: conf/global_settings.py:74
-msgid "Tamil"
-msgstr "Tamil"
-
-#: conf/global_settings.py:75
-msgid "Telugu"
-msgstr "Telugu"
-
-#: conf/global_settings.py:76
-msgid "Turkish"
-msgstr "Turco"
-
-#: conf/global_settings.py:77
-msgid "Ukrainian"
-msgstr "Ucraniano"
-
-#: conf/global_settings.py:78
-msgid "Simplified Chinese"
-msgstr "Chino simplificado"
-
-#: conf/global_settings.py:79
-msgid "Traditional Chinese"
-msgstr "Chino tradicional"
-
-#: template/defaultfilters.py:491
-msgid "yes,no,maybe"
-msgstr "si,no,talvez"
+"Esta ruta debería ser absoluta, excluyendo el nombre de dominio. Ejemplo: '/"
+"events/search/'."
-#: template/defaultfilters.py:520
-#, python-format
-msgid "%(size)d byte"
-msgid_plural "%(size)d bytes"
-msgstr[0] ""
-msgstr[1] ""
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redirigir a"
-#: template/defaultfilters.py:522
-#, python-format
-msgid "%.1f KB"
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
msgstr ""
+"Esto puede ser bien una ruta absoluta (como arriba) o una URL completa que "
+"empiece con 'http://'."
-#: template/defaultfilters.py:524
-#, python-format
-msgid "%.1f MB"
-msgstr ""
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "redirección"
-#: template/defaultfilters.py:525
-#, python-format
-msgid "%.1f GB"
-msgstr ""
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "redirecciones"
-#: core/validators.py:64
+#: core/validators.py:71
msgid "This value must contain only letters, numbers and underscores."
-msgstr "Este valor debe contener slo letras, nmeros y guiones bajos."
+msgstr "Este valor debe contener sólo letras, números y guiones bajos."
-#: core/validators.py:68
+#: core/validators.py:75
msgid ""
"This value must contain only letters, numbers, underscores, dashes or "
"slashes."
msgstr ""
-"Este valor debe contener slo letras, nmeros, guiones bajos, guiones o "
+"Este valor debe contener sólo letras, números, guiones bajos, guiones o "
"barras (/)"
-#: core/validators.py:72
+#: core/validators.py:79
msgid "This value must contain only letters, numbers, underscores or hyphens."
msgstr ""
-"Este valor debe contener slo letras, nmeros, guiones bajos o guiones."
+"Este valor debe contener sólo letras, números, guiones bajos o guiones."
-#: core/validators.py:76
+#: core/validators.py:83
msgid "Uppercase letters are not allowed here."
-msgstr "No se admiten letras maysculas."
+msgstr "No se admiten letras mayúsculas."
-#: core/validators.py:80
+#: core/validators.py:87
msgid "Lowercase letters are not allowed here."
-msgstr "No se admiten letras minsculas."
+msgstr "No se admiten letras minúsculas."
-#: core/validators.py:87
+#: core/validators.py:94
msgid "Enter only digits separated by commas."
-msgstr "Introduzca slo dgitos separados por comas."
+msgstr "Introduzca sólo dígitos separados por comas."
-#: core/validators.py:99
+#: core/validators.py:106
msgid "Enter valid e-mail addresses separated by commas."
-msgstr "Introduzca direcciones de correo vlidas separadas por comas."
+msgstr "Introduzca direcciones de correo válidas separadas por comas."
-#: core/validators.py:103
+#: core/validators.py:110
msgid "Please enter a valid IP address."
-msgstr "Por favor introduzca una direccin IP vlida."
+msgstr "Por favor introduzca una dirección IP válida."
-#: core/validators.py:107
+#: core/validators.py:114
msgid "Empty values are not allowed here."
-msgstr "No se admiten valores vacos."
+msgstr "No se admiten valores vacíos."
-#: core/validators.py:111
+#: core/validators.py:118
msgid "Non-numeric characters aren't allowed here."
-msgstr "No se admiten caracteres no numricos."
+msgstr "No se admiten caracteres no numéricos."
-#: core/validators.py:115
+#: core/validators.py:122
msgid "This value can't be comprised solely of digits."
-msgstr "Este valor no puede estar formado slo por dgitos."
+msgstr "Este valor no puede estar formado sólo por dígitos."
+
+#: core/validators.py:127 newforms/fields.py:141
+msgid "Enter a whole number."
+msgstr "Introduzca un número entero."
-#: core/validators.py:124
+#: core/validators.py:131
msgid "Only alphabetical characters are allowed here."
-msgstr "Slo se admiten caracteres alfabticos."
+msgstr "Sólo se admiten caracteres alfabéticos."
-#: core/validators.py:139
+#: core/validators.py:146
msgid "Year must be 1900 or later."
-msgstr "El ao debe ser 1900 o posterior."
+msgstr "El año debe ser 1900 o posterior."
-#: core/validators.py:143
+#: core/validators.py:150
#, python-format
msgid "Invalid date: %s"
-msgstr "Fecha no vlida: %s"
+msgstr "Fecha no válida: %s"
-#: core/validators.py:153
+#: core/validators.py:160
msgid "Enter a valid time in HH:MM format."
-msgstr "Introduzca una hora vlida en formato HH:MM."
+msgstr "Introduzca una hora válida en formato HH:MM."
+
+#: core/validators.py:169 newforms/fields.py:335
+msgid "Enter a valid e-mail address."
+msgstr "Introduzca una dirección de correo electrónico válida"
-#: core/validators.py:178
+#: core/validators.py:185
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
-"Enve una imagen vlida. El archivo que ha enviado no era una imagen o se "
+"Envíe una imagen válida. El archivo que ha enviado no era una imagen o se "
"trataba de una imagen corrupta."
-#: core/validators.py:185
+#: core/validators.py:192
#, python-format
msgid "The URL %s does not point to a valid image."
-msgstr "La URL %s no apunta a una imagen vlida."
+msgstr "La URL %s no apunta a una imagen válida."
-#: core/validators.py:189
+#: core/validators.py:196
#, python-format
msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
msgstr ""
-"Los nmeros telefnicos deben respetar el formato XXX-XXX-XXXX. \"%s\" no es "
-"vlido."
+"Los números telefónicos deben respetar el formato XXX-XXX-XXXX. \"%s\" no es "
+"válido."
-#: core/validators.py:197
+#: core/validators.py:204
#, python-format
msgid "The URL %s does not point to a valid QuickTime video."
-msgstr "La URL %s no apunta a un vdeo QuickTime vlido."
+msgstr "La URL %s no apunta a un vídeo QuickTime válido."
-#: core/validators.py:201
+#: core/validators.py:208
msgid "A valid URL is required."
-msgstr "Se precisa una URL vlida."
+msgstr "Se precisa una URL válida."
-#: core/validators.py:215
+#: core/validators.py:222
#, python-format
msgid ""
"Valid HTML is required. Specific errors are:\n"
"%s"
msgstr ""
-"Se precisa HTML vlido. Los errores especficos son:\n"
+"Se precisa HTML válido. Los errores específicos son:\n"
"%s"
-#: core/validators.py:222
+#: core/validators.py:229
#, python-format
msgid "Badly formed XML: %s"
msgstr "XML mal formado: %s"
-#: core/validators.py:239
+#: core/validators.py:246
#, python-format
msgid "Invalid URL: %s"
-msgstr "URL no vlida: %s"
+msgstr "URL no válida: %s"
-#: core/validators.py:244 core/validators.py:246
+#: core/validators.py:251 core/validators.py:253
#, python-format
msgid "The URL %s is a broken link."
msgstr "La URL %s es un enlace roto."
-#: core/validators.py:252
+#: core/validators.py:259
msgid "Enter a valid U.S. state abbreviation."
-msgstr "Introduzca una abreviatura vlida de estado de los EE.UU."
+msgstr "Introduzca una abreviatura válida de estado de los EE.UU."
-#: core/validators.py:266
+#: core/validators.py:273
#, python-format
msgid "Watch your mouth! The word %s is not allowed here."
msgid_plural "Watch your mouth! The words %s are not allowed here."
-msgstr[0] "Vigila tu boca! Aqu no admitimos la palabra %s."
-msgstr[1] "Vigila tu boca! Aqu no admitimos las palabras %s."
+msgstr[0] "¡Vigila tu boca! Aquí no admitimos la palabra %s."
+msgstr[1] "¡Vigila tu boca! Aquí no admitimos las palabras %s."
-#: core/validators.py:273
+#: core/validators.py:280
#, python-format
msgid "This field must match the '%s' field."
msgstr "Este campo debe concordar con el campo '%s'."
-#: core/validators.py:292
+#: core/validators.py:299
msgid "Please enter something for at least one field."
msgstr "Por favor, introduzca algo en al menos un campo."
-#: core/validators.py:301 core/validators.py:312
+#: core/validators.py:308 core/validators.py:319
msgid "Please enter both fields or leave them both empty."
-msgstr "Por favor, rellene ambos campos o deje ambos vacos."
+msgstr "Por favor, rellene ambos campos o deje ambos vacíos."
-#: core/validators.py:320
+#: core/validators.py:327
#, python-format
msgid "This field must be given if %(field)s is %(value)s"
msgstr "Se debe proporcionar este campo si %(field)s es %(value)s"
-#: core/validators.py:333
+#: core/validators.py:340
#, python-format
msgid "This field must be given if %(field)s is not %(value)s"
msgstr "Se debe proporcionar este campo si %(field)s no es %(value)s"
-#: core/validators.py:352
+#: core/validators.py:359
msgid "Duplicate values are not allowed."
msgstr "No se admiten valores duplicados."
-#: core/validators.py:367
+#: core/validators.py:374
#, python-format
msgid "This value must be between %(lower)s and %(upper)s."
msgstr "Este valor debe estar entre %(lower)s y %(upper)s."
-#: core/validators.py:369
+#: core/validators.py:376
#, python-format
msgid "This value must be at least %s."
msgstr "Este valor debe ser al menos %s."
-#: core/validators.py:371
+#: core/validators.py:378
#, python-format
msgid "This value must be no more than %s."
msgstr "Este valor debe ser no mayor que %s."
-#: core/validators.py:407
+#: core/validators.py:414
#, python-format
msgid "This value must be a power of %s."
msgstr "Este valor debe ser una potencia de %s."
-#: core/validators.py:418
+#: core/validators.py:424
msgid "Please enter a valid decimal number."
-msgstr "Por favor, introduzca un nmero decimal vlido."
+msgstr "Por favor, introduzca un número decimal válido."
-#: core/validators.py:422
+#: core/validators.py:431
#, 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] ""
-"Por favor, introduzca un nmero decimal vlido con un mximo de un dgito en "
+"Por favor, introduzca un número decimal válido con un máximo de un dígito en "
"total."
msgstr[1] ""
-"Por favor, introduzca un nmero decimal vlido con un maximo de %s dgitos "
+"Por favor, introduzca un número decimal válido con un maximo de %s dígitos "
"en total."
-#: core/validators.py:425
+#: core/validators.py:434
#, 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] ""
-"Por favor, introduzca un nmero decimal vlido con un dgito entero como "
-"mximo."
+"Por favor, introduzca un número decimal válido con un dígito entero como "
+"máximo."
msgstr[1] ""
-"Por favor, introduzca un nmero decimal vlido con un mximo de %s dgitos "
+"Por favor, introduzca un número decimal válido con un máximo de %s dígitos "
"enteros."
-#: core/validators.py:428
+#: core/validators.py:437
#, 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] ""
-"Por favor, introduzca un nmero decimal vlido con un mximo de una posicin "
+"Por favor, introduzca un número decimal válido con un máximo de una posición "
"decimal."
msgstr[1] ""
-"Por favor, introduzca un nmero decimal vlido con un mximo de %s "
+"Por favor, introduzca un número decimal válido con un máximo de %s "
"posiciones decimales."
-#: core/validators.py:438
+#: core/validators.py:445
+msgid "Please enter a valid floating point number."
+msgstr "Por favor introduzca un número de punto flotante válido."
+
+#: core/validators.py:454
#, python-format
msgid "Make sure your uploaded file is at least %s bytes big."
msgstr ""
-"Asegrese de que el archivo que enva es de un tamao mnimo de %s bytes."
+"Asegúrese de que el archivo que envía es de un tamaño mínimo de %s bytes."
-#: core/validators.py:439
+#: core/validators.py:455
#, python-format
msgid "Make sure your uploaded file is at most %s bytes big."
msgstr ""
-"Asegrese de que el archivo que enva es de un tamao mximo de %s bytes."
+"Asegúrese de que el archivo que envía es de un tamaño máximo de %s bytes."
-#: core/validators.py:456
+#: core/validators.py:472
msgid "The format for this field is wrong."
msgstr "El formato de este campo es incorrecto."
-#: core/validators.py:471
+#: core/validators.py:487
msgid "This field is invalid."
-msgstr "Este campo no es vlido."
+msgstr "Este campo no es válido."
-#: core/validators.py:507
+#: core/validators.py:523
#, python-format
msgid "Could not retrieve anything from %s."
msgstr "No se pudo obtener nada de %s."
-#: core/validators.py:510
+#: core/validators.py:526
#, python-format
msgid ""
"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
msgstr ""
-"La URL %(url)s devolvi la cabecera Content-Type '%(contenttype)s', que no "
-"es vlida."
+"La URL %(url)s devolvió la cabecera Content-Type '%(contenttype)s', que no "
+"es válida."
-#: core/validators.py:543
+#: core/validators.py:559
#, python-format
msgid ""
"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
"\"%(start)s\".)"
msgstr ""
-"Por favor, cierre la etiqueta %(tag)s de la lnea %(line)s. (La lnea "
+"Por favor, cierre la etiqueta %(tag)s de la línea %(line)s. (La línea "
"empieza con \"%(start)s\".)"
-#: core/validators.py:547
+#: core/validators.py:563
#, python-format
msgid ""
"Some text starting on line %(line)s is not allowed in that context. (Line "
"starts with \"%(start)s\".)"
msgstr ""
-"Parte del texto que comienza en la lnea %(line)s no est permitido en ese "
-"contexto. (La lnea empieza con \"%(start)s\".)"
+"Parte del texto que comienza en la línea %(line)s no está permitido en ese "
+"contexto. (La línea empieza con \"%(start)s\".)"
-#: core/validators.py:552
+#: core/validators.py:568
#, python-format
msgid ""
"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
"(start)s\".)"
msgstr ""
-"El \"%(attr)s\" de la lnea %(line)s no es un atributo vlido. (La lnea "
+"El \"%(attr)s\" de la línea %(line)s no es un atributo válido. (La línea "
"empieza con \"%(start)s\".)"
-#: core/validators.py:557
+#: core/validators.py:573
#, python-format
msgid ""
"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
"(start)s\".)"
msgstr ""
-"La \"<%(tag)s>\" de la lnea %(line)s no es una etiqueta vlida. (La lnea "
+"La \"<%(tag)s>\" de la línea %(line)s no es una etiqueta válida. (La línea "
"empieza con \"%(start)s\".)"
-#: core/validators.py:561
+#: core/validators.py:577
#, python-format
msgid ""
"A tag on line %(line)s is missing one or more required attributes. (Line "
"starts with \"%(start)s\".)"
msgstr ""
-"A una etiqueta de la lnea %(line)s le faltan uno o ms atributos "
-"requeridos. (La lnea empieza con \"%(start)s\".)"
+"A una etiqueta de la línea %(line)s le faltan uno o más atributos "
+"requeridos. (La línea empieza con \"%(start)s\".)"
-#: core/validators.py:566
+#: core/validators.py:582
#, python-format
msgid ""
"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
"starts with \"%(start)s\".)"
msgstr ""
-"El atributo \"%(attr)s\" de la lnea %(line)s tiene un valor que no es "
-"vlido. (La lnea empieza con \"%(start)s\".)"
+"El atributo \"%(attr)s\" de la línea %(line)s tiene un valor que no es "
+"válido. (La línea empieza con \"%(start)s\".)"
+
+#: newforms/fields.py:116
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr "Asegúrese de que este valor tenga como máximo %(max)d caracteres (tiene %(length)d)."
+
+#: newforms/fields.py:118
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr "Asegúrese de que este valor tenga al menos %(min)d caracteres (tiene %(length)d)."
+
+#: newforms/fields.py:143 newforms/fields.py:166 newforms/fields.py:196
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Asegúrese de que este valor sea menor o igual a %s."
+
+#: newforms/fields.py:145 newforms/fields.py:168 newforms/fields.py:198
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Asegúrese de que este valor sea mayor o igual a %s."
+
+#: newforms/fields.py:164 newforms/fields.py:191
+msgid "Enter a number."
+msgstr "Introduzca un número."
+
+#: newforms/fields.py:200
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Asegúrese de que no existan en total mas de %s dígitos."
+
+#: newforms/fields.py:202
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Asegúrese de que no existan mas de %s lugares decimales."
+
+#: newforms/fields.py:204
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Asegúrese de que no existan mas de %s dígitos antes del punto decimal."
+
+#: newforms/fields.py:237 newforms/fields.py:560
+msgid "Enter a valid date."
+msgstr "Introduzca una fecha válida."
+
+#: newforms/fields.py:264 newforms/fields.py:562
+msgid "Enter a valid time."
+msgstr "Introduzca una hora válida."
+
+#: newforms/fields.py:300
+msgid "Enter a valid date/time."
+msgstr "Introduzca una fecha/hora válida."
+
+#: newforms/fields.py:313
+msgid "Enter a valid value."
+msgstr "Introduzca un valor válido."
+
+#: newforms/fields.py:353 newforms/fields.py:375
+msgid "Enter a valid URL."
+msgstr "Introduzca una URL válida."
+
+#: newforms/fields.py:377
+msgid "This URL appears to be a broken link."
+msgstr "La URL parece ser un enlace roto."
+
+#: newforms/fields.py:428 newforms/models.py:174
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Seleccione una opción válida. Esa opción no es una de las opciones "
+"disponibles."
+
+#: newforms/fields.py:444 newforms/fields.py:520 newforms/models.py:191
+msgid "Enter a list of values."
+msgstr "Introduzca una lista de valores."
+
+#: newforms/fields.py:450 newforms/models.py:197
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr ""
+"Seleccione una opción válida. %s no es una de las opciones disponibles."
+
+#: template/defaultfilters.py:485
+msgid "yes,no,maybe"
+msgstr "si,no,talvez"
+
+#: template/defaultfilters.py:514
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: template/defaultfilters.py:516
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:518
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:519
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#~ msgid "%d milliseconds"
+#~ msgstr "%d milisegundos"
+
+#~ msgid "AnonymousUser"
+#~ msgstr "UsuarioAnonimo"
#~ msgid "Use '[algo]$[salt]$[hexdigest]'"
#~ msgstr "Use '[algoritmo]$[salt]$[hexdigest]'"
#~ msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
-#~ msgstr "Ha <a href=\"/password_reset/\">olvidado su contrasea</a>?"
+#~ msgstr "¿Ha <a href=\"/password_reset/\">olvidado su contraseña</a>?"
#~ msgid "%(content_type_name)s"
#~ msgstr "tipos de contenido"
@@ -3033,7 +3092,7 @@ msgstr ""
#~ msgstr "Comentarios"
#~ msgid "String (up to 50)"
-#~ msgstr "Cadena (mximo 50)"
+#~ msgstr "Cadena (máximo 50)"
#~ msgid "label"
#~ msgstr "etiqueta"
diff --git a/django/conf/locale/es_AR/LC_MESSAGES/djangojs.mo b/django/conf/locale/es_AR/LC_MESSAGES/djangojs.mo
index d8e3cc6fd6..b055405fbf 100644
--- a/django/conf/locale/es_AR/LC_MESSAGES/djangojs.mo
+++ b/django/conf/locale/es_AR/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po b/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po
index 91ecb09eed..4c81e7e3f1 100644
--- a/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po
+++ b/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po
@@ -1,17 +1,17 @@
-# Argentinean spanish translation for the django-admin JS files, based on
-# Spanish translation work by Jorge Gajon.
-# This file is distributed under the same license as the Django package.
-# Copyright (C) Ramiro Morales <rm0@gmx.net>, 2006,2007.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR
#
msgid ""
msgstr ""
-"Project-Id-Version: Django JavaScript 1.0\n"
+"Project-Id-Version: Django Javascript 1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2007-02-25 17:48-0300\n"
-"PO-Revision-Date: 2007-02-25 17:55-0300\n"
+"POT-Creation-Date: 2007-07-14 13:45-0300\n"
+"PO-Revision-Date: 2007-07-14 14:36-0300\n"
"Last-Translator: Ramiro Morales <rm0@gmx.net>\n"
+"Language-Team: Django-I18N <django-i18n@googlegroups.com>\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: contrib/admin/media/js/SelectFilter2.js:33
@@ -55,7 +55,7 @@ msgstr ""
#: contrib/admin/media/js/dateparse.js:33
msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
-msgstr "Domingo Lunes Martes Mircoles Jueves Viernes Sbado"
+msgstr "Domingo Lunes Martes Miércoles Jueves Viernes Sábado"
#: contrib/admin/media/js/calendar.js:25
msgid "S M T W T F S"
@@ -93,7 +93,7 @@ msgstr "6 a.m."
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
msgid "Noon"
-msgstr "Medioda"
+msgstr "Mediodía"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
@@ -115,4 +115,4 @@ msgstr "Ayer"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
msgid "Tomorrow"
-msgstr "Maana"
+msgstr "Mañana"
diff --git a/django/conf/locale/fr/LC_MESSAGES/django.mo b/django/conf/locale/fr/LC_MESSAGES/django.mo
index b96306cabd..32b009440f 100644
--- a/django/conf/locale/fr/LC_MESSAGES/django.mo
+++ b/django/conf/locale/fr/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/fr/LC_MESSAGES/django.po b/django/conf/locale/fr/LC_MESSAGES/django.po
index 2e525466b1..c64130e4dd 100644
--- a/django/conf/locale/fr/LC_MESSAGES/django.po
+++ b/django/conf/locale/fr/LC_MESSAGES/django.po
@@ -7,128 +7,132 @@ msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2007-04-22 09:06+0200\n"
+"POT-Creation-Date: 2007-07-08 16:03+0200\n"
"PO-Revision-Date: 2006-05-08 15:12+0200\n"
-"Last-Translator: Baptiste Goupil <baptiste.goupil_at_google_email.com>\n"
+"Last-Translator: Baptiste <baptiste.goupil_at_google_email.com>\n"
"Language-Team: français <fr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: oldforms/__init__.py:357 db/models/fields/__init__.py:114
-#: db/models/fields/__init__.py:271 db/models/fields/__init__.py:607
-#: db/models/fields/__init__.py:618 newforms/models.py:178
-#: newforms/fields.py:80 newforms/fields.py:376 newforms/fields.py:452
-#: newforms/fields.py:463
+#: oldforms/__init__.py:369 db/models/fields/__init__.py:125
+#: db/models/fields/__init__.py:282 db/models/fields/__init__.py:679
+#: db/models/fields/__init__.py:690 newforms/models.py:188
+#: newforms/fields.py:87 newforms/fields.py:444 newforms/fields.py:523
+#: newforms/fields.py:534
msgid "This field is required."
msgstr "Ce champ est obligatoire."
-#: oldforms/__init__.py:392
+#: oldforms/__init__.py:404
#, python-format
msgid "Ensure your text is less than %s character."
msgid_plural "Ensure your text is less than %s characters."
msgstr[0] "Assurez-vous que votre texte fait moins de %s caractère."
msgstr[1] "Assurez-vous que votre texte fait moins de %s caractères."
-#: oldforms/__init__.py:397
+#: oldforms/__init__.py:409
msgid "Line breaks are not allowed here."
msgstr "Les retours à la ligne ne sont pas autorisés ici."
-#: oldforms/__init__.py:498 oldforms/__init__.py:571 oldforms/__init__.py:610
+#: oldforms/__init__.py:507 oldforms/__init__.py:581 oldforms/__init__.py:620
#, python-format
msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
msgstr "Sélectionnez un choix valide ; '%(data)s' n'est pas dans %(choices)s."
-#: oldforms/__init__.py:577 newforms/widgets.py:180
-#: contrib/admin/filterspecs.py:150
+#: oldforms/__init__.py:587 newforms/widgets.py:181
+#: contrib/admin/filterspecs.py:152
msgid "Unknown"
msgstr "Inconnu"
-#: oldforms/__init__.py:577 newforms/widgets.py:180
-#: contrib/admin/filterspecs.py:143
+#: oldforms/__init__.py:587 newforms/widgets.py:181
+#: contrib/admin/filterspecs.py:145
msgid "Yes"
msgstr "Oui"
-#: oldforms/__init__.py:577 newforms/widgets.py:180
-#: contrib/admin/filterspecs.py:143
+#: oldforms/__init__.py:587 newforms/widgets.py:181
+#: contrib/admin/filterspecs.py:145
msgid "No"
msgstr "Non"
-#: oldforms/__init__.py:672 core/validators.py:174 core/validators.py:445
+#: oldforms/__init__.py:682 core/validators.py:178 core/validators.py:456
msgid "No file was submitted. Check the encoding type on the form."
msgstr ""
-#: oldforms/__init__.py:674
+#: oldforms/__init__.py:684
msgid "The submitted file is empty."
msgstr "Le fichier soumis est vide."
-#: oldforms/__init__.py:730
+#: oldforms/__init__.py:740
msgid "Enter a whole number between -32,768 and 32,767."
msgstr "Entrez un nombre entier entre -32 768 et 32 767."
-#: oldforms/__init__.py:740
+#: oldforms/__init__.py:750
msgid "Enter a positive number."
msgstr "Entrez un nombre entier positif."
-#: oldforms/__init__.py:750
+#: oldforms/__init__.py:760
msgid "Enter a whole number between 0 and 32,767."
msgstr "Entrez un nombre entier entre 0 et 32 767."
-#: db/models/manipulators.py:302
+#: db/models/manipulators.py:304
#, python-format
msgid "%(object)s with this %(type)s already exists for the given %(field)s."
msgstr ""
-#: db/models/manipulators.py:303
+#: db/models/manipulators.py:305
msgid "and"
msgstr "et"
-#: db/models/fields/__init__.py:41
+#: db/models/fields/__init__.py:46
#, python-format
msgid "%(optname)s with this %(fieldname)s already exists."
msgstr "%(optname)s avec le champ %(fieldname)s existe déjà."
-#: db/models/fields/__init__.py:364
+#: db/models/fields/__init__.py:377
msgid "This value must be an integer."
msgstr "Cette valeur doit être un entier."
-#: db/models/fields/__init__.py:399
+#: db/models/fields/__init__.py:412
msgid "This value must be either True or False."
msgstr "Cette valeur doit être soit Vraie soit Fausse."
-#: db/models/fields/__init__.py:420
+#: db/models/fields/__init__.py:433
msgid "This field cannot be null."
msgstr "Ce champ ne peut pas être vide."
-#: db/models/fields/__init__.py:454 core/validators.py:148
+#: db/models/fields/__init__.py:467 core/validators.py:152
msgid "Enter a valid date in YYYY-MM-DD format."
msgstr "Entrez une date valide au format AAAA-MM-JJ."
-#: db/models/fields/__init__.py:523 core/validators.py:157
+#: db/models/fields/__init__.py:536 core/validators.py:161
msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
msgstr "Entrez une date et une heure valide au format AAAA-MM-JJ HH:MM."
-#: db/models/fields/__init__.py:627
+#: db/models/fields/__init__.py:596
+msgid "This value must be a decimal number."
+msgstr "Cette valeur doit être un nombre décimal."
+
+#: db/models/fields/__init__.py:699
msgid "Enter a valid filename."
msgstr "Entrez un nom de fichier valide."
-#: db/models/fields/__init__.py:748
+#: db/models/fields/__init__.py:824
msgid "This value must be either None, True or False."
msgstr "Cette valeur doit être Nulle, Vraie ou Fausse."
-#: db/models/fields/related.py:53
+#: db/models/fields/related.py:55
#, python-format
msgid "Please enter a valid %s."
msgstr "Entrez un %s valide."
-#: db/models/fields/related.py:624
+#: db/models/fields/related.py:623
msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr ""
"Maintenez \"Contrôle (ctrl)\", ou \"Commande (touche pomme)\" sur un Mac, "
"pour en sélectionner plusieurs."
-#: db/models/fields/related.py:668
+#: db/models/fields/related.py:667
#, python-format
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
msgid_plural ""
@@ -146,366 +150,376 @@ msgid "Bengali"
msgstr "Indien"
#: conf/global_settings.py:41
+msgid "Bulgarian"
+msgstr "Bulgare"
+
+#: conf/global_settings.py:42
msgid "Catalan"
msgstr "Catalan"
-#: conf/global_settings.py:42
+#: conf/global_settings.py:43
msgid "Czech"
msgstr "Tchèque"
-#: conf/global_settings.py:43
+#: conf/global_settings.py:44
msgid "Welsh"
msgstr "Gallois"
-#: conf/global_settings.py:44
+#: conf/global_settings.py:45
msgid "Danish"
msgstr "Dannois"
-#: conf/global_settings.py:45
+#: conf/global_settings.py:46
msgid "German"
msgstr "Allemand"
-#: conf/global_settings.py:46
+#: conf/global_settings.py:47
msgid "Greek"
msgstr "Grec"
-#: conf/global_settings.py:47
+#: conf/global_settings.py:48
msgid "English"
msgstr "Anglais"
-#: conf/global_settings.py:48
+#: conf/global_settings.py:49
msgid "Spanish"
msgstr "Espagnol"
-#: conf/global_settings.py:49
+#: conf/global_settings.py:50
msgid "Argentinean Spanish"
msgstr "Espagnol Argentin"
-#: conf/global_settings.py:50
+#: conf/global_settings.py:51
+msgid "Persian"
+msgstr "Perse"
+
+#: conf/global_settings.py:52
msgid "Finnish"
-msgstr "Dannois"
+msgstr "Finlandais"
-#: conf/global_settings.py:51
+#: conf/global_settings.py:53
msgid "French"
msgstr "Français"
-#: conf/global_settings.py:52
+#: conf/global_settings.py:54
msgid "Galician"
msgstr "Galicien"
-#: conf/global_settings.py:53
+#: conf/global_settings.py:55
msgid "Hungarian"
msgstr "Hongrois"
-#: conf/global_settings.py:54
+#: conf/global_settings.py:56
msgid "Hebrew"
-msgstr "Israélien"
+msgstr "Hébreu"
-#: conf/global_settings.py:55
+#: conf/global_settings.py:57
msgid "Icelandic"
msgstr "Islandais"
-#: conf/global_settings.py:56
+#: conf/global_settings.py:58
msgid "Italian"
msgstr "Italien"
-#: conf/global_settings.py:57
+#: conf/global_settings.py:59
msgid "Japanese"
msgstr "Japonais"
-#: conf/global_settings.py:58
+#: conf/global_settings.py:60
+msgid "Korean"
+msgstr "Coréen"
+
+#: conf/global_settings.py:61
msgid "Kannada"
msgstr "Kannada"
-#: conf/global_settings.py:59
+#: conf/global_settings.py:62
msgid "Latvian"
msgstr "Letton"
-#: conf/global_settings.py:60
+#: conf/global_settings.py:63
msgid "Macedonian"
msgstr "Macédonien"
-#: conf/global_settings.py:61
+#: conf/global_settings.py:64
msgid "Dutch"
-msgstr "Néerlandais"
+msgstr "Hollandais"
-#: conf/global_settings.py:62
+#: conf/global_settings.py:65
msgid "Norwegian"
msgstr "Norvégien"
-#: conf/global_settings.py:63
+#: conf/global_settings.py:66
msgid "Polish"
msgstr "Polonais"
-#: conf/global_settings.py:64
+#: conf/global_settings.py:67
msgid "Portugese"
-msgstr ""
+msgstr "Portugais"
-#: conf/global_settings.py:65
+#: conf/global_settings.py:68
msgid "Brazilian"
msgstr "Brésilien"
-#: conf/global_settings.py:66
+#: conf/global_settings.py:69
msgid "Romanian"
msgstr "Roumain"
-#: conf/global_settings.py:67
+#: conf/global_settings.py:70
msgid "Russian"
msgstr "Russe"
-#: conf/global_settings.py:68
+#: conf/global_settings.py:71
msgid "Slovak"
msgstr "Slovaque"
-#: conf/global_settings.py:69
+#: conf/global_settings.py:72
msgid "Slovenian"
msgstr "Slovaque"
-#: conf/global_settings.py:70
+#: conf/global_settings.py:73
msgid "Serbian"
msgstr "Serbe"
-#: conf/global_settings.py:71
+#: conf/global_settings.py:74
msgid "Swedish"
msgstr "Suédois"
-#: conf/global_settings.py:72
+#: conf/global_settings.py:75
msgid "Tamil"
msgstr "Tamoul"
-#: conf/global_settings.py:73
+#: conf/global_settings.py:76
msgid "Telugu"
msgstr "Télougou"
-#: conf/global_settings.py:74
+#: conf/global_settings.py:77
msgid "Turkish"
msgstr "Turc"
-#: conf/global_settings.py:75
+#: conf/global_settings.py:78
msgid "Ukrainian"
msgstr "Ukrainien"
-#: conf/global_settings.py:76
+#: conf/global_settings.py:79
msgid "Simplified Chinese"
msgstr "Chinois simplifié"
-#: conf/global_settings.py:77
+#: conf/global_settings.py:80
msgid "Traditional Chinese"
msgstr "Chinois traditionnel"
-#: core/validators.py:64
+#: core/validators.py:68
msgid "This value must contain only letters, numbers and underscores."
-msgstr ""
-"Ce champ ne doit contenir que des lettres, des nombres et des tirets bas "
-"('_')."
+msgstr "Ce champ ne doit contenir que des lettres, des nombres et des"
+"tirets bas _."
-#: core/validators.py:68
+#: core/validators.py:72
msgid ""
"This value must contain only letters, numbers, underscores, dashes or "
"slashes."
msgstr ""
-"Ce champ ne doit contenir que des lettres, des nombres, des tirets bas ('_') "
-"et des '/'."
+"Ce champ ne doit contenir que des lettres, des nombres, des tirets bas _,"
+"des traits d'union, et des '/'."
-#: core/validators.py:72
+#: core/validators.py:76
msgid "This value must contain only letters, numbers, underscores or hyphens."
msgstr ""
-"Ce champ ne doit contenir que des lettres, des nombres, des tirets bas ('_') "
-"et des '-'."
+"Ce champ ne doit contenir que des lettres, des nombres, des tirets bas _"
+"et des traits d'union."
-#: core/validators.py:76
+#: core/validators.py:80
msgid "Uppercase letters are not allowed here."
msgstr "Les lettres majuscules ne sont pas autorisées ici."
-#: core/validators.py:80
+#: core/validators.py:84
msgid "Lowercase letters are not allowed here."
msgstr "Les lettres minuscules ne sont pas autorisées ici."
-#: core/validators.py:87
+#: core/validators.py:91
msgid "Enter only digits separated by commas."
msgstr "Saisissez uniquement des chiffres séparés par des virgules."
-#: core/validators.py:99
+#: core/validators.py:103
msgid "Enter valid e-mail addresses separated by commas."
msgstr "Entrez des adresses de courriel valides séparées par des virgules."
-#: core/validators.py:103
+#: core/validators.py:107
msgid "Please enter a valid IP address."
msgstr "Entrez une adresse IP valide."
-#: core/validators.py:107
+#: core/validators.py:111
msgid "Empty values are not allowed here."
msgstr "Vous ne pouvez pas laisser ce champ vide."
-#: core/validators.py:111
+#: core/validators.py:115
msgid "Non-numeric characters aren't allowed here."
msgstr "Les caractères non numériques ne sont pas autorisés ici."
-#: core/validators.py:115
+#: core/validators.py:119
msgid "This value can't be comprised solely of digits."
msgstr "Cette valeur ne peut pas être composé uniquement de chiffres."
-#: core/validators.py:120 newforms/fields.py:128
+#: core/validators.py:124 newforms/fields.py:135
msgid "Enter a whole number."
msgstr "Entrez un nombre entier."
-#: core/validators.py:124
+#: core/validators.py:128
msgid "Only alphabetical characters are allowed here."
msgstr "Seules les lettres de l'alphabet sont autorisées ici."
-#: core/validators.py:139
+#: core/validators.py:143
msgid "Year must be 1900 or later."
msgstr "L'année doit être supérieure à 1900."
-#: core/validators.py:143
+#: core/validators.py:147
#, python-format
msgid "Invalid date: %s"
-msgstr "Date invalide&amp;nbsp;: %s"
+msgstr "Date invalide : %s"
-#: core/validators.py:153
+#: core/validators.py:157
msgid "Enter a valid time in HH:MM format."
msgstr "Entrez une heure valide au format HH:MM."
-#: core/validators.py:162 newforms/fields.py:271
+#: core/validators.py:166 newforms/fields.py:339
msgid "Enter a valid e-mail address."
msgstr "Entrez une adresse de courriel valide."
-#: core/validators.py:178
+#: core/validators.py:182
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
"Envoyez une image valide. Le fichier que vous avez transferé n'est pas une "
-"image ou bien est une image corrompue."
+"image ou bien est corrompu."
-#: core/validators.py:185
+#: core/validators.py:189
#, python-format
msgid "The URL %s does not point to a valid image."
msgstr "L'URL %s ne pointe pas vers une image valide."
-#: core/validators.py:189
+#: core/validators.py:193
#, python-format
msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
msgstr ""
"Les numéros de téléphone doivent être au format XXX-XXX-XXXX. \"%s\" est "
"incorrect."
-#: core/validators.py:197
+#: core/validators.py:201
#, python-format
msgid "The URL %s does not point to a valid QuickTime video."
msgstr "L'URL %s ne pointe pas vers une vidéo QuickTime valide."
-#: core/validators.py:201
+#: core/validators.py:205
msgid "A valid URL is required."
msgstr "Une URL valide est requise."
-#: core/validators.py:215
+#: core/validators.py:219
#, python-format
msgid ""
"Valid HTML is required. Specific errors are:\n"
"%s"
msgstr ""
-"Du HTML valide est requis. Les erreurs sont les suivantes&amp;nbsp;:\n"
+"Du HTML valide est requis. Les erreurs sont les suivantes :\n"
"%s"
-#: core/validators.py:222
+#: core/validators.py:226
#, python-format
msgid "Badly formed XML: %s"
-msgstr "XML mal formé&amp;nbsp;: %s"
+msgstr "XML mal formé : %s"
-#: core/validators.py:239
+#: core/validators.py:243
#, python-format
msgid "Invalid URL: %s"
-msgstr "URL invalide&amp;nbsp;: %s"
+msgstr "URL invalide : %s"
-#: core/validators.py:244 core/validators.py:246
+#: core/validators.py:248 core/validators.py:250
#, python-format
msgid "The URL %s is a broken link."
msgstr "L'URL %s est un lien cassé."
-#: core/validators.py:252
+#: core/validators.py:256
msgid "Enter a valid U.S. state abbreviation."
-msgstr "Entrez une abréviation d'état américain valide."
+msgstr "Entrez une abréviation d'État Américain valide."
-#: core/validators.py:266
+#: core/validators.py:270
#, 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] "Attention à votre langage ! Le mot %s n'est pas autorisé ici."
msgstr[1] "Attention à votre langage ! Les mots %s ne sont pas autorisés ici."
-#: core/validators.py:273
+#: core/validators.py:277
#, python-format
msgid "This field must match the '%s' field."
msgstr "Ce champ doit correspondre au champ '%s'."
-#: core/validators.py:292
+#: core/validators.py:296
msgid "Please enter something for at least one field."
-msgstr "Saisissez au moins une valeur dans un des champs s'il vous plaît."
+msgstr "Veuillez saisir quelque chose dans au moins un des champs."
-#: core/validators.py:301 core/validators.py:312
+#: core/validators.py:305 core/validators.py:316
msgid "Please enter both fields or leave them both empty."
-msgstr ""
-"Renseignez chacun des champs ou laissez les deux vides s'il vous plaît."
+msgstr "Veuillez renseigner les deux champs ou les laisser tous les deux vides."
-#: core/validators.py:320
+#: core/validators.py:324
#, python-format
msgid "This field must be given if %(field)s is %(value)s"
msgstr "Ce champ doit être renseigné si %(field)s vaut %(value)s"
-#: core/validators.py:333
+#: core/validators.py:337
#, python-format
msgid "This field must be given if %(field)s is not %(value)s"
msgstr "Ce champ doit être renseigné si %(field)s ne vaut pas %(value)s"
-#: core/validators.py:352
+#: core/validators.py:356
msgid "Duplicate values are not allowed."
-msgstr "Des valeurs identiques ne sont pas autorisées."
+msgstr "Les valeurs identiques ne sont pas autorisées."
-#: core/validators.py:367
+#: core/validators.py:371
#, python-format
msgid "This value must be between %(lower)s and %(upper)s."
msgstr "Cette valeur doit être comprise entre %(lower)s et %(upper)s."
-#: core/validators.py:369
+#: core/validators.py:373
#, python-format
msgid "This value must be at least %s."
msgstr "Cette valeur doit être au moins %s."
-#: core/validators.py:371
+#: core/validators.py:375
#, python-format
msgid "This value must be no more than %s."
msgstr "Cette valeur ne doit pas dépasser %s."
-#: core/validators.py:407
+#: core/validators.py:411
#, python-format
msgid "This value must be a power of %s."
msgstr "Cette valeur doit être une puissance de %s."
-#: core/validators.py:418
+#: core/validators.py:420
msgid "Please enter a valid decimal number."
-msgstr "Saisissez un nombre décimal valide s'il vous plaît."
+msgstr "Veuillez saisir un nombre décimal valide."
-#: core/validators.py:422
+#: core/validators.py:426
#, 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] ""
-"Saisissez un nombre décimal valide avec au plus %s chiffre s'il vous plaît."
+"Veuillez saisir un nombre décimal valide avec au plus %s chiffre."
msgstr[1] ""
-"Saisissez un nombre décimal valide avec au plus %s chiffres s'il vous plaît."
+"Veuillez saisir un nombre décimal valide avec au plus %s chiffres."
-#: core/validators.py:425
+#: core/validators.py:429
#, 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] "Veuillez saisir un nombre décimal valide avec au plus %s chiffre."
-msgstr[1] "Veuillez saisir un nombre décimal valide avec au plus %s chiffres."
+msgstr[0] "Veuillez saisir un nombre décimal valide avec une partie entière de %s chiffre au plus."
+msgstr[1] "Veuillez saisir un nombre décimal valide avec une partie entière de %s chiffres au plus."
-#: core/validators.py:428
+#: core/validators.py:432
#, python-format
msgid "Please enter a valid decimal number with at most %s decimal place."
msgid_plural ""
@@ -513,32 +527,36 @@ msgid_plural ""
msgstr[0] "Veuillez saisir un nombre décimal valide avec au plus %s décimale."
msgstr[1] "Veuillez saisir un nombre décimal valide avec au plus %s décimales."
-#: core/validators.py:438
+#: core/validators.py:440
+msgid "Please enter a valid floating point number."
+msgstr "Veuillez entrer un nombre à virgule flottante valide."
+
+#: core/validators.py:449
#, python-format
msgid "Make sure your uploaded file is at least %s bytes big."
msgstr ""
-"Vérifiez que le fichier transféré fait au moins une taille de %s octets."
+"Vérifiez que le fichier transféré fait au moins %s octets."
-#: core/validators.py:439
+#: core/validators.py:450
#, python-format
msgid "Make sure your uploaded file is at most %s bytes big."
msgstr ""
-"Vérifiez que le fichier transféré fait au plus une taille de %s octets."
+"Vérifiez que le fichier transféré fait au plus %s octets."
-#: core/validators.py:456
+#: core/validators.py:467
msgid "The format for this field is wrong."
msgstr "Le format de ce champ est mauvais."
-#: core/validators.py:471
+#: core/validators.py:482
msgid "This field is invalid."
msgstr "Ce champ est invalide."
-#: core/validators.py:507
+#: core/validators.py:518
#, python-format
msgid "Could not retrieve anything from %s."
msgstr "Impossible de récupérer quoi que ce soit depuis %s."
-#: core/validators.py:510
+#: core/validators.py:521
#, python-format
msgid ""
"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
@@ -546,16 +564,16 @@ msgstr ""
"L'entête Content-Type '%(contenttype)s', renvoyée par l'url %(url)s n'est "
"pas valide."
-#: core/validators.py:543
+#: core/validators.py:554
#, python-format
msgid ""
"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
"\"%(start)s\".)"
msgstr ""
-"Veuillez fermer le tag %(tag)s de la ligne %(line)s. (La ligne débutant par "
+"Veuillez fermer le tag %(tag)s à la ligne %(line)s. (Ligne débutant par "
"\"%(start)s\".)"
-#: core/validators.py:547
+#: core/validators.py:558
#, python-format
msgid ""
"Some text starting on line %(line)s is not allowed in that context. (Line "
@@ -564,7 +582,7 @@ msgstr ""
"Du texte commençant à la ligne %(line)s n'est pas autorisé dans ce contexte. "
"(Ligne débutant par \"%(start)s\".)"
-#: core/validators.py:552
+#: core/validators.py:563
#, python-format
msgid ""
"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
@@ -573,7 +591,7 @@ msgstr ""
"\"%(attr)s\" ligne %(line)s n'est pas un attribut valide. (Ligne débutant "
"par \"%(start)s\".)"
-#: core/validators.py:557
+#: core/validators.py:568
#, python-format
msgid ""
"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
@@ -582,7 +600,7 @@ msgstr ""
"\"<%(tag)s>\" ligne %(line)s n'est pas un tag valide. (Ligne débutant par \"%"
"(start)s\".)"
-#: core/validators.py:561
+#: core/validators.py:572
#, python-format
msgid ""
"A tag on line %(line)s is missing one or more required attributes. (Line "
@@ -591,7 +609,7 @@ msgstr ""
"Un tag, ou un ou plusieurs attributs, de la ligne %(line)s est manquant. "
"(Ligne débutant par \"%(start)s\".)"
-#: core/validators.py:566
+#: core/validators.py:577
#, python-format
msgid ""
"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
@@ -615,64 +633,83 @@ msgstr "L'objet %(verbose_name)s a été mis à jour avec succès."
msgid "The %(verbose_name)s was deleted."
msgstr "L'objet %(verbose_name)s a été supprimé."
-#: newforms/models.py:165 newforms/fields.py:362
+#: newforms/models.py:175 newforms/fields.py:432
msgid "Select a valid choice. That choice is not one of the available choices."
msgstr ""
"Sélectionnez un choix valide. Ce choix ne fait pas partie de ceux "
"disponibles."
-#: newforms/models.py:182 newforms/fields.py:380 newforms/fields.py:456
+#: newforms/models.py:192 newforms/fields.py:448 newforms/fields.py:527
msgid "Enter a list of values."
-msgstr "Entrez une liste de valeur."
+msgstr "Entrez une liste de valeurs."
-#: newforms/models.py:188 newforms/fields.py:389
+#: newforms/models.py:198 newforms/fields.py:457
#, python-format
msgid "Select a valid choice. %s is not one of the available choices."
-msgstr "Sélectionnez un choix valide ; %s n'en fait pas partie."
+msgstr "Sélectionnez un choix valide; %s n'en fait pas partie."
-#: newforms/fields.py:103 newforms/fields.py:256
+#: newforms/fields.py:110 newforms/fields.py:324
#, python-format
msgid "Ensure this value has at most %d characters."
-msgstr "Assurez-vous que cette valeur fait moins de %d caractère."
+msgstr "Assurez-vous que cette valeur fait moins de %d caractères."
-#: newforms/fields.py:105 newforms/fields.py:258
+#: newforms/fields.py:112 newforms/fields.py:326
#, python-format
msgid "Ensure this value has at least %d characters."
-msgstr "Assurez-vous que cette valeur fait au moins %d caractère."
+msgstr "Assurez-vous que cette valeur fait plus de %d caractères."
-#: newforms/fields.py:130
+#: newforms/fields.py:137 newforms/fields.py:160 newforms/fields.py:192
#, python-format
msgid "Ensure this value is less than or equal to %s."
-msgstr "Assurez-vous que cette valeur soit plus petite ou égale à %s."
+msgstr "Assurez-vous que cette valeur soit inférieure ou égale à %s."
-#: newforms/fields.py:132
+#: newforms/fields.py:139 newforms/fields.py:162 newforms/fields.py:194
#, python-format
msgid "Ensure this value is greater than or equal to %s."
-msgstr "Assurez-vous que cette valeur soit plus grande ou égale à %s."
+msgstr "Assurez-vous que cette valeur soit supérieure ou égale à %s."
+
+#: newforms/fields.py:158 newforms/fields.py:186
+msgid "Enter a number."
+msgstr "Entrez un nombre."
+
+#: newforms/fields.py:196
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Assurez-vous qu'il n'y a pas plus de %s chiffres au total."
+
+#: newforms/fields.py:198
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Assurez-vous qu'il n'y a pas plus de %s chiffres après la virgule."
+
+#: newforms/fields.py:200
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Assurez-vous qu'il n'y a pas plus de %s chiffres avant la virgule."
-#: newforms/fields.py:165
+#: newforms/fields.py:233 newforms/fields.py:567
msgid "Enter a valid date."
msgstr "Entrez une date valide."
-#: newforms/fields.py:192
+#: newforms/fields.py:260 newforms/fields.py:569
msgid "Enter a valid time."
msgstr "Entrez une heure valide."
-#: newforms/fields.py:228
+#: newforms/fields.py:296
msgid "Enter a valid date/time."
msgstr "Entrez une date et une heure valides."
-#: newforms/fields.py:242
+#: newforms/fields.py:310
msgid "Enter a valid value."
msgstr "Entrez une valeur valide."
-#: newforms/fields.py:289 newforms/fields.py:311
+#: newforms/fields.py:357 newforms/fields.py:379
msgid "Enter a valid URL."
msgstr "Entrez une URL valide."
-#: newforms/fields.py:313
+#: newforms/fields.py:381
msgid "This URL appears to be a broken link."
-msgstr "L'URL est un lien cassé."
+msgstr "Cette URL semble être cassée."
#: contrib/humanize/templatetags/humanize.py:17
msgid "th"
@@ -756,8 +793,8 @@ msgid ""
"This should be an absolute path, excluding the domain name. Example: '/"
"events/search/'."
msgstr ""
-"Ceci doit être un chemin absolu, sans nom de domaine. Par exemple: '/events/"
-"search/'."
+"Ceci doit être un chemin absolu, sans nom de domaine. Par exemple: '/evenements/"
+"rechercher/'."
#: contrib/redirects/models.py:9
msgid "redirect to"
@@ -836,7 +873,7 @@ msgstr "date et heure soumises"
msgid "is public"
msgstr "est public"
-#: contrib/comments/models.py:85 contrib/admindocs/views.py:304
+#: contrib/comments/models.py:85 contrib/admindocs/views.py:305
msgid "IP address"
msgstr "adresse IP"
@@ -877,7 +914,7 @@ msgstr ""
#: contrib/comments/models.py:158
msgid "person's name"
-msgstr "nom"
+msgstr "nom de la personne"
#: contrib/comments/models.py:161
msgid "ip address"
@@ -961,25 +998,25 @@ msgstr "suppressions de modérateur"
msgid "Moderator deletion by %r"
msgstr "Suppression de modérateur par %r"
-#: contrib/comments/views/karma.py:19
+#: contrib/comments/views/karma.py:20
msgid "Anonymous users cannot vote"
msgstr "Les utilisateurs anonymes ne peuvent pas voter"
-#: contrib/comments/views/karma.py:23
+#: contrib/comments/views/karma.py:24
msgid "Invalid comment ID"
-msgstr "ID de commentaire invalide"
+msgstr "Identifiant de commentaire invalide"
-#: contrib/comments/views/karma.py:25
+#: contrib/comments/views/karma.py:26
msgid "No voting for yourself"
msgstr "Impossible de voter pour soi-même"
-#: contrib/comments/views/comments.py:27
+#: contrib/comments/views/comments.py:28
msgid ""
"This rating is required because you've entered at least one other rating."
msgstr ""
-"Ce votre est nécéssaire parceque vous avez saisi au moins un autre vote."
+"Ce vote est nécessaire car vous avez saisi au moins un autre vote."
-#: contrib/comments/views/comments.py:111
+#: contrib/comments/views/comments.py:112
#, python-format
msgid ""
"This comment was posted by a user who has posted fewer than %(count)s "
@@ -993,67 +1030,67 @@ msgid_plural ""
"%(text)s"
msgstr[0] ""
"Ce commentaire a été posté par un utilisateur qui a posté moins de %(count)s "
-"commentaire&amp;nbsp;:\n"
+"commentaire :\n"
"\n"
"%(text)s"
msgstr[1] ""
"Ce commentaire a été posté par un utilisateur qui a posté moins de %(count)s "
-"commentaires&amp;nbsp;:\n"
+"commentaires :\n"
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:116
+#: contrib/comments/views/comments.py:117
#, python-format
msgid ""
"This comment was posted by a sketchy user:\n"
"\n"
"%(text)s"
msgstr ""
-"Ce commentaire a été posté par un utilisateur imprécis&amp;nbsp;:\n"
+"Ce commentaire a été posté par un utilisateur imprécis :\n"
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:188
-#: contrib/comments/views/comments.py:280
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:281
msgid "Only POSTs are allowed"
msgstr "Seuls les POSTs sont autorisés"
-#: contrib/comments/views/comments.py:192
-#: contrib/comments/views/comments.py:284
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:285
msgid "One or more of the required fields wasn't submitted"
msgstr "Un ou plusieurs champs requis n'ont pas été remplis"
-#: contrib/comments/views/comments.py:196
-#: contrib/comments/views/comments.py:286
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:287
msgid "Somebody tampered with the comment form (security violation)"
msgstr ""
"Quelqu'un a trafiqué le formulaire de commentaire (violation des règles de "
"sécurité)"
-#: contrib/comments/views/comments.py:206
-#: contrib/comments/views/comments.py:292
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:293
msgid ""
"The comment form had an invalid 'target' parameter -- the object ID was "
"invalid"
msgstr ""
-"Ce formulaire de commentaire avait un paramètre cible invalide ; l'ID de "
+"Ce formulaire de commentaire avait un paramètre cible invalide; l'identifiant de "
"l'objet était invalide"
-#: contrib/comments/views/comments.py:257
-#: contrib/comments/views/comments.py:321
+#: contrib/comments/views/comments.py:258
+#: contrib/comments/views/comments.py:322
msgid "The comment form didn't provide either 'preview' or 'post'"
msgstr ""
-"Le formulaire de commentaire ne proposait ni les options de prévisualisation "
-"ni d'envoi"
+"Le formulaire de commentaire ne proposait ni la prévisualisation "
+"ni l'envoi"
#: contrib/comments/templates/comments/freeform.html:4
msgid "Your name:"
-msgstr "Votre nom&amp;nbsp;:"
+msgstr "Votre nom :"
#: contrib/comments/templates/comments/freeform.html:5
#: contrib/comments/templates/comments/form.html:28
msgid "Comment:"
-msgstr "Commentaire&amp;nbsp;:"
+msgstr "Commentaire :"
#: contrib/comments/templates/comments/freeform.html:10
#: contrib/comments/templates/comments/form.html:35
@@ -1095,7 +1132,7 @@ msgstr "Mot de passe"
#: contrib/comments/templates/comments/form.html:8
msgid "Forgotten your password?"
-msgstr "Mot de passe oublié?"
+msgstr "Mot de passe oublié ?"
#: contrib/comments/templates/comments/form.html:12
msgid "Ratings"
@@ -1131,65 +1168,65 @@ msgstr "site"
msgid "sites"
msgstr "sites"
-#: contrib/admin/filterspecs.py:40
+#: contrib/admin/filterspecs.py:42
#, python-format
msgid ""
"<h3>By %s:</h3>\n"
"<ul>\n"
msgstr ""
-"<h3>Par %s&amp;nbsp;:</h3>\n"
+"<h3>Par %s&nbsp;:</h3>\n"
"<ul>\n"
-#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
-#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
+#: contrib/admin/filterspecs.py:72 contrib/admin/filterspecs.py:90
+#: contrib/admin/filterspecs.py:145 contrib/admin/filterspecs.py:171
msgid "All"
msgstr "Tout"
-#: contrib/admin/filterspecs.py:109
+#: contrib/admin/filterspecs.py:111
msgid "Any date"
msgstr "Toutes les dates"
-#: contrib/admin/filterspecs.py:110
+#: contrib/admin/filterspecs.py:112
msgid "Today"
msgstr "Aujourd'hui"
-#: contrib/admin/filterspecs.py:113
+#: contrib/admin/filterspecs.py:115
msgid "Past 7 days"
msgstr "Les 7 derniers jours"
-#: contrib/admin/filterspecs.py:115
+#: contrib/admin/filterspecs.py:117
msgid "This month"
msgstr "Ce mois-ci"
-#: contrib/admin/filterspecs.py:117
+#: contrib/admin/filterspecs.py:119
msgid "This year"
msgstr "Cette année"
-#: contrib/admin/options.py:307 contrib/admin/views/auth.py:19
+#: contrib/admin/options.py:323 contrib/admin/views/auth.py:20
#, python-format
msgid "The %(name)s \"%(obj)s\" was added successfully."
msgstr "L'objet %(name)s \"%(obj)s\" a été ajouté avec succès."
-#: contrib/admin/options.py:311 contrib/admin/options.py:363
-#: contrib/admin/views/auth.py:24
+#: contrib/admin/options.py:327 contrib/admin/options.py:385
+#: contrib/admin/views/auth.py:25
msgid "You may edit it again below."
msgstr "Vous pouvez continuez de l'éditez ci-dessous."
-#: contrib/admin/options.py:321 contrib/admin/options.py:372
+#: contrib/admin/options.py:337 contrib/admin/options.py:394
#, python-format
msgid "You may add another %s below."
msgstr "Vous pouvez ajouter un autre %s ci-dessous."
-#: contrib/admin/options.py:358
+#: contrib/admin/options.py:380
msgid "No fields changed."
msgstr "Aucun champ modifié."
-#: contrib/admin/options.py:361
+#: contrib/admin/options.py:383
#, python-format
msgid "The %(name)s \"%(obj)s\" was changed successfully."
msgstr "L'objet %(name)s \"%(obj)s\" a été modifié avec succès."
-#: contrib/admin/options.py:369
+#: contrib/admin/options.py:391
#, python-format
msgid ""
"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
@@ -1197,69 +1234,69 @@ msgstr ""
"L'objet %(name)s \"%(obj)s\" a été ajouté avec succès.Vous pouvez continuez "
"de l'éditez ci-dessous."
-#: contrib/admin/options.py:408
+#: contrib/admin/options.py:437
#, python-format
msgid "Add %s"
msgstr "Ajouter %s"
-#: contrib/admin/options.py:468
+#: contrib/admin/options.py:504
#, python-format
msgid "Change %s"
msgstr "Changement %s"
-#: contrib/admin/options.py:494
+#: contrib/admin/options.py:531
msgid "Database error"
msgstr "Erreur de base de données"
-#: contrib/admin/options.py:539
+#: contrib/admin/options.py:576
#, python-format
msgid "The %(name)s \"%(obj)s\" was deleted successfully."
msgstr "L'objet %(name)s \"%(obj)s\" a été supprimé avec succès."
-#: contrib/admin/options.py:542
+#: contrib/admin/options.py:579
msgid "Are you sure?"
msgstr "Êtes-vous sûr ?"
-#: contrib/admin/options.py:564
+#: contrib/admin/options.py:601
#, python-format
msgid "Change history: %s"
-msgstr "Historique des changements&amp;nbsp;: %s"
+msgstr "Historique des changements : %s"
-#: contrib/admin/models.py:16
+#: contrib/admin/models.py:17
msgid "action time"
msgstr "heure de l'action"
-#: contrib/admin/models.py:19
+#: contrib/admin/models.py:20
msgid "object id"
msgstr "id de l'objet"
-#: contrib/admin/models.py:20
+#: contrib/admin/models.py:21
msgid "object repr"
msgstr "représentation de l'objet"
-#: contrib/admin/models.py:21
+#: contrib/admin/models.py:22
msgid "action flag"
msgstr "indicateur de l'action"
-#: contrib/admin/models.py:22
+#: contrib/admin/models.py:23
msgid "change message"
msgstr "message de modification"
-#: contrib/admin/models.py:25
+#: contrib/admin/models.py:26
msgid "log entry"
msgstr "entrée d'historique"
-#: contrib/admin/models.py:26
+#: contrib/admin/models.py:27
msgid "log entries"
msgstr "entrées d'historique"
-#: contrib/admin/widgets.py:43
+#: contrib/admin/widgets.py:44
msgid "Date:"
-msgstr "Date&amp;nbsp;:"
+msgstr "Date :"
-#: contrib/admin/widgets.py:43
+#: contrib/admin/widgets.py:44
msgid "Time:"
-msgstr "Heure&amp;nbsp;:"
+msgstr "Heure :"
#: contrib/admin/sites.py:13 contrib/admin/views/decorators.py:10
#: contrib/auth/forms.py:60
@@ -1267,7 +1304,7 @@ msgid ""
"Please enter a correct username and password. Note that both fields are case-"
"sensitive."
msgstr ""
-"Saisissez s'il vous plaît un nom d'utilisateur et un mot de passe valide. "
+"Veuillez saisir un nom d'utilisateur et un mot de passe valide. "
"Remarquez que chacun de ces champs est sensible à la casse (différenciation "
"des majuscules/minuscules)."
@@ -1281,16 +1318,16 @@ msgid ""
"Please log in again, because your session has expired. Don't worry: Your "
"submission has been saved."
msgstr ""
-"Votre session a expiré, connectez-vous de nouveau s'il vous plaît. Ne vous "
-"inquiétez pas, votre travail précédement éffectué a été sauvé."
+"Veuillez vous reconnecter, car votre session a expiré. Ne vous "
+"inquiétez pas, votre soumission a été enregistrée."
#: contrib/admin/sites.py:193 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 ""
-"Il semblerait que votre navigateur n'accepte pas les cookies. Activez-les, "
-"rechargez cette page et rééssayez s'il vous plaît."
+"Il semblerait que votre navigateur n'accepte pas les cookies. Veuillez"
+"les activer, recharger cette page, puis rééssayer."
#: contrib/admin/sites.py:207 contrib/admin/views/decorators.py:83
msgid "Usernames cannot contain the '@' character."
@@ -1302,54 +1339,54 @@ msgid "Your e-mail address is not your username. Try '%s' instead."
msgstr ""
"Votre courriel n'est pas votre nom d'utilisateur. Essayez '%s' à la place."
-#: contrib/admin/sites.py:263 contrib/admin/views/main.py:136
+#: contrib/admin/sites.py:276 contrib/admin/views/main.py:143
msgid "Site administration"
msgstr "Gestion du site"
-#: contrib/admin/templatetags/admin_list.py:247
+#: contrib/admin/templatetags/admin_list.py:252
msgid "All dates"
msgstr "Toutes les dates"
-#: contrib/admin/views/auth.py:30
+#: contrib/admin/views/auth.py:31
msgid "Add user"
msgstr "Ajouter l'utilisateur"
-#: contrib/admin/views/auth.py:55
+#: contrib/admin/views/auth.py:56
msgid "Password changed successfully."
msgstr "Mot de passe modifié avec succés"
-#: contrib/admin/views/auth.py:62
+#: contrib/admin/views/auth.py:63
#, python-format
msgid "Change password: %s"
-msgstr "Modifier le mot de passe&amp;nbsp;: %s"
+msgstr "Modifier le mot de passe : %s"
-#: contrib/admin/views/main.py:215
+#: contrib/admin/views/main.py:222
#, python-format
msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
-msgstr "Un ou plusieurs %(fieldname)s dans %(name)s&amp;nbsp;: %(obj)s"
+msgstr "Un ou plusieurs %(fieldname)s dans %(name)s : %(obj)s"
-#: contrib/admin/views/main.py:220
+#: contrib/admin/views/main.py:227
#, python-format
msgid "One or more %(fieldname)s in %(name)s:"
-msgstr "Un ou plusieurs %(fieldname)s dans %(name)s&amp;nbsp;: "
+msgstr "Un ou plusieurs %(fieldname)s dans %(name)s :"
-#: contrib/admin/views/main.py:262
+#: contrib/admin/views/main.py:269
#, python-format
msgid "Select %s"
msgstr "Sélectionnez %s"
-#: contrib/admin/views/main.py:262
+#: contrib/admin/views/main.py:269
#, python-format
msgid "Select %s to change"
msgstr "Sélectionnez %s pour changer"
#: contrib/admin/templates/widget/file.html:2
msgid "Currently:"
-msgstr "Actuellement&amp;nbsp;:"
+msgstr "Actuellement :"
#: contrib/admin/templates/widget/file.html:3
msgid "Change:"
-msgstr "Modification&amp;nbsp;:"
+msgstr "Modification :"
#: contrib/admin/templates/admin/object_history.html:4
#: contrib/admin/templates/admin/change_list.html:8
@@ -1465,7 +1502,7 @@ msgid ""
msgstr ""
"Une erreur est survenue. Elle a été transmise par courriel aux "
"administrateurs du site et sera corrigée dans les meilleurs délais. Merci "
-"pour votre patience."
+"de votre patience."
#: contrib/admin/templates/admin/invalid_setup.html:7
msgid ""
@@ -1473,8 +1510,8 @@ msgid ""
"database tables have been created, and make sure the database is readable by "
"the appropriate user."
msgstr ""
-"Quelque chose ne va pas avec votre base de données. Vérifiez que lesbonnes "
-"bases ont été créées, et qu'elle est lisible par le bon utilisateur."
+"Quelque chose ne va pas avec votre base de données. Vérifiez que les bonnes "
+"tables ont été créées, et que la base est lisible par le bon utilisateur."
#: contrib/admin/templates/admin/search_form.html:8
msgid "Go"
@@ -1577,7 +1614,7 @@ msgid ""
msgstr ""
"Supprimer l'objet %(object_name)s '%(escaped_object)s' provoquerait la "
"suppression des objets qui lui sont liés mais votre compte ne possède pas la "
-"permission de supprimer les types d'objets suivants&amp;nbsp;:"
+"permission de supprimer les types d'objets suivants :"
#: contrib/admin/templates/admin/delete_confirmation.html:24
#, python-format
@@ -1587,7 +1624,7 @@ msgid ""
msgstr ""
"Êtes vous certain de vouloir supprimer l'objet %(object_name)s \"%"
"(escaped_object)s\" ? Les éléments suivant sont liés à celui-ci et seront "
-"aussi supprimés&amp;nbsp;:"
+"aussi supprimés :"
#: contrib/admin/templates/admin/delete_confirmation.html:29
msgid "Yes, I'm sure"
@@ -1636,7 +1673,7 @@ msgid ""
"First, enter a username and password. Then, you'll be able to edit more user "
"options."
msgstr ""
-"Entrez tout d'abord un nom d'utilisateur et un mot de passe.Vous pourrez "
+"Entrez tout d'abord un nom d'utilisateur et un mot de passe. Vous pourrez "
"ensuite modifier plus d'options."
#: contrib/admin/templates/admin/auth/user/add_form.html:12
@@ -1677,7 +1714,7 @@ msgstr ""
#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "E-mail address:"
-msgstr "Courriel&amp;nbsp;:"
+msgstr "Courriel :"
#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "Reset my password"
@@ -1715,15 +1752,15 @@ msgstr ""
#: contrib/admin/templates/registration/password_change_form.html:17
msgid "Old password:"
-msgstr "Ancien mot de passe&amp;nbsp;:"
+msgstr "Ancien mot de passe :"
#: contrib/admin/templates/registration/password_change_form.html:19
msgid "New password:"
-msgstr "Nouveau mot de passe&amp;nbsp;:"
+msgstr "Nouveau mot de passe :"
#: contrib/admin/templates/registration/password_change_form.html:21
msgid "Confirm password:"
-msgstr "Confirmation du nouveau mot de passe"
+msgstr "Confirmation du mot de passe"
#: contrib/admin/templates/registration/password_change_form.html:23
msgid "Change my password"
@@ -1742,15 +1779,15 @@ msgstr "pour votre compte au site %(site_name)s"
#: contrib/admin/templates/registration/password_reset_email.html:5
#, python-format
msgid "Your new password is: %(new_password)s"
-msgstr "Votre nouveau mot de passe est&amp;nbsp;: %(new_password)s"
+msgstr "Votre nouveau mot de passe est : %(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 "Vous pouvez modifier ce mot de passe à l'adresse suivante&amp;nbsp;:"
+msgstr "Vous pouvez modifier ce mot de passe à l'adresse suivante :"
#: contrib/admin/templates/registration/password_reset_email.html:11
msgid "Your username, in case you've forgotten:"
-msgstr "Votre nom d'utilisateur, en cas d'oubli&amp;nbsp;:"
+msgstr "Votre nom d'utilisateur, en cas d'oubli :"
#: contrib/admin/templates/registration/password_reset_email.html:13
msgid "Thanks for using our site!"
@@ -1780,10 +1817,9 @@ msgid ""
"your computer is \"internal\").</p>\n"
msgstr ""
"\n"
-"<p class=\"help\">Pour installer des bookmarklets, faîtes glisser le lien "
-"vers\n"
+"<p class=\"help\">Pour installer des signets, faîtes glisser le lien vers\n"
"votre barre de marques-pages, ou cliquez droit dessus et ajoutez-y le.\n"
-"Maintenant vous pouvez le sélectionner depuis n'importe quelle page\n"
+"Maintenant, vous pouvez le sélectionner depuis n'importe quelle page\n"
"du site. Notez que certains d'entre eux nécessitent que vous visionniez\n"
"le site depuis un ordinateur dit \"interne\" (veuillez contacter votre\n"
"administrateur système si vous n'êtes pas sûr que votre ordinateur le soit)."
@@ -1803,14 +1839,14 @@ msgstr ""
#: contrib/admin/templates/admin_doc/bookmarklets.html:22
msgid "Show object ID"
-msgstr "Afficher l'ID de l'objet"
+msgstr "Afficher l'identifiant de l'objet"
#: contrib/admin/templates/admin_doc/bookmarklets.html:23
msgid ""
"Shows the content-type and unique ID for pages that represent a single "
"object."
msgstr ""
-"Montre le content-type et l'ID unique pour les pages qui représente un objet "
+"Montre le content-type et l'identifiant unique pour les pages qui représentent un objet "
"unique."
#: contrib/admin/templates/admin_doc/bookmarklets.html:25
@@ -1831,75 +1867,75 @@ msgstr ""
"Comme ci-dessus, mais ouvre la page d'administration dans une nouvelle "
"fenêtre."
-#: contrib/contenttypes/models.py:36
+#: contrib/contenttypes/models.py:37
msgid "python model class name"
msgstr "nom du module python"
-#: contrib/contenttypes/models.py:39
+#: contrib/contenttypes/models.py:40
msgid "content type"
msgstr "type de contenu"
-#: contrib/contenttypes/models.py:40
+#: contrib/contenttypes/models.py:41
msgid "content types"
msgstr "types de contenu"
-#: contrib/auth/views.py:39
+#: contrib/auth/views.py:41
msgid "Logged out"
msgstr "Déconnecté"
-#: contrib/auth/models.py:38 contrib/auth/models.py:58
+#: contrib/auth/models.py:51 contrib/auth/models.py:71
msgid "name"
msgstr "nom"
-#: contrib/auth/models.py:40
+#: contrib/auth/models.py:53
msgid "codename"
msgstr "nom de code"
-#: contrib/auth/models.py:43
+#: contrib/auth/models.py:56
msgid "permission"
msgstr "permission"
-#: contrib/auth/models.py:44 contrib/auth/models.py:59
+#: contrib/auth/models.py:57 contrib/auth/models.py:72
msgid "permissions"
msgstr "permissions"
-#: contrib/auth/models.py:62
+#: contrib/auth/models.py:75
msgid "group"
msgstr "groupe"
-#: contrib/auth/models.py:63 contrib/auth/models.py:100
+#: contrib/auth/models.py:76 contrib/auth/models.py:113
msgid "groups"
msgstr "groupes"
-#: contrib/auth/models.py:90
+#: contrib/auth/models.py:103
msgid "username"
msgstr "nom d'utilisateur"
-#: contrib/auth/models.py:90
+#: contrib/auth/models.py:103
msgid ""
"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
"digits and underscores)."
msgstr ""
"Requis. 30 caractères maximum, alphanumériques uniquement (lettres, "
-"chiffres, et tirets bas '_')."
+"chiffres, et tirets bas _)."
-#: contrib/auth/models.py:91
+#: contrib/auth/models.py:104
msgid "first name"
msgstr "prénom"
-#: contrib/auth/models.py:92
+#: contrib/auth/models.py:105
msgid "last name"
msgstr "nom"
-#: contrib/auth/models.py:93
+#: contrib/auth/models.py:106
msgid "e-mail address"
msgstr "courriel"
-#: contrib/auth/models.py:94
+#: contrib/auth/models.py:107
msgid "password"
msgstr "mot de passe"
-#: contrib/auth/models.py:94
+#: contrib/auth/models.py:107
msgid ""
"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
"password form</a>."
@@ -1907,31 +1943,31 @@ msgstr ""
"Utilisez [algo]$[salt]$[hexdigest]' ou le <a href=\"password/\">formulaire "
"de changement de mot de passe</a>."
-#: contrib/auth/models.py:95
+#: contrib/auth/models.py:108
msgid "staff status"
msgstr "statut équipe"
-#: contrib/auth/models.py:95
+#: contrib/auth/models.py:108
msgid "Designates whether the user can log into this admin site."
msgstr "Précise si l'utilisateur peut se connecter à ce site d'administration."
-#: contrib/auth/models.py:96
+#: contrib/auth/models.py:109
msgid "active"
msgstr "actif"
-#: contrib/auth/models.py:96
+#: contrib/auth/models.py:109
msgid ""
"Designates whether this user can log into the Django admin. Unselect this "
"instead of deleting accounts."
msgstr ""
"Précise si l'utilisateur peut se connecter à l'administration. "
-"Déselectionnezceci plutôt que supprimer le compte."
+"Déselectionnez ceci plutôt que supprimer le compte."
-#: contrib/auth/models.py:97
+#: contrib/auth/models.py:110
msgid "superuser status"
msgstr "statut super-utilisateur"
-#: contrib/auth/models.py:97
+#: contrib/auth/models.py:110
msgid ""
"Designates that this user has all permissions without explicitly assigning "
"them."
@@ -1939,15 +1975,15 @@ msgstr ""
"Précise que l'utilisateur possède toutes les permissions sans les assigner "
"explicitement."
-#: contrib/auth/models.py:98
+#: contrib/auth/models.py:111
msgid "last login"
msgstr "dernière connexion"
-#: contrib/auth/models.py:99
+#: contrib/auth/models.py:112
msgid "date joined"
msgstr "date d'inscription"
-#: contrib/auth/models.py:101
+#: contrib/auth/models.py:114
msgid ""
"In addition to the permissions manually assigned, this user will also get "
"all permissions granted to each group he/she is in."
@@ -1956,39 +1992,35 @@ msgstr ""
"recevra aussi toutes les permissions de tous les groupes auquels il "
"appartient. "
-#: contrib/auth/models.py:102
+#: contrib/auth/models.py:115
msgid "user permissions"
msgstr "permissions de l'utilisateur"
-#: contrib/auth/models.py:106
+#: contrib/auth/models.py:119
msgid "user"
msgstr "utilisateur"
-#: contrib/auth/models.py:107
+#: contrib/auth/models.py:120
msgid "users"
msgstr "utilisateurs"
-#: contrib/auth/models.py:248
+#: contrib/auth/models.py:259
msgid "message"
msgstr "message"
-#: contrib/auth/models.py:261
-msgid "AnonymousUser"
-msgstr "Anonyme"
-
-#: contrib/auth/models.py:320
+#: contrib/auth/models.py:334
msgid "Personal info"
msgstr "Information personnelle"
-#: contrib/auth/models.py:321
+#: contrib/auth/models.py:335
msgid "Permissions"
msgstr "Permissions"
-#: contrib/auth/models.py:322
+#: contrib/auth/models.py:336
msgid "Important dates"
msgstr "Dates importantes"
-#: contrib/auth/models.py:323
+#: contrib/auth/models.py:337
msgid "Groups"
msgstr "Groupes"
@@ -2012,7 +2044,7 @@ msgstr ""
msgid "This account is inactive."
msgstr "Ce compte est inactif."
-#: contrib/auth/forms.py:85
+#: contrib/auth/forms.py:84
msgid ""
"That e-mail address doesn't have an associated user account. Are you sure "
"you've registered?"
@@ -2022,140 +2054,140 @@ msgstr ""
#: contrib/auth/forms.py:117
msgid "The two 'new password' fields didn't match."
-msgstr "Les deux nouveaux mots de passe ne correspondent pas."
+msgstr "Les deux champs \"nouveau mot de passe\" ne correspondent pas."
#: contrib/auth/forms.py:124
msgid "Your old password was entered incorrectly. Please enter it again."
msgstr "Votre ancien mot de passe est incorrect. Veuillez le rectifier."
-#: contrib/admindocs/views.py:46 contrib/admindocs/views.py:48
-#: contrib/admindocs/views.py:50
+#: contrib/admindocs/views.py:47 contrib/admindocs/views.py:49
+#: contrib/admindocs/views.py:51
msgid "tag:"
-msgstr "mot-clé&amp;nbsp;:"
+msgstr "mot-clé :"
-#: contrib/admindocs/views.py:77 contrib/admindocs/views.py:79
-#: contrib/admindocs/views.py:81
+#: contrib/admindocs/views.py:78 contrib/admindocs/views.py:80
+#: contrib/admindocs/views.py:82
msgid "filter:"
-msgstr "filtre&amp;nbsp;:"
+msgstr "filtre :"
-#: contrib/admindocs/views.py:135 contrib/admindocs/views.py:137
-#: contrib/admindocs/views.py:139
+#: contrib/admindocs/views.py:136 contrib/admindocs/views.py:138
+#: contrib/admindocs/views.py:140
msgid "view:"
-msgstr "vue&amp;nbsp;:"
+msgstr "vue :"
-#: contrib/admindocs/views.py:164
+#: contrib/admindocs/views.py:165
#, python-format
msgid "App %r not found"
msgstr "L'application %r n'a pas été trouvée."
-#: contrib/admindocs/views.py:171
+#: contrib/admindocs/views.py:172
#, python-format
msgid "Model %(name)r not found in app %(app)r"
msgstr "Le modèle %(name)r n'a pas été trouvé dans l'application %(app)r"
-#: contrib/admindocs/views.py:183
+#: contrib/admindocs/views.py:184
#, python-format
msgid "the related `%(app)s.%(type)s` object"
-msgstr "l'objet `%(app)s.%(type)s en relation "
+msgstr "l'objet `%(app)s.%(type)s` en relation "
-#: contrib/admindocs/views.py:183 contrib/admindocs/views.py:205
-#: contrib/admindocs/views.py:219 contrib/admindocs/views.py:224
+#: contrib/admindocs/views.py:184 contrib/admindocs/views.py:206
+#: contrib/admindocs/views.py:220 contrib/admindocs/views.py:225
msgid "model:"
-msgstr "modèle&amp;nbsp;:"
+msgstr "modèle :"
-#: contrib/admindocs/views.py:214
+#: contrib/admindocs/views.py:215
#, python-format
msgid "related `%(app)s.%(name)s` objects"
-msgstr "les objets `%(app)s.%(name)s en relation"
+msgstr "les objets `%(app)s.%(name)s` en relation"
-#: contrib/admindocs/views.py:219
+#: contrib/admindocs/views.py:220
#, python-format
msgid "all %s"
msgstr "tous les %s"
-#: contrib/admindocs/views.py:224
+#: contrib/admindocs/views.py:225
#, python-format
msgid "number of %s"
msgstr "nombre de %s"
-#: contrib/admindocs/views.py:229
+#: contrib/admindocs/views.py:230
#, python-format
msgid "Fields on %s objects"
msgstr "Champs sur les objets %s"
-#: contrib/admindocs/views.py:291 contrib/admindocs/views.py:301
-#: contrib/admindocs/views.py:303 contrib/admindocs/views.py:309
-#: contrib/admindocs/views.py:310 contrib/admindocs/views.py:312
+#: contrib/admindocs/views.py:292 contrib/admindocs/views.py:302
+#: contrib/admindocs/views.py:304 contrib/admindocs/views.py:310
+#: contrib/admindocs/views.py:311 contrib/admindocs/views.py:313
msgid "Integer"
msgstr "Entier"
-#: contrib/admindocs/views.py:292
+#: contrib/admindocs/views.py:293
msgid "Boolean (Either True or False)"
msgstr "Booléen (Vrai ou Faux)"
-#: contrib/admindocs/views.py:293 contrib/admindocs/views.py:311
+#: contrib/admindocs/views.py:294 contrib/admindocs/views.py:312
#, python-format
msgid "String (up to %(maxlength)s)"
msgstr "Chaîne de caractère (jusqu'à %(maxlength)s)"
-#: contrib/admindocs/views.py:294
+#: contrib/admindocs/views.py:295
msgid "Comma-separated integers"
msgstr "Des entiers séparés par une virgule"
-#: contrib/admindocs/views.py:295
+#: contrib/admindocs/views.py:296
msgid "Date (without time)"
msgstr "Date (sans l'heure)"
-#: contrib/admindocs/views.py:296
+#: contrib/admindocs/views.py:297
msgid "Date (with time)"
msgstr "Date (avec l'heure)"
-#: contrib/admindocs/views.py:297
+#: contrib/admindocs/views.py:298
msgid "E-mail address"
-msgstr "Courriel&amp;nbsp;:"
+msgstr "Courriel"
-#: contrib/admindocs/views.py:298 contrib/admindocs/views.py:299
-#: contrib/admindocs/views.py:302
+#: contrib/admindocs/views.py:299 contrib/admindocs/views.py:300
+#: contrib/admindocs/views.py:303
msgid "File path"
msgstr "Chemin vers le fichier"
-#: contrib/admindocs/views.py:300
+#: contrib/admindocs/views.py:301
msgid "Decimal number"
msgstr "Nombre décimal"
-#: contrib/admindocs/views.py:306
+#: contrib/admindocs/views.py:307
msgid "Boolean (Either True, False or None)"
msgstr "Booléen (Vrai, Faux ou None)"
-#: contrib/admindocs/views.py:307
+#: contrib/admindocs/views.py:308
msgid "Relation to parent model"
msgstr "Relation au modèle parent"
-#: contrib/admindocs/views.py:308
+#: contrib/admindocs/views.py:309
msgid "Phone number"
msgstr "Numéro de téléphone"
-#: contrib/admindocs/views.py:313
+#: contrib/admindocs/views.py:314
msgid "Text"
msgstr "Texte"
-#: contrib/admindocs/views.py:314
+#: contrib/admindocs/views.py:315
msgid "Time"
msgstr "Heure"
-#: contrib/admindocs/views.py:315 contrib/flatpages/models.py:7
+#: contrib/admindocs/views.py:316 contrib/flatpages/models.py:7
msgid "URL"
msgstr "URL"
-#: contrib/admindocs/views.py:316
+#: contrib/admindocs/views.py:317
msgid "U.S. state (two uppercase letters)"
-msgstr "État U.S. (deux lettres majuscules)"
+msgstr "État Américain (deux lettres majuscules)"
-#: contrib/admindocs/views.py:317
+#: contrib/admindocs/views.py:318
msgid "XML text"
msgstr "Texte XML"
-#: contrib/admindocs/views.py:343
+#: contrib/admindocs/views.py:344
#, python-format
msgid "%s does not appear to be a urlpattern object"
msgstr "%s ne semble pas être un objet urlpattern"
@@ -2170,7 +2202,7 @@ msgid "Enter a 4 digit post code."
msgstr "Entrez un code postal Australien (4 chiffres)."
#: contrib/localflavor/fr/forms.py:17 contrib/localflavor/de/forms.py:16
-#: contrib/localflavor/it/forms.py:14 contrib/localflavor/fi/forms.py:14
+#: contrib/localflavor/fi/forms.py:14
msgid "Enter a zip code in the format XXXXX."
msgstr "Entrez un code postal (format XXXXX)."
@@ -2374,6 +2406,26 @@ msgstr "Entrez un code postal Brésilien (format XXXXX-XXX)."
msgid "Phone numbers must be in XX-XXXX-XXXX format."
msgstr "Les numéros de téléphone doivent être au format XX-XXXX-XXXX."
+#: contrib/localflavor/br/forms.py:72
+msgid "This field requires only numbers."
+msgstr "Ce champ ne doit contenir que des nombres."
+
+#: contrib/localflavor/br/forms.py:74
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Ce champ requiert au plus 11 chiffres ou 14 caractères."
+
+#: contrib/localflavor/br/forms.py:84
+msgid "Invalid CPF number."
+msgstr "Numéro CPF invalide."
+
+#: contrib/localflavor/br/forms.py:106
+msgid "This field requires at least 14 digits"
+msgstr "Ce champ requiert au minimum 14 chiffres."
+
+#: contrib/localflavor/br/forms.py:116
+msgid "Invalid CNPJ number."
+msgstr "Numéro CNPJ invalide."
+
#: contrib/localflavor/de/de_states.py:5
msgid "Baden-Wuerttemberg"
msgstr "Bade-Wurtemberg"
@@ -2446,7 +2498,19 @@ msgstr ""
"Entrez un numéro de carte d'identité Allemand (format XXXXXXXXXXX-XXXXXXX-"
"XXXXXXX-X)."
-#: contrib/localflavor/no/forms.py:15
+#: contrib/localflavor/it/forms.py:16
+msgid "Enter a valid zip code."
+msgstr "Entrez un code postal valide."
+
+#: contrib/localflavor/it/forms.py:41
+msgid "Enter a valid Social Security number."
+msgstr "Entrez un numéro valide de Sécurité Sociale."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Entrez une TVA valide."
+
+#: contrib/localflavor/no/forms.py:15 contrib/localflavor/ch/forms.py:18
msgid "Enter a zip code in the format XXXX."
msgstr "Entrez un code postal Norvégien (format XXXX)."
@@ -2454,7 +2518,7 @@ msgstr "Entrez un code postal Norvégien (format XXXX)."
msgid "Enter a valid Norwegian social security number."
msgstr "Entrez un numéro de sécurité sociale Norvégien."
-#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:46
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
msgid "Enter a valid Finnish social security number."
msgstr "Entrez un numéro de sécurité sociale Finlandais."
@@ -2466,13 +2530,142 @@ msgstr "Entrez un code postal Américain (format XXXXX ou XXXXX-XXXX)."
msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
msgstr "Entrez un numéro de sécurité sociale Américain (format XXX-XX-XXXX)."
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Argovie"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Rhodes-Intérieures"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Rhodes-Extérieures"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Bâle-Ville"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "Bâle-Campagne"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "Berne"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "Fribourg"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Genève"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "Glaris"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "Grisons"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "Jura"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "Lucerne"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchâtel"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwald"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwald"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Schaffhouse"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "Suisse"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "Soleure"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "Saint Gall"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Thuringe"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "Tessin"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "Zoug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "Zurich"
+
+#: contrib/localflavor/ch/forms.py:90
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+"Entrez un numéro de passeport ou de carte d'identité valide au format "
+"X1234567<0 ou 1234567890."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "Entrez un code postal islandais valide (format XXXXXX-XXXX)."
+
+#: contrib/localflavor/is_/forms.py:31
+msgid "The Icelandic identification number is not valid."
+msgstr "Le numéro d'identification Islandais est invalide."
+
+#: contrib/localflavor/cl/forms.py:22
+msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Entrez un RUT Chilien valide (format XX.XXX.XXX-X)."
+
+#: contrib/localflavor/cl/forms.py:27
+msgid "Enter valid a Chilean RUT"
+msgstr "Entrez un RUT Chilien valide."
+
#: contrib/sessions/models.py:68
msgid "session key"
msgstr "clé de session"
#: contrib/sessions/models.py:69
msgid "session data"
-msgstr "donnée de session"
+msgstr "données de session"
#: contrib/sessions/models.py:70
msgid "expire date"
@@ -2490,7 +2683,7 @@ msgstr "sessions"
msgid ""
"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
msgstr ""
-"Par exemple&amp;nbsp;: '/about/contact/'. Vérifiez la présence du caractère "
+"Par exemple : '/a_propos/contact/'. Vérifiez la présence du caractère "
"'/' en début et en fin de chaine."
#: contrib/flatpages/models.py:9
@@ -2529,11 +2722,11 @@ msgstr ""
#: contrib/flatpages/models.py:19
msgid "flat page"
-msgstr "page à plat"
+msgstr "page statique"
#: contrib/flatpages/models.py:20
msgid "flat pages"
-msgstr "pages à plat"
+msgstr "pages statiques"
#: utils/dates.py:6
msgid "Monday"
@@ -2563,127 +2756,155 @@ msgstr "Samedi"
msgid "Sunday"
msgstr "Dimanche"
-#: utils/dates.py:14
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "Lun"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "Mar"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "Mer"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "Jeu"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "Ven"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "Sam"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "Dim"
+
+#: utils/dates.py:18
msgid "January"
msgstr "Janvier"
-#: utils/dates.py:14
+#: utils/dates.py:18
msgid "February"
msgstr "Février"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "March"
msgstr "Mars"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "April"
msgstr "Avril"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "May"
msgstr "Mai"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "June"
msgstr "Juin"
-#: utils/dates.py:15 utils/dates.py:27
+#: utils/dates.py:19 utils/dates.py:31
msgid "July"
msgstr "Juillet"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "August"
msgstr "Août"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "September"
msgstr "Septembre"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "October"
msgstr "Octobre"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "November"
msgstr "Novembre"
-#: utils/dates.py:16
+#: utils/dates.py:20
msgid "December"
msgstr "Décembre"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "jan"
msgstr "jan"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "feb"
msgstr "fév"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "mar"
msgstr "mar"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "apr"
msgstr "avr"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "may"
msgstr "mai"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "jun"
msgstr "jui"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "jul"
msgstr "jul"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "aug"
msgstr "aout"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "sep"
msgstr "sep"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "oct"
msgstr "oct"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "nov"
msgstr "nov"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "dec"
msgstr "déc"
-#: utils/dates.py:27
+#: utils/dates.py:31
msgid "Jan."
msgstr "Jan."
-#: utils/dates.py:27
+#: utils/dates.py:31
msgid "Feb."
msgstr "Fév."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Aug."
msgstr "Aôut"
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Sept."
msgstr "Sept."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Oct."
msgstr "Oct."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Nov."
msgstr "Nov."
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Dec."
msgstr "Déc."
@@ -2723,78 +2944,96 @@ msgid_plural "minutes"
msgstr[0] "minute"
msgstr[1] "minutes"
-#: utils/dateformat.py:40
+#: utils/timesince.py:40
+#, python-format
+msgid "%d milliseconds"
+msgstr "%d millisecondes"
+
+#: utils/timesince.py:41
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:47
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/dateformat.py:41
msgid "p.m."
msgstr "après-midi"
-#: utils/dateformat.py:41
+#: utils/dateformat.py:42
msgid "a.m."
msgstr "matin"
-#: utils/dateformat.py:46
+#: utils/dateformat.py:47
msgid "PM"
msgstr "Matin"
-#: utils/dateformat.py:47
+#: utils/dateformat.py:48
msgid "AM"
msgstr "Après-midi"
-#: utils/dateformat.py:95
+#: utils/dateformat.py:97
msgid "midnight"
msgstr "minuit"
-#: utils/dateformat.py:97
+#: utils/dateformat.py:99
msgid "noon"
msgstr "midi"
-#: utils/translation/trans_real.py:358
+#: utils/translation/trans_real.py:391
msgid "DATE_FORMAT"
msgstr "j F Y"
-#: utils/translation/trans_real.py:359
+#: utils/translation/trans_real.py:392
msgid "DATETIME_FORMAT"
msgstr "j F Y, G:i"
-#: utils/translation/trans_real.py:360
+#: utils/translation/trans_real.py:393
msgid "TIME_FORMAT"
msgstr "G:i:s"
-#: utils/translation/trans_real.py:376
+#: utils/translation/trans_real.py:409
msgid "YEAR_MONTH_FORMAT"
msgstr "F Y"
-#: utils/translation/trans_real.py:377
+#: utils/translation/trans_real.py:410
msgid "MONTH_DAY_FORMAT"
msgstr "j F"
-#: template/defaultfilters.py:491
+#: template/defaultfilters.py:485
msgid "yes,no,maybe"
-msgstr "oui,non,peut-être"
+msgstr "oui, non, peut-être"
-#: template/defaultfilters.py:520
+#: template/defaultfilters.py:514
#, python-format
msgid "%(size)d byte"
msgid_plural "%(size)d bytes"
msgstr[0] "%(size)d octet"
msgstr[1] "%(size)d octets"
-#: template/defaultfilters.py:522
+#: template/defaultfilters.py:516
#, python-format
msgid "%.1f KB"
msgstr "%.1f Ko"
-#: template/defaultfilters.py:524
+#: template/defaultfilters.py:518
#, python-format
msgid "%.1f MB"
msgstr "%.1f Mo"
-#: template/defaultfilters.py:525
+#: template/defaultfilters.py:519
#, python-format
msgid "%.1f GB"
msgstr "%.1f Go"
-#~ msgid "One or more %(fieldname)s in %(name)s&amp;nbsp;:"
-#~ msgstr "Un ou plusieurs %(fieldname)s dans %(name)s&amp;nbsp;:"
+#~ msgid "AnonymousUser"
+#~ msgstr "Anonyme"
+
+#~ msgid "One or more %(fieldname)s in %(name)s :"
+#~ msgstr "Un ou plusieurs %(fieldname)s dans %(name)s :"
#~ msgid "Separate multiple IDs with commas."
#~ msgstr "Séparez les ID par des virgules."
@@ -2812,7 +3051,7 @@ msgstr "%.1f Go"
#~ msgstr "Tri"
#~ msgid "Order:"
-#~ msgstr "Ordre&amp;nbsp;:"
+#~ msgstr "Ordre :"
#~ msgid "%dth"
#~ msgstr "%de"
diff --git a/django/conf/locale/fr/LC_MESSAGES/djangojs.mo b/django/conf/locale/fr/LC_MESSAGES/djangojs.mo
index 12a53b39e2..34f4c78529 100644
--- a/django/conf/locale/fr/LC_MESSAGES/djangojs.mo
+++ b/django/conf/locale/fr/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/fr/LC_MESSAGES/djangojs.po b/django/conf/locale/fr/LC_MESSAGES/djangojs.po
index 8cf467187e..1841be20c8 100644
--- a/django/conf/locale/fr/LC_MESSAGES/djangojs.po
+++ b/django/conf/locale/fr/LC_MESSAGES/djangojs.po
@@ -1,7 +1,7 @@
# French translation for js.
-# Copyright (C) 2005 Mikal Barbero
+# Copyright (C) 2005 Mikaël Barbero
# This file is distributed under the same license as the PACKAGE package.
-# Mikal Barbero <mikael.barbero nospam at nospam free.fr>, 2005.
+# Mikaël Barbero <mikael.barbero nospam at nospam free.fr>, 2005.
#
msgid ""
msgstr ""
@@ -9,10 +9,10 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2005-12-24 16:39+0100\n"
"PO-Revision-Date: 2005-12-24 16:39+0100\n"
-"Last-Translator: Mikal Barbero <mikael.barbero nospam at nospam free.fr>\n"
+"Last-Translator: Mikaël Barbero <mikael.barbero nospam at nospam free.fr>\n"
"Language-Team: French <fr@li.org>\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: contrib/admin/media/js/calendar.js:24
@@ -21,8 +21,8 @@ msgid ""
"January February March April May June July August September October November "
"December"
msgstr ""
-"Janvier Fvrier Mars Avril Mai Juin Juillet Aot Septembre Octobre Novembre "
-"Dcembre"
+"Janvier Février Mars Avril Mai Juin Juillet Août Septembre Octobre Novembre "
+"Décembre"
#: contrib/admin/media/js/calendar.js:25
msgid "S M T W T F S"
@@ -56,7 +56,7 @@ msgstr "Choisi %s"
#: contrib/admin/media/js/SelectFilter2.js:54
msgid "Select your choice(s) and click "
-msgstr "Slectionnez un ou plusieurs choix et cliquez "
+msgstr "Sélectionnez un ou plusieurs choix et cliquez "
#: contrib/admin/media/js/SelectFilter2.js:59
msgid "Clear all"
diff --git a/django/conf/locale/sv/LC_MESSAGES/django.mo b/django/conf/locale/sv/LC_MESSAGES/django.mo
index 5654541a4e..9d35676a65 100644
--- a/django/conf/locale/sv/LC_MESSAGES/django.mo
+++ b/django/conf/locale/sv/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/sv/LC_MESSAGES/django.po b/django/conf/locale/sv/LC_MESSAGES/django.po
index db542460e6..d77cf04cc4 100644
--- a/django/conf/locale/sv/LC_MESSAGES/django.po
+++ b/django/conf/locale/sv/LC_MESSAGES/django.po
@@ -1,14 +1,14 @@
# Swedish translation of Django
-# Copyright (C) 2005
+# Copyright (C) 2005-2007
# This file is distributed under the same license as the Django package.
#
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2007-06-15 17:35+0200\n"
+"POT-Creation-Date: 2007-07-18 16:49+0200\n"
"PO-Revision-Date: 2007-03-06 10:30+0100\n"
-"Last-Translator: Ludvig Ericson <ludvig.ericson@gmail.com>\n"
+"Last-Translator: Philip Lindborg <philip.lindborg@gmail.com>\n"
"Language-Team: Django I18N <Django-I18N@googlegroups.com>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,130 +17,128 @@ msgstr ""
"X-Poedit-Language: Swedish\n"
"X-Poedit-Country: SWEDEN\n"
-#: oldforms/__init__.py:357 db/models/fields/__init__.py:121
-#: db/models/fields/__init__.py:278 db/models/fields/__init__.py:675
-#: db/models/fields/__init__.py:686 newforms/models.py:185
-#: newforms/fields.py:87 newforms/fields.py:444 newforms/fields.py:520
-#: newforms/fields.py:531
+#: oldforms/__init__.py:369 db/models/fields/__init__.py:127
+#: db/models/fields/__init__.py:284 db/models/fields/__init__.py:681
+#: db/models/fields/__init__.py:692 newforms/models.py:187
+#: newforms/fields.py:92 newforms/fields.py:440 newforms/fields.py:516
+#: newforms/fields.py:527
msgid "This field is required."
msgstr "Det här fältet är obligatoriskt."
-#: oldforms/__init__.py:392
+#: oldforms/__init__.py:404
#, python-format
msgid "Ensure your text is less than %s character."
msgid_plural "Ensure your text is less than %s characters."
msgstr[0] "Se till att din text är kortare än %s tecken."
msgstr[1] "Se till att din text är kortare än %s tecken."
-#: oldforms/__init__.py:397
+#: oldforms/__init__.py:409
msgid "Line breaks are not allowed here."
msgstr "Radbrytningar är inte tillåtna här."
-#: oldforms/__init__.py:498 oldforms/__init__.py:571 oldforms/__init__.py:610
+#: oldforms/__init__.py:507 oldforms/__init__.py:581 oldforms/__init__.py:620
#, python-format
msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
-msgstr "Välj ett giltigt alternativ. '%(data)s' finns inte bland %(choices)s."
+msgstr "Välj ett giltigt alternativ; '%(data)s' finns inte bland %(choices)s."
-#: oldforms/__init__.py:577 newforms/widgets.py:182
-#: contrib/admin/filterspecs.py:150
+#: oldforms/__init__.py:587 newforms/widgets.py:181
+#: contrib/admin/filterspecs.py:152
msgid "Unknown"
msgstr "Okänt"
-#: oldforms/__init__.py:577 newforms/widgets.py:182
-#: contrib/admin/filterspecs.py:143
+#: oldforms/__init__.py:587 newforms/widgets.py:181
+#: contrib/admin/filterspecs.py:145
msgid "Yes"
msgstr "Ja"
-#: oldforms/__init__.py:577 newforms/widgets.py:182
-#: contrib/admin/filterspecs.py:143
+#: oldforms/__init__.py:587 newforms/widgets.py:181
+#: contrib/admin/filterspecs.py:145
msgid "No"
msgstr "Nej"
-#: oldforms/__init__.py:672 core/validators.py:175 core/validators.py:453
+#: oldforms/__init__.py:682 core/validators.py:181 core/validators.py:461
msgid "No file was submitted. Check the encoding type on the form."
-msgstr "Ingen fil skickades. Kontrollera kodningnstypen i formen."
+msgstr "Ingen fil skickades. Kontrollera kodningnstypen i formuläret."
-#: oldforms/__init__.py:674
+#: oldforms/__init__.py:684
msgid "The submitted file is empty."
msgstr "Den insända filen är tom."
-#: oldforms/__init__.py:730
+#: oldforms/__init__.py:740
msgid "Enter a whole number between -32,768 and 32,767."
msgstr "Fyll i ett heltal mellan -32768 och 32767."
-#: oldforms/__init__.py:740
+#: oldforms/__init__.py:750
msgid "Enter a positive number."
msgstr "Fyll i ett positivt heltal."
-#: oldforms/__init__.py:750
+#: oldforms/__init__.py:760
msgid "Enter a whole number between 0 and 32,767."
msgstr "Fyll i ett heltal mellan 0 och 32767."
-#: db/models/manipulators.py:307
+#: db/models/manipulators.py:309
#, python-format
msgid "%(object)s with this %(type)s already exists for the given %(field)s."
msgstr "%(object)s med typen %(type)s finns redan för %(field)s."
-#: db/models/manipulators.py:308 contrib/admin/views/main.py:335
-#: contrib/admin/views/main.py:337 contrib/admin/views/main.py:339
+#: db/models/manipulators.py:310 contrib/admin/views/main.py:342
+#: contrib/admin/views/main.py:344 contrib/admin/views/main.py:346
msgid "and"
msgstr "och"
-#: db/models/fields/__init__.py:46
+#: db/models/fields/__init__.py:47
#, python-format
msgid "%(optname)s with this %(fieldname)s already exists."
msgstr "%(optname)s med det här %(fieldname)s finns redan."
-#: db/models/fields/__init__.py:373
+#: db/models/fields/__init__.py:379
msgid "This value must be an integer."
msgstr "Det här värdet måste vara ett heltal."
-#: db/models/fields/__init__.py:408
+#: db/models/fields/__init__.py:414
msgid "This value must be either True or False."
-msgstr "Det här värdet måste vara True eller False"
+msgstr "Det här värdet måste vara True eller False."
-#: db/models/fields/__init__.py:429
+#: db/models/fields/__init__.py:435
msgid "This field cannot be null."
-msgstr "Det här fältet kan inte vara null."
+msgstr "Det här fältet kan inte vara tomt."
-#: db/models/fields/__init__.py:463 core/validators.py:149
+#: db/models/fields/__init__.py:469 core/validators.py:155
msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr "Fyll i ett giltigt datum i ÅÅÅÅ-MM-DD format."
+msgstr "Fyll i ett giltigt datum på formatet ÅÅÅÅ-MM-DD."
-#: db/models/fields/__init__.py:532 core/validators.py:158
+#: db/models/fields/__init__.py:538 core/validators.py:164
msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
-msgstr "Fyll i en giltig tidpunkt i ÅÅÅÅ-MM-DD HH:MM format"
+msgstr "Fyll i en giltig tidpunkt på formatet ÅÅÅÅ-MM-DD TT:MM."
-#: db/models/fields/__init__.py:592
-#, fuzzy
+#: db/models/fields/__init__.py:598
msgid "This value must be a decimal number."
-msgstr "Det här värdet måste vara ett heltal."
+msgstr "Det här värdet måste vara ett hel- eller decimaltal."
-#: db/models/fields/__init__.py:695
+#: db/models/fields/__init__.py:701
msgid "Enter a valid filename."
msgstr "Fyll i ett giltigt filnamn."
-#: db/models/fields/__init__.py:818
-#, fuzzy
+#: db/models/fields/__init__.py:826
msgid "This value must be either None, True or False."
-msgstr "Det här värdet måste vara antingen True eller False."
+msgstr "Det här värdet måste vara antingen None, True eller False."
-#: db/models/fields/related.py:53
+#: db/models/fields/related.py:55
#, python-format
msgid "Please enter a valid %s."
msgstr "Var god fyll i giltigt %s."
-#: db/models/fields/related.py:642
+#: db/models/fields/related.py:641
msgid "Separate multiple IDs with commas."
-msgstr "Separera flera ID:n med kommatecken."
+msgstr "Separera flera ID-nummer med kommatecken."
-#: db/models/fields/related.py:644
+#: db/models/fields/related.py:643
msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr ""
-"Håll ner \"Control\", eller \"Command\" på en Mac, för att välja mer än en."
+"Håll ner \"Control\" (eller \"Command\" på en Mac) för att välja fler än en."
-#: db/models/fields/related.py:691
+#: db/models/fields/related.py:690
#, python-format
msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
msgid_plural ""
@@ -150,55 +148,58 @@ msgstr[0] ""
msgstr[1] ""
"Var god och fyll giltiga %(self)s ID-nummer. Värdena %(value)r är ogiltiga."
-#: conf/global_settings.py:39
+#: conf/global_settings.py:38
msgid "Arabic"
msgstr "Arabiska"
-#: conf/global_settings.py:40
+#: conf/global_settings.py:39
msgid "Bengali"
msgstr "Bengaliska"
-#: conf/global_settings.py:41
-#, fuzzy
+#: conf/global_settings.py:40
msgid "Bulgarian"
-msgstr "Ungerska"
+msgstr "Bulgariska"
-#: conf/global_settings.py:42
+#: conf/global_settings.py:41
msgid "Catalan"
msgstr "Katalanska"
-#: conf/global_settings.py:43
+#: conf/global_settings.py:42
msgid "Czech"
msgstr "Tjeckiska"
-#: conf/global_settings.py:44
+#: conf/global_settings.py:43
msgid "Welsh"
msgstr "Walesiska"
-#: conf/global_settings.py:45
+#: conf/global_settings.py:44
msgid "Danish"
msgstr "Danska"
-#: conf/global_settings.py:46
+#: conf/global_settings.py:45
msgid "German"
msgstr "Tyska"
-#: conf/global_settings.py:47
+#: conf/global_settings.py:46
msgid "Greek"
msgstr "Grekiska"
-#: conf/global_settings.py:48
+#: conf/global_settings.py:47
msgid "English"
msgstr "Engelska"
-#: conf/global_settings.py:49
+#: conf/global_settings.py:48
msgid "Spanish"
msgstr "Spanska"
-#: conf/global_settings.py:50
+#: conf/global_settings.py:49
msgid "Argentinean Spanish"
msgstr "Argentisk Spanska"
+#: conf/global_settings.py:50
+msgid "Persian"
+msgstr "Persiska"
+
#: conf/global_settings.py:51
msgid "Finnish"
msgstr "Finska"
@@ -315,82 +316,82 @@ msgstr "Förenklad Kinesiska"
msgid "Traditional Chinese"
msgstr "Traditionell Kinesiska"
-#: core/validators.py:65
+#: core/validators.py:71
msgid "This value must contain only letters, numbers and underscores."
-msgstr "Det här värdet får bara innehålla bokstäver, tal och understräck."
+msgstr "Det här värdet får bara innehålla bokstäver, siffror och understreck."
-#: core/validators.py:69
+#: core/validators.py:75
msgid ""
"This value must contain only letters, numbers, underscores, dashes or "
"slashes."
msgstr ""
-"Det här värdet får bara innehålla bokstäver, siffror, understräck, sträck "
-"och snedsträck"
+"Det här värdet får bara innehålla bokstäver, siffror, understreck, "
+"bindestreck eller snedstreck."
-#: core/validators.py:73
+#: core/validators.py:79
msgid "This value must contain only letters, numbers, underscores or hyphens."
msgstr ""
-"Det här värdet får bara innehålla bokstäver, siffror, understräck eller "
-"bindessträck."
+"Det här värdet får bara innehålla bokstäver, siffror, understreck eller "
+"avstavningstecken."
-#: core/validators.py:77
+#: core/validators.py:83
msgid "Uppercase letters are not allowed here."
-msgstr "Stora bokstäver är inte tillåtna här."
+msgstr "Versaler är inte tillåtna här."
-#: core/validators.py:81
+#: core/validators.py:87
msgid "Lowercase letters are not allowed here."
-msgstr "Små bokstäver är inte tillåtna här."
+msgstr "Gemener är inte tillåtna här."
-#: core/validators.py:88
+#: core/validators.py:94
msgid "Enter only digits separated by commas."
msgstr "Fyll enbart i siffror avskilda med kommatecken."
-#: core/validators.py:100
+#: core/validators.py:106
msgid "Enter valid e-mail addresses separated by commas."
-msgstr "Fyll i giltiga e-mailadresser avskilda med kommatecken."
+msgstr "Fyll i giltiga e-postadresser avskilda med kommatecken."
-#: core/validators.py:104
+#: core/validators.py:110
msgid "Please enter a valid IP address."
msgstr "Var god fyll i en giltigt IP-adress."
-#: core/validators.py:108
+#: core/validators.py:114
msgid "Empty values are not allowed here."
msgstr "Tomma värden är inte tillåtna här."
-#: core/validators.py:112
+#: core/validators.py:118
msgid "Non-numeric characters aren't allowed here."
msgstr "Icke-numeriska tecken är inte tillåtna här."
-#: core/validators.py:116
+#: core/validators.py:122
msgid "This value can't be comprised solely of digits."
msgstr "Det här värdet kan inte enbart bestå av siffror."
-#: core/validators.py:121 newforms/fields.py:135
+#: core/validators.py:127 newforms/fields.py:141
msgid "Enter a whole number."
msgstr "Fyll i ett heltal."
-#: core/validators.py:125
+#: core/validators.py:131
msgid "Only alphabetical characters are allowed here."
msgstr "Endast bokstäver är tillåtna här."
-#: core/validators.py:140
+#: core/validators.py:146
msgid "Year must be 1900 or later."
msgstr "Årtal måste vara 1900 eller senare."
-#: core/validators.py:144
-#, fuzzy, python-format
+#: core/validators.py:150
+#, python-format
msgid "Invalid date: %s"
-msgstr "Felaktigt datum: %s"
+msgstr "Ogiltigt datum: %s"
-#: core/validators.py:154
+#: core/validators.py:160
msgid "Enter a valid time in HH:MM format."
-msgstr "Fyll i en giltig tid i HH:MM format."
+msgstr "Fyll i en giltig tid i TT:MM format."
-#: core/validators.py:163 newforms/fields.py:339
+#: core/validators.py:169 newforms/fields.py:335
msgid "Enter a valid e-mail address."
-msgstr "Fyll i en giltig e-mailadress."
+msgstr "Fyll i en giltig e-postadress."
-#: core/validators.py:179
+#: core/validators.py:185
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
@@ -398,28 +399,28 @@ msgstr ""
"Ladda upp en giltig bild. Filen du laddade upp var antingen ingen bild eller "
"en korrupt bild."
-#: core/validators.py:186
+#: core/validators.py:192
#, python-format
msgid "The URL %s does not point to a valid image."
msgstr "URL:en %s pekar inte mot en giltig bild."
-#: core/validators.py:190
+#: core/validators.py:196
#, python-format
msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
msgstr ""
-"Telefonnummer måste vara i det amerikanska XXX-XXX-XXXX formated. \"%s\" är "
+"Telefonnummer måste vara på det amerikanska formatet XXX-XXX-XXXX. \"%s\" är "
"ogiltigt."
-#: core/validators.py:198
+#: core/validators.py:204
#, python-format
msgid "The URL %s does not point to a valid QuickTime video."
msgstr "URL:en %s pekar inte på en giltig QuickTime-video."
-#: core/validators.py:202
+#: core/validators.py:208
msgid "A valid URL is required."
msgstr "En giltig URL krävs."
-#: core/validators.py:216
+#: core/validators.py:222
#, python-format
msgid ""
"Valid HTML is required. Specific errors are:\n"
@@ -428,146 +429,150 @@ msgstr ""
"Giltig HTML krävs. Specifika fel är:\n"
"%s"
-#: core/validators.py:223
+#: core/validators.py:229
#, python-format
msgid "Badly formed XML: %s"
msgstr "Missformad XML: %s"
-#: core/validators.py:240
+#: core/validators.py:246
#, python-format
msgid "Invalid URL: %s"
msgstr "Felaktig URL: %s"
-#: core/validators.py:245 core/validators.py:247
+#: core/validators.py:251 core/validators.py:253
#, python-format
msgid "The URL %s is a broken link."
msgstr "URL:en %s är en trasig länk."
-#: core/validators.py:253
+#: core/validators.py:259
msgid "Enter a valid U.S. state abbreviation."
msgstr "Fyll i en giltig förkortning för en amerikansk delstat."
-#: core/validators.py:267
+#: core/validators.py:273
#, 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] "Akta din tunga! Ordet %s är inte tillåtet här."
msgstr[1] "Akta din tunga! Orden %s är inte tillåtna här."
-#: core/validators.py:274
+#: core/validators.py:280
#, python-format
msgid "This field must match the '%s' field."
msgstr "Det här fältet måste matcha fältet '%s'."
-#: core/validators.py:293
+#: core/validators.py:299
msgid "Please enter something for at least one field."
msgstr "Var god fyll i minst ett fält."
-#: core/validators.py:302 core/validators.py:313
+#: core/validators.py:308 core/validators.py:319
msgid "Please enter both fields or leave them both empty."
msgstr "Fyll antingen i båda fälten, eller lämna båda tomma."
-#: core/validators.py:321
+#: core/validators.py:327
#, python-format
msgid "This field must be given if %(field)s is %(value)s"
msgstr "Det är fältet måste anges om %(field)s är %(value)s"
-#: core/validators.py:334
+#: core/validators.py:340
#, python-format
msgid "This field must be given if %(field)s is not %(value)s"
msgstr "Det här fältet måste anges om %(field)s inte är %(value)s"
-#: core/validators.py:353
+#: core/validators.py:359
msgid "Duplicate values are not allowed."
-msgstr "Upprepade värden är inte tillåtna."
+msgstr "Dubbelvärden är inte tillåtna."
-#: core/validators.py:368
+#: core/validators.py:374
#, python-format
msgid "This value must be between %(lower)s and %(upper)s."
msgstr "Det här värdet måste vara mellan %(lower)s och %(upper)s."
-#: core/validators.py:370
+#: core/validators.py:376
#, python-format
msgid "This value must be at least %s."
msgstr "Det här värdet måste vara minst %s."
-#: core/validators.py:372
+#: core/validators.py:378
#, python-format
msgid "This value must be no more than %s."
msgstr "Det här värdet får inte vara mer än %s."
-#: core/validators.py:408
+#: core/validators.py:414
#, python-format
msgid "This value must be a power of %s."
msgstr "Det här värdet måste vara en potens av %s."
-#: core/validators.py:417
+#: core/validators.py:424
msgid "Please enter a valid decimal number."
-msgstr "Fyll i ett giltigt decimaltal."
+msgstr "Fyll i ett giltigt hel- eller decimaltal."
-#: core/validators.py:423
+#: core/validators.py:431
#, 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] "Fyll i ett giltigt decimaltal med högst %s siffra totalt."
-msgstr[1] "Fyll i ett giltigt decimaltal med högst %s siffror totalt."
+msgstr[0] ""
+"Fyll i ett giltigt hel- eller decimaltal med högst %s siffra totalt."
+msgstr[1] ""
+"Fyll i ett giltigt hel- eller decimaltal med högst %s siffror totalt."
-#: core/validators.py:426
+#: core/validators.py:434
#, 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] ""
-"Fyll i ett giltigt decimaltal med en heltalsdel som högst är %s siffra."
+"Fyll i ett giltigt hel- eller decimaltal med en heltalsdel som högst är %s "
+"siffra."
msgstr[1] ""
-"Fyll i ett giltigt decimaltal med en heltalsdel som högst är %s siffror."
+"Fyll i ett giltigt hel- eller decimaltal med en heltalsdel som högst är %s "
+"siffror."
-#: core/validators.py:429
+#: core/validators.py:437
#, 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] "Fyll i ett giltigt decimaltal med högst %s decimal."
-msgstr[1] "Fyll i ett giltigt decimaltal med högst %s decimaler."
+msgstr[0] "Fyll i ett giltigt hel- eller decimaltal med högst %s decimal."
+msgstr[1] "Fyll i ett giltigt hel- eller decimaltal med högst %s decimaler."
-#: core/validators.py:437
+#: core/validators.py:445
msgid "Please enter a valid floating point number."
-msgstr "Fyll i ett giltigt flyttal."
+msgstr "Fyll i ett giltigt decimaltal."
-#: core/validators.py:446
+#: core/validators.py:454
#, python-format
msgid "Make sure your uploaded file is at least %s bytes big."
msgstr "Se till att filen du laddade upp är minst %s bytes stor."
-#: core/validators.py:447
+#: core/validators.py:455
#, python-format
msgid "Make sure your uploaded file is at most %s bytes big."
msgstr "Se till att filen du laddade upp är som mest %s bytes stor."
-#: core/validators.py:464
+#: core/validators.py:472
msgid "The format for this field is wrong."
msgstr "Formatet på det här fältet är fel."
-#: core/validators.py:479
+#: core/validators.py:487
msgid "This field is invalid."
msgstr "Det här fältet är ogiltigt."
-#: core/validators.py:515
+#: core/validators.py:523
#, python-format
msgid "Could not retrieve anything from %s."
msgstr "Kunde inte hämta något från %s."
-#: core/validators.py:518
+#: core/validators.py:526
#, python-format
msgid ""
"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
msgstr ""
"URL:en %(url)s returnerade den ogiltiga Content-Type headern '%(contenttype)"
-"s'"
+"s'."
-#: core/validators.py:551
+#: core/validators.py:559
#, python-format
msgid ""
"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
@@ -576,16 +581,16 @@ msgstr ""
"Var god avsluta den oavslutade taggen %(tag)s på rad %(line)s. (Raden börjar "
"med \"%(start)s\".)"
-#: core/validators.py:555
+#: core/validators.py:563
#, python-format
msgid ""
"Some text starting on line %(line)s is not allowed in that context. (Line "
"starts with \"%(start)s\".)"
msgstr ""
-"En del text från rad %(line)s är inte tillåtet i det sammanhanget. (Raden "
-"börjar med \"%(start)s\".)"
+"En del text som börjar på rad %(line)s är inte tillåtet i det sammanhanget. "
+"(Raden börjar med \"%(start)s\".)"
-#: core/validators.py:560
+#: core/validators.py:568
#, python-format
msgid ""
"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
@@ -594,7 +599,7 @@ msgstr ""
"\"%(attr)s\" på rad %(line)s är inte ett giltigt attribut. (Raden startar "
"med \"%(start)s\".)"
-#: core/validators.py:565
+#: core/validators.py:573
#, python-format
msgid ""
"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
@@ -603,16 +608,16 @@ msgstr ""
"\"<%(tag)s>\" på rad %(line)s är en ogiltig tagg. (Raden börjar med \"%"
"(start)s\".)"
-#: core/validators.py:569
+#: core/validators.py:577
#, python-format
msgid ""
"A tag on line %(line)s is missing one or more required attributes. (Line "
"starts with \"%(start)s\".)"
msgstr ""
-"En tagg på rad %(line)s saknar en eller flera nödvändiga attribut. (Raden "
+"En tagg på rad %(line)s saknar en eller flera obligatoriska attribut. (Raden "
"börjar med \"%(start)s\".)"
-#: core/validators.py:574
+#: core/validators.py:582
#, python-format
msgid ""
"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
@@ -622,98 +627,96 @@ msgstr ""
"börjar med \"%(start)s\".)"
#: views/generic/create_update.py:43
-#, python-format
-#, fuzzy
+#, fuzzy, python-format
msgid "The %(verbose_name)s was created successfully."
-msgstr "%(verbose_name)s skapades framgångsrikt."
+msgstr "%(verbose_name)s skapades."
#: views/generic/create_update.py:117
-#, python-format
-#, fuzzy
+#, fuzzy, python-format
msgid "The %(verbose_name)s was updated successfully."
-msgstr " %(verbose_name)s uppdaterades framgångsrikt."
+msgstr "%(verbose_name)s uppdaterades."
#: views/generic/create_update.py:184
#, python-format
msgid "The %(verbose_name)s was deleted."
msgstr "%(verbose_name)s togs bort."
-#: newforms/models.py:172 newforms/fields.py:432
+#: newforms/models.py:174 newforms/fields.py:428
msgid "Select a valid choice. That choice is not one of the available choices."
msgstr ""
"Välj ett giltigt alternativ. Det valet finns inte bland tillgängliga "
"alternativ."
-#: newforms/models.py:189 newforms/fields.py:448 newforms/fields.py:524
+#: newforms/models.py:191 newforms/fields.py:444 newforms/fields.py:520
msgid "Enter a list of values."
msgstr "Fyll i en lista med värden."
-#: newforms/models.py:195 newforms/fields.py:457
+#: newforms/models.py:197 newforms/fields.py:450
#, python-format
msgid "Select a valid choice. %s is not one of the available choices."
msgstr ""
-"Välj ett giltigt alternativ. '%s' finns inte bland tillgängliga alternativ."
+"Välj ett giltigt alternativ. %s finns inte bland tillgängliga alternativ."
-#: newforms/fields.py:110 newforms/fields.py:324
-#, python-format
-msgid "Ensure this value has at most %d characters."
-msgstr "Säkerställ att detta värdet har högst %d tecken."
+#: newforms/fields.py:116
+#, fuzzy, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr "Kontrollera att detta värde har högst %d tecken."
-#: newforms/fields.py:112 newforms/fields.py:326
-#, python-format
-msgid "Ensure this value has at least %d characters."
-msgstr "Säkerställ att detta värdet har minst %d tecken."
+#: newforms/fields.py:118
+#, fuzzy, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr "Kontrollera att detta värde har minst %d tecken."
-#: newforms/fields.py:137 newforms/fields.py:160 newforms/fields.py:192
+#: newforms/fields.py:143 newforms/fields.py:166 newforms/fields.py:196
#, python-format
msgid "Ensure this value is less than or equal to %s."
-msgstr "Säkerställ att detta värdet är mindre eller lika med %s."
+msgstr "Kontrollera att detta värde är mindre eller lika med %s."
-#: newforms/fields.py:139 newforms/fields.py:162 newforms/fields.py:194
+#: newforms/fields.py:145 newforms/fields.py:168 newforms/fields.py:198
#, python-format
msgid "Ensure this value is greater than or equal to %s."
-msgstr "Säkerställ att detta värdet är mer eller lika med %s."
+msgstr "Kontrollera att detta värde är mer eller lika med %s."
-#: newforms/fields.py:158 newforms/fields.py:186
+#: newforms/fields.py:164 newforms/fields.py:191
msgid "Enter a number."
msgstr "Fyll i ett tal."
-#: newforms/fields.py:196
+#: newforms/fields.py:200
#, python-format
msgid "Ensure that there are no more than %s digits in total."
-msgstr "Säkerställ att det inte finns mer än %s siffror totalt."
+msgstr "Kontrollera att det inte finns mer än totalt %s siffror."
-#: newforms/fields.py:198
+#: newforms/fields.py:202
#, python-format
msgid "Ensure that there are no more than %s decimal places."
-msgstr "Säkerställ att det inte finns mer än %s decimaler."
+msgstr "Kontrollera att det inte finns mer än %s decimaler."
-#: newforms/fields.py:200
+#: newforms/fields.py:204
#, python-format
msgid "Ensure that there are no more than %s digits before the decimal point."
-msgstr "Säkerställ att det inte finns mer än %s siffror före kommatecknet."
+msgstr "Kontrollera att det inte finns mer än %s siffror före decimaltecknet."
-#: newforms/fields.py:233
+#: newforms/fields.py:237 newforms/fields.py:560
msgid "Enter a valid date."
msgstr "Fyll i ett giltigt datum."
-#: newforms/fields.py:260
+#: newforms/fields.py:264 newforms/fields.py:562
msgid "Enter a valid time."
msgstr "Fyll i en giltig tid."
-#: newforms/fields.py:296
+#: newforms/fields.py:300
msgid "Enter a valid date/time."
msgstr "Fyll i ett giltigt datum/tid."
-#: newforms/fields.py:310
+#: newforms/fields.py:313
msgid "Enter a valid value."
msgstr "Fyll i ett giltigt värde."
-#: newforms/fields.py:357 newforms/fields.py:379
+#: newforms/fields.py:353 newforms/fields.py:375
msgid "Enter a valid URL."
-msgstr "Fyll i ett giltigt URL."
+msgstr "Fyll i en giltig URL."
-#: newforms/fields.py:381
+#: newforms/fields.py:377
msgid "This URL appears to be a broken link."
msgstr "Denna URL verkar vara en trasig länk."
@@ -742,7 +745,6 @@ msgstr[1] "%(value).1f miljoner"
#: contrib/humanize/templatetags/humanize.py:50
#, python-format
-#, fuzzy
msgid "%(value).1f billion"
msgid_plural "%(value).1f billion"
msgstr[0] "%(value)1.f miljard"
@@ -750,14 +752,12 @@ msgstr[1] "%(value)1.f miljarder"
#: contrib/humanize/templatetags/humanize.py:53
#, python-format
-#, fuzzy
msgid "%(value).1f trillion"
msgid_plural "%(value).1f trillion"
msgstr[0] "%(value)1.f biljon"
msgstr[1] "%(value)1.f biljoner"
#: contrib/humanize/templatetags/humanize.py:68
-#, fuzzy
msgid "one"
msgstr "ett"
@@ -802,8 +802,8 @@ msgid ""
"This should be an absolute path, excluding the domain name. Example: '/"
"events/search/'."
msgstr ""
-"Det här bör vara en absolut sökväg, förutom domännamnet. Exempel: '/"
-"handelser/sok/'."
+"Det här bör vara en absolut sökväg, utan domännamnet. Exempel: '/handelser/"
+"sok/'."
#: contrib/redirects/models.py:9
msgid "redirect to"
@@ -814,8 +814,8 @@ msgid ""
"This can be either an absolute path (as above) or a full URL starting with "
"'http://'."
msgstr ""
-"Detta kan vara antingen en absolut sökväg (som ovan), eller en komplett URL "
-"som börjar med 'http://'."
+"Detta kan vara antingen en absolut sökväg (som ovan), eller en fullständig "
+"URL som börjar med 'http://'."
#: contrib/redirects/models.py:13
msgid "redirect"
@@ -876,13 +876,13 @@ msgstr "är ett giltigt betyg"
#: contrib/comments/models.py:83 contrib/comments/models.py:169
msgid "date/time submitted"
-msgstr "datum/tid postat"
+msgstr "datum/tid skickat"
#: contrib/comments/models.py:84 contrib/comments/models.py:170
msgid "is public"
msgstr "är offentligt"
-#: contrib/comments/models.py:85 contrib/admin/views/doc.py:305
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:306
msgid "IP address"
msgstr "IP-adress"
@@ -896,7 +896,7 @@ msgid ""
"removed\" message will be displayed instead."
msgstr ""
"Bocka för den här rutan om kommentaren är olämplig. Ett \"Den här "
-"kommentaren har tagits bort\"-meddelande kommer visas istället"
+"kommentaren har tagits bort\"-meddelande kommer visas istället."
#: contrib/comments/models.py:91
msgid "comments"
@@ -979,11 +979,11 @@ msgstr "flaggdatum"
#: contrib/comments/models.py:268
msgid "user flag"
-msgstr "användares flagga"
+msgstr "användarflagga"
#: contrib/comments/models.py:269
msgid "user flags"
-msgstr "användares flaggor"
+msgstr "användarflaggor"
#: contrib/comments/models.py:273
#, python-format
@@ -1007,24 +1007,24 @@ msgstr "moderatorborttagningar"
msgid "Moderator deletion by %r"
msgstr "Moderatorborttagning av %r"
-#: contrib/comments/views/karma.py:19
+#: contrib/comments/views/karma.py:20
msgid "Anonymous users cannot vote"
msgstr "Anonyma användare kan inte rösta"
-#: contrib/comments/views/karma.py:23
+#: contrib/comments/views/karma.py:24
msgid "Invalid comment ID"
-msgstr "Ogiltig kommentarsidentifikation"
+msgstr "Ogiltigt kommentar-ID"
-#: contrib/comments/views/karma.py:25
+#: contrib/comments/views/karma.py:26
msgid "No voting for yourself"
msgstr "Du får inte rösta på dig själv"
-#: contrib/comments/views/comments.py:27
+#: contrib/comments/views/comments.py:28
msgid ""
"This rating is required because you've entered at least one other rating."
msgstr "Det här betyget krävs eftersom du har fyllt i minst ett annat betyg."
-#: contrib/comments/views/comments.py:111
+#: contrib/comments/views/comments.py:112
#, python-format
msgid ""
"This comment was posted by a user who has posted fewer than %(count)s "
@@ -1037,17 +1037,17 @@ msgid_plural ""
"\n"
"%(text)s"
msgstr[0] ""
-"Den här kommentaren postades av en användare som har postat mindre än %"
-"(count)s kommentar:\n"
+"Den här kommentaren postades av en användare som har postat färre än %(count)"
+"s kommentar:\n"
"\n"
"%(text)s"
msgstr[1] ""
-"Den här kommentaren postades av en användare som har postat mindre än %"
-"(count)s kommentarer:\n"
+"Den här kommentaren postades av en användare som har postat färre än %(count)"
+"s kommentarer:\n"
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:116
+#: contrib/comments/views/comments.py:117
#, python-format
msgid ""
"This comment was posted by a sketchy user:\n"
@@ -1058,35 +1058,49 @@ msgstr ""
"\n"
"%(text)s"
-#: contrib/comments/views/comments.py:188
-#: contrib/comments/views/comments.py:280
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:281
msgid "Only POSTs are allowed"
-msgstr "Endast POST tillåtet"
+msgstr "Endast POST är tillåtet"
-#: contrib/comments/views/comments.py:192
-#: contrib/comments/views/comments.py:284
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:285
msgid "One or more of the required fields wasn't submitted"
msgstr "Ett eller flera av de obligatoriska fälten var inte ifyllda"
-#: contrib/comments/views/comments.py:196
-#: contrib/comments/views/comments.py:286
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:287
msgid "Somebody tampered with the comment form (security violation)"
msgstr "Någon fifflade med kommentarformuläret (säkerhetsbrott)"
-#: contrib/comments/views/comments.py:206
-#: contrib/comments/views/comments.py:292
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:293
msgid ""
"The comment form had an invalid 'target' parameter -- the object ID was "
"invalid"
msgstr ""
-"Kommentars-formuläret hade en ogiltig 'mål'-parameter -- objektets ID var "
+"Kommentarformuläret hade en ogiltig 'target'-parameter -- objektets ID var "
"ogiltigt"
-#: contrib/comments/views/comments.py:257
-#: contrib/comments/views/comments.py:321
+#: contrib/comments/views/comments.py:258
+#: contrib/comments/views/comments.py:322
msgid "The comment form didn't provide either 'preview' or 'post'"
msgstr "Kommentars-formuläret skickade varken 'förhandsgranska' eller 'post'"
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Ditt namn:"
+
+#: contrib/comments/templates/comments/freeform.html:5
+#: contrib/comments/templates/comments/form.html:28
+msgid "Comment:"
+msgstr "Kommentar:"
+
+#: contrib/comments/templates/comments/freeform.html:10
+#: contrib/comments/templates/comments/form.html:35
+msgid "Preview comment"
+msgstr "Förhandsgranska kommentar"
+
#: contrib/comments/templates/comments/form.html:6
#: contrib/comments/templates/comments/form.html:8
#: contrib/admin/templates/admin/login.html:17
@@ -1094,24 +1108,24 @@ msgid "Username:"
msgstr "Användarnamn:"
#: contrib/comments/templates/comments/form.html:6
-#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/view_detail.html:4
#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
#: contrib/admin/templates/admin_doc/missing_docutils.html:4
#: contrib/admin/templates/admin_doc/view_index.html:5
#: contrib/admin/templates/admin_doc/model_detail.html:3
#: contrib/admin/templates/admin_doc/index.html:4
#: contrib/admin/templates/admin_doc/model_index.html:5
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
msgid "Log out"
msgstr "Logga ut"
@@ -1142,37 +1156,23 @@ msgstr "Valfri"
msgid "Post a photo"
msgstr "Lägg till foto"
-#: contrib/comments/templates/comments/form.html:28
-#: contrib/comments/templates/comments/freeform.html:5
-msgid "Comment:"
-msgstr "Kommentar:"
-
-#: contrib/comments/templates/comments/form.html:35
-#: contrib/comments/templates/comments/freeform.html:10
-msgid "Preview comment"
-msgstr "Förhandsgranska kommentar"
-
-#: contrib/comments/templates/comments/freeform.html:4
-msgid "Your name:"
-msgstr "Ditt namn:"
-
-#: contrib/sites/models.py:10
+#: contrib/sites/models.py:15
msgid "domain name"
msgstr "domännamn"
-#: contrib/sites/models.py:11
+#: contrib/sites/models.py:16
msgid "display name"
msgstr "visat namn"
-#: contrib/sites/models.py:15
+#: contrib/sites/models.py:20
msgid "site"
-msgstr "site"
+msgstr "webbplats"
-#: contrib/sites/models.py:16
+#: contrib/sites/models.py:21
msgid "sites"
-msgstr "siter"
+msgstr "webbplatser"
-#: contrib/admin/filterspecs.py:40
+#: contrib/admin/filterspecs.py:42
#, python-format
msgid ""
"<h3>By %s:</h3>\n"
@@ -1181,350 +1181,350 @@ msgstr ""
"<h3>Av %s:</h3>\n"
"<ul>\n"
-#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
-#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
+#: contrib/admin/filterspecs.py:72 contrib/admin/filterspecs.py:90
+#: contrib/admin/filterspecs.py:145 contrib/admin/filterspecs.py:171
msgid "All"
msgstr "Alla"
-#: contrib/admin/filterspecs.py:109
+#: contrib/admin/filterspecs.py:111
msgid "Any date"
msgstr "Alla datum"
-#: contrib/admin/filterspecs.py:110
+#: contrib/admin/filterspecs.py:112
msgid "Today"
msgstr "Idag"
-#: contrib/admin/filterspecs.py:113
+#: contrib/admin/filterspecs.py:115
msgid "Past 7 days"
msgstr "Senaste 7 dagarna"
-#: contrib/admin/filterspecs.py:115
+#: contrib/admin/filterspecs.py:117
msgid "This month"
msgstr "Den här månaden"
-#: contrib/admin/filterspecs.py:117
+#: contrib/admin/filterspecs.py:119
msgid "This year"
msgstr "Det här året"
-#: contrib/admin/models.py:16
+#: contrib/admin/models.py:17
msgid "action time"
msgstr "händelsetid"
-#: contrib/admin/models.py:19
+#: contrib/admin/models.py:20
msgid "object id"
msgstr "objektets id"
-#: contrib/admin/models.py:20
+#: contrib/admin/models.py:21
msgid "object repr"
msgstr "objektets beskrivning"
-#: contrib/admin/models.py:21
+#: contrib/admin/models.py:22
msgid "action flag"
msgstr "händelseflagga"
-#: contrib/admin/models.py:22
+#: contrib/admin/models.py:23
msgid "change message"
msgstr "ändra meddelande"
-#: contrib/admin/models.py:25
+#: contrib/admin/models.py:26
msgid "log entry"
msgstr "loggpost"
-#: contrib/admin/models.py:26
+#: contrib/admin/models.py:27
msgid "log entries"
msgstr "loggposter"
-#: contrib/admin/templatetags/admin_list.py:249
+#: contrib/admin/templatetags/admin_list.py:254
msgid "All dates"
msgstr "Alla datum"
-#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Var god ange ett korrekt användarnamn och lösenord. Observera att båda "
+"fälten är skiftlägeskänsliga."
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Logga in"
+
+#: 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 ""
+"Var god logga in igen, eftersom din session har tagit slut. Oroa dig inte: "
+"Ditt bidrag har sparats."
+
+#: 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 ""
+"Det verkar som att din webläsare inte är konfigurerad att acceptera cookies. "
+"Aktivera cookies, ladda om den här sidan, och försök igen."
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "Användarnamn får inte innehålla '@'-tecknet."
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Din e-postadress är inte ditt användarnamn. Försök med '%s' istället."
+
+#: contrib/admin/views/auth.py:20 contrib/admin/views/main.py:264
#, python-format
msgid "The %(name)s \"%(obj)s\" was added successfully."
msgstr "%(name)s \"%(obj)s\" lades till."
-#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261
-#: contrib/admin/views/main.py:347
+#: contrib/admin/views/auth.py:25 contrib/admin/views/main.py:268
+#: contrib/admin/views/main.py:354
msgid "You may edit it again below."
msgstr "Du kan ändra det igen nedanför."
-#: contrib/admin/views/auth.py:30
+#: contrib/admin/views/auth.py:31
msgid "Add user"
msgstr "Lägg till användare"
-#: contrib/admin/views/auth.py:57
+#: contrib/admin/views/auth.py:58
msgid "Password changed successfully."
-msgstr "Lösenordet ändrades framgångsrikt."
+msgstr "Lösenordet ändrades."
-#: contrib/admin/views/auth.py:64
+#: contrib/admin/views/auth.py:65
#, python-format
msgid "Change password: %s"
msgstr "Ändra lösenord: %s"
-#: contrib/admin/views/main.py:223
+#: contrib/admin/views/main.py:230
msgid "Site administration"
-msgstr "Site-administration"
+msgstr "Webbplatsadministration"
-#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
+#: contrib/admin/views/main.py:278 contrib/admin/views/main.py:363
#, python-format
msgid "You may add another %s below."
msgstr "Du kan lägga till en till %s nedanför."
-#: contrib/admin/views/main.py:289
+#: contrib/admin/views/main.py:296
#, python-format
msgid "Add %s"
msgstr "Lägg till %s"
-#: contrib/admin/views/main.py:335
+#: contrib/admin/views/main.py:342
#, python-format
msgid "Added %s."
msgstr "Lade till %s."
-#: contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:344
#, python-format
msgid "Changed %s."
msgstr "Ändrade %s."
-#: contrib/admin/views/main.py:339
+#: contrib/admin/views/main.py:346
#, python-format
msgid "Deleted %s."
msgstr "Tog bort %s."
-#: contrib/admin/views/main.py:342
+#: contrib/admin/views/main.py:349
msgid "No fields changed."
msgstr "Inga fält ändrade."
-#: contrib/admin/views/main.py:345
+#: contrib/admin/views/main.py:352
#, python-format
msgid "The %(name)s \"%(obj)s\" was changed successfully."
msgstr "%(name)s \"%(obj)s\" ändrades."
-#: contrib/admin/views/main.py:353
+#: contrib/admin/views/main.py:360
#, python-format
msgid ""
"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
msgstr "%(name)s \"%(obj)s\" lades till. Du kan ändra det igen nedanför."
-#: contrib/admin/views/main.py:391
+#: contrib/admin/views/main.py:398
#, python-format
msgid "Change %s"
msgstr "Ändra %s"
-#: contrib/admin/views/main.py:476
+#: contrib/admin/views/main.py:483
#, python-format
msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
msgstr "Ett eller flera %(fieldname)s i %(name)s: %(obj)s"
-#: contrib/admin/views/main.py:481
+#: contrib/admin/views/main.py:488
#, python-format
msgid "One or more %(fieldname)s in %(name)s:"
msgstr "Ett eller flera %(fieldname)s i %(name)s:"
-#: contrib/admin/views/main.py:514
+#: contrib/admin/views/main.py:520
#, python-format
msgid "The %(name)s \"%(obj)s\" was deleted successfully."
msgstr "%(name)set \"%(obj)s\" togs bort."
-#: contrib/admin/views/main.py:517
+#: contrib/admin/views/main.py:523
msgid "Are you sure?"
msgstr "Är du säker?"
-#: contrib/admin/views/main.py:539
+#: contrib/admin/views/main.py:545
#, python-format
msgid "Change history: %s"
-msgstr "Ändra historik: %s"
+msgstr "Ändringshistorik: %s"
-#: contrib/admin/views/main.py:573
+#: contrib/admin/views/main.py:579
#, python-format
msgid "Select %s"
msgstr "Välj %s"
-#: contrib/admin/views/main.py:573
+#: contrib/admin/views/main.py:579
#, python-format
msgid "Select %s to change"
msgstr "Välj %s att ändra"
-#: contrib/admin/views/main.py:768
+#: contrib/admin/views/main.py:780
msgid "Database error"
msgstr "Databasfel"
-#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:60
-msgid ""
-"Please enter a correct username and password. Note that both fields are case-"
-"sensitive."
-msgstr ""
-"Var god ange ett korrekt användarnamn och lösenord. Observera att båda "
-"fälten är skiftlägeskänsliga."
-
-#: contrib/admin/views/decorators.py:24
-#: contrib/admin/templates/admin/login.html:25
-msgid "Log in"
-msgstr "Logga in"
-
-#: 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 ""
-"Var god logga in igen, eftersom din session har tagit slut. "
-"Oroa dig inte: Ditt bidrag har sparats."
-
-#: 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 ""
-"Det ser ut som om din webläsare inte är konfigurerad att acceptera cookies. "
-"Aktivera cookies, ladda om den här sidan, och försök igen."
-
-#: contrib/admin/views/decorators.py:83
-msgid "Usernames cannot contain the '@' character."
-msgstr "Användarnamn kan inte innehålla '@' tecknet."
-
-#: contrib/admin/views/decorators.py:85
-#, python-format
-msgid "Your e-mail address is not your username. Try '%s' instead."
-msgstr "Din e-mailadress är inte ditt användarnamn. Försök med '%s' istället."
-
-#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
-#: contrib/admin/views/doc.py:50
+#: contrib/admin/views/doc.py:47 contrib/admin/views/doc.py:49
+#: contrib/admin/views/doc.py:51
msgid "tag:"
msgstr "tagg:"
-#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
-#: contrib/admin/views/doc.py:81
+#: contrib/admin/views/doc.py:78 contrib/admin/views/doc.py:80
+#: contrib/admin/views/doc.py:82
msgid "filter:"
msgstr "filter:"
-#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
-#: contrib/admin/views/doc.py:139
+#: contrib/admin/views/doc.py:136 contrib/admin/views/doc.py:138
+#: contrib/admin/views/doc.py:140
msgid "view:"
msgstr "vy:"
-#: contrib/admin/views/doc.py:164
+#: contrib/admin/views/doc.py:165
#, python-format
msgid "App %r not found"
msgstr "Applikation %r hittades inte"
-#: contrib/admin/views/doc.py:171
-#, fuzzy, python-format
+#: contrib/admin/views/doc.py:172
+#, python-format
msgid "Model %(name)r not found in app %(label)r"
-msgstr "Modellen %(model_name)r hittades inte i applikation %(app_label)r"
+msgstr "Modellen %(name)r hittades inte i applikation %(label)r"
-#: contrib/admin/views/doc.py:183
-#, fuzzy, python-format
+#: contrib/admin/views/doc.py:184
+#, python-format
msgid "the related `%(label)s.%(type)s` object"
-msgstr "det relaterade `%(app_label)s.%(data_type)s` objektet"
+msgstr "det relaterade `%(label)s.%(type)s`-objektet"
-#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
-#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
+#: contrib/admin/views/doc.py:184 contrib/admin/views/doc.py:206
+#: contrib/admin/views/doc.py:220 contrib/admin/views/doc.py:225
msgid "model:"
msgstr "modell:"
-#: contrib/admin/views/doc.py:214
-#, fuzzy, python-format
+#: contrib/admin/views/doc.py:215
+#, python-format
msgid "related `%(label)s.%(name)s` objects"
-msgstr "relaterade `%(app_label)s.%(object_name)s` objekt"
+msgstr "relaterade `%(label)s.%(name)s`-objekt"
-#: contrib/admin/views/doc.py:219
+#: contrib/admin/views/doc.py:220
#, python-format
msgid "all %s"
msgstr "alla %s"
-#: contrib/admin/views/doc.py:224
+#: contrib/admin/views/doc.py:225
#, python-format
msgid "number of %s"
msgstr "antal %s"
-#: contrib/admin/views/doc.py:229
+#: contrib/admin/views/doc.py:230
#, python-format
msgid "Fields on %s objects"
msgstr "Fält på %s objekt"
-#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:302
-#: contrib/admin/views/doc.py:304 contrib/admin/views/doc.py:310
-#: contrib/admin/views/doc.py:311 contrib/admin/views/doc.py:313
+#: contrib/admin/views/doc.py:292 contrib/admin/views/doc.py:303
+#: contrib/admin/views/doc.py:305 contrib/admin/views/doc.py:311
+#: contrib/admin/views/doc.py:312 contrib/admin/views/doc.py:314
msgid "Integer"
msgstr "Heltal"
-#: contrib/admin/views/doc.py:292
+#: contrib/admin/views/doc.py:293
msgid "Boolean (Either True or False)"
msgstr "Boolesk (antingen True eller False)"
-#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:312
+#: contrib/admin/views/doc.py:294 contrib/admin/views/doc.py:313
#, python-format
msgid "String (up to %(maxlength)s)"
msgstr "Sträng (upp till %(maxlength)s)"
-#: contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295
msgid "Comma-separated integers"
msgstr "Komma-separerade heltal"
-#: contrib/admin/views/doc.py:295
+#: contrib/admin/views/doc.py:296
msgid "Date (without time)"
msgstr "Datum (utan tid)"
-#: contrib/admin/views/doc.py:296
+#: contrib/admin/views/doc.py:297
msgid "Date (with time)"
msgstr "Datum (med tid)"
-#: contrib/admin/views/doc.py:297
+#: contrib/admin/views/doc.py:298
msgid "Decimal number"
msgstr "Decimaltal"
-#: contrib/admin/views/doc.py:298
+#: contrib/admin/views/doc.py:299
msgid "E-mail address"
msgstr "E-postadress:"
-#: contrib/admin/views/doc.py:299 contrib/admin/views/doc.py:300
-#: contrib/admin/views/doc.py:303
+#: contrib/admin/views/doc.py:300 contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:304
msgid "File path"
msgstr "Filsökväg"
-#: contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:302
msgid "Floating point number"
msgstr "Flyttal"
-#: contrib/admin/views/doc.py:307
+#: contrib/admin/views/doc.py:308
msgid "Boolean (Either True, False or None)"
msgstr "Boolesk (antingen True, False eller None)"
-#: contrib/admin/views/doc.py:308
+#: contrib/admin/views/doc.py:309
msgid "Relation to parent model"
msgstr "Relation till förälder-modell"
-#: contrib/admin/views/doc.py:309
+#: contrib/admin/views/doc.py:310
msgid "Phone number"
msgstr "Telefonnummer"
-#: contrib/admin/views/doc.py:314
+#: contrib/admin/views/doc.py:315
msgid "Text"
msgstr "Text"
-#: contrib/admin/views/doc.py:315
+#: contrib/admin/views/doc.py:316
msgid "Time"
msgstr "Tid"
-#: contrib/admin/views/doc.py:316 contrib/flatpages/models.py:7
+#: contrib/admin/views/doc.py:317 contrib/flatpages/models.py:7
msgid "URL"
msgstr "URL"
-#: contrib/admin/views/doc.py:317
+#: contrib/admin/views/doc.py:318
msgid "U.S. state (two uppercase letters)"
-msgstr "Stat i USA (två versaler)"
+msgstr "Delstat i USA (två versaler)"
-#: contrib/admin/views/doc.py:318
+#: contrib/admin/views/doc.py:319
msgid "XML text"
msgstr "XML-text"
-#: contrib/admin/views/doc.py:344
+#: contrib/admin/views/doc.py:345
#, python-format
msgid "%s does not appear to be a urlpattern object"
msgstr "%s verkar inte vara ett urlpattern-objekt"
#: contrib/admin/templates/widget/file.html:2
msgid "Currently:"
-msgstr "Nuvarande:"
+msgstr "Aktuell:"
#: contrib/admin/templates/widget/file.html:3
msgid "Change:"
@@ -1538,11 +1538,11 @@ msgstr "Datum:"
msgid "Time:"
msgstr "Tid:"
-#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
@@ -1550,36 +1550,36 @@ msgstr "Tid:"
msgid "Documentation"
msgstr "Dokumentation"
-#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/admin/auth/user/change_password.html:9
#: contrib/admin/templates/admin/auth/user/change_password.html:15
#: contrib/admin/templates/admin/auth/user/change_password.html:46
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/view_detail.html:4
#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
#: contrib/admin/templates/admin_doc/missing_docutils.html:4
#: contrib/admin/templates/admin_doc/view_index.html:5
#: contrib/admin/templates/admin_doc/model_detail.html:3
#: contrib/admin/templates/admin_doc/index.html:4
#: contrib/admin/templates/admin_doc/model_index.html:5
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
msgid "Change password"
msgstr "Ändra lösenord"
-#: contrib/admin/templates/admin/change_list.html:6
#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_list.html:6
#: contrib/admin/templates/admin/500.html:4
#: 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/admin/delete_confirmation.html:6
#: contrib/admin/templates/admin/auth/user/change_password.html:12
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_reset_form.html:4
@@ -1590,16 +1590,6 @@ msgstr "Ändra lösenord"
msgid "Home"
msgstr "Hem"
-#: contrib/admin/templates/admin/change_list.html:12
-#, python-format
-msgid "Add %(name)s"
-msgstr "Lägg till %(name)s"
-
-#: contrib/admin/templates/admin/filter.html:2
-#, python-format
-msgid " By %(filter_title)s "
-msgstr " Av %(filter_title)s "
-
#: contrib/admin/templates/admin/object_history.html:5
#: contrib/admin/templates/admin/change_form.html:21
msgid "History"
@@ -1627,35 +1617,17 @@ msgid ""
"admin site."
msgstr ""
"Det här objektet har ingen ändringshistorik. Det lades antagligen inte till "
-"via denna administrationssite."
-
-#: contrib/admin/templates/admin/search_form.html:8
-msgid "Go"
-msgstr "Kör"
+"via denna administrationssida."
-#: contrib/admin/templates/admin/search_form.html:10
+#: contrib/admin/templates/admin/change_list.html:12
#, python-format
-msgid "1 result"
-msgid_plural "%(counter)s results"
-msgstr[0] "1 resultat"
-msgstr[1] "%(counter)s resultat"
+msgid "Add %(name)s"
+msgstr "Lägg till %(name)s"
-#: contrib/admin/templates/admin/search_form.html:10
+#: contrib/admin/templates/admin/filter.html:2
#, python-format
-msgid "%(full_result_count)s total"
-msgstr "%(full_result_count)s totalt"
-
-#: contrib/admin/templates/admin/pagination.html:10
-msgid "Show all"
-msgstr "Visa alla"
-
-#: contrib/admin/templates/admin/base_site.html:4
-msgid "Django site admin"
-msgstr "Django site-administration"
-
-#: contrib/admin/templates/admin/base_site.html:7
-msgid "Django administration"
-msgstr "Django administration"
+msgid " By %(filter_title)s "
+msgstr " Av %(filter_title)s "
#: contrib/admin/templates/admin/500.html:4
msgid "Server error"
@@ -1674,7 +1646,7 @@ 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 ""
-"Ett fel har uppstått. Administratören har meddelats via e-mail och felet bör "
+"Ett fel har uppstått. Administratören har meddelats via e-post och felet bör "
"åtgärdas snart. Tack för ditt tålamod."
#: contrib/admin/templates/admin/invalid_setup.html:8
@@ -1684,12 +1656,53 @@ msgid ""
"the appropriate user."
msgstr ""
"Någonting är fel med din databasinstallation. Se till att de rätta "
-"tabellerna har skapats och att databasen är läsbar av rätt användare."
+"databastabellerna har skapats och att databasen är läsbar av rätt användare."
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Kör"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 resultat"
+msgstr[1] "%(counter)s resultat"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s totalt"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Visa alla"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django webbplatsadministration"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django-administration"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filter"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Sidan kunde inte hittas"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Vi är ledsna, men den efterfrågade sidan kunde inte hittas."
#: contrib/admin/templates/admin/index.html:17
#, python-format
msgid "Models available in the %(name)s application."
-msgstr "Modeller tillgängliga i %(name)s applikationen."
+msgstr "Modeller tillgängliga i applikationen %(name)s."
#: contrib/admin/templates/admin/index.html:18
#, python-format
@@ -1698,9 +1711,8 @@ msgstr "%(name)s"
#: contrib/admin/templates/admin/index.html:28
#: contrib/admin/templates/admin/change_form.html:15
-#, fuzzy
msgid "Add"
-msgstr "Lägg&nbsp;till"
+msgstr "Lägg till"
#: contrib/admin/templates/admin/index.html:34
msgid "Change"
@@ -1712,32 +1724,19 @@ msgstr "Du har inte rättigheter att ändra något."
#: contrib/admin/templates/admin/index.html:52
msgid "Recent Actions"
-msgstr "Senaste Händelserna"
+msgstr "Senaste händelser"
#: contrib/admin/templates/admin/index.html:53
msgid "My Actions"
-msgstr "Mina Händelser"
+msgstr "Mina händelser"
#: contrib/admin/templates/admin/index.html:57
msgid "None available"
msgstr "Inga tillgängliga"
-#: contrib/admin/templates/admin/404.html:4
-#: contrib/admin/templates/admin/404.html:8
-msgid "Page not found"
-msgstr "Sidan kunde inte hittas"
-
-#: contrib/admin/templates/admin/404.html:10
-msgid "We're sorry, but the requested page could not be found."
-msgstr "Vi är ledsna, men den efterfrågade sidan kunde inte hittas."
-
-#: contrib/admin/templates/admin/filters.html:4
-msgid "Filter"
-msgstr "Filter"
-
#: contrib/admin/templates/admin/change_form.html:22
msgid "View on site"
-msgstr "Visa på site"
+msgstr "Visa på webbplats"
#: contrib/admin/templates/admin/change_form.html:32
#: contrib/admin/templates/admin/auth/user/change_password.html:24
@@ -1754,6 +1753,10 @@ msgstr "Sortering"
msgid "Order:"
msgstr "Sortera:"
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Välkommen,"
+
#: contrib/admin/templates/admin/delete_confirmation.html:9
#: contrib/admin/templates/admin/submit_line.html:3
msgid "Delete"
@@ -1767,7 +1770,7 @@ msgid ""
"following types of objects:"
msgstr ""
"Att ta bort %(object_name)s '%(escaped_object)s' skulle innebära att "
-"besläktade objekt togs bort, men ditt konto har inte rättigheter att ta bort "
+"relaterade objekt togs bort, men ditt konto har inte rättigheter att ta bort "
"följande objekttyper:"
#: contrib/admin/templates/admin/delete_confirmation.html:21
@@ -1777,16 +1780,12 @@ msgid ""
"All of the following related items will be deleted:"
msgstr ""
"Är du säker på att du vill ta bort %(object_name)s \"%(escaped_object)s\"? "
-"Alla dessa sammanlänkade objekt kommer att tas bort:"
+"Alla dessa relaterade objekt kommer att tas bort:"
#: contrib/admin/templates/admin/delete_confirmation.html:26
msgid "Yes, I'm sure"
msgstr "Ja, jag är säker"
-#: contrib/admin/templates/admin/base.html:25
-msgid "Welcome,"
-msgstr "Välkommen,"
-
#: contrib/admin/templates/admin/submit_line.html:4
msgid "Save as new"
msgstr "Spara som ny"
@@ -1821,14 +1820,14 @@ msgstr "Lösenord (igen)"
#: contrib/admin/templates/admin/auth/user/change_password.html:40
#: contrib/admin/templates/admin/auth/user/add_form.html:24
msgid "Enter the same password as above, for verification."
-msgstr "Fyll i samma lösenord som ovan för verifiering."
+msgstr "Fyll i samma lösenord som ovan, för verifiering."
#: 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 ""
-"Ange först ett användarnamn och ett lösenord. Sedan kommer du att kunna "
+"Ange först ett användarnamn och ett lösenord. Du kommer sedan att kunna "
"ändra fler användaralternativ."
#: contrib/admin/templates/admin/auth/user/add_form.html:12
@@ -1863,8 +1862,8 @@ msgid ""
"Forgotten your password? Enter your e-mail address below, and we'll reset "
"your password and e-mail the new one to you."
msgstr ""
-"Har du glömt ditt lösenord? Fyll i din e-mailadress nedan, så nollställer vi "
-"ditt lösenord och mailar det nya till dig."
+"Har du glömt ditt lösenord? Fyll i din e-postadress nedan, så nollställer vi "
+"ditt lösenord och skickar det nya till dig via e-post."
#: contrib/admin/templates/registration/password_reset_form.html:16
msgid "E-mail address:"
@@ -1876,7 +1875,7 @@ msgstr "Nollställ mitt lösenord"
#: contrib/admin/templates/registration/logged_out.html:8
msgid "Thanks for spending some quality time with the Web site today."
-msgstr "Tack för att du spenderade kvalitetstid med web-siten idag."
+msgstr "Tack för att du spenderade lite kvalitetstid med webbplatsen idag."
#: contrib/admin/templates/registration/logged_out.html:10
msgid "Log in again"
@@ -1885,15 +1884,15 @@ msgstr "Logga in igen"
#: contrib/admin/templates/registration/password_reset_done.html:6
#: contrib/admin/templates/registration/password_reset_done.html:10
msgid "Password reset successful"
-msgstr "Lösenordsnollställning lyckades."
+msgstr "Lösenordsnollställning lyckades"
#: 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 ""
-"Vi har skickat ett nytt lösenord till e-mailadressen du fyllde i. Det bör "
-"anlända snarast."
+"Vi har skickat ett nytt lösenord till e-postadressen du fyllde i. Det bör "
+"anlända inom kort."
#: contrib/admin/templates/registration/password_change_form.html:12
msgid ""
@@ -1905,7 +1904,7 @@ msgstr ""
#: contrib/admin/templates/registration/password_change_form.html:17
msgid "Old password:"
-msgstr "Gamla lösenordet:"
+msgstr "Gammalt lösenord:"
#: contrib/admin/templates/registration/password_change_form.html:19
msgid "New password:"
@@ -1921,7 +1920,8 @@ msgstr "Ändra mitt lösenord"
#: contrib/admin/templates/registration/password_reset_email.html:2
msgid "You're receiving this e-mail because you requested a password reset"
-msgstr "Du får det här mailet eftersom du bad om att få lösenordet nollställt"
+msgstr ""
+"Du får det här e-postbrevet eftersom du bad om att få lösenordet nollställt"
#: contrib/admin/templates/registration/password_reset_email.html:3
#, python-format
@@ -1936,8 +1936,7 @@ msgstr "Ditt nya lösenord är: %(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 ""
-"Känn dig välkommen att ändra det här lösenordet genom att gå till den här "
-"sidan:"
+"Du är välkommen att ändra det här lösenordet genom att gå till den här sidan:"
#: contrib/admin/templates/registration/password_reset_email.html:11
msgid "Your username, in case you've forgotten:"
@@ -1945,7 +1944,7 @@ msgstr "Ditt användarnamn, om du har glömt:"
#: contrib/admin/templates/registration/password_reset_email.html:13
msgid "Thanks for using our site!"
-msgstr "Tack för att du använder vår site!"
+msgstr "Tack för att du använder vår webbplats!"
#: contrib/admin/templates/registration/password_reset_email.html:15
#, python-format
@@ -1974,7 +1973,7 @@ msgstr ""
"<p class=\"help\">För att installera smarta bokmärken, dra länken till din\n"
"verktygsrad med bokmärken, eller högerklicka på länken och lägg till den\n"
"till dina bokmärken. Nu kan du välja det smarta bokmärket från alla sidor\n"
-"på siten. Observera att några av dessa smarta bokmärken kräver att du "
+"på webbplatsen. Observera att några av dessa smarta bokmärken kräver att du "
"besöker\n"
"sidan från en dator som är \"intern\" (tala med din systemadministratör\n"
"om du inte är säker på om din dator är \"intern\").</p>\n"
@@ -2000,12 +1999,12 @@ msgid ""
"Shows the content-type and unique ID for pages that represent a single "
"object."
msgstr ""
-"Visa innehållstypen och det unika ID:t för sidor som representerar ett "
+"Visa innehållstypen och det unika ID-numret för sidor som representerar ett "
"enskilt objekt."
#: contrib/admin/templates/admin_doc/bookmarklets.html:25
msgid "Edit this object (current window)"
-msgstr "Redigera det här objektet (nuvarande fönster)"
+msgstr "Redigera det här objektet (aktuellt fönster)"
#: contrib/admin/templates/admin_doc/bookmarklets.html:26
msgid "Jumps to the admin page for pages that represent a single object."
@@ -2021,123 +2020,123 @@ msgstr "Redigera det här objektet (nytt fönster)"
msgid "As above, but opens the admin page in a new window."
msgstr "Som ovan, men öppnar administrationssidan i ett nytt fönster."
-#: contrib/contenttypes/models.py:36
+#: contrib/contenttypes/models.py:37
msgid "python model class name"
-msgstr "python modell klassnamn"
+msgstr "Python-modellklassnamn"
-#: contrib/contenttypes/models.py:39
+#: contrib/contenttypes/models.py:40
msgid "content type"
msgstr "innehållstyp"
-#: contrib/contenttypes/models.py:40
+#: contrib/contenttypes/models.py:41
msgid "content types"
msgstr "innehållstyper"
-#: contrib/auth/views.py:40
+#: contrib/auth/views.py:41
msgid "Logged out"
msgstr "Utloggad"
-#: contrib/auth/models.py:44 contrib/auth/models.py:64
+#: contrib/auth/models.py:51 contrib/auth/models.py:71
msgid "name"
msgstr "namn"
-#: contrib/auth/models.py:46
+#: contrib/auth/models.py:53
msgid "codename"
msgstr "kodnamn"
-#: contrib/auth/models.py:49
+#: contrib/auth/models.py:56
msgid "permission"
msgstr "rättighet"
-#: contrib/auth/models.py:50 contrib/auth/models.py:65
+#: contrib/auth/models.py:57 contrib/auth/models.py:72
msgid "permissions"
msgstr "rättigheter"
-#: contrib/auth/models.py:68
+#: contrib/auth/models.py:75
msgid "group"
msgstr "grupp"
-#: contrib/auth/models.py:69 contrib/auth/models.py:109
+#: contrib/auth/models.py:76 contrib/auth/models.py:116
msgid "groups"
msgstr "grupper"
-#: contrib/auth/models.py:99
+#: contrib/auth/models.py:106
msgid "username"
msgstr "användarnamn"
-#: contrib/auth/models.py:99
+#: contrib/auth/models.py:106
msgid ""
"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
"digits and underscores)."
msgstr ""
-"Obligatorisk. 30 tecken eller mindre. Endast bokstäver, siffror eller "
-"understräck."
+"Obligatorisk. 30 tecken eller färre. Endast bokstäver, siffror eller "
+"understreck."
-#: contrib/auth/models.py:100
+#: contrib/auth/models.py:107
msgid "first name"
msgstr "förnamn"
-#: contrib/auth/models.py:101
+#: contrib/auth/models.py:108
msgid "last name"
msgstr "efternamn"
-#: contrib/auth/models.py:102
+#: contrib/auth/models.py:109
msgid "e-mail address"
-msgstr "e-mailadress"
+msgstr "e-postadress"
-#: contrib/auth/models.py:103
+#: contrib/auth/models.py:110
msgid "password"
msgstr "lösenord"
-#: contrib/auth/models.py:103
+#: contrib/auth/models.py:110
msgid ""
"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
"password form</a>."
msgstr ""
"Använd '[algo]$[salt]$[hexdigest]' eller använd <a href=\"password/\">Ändra "
-"lösenord</a>."
+"lösenord-formuläret</a>."
-#: contrib/auth/models.py:104
+#: contrib/auth/models.py:111
msgid "staff status"
msgstr "personalstatus"
-#: contrib/auth/models.py:104
+#: contrib/auth/models.py:111
msgid "Designates whether the user can log into this admin site."
-msgstr "Avgör om användaren kan logga in på den här admin-siten."
+msgstr "Avgör om användaren kan logga in på den här adminsidan."
-#: contrib/auth/models.py:105
+#: contrib/auth/models.py:112
msgid "active"
msgstr "aktiv"
-#: contrib/auth/models.py:105
+#: contrib/auth/models.py:112
msgid ""
"Designates whether this user can log into the Django admin. Unselect this "
"instead of deleting accounts."
msgstr ""
-"Avgör om användaren kan logga in till Django admin. Avmarkera denna "
+"Avgör om användaren kan logga in till Django-adminsidan. Avmarkera denna "
"istället för att ta bort konton."
-#: contrib/auth/models.py:106
+#: contrib/auth/models.py:113
msgid "superuser status"
msgstr "superanvändare"
-#: contrib/auth/models.py:106
+#: contrib/auth/models.py:113
msgid ""
"Designates that this user has all permissions without explicitly assigning "
"them."
msgstr ""
-"Avgör om användaren har alla rättigheter utan att uttryckligen tilldela "
-"dem"
+"Anger att den här användaren har alla rättigheter utan att uttryckligen "
+"tilldela dem."
-#: contrib/auth/models.py:107
+#: contrib/auth/models.py:114
msgid "last login"
msgstr "senaste inloggning"
-#: contrib/auth/models.py:108
+#: contrib/auth/models.py:115
msgid "date joined"
msgstr "registreringsdatum"
-#: contrib/auth/models.py:110
+#: contrib/auth/models.py:117
msgid ""
"In addition to the permissions manually assigned, this user will also get "
"all permissions granted to each group he/she is in."
@@ -2145,43 +2144,38 @@ msgstr ""
"Förutom de rättigheterna som utdelas manuellt så kommer användaren dessutom "
"få samma rättigheter som de grupper där han/hon är medlem."
-#: contrib/auth/models.py:111
+#: contrib/auth/models.py:118
msgid "user permissions"
msgstr "användarättigheter"
-#: contrib/auth/models.py:115
+#: contrib/auth/models.py:122
msgid "user"
msgstr "användare"
-#: contrib/auth/models.py:116
+#: contrib/auth/models.py:123
msgid "users"
msgstr "användare"
-#: contrib/auth/models.py:122
+#: contrib/auth/models.py:129
msgid "Personal info"
msgstr "Personlig information"
-#: contrib/auth/models.py:123
+#: contrib/auth/models.py:130
msgid "Permissions"
msgstr "Rättigheter"
-#: contrib/auth/models.py:124
+#: contrib/auth/models.py:131
msgid "Important dates"
msgstr "Viktiga datum"
-#: contrib/auth/models.py:125
+#: contrib/auth/models.py:132
msgid "Groups"
msgstr "Grupper"
-#: contrib/auth/models.py:269
+#: contrib/auth/models.py:274
msgid "message"
msgstr "meddelande"
-#: contrib/auth/models.py:282
-#, fuzzy
-msgid "AnonymousUser"
-msgstr "Anonym användare"
-
#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
msgid "The two password fields didn't match."
msgstr "De båda lösenorden stämde inte överens."
@@ -2195,40 +2189,36 @@ msgid ""
"Your Web browser doesn't appear to have cookies enabled. Cookies are "
"required for logging in."
msgstr ""
-"Din webläsare verkar inte stödja cookies. Cookie behövs för att kunna logga "
-"in."
+"Din webbläsare verkar inte tillåta cookies. Cookies behövs för att kunna "
+"logga in."
#: contrib/auth/forms.py:62
msgid "This account is inactive."
msgstr "Detta konto är inaktivt."
-#: contrib/auth/forms.py:85
+#: contrib/auth/forms.py:84
msgid ""
"That e-mail address doesn't have an associated user account. Are you sure "
"you've registered?"
msgstr ""
-"Den e-mailadressen har inte något konto associerat med sig. Är du säker på "
-"att du har registrerat dig?"
+"Den e-postadressen är inte associerad med något användarkonto. Är du säker "
+"på att du har registrerat dig?"
#: contrib/auth/forms.py:117
msgid "The two 'new password' fields didn't match."
-msgstr "De två lösenordsfälten stämde inte överens."
+msgstr "De två 'nytt lösenord'-fälten stämde inte överens."
#: contrib/auth/forms.py:124
msgid "Your old password was entered incorrectly. Please enter it again."
-msgstr "Ditt gamla lösenord var felaktigt ifyllt. Var vänlig fyll i det igen"
+msgstr "Ditt gamla lösenord var felaktigt ifyllt. Var vänlig fyll i det igen."
#: contrib/localflavor/uk/forms.py:18
msgid "Enter a postcode. A space is required between the two postcode parts."
msgstr "Fyll i ett postnummer. Du måste ha mellanslag mellan nummerdelarna."
-#: contrib/localflavor/au/forms.py:18
-msgid "Enter a 4 digit post code."
-msgstr "Fyll i en fyra-sifrigt postkod."
-
#: contrib/localflavor/br/forms.py:18
msgid "Enter a zip code in the format XXXXX-XXX."
-msgstr "Fyll i zipkod i XXXXX-XXX format."
+msgstr "Fyll i zipkod på formatet XXXXX-XXX."
#: contrib/localflavor/br/forms.py:30
msgid "Phone numbers must be in XX-XXXX-XXXX format."
@@ -2254,14 +2244,26 @@ msgstr "Detta fält kräver minst 14 sifrror"
msgid "Invalid CNPJ number."
msgstr "Ogiltigt CNPJ-nummer."
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr "Fyll i en fyrsiffrig postkod."
+
#: contrib/localflavor/fr/forms.py:17 contrib/localflavor/de/forms.py:16
#: contrib/localflavor/fi/forms.py:14
msgid "Enter a zip code in the format XXXXX."
-msgstr "Fyll i en zipkod i XXXXX format."
+msgstr "Fyll i en zipkod på formatet XXXXX."
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Fyll i zipkod på formatet XXXXX eller XXXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Fyll i ett giltigt amerikanskt personnummer i formatet XXX-XX-XXXX."
#: contrib/localflavor/de/de_states.py:5
msgid "Baden-Wuerttemberg"
-msgstr ""
+msgstr "Baden-Württemberg"
#: contrib/localflavor/de/de_states.py:6
msgid "Bavaria"
@@ -2296,9 +2298,8 @@ msgid "Lower Saxony"
msgstr "Nedre Sachsen"
#: contrib/localflavor/de/de_states.py:14
-#, fuzzy
msgid "North Rhine-Westphalia"
-msgstr "Norra Rhen-Westphalia"
+msgstr "Nordrhein-Westfalen"
#: contrib/localflavor/de/de_states.py:15
msgid "Rhineland-Palatinate"
@@ -2318,19 +2319,23 @@ msgstr "Sachsen-Anhalt"
#: contrib/localflavor/de/de_states.py:19
msgid "Schleswig-Holstein"
-msgstr ""
+msgstr "Schleswig-Holstein"
#: contrib/localflavor/de/de_states.py:20
msgid "Thuringia"
-msgstr ""
+msgstr "Thüringen"
#: contrib/localflavor/de/forms.py:60
msgid ""
"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
"format."
msgstr ""
-"Fyll i ett giltigt tyskt ID-kortnummer i XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
-"format."
+"Fyll i ett giltigt tyskt ID-kortnummer på formatet XXXXXXXXXXX-XXXXXXX-"
+"XXXXXXX-X."
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Fyll i postkod på formatet XXXXXXX eller XXX-XXXX."
#: contrib/localflavor/jp/jp_prefectures.py:4
msgid "Hokkaido"
@@ -2520,170 +2525,158 @@ msgstr "kagoshima"
msgid "Okinawa"
msgstr "Okinawa"
-#: contrib/localflavor/jp/forms.py:21
-msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
-msgstr "Fyll i zipkod i formatet XXXXXXX eller XXX-XXXX."
-
-#: contrib/localflavor/it/forms.py:16
-msgid "Enter a valid zip code."
-msgstr "Fyll i en giltigt zipkod."
-
-#: contrib/localflavor/it/forms.py:41
-msgid "Enter a valid Social Security number."
-msgstr "Fyll i ett giltigt personnummer."
-
-#: contrib/localflavor/it/forms.py:68
-msgid "Enter a valid VAT number."
-msgstr "Fyll i ett giltigt VAT-nummer."
-
-#: contrib/localflavor/no/forms.py:15 contrib/localflavor/ch/forms.py:18
-msgid "Enter a zip code in the format XXXX."
-msgstr "Fyll i zipkod i formatet XXXX."
-
-#: contrib/localflavor/no/forms.py:36
-msgid "Enter a valid Norwegian social security number."
-msgstr "Fyll i ett giltigt norskt personnummer."
-
-#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
-msgid "Enter a valid Finnish social security number."
-msgstr "Fyll i ett giltigt finskt personnummer."
-
-#: contrib/localflavor/us/forms.py:18
-msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
-msgstr "Fyll i zipkod i formatet XXXXX eller XXXXX-XXXX."
-
-#: contrib/localflavor/us/forms.py:51
-msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
-msgstr "Fyll i ett giltigt amerikanskt personnummer i XXX-XX-XXXX format."
-
-#: contrib/localflavor/is_/forms.py:16
-msgid ""
-"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
-msgstr "Fyll i ett giltigt isländskt personnummer. Formatet är XXXXXX-XXXX."
-
-#: contrib/localflavor/is_/forms.py:30
-msgid "The Icelandic identification number is not valid."
-msgstr "Det isländska personnumret är inte giltigt."
-
-#: contrib/localflavor/cl/forms.py:21
-msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
-msgstr "Fyll i ett giltigt chileanskt RUT. Formatet är XX.XXX.XXX-X."
-
-#: contrib/localflavor/cl/forms.py:26
-msgid "Enter valid a Chilean RUT"
-msgstr "Fyll i ett giltigt chileanskt RUT"
-
#: contrib/localflavor/ch/ch_states.py:5
msgid "Aargau"
msgstr "Aargau"
#: contrib/localflavor/ch/ch_states.py:6
msgid "Appenzell Innerrhoden"
-msgstr ""
+msgstr "Appenzell Innerrhoden"
#: contrib/localflavor/ch/ch_states.py:7
msgid "Appenzell Ausserrhoden"
-msgstr ""
+msgstr "Appenzell Ausserrhoden"
#: contrib/localflavor/ch/ch_states.py:8
msgid "Basel-Stadt"
-msgstr ""
+msgstr "Basel-Stadt"
#: contrib/localflavor/ch/ch_states.py:9
msgid "Basel-Land"
-msgstr ""
+msgstr "Basel-Landschaft"
#: contrib/localflavor/ch/ch_states.py:10
msgid "Berne"
-msgstr ""
+msgstr "Bern"
#: contrib/localflavor/ch/ch_states.py:11
msgid "Fribourg"
-msgstr ""
+msgstr "Fribourg"
#: contrib/localflavor/ch/ch_states.py:12
msgid "Geneva"
-msgstr ""
+msgstr "Genève"
#: contrib/localflavor/ch/ch_states.py:13
msgid "Glarus"
-msgstr ""
+msgstr "Glarus"
#: contrib/localflavor/ch/ch_states.py:14
msgid "Graubuenden"
-msgstr ""
+msgstr "Graubünden"
#: contrib/localflavor/ch/ch_states.py:15
msgid "Jura"
-msgstr ""
+msgstr "Jura"
#: contrib/localflavor/ch/ch_states.py:16
msgid "Lucerne"
-msgstr ""
+msgstr "Luzern"
#: contrib/localflavor/ch/ch_states.py:17
msgid "Neuchatel"
-msgstr ""
+msgstr "Neuchâtel"
#: contrib/localflavor/ch/ch_states.py:18
msgid "Nidwalden"
-msgstr ""
+msgstr "Nidwalden"
#: contrib/localflavor/ch/ch_states.py:19
msgid "Obwalden"
-msgstr ""
+msgstr "Obwalden"
#: contrib/localflavor/ch/ch_states.py:20
msgid "Schaffhausen"
-msgstr ""
+msgstr "Schaffhausen"
#: contrib/localflavor/ch/ch_states.py:21
msgid "Schwyz"
-msgstr ""
+msgstr "Schwyz"
#: contrib/localflavor/ch/ch_states.py:22
msgid "Solothurn"
-msgstr ""
+msgstr "Solothurn"
#: contrib/localflavor/ch/ch_states.py:23
msgid "St. Gallen"
-msgstr ""
+msgstr "Sankt Gallen"
#: contrib/localflavor/ch/ch_states.py:24
msgid "Thurgau"
-msgstr ""
+msgstr "Thurgau"
#: contrib/localflavor/ch/ch_states.py:25
msgid "Ticino"
-msgstr ""
+msgstr "Ticino"
#: contrib/localflavor/ch/ch_states.py:26
msgid "Uri"
-msgstr ""
+msgstr "Uri"
#: contrib/localflavor/ch/ch_states.py:27
msgid "Valais"
-msgstr ""
+msgstr "Valais"
#: contrib/localflavor/ch/ch_states.py:28
msgid "Vaud"
-msgstr ""
+msgstr "Vaud"
#: contrib/localflavor/ch/ch_states.py:29
msgid "Zug"
-msgstr ""
+msgstr "Zug"
#: contrib/localflavor/ch/ch_states.py:30
msgid "Zurich"
-msgstr ""
+msgstr "Zürich"
+
+#: contrib/localflavor/ch/forms.py:18 contrib/localflavor/no/forms.py:14
+msgid "Enter a zip code in the format XXXX."
+msgstr "Fyll i zipkod på formatet XXXX."
#: contrib/localflavor/ch/forms.py:90
msgid ""
"Enter a valid Swiss identity or passport card number in X1234567<0 or "
"1234567890 format."
msgstr ""
-"Fyll i ett giltigt Schweiziskt ID- eller passkortnummer i X1234567<0 eller "
-"1234567890 format."
+"Fyll i ett giltigt Schweiziskt ID- eller passkortnummer på formatet "
+"X1234567<0 eller 1234567890."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "Fyll i ett giltigt isländskt personnummer. Formatet är XXXXXX-XXXX."
+
+#: contrib/localflavor/is_/forms.py:31
+msgid "The Icelandic identification number is not valid."
+msgstr "Det isländska personnumret är inte giltigt."
+
+#: contrib/localflavor/it/forms.py:16
+msgid "Enter a valid zip code."
+msgstr "Fyll i en giltigt zipkod."
+
+#: contrib/localflavor/it/forms.py:41
+msgid "Enter a valid Social Security number."
+msgstr "Fyll i ett giltigt personnummer."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Fyll i ett giltigt VAT-nummer."
+
+#: contrib/localflavor/no/forms.py:35
+msgid "Enter a valid Norwegian social security number."
+msgstr "Fyll i ett giltigt norskt personnummer."
+
+#: contrib/localflavor/cl/forms.py:32
+msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Fyll i ett giltigt chilenskt RUT. Formatet är XX.XXX.XXX-X."
+
+#: contrib/localflavor/cl/forms.py:37
+msgid "Enter valid a Chilean RUT"
+msgstr "Fyll i ett giltigt chilenskt RUT"
+
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
+msgid "Enter a valid Finnish social security number."
+msgstr "Fyll i ett giltigt finskt personnummer."
#: contrib/sessions/models.py:68
msgid "session key"
@@ -2709,7 +2702,7 @@ msgstr "sessioner"
msgid ""
"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
msgstr ""
-"Exempel: '/om/kontakt/'. Se till att ha inledande och avslutande snedsträck."
+"Exempel: '/om/kontakt/'. Se till att ha inledande och avslutande snedstreck."
#: contrib/flatpages/models.py:9
msgid "title"
@@ -2733,7 +2726,7 @@ msgid ""
"will use 'flatpages/default.html'."
msgstr ""
"Exempel: 'sidor/kontaktsida.html'. Om det här inte fylls i kommer systemet "
-"att använda 'sidor/default.html'."
+"att använda 'flatpages/default.html'."
#: contrib/flatpages/models.py:14
msgid "registration required"
@@ -2742,15 +2735,15 @@ msgstr "registrering krävs"
#: contrib/flatpages/models.py:14
msgid "If this is checked, only logged-in users will be able to view the page."
msgstr ""
-"Om det här bockas i kommer endast inloggade användare att kunna visa sidan"
+"Om det här bockas i kommer endast inloggade användare att kunna se sidan."
#: contrib/flatpages/models.py:18
msgid "flat page"
-msgstr "flatsida"
+msgstr "flat sida"
#: contrib/flatpages/models.py:19
msgid "flat pages"
-msgstr "flatsidor"
+msgstr "flata sidor"
#: utils/dates.py:6
msgid "Monday"
@@ -2780,129 +2773,157 @@ msgstr "Lördag"
msgid "Sunday"
msgstr "Söndag"
-#: utils/dates.py:14
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "Mån"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "Tis"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "Ons"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "Tors"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "Fre"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "Lör"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "Sön"
+
+#: utils/dates.py:18
msgid "January"
msgstr "Januari"
-#: utils/dates.py:14
+#: utils/dates.py:18
msgid "February"
msgstr "Februari"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "March"
msgstr "Mars"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "April"
msgstr "April"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "May"
msgstr "Maj"
-#: utils/dates.py:14 utils/dates.py:27
+#: utils/dates.py:18 utils/dates.py:31
msgid "June"
msgstr "Juni"
-#: utils/dates.py:15 utils/dates.py:27
+#: utils/dates.py:19 utils/dates.py:31
msgid "July"
msgstr "Juli"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "August"
msgstr "Augusti"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "September"
msgstr "September"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "October"
msgstr "Oktober"
-#: utils/dates.py:15
+#: utils/dates.py:19
msgid "November"
msgstr "November"
-#: utils/dates.py:16
+#: utils/dates.py:20
msgid "December"
msgstr "December"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "jan"
msgstr "jan"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "feb"
msgstr "feb"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "mar"
-msgstr "mars"
+msgstr "mar"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "apr"
msgstr "apr"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "may"
msgstr "maj"
-#: utils/dates.py:19
+#: utils/dates.py:23
msgid "jun"
-msgstr "juni"
+msgstr "jun"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "jul"
-msgstr "juli"
+msgstr "jul"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "aug"
msgstr "aug"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "sep"
-msgstr "sept"
+msgstr "sep"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "oct"
msgstr "okt"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "nov"
msgstr "nov"
-#: utils/dates.py:20
+#: utils/dates.py:24
msgid "dec"
msgstr "dec"
-#: utils/dates.py:27
+#: utils/dates.py:31
msgid "Jan."
-msgstr "jan"
+msgstr "Januari"
-#: utils/dates.py:27
+#: utils/dates.py:31
msgid "Feb."
-msgstr "feb"
+msgstr "Februari"
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Aug."
-msgstr "aug"
+msgstr "Augusti"
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Sept."
-msgstr "sept"
+msgstr "September"
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Oct."
-msgstr "okt"
+msgstr "Oktober"
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Nov."
-msgstr "nov"
+msgstr "November"
-#: utils/dates.py:28
+#: utils/dates.py:32
msgid "Dec."
-msgstr "dec"
+msgstr "December"
#: utils/timesince.py:12
msgid "year"
@@ -2940,87 +2961,89 @@ msgid_plural "minutes"
msgstr[0] "minut"
msgstr[1] "minuter"
-#: utils/timesince.py:40
-#, python-format
-msgid "%d milliseconds"
-msgstr "%d millisekunder"
-
-#: utils/timesince.py:41
+#: utils/timesince.py:39
#, python-format
msgid "%(number)d %(type)s"
msgstr "%(number)d %(type)s"
-#: utils/timesince.py:47
+#: utils/timesince.py:45
#, python-format
msgid ", %(number)d %(type)s"
msgstr ", %(number)d %(type)s"
-#: utils/dateformat.py:40
+#: utils/dateformat.py:41
msgid "p.m."
-msgstr "p.m."
+msgstr "e.m."
-#: utils/dateformat.py:41
+#: utils/dateformat.py:42
msgid "a.m."
-msgstr "a.m."
+msgstr "f.m."
-#: utils/dateformat.py:46
+#: utils/dateformat.py:47
msgid "PM"
-msgstr "PM"
+msgstr "FM"
-#: utils/dateformat.py:47
+#: utils/dateformat.py:48
msgid "AM"
-msgstr "AM"
+msgstr "EM"
-#: utils/dateformat.py:95
+#: utils/dateformat.py:97
msgid "midnight"
msgstr "midnatt"
-#: utils/dateformat.py:97
+#: utils/dateformat.py:99
msgid "noon"
msgstr "middag"
-#: utils/translation/trans_real.py:358
+#: utils/translation/trans_real.py:391
msgid "DATE_FORMAT"
-msgstr "N j, Y"
+msgstr "j M, Y"
-#: utils/translation/trans_real.py:359
+#: utils/translation/trans_real.py:392
msgid "DATETIME_FORMAT"
-msgstr "N j, Y, P"
+msgstr "j M, Y, H:i"
-#: utils/translation/trans_real.py:360
+#: utils/translation/trans_real.py:393
msgid "TIME_FORMAT"
-msgstr "P"
+msgstr "H:i"
-#: utils/translation/trans_real.py:376
+#: utils/translation/trans_real.py:409
msgid "YEAR_MONTH_FORMAT"
msgstr "F Y"
-#: utils/translation/trans_real.py:377
+#: utils/translation/trans_real.py:410
msgid "MONTH_DAY_FORMAT"
-msgstr "F j"
+msgstr "j F"
-#: template/defaultfilters.py:491
+#: template/defaultfilters.py:485
msgid "yes,no,maybe"
msgstr "ja,nej,kanske"
-#: template/defaultfilters.py:520
+#: template/defaultfilters.py:514
#, python-format
msgid "%(size)d byte"
msgid_plural "%(size)d bytes"
msgstr[0] "%(size)d byte"
msgstr[1] "%(size)d bytes"
-#: template/defaultfilters.py:522
+#: template/defaultfilters.py:516
#, python-format
msgid "%.1f KB"
msgstr "%.1f KB"
-#: template/defaultfilters.py:524
+#: template/defaultfilters.py:518
#, python-format
msgid "%.1f MB"
msgstr "%.1f MB"
-#: template/defaultfilters.py:525
+#: template/defaultfilters.py:519
#, python-format
msgid "%.1f GB"
msgstr "%.1f GB"
+
+#~ msgid "%d milliseconds"
+#~ msgstr "%d millisekunder"
+
+#, fuzzy
+#~ msgid "AnonymousUser"
+#~ msgstr "Anonym användare"
diff --git a/django/conf/locale/zh_CN/LC_MESSAGES/django.mo b/django/conf/locale/zh_CN/LC_MESSAGES/django.mo
index 3b04920654..df3bf3f6a0 100644
--- a/django/conf/locale/zh_CN/LC_MESSAGES/django.mo
+++ b/django/conf/locale/zh_CN/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/zh_CN/LC_MESSAGES/django.po b/django/conf/locale/zh_CN/LC_MESSAGES/django.po
index 1f30a08b15..e9f296a1bf 100644
--- a/django/conf/locale/zh_CN/LC_MESSAGES/django.po
+++ b/django/conf/locale/zh_CN/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: django v1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-05-16 10:10+0200\n"
-"PO-Revision-Date: 2006-09-01 22:05+0800\n"
+"PO-Revision-Date: 2007-07-05 12:44+0800\n"
"Last-Translator: limodou <limodou@gmail.com>\n"
"Language-Team: Simplified Chinese <limodou@gmail.com>\n"
"MIME-Version: 1.0\n"
@@ -19,6 +19,1161 @@ msgstr ""
"X-Poedit-SourceCharset: utf-8\n"
"Plural-Forms: nplurals=1; plural=0;\n"
+#: db/models/manipulators.py:307
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "带有这个 %(type)s 的 %(object)s 对于给定的 %(field)s 已经存在了。"
+
+#: db/models/manipulators.py:308
+#: contrib/admin/views/main.py:335
+#: contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:339
+msgid "and"
+msgstr "和"
+
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "请输入一个有效的 %s 。"
+
+#: db/models/fields/related.py:642
+msgid "Separate multiple IDs with commas."
+msgstr "用逗号分隔多个ID。"
+
+#: db/models/fields/related.py:644
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "按下 \"Control\",或者在Mac上按 \"Command\" 来选择多个值。"
+
+#: db/models/fields/related.py:691
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "请输入有效的 %(self)s ID。值 %(value)r 无效。"
+
+#: db/models/fields/__init__.py:42
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s 带有 %(fieldname)s 已经存在。"
+
+#: db/models/fields/__init__.py:117
+#: db/models/fields/__init__.py:274
+#: db/models/fields/__init__.py:610
+#: db/models/fields/__init__.py:621
+#: oldforms/__init__.py:357
+#: newforms/fields.py:80
+#: newforms/fields.py:376
+#: newforms/fields.py:452
+#: newforms/fields.py:463
+#: newforms/models.py:178
+msgid "This field is required."
+msgstr "这个字段是必输项。"
+
+#: db/models/fields/__init__.py:367
+msgid "This value must be an integer."
+msgstr "这个值必须是一个整数。"
+
+#: db/models/fields/__init__.py:402
+msgid "This value must be either True or False."
+msgstr "这个值必须是 True 或 False。"
+
+#: db/models/fields/__init__.py:423
+msgid "This field cannot be null."
+msgstr "这个值不能为 null。"
+
+#: db/models/fields/__init__.py:457
+#: core/validators.py:148
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "输入一个 YYYY-MM-DD 格式的有效日期。"
+
+#: db/models/fields/__init__.py:526
+#: core/validators.py:157
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "输入一个 YYYY-MM-DD HH:MM 格式的有效日期/时间。"
+
+#: db/models/fields/__init__.py:630
+msgid "Enter a valid filename."
+msgstr "输入一个有效的文件名。"
+
+#: db/models/fields/__init__.py:751
+msgid "This value must be either None, True or False."
+msgstr "这个值必须是 None, True 或 False。"
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "阿拉伯语"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "孟加拉语"
+
+#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr "加泰罗尼亚语"
+
+#: conf/global_settings.py:42
+msgid "Czech"
+msgstr "捷克语"
+
+#: conf/global_settings.py:43
+msgid "Welsh"
+msgstr "威尔士语"
+
+#: conf/global_settings.py:44
+msgid "Danish"
+msgstr "丹麦语"
+
+#: conf/global_settings.py:45
+msgid "German"
+msgstr "德语"
+
+#: conf/global_settings.py:46
+msgid "Greek"
+msgstr "希腊语"
+
+#: conf/global_settings.py:47
+msgid "English"
+msgstr "英语"
+
+#: conf/global_settings.py:48
+msgid "Spanish"
+msgstr "西班牙语"
+
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
+msgstr "阿根廷的西班牙语"
+
+#: conf/global_settings.py:50
+msgid "Finnish"
+msgstr "芬兰语"
+
+#: conf/global_settings.py:51
+msgid "French"
+msgstr "法语"
+
+#: conf/global_settings.py:52
+msgid "Galician"
+msgstr "加利西亚语"
+
+#: conf/global_settings.py:53
+msgid "Hungarian"
+msgstr "匈牙利语"
+
+#: conf/global_settings.py:54
+msgid "Hebrew"
+msgstr "希伯来语"
+
+#: conf/global_settings.py:55
+msgid "Icelandic"
+msgstr "冰岛语"
+
+#: conf/global_settings.py:56
+msgid "Italian"
+msgstr "意大利语"
+
+#: conf/global_settings.py:57
+msgid "Japanese"
+msgstr "日语"
+
+#: conf/global_settings.py:58
+msgid "Kannada"
+msgstr "埃纳德语"
+
+#: conf/global_settings.py:59
+msgid "Latvian"
+msgstr "拉脱维亚语"
+
+#: conf/global_settings.py:60
+msgid "Macedonian"
+msgstr "马其顿语"
+
+#: conf/global_settings.py:61
+msgid "Dutch"
+msgstr "荷兰语"
+
+#: conf/global_settings.py:62
+msgid "Norwegian"
+msgstr "挪威语"
+
+#: conf/global_settings.py:63
+msgid "Polish"
+msgstr "波兰语"
+
+#: conf/global_settings.py:64
+msgid "Portugese"
+msgstr "葡萄牙语"
+
+#: conf/global_settings.py:65
+msgid "Brazilian"
+msgstr "巴西语"
+
+#: conf/global_settings.py:66
+msgid "Romanian"
+msgstr "罗马尼亚语"
+
+#: conf/global_settings.py:67
+msgid "Russian"
+msgstr "俄语"
+
+#: conf/global_settings.py:68
+msgid "Slovak"
+msgstr "斯洛伐克语"
+
+#: conf/global_settings.py:69
+msgid "Slovenian"
+msgstr "斯洛文尼亚语"
+
+#: conf/global_settings.py:70
+msgid "Serbian"
+msgstr "塞尔维亚语"
+
+#: conf/global_settings.py:71
+msgid "Swedish"
+msgstr "瑞典语"
+
+#: conf/global_settings.py:72
+msgid "Tamil"
+msgstr "泰米尔语"
+
+#: conf/global_settings.py:73
+msgid "Telugu"
+msgstr "泰卢固语"
+
+#: conf/global_settings.py:74
+msgid "Turkish"
+msgstr "土耳其语"
+
+#: conf/global_settings.py:75
+msgid "Ukrainian"
+msgstr "乌克兰语"
+
+#: conf/global_settings.py:76
+msgid "Simplified Chinese"
+msgstr "简体中文"
+
+#: conf/global_settings.py:77
+msgid "Traditional Chinese"
+msgstr "繁体中文"
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "年"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "月"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "周"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "天"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "小时"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "分钟"
+
+#: 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/dateformat.py:40
+msgid "p.m."
+msgstr ""
+
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr ""
+
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr ""
+
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr ""
+
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "午夜"
+
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "中午"
+
+#: utils/translation/trans_real.py:358
+msgid "DATE_FORMAT"
+msgstr "DATE_FORMAT"
+
+#: utils/translation/trans_real.py:359
+msgid "DATETIME_FORMAT"
+msgstr "DATETIME_FORMAT"
+
+#: utils/translation/trans_real.py:360
+msgid "TIME_FORMAT"
+msgstr "TIME_FORMAT"
+
+#: utils/translation/trans_real.py:376
+msgid "YEAR_MONTH_FORMAT"
+msgstr "YEAR_MONTH_FORMAT"
+
+#: utils/translation/trans_real.py:377
+msgid "MONTH_DAY_FORMAT"
+msgstr "MONTH_DAY_FORMAT"
+
+#: oldforms/__init__.py:392
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "确定你输入的文本少于 %s 个字符。"
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "这里不允许换行符。"
+
+#: oldforms/__init__.py:498
+#: oldforms/__init__.py:571
+#: oldforms/__init__.py:610
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "选择一个有效的选项: '%(data)s' 不在 %(choices)s 中。"
+
+#: oldforms/__init__.py:577
+#: contrib/admin/filterspecs.py:150
+#: newforms/widgets.py:174
+msgid "Unknown"
+msgstr "未知"
+
+#: oldforms/__init__.py:577
+#: contrib/admin/filterspecs.py:143
+#: newforms/widgets.py:174
+msgid "Yes"
+msgstr "是"
+
+#: oldforms/__init__.py:577
+#: contrib/admin/filterspecs.py:143
+#: newforms/widgets.py:174
+msgid "No"
+msgstr "否"
+
+#: oldforms/__init__.py:672
+#: core/validators.py:174
+#: core/validators.py:445
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "没有文件被提交。请检查表单的编码类型。"
+
+#: oldforms/__init__.py:674
+msgid "The submitted file is empty."
+msgstr "所提交的文件为空。"
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "输入在 -32,768 到 32,767 之间的一个整数。"
+
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
+msgstr "输入正整数。"
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "输入在 0 到 32,767 之间的一个整数。"
+
+#: contrib/localflavor/no/forms.py:15
+msgid "Enter a zip code in the format XXXX."
+msgstr "用 XXXX 的格式输入一个邮编。"
+
+#: contrib/localflavor/no/forms.py:36
+msgid "Enter a valid Norwegian social security number."
+msgstr "请输入一个有效的挪威社会保障号码。"
+
+#: contrib/localflavor/it/forms.py:14
+#: contrib/localflavor/fr/forms.py:17
+#: contrib/localflavor/fi/forms.py:14
+#: contrib/localflavor/de/forms.py:16
+msgid "Enter a zip code in the format XXXXX."
+msgstr "以 XXXXX 的格式输入一个邮编。"
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "以 XXXXXXX 或 XXX-XXXX 的格式输入一个邮编。"
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "北海道"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "青森"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "岩手"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "宫城"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "秋田"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "山形"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "福岛"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "茨城"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "枥木"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "群马"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "埼玉"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "千叶"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "东京"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "神奈川"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "山梨"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "长野"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "新舄"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "富山"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "石川"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "福井"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "岐阜"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "静冈"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "爱知"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "三重"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "滋贺"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "京都"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr " 大坂"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "兵库"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "奈良"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "和歌山"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "鸟取"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "岛根"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "冈山"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "广岛"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "山口"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "德岛"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "香川"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "爱媛"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "高知"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "福冈"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "佐贺"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "长崎"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "熊本"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "大分"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "宫崎"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "鹿儿岛"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "冲绳岛"
+
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "以 XXXXX-XXX 的格式输入一个邮编。"
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "电话号码必须为 XXX-XXX-XXXX 格式。"
+
+#: contrib/localflavor/fi/forms.py:40
+#: contrib/localflavor/fi/forms.py:46
+msgid "Enter a valid Finnish social security number."
+msgstr "输入一个有效的芬兰社会保障号码。"
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "输入一个邮政编码。两个邮编部分之间的空格是必须的。"
+
+#: contrib/localflavor/de/forms.py:63
+msgid "Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X format"
+msgstr "以 XXXXXXXXXXX-XXXXXXX-XXXXXXX-X 的格式输入一个有效的德国身份证号码。"
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "巴登符腾堡州"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "巴伐利亚"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "柏林"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "勃兰登堡"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "不来梅"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "汉堡"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "黑森州"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "下萨克森"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "北莱茵-威斯特法伦州"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "萨尔州"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "萨克森"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "石勒苏益格-荷尔斯泰因"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "图林根州"
+
+#: contrib/localflavor/usa/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "以 XXXXX 或 XXXXX-XXX 的格式输入一个邮编。"
+
+#: contrib/localflavor/usa/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "以 XXX-XX-XXXX 的格式输入一个有效的美国社会保障号码。"
+
+#: contrib/sessions/models.py:68
+msgid "session key"
+msgstr "session键字"
+
+#: contrib/sessions/models.py:69
+msgid "session data"
+msgstr "session数据"
+
+#: contrib/sessions/models.py:70
+msgid "expire date"
+msgstr "过期日期"
+
+#: contrib/sessions/models.py:74
+msgid "session"
+msgstr "会话(session)"
+
+#: contrib/sessions/models.py:75
+msgid "sessions"
+msgstr "会话(session)"
+
+#: contrib/auth/forms.py:17
+#: contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "两个口令字段不一致。"
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "一个使用此用户名的用户已经存在。"
+
+#: contrib/auth/forms.py:53
+msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."
+msgstr "你的Web浏览器好象不允许使用cookie。登录需要使用cookie。"
+
+#: contrib/auth/forms.py:60
+#: contrib/admin/views/decorators.py:10
+msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
+msgstr "请输入正确的用户名和口令。请注意两个域都是大小写敏感的。"
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "该帐号未激活。"
+
+#: contrib/auth/forms.py:85
+msgid "That e-mail address doesn't have an associated user account. Are you sure you've registered?"
+msgstr "该电子邮件地址没有关联任何用户帐号。你确定你已经注册过了?"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "两个'新口令'字段不一致。"
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "你的旧口令不正确。请重新输入。"
+
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "退出登录"
+
+#: contrib/auth/models.py:38
+#: contrib/auth/models.py:57
+msgid "name"
+msgstr "名称"
+
+#: contrib/auth/models.py:40
+msgid "codename"
+msgstr "代码名称"
+
+#: contrib/auth/models.py:42
+msgid "permission"
+msgstr "权限"
+
+#: contrib/auth/models.py:43
+#: contrib/auth/models.py:58
+msgid "permissions"
+msgstr "权限"
+
+#: contrib/auth/models.py:60
+msgid "group"
+msgstr "组"
+
+#: contrib/auth/models.py:61
+#: contrib/auth/models.py:100
+msgid "groups"
+msgstr "组"
+
+#: contrib/auth/models.py:90
+msgid "username"
+msgstr "用户名"
+
+#: 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:92
+msgid "last name"
+msgstr "姓"
+
+#: contrib/auth/models.py:93
+msgid "e-mail address"
+msgstr "邮件地址"
+
+#: contrib/auth/models.py:94
+msgid "password"
+msgstr "口令"
+
+#: contrib/auth/models.py:94
+msgid "Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change password form</a>."
+msgstr "使用 '[algo]$[salt]$[hexdigest]' 或使用 <a href=\"password/\">修改密码表单</a>"
+
+#: contrib/auth/models.py:95
+msgid "staff status"
+msgstr "人员状态"
+
+#: contrib/auth/models.py:95
+msgid "Designates whether the user can log into this admin site."
+msgstr "指定是否用户可以登录到这个管理站点。"
+
+#: contrib/auth/models.py:96
+msgid "active"
+msgstr "活动"
+
+#: 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: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:99
+msgid "date joined"
+msgstr "加入日期"
+
+#: 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 "除了手动设置权限以外,用户也会从他(她)所在的小组获得所赋组小组的所有权限。"
+
+#: contrib/auth/models.py:102
+msgid "user permissions"
+msgstr "用户权限"
+
+#: contrib/auth/models.py:105
+msgid "user"
+msgstr "用户"
+
+#: contrib/auth/models.py:106
+msgid "users"
+msgstr "用户"
+
+#: contrib/auth/models.py:111
+msgid "Personal info"
+msgstr "个人信息"
+
+#: contrib/auth/models.py:112
+msgid "Permissions"
+msgstr "权限"
+
+#: contrib/auth/models.py:113
+msgid "Important dates"
+msgstr "重要日期"
+
+#: contrib/auth/models.py:114
+msgid "Groups"
+msgstr "组"
+
+#: contrib/auth/models.py:258
+msgid "message"
+msgstr "消息"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "st"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "nd"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f 百万"
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f 十亿"
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f 万亿"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "一"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "二"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "三"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "四"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "五"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "六"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "七"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "八"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "九"
+
+#: contrib/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "python模块类名"
+
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "内容类型"
+
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+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 "应该是一个绝对路径,不包括域名。例如:'/events/search/'。"
+
+#: 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 "可以是绝对路径(同上)或以'http://'开始的全URL。"
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "重定向"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "重定向"
+
+#: 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 "例如:'/about/contact/'。请确保前导和结尾的除号。"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "标题"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "内容"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "允许评论"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "模板名称"
+
+#: contrib/flatpages/models.py:13
+msgid "Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'."
+msgstr "例如:'flatpages/contact_page.html'。如果未提供,系统将使用'flatpages/default.html'。"
+
+#: 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/comments/models.py:67
#: contrib/comments/models.py:166
msgid "object ID"
@@ -81,7 +1236,7 @@ msgid "is public"
msgstr "公开"
#: contrib/comments/models.py:85
-#: contrib/admin/views/doc.py:289
+#: contrib/admin/views/doc.py:304
msgid "IP address"
msgstr "IP地址"
@@ -203,6 +1358,75 @@ msgstr "删除仲裁"
msgid "Moderator deletion by %r"
msgstr "被 %r 仲裁删除"
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "用户名:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+msgid "Log out"
+msgstr "注销"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "口令:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "忘记你的口令?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "等级"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "必须的"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "可选的"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "上传一张照片"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "评论:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "预览评论"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "你的名字:"
+
#: contrib/comments/views/karma.py:19
msgid "Anonymous users cannot vote"
msgstr "匿名用户不能投票"
@@ -215,11 +1439,11 @@ msgstr "无效评论ID"
msgid "No voting for yourself"
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 comment:\n"
@@ -234,7 +1458,7 @@ msgstr[0] ""
"\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"
@@ -245,22 +1469,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 "只允许张贴"
-#: 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 invalid"
msgstr "评论表格有一个无效的 'target' 参数 -- 对象 ID 无效"
@@ -270,73 +1494,21 @@ msgstr "评论表格有一个无效的 'target' 参数 -- 对象 ID 无效"
msgid "The comment form didn't provide either 'preview' or 'post'"
msgstr "评论表格无法提供 '预览' 或 '张贴' 功能"
-#: contrib/comments/templates/comments/form.html:6
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/login.html:17
-msgid "Username:"
-msgstr "用户名:"
-
-#: contrib/comments/templates/comments/form.html:6
-#: contrib/admin/templates/admin/login.html:20
-msgid "Password:"
-msgstr "口令:"
-
-#: contrib/comments/templates/comments/form.html:6
-msgid "Forgotten your password?"
-msgstr "忘记你的口令?"
-
-#: contrib/comments/templates/comments/form.html:8
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
-#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
-#: contrib/admin/templates/admin_doc/missing_docutils.html:4
-#: contrib/admin/templates/admin_doc/view_index.html:5
-#: contrib/admin/templates/admin_doc/model_detail.html:3
-#: contrib/admin/templates/admin_doc/index.html:4
-#: contrib/admin/templates/admin_doc/model_index.html:5
-msgid "Log out"
-msgstr "注销"
-
-#: contrib/comments/templates/comments/form.html:12
-msgid "Ratings"
-msgstr "等级"
-
-#: contrib/comments/templates/comments/form.html:12
-#: contrib/comments/templates/comments/form.html:23
-msgid "Required"
-msgstr "必须的"
-
-#: contrib/comments/templates/comments/form.html:12
-#: contrib/comments/templates/comments/form.html:23
-msgid "Optional"
-msgstr "可选的"
-
-#: contrib/comments/templates/comments/form.html:23
-msgid "Post a photo"
-msgstr "上传一张照片"
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "域名"
-#: contrib/comments/templates/comments/form.html:27
-#: contrib/comments/templates/comments/freeform.html:5
-msgid "Comment:"
-msgstr "评论:"
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "显示名"
-#: contrib/comments/templates/comments/form.html:32
-#: contrib/comments/templates/comments/freeform.html:9
-msgid "Preview comment"
-msgstr "预览评论"
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "站点"
-#: contrib/comments/templates/comments/freeform.html:4
-msgid "Your name:"
-msgstr "你的名字:"
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "站点"
#: contrib/admin/filterspecs.py:40
#, python-format
@@ -350,6 +1522,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 "全部"
@@ -373,18 +1546,6 @@ msgstr "本月"
msgid "This year"
msgstr "今年"
-#: contrib/admin/filterspecs.py:143
-msgid "Yes"
-msgstr "是"
-
-#: contrib/admin/filterspecs.py:143
-msgid "No"
-msgstr "否"
-
-#: contrib/admin/filterspecs.py:150
-msgid "Unknown"
-msgstr "未知"
-
#: contrib/admin/models.py:16
msgid "action time"
msgstr "动作时间"
@@ -413,262 +1574,188 @@ msgstr "日志记录"
msgid "log entries"
msgstr "日志记录"
-#: contrib/admin/templatetags/admin_list.py:228
+#: contrib/admin/templatetags/admin_list.py:247
msgid "All dates"
msgstr "全有日期"
-#: contrib/admin/views/decorators.py:9
-#: contrib/auth/forms.py:36
-#: contrib/auth/forms.py:41
-msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
-msgstr "请输入正确的用户名和口令。请注意两个域都是大小写敏感的。"
-
-#: contrib/admin/views/decorators.py:23
-#: contrib/admin/templates/admin/login.html:25
-msgid "Log in"
-msgstr "登录"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr "首页"
-#: contrib/admin/views/decorators.py:61
-msgid "Please log in again, because your session has expired. Don't worry: Your submission has been saved."
-msgstr "请重新登录,因为你的会话已经过期。不用担心:你的提交已经被保存。"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+msgid "Documentation"
+msgstr "文档"
-#: contrib/admin/views/decorators.py:68
-msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again."
-msgstr "看上去你的浏览器没有配置成接受 cookie 。请允许 cookie,重新装入本页面,再试一次。"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "书签"
-#: contrib/admin/views/decorators.py:82
-msgid "Usernames cannot contain the '@' character."
-msgstr "用户名不能包含 '@' 字符。"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+msgid "Change password"
+msgstr "修改口令"
-#: contrib/admin/views/decorators.py:84
-#, python-format
-msgid "Your e-mail address is not your username. Try '%s' instead."
-msgstr "你的邮箱地址不是你的用户名。换 '%s' 试试。"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "文档书签"
-#: contrib/admin/views/main.py:226
-msgid "Site administration"
-msgstr "站点管理员"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site. Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">为安装书签,拖动链接到你的工具条,\n"
+"或右击鼠标,然后增加到你的书签上。现在你可以从这个站\n"
+"点的任何页面选择书签。注意一些这样的书签要求你从一个\n"
+"被指定为\"内部\"的计算机上来进行查看(如果你不确定是\n"
+"否你的计算机是否是\"内部\"的,同你的系统管理员沟通一\n"
+"下。</p>\n"
-#: contrib/admin/views/main.py:260
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was added successfully."
-msgstr "%(name)s \"%(obj)s\" 添加成功。"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "本页面的文档"
-#: contrib/admin/views/main.py:264
-#: contrib/admin/views/main.py:348
-msgid "You may edit it again below."
-msgstr "你可以在下面再次编辑它。"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid "Jumps you from any page to the documentation for the view that generates that page."
+msgstr "对于任何页面跳转到生成这个页面的view所在的文件。"
-#: contrib/admin/views/main.py:272
-#: contrib/admin/views/main.py:357
-#, python-format
-msgid "You may add another %s below."
-msgstr "你可以在下面增加另一个 %s 。"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "显示对象ID"
-#: contrib/admin/views/main.py:290
-#, python-format
-msgid "Add %s"
-msgstr "增加 %s"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid "Shows the content-type and unique ID for pages that represent a single object."
+msgstr "用于那些表现单个对象的页面显示 content-type 和唯一ID。"
-#: contrib/admin/views/main.py:336
-#, python-format
-msgid "Added %s."
-msgstr "%s 已增加。"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "编辑本对象(当前窗口)"
-#: contrib/admin/views/main.py:336
-#: contrib/admin/views/main.py:338
-#: contrib/admin/views/main.py:340
-msgid "and"
-msgstr "和"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "用于那些表现单个对象的页面跳转到管理页面。"
-#: contrib/admin/views/main.py:338
-#, python-format
-msgid "Changed %s."
-msgstr "已修改 %s 。"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "编辑本对象(新窗口)"
-#: contrib/admin/views/main.py:340
-#, python-format
-msgid "Deleted %s."
-msgstr "%s 已删除。"
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "同上,但在新窗口中打开管理页面。"
-#: contrib/admin/views/main.py:343
-msgid "No fields changed."
-msgstr "没有字段被修改。"
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+msgid "Delete"
+msgstr "删除"
-#: contrib/admin/views/main.py:346
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was changed successfully."
-msgstr "%(name)s \"%(obj)s\" 修改成功。"
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "保存为新的"
-#: contrib/admin/views/main.py:354
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
-msgstr "%(name)s \"%(obj)s\" 添加成功。你可以在下面再次编辑它。"
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "保存并增加另一个"
-#: contrib/admin/views/main.py:392
-#, python-format
-msgid "Change %s"
-msgstr "修改 %s"
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "保存并继续编辑"
-#: contrib/admin/views/main.py:470
-#, python-format
-msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
-msgstr "一个或多个 %(fieldname)s 在 %(name)s 中: %(obj)s"
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "保存"
-#: contrib/admin/views/main.py:475
-#, python-format
-msgid "One or more %(fieldname)s in %(name)s:"
-msgstr "一个或多个 %(fieldname)s 在 %(name)s 中:"
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "服务器错误"
-#: contrib/admin/views/main.py:508
-#, python-format
-msgid "The %(name)s \"%(obj)s\" was deleted successfully."
-msgstr "%(name)s \"%(obj)s\" 删除成功。"
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "服务器错误(500)"
-#: contrib/admin/views/main.py:511
-msgid "Are you sure?"
-msgstr "你确信吗?"
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "服务器错误 <em>(500)</em>"
-#: contrib/admin/views/main.py:533
-#, python-format
-msgid "Change history: %s"
-msgstr "修改历史: %s"
+#: contrib/admin/templates/admin/500.html:10
+msgid "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience."
+msgstr "存在一个错误。它已经通过电子邮件被报告给站点管理员了,并且应该很快被改正。谢谢你的关心。"
-#: contrib/admin/views/main.py:565
+#: contrib/admin/templates/admin/filter.html:2
#, python-format
-msgid "Select %s"
-msgstr "选择 %s"
+msgid " By %(filter_title)s "
+msgstr " 由 %(filter_title)s"
-#: contrib/admin/views/main.py:565
-#, python-format
-msgid "Select %s to change"
-msgstr "选择 %s 来修改"
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "过滤器"
-#: contrib/admin/views/doc.py:277
-#: contrib/admin/views/doc.py:286
-#: contrib/admin/views/doc.py:288
-#: contrib/admin/views/doc.py:294
-#: contrib/admin/views/doc.py:295
-#: contrib/admin/views/doc.py:297
-msgid "Integer"
-msgstr "整数"
+#: contrib/admin/templates/admin/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/views/doc.py:278
-msgid "Boolean (Either True or False)"
-msgstr "布尔(True或False)"
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "去"
-#: contrib/admin/views/doc.py:279
-#: contrib/admin/views/doc.py:296
+#: contrib/admin/templates/admin/search_form.html:10
#, python-format
-msgid "String (up to %(maxlength)s)"
-msgstr "字符串(最长 %(maxlength)s)"
-
-#: contrib/admin/views/doc.py:280
-msgid "Comma-separated integers"
-msgstr "逗号分隔的整数"
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 条结果"
+msgstr[1] "%(counter)s 条结果"
-#: contrib/admin/views/doc.py:281
-msgid "Date (without time)"
-msgstr "日期(无时间)"
-
-#: contrib/admin/views/doc.py:282
-msgid "Date (with time)"
-msgstr "日期(带时间)"
-
-#: contrib/admin/views/doc.py:283
-msgid "E-mail address"
-msgstr "邮箱地址"
-
-#: contrib/admin/views/doc.py:284
-#: contrib/admin/views/doc.py:287
-msgid "File path"
-msgstr "文件路径"
-
-#: contrib/admin/views/doc.py:285
-msgid "Decimal number"
-msgstr "小数"
-
-#: contrib/admin/views/doc.py:291
-msgid "Boolean (Either True, False or None)"
-msgstr "布尔(True, False或None)"
-
-#: contrib/admin/views/doc.py:292
-msgid "Relation to parent model"
-msgstr "与父模型的关系"
-
-#: contrib/admin/views/doc.py:293
-msgid "Phone number"
-msgstr "电话号码"
-
-#: contrib/admin/views/doc.py:298
-msgid "Text"
-msgstr "文本"
-
-#: contrib/admin/views/doc.py:299
-msgid "Time"
-msgstr "时间"
-
-#: contrib/admin/views/doc.py:300
-#: contrib/flatpages/models.py:7
-msgid "URL"
-msgstr "URL"
-
-#: contrib/admin/views/doc.py:301
-msgid "U.S. state (two uppercase letters)"
-msgstr "美国州名(两个大写字母)"
-
-#: contrib/admin/views/doc.py:302
-msgid "XML text"
-msgstr "XML文本"
-
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-msgid "Documentation"
-msgstr "文档"
-
-#: contrib/admin/templates/admin/object_history.html:3
-#: contrib/admin/templates/admin/change_list.html:5
-#: contrib/admin/templates/admin/base.html:23
-#: contrib/admin/templates/admin/delete_confirmation.html:3
-#: contrib/admin/templates/admin/change_form.html:10
-#: contrib/admin/templates/registration/password_change_done.html:3
-#: contrib/admin/templates/registration/password_change_form.html:3
-#: contrib/admin/templates/admin_doc/bookmarklets.html:4
-#: contrib/admin/templates/admin_doc/view_detail.html:4
-#: contrib/admin/templates/admin_doc/template_tag_index.html:5
-#: contrib/admin/templates/admin_doc/template_detail.html:4
-#: contrib/admin/templates/admin_doc/template_filter_index.html:5
-#: contrib/admin/templates/admin_doc/missing_docutils.html:4
-#: contrib/admin/templates/admin_doc/view_index.html:5
-#: contrib/admin/templates/admin_doc/model_detail.html:3
-#: contrib/admin/templates/admin_doc/index.html:4
-#: contrib/admin/templates/admin_doc/model_index.html:5
-msgid "Change password"
-msgstr "修改口令"
-
-#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/500.html:4
-#: contrib/admin/templates/admin/change_list.html:6
-#: contrib/admin/templates/admin/base.html:28
-#: contrib/admin/templates/admin/delete_confirmation.html:6
-#: contrib/admin/templates/admin/change_form.html:13
-#: contrib/admin/templates/registration/password_change_done.html:4
-#: contrib/admin/templates/registration/password_reset_form.html:4
-#: contrib/admin/templates/registration/logged_out.html:4
-#: contrib/admin/templates/registration/password_reset_done.html:4
-#: contrib/admin/templates/registration/password_change_form.html:4
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-msgid "Home"
-msgstr "首页"
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "总共 %(full_result_count)s"
#: contrib/admin/templates/admin/object_history.html:5
-#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/change_form.html:21
msgid "History"
msgstr "历史"
@@ -692,29 +1779,55 @@ msgstr "N j, Y, P"
msgid "This object doesn't have a change history. It probably wasn't added via this admin site."
msgstr "此对象没有修改历史。可能不能通过这个管理站点来增加。"
-#: contrib/admin/templates/admin/base_site.html:4
-msgid "Django site admin"
-msgstr "Django管理站点"
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+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 "删除 %(object_name)s '%(escaped_object)s' 会导致删除相关的对象,但你的帐号无权删除下列类型的对象:"
-#: contrib/admin/templates/admin/base_site.html:7
-msgid "Django administration"
-msgstr "Django管理员"
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+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 "你确信相要删除 %(object_name)s \"%(escaped_object)s\"?下列所有相关的项目都将被删除:"
-#: contrib/admin/templates/admin/500.html:4
-msgid "Server error"
-msgstr "服务器错误"
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "是的,我确定"
-#: contrib/admin/templates/admin/500.html:6
-msgid "Server error (500)"
-msgstr "服务器错误(500)"
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "显示全部"
-#: contrib/admin/templates/admin/500.html:9
-msgid "Server Error <em>(500)</em>"
-msgstr "服务器错误 <em>(500)</em>"
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "增加 %(name)s"
-#: contrib/admin/templates/admin/500.html:10
-msgid "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience."
-msgstr "存在一个错误。它已经通过电子邮件被报告给站点管理员了,并且应该很快被改正。谢谢你的关心。"
+#: contrib/admin/templates/admin/change_form.html:15
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "增加"
+
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "在站点上查看"
+
+#: contrib/admin/templates/admin/change_form.html:32
+#: contrib/admin/templates/admin/auth/user/change_password.html:24
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "请改正下面的错误。"
+
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "排序中"
+
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "排序:"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "欢迎,"
#: contrib/admin/templates/admin/404.html:4
#: contrib/admin/templates/admin/404.html:8
@@ -725,15 +1838,20 @@ msgstr "页面没有找到"
msgid "We're sorry, but the requested page could not be found."
msgstr "很报歉,请求页面无法找到。"
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:24
+msgid "Log in"
+msgstr "登录"
+
#: contrib/admin/templates/admin/index.html:17
#, python-format
msgid "Models available in the %(name)s application."
msgstr "在 %(name)s 应用中模块有效。"
-#: contrib/admin/templates/admin/index.html:28
-#: contrib/admin/templates/admin/change_form.html:15
-msgid "Add"
-msgstr "增加"
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
#: contrib/admin/templates/admin/index.html:34
msgid "Change"
@@ -755,114 +1873,57 @@ msgstr "我的动作"
msgid "None available"
msgstr "无可用的"
-#: contrib/admin/templates/admin/change_list.html:11
-#, python-format
-msgid "Add %(name)s"
-msgstr "增加 %(name)s"
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django管理站点"
-#: contrib/admin/templates/admin/login.html:22
-msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
-msgstr "<a href=\"/password_reset/\">忘记你的密码</a>?"
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django管理员"
-#: contrib/admin/templates/admin/base.html:23
-msgid "Welcome,"
-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/delete_confirmation.html:9
-#: contrib/admin/templates/admin/submit_line.html:3
-msgid "Delete"
-msgstr "删除"
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "用户名"
-#: contrib/admin/templates/admin/delete_confirmation.html:14
-#, python-format
-msgid "Deleting the %(object_name)s '%(object)s' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:"
-msgstr "删除 %(object_name)s '%(object)s' 会导致删除相关的对象,但你的帐号无权删除下列类型的对象:"
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+msgid "Password"
+msgstr "口令"
-#: contrib/admin/templates/admin/delete_confirmation.html:21
-#, python-format
-msgid "Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of the following related items will be deleted:"
-msgstr "你确信相要删除 %(object_name)s \"%(object)s\"?所有相关的项目都将被删除:"
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Password (again)"
+msgstr "口令(重复)"
-#: contrib/admin/templates/admin/delete_confirmation.html:26
-msgid "Yes, I'm sure"
-msgstr "是的,我确定"
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr "为了校验,输入与上面相同的口令。"
-#: contrib/admin/templates/admin/filter.html:2
+#: contrib/admin/templates/admin/auth/user/change_password.html:28
#, python-format
-msgid " By %(title)s "
-msgstr " 由 %(title)s"
-
-#: contrib/admin/templates/admin/search_form.html:8
-msgid "Go"
-msgstr "去"
-
-#: contrib/admin/templates/admin/change_form.html:21
-msgid "View on site"
-msgstr "在站点上查看"
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "为用户<strong>%(username)s</strong>输入一个新的口令。"
-#: contrib/admin/templates/admin/change_form.html:30
-msgid "Please correct the error below."
-msgid_plural "Please correct the errors below."
-msgstr[0] "请改正下面的错误。"
-
-#: contrib/admin/templates/admin/change_form.html:48
-msgid "Ordering"
-msgstr "排序中"
-
-#: contrib/admin/templates/admin/change_form.html:51
-msgid "Order:"
-msgstr "排序:"
-
-#: contrib/admin/templates/admin/submit_line.html:4
-msgid "Save as new"
-msgstr "保存为新的"
-
-#: contrib/admin/templates/admin/submit_line.html:5
-msgid "Save and add another"
-msgstr "保存并增加另一个"
-
-#: contrib/admin/templates/admin/submit_line.html:6
-msgid "Save and continue editing"
-msgstr "保存并继续编辑"
-
-#: contrib/admin/templates/admin/submit_line.html:7
-msgid "Save"
-msgstr "保存"
-
-#: 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 "口令修改"
-
-#: contrib/admin/templates/registration/password_change_done.html:6
-#: contrib/admin/templates/registration/password_change_done.html:10
-msgid "Password change successful"
-msgstr "口令修改成功"
-
-#: contrib/admin/templates/registration/password_change_done.html:12
-msgid "Your password was changed."
-msgstr "你的口令已经被修改。"
-
-#: contrib/admin/templates/registration/password_reset_form.html:4
-#: contrib/admin/templates/registration/password_reset_form.html:6
-#: contrib/admin/templates/registration/password_reset_form.html:10
-#: contrib/admin/templates/registration/password_reset_done.html:4
-msgid "Password reset"
-msgstr "口令重设"
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "当前:"
-#: contrib/admin/templates/registration/password_reset_form.html:12
-msgid "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you."
-msgstr "忘记你的口令?在下面输入你的邮箱地址,我们将重设你的口令并且将新的口令通过邮件发送给你。"
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "改动:"
-#: contrib/admin/templates/registration/password_reset_form.html:16
-msgid "E-mail address:"
-msgstr "邮箱地址:"
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "日期:"
-#: contrib/admin/templates/registration/password_reset_form.html:16
-msgid "Reset my password"
-msgstr "重设我的口令"
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "时间:"
#: contrib/admin/templates/registration/logged_out.html:8
msgid "Thanks for spending some quality time with the Web site today."
@@ -872,35 +1933,6 @@ msgstr "感谢今天在本网站花费了您的一些宝贵时间。"
msgid "Log in again"
msgstr "重新登录"
-#: contrib/admin/templates/registration/password_reset_done.html:6
-#: contrib/admin/templates/registration/password_reset_done.html:10
-msgid "Password reset successful"
-msgstr "口令重设成功"
-
-#: contrib/admin/templates/registration/password_reset_done.html:12
-msgid "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly."
-msgstr "我们已经按你所提交的邮箱地址发送了一个新的口令给你。你应该很会收到这封邮件。"
-
-#: contrib/admin/templates/registration/password_change_form.html:12
-msgid "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly."
-msgstr "请输入你的旧口令,为了安全起见,接着要输入你的新口令两遍,这样我们可以校验你输入的是否正确。"
-
-#: contrib/admin/templates/registration/password_change_form.html:17
-msgid "Old password:"
-msgstr "旧口令:"
-
-#: contrib/admin/templates/registration/password_change_form.html:19
-msgid "New password:"
-msgstr "新口令:"
-
-#: contrib/admin/templates/registration/password_change_form.html:21
-msgid "Confirm password:"
-msgstr "确认口令:"
-
-#: contrib/admin/templates/registration/password_change_form.html:23
-msgid "Change my password"
-msgstr "修改我的口令"
-
#: contrib/admin/templates/registration/password_reset_email.html:2
msgid "You're receiving this e-mail because you requested a password reset"
msgstr "你所收到的这封邮件是由于你请求了口令重设"
@@ -932,703 +1964,515 @@ msgstr "感谢使用我们的站点!"
msgid "The %(site_name)s team"
msgstr "%(site_name)s 小组"
-#: contrib/admin/templates/admin_doc/bookmarklets.html:3
-msgid "Bookmarklets"
-msgstr "书签"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:5
-msgid "Documentation bookmarklets"
-msgstr "文档书签"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:9
-msgid ""
-"\n"
-"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
-"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
-"select the bookmarklet from any page in the site. Note that some of these\n"
-"bookmarklets require you to be viewing the site from a computer designated\n"
-"as \"internal\" (talk to your system administrator if you aren't sure if\n"
-"your computer is \"internal\").</p>\n"
-msgstr ""
-"\n"
-"<p class=\"help\">为安装书签,拖动链接到你的工具条,\n"
-"或右击鼠标,然后增加到你的书签上。现在你可以从这个站\n"
-"点的任何页面选择书签。注意一些这样的书签要求你从一个\n"
-"被指定为\"内部\"的计算机上来进行查看(如果你不确定是\n"
-"否你的计算机是否是\"内部\"的,同你的系统管理员沟通一\n"
-"下。</p>\n"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:19
-msgid "Documentation for this page"
-msgstr "本页面的文档"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:20
-msgid "Jumps you from any page to the documentation for the view that generates that page."
-msgstr "对于任何页面跳转到生成这个页面的view所在的文件。"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:22
-msgid "Show object ID"
-msgstr "显示对象ID"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:23
-msgid "Shows the content-type and unique ID for pages that represent a single object."
-msgstr "用于那些表现单个对象的页面显示 content-type 和唯一ID。"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:25
-msgid "Edit this object (current window)"
-msgstr "编辑本对象(当前窗口)"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:26
-msgid "Jumps to the admin page for pages that represent a single object."
-msgstr "用于那些表现单个对象的页面跳转到管理页面。"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:28
-msgid "Edit this object (new window)"
-msgstr "编辑本对象(新窗口)"
-
-#: contrib/admin/templates/admin_doc/bookmarklets.html:29
-msgid "As above, but opens the admin page in a new window."
-msgstr "同上,但在新窗口中打开管理页面。"
-
-#: 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 "应该是一个绝对路径,不包括域名。例如:'/events/search/'。"
-
-#: 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 "可以是绝对路径(同上)或以'http://'开始的全URL。"
-
-#: 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 "例如:'/about/contact/'。请确保前导和结尾的除号。"
-
-#: contrib/flatpages/models.py:9
-msgid "title"
-msgstr "标题"
-
-#: contrib/flatpages/models.py:10
-msgid "content"
-msgstr "内容"
-
-#: contrib/flatpages/models.py:11
-msgid "enable comments"
-msgstr "允许评论"
-
-#: contrib/flatpages/models.py:12
-msgid "template name"
-msgstr "模板名称"
-
-#: contrib/flatpages/models.py:13
-msgid "Example: 'flatpages/contact_page'. If this isn't provided, the system will use 'flatpages/default'."
-msgstr "例如:'flatfiles/contact_page'。如果未提供,系统将使用'flatfiles/default'。"
-
-#: contrib/flatpages/models.py:14
-msgid "registration required"
-msgstr "请先注册"
-
-#: contrib/flatpages/models.py:14
-msgid "If this is checked, only logged-in users will be able to view the page."
-msgstr "如果被选中,仅登录用户才可以查看此页。"
-
-#: 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 "使用 '[algo]$[salt]$[hexdigest]'"
-
-#: 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/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "口令重设"
-#: contrib/auth/forms.py:30
-msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."
-msgstr "你的Web浏览器好象不允许使用cookie。登录需要使用cookie。"
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "口令重设成功"
-#: contrib/contenttypes/models.py:25
-msgid "python model class name"
-msgstr "python模块类名"
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly."
+msgstr "我们已经按你所提交的邮箱地址发送了一个新的口令给你。你应该很会收到这封邮件。"
-#: contrib/contenttypes/models.py:28
-msgid "content type"
-msgstr "内容类型"
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:4
+msgid "Password change"
+msgstr "口令修改"
-#: contrib/contenttypes/models.py:29
-msgid "content types"
-msgstr "内容类型"
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly."
+msgstr "请输入你的旧口令,为了安全起见,接着要输入你的新口令两遍,这样我们可以校验你输入的是否正确。"
-#: contrib/sessions/models.py:35
-msgid "session key"
-msgstr "session键字"
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "旧口令:"
-#: contrib/sessions/models.py:36
-msgid "session data"
-msgstr "session数据"
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "新口令:"
-#: contrib/sessions/models.py:37
-msgid "expire date"
-msgstr "过期日期"
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "确认口令:"
-#: contrib/sessions/models.py:41
-msgid "session"
-msgstr "会话(session)"
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "修改我的口令"
-#: contrib/sessions/models.py:42
-msgid "sessions"
-msgstr "会话(session)"
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "口令修改成功"
-#: contrib/sites/models.py:10
-msgid "domain name"
-msgstr "域名"
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "你的口令已经被修改。"
-#: contrib/sites/models.py:11
-msgid "display name"
-msgstr "显示名"
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you."
+msgstr "忘记你的口令?在下面输入你的邮箱地址,我们将重设你的口令并且将新的口令通过邮件发送给你。"
-#: contrib/sites/models.py:15
-msgid "site"
-msgstr "站点"
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "邮箱地址:"
-#: contrib/sites/models.py:16
-msgid "sites"
-msgstr "站点"
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "重设我的口令"
-#: utils/translation.py:360
-msgid "DATE_FORMAT"
-msgstr "DATE_FORMAT"
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "站点管理员"
-#: utils/translation.py:361
-msgid "DATETIME_FORMAT"
-msgstr "DATETIME_FORMAT"
+#: contrib/admin/views/main.py:257
+#: contrib/admin/views/auth.py:19
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" 添加成功。"
-#: utils/translation.py:362
-msgid "TIME_FORMAT"
-msgstr "TIME_FORMAT"
+#: contrib/admin/views/main.py:261
+#: contrib/admin/views/main.py:347
+#: contrib/admin/views/auth.py:24
+msgid "You may edit it again below."
+msgstr "你可以在下面再次编辑它。"
-#: utils/dates.py:6
-msgid "Monday"
-msgstr "星期一"
+#: contrib/admin/views/main.py:271
+#: contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr "你可以在下面增加另一个 %s 。"
-#: utils/dates.py:6
-msgid "Tuesday"
-msgstr "星期二"
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "增加 %s"
-#: utils/dates.py:6
-msgid "Wednesday"
-msgstr "星期三"
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "%s 已增加。"
-#: utils/dates.py:6
-msgid "Thursday"
-msgstr "星期四"
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr "已修改 %s 。"
-#: utils/dates.py:6
-msgid "Friday"
-msgstr "星期五"
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "%s 已删除。"
-#: utils/dates.py:7
-msgid "Saturday"
-msgstr "星期六"
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "没有字段被修改。"
-#: utils/dates.py:7
-msgid "Sunday"
-msgstr "星期日"
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" 修改成功。"
-#: utils/dates.py:14
-msgid "January"
-msgstr "一月"
+#: 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\" 添加成功。你可以在下面再次编辑它。"
-#: utils/dates.py:14
-msgid "February"
-msgstr "二月"
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr "修改 %s"
-#: utils/dates.py:14
-#: utils/dates.py:27
-msgid "March"
-msgstr "三月"
+#: contrib/admin/views/main.py:476
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "一个或多个 %(fieldname)s 在 %(name)s 中: %(obj)s"
-#: utils/dates.py:14
-#: utils/dates.py:27
-msgid "April"
-msgstr "四月"
+#: contrib/admin/views/main.py:481
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "一个或多个 %(fieldname)s 在 %(name)s 中:"
-#: utils/dates.py:14
-#: utils/dates.py:27
-msgid "May"
-msgstr "五月"
+#: contrib/admin/views/main.py:514
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" 删除成功。"
-#: utils/dates.py:14
-#: utils/dates.py:27
-msgid "June"
-msgstr "六月"
+#: contrib/admin/views/main.py:517
+msgid "Are you sure?"
+msgstr "你确信吗?"
-#: utils/dates.py:15
-#: utils/dates.py:27
-msgid "July"
-msgstr "七月"
+#: contrib/admin/views/main.py:539
+#, python-format
+msgid "Change history: %s"
+msgstr "修改历史: %s"
-#: utils/dates.py:15
-msgid "August"
-msgstr "八月"
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s"
+msgstr "选择 %s"
-#: utils/dates.py:15
-msgid "September"
-msgstr "九月"
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s to change"
+msgstr "选择 %s 来修改"
-#: utils/dates.py:15
-msgid "October"
-msgstr "十月"
+#: contrib/admin/views/main.py:768
+msgid "Database error"
+msgstr "数据库错误"
-#: utils/dates.py:15
-msgid "November"
-msgstr "十一月"
+#: 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 "请重新登录,因为你的会话已经过期。不用担心:你的提交已经被保存。"
-#: utils/dates.py:16
-msgid "December"
-msgstr "十二月"
+#: 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 "看上去你的浏览器没有配置成接受 cookie 。请允许 cookie,重新装入本页面,再试一次。"
-#: utils/dates.py:19
-msgid "jan"
-msgstr "一月"
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "用户名不能包含 '@' 字符。"
-#: utils/dates.py:19
-msgid "feb"
-msgstr "二月"
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "你的邮箱地址不是你的用户名。换 '%s' 试试。"
-#: utils/dates.py:19
-msgid "mar"
-msgstr "三月"
+#: contrib/admin/views/doc.py:46
+#: contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "标签:"
-#: utils/dates.py:19
-msgid "apr"
-msgstr "四月"
+#: contrib/admin/views/doc.py:77
+#: contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "过滤器:"
-#: utils/dates.py:19
-msgid "may"
-msgstr "五月"
+#: contrib/admin/views/doc.py:135
+#: contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "视图:"
-#: utils/dates.py:19
-msgid "jun"
-msgstr "六月"
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "应用 %r 没有找到"
-#: utils/dates.py:20
-msgid "jul"
-msgstr "七月"
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "在应用 %(label)r 里找不到模型 %(name)r"
-#: utils/dates.py:20
-msgid "aug"
-msgstr "八月"
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "相关的 `%(label)s.%(type)s` 对象"
-#: utils/dates.py:20
-msgid "sep"
-msgstr "九月"
+#: 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 "模型:"
-#: utils/dates.py:20
-msgid "oct"
-msgstr "十月"
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "相关的 `%(label)s.%(name)s` 对象"
-#: utils/dates.py:20
-msgid "nov"
-msgstr "十一月"
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "所有 %s"
-#: utils/dates.py:20
-msgid "dec"
-msgstr "十二月"
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "%s 的数量"
-#: utils/dates.py:27
-msgid "Jan."
-msgstr "一月"
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "%s 对象的字段"
-#: utils/dates.py:27
-msgid "Feb."
-msgstr "二月"
+#: 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 "整数"
-#: utils/dates.py:28
-msgid "Aug."
-msgstr "八月"
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "布尔(True或False)"
-#: utils/dates.py:28
-msgid "Sept."
-msgstr "九月"
+#: contrib/admin/views/doc.py:293
+#: contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "字符串(最长 %(maxlength)s)"
-#: utils/dates.py:28
-msgid "Oct."
-msgstr "十月"
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "逗号分隔的整数"
-#: utils/dates.py:28
-msgid "Nov."
-msgstr "十一月"
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "日期(无时间)"
-#: utils/dates.py:28
-msgid "Dec."
-msgstr "十二月"
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "日期(带时间)"
-#: utils/timesince.py:12
-msgid "year"
-msgid_plural "years"
-msgstr[0] "年"
+#: contrib/admin/views/doc.py:297
+msgid "E-mail address"
+msgstr "邮箱地址"
-#: utils/timesince.py:13
-msgid "month"
-msgid_plural "months"
-msgstr[0] "月"
+#: contrib/admin/views/doc.py:298
+#: contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
+msgid "File path"
+msgstr "文件路径"
-#: utils/timesince.py:14
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] "周"
+#: contrib/admin/views/doc.py:300
+msgid "Decimal number"
+msgstr "小数"
-#: utils/timesince.py:15
-msgid "day"
-msgid_plural "days"
-msgstr[0] "天"
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "布尔(True, False或None)"
-#: utils/timesince.py:16
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] "小时"
+#: contrib/admin/views/doc.py:307
+msgid "Relation to parent model"
+msgstr "与父模型的关系"
-#: utils/timesince.py:17
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "分钟"
+#: contrib/admin/views/doc.py:308
+msgid "Phone number"
+msgstr "电话号码"
-#: conf/global_settings.py:37
-msgid "Bengali"
-msgstr "孟加拉语"
+#: contrib/admin/views/doc.py:313
+msgid "Text"
+msgstr "文本"
-#: conf/global_settings.py:38
-msgid "Czech"
-msgstr "捷克语"
+#: contrib/admin/views/doc.py:314
+msgid "Time"
+msgstr "时间"
-#: conf/global_settings.py:39
-msgid "Welsh"
-msgstr "威尔士语"
+#: contrib/admin/views/doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "美国州名(两个大写字母)"
-#: conf/global_settings.py:40
-msgid "Danish"
-msgstr "丹麦语"
+#: contrib/admin/views/doc.py:317
+msgid "XML text"
+msgstr "XML文本"
-#: conf/global_settings.py:41
-msgid "German"
-msgstr "德语"
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s 似乎不是一个 urlpattern 对象"
-#: conf/global_settings.py:42
-msgid "Greek"
-msgstr "希腊语"
+#: contrib/admin/views/auth.py:30
+msgid "Add user"
+msgstr "增加用户"
-#: conf/global_settings.py:43
-msgid "English"
-msgstr "英语"
+#: contrib/admin/views/auth.py:57
+msgid "Password changed successfully."
+msgstr "口令修改成功。"
-#: conf/global_settings.py:44
-msgid "Spanish"
-msgstr "西班牙语"
+#: contrib/admin/views/auth.py:64
+#, python-format
+msgid "Change password: %s"
+msgstr "修改口令:%s"
-#: conf/global_settings.py:45
-msgid "French"
-msgstr "法语"
+#: newforms/fields.py:103
+#: newforms/fields.py:256
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "确保你输入的文本至多 %d 个字符。"
-#: conf/global_settings.py:46
-msgid "Galician"
-msgstr "加利西亚语"
+#: newforms/fields.py:105
+#: newforms/fields.py:258
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "确保你输入的文本至少 %d 个字符。"
-#: conf/global_settings.py:47
-msgid "Hungarian"
-msgstr "匈牙利语"
+#: newforms/fields.py:128
+#: core/validators.py:120
+msgid "Enter a whole number."
+msgstr "输入整数。"
-#: conf/global_settings.py:48
-msgid "Hebrew"
-msgstr "希伯来语"
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "这个值必须小于或等于 %s。"
-#: conf/global_settings.py:49
-msgid "Icelandic"
-msgstr "冰岛语"
+#: newforms/fields.py:132
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "这个值必须小于或等于 %s。"
-#: conf/global_settings.py:50
-msgid "Italian"
-msgstr "意大利语"
+#: newforms/fields.py:165
+msgid "Enter a valid date."
+msgstr "输入一个有效的日期。"
-#: conf/global_settings.py:51
-msgid "Japanese"
-msgstr "日语"
+#: newforms/fields.py:192
+msgid "Enter a valid time."
+msgstr "输入一个有效的时间。"
-#: conf/global_settings.py:52
-msgid "Dutch"
-msgstr "荷兰语"
+#: newforms/fields.py:228
+msgid "Enter a valid date/time."
+msgstr "输入一个有效的日期/时间。"
-#: conf/global_settings.py:53
-msgid "Norwegian"
-msgstr "挪威语"
+#: newforms/fields.py:242
+msgid "Enter a valid value."
+msgstr "输入一个有效的值。"
-#: conf/global_settings.py:54
-msgid "Brazilian"
-msgstr "巴西语"
+#: newforms/fields.py:271
+#: core/validators.py:162
+msgid "Enter a valid e-mail address."
+msgstr "输入一个有效的邮件地址。"
-#: conf/global_settings.py:55
-msgid "Romanian"
-msgstr "罗马尼亚语"
+#: newforms/fields.py:289
+#: newforms/fields.py:311
+msgid "Enter a valid URL."
+msgstr "输入一个有效的URL。"
-#: conf/global_settings.py:56
-msgid "Russian"
-msgstr "俄语"
+#: newforms/fields.py:313
+msgid "This URL appears to be a broken link."
+msgstr "URL %s 似乎是一个坏的链接。"
-#: conf/global_settings.py:57
-msgid "Slovak"
-msgstr "斯洛伐克语"
+#: newforms/fields.py:362
+#: newforms/models.py:165
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "选择一个有效的选项: 此选择不在可用的选项中。"
-#: conf/global_settings.py:58
-msgid "Slovenian"
-msgstr "斯洛文尼亚语"
+#: newforms/fields.py:380
+#: newforms/fields.py:456
+#: newforms/models.py:182
+msgid "Enter a list of values."
+msgstr "输入一个值的列表。"
-#: conf/global_settings.py:59
-msgid "Serbian"
-msgstr "塞尔维亚语"
+#: newforms/fields.py:389
+#: newforms/models.py:188
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "选择一个有效的选项: '%s' 不在可用的选项中。"
-#: conf/global_settings.py:60
-msgid "Swedish"
-msgstr "瑞典语"
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "是、否、也许"
-#: conf/global_settings.py:61
-msgid "Ukrainian"
-msgstr "乌克兰语"
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s 创建成功。"
-#: conf/global_settings.py:62
-msgid "Simplified Chinese"
-msgstr "简体中文"
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s 更新成功。"
-#: conf/global_settings.py:63
-msgid "Traditional Chinese"
-msgstr "繁体中文"
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s 已被删除。"
-#: core/validators.py:60
+#: core/validators.py:64
msgid "This value must contain only letters, numbers and underscores."
msgstr "此值只能包含字母、数字和下划线。"
-#: core/validators.py:64
+#: core/validators.py:68
msgid "This value must contain only letters, numbers, underscores, dashes or slashes."
msgstr "此值只能包含字母、数字、下划线、反斜线和斜线。"
#: core/validators.py:72
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "此值只能包含字母、数字和下划线。"
+
+#: core/validators.py:76
msgid "Uppercase letters are not allowed here."
msgstr "这里不允许大写字母。"
-#: core/validators.py:76
+#: core/validators.py:80
msgid "Lowercase letters are not allowed here."
msgstr "这里不允许小写字母。"
-#: core/validators.py:83
+#: core/validators.py:87
msgid "Enter only digits separated by commas."
msgstr "只能输入用逗号分隔的数字。"
-#: core/validators.py:95
+#: core/validators.py:99
msgid "Enter valid e-mail addresses separated by commas."
msgstr "输入用逗号分隔的有效邮件地址。"
-#: core/validators.py:99
+#: core/validators.py:103
msgid "Please enter a valid IP address."
msgstr "请输入一个有效的IP地址。"
-#: core/validators.py:103
+#: core/validators.py:107
msgid "Empty values are not allowed here."
msgstr "这里不允许输入空值。"
-#: core/validators.py:107
+#: core/validators.py:111
msgid "Non-numeric characters aren't allowed here."
msgstr "这里不允许非数字字符。"
-#: core/validators.py:111
+#: core/validators.py:115
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
+#: core/validators.py:124
msgid "Only alphabetical characters are allowed here."
msgstr "这里只允许字母。"
-#: core/validators.py:124
-msgid "Enter a valid date in YYYY-MM-DD format."
-msgstr "输入一个 YYYY-MM-DD 格式的有效日期。"
+#: core/validators.py:139
+msgid "Year must be 1900 or later."
+msgstr "年份必须是1900或之后"
-#: core/validators.py:128
+#: core/validators.py:143
+#, python-format
+msgid "Invalid date: %s"
+msgstr "无效日期: %s"
+
+#: core/validators.py:153
msgid "Enter a valid time in HH:MM format."
msgstr "输入一个 HH:MM 格式的有效时间。"
-#: core/validators.py:132
-#: db/models/fields/__init__.py:468
-msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
-msgstr "输入一个 YYYY-MM-DD HH:MM 格式的有效日期/时间。"
-
-#: core/validators.py:136
-msgid "Enter a valid e-mail address."
-msgstr "输入一个有效的邮件地址。"
-
-#: core/validators.py:148
+#: core/validators.py:178
msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
msgstr "上传一个有效的图片。您所上传的文件或者不是图片或是一个破坏的图片。"
-#: core/validators.py:155
+#: core/validators.py:185
#, python-format
msgid "The URL %s does not point to a valid image."
msgstr "URL %s 指向的不是一个有效的图片。"
-#: core/validators.py:159
+#: core/validators.py:189
#, 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:197
#, 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:201
msgid "A valid URL is required."
msgstr "需要是一个有效的URL。"
-#: core/validators.py:185
+#: core/validators.py:215
#, python-format
msgid ""
"Valid HTML is required. Specific errors are:\n"
@@ -1637,243 +2481,157 @@ msgstr ""
"需要有效的HTML。详细的错误是:\n"
"%s"
-#: core/validators.py:192
+#: core/validators.py:222
#, python-format
msgid "Badly formed XML: %s"
msgstr "格式错误的 XML: %s"
-#: core/validators.py:202
+#: core/validators.py:239
#, python-format
msgid "Invalid URL: %s"
msgstr "无效 URL: %s"
-#: core/validators.py:206
-#: core/validators.py:208
+#: core/validators.py:244
+#: core/validators.py:246
#, python-format
msgid "The URL %s is a broken link."
msgstr "URL %s 是一个断开的链接。"
-#: core/validators.py:214
+#: core/validators.py:252
msgid "Enter a valid U.S. state abbreviation."
msgstr "输入一个有效的 U.S. 州缩写。"
-#: core/validators.py:229
+#: core/validators.py:266
#, 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 不允许在这里出现。"
-#: core/validators.py:236
+#: core/validators.py:273
#, python-format
msgid "This field must match the '%s' field."
msgstr "这个字段必须与 '%s' 字段相匹配。"
-#: core/validators.py:255
+#: core/validators.py:292
msgid "Please enter something for at least one field."
msgstr "请至少在一个字段上输入些什么。"
-#: core/validators.py:264
-#: core/validators.py:275
+#: core/validators.py:301
+#: core/validators.py:312
msgid "Please enter both fields or leave them both empty."
msgstr "请要么两个字段都输入或者两个字段都空着。"
-#: core/validators.py:282
+#: core/validators.py:320
#, 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:333
#, 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:352
msgid "Duplicate values are not allowed."
msgstr "重复值不允许。"
-#: core/validators.py:336
+#: core/validators.py:367
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "这个值必须介于 %(lower)s 和 %(upper)s 之间。"
+
+#: core/validators.py:369
+#, python-format
+msgid "This value must be at least %s."
+msgstr "这个值需要至少为 %s"
+
+#: core/validators.py:371
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "这个值不能大于 %s 。"
+
+#: core/validators.py:407
#, python-format
msgid "This value must be a power of %s."
msgstr "这个值必须是 %s 的乘方。"
-#: core/validators.py:347
+#: core/validators.py:418
msgid "Please enter a valid decimal number."
msgstr "请输入一个有效的小数。"
-#: core/validators.py:349
+#: core/validators.py:422
#, python-format
msgid "Please enter a valid decimal number with at most %s total digit."
msgid_plural "Please enter a valid decimal number with at most %s total digits."
msgstr[0] "请输入一个有效的小数,最多 %s 个数字。 "
-#: core/validators.py:352
+#: core/validators.py:425
+#, 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 个数字。"
+
+#: core/validators.py:428
#, python-format
msgid "Please enter a valid decimal number with at most %s decimal place."
msgid_plural "Please enter a valid decimal number with at most %s decimal places."
msgstr[0] "请输入一个有效的小数,最多 %s 个小数位。 "
-#: core/validators.py:362
+#: core/validators.py:438
#, python-format
msgid "Make sure your uploaded file is at least %s bytes big."
msgstr "请确保你上传的文件至少 %s 字节大。"
-#: core/validators.py:363
+#: core/validators.py:439
#, python-format
msgid "Make sure your uploaded file is at most %s bytes big."
msgstr "请确保你上传的文件至多 %s 字节大。"
-#: core/validators.py:376
+#: core/validators.py:456
msgid "The format for this field is wrong."
msgstr "这个字段的格式不正确。"
-#: core/validators.py:391
+#: core/validators.py:471
msgid "This field is invalid."
msgstr "这个字段无效。"
-#: core/validators.py:426
+#: core/validators.py:507
#, python-format
msgid "Could not retrieve anything from %s."
msgstr "不能从 %s 得到任何东西。"
-#: core/validators.py:429
+#: core/validators.py:510
#, python-format
msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
msgstr "URL %(url)s 返回了无效的 Content-Type 头 '%(contenttype)s'。"
-#: core/validators.py:462
+#: core/validators.py:543
#, python-format
msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)"
msgstr "请关闭未关闭的 %(tag)s 标签从第 %(line)s 行。(行开始于 \"%(start)s\"。)"
-#: core/validators.py:466
+#: core/validators.py:547
#, python-format
msgid "Some text starting on line %(line)s is not allowed in that context. (Line starts with \"%(start)s\".)"
msgstr "在 %(line)s 行开始的一些文本不允许在那个上下文中。(行开始于 \"%(start)s\"。)"
-#: core/validators.py:471
+#: core/validators.py:552
#, python-format
msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)"
msgstr "在 %(line)s 行的\"%(attr)s\"不是一个有效的属性。(行开始于 \"%(start)s\"。)"
-#: core/validators.py:476
+#: core/validators.py:557
#, python-format
msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)"
msgstr "在 %(line)s 行的\"<%(tag)s>\"不是一个有效的标签。(行开始于 \"%(start)s\"。)"
-#: core/validators.py:480
+#: core/validators.py:561
#, python-format
msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)"
msgstr "在行 %(line)s 的标签少了一个或多个必须的属性。(行开始于 \"%(start)s\"。)"
-#: core/validators.py:485
+#: core/validators.py:566
#, python-format
msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)"
msgstr "在行 %(line)s 的\"%(attr)s\"属性有一个无效的值。(行开始于 \"%(start)s\"。)"
-#: db/models/manipulators.py:302
-#, python-format
-msgid "%(object)s with this %(type)s already exists for the given %(field)s."
-msgstr "带有这个 %(type)s 的 %(object)s 对于给定的 %(field)s 已经存在了。"
-
-#: db/models/fields/__init__.py:40
-#, python-format
-msgid "%(optname)s with this %(fieldname)s already exists."
-msgstr "%(optname)s 带有 %(fieldname)s 已经存在。"
-
-#: db/models/fields/__init__.py:114
-#: db/models/fields/__init__.py:265
-#: db/models/fields/__init__.py:542
-#: db/models/fields/__init__.py:553
-#: forms/__init__.py:346
-msgid "This field is required."
-msgstr "这个字段是必输项。"
-
-#: db/models/fields/__init__.py:337
-msgid "This value must be an integer."
-msgstr "这个值必须是一个整数。"
-
-#: db/models/fields/__init__.py:369
-msgid "This value must be either True or False."
-msgstr "这个值必须是 True 或 False。"
-
-#: db/models/fields/__init__.py:385
-msgid "This field cannot be null."
-msgstr "这个值不能为 null。"
-
-#: 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 "请输入一个有效的 %s 。"
-
-#: db/models/fields/related.py:579
-msgid "Separate multiple IDs with commas."
-msgstr "用逗号分隔多个ID。"
-
-#: db/models/fields/related.py:581
-msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
-msgstr "按下 \"Control\",或者在Mac上按 \"Command\" 来选择多个值。"
-
-#: db/models/fields/related.py:625
-#, python-format
-msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
-msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
-msgstr[0] "请输入有效的 %(self)s ID。值 %(value)r 无效。"
-
-#: 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] "确定你输入的文本少于 %s 个字符。"
-
-#: forms/__init__.py:385
-msgid "Line breaks are not allowed here."
-msgstr "这里不允许换行符。"
-
-#: forms/__init__.py:480
-#: forms/__init__.py:551
-#: forms/__init__.py:589
-#, python-format
-msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
-msgstr "选择一个有效的选项: '%(data)s' 不在 %(choices)s 中。"
-
-#: forms/__init__.py:645
-msgid "The submitted file is empty."
-msgstr "所提交的文件为空。"
-
-#: forms/__init__.py:699
-msgid "Enter a whole number between -32,768 and 32,767."
-msgstr "输入在 -32,768 到 32,767 之间的一个整数。"
-
-#: 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 "输入在 0 到 32,767 之间的一个整数。"
-
-#: template/defaultfilters.py:379
-msgid "yes,no,maybe"
-msgstr "是、否、也许"
-
-#~ msgid "Comment"
-#~ msgstr "评论"
-#~ msgid "Comments"
-#~ msgstr "评论"
-#~ msgid "String (up to 50)"
-#~ msgstr "整数(最长50)"
-#~ msgid "label"
-#~ msgstr "标签"
-#~ msgid "package"
-#~ msgstr "包"
-#~ msgid "packages"
-#~ msgstr "包"
-
-#, fuzzy
-#~ msgid "count"
-#~ msgstr "内容"
-
diff --git a/django/conf/project_template/settings.py b/django/conf/project_template/settings.py
index 8b3617d4b6..c1e296cbe4 100644
--- a/django/conf/project_template/settings.py
+++ b/django/conf/project_template/settings.py
@@ -25,7 +25,6 @@ TIME_ZONE = 'America/Chicago'
# Language code for this installation. All choices can be found here:
# http://www.w3.org/TR/REC-html40/struct/dirlang.html#langcodes
-# http://blogs.law.harvard.edu/tech/stories/storyReader$15
LANGUAGE_CODE = 'en-us'
SITE_ID = 1
diff --git a/django/contrib/admin/media/js/admin/RelatedObjectLookups.js b/django/contrib/admin/media/js/admin/RelatedObjectLookups.js
index eec7d6a2ab..5588d72ab8 100644
--- a/django/contrib/admin/media/js/admin/RelatedObjectLookups.js
+++ b/django/contrib/admin/media/js/admin/RelatedObjectLookups.js
@@ -31,10 +31,11 @@ function showAddAnotherPopup(triggeringLink) {
var name = triggeringLink.id.replace(/^add_/, '');
name = name.replace(/\./g, '___');
href = triggeringLink.href
- if (href.indexOf('?') == -1)
- href += '?_popup=1';
- else
- href += '&_popup=1';
+ if (href.indexOf('?') == -1) {
+ href += '?_popup=1';
+ } else {
+ href += '&_popup=1';
+ }
var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes');
win.focus();
return false;
diff --git a/django/contrib/admin/media/js/urlify.js b/django/contrib/admin/media/js/urlify.js
index 0ee1ff5b5d..9ae036a64d 100644
--- a/django/contrib/admin/media/js/urlify.js
+++ b/django/contrib/admin/media/js/urlify.js
@@ -2,12 +2,12 @@ var LATIN_MAP = {
'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE', 'Ç':
'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I', 'Î': 'I',
'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O', 'Õ': 'O', 'Ö':
- 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U', 'Ü': 'U', 'Ý': 'Y', 'Þ': 'TH',
- 'ß': 'ss', 'à':'a', 'á':'a', 'â': 'a', 'ã': 'a', 'ä': 'a', 'å': 'a', 'æ':
- 'ae', 'ç': 'c', 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e', 'ì': 'i', 'í': 'i',
- 'î': 'i', 'ï': 'i', 'ð': 'o', 'ñ': 'n', 'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ':
- 'o', 'ö': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u', 'û': 'u', 'ü': 'u', 'ý': 'y',
- 'þ': 'th', 'ÿ': 'y'
+ 'O', 'Ő': 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U', 'Ü': 'U', 'Ű': 'U',
+ 'Ý': 'Y', 'Þ': 'TH', 'ß': 'ss', 'à':'a', 'á':'a', 'â': 'a', 'ã': 'a', 'ä':
+ 'a', 'å': 'a', 'æ': 'ae', 'ç': 'c', 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e',
+ 'ì': 'i', 'í': 'i', 'î': 'i', 'ï': 'i', 'ð': 'o', 'ñ': 'n', 'ò': 'o', 'ó':
+ 'o', 'ô': 'o', 'õ': 'o', 'ö': 'o', 'ő': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u',
+ 'û': 'u', 'ü': 'u', 'ű': 'u', 'ý': 'y', 'þ': 'th', 'ÿ': 'y'
}
var LATIN_SYMBOLS_MAP = {
'©':'(c)'
diff --git a/django/contrib/admin/models.py b/django/contrib/admin/models.py
index b5b779a3ac..ffa2740d5e 100644
--- a/django/contrib/admin/models.py
+++ b/django/contrib/admin/models.py
@@ -18,7 +18,7 @@ class LogEntry(models.Model):
user = models.ForeignKey(User)
content_type = models.ForeignKey(ContentType, blank=True, null=True)
object_id = models.TextField(_('object id'), blank=True, null=True)
- object_repr = models.CharField(_('object repr'), maxlength=200)
+ object_repr = models.CharField(_('object repr'), max_length=200)
action_flag = models.PositiveSmallIntegerField(_('action flag'))
change_message = models.TextField(_('change message'), blank=True)
objects = LogEntryManager()
diff --git a/django/contrib/admin/templatetags/admin_list.py b/django/contrib/admin/templatetags/admin_list.py
index cfc21f585a..98843bf26e 100644
--- a/django/contrib/admin/templatetags/admin_list.py
+++ b/django/contrib/admin/templatetags/admin_list.py
@@ -190,9 +190,11 @@ def items_for_result(cl, result):
table_tag = {True:'th', False:'td'}[first]
first = False
url = cl.url_for_result(result)
- result_id = smart_unicode(getattr(result, pk)) # conversion to string is needed in case of 23L (long ints)
+ # Convert the pk to something that can be used in Javascript.
+ # Problem cases are long ints (23L) and non-ASCII strings.
+ result_id = repr(force_unicode(getattr(result, pk)))[1:]
yield (u'<%s%s><a href="%s"%s>%s</a></%s>' % \
- (table_tag, row_class, url, (cl.is_popup and ' onclick="opener.dismissRelatedLookupPopup(window, %r); return false;"' % result_id or ''), result_repr, table_tag))
+ (table_tag, row_class, url, (cl.is_popup and ' onclick="opener.dismissRelatedLookupPopup(window, %s); return false;"' % result_id or ''), result_repr, table_tag))
else:
yield (u'<td%s>%s</td>' % (row_class, result_repr))
diff --git a/django/contrib/admin/views/main.py b/django/contrib/admin/views/main.py
index dfae38a59f..8937a1c95b 100644
--- a/django/contrib/admin/views/main.py
+++ b/django/contrib/admin/views/main.py
@@ -362,7 +362,7 @@ class ChangeList(object):
try:
attr = getattr(self.model, field_name)
order_field = attr.admin_order_field
- except IndexError:
+ except AttributeError:
pass
else:
if not isinstance(f.rel, models.ManyToOneRel) or not f.null:
diff --git a/django/contrib/auth/__init__.py b/django/contrib/auth/__init__.py
index 14ae020674..9813d9a2a2 100644
--- a/django/contrib/auth/__init__.py
+++ b/django/contrib/auth/__init__.py
@@ -12,6 +12,8 @@ def load_backend(path):
mod = __import__(module, {}, {}, [attr])
except ImportError, e:
raise ImproperlyConfigured, 'Error importing authentication backend %s: "%s"' % (module, e)
+ except ValueError, e:
+ raise ImproperlyConfigured, 'Error importing authentication backends. Is AUTHENTICATION_BACKENDS a correctly defined list or tuple?'
try:
cls = getattr(mod, attr)
except AttributeError:
diff --git a/django/contrib/auth/forms.py b/django/contrib/auth/forms.py
index 2a68e94766..16ee0289a2 100644
--- a/django/contrib/auth/forms.py
+++ b/django/contrib/auth/forms.py
@@ -10,10 +10,10 @@ class UserCreationForm(oldforms.Manipulator):
"A form that creates a user, with no privileges, from the given username and password."
def __init__(self):
self.fields = (
- oldforms.TextField(field_name='username', length=30, maxlength=30, is_required=True,
+ oldforms.TextField(field_name='username', length=30, max_length=30, is_required=True,
validator_list=[validators.isAlphaNumeric, self.isValidUsername]),
- oldforms.PasswordField(field_name='password1', length=30, maxlength=60, is_required=True),
- oldforms.PasswordField(field_name='password2', length=30, maxlength=60, is_required=True,
+ oldforms.PasswordField(field_name='password1', length=30, max_length=60, is_required=True),
+ oldforms.PasswordField(field_name='password2', length=30, max_length=60, is_required=True,
validator_list=[validators.AlwaysMatchesOtherField('password1', _("The two password fields didn't match."))]),
)
@@ -42,9 +42,9 @@ class AuthenticationForm(oldforms.Manipulator):
"""
self.request = request
self.fields = [
- oldforms.TextField(field_name="username", length=15, maxlength=30, is_required=True,
+ oldforms.TextField(field_name="username", length=15, max_length=30, is_required=True,
validator_list=[self.isValidUser, self.hasCookiesEnabled]),
- oldforms.PasswordField(field_name="password", length=15, maxlength=30, is_required=True),
+ oldforms.PasswordField(field_name="password", length=15, max_length=30, is_required=True),
]
self.user_cache = None
@@ -111,11 +111,11 @@ class PasswordChangeForm(oldforms.Manipulator):
def __init__(self, user):
self.user = user
self.fields = (
- oldforms.PasswordField(field_name="old_password", length=30, maxlength=30, is_required=True,
+ oldforms.PasswordField(field_name="old_password", length=30, max_length=30, is_required=True,
validator_list=[self.isValidOldPassword]),
- oldforms.PasswordField(field_name="new_password1", length=30, maxlength=30, is_required=True,
+ oldforms.PasswordField(field_name="new_password1", length=30, max_length=30, is_required=True,
validator_list=[validators.AlwaysMatchesOtherField('new_password2', _("The two 'new password' fields didn't match."))]),
- oldforms.PasswordField(field_name="new_password2", length=30, maxlength=30, is_required=True),
+ oldforms.PasswordField(field_name="new_password2", length=30, max_length=30, is_required=True),
)
def isValidOldPassword(self, new_data, all_data):
@@ -133,8 +133,8 @@ class AdminPasswordChangeForm(oldforms.Manipulator):
def __init__(self, user):
self.user = user
self.fields = (
- oldforms.PasswordField(field_name='password1', length=30, maxlength=60, is_required=True),
- oldforms.PasswordField(field_name='password2', length=30, maxlength=60, is_required=True,
+ oldforms.PasswordField(field_name='password1', length=30, max_length=60, is_required=True),
+ oldforms.PasswordField(field_name='password2', length=30, max_length=60, is_required=True,
validator_list=[validators.AlwaysMatchesOtherField('password1', _("The two password fields didn't match."))]),
)
diff --git a/django/contrib/auth/models.py b/django/contrib/auth/models.py
index 50f1ef11c4..183d48642e 100644
--- a/django/contrib/auth/models.py
+++ b/django/contrib/auth/models.py
@@ -7,6 +7,8 @@ from django.utils.translation import ugettext_lazy as _
import datetime
import urllib
+UNUSABLE_PASSWORD = '!' # This will never be a valid hash
+
try:
set
except NameError:
@@ -48,9 +50,9 @@ class Permission(models.Model):
Three basic permissions -- add, change and delete -- are automatically created for each Django model.
"""
- name = models.CharField(_('name'), maxlength=50)
+ name = models.CharField(_('name'), max_length=50)
content_type = models.ForeignKey(ContentType)
- codename = models.CharField(_('codename'), maxlength=100)
+ codename = models.CharField(_('codename'), max_length=100)
class Meta:
verbose_name = _('permission')
@@ -68,7 +70,7 @@ class Group(models.Model):
Beyond permissions, groups are a convenient way to categorize users to apply some label, or extended functionality, to them. For example, you could create a group 'Special users', and you could write code that would do special things to those users -- such as giving them access to a members-only portion of your site, or sending them members-only e-mail messages.
"""
- name = models.CharField(_('name'), maxlength=80, unique=True)
+ name = models.CharField(_('name'), max_length=80, unique=True)
permissions = models.ManyToManyField(Permission, verbose_name=_('permissions'), blank=True)
class Meta:
@@ -80,11 +82,14 @@ class Group(models.Model):
return self.name
class UserManager(models.Manager):
- def create_user(self, username, email, password):
+ def create_user(self, username, email, password=None):
"Creates and saves a User with the given username, e-mail and password."
now = datetime.datetime.now()
user = self.model(None, username, '', '', email.strip().lower(), 'placeholder', False, True, False, now, now)
- user.set_password(password)
+ if password:
+ user.set_password(password)
+ else:
+ user.set_unusable_password()
user.save()
return user
@@ -100,11 +105,11 @@ class User(models.Model):
Username and password are required. Other fields are optional.
"""
- username = models.CharField(_('username'), maxlength=30, unique=True, validator_list=[validators.isAlphaNumeric], help_text=_("Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."))
- first_name = models.CharField(_('first name'), maxlength=30, blank=True)
- last_name = models.CharField(_('last name'), maxlength=30, blank=True)
+ username = models.CharField(_('username'), max_length=30, unique=True, validator_list=[validators.isAlphaNumeric], help_text=_("Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."))
+ first_name = models.CharField(_('first name'), max_length=30, blank=True)
+ last_name = models.CharField(_('last name'), max_length=30, blank=True)
email = models.EmailField(_('e-mail address'), blank=True)
- password = models.CharField(_('password'), maxlength=128, help_text=_("Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change password form</a>."))
+ password = models.CharField(_('password'), max_length=128, help_text=_("Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change password form</a>."))
is_staff = models.BooleanField(_('staff status'), default=False, help_text=_("Designates whether the user can log into this admin site."))
is_active = models.BooleanField(_('active'), default=True, help_text=_("Designates whether this user can log into the Django admin. Unselect this instead of deleting accounts."))
is_superuser = models.BooleanField(_('superuser status'), default=False, help_text=_("Designates that this user has all permissions without explicitly assigning them."))
@@ -164,6 +169,13 @@ class User(models.Model):
return is_correct
return check_password(raw_password, self.password)
+ def set_unusable_password(self):
+ # Sets a value that will never be a valid hash
+ self.password = UNUSABLE_PASSWORD
+
+ def has_usable_password(self):
+ return self.password != UNUSABLE_PASSWORD
+
def get_group_permissions(self):
"Returns a list of permission strings that this user has through his/her groups."
if not hasattr(self, '_group_perm_cache'):
@@ -253,7 +265,8 @@ class User(models.Model):
return self._profile_cache
class Message(models.Model):
- """The message system is a lightweight way to queue messages for given users. A message is associated with a User instance (so it is only applicable for registered users). There's no concept of expiration or timestamps. Messages are created by the Django admin after successful actions. For example, "The poll Foo was created successfully." is a message.
+ """
+ The message system is a lightweight way to queue messages for given users. A message is associated with a User instance (so it is only applicable for registered users). There's no concept of expiration or timestamps. Messages are created by the Django admin after successful actions. For example, "The poll Foo was created successfully." is a message.
"""
user = models.ForeignKey(User)
message = models.TextField(_('message'))
diff --git a/django/contrib/auth/tests.py b/django/contrib/auth/tests.py
new file mode 100644
index 0000000000..ed768aa429
--- /dev/null
+++ b/django/contrib/auth/tests.py
@@ -0,0 +1,19 @@
+"""
+>>> from models import User
+>>> u = User.objects.create_user('testuser', 'test@example.com', 'testpw')
+>>> u.has_usable_password()
+True
+>>> u.check_password('bad')
+False
+>>> u.check_password('testpw')
+True
+>>> u.set_unusable_password()
+>>> u.save()
+>>> u.check_password('testpw')
+False
+>>> u.has_usable_password()
+False
+>>> u2 = User.objects.create_user('testuser2', 'test2@example.com')
+>>> u2.has_usable_password()
+False
+""" \ No newline at end of file
diff --git a/django/contrib/comments/models.py b/django/contrib/comments/models.py
index c0de6e4992..76a2457fd1 100644
--- a/django/contrib/comments/models.py
+++ b/django/contrib/comments/models.py
@@ -65,8 +65,8 @@ class Comment(models.Model):
user = models.ForeignKey(User)
content_type = models.ForeignKey(ContentType)
object_id = models.IntegerField(_('object ID'))
- headline = models.CharField(_('headline'), maxlength=255, blank=True)
- comment = models.TextField(_('comment'), maxlength=3000)
+ headline = models.CharField(_('headline'), max_length=255, blank=True)
+ comment = models.TextField(_('comment'), max_length=3000)
rating1 = models.PositiveSmallIntegerField(_('rating #1'), blank=True, null=True)
rating2 = models.PositiveSmallIntegerField(_('rating #2'), blank=True, null=True)
rating3 = models.PositiveSmallIntegerField(_('rating #3'), blank=True, null=True)
@@ -154,8 +154,8 @@ class FreeComment(models.Model):
# A FreeComment is a comment by a non-registered user.
content_type = models.ForeignKey(ContentType)
object_id = models.IntegerField(_('object ID'))
- comment = models.TextField(_('comment'), maxlength=3000)
- person_name = models.CharField(_("person's name"), maxlength=50)
+ comment = models.TextField(_('comment'), max_length=3000)
+ person_name = models.CharField(_("person's name"), max_length=50)
submit_date = models.DateTimeField(_('date/time submitted'), auto_now_add=True)
is_public = models.BooleanField(_('is public'))
ip_address = models.IPAddressField(_('ip address'))
diff --git a/django/contrib/comments/templatetags/comments.py b/django/contrib/comments/templatetags/comments.py
index 5c02c16f95..756ab9c93b 100644
--- a/django/contrib/comments/templatetags/comments.py
+++ b/django/contrib/comments/templatetags/comments.py
@@ -5,6 +5,7 @@ from django import template
from django.template import loader
from django.core.exceptions import ObjectDoesNotExist
from django.contrib.contenttypes.models import ContentType
+from django.utils.encoding import smart_str
import re
register = template.Library()
@@ -174,6 +175,7 @@ class DoCommentForm:
if tokens[4] != 'with':
raise template.TemplateSyntaxError, "Fourth argument in %r tag must be 'with'" % tokens[0]
for option, args in zip(tokens[5::2], tokens[6::2]):
+ option = smart_str(option)
if option in ('photos_optional', 'photos_required') and not self.free:
# VALIDATION ##############################################
option_list = args.split(',')
diff --git a/django/contrib/comments/views/comments.py b/django/contrib/comments/views/comments.py
index 435bfa6f73..f166fa118f 100644
--- a/django/contrib/comments/views/comments.py
+++ b/django/contrib/comments/views/comments.py
@@ -29,7 +29,7 @@ class PublicCommentManipulator(AuthenticationForm):
else:
return []
self.fields.extend([
- oldforms.LargeTextField(field_name="comment", maxlength=3000, is_required=True,
+ oldforms.LargeTextField(field_name="comment", max_length=3000, is_required=True,
validator_list=[self.hasNoProfanities]),
oldforms.RadioSelectField(field_name="rating1", choices=choices,
is_required=ratings_required and num_rating_choices > 0,
@@ -122,9 +122,9 @@ class PublicFreeCommentManipulator(oldforms.Manipulator):
"Manipulator that handles public free (unregistered) comments"
def __init__(self):
self.fields = (
- oldforms.TextField(field_name="person_name", maxlength=50, is_required=True,
+ oldforms.TextField(field_name="person_name", max_length=50, is_required=True,
validator_list=[self.hasNoProfanities]),
- oldforms.LargeTextField(field_name="comment", maxlength=3000, is_required=True,
+ oldforms.LargeTextField(field_name="comment", max_length=3000, is_required=True,
validator_list=[self.hasNoProfanities]),
)
diff --git a/django/contrib/contenttypes/models.py b/django/contrib/contenttypes/models.py
index a825b4f3dd..cda47a18aa 100644
--- a/django/contrib/contenttypes/models.py
+++ b/django/contrib/contenttypes/models.py
@@ -32,9 +32,9 @@ class ContentTypeManager(models.Manager):
CONTENT_TYPE_CACHE = {}
class ContentType(models.Model):
- name = models.CharField(maxlength=100)
- app_label = models.CharField(maxlength=100)
- model = models.CharField(_('python model class name'), maxlength=100)
+ name = models.CharField(max_length=100)
+ app_label = models.CharField(max_length=100)
+ model = models.CharField(_('python model class name'), max_length=100)
objects = ContentTypeManager()
class Meta:
verbose_name = _('content type')
diff --git a/django/contrib/databrowse/plugins/fieldchoices.py b/django/contrib/databrowse/plugins/fieldchoices.py
index fc93ecaa63..a5dd07c639 100644
--- a/django/contrib/databrowse/plugins/fieldchoices.py
+++ b/django/contrib/databrowse/plugins/fieldchoices.py
@@ -37,9 +37,10 @@ class FieldChoicePlugin(DatabrowsePlugin):
def urls(self, plugin_name, easy_instance_field):
if easy_instance_field.field in self.field_dict(easy_instance_field.model.model).values():
+ field_value = smart_str(easy_instance_field.raw_value)
return [u'%s%s/%s/%s/' % (easy_instance_field.model.url(),
plugin_name, easy_instance_field.field.name,
- urllib.quote(smart_str(easy_instance_field.raw_value)))]
+ urllib.quote(field_value, safe=''))]
def model_view(self, request, model_databrowse, url):
self.model, self.site = model_databrowse.model, model_databrowse.site
diff --git a/django/contrib/databrowse/templates/databrowse/calendar_day.html b/django/contrib/databrowse/templates/databrowse/calendar_day.html
index d45fb3e768..4e8a8dabbd 100644
--- a/django/contrib/databrowse/templates/databrowse/calendar_day.html
+++ b/django/contrib/databrowse/templates/databrowse/calendar_day.html
@@ -10,7 +10,7 @@
<ul class="objectlist">
{% for object in object_list %}
-<li class="{% cycle odd,even %}"><a href="{{ object.url }}">{{ object }}</a></li>
+<li class="{% cycle odd,even %}"><a href="{{ object.url }}">{{ object|escape }}</a></li>
{% endfor %}
</ul>
diff --git a/django/contrib/databrowse/templates/databrowse/calendar_month.html b/django/contrib/databrowse/templates/databrowse/calendar_month.html
index 51a25967f8..9ff0cae08f 100644
--- a/django/contrib/databrowse/templates/databrowse/calendar_month.html
+++ b/django/contrib/databrowse/templates/databrowse/calendar_month.html
@@ -10,7 +10,7 @@
<ul class="objectlist">
{% for object in object_list %}
-<li class="{% cycle odd,even %}"><a href="{{ object.url }}">{{ object }}</a></li>
+<li class="{% cycle odd,even %}"><a href="{{ object.url }}">{{ object|escape }}</a></li>
{% endfor %}
</ul>
diff --git a/django/contrib/databrowse/templates/databrowse/choice_detail.html b/django/contrib/databrowse/templates/databrowse/choice_detail.html
index 977a4a482f..35a67f4528 100644
--- a/django/contrib/databrowse/templates/databrowse/choice_detail.html
+++ b/django/contrib/databrowse/templates/databrowse/choice_detail.html
@@ -10,7 +10,7 @@
<ul class="objectlist">
{% for object in object_list %}
-<li class="{% cycle odd,even %}"><a href="{{ object.url }}">{{ object }}</a></li>
+<li class="{% cycle odd,even %}"><a href="{{ object.url }}">{{ object|escape }}</a></li>
{% endfor %}
</ul>
diff --git a/django/contrib/databrowse/templates/databrowse/choice_list.html b/django/contrib/databrowse/templates/databrowse/choice_list.html
index b15531a0fd..3122330635 100644
--- a/django/contrib/databrowse/templates/databrowse/choice_list.html
+++ b/django/contrib/databrowse/templates/databrowse/choice_list.html
@@ -10,7 +10,7 @@
<ul class="objectlist">
{% for choice in field.choices %}
-<li class="{% cycle odd,even %}"><a href="{{ choice.url }}">{{ choice.label }}</a></li>
+<li class="{% cycle odd,even %}"><a href="{{ choice.url }}">{{ choice.label|escape }}</a></li>
{% endfor %}
</ul>
diff --git a/django/contrib/databrowse/templates/databrowse/homepage.html b/django/contrib/databrowse/templates/databrowse/homepage.html
index ebf3ceca80..e4f3d60b16 100644
--- a/django/contrib/databrowse/templates/databrowse/homepage.html
+++ b/django/contrib/databrowse/templates/databrowse/homepage.html
@@ -11,7 +11,7 @@
<h2><a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a></h2>
<p>
{% for object in model.sample_objects %}
- <a href="{{ object.url }}">{{ object }}</a>,
+ <a href="{{ object.url }}">{{ object|escape }}</a>,
{% endfor %}
<a class="more" href="{{ model.url }}">More &rarr;</a>
</p>
diff --git a/django/contrib/databrowse/templates/databrowse/model_detail.html b/django/contrib/databrowse/templates/databrowse/model_detail.html
index 24cd766a3d..69e02af975 100644
--- a/django/contrib/databrowse/templates/databrowse/model_detail.html
+++ b/django/contrib/databrowse/templates/databrowse/model_detail.html
@@ -12,7 +12,7 @@
<ul class="objectlist">
{% for object in model.objects %}
- <li class="{% cycle odd,even %}"><a href="{{ object.url }}">{{ object }}</a></li>
+ <li class="{% cycle odd,even %}"><a href="{{ object.url }}">{{ object|escape }}</a></li>
{% endfor %}
</ul>
diff --git a/django/contrib/databrowse/templates/databrowse/object_detail.html b/django/contrib/databrowse/templates/databrowse/object_detail.html
index 2195ad3080..af5b937985 100644
--- a/django/contrib/databrowse/templates/databrowse/object_detail.html
+++ b/django/contrib/databrowse/templates/databrowse/object_detail.html
@@ -4,9 +4,9 @@
{% block content %}
-<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ object.model.url }}">{{ object.model.verbose_name_plural|capfirst }}</a> / {{ object }}</div>
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ object.model.url }}">{{ object.model.verbose_name_plural|capfirst }}</a> / {{ object|escape }}</div>
-<h1>{{ object.model.verbose_name|capfirst }}: {{ object }}</h1>
+<h1>{{ object.model.verbose_name|capfirst }}: {{ object|escape }}</h1>
<table class="objectinfo">
{% for field in object.fields %}
@@ -14,8 +14,8 @@
<th>{{ field.field.verbose_name|capfirst }}</th>
<td>
{% if field.urls %}
-{% for urlvalue in field.urls %}
-{% if urlvalue.1 %}<a href="{{ urlvalue.1 }}">{% endif %}{{ urlvalue.0 }}{% if urlvalue.1 %}</a>{% endif %}{% if not forloop.last %}, {% endif %}
+{% for value, url in field.urls %}
+{% if url %}<a href="{{ url }}">{% endif %}{{ value|escape }}{% if url %}</a>{% endif %}{% if not forloop.last %}, {% endif %}
{% endfor %}
{% else %}None{% endif %}
</td>
@@ -29,7 +29,7 @@
{% if related_object.object_list %}
<ul class="objectlist">
{% for object in related_object.object_list %}
- <li class="{% cycle odd,even %}"><a href="{{ object.url }}">{{ object }}</a></li>
+ <li class="{% cycle odd,even %}"><a href="{{ object.url }}">{{ object|escape }}</a></li>
{% endfor %}
</ul>
{% else %}
diff --git a/django/contrib/flatpages/models.py b/django/contrib/flatpages/models.py
index 4a06b8c685..be75a22818 100644
--- a/django/contrib/flatpages/models.py
+++ b/django/contrib/flatpages/models.py
@@ -4,12 +4,12 @@ from django.contrib.sites.models import Site
from django.utils.translation import ugettext_lazy as _
class FlatPage(models.Model):
- url = models.CharField(_('URL'), maxlength=100, validator_list=[validators.isAlphaNumericURL], db_index=True,
+ url = models.CharField(_('URL'), max_length=100, validator_list=[validators.isAlphaNumericURL], db_index=True,
help_text=_("Example: '/about/contact/'. Make sure to have leading and trailing slashes."))
- title = models.CharField(_('title'), maxlength=200)
+ title = models.CharField(_('title'), max_length=200)
content = models.TextField(_('content'))
enable_comments = models.BooleanField(_('enable comments'))
- template_name = models.CharField(_('template name'), maxlength=70, blank=True,
+ template_name = models.CharField(_('template name'), max_length=70, blank=True,
help_text=_("Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'."))
registration_required = models.BooleanField(_('registration required'), help_text=_("If this is checked, only logged-in users will be able to view the page."))
sites = models.ManyToManyField(Site)
diff --git a/django/contrib/localflavor/cl/cl_regions.py b/django/contrib/localflavor/cl/cl_regions.py
new file mode 100644
index 0000000000..47db6d3912
--- /dev/null
+++ b/django/contrib/localflavor/cl/cl_regions.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+"""
+A list of Chilean regions as `choices` in a formfield.
+
+This exists in this standalone file so that it's only imported into memory
+when explicitly needed.
+"""
+
+REGION_CHOICES = (
+ ('RM', u'Región Metropolitana de Santiago'),
+ ('I', u'Región de Tarapacá'),
+ ('II', u'Región de Antofagasta'),
+ ('III', u'Región de Atacama'),
+ ('IV', u'Región de Coquimbo'),
+ ('V', u'Región de Valparaíso'),
+ ('VI', u'Región del Libertador Bernardo O\'Higgins'),
+ ('VII', u'Región del Maule'),
+ ('VIII',u'Región del Bío Bío'),
+ ('IX', u'Región de la Araucanía'),
+ ('X', u'Región de los Lagos'),
+ ('XI', u'Región de Aysén del General Carlos Ibáñez del Campo'),
+ ('XII', u'Región de Magallanes y la Antártica Chilena'),
+ ('XIV', u'Región de Los Ríos'),
+ ('XV', u'Región de Arica-Parinacota'),
+)
diff --git a/django/contrib/localflavor/cl/forms.py b/django/contrib/localflavor/cl/forms.py
index a737bcb5a7..d2d37a3712 100644
--- a/django/contrib/localflavor/cl/forms.py
+++ b/django/contrib/localflavor/cl/forms.py
@@ -3,10 +3,20 @@ Chile specific form helpers.
"""
from django.newforms import ValidationError
-from django.newforms.fields import RegexField, EMPTY_VALUES
+from django.newforms.fields import RegexField, Select, EMPTY_VALUES
from django.utils.translation import ugettext
from django.utils.encoding import smart_unicode
+
+class CLRegionSelect(Select):
+ """
+ A Select widget that uses a list of Chilean Regions (Regiones)
+ as its choices.
+ """
+ def __init__(self, attrs=None):
+ from cl_regions import REGION_CHOICES
+ super(CLRegionSelect, self).__init__(attrs, choices=REGION_CHOICES)
+
class CLRutField(RegexField):
"""
Chilean "Rol Unico Tributario" (RUT) field. This is the Chilean national
diff --git a/django/contrib/localflavor/no/forms.py b/django/contrib/localflavor/no/forms.py
index a0d599324f..2de3df14d8 100644
--- a/django/contrib/localflavor/no/forms.py
+++ b/django/contrib/localflavor/no/forms.py
@@ -1,4 +1,3 @@
-# -*- coding: iso-8859-1 -*-
"""
Norwegian-specific Form helpers
"""
@@ -66,7 +65,7 @@ class NOSocialSecurityNumber(Field):
weight_2 = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2, 1]
def multiply_reduce(aval, bval):
- return sum((a * b) for (a, b) in zip(aval, bval))
+ return sum([(a * b) for (a, b) in zip(aval, bval)])
if multiply_reduce(digits, weight_1) % 11 != 0:
raise ValidationError(msg)
diff --git a/django/contrib/localflavor/sk/__init__.py b/django/contrib/localflavor/sk/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/django/contrib/localflavor/sk/__init__.py
diff --git a/django/contrib/localflavor/sk/forms.py b/django/contrib/localflavor/sk/forms.py
new file mode 100644
index 0000000000..0aa000a0a5
--- /dev/null
+++ b/django/contrib/localflavor/sk/forms.py
@@ -0,0 +1,41 @@
+"""
+Slovak-specific form helpers
+"""
+
+from django.newforms.fields import Select, RegexField
+from django.utils.translation import ugettext
+
+class SKRegionSelect(Select):
+ """
+ A select widget widget with list of Slovak regions as choices.
+ """
+ def __init__(self, attrs=None):
+ from sk_regions import REGION_CHOICES
+ super(SKRegionSelect, self).__init__(attrs, choices=REGION_CHOICES)
+
+class SKDistrictSelect(Select):
+ """
+ A select widget with list of Slovak districts as choices.
+ """
+ def __init__(self, attrs=None):
+ from sk_districts import DISTRICT_CHOICES
+ super(SKDistrictSelect, self).__init__(attrs, choices=DISTRICT_CHOICES)
+
+class SKPostalCodeField(RegexField):
+ """
+ A form field that validates its input as Slovak postal code.
+ Valid form is XXXXX or XXX XX, where X represents integer.
+ """
+ def __init__(self, *args, **kwargs):
+ super(SKPostalCodeField, self).__init__(r'^\d{5}$|^\d{3} \d{2}$',
+ max_length=None, min_length=None,
+ error_message=ugettext(u'Enter a postal code in the format XXXXX or XXX XX.'),
+ *args, **kwargs)
+
+ def clean(self, value):
+ """
+ Validates the input and returns a string that contains only numbers.
+ Returns an empty string for empty values.
+ """
+ v = super(SKPostalCodeField, self).clean(value)
+ return v.replace(' ', '')
diff --git a/django/contrib/localflavor/sk/sk_districts.py b/django/contrib/localflavor/sk/sk_districts.py
new file mode 100644
index 0000000000..95e87967b9
--- /dev/null
+++ b/django/contrib/localflavor/sk/sk_districts.py
@@ -0,0 +1,87 @@
+"""
+Slovak districts according to http://sk.wikipedia.org/wiki/Administrat%C3%ADvne_%C4%8Dlenenie_Slovenska
+"""
+
+from django.utils.translation import ugettext_lazy as _
+
+DISTRICT_CHOICES = (
+ ('BB', _('Banska Bystrica')),
+ ('BS', _('Banska Stiavnica')),
+ ('BJ', _('Bardejov')),
+ ('BN', _('Banovce nad Bebravou')),
+ ('BR', _('Brezno')),
+ ('BA1', _('Bratislava I')),
+ ('BA2', _('Bratislava II')),
+ ('BA3', _('Bratislava III')),
+ ('BA4', _('Bratislava IV')),
+ ('BA5', _('Bratislava V')),
+ ('BY', _('Bytca')),
+ ('CA', _('Cadca')),
+ ('DT', _('Detva')),
+ ('DK', _('Dolny Kubin')),
+ ('DS', _('Dunajska Streda')),
+ ('GA', _('Galanta')),
+ ('GL', _('Gelnica')),
+ ('HC', _('Hlohovec')),
+ ('HE', _('Humenne')),
+ ('IL', _('Ilava')),
+ ('KK', _('Kezmarok')),
+ ('KN', _('Komarno')),
+ ('KE1', _('Kosice I')),
+ ('KE2', _('Kosice II')),
+ ('KE3', _('Kosice III')),
+ ('KE4', _('Kosice IV')),
+ ('KEO', _('Kosice - okolie')),
+ ('KA', _('Krupina')),
+ ('KM', _('Kysucke Nove Mesto')),
+ ('LV', _('Levice')),
+ ('LE', _('Levoca')),
+ ('LM', _('Liptovsky Mikulas')),
+ ('LC', _('Lucenec')),
+ ('MA', _('Malacky')),
+ ('MT', _('Martin')),
+ ('ML', _('Medzilaborce')),
+ ('MI', _('Michalovce')),
+ ('MY', _('Myjava')),
+ ('NO', _('Namestovo')),
+ ('NR', _('Nitra')),
+ ('NM', _('Nove Mesto nad Vahom')),
+ ('NZ', _('Nove Zamky')),
+ ('PE', _('Partizanske')),
+ ('PK', _('Pezinok')),
+ ('PN', _('Piestany')),
+ ('PT', _('Poltar')),
+ ('PP', _('Poprad')),
+ ('PB', _('Povazska Bystrica')),
+ ('PO', _('Presov')),
+ ('PD', _('Prievidza')),
+ ('PU', _('Puchov')),
+ ('RA', _('Revuca')),
+ ('RS', _('Rimavska Sobota')),
+ ('RV', _('Roznava')),
+ ('RK', _('Ruzomberok')),
+ ('SB', _('Sabinov')),
+ ('SC', _('Senec')),
+ ('SE', _('Senica')),
+ ('SI', _('Skalica')),
+ ('SV', _('Snina')),
+ ('SO', _('Sobrance')),
+ ('SN', _('Spisska Nova Ves')),
+ ('SL', _('Stara Lubovna')),
+ ('SP', _('Stropkov')),
+ ('SK', _('Svidnik')),
+ ('SA', _('Sala')),
+ ('TO', _('Topolcany')),
+ ('TV', _('Trebisov')),
+ ('TN', _('Trencin')),
+ ('TT', _('Trnava')),
+ ('TR', _('Turcianske Teplice')),
+ ('TS', _('Tvrdosin')),
+ ('VK', _('Velky Krtis')),
+ ('VT', _('Vranov nad Toplou')),
+ ('ZM', _('Zlate Moravce')),
+ ('ZV', _('Zvolen')),
+ ('ZC', _('Zarnovica')),
+ ('ZH', _('Ziar nad Hronom')),
+ ('ZA', _('Zilina')),
+)
diff --git a/django/contrib/localflavor/sk/sk_regions.py b/django/contrib/localflavor/sk/sk_regions.py
new file mode 100644
index 0000000000..66de814e01
--- /dev/null
+++ b/django/contrib/localflavor/sk/sk_regions.py
@@ -0,0 +1,16 @@
+"""
+Slovak regions according to http://sk.wikipedia.org/wiki/Administrat%C3%ADvne_%C4%8Dlenenie_Slovenska
+"""
+
+from django.utils.translation import ugettext_lazy as _
+
+REGION_CHOICES = (
+ ('BB', _('Banska Bystrica region')),
+ ('BA', _('Bratislava region')),
+ ('KE', _('Kosice region')),
+ ('NR', _('Nitra region')),
+ ('PO', _('Presov region')),
+ ('TN', _('Trencin region')),
+ ('TT', _('Trnava region')),
+ ('ZA', _('Zilina region')),
+)
diff --git a/django/contrib/redirects/models.py b/django/contrib/redirects/models.py
index 529912e545..68f4afeb49 100644
--- a/django/contrib/redirects/models.py
+++ b/django/contrib/redirects/models.py
@@ -4,9 +4,9 @@ from django.utils.translation import ugettext_lazy as _
class Redirect(models.Model):
site = models.ForeignKey(Site, radio_admin=models.VERTICAL)
- old_path = models.CharField(_('redirect from'), maxlength=200, db_index=True,
+ old_path = models.CharField(_('redirect from'), max_length=200, db_index=True,
help_text=_("This should be an absolute path, excluding the domain name. Example: '/events/search/'."))
- new_path = models.CharField(_('redirect to'), maxlength=200, blank=True,
+ new_path = models.CharField(_('redirect to'), max_length=200, blank=True,
help_text=_("This can be either an absolute path (as above) or a full URL starting with 'http://'."))
class Meta:
diff --git a/django/contrib/sessions/middleware.py b/django/contrib/sessions/middleware.py
index 82b217f829..2531c8e244 100644
--- a/django/contrib/sessions/middleware.py
+++ b/django/contrib/sessions/middleware.py
@@ -2,7 +2,9 @@ from django.conf import settings
from django.contrib.sessions.models import Session
from django.core.exceptions import SuspiciousOperation
from django.utils.cache import patch_vary_headers
+from email.Utils import formatdate
import datetime
+import time
TEST_COOKIE_NAME = 'testcookie'
TEST_COOKIE_VALUE = 'worked'
@@ -37,7 +39,7 @@ class SessionWrapper(object):
return self._session.get(key, default)
def pop(self, key, *args):
- self.modified = self.modified or key in self._session
+ self.modified = self.modified or key in self._session
return self._session.pop(key, *args)
def set_test_cookie(self):
@@ -98,7 +100,11 @@ class SessionMiddleware(object):
expires = None
else:
max_age = settings.SESSION_COOKIE_AGE
- expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE), "%a, %d-%b-%Y %H:%M:%S GMT")
+ rfcdate = formatdate(time.time() + settings.SESSION_COOKIE_AGE)
+ # Fixed length date must have '-' separation in the format
+ # DD-MMM-YYYY for compliance with Netscape cookie standard
+ expires = (rfcdate[:7] + "-" + rfcdate[8:11]
+ + "-" + rfcdate[12:26] + "GMT")
new_session = Session.objects.save(session_key, request.session._session,
datetime.datetime.now() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE))
response.set_cookie(settings.SESSION_COOKIE_NAME, session_key,
diff --git a/django/contrib/sessions/models.py b/django/contrib/sessions/models.py
index d2df17284c..29adc6e30c 100644
--- a/django/contrib/sessions/models.py
+++ b/django/contrib/sessions/models.py
@@ -65,7 +65,7 @@ class Session(models.Model):
the sessions documentation that is shipped with Django (also available
on the Django website).
"""
- session_key = models.CharField(_('session key'), maxlength=40, primary_key=True)
+ session_key = models.CharField(_('session key'), max_length=40, primary_key=True)
session_data = models.TextField(_('session data'))
expire_date = models.DateTimeField(_('expire date'))
objects = SessionManager()
diff --git a/django/contrib/sites/models.py b/django/contrib/sites/models.py
index 8b99d23bad..75fba4e6dd 100644
--- a/django/contrib/sites/models.py
+++ b/django/contrib/sites/models.py
@@ -4,11 +4,16 @@ from django.utils.translation import ugettext_lazy as _
class SiteManager(models.Manager):
def get_current(self):
from django.conf import settings
- return self.get(pk=settings.SITE_ID)
+ try:
+ sid = settings.SITE_ID
+ except AttributeError:
+ from django.core.exceptions import ImproperlyConfigured
+ raise ImproperlyConfigured("You're using the Django \"sites framework\" without having set the SITE_ID setting. Create a site in your database and set the SITE_ID setting to fix this error.")
+ return self.get(pk=sid)
class Site(models.Model):
- domain = models.CharField(_('domain name'), maxlength=100)
- name = models.CharField(_('display name'), maxlength=50)
+ domain = models.CharField(_('domain name'), max_length=100)
+ name = models.CharField(_('display name'), max_length=50)
objects = SiteManager()
class Meta:
@@ -31,3 +36,20 @@ class SiteAdmin(admin.ModelAdmin):
search_fields = ('domain', 'name')
admin.site.register(Site, SiteAdmin)
+
+class RequestSite(object):
+ """
+ A class that shares the primary interface of Site (i.e., it has
+ ``domain`` and ``name`` attributes) but gets its data from a Django
+ HttpRequest object rather than from a database.
+
+ The save() and delete() methods raise NotImplementedError.
+ """
+ def __init__(self, request):
+ self.domain = self.name = request.META['SERVER_NAME']
+
+ def save(self):
+ raise NotImplementedError('RequestSite cannot be saved.')
+
+ def delete(self):
+ raise NotImplementedError('RequestSite cannot be deleted.')
diff --git a/django/contrib/syndication/feeds.py b/django/contrib/syndication/feeds.py
index 428767ae48..eb5a9f0607 100644
--- a/django/contrib/syndication/feeds.py
+++ b/django/contrib/syndication/feeds.py
@@ -1,15 +1,15 @@
from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist
from django.template import Context, loader, Template, TemplateDoesNotExist
-from django.contrib.sites.models import Site
+from django.contrib.sites.models import Site, RequestSite
from django.utils import feedgenerator
-from django.utils.encoding import smart_unicode
+from django.utils.encoding import smart_unicode, iri_to_uri
from django.conf import settings
def add_domain(domain, url):
if not url.startswith('http://'):
# 'url' must already be ASCII and URL-quoted, so no need for encoding
# conversions here.
- url = u'http://%s%s' % (domain, url)
+ url = iri_to_uri(u'http://%s%s' % (domain, url))
return url
class FeedDoesNotExist(ObjectDoesNotExist):
@@ -22,9 +22,10 @@ class Feed(object):
title_template = None
description_template = None
- def __init__(self, slug, feed_url):
+ def __init__(self, slug, request):
self.slug = slug
- self.feed_url = feed_url
+ self.request = request
+ self.feed_url = request.path
self.title_template_name = self.title_template or ('feeds/%s_title.html' % slug)
self.description_template_name = self.description_template or ('feeds/%s_description.html' % slug)
@@ -67,7 +68,11 @@ class Feed(object):
else:
obj = None
- current_site = Site.objects.get_current()
+ if Site._meta.installed:
+ current_site = Site.objects.get_current()
+ else:
+ current_site = RequestSite(self.request)
+
link = self.__get_dynamic_attr('link', obj)
link = add_domain(current_site.domain, link)
@@ -83,6 +88,7 @@ class Feed(object):
author_email = self.__get_dynamic_attr('author_email', obj),
categories = self.__get_dynamic_attr('categories', obj),
feed_copyright = self.__get_dynamic_attr('feed_copyright', obj),
+ feed_guid = self.__get_dynamic_attr('feed_guid', obj),
)
try:
@@ -114,7 +120,7 @@ class Feed(object):
title = title_tmp.render(Context({'obj': item, 'site': current_site})),
link = link,
description = description_tmp.render(Context({'obj': item, 'site': current_site})),
- unique_id = link,
+ unique_id = self.__get_dynamic_attr('item_guid', item, link),
enclosure = enc,
pubdate = self.__get_dynamic_attr('item_pubdate', item),
author_name = author_name,
diff --git a/django/contrib/syndication/views.py b/django/contrib/syndication/views.py
index 621665d4d4..423d333991 100644
--- a/django/contrib/syndication/views.py
+++ b/django/contrib/syndication/views.py
@@ -16,7 +16,7 @@ def feed(request, url, feed_dict=None):
raise Http404, "Slug %r isn't registered." % slug
try:
- feedgen = f(slug, request.path).get_feed(param)
+ feedgen = f(slug, request).get_feed(param)
except feeds.FeedDoesNotExist:
raise Http404, "Invalid feed parameters. Slug %r is valid, but other parameters, or lack thereof, are not." % slug
diff --git a/django/core/cache/backends/filebased.py b/django/core/cache/backends/filebased.py
index faaf8910ce..d5415c8ace 100644
--- a/django/core/cache/backends/filebased.py
+++ b/django/core/cache/backends/filebased.py
@@ -1,7 +1,8 @@
"File-based cache backend"
from django.core.cache.backends.simple import CacheClass as SimpleCacheClass
-import os, time, urllib
+from django.utils.http import urlquote_plus
+import os, time
try:
import cPickle as pickle
except ImportError:
@@ -77,4 +78,4 @@ class CacheClass(SimpleCacheClass):
raise EnvironmentError, "Cache directory '%s' does not exist and could not be created'" % self._dir
def _key_to_file(self, key):
- return os.path.join(self._dir, urllib.quote_plus(key))
+ return os.path.join(self._dir, urlquote_plus(key))
diff --git a/django/core/cache/backends/locmem.py b/django/core/cache/backends/locmem.py
index 0e21b80ed8..4c48c571b7 100644
--- a/django/core/cache/backends/locmem.py
+++ b/django/core/cache/backends/locmem.py
@@ -1,8 +1,13 @@
"Thread-safe in-memory cache backend."
+import time
+try:
+ import cPickle as pickle
+except ImportError:
+ import pickle
+
from django.core.cache.backends.simple import CacheClass as SimpleCacheClass
from django.utils.synch import RWLock
-import copy, time
class CacheClass(SimpleCacheClass):
def __init__(self, host, params):
@@ -20,7 +25,10 @@ class CacheClass(SimpleCacheClass):
elif exp < now:
should_delete = True
else:
- return copy.deepcopy(self._cache[key])
+ try:
+ return pickle.loads(self._cache[key])
+ except pickle.PickleError:
+ return default
finally:
self._lock.reader_leaves()
if should_delete:
@@ -35,7 +43,10 @@ class CacheClass(SimpleCacheClass):
def set(self, key, value, timeout=None):
self._lock.writer_enters()
try:
- SimpleCacheClass.set(self, key, value, timeout)
+ try:
+ super(CacheClass, self).set(key, pickle.dumps(value), timeout)
+ except pickle.PickleError:
+ pass
finally:
self._lock.writer_leaves()
diff --git a/django/core/cache/backends/memcached.py b/django/core/cache/backends/memcached.py
index 1ab019221a..52610daef1 100644
--- a/django/core/cache/backends/memcached.py
+++ b/django/core/cache/backends/memcached.py
@@ -1,6 +1,7 @@
"Memcached cache backend"
from django.core.cache.backends.base import BaseCache, InvalidCacheBackendError
+from django.utils.encoding import smart_unicode, smart_str
try:
import cmemcache as memcache
@@ -16,17 +17,22 @@ class CacheClass(BaseCache):
self._cache = memcache.Client(server.split(';'))
def get(self, key, default=None):
- val = self._cache.get(key)
+ val = self._cache.get(smart_str(key))
if val is None:
return default
else:
- return val
+ if isinstance(val, basestring):
+ return smart_unicode(val)
+ else:
+ return val
def set(self, key, value, timeout=0):
- self._cache.set(key, value, timeout or self.default_timeout)
+ if isinstance(value, unicode):
+ value = value.encode('utf-8')
+ self._cache.set(smart_str(key), value, timeout or self.default_timeout)
def delete(self, key):
- self._cache.delete(key)
+ self._cache.delete(smart_str(key))
def get_many(self, keys):
- return self._cache.get_multi(keys)
+ return self._cache.get_multi(map(smart_str,keys))
diff --git a/django/core/handlers/modpython.py b/django/core/handlers/modpython.py
index e26f234fe5..7c4bbb3082 100644
--- a/django/core/handlers/modpython.py
+++ b/django/core/handlers/modpython.py
@@ -2,6 +2,7 @@ from django.core.handlers.base import BaseHandler
from django.core import signals
from django.dispatch import dispatcher
from django.utils import datastructures
+from django.utils.encoding import force_unicode
from django import http
from pprint import pformat
import os
@@ -13,7 +14,7 @@ import os
class ModPythonRequest(http.HttpRequest):
def __init__(self, req):
self._req = req
- self.path = req.uri
+ self.path = force_unicode(req.uri)
def __repr__(self):
# Since this is called as part of error handling, we need to be very
diff --git a/django/core/handlers/wsgi.py b/django/core/handlers/wsgi.py
index 49938e25dc..2db83fccfc 100644
--- a/django/core/handlers/wsgi.py
+++ b/django/core/handlers/wsgi.py
@@ -2,6 +2,7 @@ from django.core.handlers.base import BaseHandler
from django.core import signals
from django.dispatch import dispatcher
from django.utils import datastructures
+from django.utils.encoding import force_unicode
from django import http
from pprint import pformat
from shutil import copyfileobj
@@ -73,7 +74,7 @@ def safe_copyfileobj(fsrc, fdst, length=16*1024, size=0):
class WSGIRequest(http.HttpRequest):
def __init__(self, environ):
self.environ = environ
- self.path = environ['PATH_INFO']
+ self.path = force_unicode(environ['PATH_INFO'])
self.META = environ
self.method = environ['REQUEST_METHOD'].upper()
diff --git a/django/core/management.py b/django/core/management.py
index 1f54ba6ebf..be1134506c 100644
--- a/django/core/management.py
+++ b/django/core/management.py
@@ -95,19 +95,12 @@ def _get_sequence_list():
return sequence_list
-# If the foreign key points to an AutoField, a PositiveIntegerField or a
-# PositiveSmallIntegerField, the foreign key should be an IntegerField, not the
-# referred field type. Otherwise, the foreign key should be the same type of
-# field as the field to which it points.
-get_rel_data_type = lambda f: (f.get_internal_type() in ('AutoField', 'PositiveIntegerField', 'PositiveSmallIntegerField')) and 'IntegerField' or f.get_internal_type()
-
def get_sql_create(app):
"Returns a list of the CREATE TABLE SQL statements for the given app."
- from django.db import get_creation_module, models
-
- data_types = get_creation_module().DATA_TYPES
+ from django.db import models
+ from django.conf import settings
- if not data_types:
+ if settings.DATABASE_ENGINE == 'dummy':
# This must be the "dummy" database backend, which means the user
# hasn't set DATABASE_ENGINE.
sys.stderr.write(style.ERROR("Error: Django doesn't know which syntax to use for your SQL statements,\n" +
@@ -159,52 +152,46 @@ def _get_sql_model_create(model, known_models=set()):
Returns list_of_sql, pending_references_dict
"""
- from django.db import backend, get_creation_module, models
- data_types = get_creation_module().DATA_TYPES
+ from django.db import backend, models
opts = model._meta
final_output = []
table_output = []
pending_references = {}
for f in opts.fields:
- if isinstance(f, (models.ForeignKey, models.OneToOneField)):
- rel_field = f.rel.get_related_field()
- while isinstance(rel_field, (models.ForeignKey, models.OneToOneField)):
- rel_field = rel_field.rel.get_related_field()
- data_type = get_rel_data_type(rel_field)
- else:
- rel_field = f
- data_type = f.get_internal_type()
- col_type = data_types[data_type]
+ col_type = f.db_type()
tablespace = f.db_tablespace or opts.db_tablespace
- if col_type is not None:
- # Make the definition (e.g. 'foo VARCHAR(30)') for this field.
- field_output = [style.SQL_FIELD(backend.quote_name(f.column)),
- style.SQL_COLTYPE(col_type % rel_field.__dict__)]
- field_output.append(style.SQL_KEYWORD('%sNULL' % (not f.null and 'NOT ' or '')))
- if f.unique and (not f.primary_key or backend.allows_unique_and_pk):
- field_output.append(style.SQL_KEYWORD('UNIQUE'))
- if f.primary_key:
- field_output.append(style.SQL_KEYWORD('PRIMARY KEY'))
- if tablespace and backend.supports_tablespaces and (f.unique or f.primary_key) and backend.autoindexes_primary_keys:
- # We must specify the index tablespace inline, because we
- # won't be generating a CREATE INDEX statement for this field.
- field_output.append(backend.get_tablespace_sql(tablespace, inline=True))
- if f.rel:
- if f.rel.to in known_models:
- field_output.append(style.SQL_KEYWORD('REFERENCES') + ' ' + \
- style.SQL_TABLE(backend.quote_name(f.rel.to._meta.db_table)) + ' (' + \
- style.SQL_FIELD(backend.quote_name(f.rel.to._meta.get_field(f.rel.field_name).column)) + ')' +
- backend.get_deferrable_sql()
- )
- else:
- # We haven't yet created the table to which this field
- # is related, so save it for later.
- pr = pending_references.setdefault(f.rel.to, []).append((model, f))
- table_output.append(' '.join(field_output))
+ if col_type is None:
+ # Skip ManyToManyFields, because they're not represented as
+ # database columns in this table.
+ continue
+ # Make the definition (e.g. 'foo VARCHAR(30)') for this field.
+ field_output = [style.SQL_FIELD(backend.quote_name(f.column)),
+ style.SQL_COLTYPE(col_type)]
+ field_output.append(style.SQL_KEYWORD('%sNULL' % (not f.null and 'NOT ' or '')))
+ if f.unique and (not f.primary_key or backend.allows_unique_and_pk):
+ field_output.append(style.SQL_KEYWORD('UNIQUE'))
+ if f.primary_key:
+ field_output.append(style.SQL_KEYWORD('PRIMARY KEY'))
+ if tablespace and backend.supports_tablespaces and (f.unique or f.primary_key) and backend.autoindexes_primary_keys:
+ # We must specify the index tablespace inline, because we
+ # won't be generating a CREATE INDEX statement for this field.
+ field_output.append(backend.get_tablespace_sql(tablespace, inline=True))
+ if f.rel:
+ if f.rel.to in known_models:
+ field_output.append(style.SQL_KEYWORD('REFERENCES') + ' ' + \
+ style.SQL_TABLE(backend.quote_name(f.rel.to._meta.db_table)) + ' (' + \
+ style.SQL_FIELD(backend.quote_name(f.rel.to._meta.get_field(f.rel.field_name).column)) + ')' +
+ backend.get_deferrable_sql()
+ )
+ else:
+ # We haven't yet created the table to which this field
+ # is related, so save it for later.
+ pr = pending_references.setdefault(f.rel.to, []).append((model, f))
+ table_output.append(' '.join(field_output))
if opts.order_with_respect_to:
table_output.append(style.SQL_FIELD(backend.quote_name('_order')) + ' ' + \
- style.SQL_COLTYPE(data_types['IntegerField']) + ' ' + \
+ style.SQL_COLTYPE(models.IntegerField().db_type()) + ' ' + \
style.SQL_KEYWORD('NULL'))
for field_constraints in opts.unique_together:
table_output.append(style.SQL_KEYWORD('UNIQUE') + ' (%s)' % \
@@ -232,9 +219,8 @@ def _get_sql_for_pending_references(model, pending_references):
"""
Get any ALTER TABLE statements to add constraints after the fact.
"""
- from django.db import backend, get_creation_module
+ from django.db import backend
from django.db.backends.util import truncate_name
- data_types = get_creation_module().DATA_TYPES
final_output = []
if backend.supports_constraints:
@@ -257,11 +243,9 @@ def _get_sql_for_pending_references(model, pending_references):
return final_output
def _get_many_to_many_sql_for_model(model):
- from django.db import backend, get_creation_module
+ from django.db import backend, models
from django.contrib.contenttypes import generic
- data_types = get_creation_module().DATA_TYPES
-
opts = model._meta
final_output = []
for f in opts.many_to_many:
@@ -275,19 +259,19 @@ def _get_many_to_many_sql_for_model(model):
style.SQL_TABLE(backend.quote_name(f.m2m_db_table())) + ' (']
table_output.append(' %s %s %s%s,' % \
(style.SQL_FIELD(backend.quote_name('id')),
- style.SQL_COLTYPE(data_types['AutoField']),
+ style.SQL_COLTYPE(models.AutoField(primary_key=True).db_type()),
style.SQL_KEYWORD('NOT NULL PRIMARY KEY'),
tablespace_sql))
table_output.append(' %s %s %s %s (%s)%s,' % \
(style.SQL_FIELD(backend.quote_name(f.m2m_column_name())),
- style.SQL_COLTYPE(data_types[get_rel_data_type(opts.pk)] % opts.pk.__dict__),
+ style.SQL_COLTYPE(models.ForeignKey(model).db_type()),
style.SQL_KEYWORD('NOT NULL REFERENCES'),
style.SQL_TABLE(backend.quote_name(opts.db_table)),
style.SQL_FIELD(backend.quote_name(opts.pk.column)),
backend.get_deferrable_sql()))
table_output.append(' %s %s %s %s (%s)%s,' % \
(style.SQL_FIELD(backend.quote_name(f.m2m_reverse_name())),
- style.SQL_COLTYPE(data_types[get_rel_data_type(f.rel.to._meta.pk)] % f.rel.to._meta.pk.__dict__),
+ style.SQL_COLTYPE(models.ForeignKey(f.rel.to).db_type()),
style.SQL_KEYWORD('NOT NULL REFERENCES'),
style.SQL_TABLE(backend.quote_name(f.rel.to._meta.db_table)),
style.SQL_FIELD(backend.quote_name(f.rel.to._meta.pk.column)),
@@ -517,7 +501,7 @@ def _emit_post_sync_signal(created_models, verbosity, interactive):
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 backend, connection, transaction, models, get_creation_module
+ from django.db import backend, connection, transaction, models
from django.conf import settings
disable_termcolors()
@@ -533,8 +517,6 @@ def syncdb(verbosity=1, interactive=True):
except ImportError:
pass
- data_types = get_creation_module().DATA_TYPES
-
cursor = connection.cursor()
# Get a list of all existing database tables,
@@ -928,9 +910,9 @@ def inspectdb():
field_type, new_params = field_type
extra_params.update(new_params)
- # Add maxlength for all CharFields.
+ # Add max_length for all CharFields.
if field_type == 'CharField' and row[3]:
- extra_params['maxlength'] = row[3]
+ extra_params['max_length'] = row[3]
if field_type == 'DecimalField':
extra_params['max_digits'] = row[4]
@@ -1005,8 +987,8 @@ def get_validation_errors(outfile, app=None):
for f in opts.fields:
if f.name == 'id' and not f.primary_key and opts.pk.name == 'id':
e.add(opts, '"%s": You can\'t use "id" as a field name, because each model automatically gets an "id" field if none of the fields have primary_key=True. You need to either remove/rename your "id" field or add primary_key=True to a field.' % f.name)
- if isinstance(f, models.CharField) and f.maxlength in (None, 0):
- e.add(opts, '"%s": CharFields require a "maxlength" attribute.' % f.name)
+ if isinstance(f, models.CharField) and f.max_length in (None, 0):
+ e.add(opts, '"%s": CharFields require a "max_length" attribute.' % f.name)
if isinstance(f, models.DecimalField):
if f.decimal_places is None:
e.add(opts, '"%s": DecimalFields require a "decimal_places" attribute.' % f.name)
@@ -1029,11 +1011,11 @@ 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.
+ # Check that max_length <= 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]])))
+ if db_version < (5, 0, 3) and isinstance(f, (models.CharField, models.CommaSeparatedIntegerField, models.SlugField)) and f.max_length > 255:
+ e.add(opts, '"%s": %s cannot have a "max_length" 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
@@ -1257,7 +1239,8 @@ def runserver(addr, port, use_reloader=True, admin_media_dir=''):
except (AttributeError, KeyError):
error_text = str(e)
sys.stderr.write(style.ERROR("Error: %s" % error_text) + '\n')
- sys.exit(1)
+ # Need to use an OS exit because sys.exit doesn't work in a thread
+ os._exit(1)
except KeyboardInterrupt:
sys.exit(0)
if use_reloader:
@@ -1269,18 +1252,17 @@ runserver.args = '[--noreload] [--adminmedia=ADMIN_MEDIA_PATH] [optional port nu
def createcachetable(tablename):
"Creates the table needed to use the SQL cache backend"
- from django.db import backend, connection, transaction, get_creation_module, models
- data_types = get_creation_module().DATA_TYPES
+ from django.db import backend, connection, transaction, models
fields = (
# "key" is a reserved word in MySQL, so use "cache_key" instead.
- models.CharField(name='cache_key', maxlength=255, unique=True, primary_key=True),
+ models.CharField(name='cache_key', max_length=255, unique=True, primary_key=True),
models.TextField(name='value'),
models.DateTimeField(name='expires', db_index=True),
)
table_output = []
index_output = []
for f in fields:
- field_output = [backend.quote_name(f.name), data_types[f.get_internal_type()] % f.__dict__]
+ field_output = [backend.quote_name(f.name), f.db_type()]
field_output.append("%sNULL" % (not f.null and "NOT " or ""))
if f.unique:
field_output.append("UNIQUE")
@@ -1321,6 +1303,10 @@ def run_shell(use_plain=False):
shell.mainloop()
except ImportError:
import code
+ # Set up a dictionary to serve as the environment for the shell, so
+ # that tab completion works on objects that are imported at runtime.
+ # See ticket 5082.
+ imported_objects = {}
try: # Try activating rlcompleter, because it's handy.
import readline
except ImportError:
@@ -1329,8 +1315,9 @@ def run_shell(use_plain=False):
# We don't have to wrap the following import in a 'try', because
# we already know 'readline' was imported successfully.
import rlcompleter
+ readline.set_completer(rlcompleter.Completer(imported_objects).complete)
readline.parse_and_bind("tab:complete")
- code.interact()
+ code.interact(local=imported_objects)
run_shell.args = '[--plain]'
def dbshell():
@@ -1352,16 +1339,11 @@ def runfcgi(args):
runfastcgi(args)
runfcgi.args = '[various KEY=val options, use `runfcgi help` for help]'
-def test(app_labels, verbosity=1):
+def test(test_labels, verbosity=1, interactive=True):
"Runs the test suite for the specified applications"
from django.conf import settings
from django.db.models import get_app, get_apps
-
- if len(app_labels) == 0:
- app_list = get_apps()
- else:
- app_list = [get_app(app_label) for app_label in app_labels]
-
+
test_path = settings.TEST_RUNNER.split('.')
# Allow for Python 2.5 relative paths
if len(test_path) > 1:
@@ -1371,12 +1353,12 @@ def test(app_labels, verbosity=1):
test_module = __import__(test_module_name, {}, {}, test_path[-1])
test_runner = getattr(test_module, test_path[-1])
- failures = test_runner(app_list, verbosity)
+ failures = test_runner(test_labels, verbosity=verbosity, interactive=interactive)
if failures:
sys.exit(failures)
test.help_doc = 'Runs the test suite for the specified applications, or the entire site if no apps are specified'
-test.args = '[--verbosity] ' + APP_ARGS
+test.args = '[--verbosity] [--noinput]' + APP_ARGS
def load_data(fixture_labels, verbosity=1):
"Installs the provided fixture file(s) as data in the database."
@@ -1450,7 +1432,7 @@ def load_data(fixture_labels, verbosity=1):
print "Installing %s fixture '%s' from %s." % \
(format, fixture_name, humanize(fixture_dir))
try:
- objects = serializers.deserialize(format, fixture)
+ objects = serializers.deserialize(format, fixture)
for obj in objects:
count[0] += 1
models.add(obj.object.__class__)
@@ -1652,7 +1634,12 @@ def execute_from_command_line(action_mapping=DEFAULT_ACTION_MAPPING, argv=None):
action_mapping[action](args[1])
except IndexError:
parser.print_usage_and_exit()
- elif action in ('test', 'loaddata'):
+ elif action == 'test':
+ try:
+ action_mapping[action](args[1:], int(options.verbosity), options.interactive)
+ except IndexError:
+ parser.print_usage_and_exit()
+ elif action == 'loaddata':
try:
action_mapping[action](args[1:], int(options.verbosity))
except IndexError:
@@ -1716,14 +1703,15 @@ def setup_environ(settings_mod):
# Add this project to sys.path so that it's importable in the conventional
# way. For example, if this file (manage.py) lives in a directory
# "myproject", this code would add "/path/to/myproject" to sys.path.
- project_directory = os.path.dirname(settings_mod.__file__)
+ project_directory, settings_filename = os.path.split(settings_mod.__file__)
project_name = os.path.basename(project_directory)
+ settings_name = os.path.splitext(settings_filename)[0]
sys.path.append(os.path.join(project_directory, '..'))
project_module = __import__(project_name, {}, {}, [''])
sys.path.pop()
# Set DJANGO_SETTINGS_MODULE appropriately.
- os.environ['DJANGO_SETTINGS_MODULE'] = '%s.settings' % project_name
+ os.environ['DJANGO_SETTINGS_MODULE'] = '%s.%s' % (project_name, settings_name)
return project_directory
def execute_manager(settings_mod, argv=None):
diff --git a/django/core/serializers/base.py b/django/core/serializers/base.py
index 1ef7bee472..ee9e4dd621 100644
--- a/django/core/serializers/base.py
+++ b/django/core/serializers/base.py
@@ -158,7 +158,12 @@ class DeserializedObject(object):
return "<DeserializedObject: %s>" % smart_str(self.object)
def save(self, save_m2m=True):
- self.object.save()
+ # Call save on the Model baseclass directly. This bypasses any
+ # model-defined save. The save is also forced to be raw.
+ # This ensures that the data that is deserialized is literally
+ # what came from the file, not post-processed by pre_save/save
+ # methods.
+ models.Model.save(self.object, raw=True)
if self.m2m_data and save_m2m:
for accessor_name, object_list in self.m2m_data.items():
setattr(self.object, accessor_name, object_list)
diff --git a/django/core/serializers/xml_serializer.py b/django/core/serializers/xml_serializer.py
index 50bce929b3..667faf7c5e 100644
--- a/django/core/serializers/xml_serializer.py
+++ b/django/core/serializers/xml_serializer.py
@@ -171,7 +171,7 @@ class Deserializer(base.Deserializer):
elif field.rel and isinstance(field.rel, models.ManyToOneRel):
data[field.attname] = self._handle_fk_field_node(field_node, field)
else:
- if len(field_node.childNodes) == 1 and field_node.childNodes[0].nodeName == 'None':
+ if field_node.getElementsByTagName('None'):
value = None
else:
value = field.to_python(getInnerText(field_node).strip())
@@ -185,7 +185,7 @@ class Deserializer(base.Deserializer):
Handle a <field> node for a ForeignKey
"""
# Check if there is a child node named 'None', returning None if so.
- if len(node.childNodes) == 1 and node.childNodes[0].nodeName == 'None':
+ if node.getElementsByTagName('None'):
return None
else:
return field.rel.to._meta.get_field(field.rel.field_name).to_python(
diff --git a/django/core/servers/basehttp.py b/django/core/servers/basehttp.py
index 64ed739473..411068b2f5 100644
--- a/django/core/servers/basehttp.py
+++ b/django/core/servers/basehttp.py
@@ -9,7 +9,13 @@ been reviewed for security issues. Don't use it for production use.
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
from types import ListType, StringType
-import os, re, sys, time, urllib, mimetypes
+from email.Utils import formatdate
+import mimetypes
+import os
+import re
+import sys
+import time
+import urllib
__version__ = "0.1"
__all__ = ['WSGIServer','WSGIRequestHandler','demo_app']
@@ -370,7 +376,7 @@ class ServerHandler(object):
self._write('HTTP/%s %s\r\n' % (self.http_version,self.status))
if 'Date' not in self.headers:
self._write(
- 'Date: %s\r\n' % time.asctime(time.gmtime(time.time()))
+ 'Date: %s\r\n' % (formatdate()[:26] + "GMT")
)
if self.server_software and 'Server' not in self.headers:
self._write('Server: %s\r\n' % self.server_software)
diff --git a/django/core/urlresolvers.py b/django/core/urlresolvers.py
index 000a56a726..c512c37b96 100644
--- a/django/core/urlresolvers.py
+++ b/django/core/urlresolvers.py
@@ -9,7 +9,7 @@ a string) and returns a tuple in this format:
from django.http import Http404
from django.core.exceptions import ImproperlyConfigured, ViewDoesNotExist
-from django.utils.encoding import iri_to_uri
+from django.utils.encoding import iri_to_uri, force_unicode, smart_str
from django.utils.functional import memoize
import re
@@ -38,29 +38,27 @@ def get_callable(lookup_view, can_fail=False):
If can_fail is True, lookup_view might be a URL pattern label, so errors
during the import fail and the string is returned.
"""
- try:
- # Bail out early if lookup_view is not ASCII. This can't be a function.
- lookup_view = lookup_view.encode('ascii')
-
- if not callable(lookup_view):
+ if not callable(lookup_view):
+ try:
+ # Bail early for non-ASCII strings (they can't be functions).
+ lookup_view = lookup_view.encode('ascii')
mod_name, func_name = get_mod_func(lookup_view)
- try:
- if func_name != '':
- lookup_view = getattr(__import__(mod_name, {}, {}, ['']), func_name)
- except (ImportError, AttributeError):
- if not can_fail:
- raise
- except UnicodeEncodeError:
- pass
+ if func_name != '':
+ lookup_view = getattr(__import__(mod_name, {}, {}, ['']), func_name)
+ except (ImportError, AttributeError):
+ if not can_fail:
+ raise
+ except UnicodeEncodeError:
+ pass
return lookup_view
-get_callable = memoize(get_callable, _callable_cache)
+get_callable = memoize(get_callable, _callable_cache, 1)
def get_resolver(urlconf):
if urlconf is None:
from django.conf import settings
urlconf = settings.ROOT_URLCONF
return RegexURLResolver(r'^/', urlconf)
-get_resolver = memoize(get_resolver, _resolver_cache)
+get_resolver = memoize(get_resolver, _resolver_cache, 1)
def get_mod_func(callback):
# Converts 'django.views.news.stories.story_detail' to
@@ -101,7 +99,7 @@ class MatchChecker(object):
# First we need to figure out whether it's a named or unnamed group.
#
grouped = match_obj.group(1)
- m = re.search(r'^\?P<(\w+)>(.*?)$', grouped)
+ m = re.search(r'^\?P<(\w+)>(.*?)$', grouped, re.UNICODE)
if m: # If this was a named group...
# m.group(1) is the name of the group
# m.group(2) is the regex.
@@ -127,9 +125,9 @@ class MatchChecker(object):
test_regex = grouped
# Note we're using re.match here on purpose because the start of
# to string needs to match.
- if not re.match(test_regex + '$', str(value)): # TODO: Unicode?
+ if not re.match(test_regex + '$', force_unicode(value), re.UNICODE):
raise NoReverseMatch("Value %r didn't match regular expression %r" % (value, test_regex))
- return str(value) # TODO: Unicode?
+ return force_unicode(value)
class RegexURLPattern(object):
def __init__(self, regex, callback, default_args=None, name=None):
@@ -137,7 +135,7 @@ class RegexURLPattern(object):
# callback is either a string like 'foo.views.news.stories.story_detail'
# which represents the path to a module and a view function name, or a
# callable object (view).
- self.regex = re.compile(regex)
+ self.regex = re.compile(regex, re.UNICODE)
if callable(callback):
self._callback = callback
else:
@@ -146,6 +144,9 @@ class RegexURLPattern(object):
self.default_args = default_args or {}
self.name = name
+ def __repr__(self):
+ return '<%s %s %s>' % (self.__class__.__name__, self.name, self.regex.pattern)
+
def add_prefix(self, prefix):
"""
Adds the prefix string to a string-based callback.
@@ -201,12 +202,15 @@ class RegexURLResolver(object):
def __init__(self, regex, urlconf_name, default_kwargs=None):
# regex is a string representing a regular expression.
# urlconf_name is a string representing the module containing urlconfs.
- self.regex = re.compile(regex)
+ self.regex = re.compile(regex, re.UNICODE)
self.urlconf_name = urlconf_name
self.callback = None
self.default_kwargs = default_kwargs or {}
self._reverse_dict = {}
+ def __repr__(self):
+ return '<%s %s %s>' % (self.__class__.__name__, self.urlconf_name, self.regex.pattern)
+
def _get_reverse_dict(self):
if not self._reverse_dict and hasattr(self.urlconf_module, 'urlpatterns'):
for pattern in reversed(self.urlconf_module.urlpatterns):
@@ -231,8 +235,11 @@ class RegexURLResolver(object):
tried.extend([(pattern.regex.pattern + ' ' + t) for t in e.args[0]['tried']])
else:
if sub_match:
- sub_match_dict = dict(self.default_kwargs, **sub_match[2])
- return sub_match[0], sub_match[1], dict(match.groupdict(), **sub_match_dict)
+ sub_match_dict = dict([(smart_str(k), v) for k, v in match.groupdict().items()])
+ sub_match_dict.update(self.default_kwargs)
+ for k, v in sub_match[2].iteritems():
+ sub_match_dict[smart_str(k)] = v
+ return sub_match[0], sub_match[1], sub_match_dict
tried.append(pattern.regex.pattern)
raise Resolver404, {'tried': tried, 'path': new_path}
diff --git a/django/core/validators.py b/django/core/validators.py
index 4e39157de8..fde4f052cb 100644
--- a/django/core/validators.py
+++ b/django/core/validators.py
@@ -14,6 +14,10 @@ from django.utils.translation import ugettext as _, ugettext_lazy, ungettext
from django.utils.functional import Promise, lazy
from django.utils.encoding import force_unicode
import re
+try:
+ from decimal import Decimal, DecimalException
+except ImportError:
+ from django.utils._decimal import Decimal, DecimalException # Python 2.3
_datere = r'\d{4}-\d{1,2}-\d{1,2}'
_timere = r'(?:[01]?[0-9]|2[0-3]):[0-5][0-9](?::[0-5][0-9])?'
@@ -24,9 +28,8 @@ ansi_time_re = re.compile('^%s$' % _timere)
ansi_datetime_re = re.compile('^%s %s$' % (_datere, _timere))
email_re = re.compile(
r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*" # dot-atom
- r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-011\013\014\016-\177])*"' # quoted-string
+ r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"' # quoted-string
r')@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}$', re.IGNORECASE) # domain
-decimal_re = re.compile(r'^-?(?P<digits>\d+)(\.(?P<decimals>\d+))?$')
integer_re = re.compile(r'^-?\d+$')
ip4_re = re.compile(r'^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$')
phone_re = re.compile(r'^[A-PR-Y0-9]{3}-[A-PR-Y0-9]{3}-[A-PR-Y0-9]{4}$', re.IGNORECASE)
@@ -415,13 +418,15 @@ class IsValidDecimal(object):
self.max_digits, self.decimal_places = max_digits, decimal_places
def __call__(self, field_data, all_data):
- match = decimal_re.search(str(field_data))
- if not match:
+ try:
+ val = Decimal(field_data)
+ except DecimalException:
raise ValidationError, _("Please enter a valid decimal number.")
-
- digits = len(match.group('digits') or '')
- decimals = len(match.group('decimals') or '')
-
+
+ pieces = str(val).split('.')
+ decimals = (len(pieces) == 2) and len(pieces[1]) or 0
+ digits = len(pieces[0])
+
if digits + decimals > self.max_digits:
raise ValidationError, ungettext("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
@@ -437,7 +442,7 @@ def isValidFloat(field_data, all_data):
try:
float(data)
except ValueError:
- raise ValidationError, ugettext("Please enter a valid floating point number.")
+ raise ValidationError, _("Please enter a valid floating point number.")
class HasAllowableSize(object):
"""
diff --git a/django/db/backends/ado_mssql/creation.py b/django/db/backends/ado_mssql/creation.py
index a1098ea43e..1411ca4d6a 100644
--- a/django/db/backends/ado_mssql/creation.py
+++ b/django/db/backends/ado_mssql/creation.py
@@ -1,8 +1,8 @@
DATA_TYPES = {
'AutoField': 'int IDENTITY (1, 1)',
'BooleanField': 'bit',
- 'CharField': 'varchar(%(maxlength)s)',
- 'CommaSeparatedIntegerField': 'varchar(%(maxlength)s)',
+ 'CharField': 'varchar(%(max_length)s)',
+ 'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
'DateField': 'smalldatetime',
'DateTimeField': 'smalldatetime',
'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
@@ -12,13 +12,12 @@ DATA_TYPES = {
'ImageField': 'varchar(100)',
'IntegerField': 'int',
'IPAddressField': 'char(15)',
- 'ManyToManyField': None,
'NullBooleanField': 'bit',
'OneToOneField': 'int',
'PhoneNumberField': 'varchar(20)',
'PositiveIntegerField': 'int CONSTRAINT [CK_int_pos_%(column)s] CHECK ([%(column)s] > 0)',
'PositiveSmallIntegerField': 'smallint CONSTRAINT [CK_smallint_pos_%(column)s] CHECK ([%(column)s] > 0)',
- 'SlugField': 'varchar(%(maxlength)s)',
+ 'SlugField': 'varchar(%(max_length)s)',
'SmallIntegerField': 'smallint',
'TextField': 'text',
'TimeField': 'time',
diff --git a/django/db/backends/mysql/creation.py b/django/db/backends/mysql/creation.py
index 1b23fbff6e..b2b3992651 100644
--- a/django/db/backends/mysql/creation.py
+++ b/django/db/backends/mysql/creation.py
@@ -5,8 +5,8 @@
DATA_TYPES = {
'AutoField': 'integer AUTO_INCREMENT',
'BooleanField': 'bool',
- 'CharField': 'varchar(%(maxlength)s)',
- 'CommaSeparatedIntegerField': 'varchar(%(maxlength)s)',
+ 'CharField': 'varchar(%(max_length)s)',
+ 'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
'DateField': 'date',
'DateTimeField': 'datetime',
'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
@@ -16,13 +16,12 @@ DATA_TYPES = {
'ImageField': 'varchar(100)',
'IntegerField': 'integer',
'IPAddressField': 'char(15)',
- 'ManyToManyField': None,
'NullBooleanField': 'bool',
'OneToOneField': 'integer',
'PhoneNumberField': 'varchar(20)',
'PositiveIntegerField': 'integer UNSIGNED',
'PositiveSmallIntegerField': 'smallint UNSIGNED',
- 'SlugField': 'varchar(%(maxlength)s)',
+ 'SlugField': 'varchar(%(max_length)s)',
'SmallIntegerField': 'smallint',
'TextField': 'longtext',
'TimeField': 'time',
diff --git a/django/db/backends/mysql_old/creation.py b/django/db/backends/mysql_old/creation.py
index 1b23fbff6e..b2b3992651 100644
--- a/django/db/backends/mysql_old/creation.py
+++ b/django/db/backends/mysql_old/creation.py
@@ -5,8 +5,8 @@
DATA_TYPES = {
'AutoField': 'integer AUTO_INCREMENT',
'BooleanField': 'bool',
- 'CharField': 'varchar(%(maxlength)s)',
- 'CommaSeparatedIntegerField': 'varchar(%(maxlength)s)',
+ 'CharField': 'varchar(%(max_length)s)',
+ 'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
'DateField': 'date',
'DateTimeField': 'datetime',
'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
@@ -16,13 +16,12 @@ DATA_TYPES = {
'ImageField': 'varchar(100)',
'IntegerField': 'integer',
'IPAddressField': 'char(15)',
- 'ManyToManyField': None,
'NullBooleanField': 'bool',
'OneToOneField': 'integer',
'PhoneNumberField': 'varchar(20)',
'PositiveIntegerField': 'integer UNSIGNED',
'PositiveSmallIntegerField': 'smallint UNSIGNED',
- 'SlugField': 'varchar(%(maxlength)s)',
+ 'SlugField': 'varchar(%(max_length)s)',
'SmallIntegerField': 'smallint',
'TextField': 'longtext',
'TimeField': 'time',
diff --git a/django/db/backends/oracle/creation.py b/django/db/backends/oracle/creation.py
index f7903bce4f..af498fa9ff 100644
--- a/django/db/backends/oracle/creation.py
+++ b/django/db/backends/oracle/creation.py
@@ -8,8 +8,8 @@ from django.core import management
DATA_TYPES = {
'AutoField': 'NUMBER(11)',
'BooleanField': 'NUMBER(1) CHECK (%(column)s IN (0,1))',
- 'CharField': 'NVARCHAR2(%(maxlength)s)',
- 'CommaSeparatedIntegerField': 'VARCHAR2(%(maxlength)s)',
+ 'CharField': 'NVARCHAR2(%(max_length)s)',
+ 'CommaSeparatedIntegerField': 'VARCHAR2(%(max_length)s)',
'DateField': 'DATE',
'DateTimeField': 'TIMESTAMP',
'DecimalField': 'NUMBER(%(max_digits)s, %(decimal_places)s)',
@@ -19,7 +19,6 @@ DATA_TYPES = {
'ImageField': 'NVARCHAR2(100)',
'IntegerField': 'NUMBER(11)',
'IPAddressField': 'VARCHAR2(15)',
- 'ManyToManyField': None,
'NullBooleanField': 'NUMBER(1) CHECK ((%(column)s IN (0,1)) OR (%(column)s IS NULL))',
'OneToOneField': 'NUMBER(11)',
'PhoneNumberField': 'VARCHAR2(20)',
diff --git a/django/db/backends/postgresql/creation.py b/django/db/backends/postgresql/creation.py
index 4646b68ab8..ceffea19e6 100644
--- a/django/db/backends/postgresql/creation.py
+++ b/django/db/backends/postgresql/creation.py
@@ -5,8 +5,8 @@
DATA_TYPES = {
'AutoField': 'serial',
'BooleanField': 'boolean',
- 'CharField': 'varchar(%(maxlength)s)',
- 'CommaSeparatedIntegerField': 'varchar(%(maxlength)s)',
+ 'CharField': 'varchar(%(max_length)s)',
+ 'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
'DateField': 'date',
'DateTimeField': 'timestamp with time zone',
'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
@@ -16,13 +16,12 @@ DATA_TYPES = {
'ImageField': 'varchar(100)',
'IntegerField': 'integer',
'IPAddressField': 'inet',
- 'ManyToManyField': None,
'NullBooleanField': 'boolean',
'OneToOneField': 'integer',
'PhoneNumberField': 'varchar(20)',
'PositiveIntegerField': 'integer CHECK ("%(column)s" >= 0)',
'PositiveSmallIntegerField': 'smallint CHECK ("%(column)s" >= 0)',
- 'SlugField': 'varchar(%(maxlength)s)',
+ 'SlugField': 'varchar(%(max_length)s)',
'SmallIntegerField': 'smallint',
'TextField': 'text',
'TimeField': 'time',
diff --git a/django/db/backends/postgresql_psycopg2/introspection.py b/django/db/backends/postgresql_psycopg2/introspection.py
index aa45fe7db7..a953368991 100644
--- a/django/db/backends/postgresql_psycopg2/introspection.py
+++ b/django/db/backends/postgresql_psycopg2/introspection.py
@@ -30,11 +30,8 @@ def get_relations(cursor, table_name):
AND con.contype = 'f'""", [table_name])
relations = {}
for row in cursor.fetchall():
- try:
- # row[0] and row[1] are like "{2}", so strip the curly braces.
- relations[int(row[0][1:-1]) - 1] = (int(row[1][1:-1]) - 1, row[2])
- except ValueError:
- continue
+ # row[0] and row[1] are single-item lists, so grab the single item.
+ relations[row[0][0] - 1] = (row[1][0] - 1, row[2])
return relations
def get_indexes(cursor, table_name):
diff --git a/django/db/backends/sqlite3/creation.py b/django/db/backends/sqlite3/creation.py
index e63046ab7d..eccb19a160 100644
--- a/django/db/backends/sqlite3/creation.py
+++ b/django/db/backends/sqlite3/creation.py
@@ -4,8 +4,8 @@
DATA_TYPES = {
'AutoField': 'integer',
'BooleanField': 'bool',
- 'CharField': 'varchar(%(maxlength)s)',
- 'CommaSeparatedIntegerField': 'varchar(%(maxlength)s)',
+ 'CharField': 'varchar(%(max_length)s)',
+ 'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
'DateField': 'date',
'DateTimeField': 'datetime',
'DecimalField': 'decimal',
@@ -15,13 +15,12 @@ DATA_TYPES = {
'ImageField': 'varchar(100)',
'IntegerField': 'integer',
'IPAddressField': 'char(15)',
- 'ManyToManyField': None,
'NullBooleanField': 'bool',
'OneToOneField': 'integer',
'PhoneNumberField': 'varchar(20)',
'PositiveIntegerField': 'integer unsigned',
'PositiveSmallIntegerField': 'smallint unsigned',
- 'SlugField': 'varchar(%(maxlength)s)',
+ 'SlugField': 'varchar(%(max_length)s)',
'SmallIntegerField': 'smallint',
'TextField': 'text',
'TimeField': 'time',
diff --git a/django/db/backends/sqlite3/introspection.py b/django/db/backends/sqlite3/introspection.py
index 4e22c5ea42..cb2fbb8ee0 100644
--- a/django/db/backends/sqlite3/introspection.py
+++ b/django/db/backends/sqlite3/introspection.py
@@ -81,7 +81,7 @@ class FlexibleFieldLookupDict:
import re
m = re.search(r'^\s*(?:var)?char\s*\(\s*(\d+)\s*\)\s*$', key)
if m:
- return ('CharField', {'maxlength': int(m.group(1))})
+ return ('CharField', {'max_length': int(m.group(1))})
raise KeyError
DATA_TYPES_REVERSE = FlexibleFieldLookupDict()
diff --git a/django/db/models/__init__.py b/django/db/models/__init__.py
index 887ddc1e47..fb93d36b0f 100644
--- a/django/db/models/__init__.py
+++ b/django/db/models/__init__.py
@@ -15,14 +15,18 @@ from django.utils.text import capfirst
# Admin stages.
ADD, CHANGE, BOTH = 1, 2, 3
-# Decorator. Takes a function that returns a tuple in this format:
-# (viewname, viewargs, viewkwargs)
-# Returns a function that calls urlresolvers.reverse() on that data, to return
-# the URL for those parameters.
def permalink(func):
+ """
+ Decorator that calls urlresolvers.reverse() to return a URL using
+ parameters returned by the decorated function "func".
+
+ "func" should be a function that returns a tuple in one of the
+ following formats:
+ (viewname, viewargs)
+ (viewname, viewargs, viewkwargs)
+ """
from django.core.urlresolvers import reverse
def inner(*args, **kwargs):
bits = func(*args, **kwargs)
- viewname = bits[0]
return reverse(bits[0], None, *bits[1:3])
return inner
diff --git a/django/db/models/base.py b/django/db/models/base.py
index b66fb67616..528bf7fb06 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -206,7 +206,7 @@ class Model(object):
_prepare = classmethod(_prepare)
- def save(self):
+ def save(self, raw=False):
dispatcher.send(signal=signals.pre_save, sender=self.__class__, instance=self)
non_pks = [f for f in self._meta.fields if not f.primary_key]
@@ -223,7 +223,7 @@ class Model(object):
self._meta.pk.get_db_prep_lookup('exact', pk_val))
# If it does already exist, do an UPDATE.
if cursor.fetchone()[0] > 0:
- db_values = [f.get_db_prep_save(f.pre_save(self, False)) for f in non_pks]
+ db_values = [f.get_db_prep_save(raw and getattr(self, f.attname) or f.pre_save(self, False)) for f in non_pks]
if db_values:
cursor.execute("UPDATE %s SET %s WHERE %s=%%s" % \
(backend.quote_name(self._meta.db_table),
@@ -234,11 +234,11 @@ class Model(object):
record_exists = False
if not pk_set or not record_exists:
field_names = [backend.quote_name(f.column) for f in self._meta.fields if not isinstance(f, AutoField)]
- db_values = [f.get_db_prep_save(f.pre_save(self, True)) for f in self._meta.fields if not isinstance(f, AutoField)]
+ db_values = [f.get_db_prep_save(raw and getattr(self, f.attname) or f.pre_save(self, True)) for f in self._meta.fields if not isinstance(f, AutoField)]
# If the PK has been manually set, respect that.
if pk_set:
field_names += [f.column for f in self._meta.fields if isinstance(f, AutoField)]
- db_values += [f.get_db_prep_save(f.pre_save(self, True)) for f in self._meta.fields if isinstance(f, AutoField)]
+ db_values += [f.get_db_prep_save(raw and getattr(self, f.attname) or f.pre_save(self, True)) for f in self._meta.fields if isinstance(f, AutoField)]
placeholders = ['%s'] * len(field_names)
if self._meta.order_with_respect_to:
field_names.append(backend.quote_name('_order'))
diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
index 681afad396..25ad4ca53e 100644
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -1,3 +1,4 @@
+from django.db import get_creation_module
from django.db.models import signals
from django.dispatch import dispatcher
from django.conf import settings
@@ -10,6 +11,7 @@ from django.utils.itercompat import tee
from django.utils.text import capfirst
from django.utils.translation import ugettext_lazy, ugettext as _
from django.utils.encoding import smart_unicode, force_unicode, smart_str
+from django.utils.maxlength import LegacyMaxlength
import datetime, os, time
try:
import decimal
@@ -61,6 +63,9 @@ def manipulator_validator_unique(f, opts, self, field_data, all_data):
# getattr(obj, opts.pk.attname)
class Field(object):
+ # Provide backwards compatibility for the maxlength attribute and
+ # argument for this class and all subclasses.
+ __metaclass__ = LegacyMaxlength
# Designates whether empty strings fundamentally are allowed at the
# database level.
@@ -70,7 +75,7 @@ class Field(object):
creation_counter = 0
def __init__(self, verbose_name=None, name=None, primary_key=False,
- maxlength=None, unique=False, blank=False, null=False, db_index=False,
+ max_length=None, unique=False, blank=False, null=False, db_index=False,
core=False, rel=None, default=NOT_PROVIDED, editable=True, serialize=True,
unique_for_date=None, unique_for_month=None, unique_for_year=None,
validator_list=None, choices=None, radio_admin=None, help_text='', db_column=None,
@@ -78,7 +83,7 @@ class Field(object):
self.name = name
self.verbose_name = verbose_name
self.primary_key = primary_key
- self.maxlength, self.unique = maxlength, unique
+ self.max_length, self.unique = max_length, unique
self.blank, self.null = blank, null
# Oracle treats the empty string ('') as null, so coerce the null
# option whenever '' is a possible value.
@@ -115,6 +120,30 @@ class Field(object):
"""
return value
+ def db_type(self):
+ """
+ Returns the database column data type for this field, taking into
+ account the DATABASE_ENGINE setting.
+ """
+ # The default implementation of this method looks at the
+ # backend-specific DATA_TYPES dictionary, looking up the field by its
+ # "internal type".
+ #
+ # A Field class can implement the get_internal_type() method to specify
+ # which *preexisting* Django Field class it's most similar to -- i.e.,
+ # an XMLField is represented by a TEXT column type, which is the same
+ # as the TextField Django field type, which means XMLField's
+ # get_internal_type() returns 'TextField'.
+ #
+ # But the limitation of the get_internal_type() / DATA_TYPES approach
+ # is that it cannot handle database column types that aren't already
+ # mapped to one of the built-in Django field types. In this case, you
+ # can implement db_type() instead of get_internal_type() to specify
+ # exactly which wacky database column type you want to use.
+ data_types = get_creation_module().DATA_TYPES
+ internal_type = self.get_internal_type()
+ return data_types[internal_type] % self.__dict__
+
def validate_full(self, field_data, all_data):
"""
Returns a list of errors for this field. This is the main interface,
@@ -217,8 +246,8 @@ class Field(object):
def prepare_field_objs_and_params(self, manipulator, name_prefix):
params = {'validator_list': self.validator_list[:]}
- if self.maxlength and not self.choices: # Don't give SelectFields a maxlength parameter.
- params['maxlength'] = self.maxlength
+ if self.max_length and not self.choices: # Don't give SelectFields a max_length parameter.
+ params['max_length'] = self.max_length
if self.choices:
if self.radio_admin:
@@ -349,6 +378,9 @@ class Field(object):
return self._choices
choices = property(_get_choices)
+ def save_form_data(self, instance, data):
+ setattr(instance, self.name, data)
+
def formfield(self, form_class=forms.CharField, **kwargs):
"Returns a django.newforms.Field instance for this database Field."
defaults = {'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text}
@@ -434,7 +466,7 @@ class CharField(Field):
return smart_unicode(value)
def formfield(self, **kwargs):
- defaults = {'max_length': self.maxlength}
+ defaults = {'max_length': self.max_length}
defaults.update(kwargs)
return super(CharField, self).formfield(**defaults)
@@ -593,7 +625,8 @@ class DecimalField(Field):
try:
return decimal.Decimal(value)
except decimal.InvalidOperation:
- raise validators.ValidationError, ugettext("This value must be a decimal number.")
+ raise validators.ValidationError(
+ _("This value must be a decimal number."))
def _format(self, value):
if isinstance(value, basestring):
@@ -642,7 +675,7 @@ class DecimalField(Field):
class EmailField(CharField):
def __init__(self, *args, **kwargs):
- kwargs['maxlength'] = 75
+ kwargs['max_length'] = 75
CharField.__init__(self, *args, **kwargs)
def get_internal_type(self):
@@ -664,6 +697,13 @@ class FileField(Field):
self.upload_to = upload_to
Field.__init__(self, verbose_name, name, **kwargs)
+ def get_db_prep_save(self, value):
+ "Returns field's value prepared for saving into a database."
+ # Need to convert UploadedFile objects provided via a form to unicode for database insertion
+ if value is None:
+ return None
+ return unicode(value)
+
def get_manipulator_fields(self, opts, manipulator, change, name_prefix='', rel=False, follow=True):
field_list = Field.get_manipulator_fields(self, opts, manipulator, change, name_prefix, rel, follow)
if not self.blank:
@@ -740,6 +780,19 @@ class FileField(Field):
f = os.path.join(self.get_directory_name(), get_valid_filename(os.path.basename(filename)))
return os.path.normpath(f)
+ def save_form_data(self, instance, data):
+ if data:
+ getattr(instance, "save_%s_file" % self.name)(data.filename, data.content, save=False)
+
+ def formfield(self, **kwargs):
+ defaults = {'form_class': forms.FileField}
+ # If a file has been provided previously, then the form doesn't require
+ # that a new file is provided this time.
+ if 'initial' in kwargs:
+ defaults['required'] = False
+ defaults.update(kwargs)
+ return super(FileField, self).formfield(**defaults)
+
class FilePathField(Field):
def __init__(self, verbose_name=None, name=None, path='', match=None, recursive=False, **kwargs):
self.path, self.match, self.recursive = path, match, recursive
@@ -788,6 +841,10 @@ class ImageField(FileField):
setattr(new_object, self.height_field, getattr(original_object, self.height_field))
new_object.save()
+ def formfield(self, **kwargs):
+ defaults = {'form_class': forms.ImageField}
+ return super(ImageField, self).formfield(**defaults)
+
class IntegerField(Field):
empty_strings_allowed = False
def get_manipulator_field_objs(self):
@@ -801,7 +858,7 @@ class IntegerField(Field):
class IPAddressField(Field):
empty_strings_allowed = False
def __init__(self, *args, **kwargs):
- kwargs['maxlength'] = 15
+ kwargs['max_length'] = 15
Field.__init__(self, *args, **kwargs)
def get_manipulator_field_objs(self):
@@ -854,7 +911,7 @@ class PositiveSmallIntegerField(IntegerField):
class SlugField(Field):
def __init__(self, *args, **kwargs):
- kwargs['maxlength'] = kwargs.get('maxlength', 50)
+ kwargs['max_length'] = kwargs.get('max_length', 50)
kwargs.setdefault('validator_list', []).append(validators.isSlug)
# Set db_index=True unless it's been set manually.
if 'db_index' not in kwargs:
@@ -940,7 +997,7 @@ class TimeField(Field):
class URLField(CharField):
def __init__(self, verbose_name=None, name=None, verify_exists=True, **kwargs):
- kwargs['maxlength'] = kwargs.get('maxlength', 200)
+ kwargs['max_length'] = kwargs.get('max_length', 200)
if verify_exists:
kwargs.setdefault('validator_list', []).append(validators.isExistingURL)
self.verify_exists = verify_exists
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index 3c3f7a181b..4024e87f2f 100644
--- a/django/db/models/fields/related.py
+++ b/django/db/models/fields/related.py
@@ -1,6 +1,6 @@
from django.db import backend, transaction
from django.db.models import signals, get_model
-from django.db.models.fields import AutoField, Field, IntegerField, get_ul_class
+from django.db.models.fields import AutoField, Field, IntegerField, PositiveIntegerField, PositiveSmallIntegerField, get_ul_class
from django.db.models.related import RelatedObject
from django.utils.text import capfirst
from django.utils.translation import ugettext_lazy, string_concat, ungettext, ugettext as _
@@ -548,6 +548,16 @@ class ForeignKey(RelatedField, Field):
defaults.update(kwargs)
return super(ForeignKey, self).formfield(**defaults)
+ def db_type(self):
+ # The database column type of a ForeignKey is the column type
+ # of the field to which it points. An exception is if the ForeignKey
+ # points to an AutoField/PositiveIntegerField/PositiveSmallIntegerField,
+ # in which case the column type is simply that of an IntegerField.
+ rel_field = self.rel.get_related_field()
+ if isinstance(rel_field, (AutoField, PositiveIntegerField, PositiveSmallIntegerField)):
+ return IntegerField().db_type()
+ return rel_field.db_type()
+
class OneToOneField(RelatedField, IntegerField):
def __init__(self, to, to_field=None, **kwargs):
try:
@@ -609,6 +619,16 @@ class OneToOneField(RelatedField, IntegerField):
defaults.update(kwargs)
return super(OneToOneField, self).formfield(**defaults)
+ def db_type(self):
+ # The database column type of a OneToOneField is the column type
+ # of the field to which it points. An exception is if the OneToOneField
+ # points to an AutoField/PositiveIntegerField/PositiveSmallIntegerField,
+ # in which case the column type is simply that of an IntegerField.
+ rel_field = self.rel.get_related_field()
+ if isinstance(rel_field, (AutoField, PositiveIntegerField, PositiveSmallIntegerField)):
+ return IntegerField().db_type()
+ return rel_field.db_type()
+
class ManyToManyField(RelatedField, Field):
def __init__(self, to, **kwargs):
kwargs['verbose_name'] = kwargs.get('verbose_name', None)
@@ -710,6 +730,9 @@ class ManyToManyField(RelatedField, Field):
"Returns the value of this field in the given model instance."
return getattr(obj, self.attname).all()
+ def save_form_data(self, instance, data):
+ setattr(instance, self.attname, data)
+
def formfield(self, **kwargs):
defaults = {'form_class': forms.ModelMultipleChoiceField, 'queryset': self.rel.to._default_manager.all()}
defaults.update(kwargs)
@@ -719,6 +742,11 @@ class ManyToManyField(RelatedField, Field):
defaults['initial'] = [i._get_pk_val() for i in defaults['initial']]
return super(ManyToManyField, self).formfield(**defaults)
+ def db_type(self):
+ # A ManyToManyField is not represented by a single column,
+ # so return None.
+ return None
+
class ManyToOneRel(object):
def __init__(self, to, field_name, num_in_admin=3, min_num_in_admin=None,
max_num_in_admin=None, num_extra_on_change=1, edit_inline=False,
diff --git a/django/db/models/manager.py b/django/db/models/manager.py
index b60eed262a..040b86656a 100644
--- a/django/db/models/manager.py
+++ b/django/db/models/manager.py
@@ -3,10 +3,6 @@ from django.dispatch import dispatcher
from django.db.models import signals
from django.db.models.fields import FieldDoesNotExist
-# Size of each "chunk" for get_iterator calls.
-# Larger values are slightly faster at the expense of more storage space.
-GET_ITERATOR_CHUNK_SIZE = 100
-
def ensure_default_manager(sender):
cls = sender
if not hasattr(cls, '_default_manager'):
@@ -47,7 +43,7 @@ class Manager(object):
def get_query_set(self):
"""Returns a new QuerySet object. Subclasses can override this method
- to easily customise the behaviour of the Manager.
+ to easily customize the behavior of the Manager.
"""
return QuerySet(self.model)
diff --git a/django/db/models/query.py b/django/db/models/query.py
index 5771f3d7d9..f5213ba903 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -579,28 +579,36 @@ class ValuesQuerySet(QuerySet):
except EmptyResultSet:
raise StopIteration
- # self._fields is a list of field names to fetch.
+ # self._select is a dictionary, and dictionaries' key order is
+ # undefined, so we convert it to a list of tuples.
+ extra_select = self._select.items()
+
+ # Construct two objects -- fields and field_names.
+ # fields is a list of Field objects to fetch.
+ # field_names is a list of field names, which will be the keys in the
+ # resulting dictionaries.
if self._fields:
- if not self._select:
+ if not extra_select:
fields = [self.model._meta.get_field(f, many_to_many=False) for f in self._fields]
+ field_names = self._fields
else:
fields = []
+ field_names = []
for f in self._fields:
if f in [field.name for field in self.model._meta.fields]:
fields.append(self.model._meta.get_field(f, many_to_many=False))
- elif not self._select.has_key( f ):
- raise FieldDoesNotExist, '%s has no field named %r' % ( self.model._meta.object_name, f )
-
- field_names = self._fields
+ field_names.append(f)
+ elif not self._select.has_key(f):
+ raise FieldDoesNotExist('%s has no field named %r' % (self.model._meta.object_name, f))
else: # Default to all fields.
fields = self.model._meta.fields
field_names = [f.attname for f in fields]
columns = [f.column for f in fields]
select = ['%s.%s' % (backend.quote_name(self.model._meta.db_table), backend.quote_name(c)) for c in columns]
- # Add any additional SELECTs.
- if self._select:
- select.extend(['(%s) AS %s' % (quote_only_if_word(s[1]), backend.quote_name(s[0])) for s in self._select.items()])
+ if extra_select:
+ select.extend(['(%s) AS %s' % (quote_only_if_word(s[1]), backend.quote_name(s[0])) for s in extra_select])
+ field_names.extend([f[0] for f in extra_select])
cursor = connection.cursor()
cursor.execute("SELECT " + (self._distinct and "DISTINCT " or "") + ",".join(select) + sql, params)
diff --git a/django/http/__init__.py b/django/http/__init__.py
index 7061644a4e..bcb06cbb87 100644
--- a/django/http/__init__.py
+++ b/django/http/__init__.py
@@ -109,12 +109,11 @@ class QueryDict(MultiValueDict):
# *Important*: do not import settings any earlier because of note
# in core.handlers.modpython.
from django.conf import settings
- self.encoding = settings.DEFAULT_CHARSET
- else:
- self.encoding = encoding
+ encoding = settings.DEFAULT_CHARSET
+ self.encoding = encoding
self._mutable = True
for key, value in parse_qsl((query_string or ''), True): # keep_blank_values=True
- self.appendlist(force_unicode(key, errors='replace'), force_unicode(value, errors='replace'))
+ self.appendlist(force_unicode(key, encoding, errors='replace'), force_unicode(value, encoding, errors='replace'))
self._mutable = mutable
def _assert_mutable(self):
diff --git a/django/middleware/common.py b/django/middleware/common.py
index 9610e1e952..d238bb182d 100644
--- a/django/middleware/common.py
+++ b/django/middleware/common.py
@@ -39,7 +39,7 @@ class CommonMiddleware(object):
new_url[0] = 'www.' + old_url[0]
# Append a slash if append_slash is set and the URL doesn't have a
# trailing slash or a file extension.
- if settings.APPEND_SLASH and (old_url[1][-1] != '/') and ('.' not in old_url[1].split('/')[-1]):
+ if settings.APPEND_SLASH and (not old_url[1].endswith('/')) and ('.' not in old_url[1].split('/')[-1]):
new_url[1] = new_url[1] + '/'
if settings.DEBUG and request.method == 'POST':
raise RuntimeError, "You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data. Change your form to point to %s%s (note the trailing slash), or set APPEND_SLASH=False in your Django settings." % (new_url[0], new_url[1])
diff --git a/django/middleware/http.py b/django/middleware/http.py
index 3ebd8ffd1a..8db3e4a524 100644
--- a/django/middleware/http.py
+++ b/django/middleware/http.py
@@ -1,4 +1,4 @@
-import datetime
+from email.Utils import formatdate
class ConditionalGetMiddleware(object):
"""
@@ -11,8 +11,7 @@ class ConditionalGetMiddleware(object):
Also sets the Date and Content-Length response-headers.
"""
def process_response(self, request, response):
- now = datetime.datetime.utcnow()
- response['Date'] = now.strftime('%a, %d %b %Y %H:%M:%S GMT')
+ response['Date'] = formatdate()[:26] + "GMT"
if not response.has_header('Content-Length'):
response['Content-Length'] = str(len(response.content))
diff --git a/django/newforms/extras/widgets.py b/django/newforms/extras/widgets.py
index 724dcd9b50..96b1c7244d 100644
--- a/django/newforms/extras/widgets.py
+++ b/django/newforms/extras/widgets.py
@@ -53,7 +53,7 @@ class SelectDateWidget(Widget):
return u'\n'.join(output)
- def value_from_datadict(self, data, name):
+ def value_from_datadict(self, data, files, name):
y, m, d = data.get(self.year_field % name), data.get(self.month_field % name), data.get(self.day_field % name)
if y and m and d:
return '%s-%s-%s' % (y, m, d)
diff --git a/django/newforms/fields.py b/django/newforms/fields.py
index b6abea6400..e9f50ad4ec 100644
--- a/django/newforms/fields.py
+++ b/django/newforms/fields.py
@@ -7,17 +7,22 @@ import re
import time
from django.utils.translation import ugettext
-from django.utils.encoding import smart_unicode
+from django.utils.encoding import StrAndUnicode, smart_unicode
from util import ErrorList, ValidationError
-from widgets import TextInput, PasswordInput, HiddenInput, MultipleHiddenInput, CheckboxInput, Select, NullBooleanSelect, SelectMultiple
+from widgets import TextInput, PasswordInput, HiddenInput, MultipleHiddenInput, FileInput, CheckboxInput, Select, NullBooleanSelect, SelectMultiple
+
+try:
+ from decimal import Decimal, DecimalException
+except ImportError:
+ from django.utils._decimal import Decimal, DecimalException
__all__ = (
'Field', 'CharField', 'IntegerField',
'DEFAULT_DATE_INPUT_FORMATS', 'DateField',
'DEFAULT_TIME_INPUT_FORMATS', 'TimeField',
'DEFAULT_DATETIME_INPUT_FORMATS', 'DateTimeField',
- 'RegexField', 'EmailField', 'URLField', 'BooleanField',
+ 'RegexField', 'EmailField', 'FileField', 'ImageField', 'URLField', 'BooleanField',
'ChoiceField', 'NullBooleanField', 'MultipleChoiceField',
'ComboField', 'MultiValueField', 'FloatField', 'DecimalField',
'SplitDateTimeField',
@@ -106,14 +111,16 @@ class CharField(Field):
if value in EMPTY_VALUES:
return u''
value = smart_unicode(value)
- if self.max_length is not None and len(value) > self.max_length:
- raise ValidationError(ugettext(u'Ensure this value has at most %d characters.') % self.max_length)
- if self.min_length is not None and len(value) < self.min_length:
- raise ValidationError(ugettext(u'Ensure this value has at least %d characters.') % self.min_length)
+ value_length = len(value)
+ if self.max_length is not None and value_length > self.max_length:
+ raise ValidationError(ugettext(u'Ensure this value has at most %(max)d characters (it has %(length)d).') % {'max': self.max_length, 'length': value_length})
+ if self.min_length is not None and value_length < self.min_length:
+ raise ValidationError(ugettext(u'Ensure this value has at least %(min)d characters (it has %(length)d).') % {'min': self.min_length, 'length': value_length})
return value
def widget_attrs(self, widget):
if self.max_length is not None and isinstance(widget, (TextInput, PasswordInput)):
+ # The HTML attribute is maxlength, not max_length.
return {'maxlength': str(self.max_length)}
class IntegerField(Field):
@@ -162,8 +169,6 @@ class FloatField(Field):
raise ValidationError(ugettext('Ensure this value is greater than or equal to %s.') % self.min_value)
return value
-decimal_re = re.compile(r'^-?(?P<digits>\d+)(\.(?P<decimals>\d+))?$')
-
class DecimalField(Field):
def __init__(self, max_value=None, min_value=None, max_digits=None, decimal_places=None, *args, **kwargs):
self.max_value, self.min_value = max_value, min_value
@@ -181,13 +186,13 @@ class DecimalField(Field):
if not self.required and value in EMPTY_VALUES:
return None
value = value.strip()
- match = decimal_re.search(value)
- if not match:
- raise ValidationError(ugettext('Enter a number.'))
- else:
+ try:
value = Decimal(value)
- digits = len(match.group('digits') or '')
- decimals = len(match.group('decimals') or '')
+ except DecimalException:
+ raise ValidationError(ugettext('Enter a number.'))
+ pieces = str(value).split('.')
+ decimals = (len(pieces) == 2) and len(pieces[1]) or 0
+ digits = len(pieces[0])
if self.max_value is not None and value > self.max_value:
raise ValidationError(ugettext('Ensure this value is less than or equal to %s.') % self.max_value)
if self.min_value is not None and value < self.min_value:
@@ -295,18 +300,17 @@ class DateTimeField(Field):
continue
raise ValidationError(ugettext(u'Enter a valid date/time.'))
-class RegexField(Field):
+class RegexField(CharField):
def __init__(self, regex, max_length=None, min_length=None, error_message=None, *args, **kwargs):
"""
regex can be either a string or a compiled regular expression object.
error_message is an optional error message to use, if
'Enter a valid value' is too generic for you.
"""
- super(RegexField, self).__init__(*args, **kwargs)
+ super(RegexField, self).__init__(max_length, min_length, *args, **kwargs)
if isinstance(regex, basestring):
regex = re.compile(regex)
self.regex = regex
- self.max_length, self.min_length = max_length, min_length
self.error_message = error_message or ugettext(u'Enter a valid value.')
def clean(self, value):
@@ -314,16 +318,9 @@ class RegexField(Field):
Validates that the input matches the regular expression. Returns a
Unicode object.
"""
- super(RegexField, self).clean(value)
- if value in EMPTY_VALUES:
- value = u''
- value = smart_unicode(value)
+ value = super(RegexField, self).clean(value)
if value == u'':
return value
- if self.max_length is not None and len(value) > self.max_length:
- raise ValidationError(ugettext(u'Ensure this value has at most %d characters.') % self.max_length)
- if self.min_length is not None and len(value) < self.min_length:
- raise ValidationError(ugettext(u'Ensure this value has at least %d characters.') % self.min_length)
if not self.regex.search(value):
raise ValidationError(self.error_message)
return value
@@ -351,6 +348,55 @@ except ImportError:
# It's OK if Django settings aren't configured.
URL_VALIDATOR_USER_AGENT = 'Django (http://www.djangoproject.com/)'
+class UploadedFile(StrAndUnicode):
+ "A wrapper for files uploaded in a FileField"
+ def __init__(self, filename, content):
+ self.filename = filename
+ self.content = content
+
+ def __unicode__(self):
+ """
+ The unicode representation is the filename, so that the pre-database-insertion
+ logic can use UploadedFile objects
+ """
+ return self.filename
+
+class FileField(Field):
+ widget = FileInput
+ def __init__(self, *args, **kwargs):
+ super(FileField, self).__init__(*args, **kwargs)
+
+ def clean(self, data):
+ super(FileField, self).clean(data)
+ if not self.required and data in EMPTY_VALUES:
+ return None
+ try:
+ f = UploadedFile(data['filename'], data['content'])
+ except TypeError:
+ raise ValidationError(ugettext(u"No file was submitted. Check the encoding type on the form."))
+ except KeyError:
+ raise ValidationError(ugettext(u"No file was submitted."))
+ if not f.content:
+ raise ValidationError(ugettext(u"The submitted file is empty."))
+ return f
+
+class ImageField(FileField):
+ def clean(self, data):
+ """
+ Checks that the file-upload field data contains a valid image (GIF, JPG,
+ PNG, possibly others -- whatever the Python Imaging Library supports).
+ """
+ f = super(ImageField, self).clean(data)
+ if f is None:
+ return None
+ from PIL import Image
+ from cStringIO import StringIO
+ try:
+ Image.open(StringIO(f.content))
+ except IOError: # Python Imaging Library doesn't recognize it as an image
+ raise ValidationError(ugettext(u"Upload a valid image. The file you uploaded was either not an image or a corrupted image."))
+ return f
+
class URLField(RegexField):
def __init__(self, max_length=None, min_length=None, verify_exists=False,
validator_user_agent=URL_VALIDATOR_USER_AGENT, *args, **kwargs):
@@ -446,10 +492,7 @@ class MultipleChoiceField(ChoiceField):
return []
if not isinstance(value, (list, tuple)):
raise ValidationError(ugettext(u'Enter a list of values.'))
- new_value = []
- for val in value:
- val = smart_unicode(val)
- new_value.append(val)
+ new_value = [smart_unicode(val) for val in value]
# Validate that each value in the value list is in self.choices.
valid_values = set([smart_unicode(k) for k, v in self.choices])
for val in new_value:
diff --git a/django/newforms/forms.py b/django/newforms/forms.py
index c281f7c998..bf1d9a88cf 100644
--- a/django/newforms/forms.py
+++ b/django/newforms/forms.py
@@ -57,9 +57,10 @@ class BaseForm(StrAndUnicode):
# class is different than Form. See the comments by the Form class for more
# information. Any improvements to the form API should be made to *this*
# class, not to the Form class.
- def __init__(self, data=None, auto_id='id_%s', prefix=None, initial=None):
- self.is_bound = data is not None
+ def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, initial=None):
+ self.is_bound = data is not None or files is not None
self.data = data or {}
+ self.files = files or {}
self.auto_id = auto_id
self.prefix = prefix
self.initial = initial or {}
@@ -88,7 +89,7 @@ class BaseForm(StrAndUnicode):
return BoundField(self, field, name)
def _get_errors(self):
- "Returns an ErrorDict for self.data"
+ "Returns an ErrorDict for the data provided for the form"
if self._errors is None:
self.full_clean()
return self._errors
@@ -182,7 +183,7 @@ class BaseForm(StrAndUnicode):
# value_from_datadict() gets the data from the dictionary.
# Each widget type knows how to retrieve its own data, because some
# widgets split data over several HTML fields.
- value = field.widget.value_from_datadict(self.data, self.add_prefix(name))
+ value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
# HACK: ['', ''] and [None, None] deal with SplitDateTimeWidget. This should be more robust.
if value not in (None, '', ['', ''], [None, None]):
return False
@@ -198,10 +199,10 @@ class BaseForm(StrAndUnicode):
return
self.cleaned_data = {}
for name, field in self.fields.items():
- # value_from_datadict() gets the data from the dictionary.
+ # value_from_datadict() gets the data from the data dictionaries.
# Each widget type knows how to retrieve its own data, because some
# widgets split data over several HTML fields.
- value = field.widget.value_from_datadict(self.data, self.add_prefix(name))
+ value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
try:
value = field.clean(value)
self.cleaned_data[name] = value
@@ -257,16 +258,8 @@ class BoundField(StrAndUnicode):
self.help_text = field.help_text or ''
def __unicode__(self):
- "Renders this field as an HTML widget."
- # Use the 'widget' attribute on the field to determine which type
- # of HTML widget to use.
- value = self.as_widget(self.field.widget)
- if not isinstance(value, basestring):
- # Some Widget render() methods -- notably RadioSelect -- return a
- # "special" object rather than a string. Call __unicode__() on that
- # object to get its rendered value.
- value = unicode(value)
- return value
+ """Renders this field as an HTML widget."""
+ return self.as_widget()
def _errors(self):
"""
@@ -276,7 +269,14 @@ class BoundField(StrAndUnicode):
return self.form.errors.get(self.name, ErrorList())
errors = property(_errors)
- def as_widget(self, widget, attrs=None):
+ def as_widget(self, widget=None, attrs=None):
+ """
+ Renders the field by rendering the passed widget, adding any HTML
+ attributes passed as attrs. If no widget is specified, then the
+ field's default widget will be used.
+ """
+ if not widget:
+ widget = self.field.widget
attrs = attrs or {}
auto_id = self.auto_id
if auto_id and 'id' not in attrs and 'id' not in widget.attrs:
@@ -309,7 +309,7 @@ class BoundField(StrAndUnicode):
"""
Returns the data for this BoundField, or None if it wasn't given.
"""
- return self.field.widget.value_from_datadict(self.form.data, self.html_name)
+ return self.field.widget.value_from_datadict(self.form.data, self.form.files, self.html_name)
data = property(_data)
def label_tag(self, contents=None, attrs=None):
diff --git a/django/newforms/models.py b/django/newforms/models.py
index fa48f9eafe..4ae8eee20a 100644
--- a/django/newforms/models.py
+++ b/django/newforms/models.py
@@ -35,18 +35,24 @@ def save_instance(form, instance, fields=None, fail_message='saved', commit=True
continue
if fields and f.name not in fields:
continue
- setattr(instance, f.name, cleaned_data[f.name])
- if commit:
- instance.save()
+ f.save_form_data(instance, cleaned_data[f.name])
+ # Wrap up the saving of m2m data as a function
+ def save_m2m():
+ opts = instance.__class__._meta
+ cleaned_data = form.cleaned_data
for f in opts.many_to_many:
if fields and f.name not in fields:
continue
if f.name in cleaned_data:
- setattr(instance, f.attname, cleaned_data[f.name])
- # GOTCHA: If many-to-many data is given and commit=False, the many-to-many
- # data will be lost. This happens because a many-to-many options cannot be
- # set on an object until after it's saved. Maybe we should raise an
- # exception in that case.
+ f.save_form_data(instance, cleaned_data[f.name])
+ if commit:
+ # If we are committing, save the instance and the m2m data immediately
+ instance.save()
+ save_m2m()
+ else:
+ # We're not committing. Add a method to the form to allow deferred
+ # saving of m2m data
+ form.save_m2m = save_m2m
return instance
def make_model_save(model, fields, fail_message):
diff --git a/django/newforms/widgets.py b/django/newforms/widgets.py
index b90e6df9cd..f985124389 100644
--- a/django/newforms/widgets.py
+++ b/django/newforms/widgets.py
@@ -47,7 +47,7 @@ class Widget(object):
attrs.update(extra_attrs)
return attrs
- def value_from_datadict(self, data, name):
+ def value_from_datadict(self, data, files, name):
"""
Given a dictionary of data and this widget's name, returns the value
of this widget. Returns None if it's not provided.
@@ -113,7 +113,7 @@ class MultipleHiddenInput(HiddenInput):
final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
return u'\n'.join([(u'<input%s />' % flatatt(dict(value=force_unicode(v), **final_attrs))) for v in value])
- def value_from_datadict(self, data, name):
+ def value_from_datadict(self, data, files, name):
if isinstance(data, MultiValueDict):
return data.getlist(name)
return data.get(name, None)
@@ -121,6 +121,13 @@ class MultipleHiddenInput(HiddenInput):
class FileInput(Input):
input_type = 'file'
+ def render(self, name, value, attrs=None):
+ return super(FileInput, self).render(name, None, attrs=attrs)
+
+ def value_from_datadict(self, data, files, name):
+ "File widgets take data from FILES, not POST"
+ return files.get(name, None)
+
class Textarea(Widget):
def __init__(self, attrs=None):
# The 'rows' and 'cols' attributes are required for HTML correctness.
@@ -188,7 +195,7 @@ class NullBooleanSelect(Select):
value = u'1'
return super(NullBooleanSelect, self).render(name, value, attrs, choices)
- def value_from_datadict(self, data, name):
+ def value_from_datadict(self, data, files, name):
value = data.get(name, None)
return {u'2': True, u'3': False, True: True, False: False}.get(value, None)
@@ -210,13 +217,17 @@ class SelectMultiple(Widget):
output.append(u'</select>')
return u'\n'.join(output)
- def value_from_datadict(self, data, name):
+ def value_from_datadict(self, data, files, name):
if isinstance(data, MultiValueDict):
return data.getlist(name)
return data.get(name, None)
class RadioInput(StrAndUnicode):
- "An object used by RadioFieldRenderer that represents a single <input type='radio'>."
+ """
+ An object used by RadioFieldRenderer that represents a single
+ <input type='radio'>.
+ """
+
def __init__(self, name, value, attrs, choice, index):
self.name, self.value = name, value
self.attrs = attrs
@@ -239,7 +250,10 @@ class RadioInput(StrAndUnicode):
return u'<input%s />' % flatatt(final_attrs)
class RadioFieldRenderer(StrAndUnicode):
- "An object used by RadioSelect to enable customization of radio widgets."
+ """
+ An object used by RadioSelect to enable customization of radio widgets.
+ """
+
def __init__(self, name, value, attrs, choices):
self.name, self.value, self.attrs = name, value, attrs
self.choices = choices
@@ -253,16 +267,30 @@ class RadioFieldRenderer(StrAndUnicode):
return RadioInput(self.name, self.value, self.attrs.copy(), choice, idx)
def __unicode__(self):
- "Outputs a <ul> for this set of radio fields."
+ return self.render()
+
+ def render(self):
+ """Outputs a <ul> for this set of radio fields."""
return u'<ul>\n%s\n</ul>' % u'\n'.join([u'<li>%s</li>' % force_unicode(w) for w in self])
class RadioSelect(Select):
- def render(self, name, value, attrs=None, choices=()):
- "Returns a RadioFieldRenderer instance rather than a Unicode string."
+
+ def __init__(self, *args, **kwargs):
+ self.renderer = kwargs.pop('renderer', None)
+ if not self.renderer:
+ self.renderer = RadioFieldRenderer
+ super(RadioSelect, self).__init__(*args, **kwargs)
+
+ def get_renderer(self, name, value, attrs=None, choices=()):
+ """Returns an instance of the renderer."""
if value is None: value = ''
str_value = force_unicode(value) # Normalize to string.
final_attrs = self.build_attrs(attrs)
- return RadioFieldRenderer(name, str_value, final_attrs, list(chain(self.choices, choices)))
+ choices = list(chain(self.choices, choices))
+ return self.renderer(name, str_value, final_attrs, choices)
+
+ def render(self, name, value, attrs=None, choices=()):
+ return self.get_renderer(name, value, attrs, choices).render()
def id_for_label(self, id_):
# RadioSelect is represented by multiple <input type="radio"> fields,
@@ -356,8 +384,8 @@ class MultiWidget(Widget):
return id_
id_for_label = classmethod(id_for_label)
- def value_from_datadict(self, data, name):
- return [widget.value_from_datadict(data, name + '_%s' % i) for i, widget in enumerate(self.widgets)]
+ def value_from_datadict(self, data, files, name):
+ return [widget.value_from_datadict(data, files, name + '_%s' % i) for i, widget in enumerate(self.widgets)]
def format_output(self, rendered_widgets):
"""
diff --git a/django/oldforms/__init__.py b/django/oldforms/__init__.py
index d0f9aca62a..b3d78f8919 100644
--- a/django/oldforms/__init__.py
+++ b/django/oldforms/__init__.py
@@ -3,7 +3,8 @@ from django.core.exceptions import PermissionDenied
from django.utils.html import escape
from django.conf import settings
from django.utils.translation import ugettext, ungettext
-from django.utils.encoding import smart_unicode, force_unicode, smart_str
+from django.utils.encoding import smart_unicode, force_unicode
+from django.utils.maxlength import LegacyMaxlength
FORM_FIELD_ID_PREFIX = 'id_'
@@ -302,6 +303,9 @@ class FormField(object):
Subclasses should also implement a render(data) method, which is responsible
for rending the form field in XHTML.
"""
+ # Provide backwards compatibility for the maxlength attribute and
+ # argument for this class and all subclasses.
+ __metaclass__ = LegacyMaxlength
def __str__(self):
return unicode(self).encode('utf-8')
@@ -390,19 +394,19 @@ class FormField(object):
class TextField(FormField):
input_type = "text"
- def __init__(self, field_name, length=30, maxlength=None, is_required=False, validator_list=None, member_name=None):
+ def __init__(self, field_name, length=30, max_length=None, is_required=False, validator_list=None, member_name=None):
if validator_list is None: validator_list = []
self.field_name = field_name
- self.length, self.maxlength = length, maxlength
+ self.length, self.max_length = length, max_length
self.is_required = is_required
self.validator_list = [self.isValidLength, self.hasNoNewlines] + validator_list
if member_name != None:
self.member_name = member_name
def isValidLength(self, data, form):
- if data and self.maxlength and len(smart_unicode(data)) > self.maxlength:
+ if data and self.max_length and len(smart_unicode(data)) > self.max_length:
raise validators.ValidationError, ungettext("Ensure your text is less than %s character.",
- "Ensure your text is less than %s characters.", self.maxlength) % self.maxlength
+ "Ensure your text is less than %s characters.", self.max_length) % self.max_length
def hasNoNewlines(self, data, form):
if data and '\n' in data:
@@ -411,12 +415,12 @@ class TextField(FormField):
def render(self, data):
if data is None:
data = u''
- maxlength = u''
- if self.maxlength:
- maxlength = u'maxlength="%s" ' % self.maxlength
+ max_length = u''
+ if self.max_length:
+ max_length = u'maxlength="%s" ' % self.max_length
return u'<input type="%s" id="%s" class="v%s%s" name="%s" size="%s" value="%s" %s/>' % \
(self.input_type, self.get_id(), self.__class__.__name__, self.is_required and u' required' or '',
- self.field_name, self.length, escape(data), maxlength)
+ self.field_name, self.length, escape(data), max_length)
def html2python(data):
return data
@@ -426,14 +430,14 @@ class PasswordField(TextField):
input_type = "password"
class LargeTextField(TextField):
- def __init__(self, field_name, rows=10, cols=40, is_required=False, validator_list=None, maxlength=None):
+ def __init__(self, field_name, rows=10, cols=40, is_required=False, validator_list=None, max_length=None):
if validator_list is None: validator_list = []
self.field_name = field_name
self.rows, self.cols, self.is_required = rows, cols, is_required
self.validator_list = validator_list[:]
- if maxlength:
+ if max_length:
self.validator_list.append(self.isValidLength)
- self.maxlength = maxlength
+ self.max_length = max_length
def render(self, data):
if data is None:
@@ -502,7 +506,7 @@ class SelectField(FormField):
def isValidChoice(self, data, form):
str_data = smart_unicode(data)
- str_choices = [smart_str(item[0]) for item in self.choices]
+ str_choices = [smart_unicode(item[0]) for item in self.choices]
if str_data not in str_choices:
raise validators.ValidationError, ugettext("Select a valid choice; '%(data)s' is not in %(choices)s.") % {'data': str_data, 'choices': str_choices}
@@ -710,12 +714,12 @@ class ImageUploadField(FileUploadField):
####################
class IntegerField(TextField):
- def __init__(self, field_name, length=10, maxlength=None, is_required=False, validator_list=None, member_name=None):
+ def __init__(self, field_name, length=10, max_length=None, is_required=False, validator_list=None, member_name=None):
if validator_list is None: validator_list = []
validator_list = [self.isInteger] + validator_list
if member_name is not None:
self.member_name = member_name
- TextField.__init__(self, field_name, length, maxlength, is_required, validator_list)
+ TextField.__init__(self, field_name, length, max_length, is_required, validator_list)
def isInteger(self, field_data, all_data):
try:
@@ -730,57 +734,57 @@ class IntegerField(TextField):
html2python = staticmethod(html2python)
class SmallIntegerField(IntegerField):
- def __init__(self, field_name, length=5, maxlength=5, is_required=False, validator_list=None):
+ def __init__(self, field_name, length=5, max_length=5, is_required=False, validator_list=None):
if validator_list is None: validator_list = []
validator_list = [self.isSmallInteger] + validator_list
- IntegerField.__init__(self, field_name, length, maxlength, is_required, validator_list)
+ IntegerField.__init__(self, field_name, length, max_length, is_required, validator_list)
def isSmallInteger(self, field_data, all_data):
if not -32768 <= int(field_data) <= 32767:
raise validators.CriticalValidationError, ugettext("Enter a whole number between -32,768 and 32,767.")
class PositiveIntegerField(IntegerField):
- def __init__(self, field_name, length=10, maxlength=None, is_required=False, validator_list=None):
+ def __init__(self, field_name, length=10, max_length=None, is_required=False, validator_list=None):
if validator_list is None: validator_list = []
validator_list = [self.isPositive] + validator_list
- IntegerField.__init__(self, field_name, length, maxlength, is_required, validator_list)
+ IntegerField.__init__(self, field_name, length, max_length, is_required, validator_list)
def isPositive(self, field_data, all_data):
if int(field_data) < 0:
raise validators.CriticalValidationError, ugettext("Enter a positive number.")
class PositiveSmallIntegerField(IntegerField):
- def __init__(self, field_name, length=5, maxlength=None, is_required=False, validator_list=None):
+ def __init__(self, field_name, length=5, max_length=None, is_required=False, validator_list=None):
if validator_list is None: validator_list = []
validator_list = [self.isPositiveSmall] + validator_list
- IntegerField.__init__(self, field_name, length, maxlength, is_required, validator_list)
+ IntegerField.__init__(self, field_name, length, max_length, is_required, validator_list)
def isPositiveSmall(self, field_data, all_data):
if not 0 <= int(field_data) <= 32767:
raise validators.CriticalValidationError, ugettext("Enter a whole number between 0 and 32,767.")
class FloatField(TextField):
- def __init__(self, field_name, is_required=False, validator_list=None):
- if validator_list is None: validator_list = []
- validator_list = [validators.isValidFloat] + validator_list
- TextField.__init__(self, field_name, is_required=is_required, validator_list=validator_list)
-
- def html2python(data):
- if data == '' or data is None:
- return None
- return float(data)
- html2python = staticmethod(html2python)
-
-class DecimalField(TextField):
+ def __init__(self, field_name, is_required=False, validator_list=None):
+ if validator_list is None: validator_list = []
+ validator_list = [validators.isValidFloat] + validator_list
+ TextField.__init__(self, field_name, is_required=is_required, validator_list=validator_list)
+
+ def html2python(data):
+ if data == '' or data is None:
+ return None
+ return float(data)
+ html2python = staticmethod(html2python)
+
+class DecimalField(TextField):
def __init__(self, field_name, max_digits, decimal_places, is_required=False, validator_list=None):
if validator_list is None: validator_list = []
self.max_digits, self.decimal_places = max_digits, decimal_places
- validator_list = [self.isValidDecimal] + validator_list
- # Initialise the TextField, making sure it's large enough to fit the number with a - sign and a decimal point.
- super(DecimalField, self).__init__(field_name, max_digits+2, max_digits+2, is_required, validator_list)
+ validator_list = [self.isValidDecimal] + validator_list
+ # Initialise the TextField, making sure it's large enough to fit the number with a - sign and a decimal point.
+ super(DecimalField, self).__init__(field_name, max_digits+2, max_digits+2, is_required, validator_list)
- def isValidDecimal(self, field_data, all_data):
- v = validators.IsValidDecimal(self.max_digits, self.decimal_places)
+ def isValidDecimal(self, field_data, all_data):
+ v = validators.IsValidDecimal(self.max_digits, self.decimal_places)
try:
v(field_data, all_data)
except validators.ValidationError, e:
@@ -789,14 +793,14 @@ class DecimalField(TextField):
def html2python(data):
if data == '' or data is None:
return None
- try:
- import decimal
+ try:
+ import decimal
except ImportError:
from django.utils import _decimal as decimal
- try:
- return decimal.Decimal(data)
- except decimal.InvalidOperation, e:
- raise ValueError, e
+ try:
+ return decimal.Decimal(data)
+ except decimal.InvalidOperation, e:
+ raise ValueError, e
html2python = staticmethod(html2python)
####################
@@ -806,10 +810,10 @@ class DecimalField(TextField):
class DatetimeField(TextField):
"""A FormField that automatically converts its data to a datetime.datetime object.
The data should be in the format YYYY-MM-DD HH:MM:SS."""
- def __init__(self, field_name, length=30, maxlength=None, is_required=False, validator_list=None):
+ def __init__(self, field_name, length=30, max_length=None, is_required=False, validator_list=None):
if validator_list is None: validator_list = []
self.field_name = field_name
- self.length, self.maxlength = length, maxlength
+ self.length, self.max_length = length, max_length
self.is_required = is_required
self.validator_list = [validators.isValidANSIDatetime] + validator_list
@@ -836,7 +840,7 @@ class DateField(TextField):
def __init__(self, field_name, is_required=False, validator_list=None):
if validator_list is None: validator_list = []
validator_list = [self.isValidDate] + validator_list
- TextField.__init__(self, field_name, length=10, maxlength=10,
+ TextField.__init__(self, field_name, length=10, max_length=10,
is_required=is_required, validator_list=validator_list)
def isValidDate(self, field_data, all_data):
@@ -861,7 +865,7 @@ class TimeField(TextField):
def __init__(self, field_name, is_required=False, validator_list=None):
if validator_list is None: validator_list = []
validator_list = [self.isValidTime] + validator_list
- TextField.__init__(self, field_name, length=8, maxlength=8,
+ TextField.__init__(self, field_name, length=8, max_length=8,
is_required=is_required, validator_list=validator_list)
def isValidTime(self, field_data, all_data):
@@ -893,10 +897,10 @@ class TimeField(TextField):
class EmailField(TextField):
"A convenience FormField for validating e-mail addresses"
- def __init__(self, field_name, length=50, maxlength=75, is_required=False, validator_list=None):
+ def __init__(self, field_name, length=50, max_length=75, is_required=False, validator_list=None):
if validator_list is None: validator_list = []
validator_list = [self.isValidEmail] + validator_list
- TextField.__init__(self, field_name, length, maxlength=maxlength,
+ TextField.__init__(self, field_name, length, max_length=max_length,
is_required=is_required, validator_list=validator_list)
def isValidEmail(self, field_data, all_data):
@@ -907,10 +911,10 @@ class EmailField(TextField):
class URLField(TextField):
"A convenience FormField for validating URLs"
- def __init__(self, field_name, length=50, maxlength=200, is_required=False, validator_list=None):
+ def __init__(self, field_name, length=50, max_length=200, is_required=False, validator_list=None):
if validator_list is None: validator_list = []
validator_list = [self.isValidURL] + validator_list
- TextField.__init__(self, field_name, length=length, maxlength=maxlength,
+ TextField.__init__(self, field_name, length=length, max_length=max_length,
is_required=is_required, validator_list=validator_list)
def isValidURL(self, field_data, all_data):
@@ -920,10 +924,10 @@ class URLField(TextField):
raise validators.CriticalValidationError, e.messages
class IPAddressField(TextField):
- def __init__(self, field_name, length=15, maxlength=15, is_required=False, validator_list=None):
+ def __init__(self, field_name, length=15, max_length=15, is_required=False, validator_list=None):
if validator_list is None: validator_list = []
validator_list = [self.isValidIPAddress] + validator_list
- TextField.__init__(self, field_name, length=length, maxlength=maxlength,
+ TextField.__init__(self, field_name, length=length, max_length=max_length,
is_required=is_required, validator_list=validator_list)
def isValidIPAddress(self, field_data, all_data):
@@ -970,7 +974,7 @@ class PhoneNumberField(TextField):
def __init__(self, field_name, is_required=False, validator_list=None):
if validator_list is None: validator_list = []
validator_list = [self.isValidPhone] + validator_list
- TextField.__init__(self, field_name, length=12, maxlength=12,
+ TextField.__init__(self, field_name, length=12, max_length=12,
is_required=is_required, validator_list=validator_list)
def isValidPhone(self, field_data, all_data):
@@ -984,7 +988,7 @@ class USStateField(TextField):
def __init__(self, field_name, is_required=False, validator_list=None):
if validator_list is None: validator_list = []
validator_list = [self.isValidUSState] + validator_list
- TextField.__init__(self, field_name, length=2, maxlength=2,
+ TextField.__init__(self, field_name, length=2, max_length=2,
is_required=is_required, validator_list=validator_list)
def isValidUSState(self, field_data, all_data):
@@ -1001,10 +1005,10 @@ class USStateField(TextField):
class CommaSeparatedIntegerField(TextField):
"A convenience FormField for validating comma-separated integer fields"
- def __init__(self, field_name, maxlength=None, is_required=False, validator_list=None):
+ def __init__(self, field_name, max_length=None, is_required=False, validator_list=None):
if validator_list is None: validator_list = []
validator_list = [self.isCommaSeparatedIntegerList] + validator_list
- TextField.__init__(self, field_name, length=20, maxlength=maxlength,
+ TextField.__init__(self, field_name, length=20, max_length=max_length,
is_required=is_required, validator_list=validator_list)
def isCommaSeparatedIntegerList(self, field_data, all_data):
diff --git a/django/shortcuts/__init__.py b/django/shortcuts/__init__.py
index 81381d08c1..dfb0c28abd 100644
--- a/django/shortcuts/__init__.py
+++ b/django/shortcuts/__init__.py
@@ -1,32 +1,62 @@
-# This module collects helper functions and classes that "span" multiple levels
-# of MVC. In other words, these functions/classes introduce controlled coupling
-# for convenience's sake.
+"""
+This module collects helper functions and classes that "span" multiple levels
+of MVC. In other words, these functions/classes introduce controlled coupling
+for convenience's sake.
+"""
from django.template import loader
from django.http import HttpResponse, Http404
from django.db.models.manager import Manager
+from django.db.models.query import QuerySet
def render_to_response(*args, **kwargs):
+ """
+ Returns a HttpResponse whose content is filled with the result of calling
+ django.template.loader.render_to_string() with the passed arguments.
+ """
return HttpResponse(loader.render_to_string(*args, **kwargs))
load_and_render = render_to_response # For backwards compatibility.
-def get_object_or_404(klass, *args, **kwargs):
- if isinstance(klass, Manager):
+def _get_queryset(klass):
+ """
+ Returns a QuerySet from a Model, Manager, or QuerySet. Created to make
+ get_object_or_404 and get_list_or_404 more DRY.
+ """
+ if isinstance(klass, QuerySet):
+ return klass
+ elif isinstance(klass, Manager):
manager = klass
- klass = manager.model
else:
manager = klass._default_manager
+ return manager.all()
+
+def get_object_or_404(klass, *args, **kwargs):
+ """
+ Uses get() to return an object, or raises a Http404 exception if the object
+ does not exist.
+
+ klass may be a Model, Manager, or QuerySet object. All other passed
+ arguments and keyword arguments are used in the get() query.
+
+ Note: Like with get(), an AssertionError will be raised if more than one
+ object is found.
+ """
+ queryset = _get_queryset(klass)
try:
- return manager.get(*args, **kwargs)
- except klass.DoesNotExist:
- raise Http404('No %s matches the given query.' % klass._meta.object_name)
+ return queryset.get(*args, **kwargs)
+ except queryset.model.DoesNotExist:
+ raise Http404('No %s matches the given query.' % queryset.model._meta.object_name)
def get_list_or_404(klass, *args, **kwargs):
- if isinstance(klass, Manager):
- manager = klass
- else:
- manager = klass._default_manager
- obj_list = list(manager.filter(*args, **kwargs))
+ """
+ Uses filter() to return a list of objects, or raise a Http404 exception if
+ the list is empty.
+
+ klass may be a Model, Manager, or QuerySet object. All other passed
+ arguments and keyword arguments are used in the filter() query.
+ """
+ queryset = _get_queryset(klass)
+ obj_list = list(queryset.filter(*args, **kwargs))
if not obj_list:
- raise Http404('No %s matches the given query.' % manager.model._meta.object_name)
+ raise Http404('No %s matches the given query.' % queryset.model._meta.object_name)
return obj_list
diff --git a/django/template/__init__.py b/django/template/__init__.py
index b58e9f049c..6880fd5997 100644
--- a/django/template/__init__.py
+++ b/django/template/__init__.py
@@ -512,7 +512,7 @@ filter_raw_string = r"""
)?
)""" % {
'str': r"""[^"\\]*(?:\\.[^"\\]*)*""",
- 'var_chars': "A-Za-z0-9\_\." ,
+ 'var_chars': "\w\." ,
'filter_sep': re.escape(FILTER_SEPARATOR),
'arg_sep': re.escape(FILTER_ARGUMENT_SEPARATOR),
'i18n_open' : re.escape("_("),
@@ -520,7 +520,7 @@ filter_raw_string = r"""
}
filter_raw_string = filter_raw_string.replace("\n", "").replace(" ", "")
-filter_re = re.compile(filter_raw_string)
+filter_re = re.compile(filter_raw_string, re.UNICODE)
class FilterExpression(object):
"""
diff --git a/django/template/defaultfilters.py b/django/template/defaultfilters.py
index 6aadbf2381..6779b9b5f2 100644
--- a/django/template/defaultfilters.py
+++ b/django/template/defaultfilters.py
@@ -556,7 +556,7 @@ def pprint(value):
try:
return pformat(value)
except Exception, e:
- return u"Error in formatting:%s" % force_unicode(e)
+ return u"Error in formatting: %s" % force_unicode(e, errors="replace")
# Syntax: register.filter(name of filter, callback)
register.filter(add)
diff --git a/django/template/defaulttags.py b/django/template/defaulttags.py
index 7b3a261a5b..bd21212ff6 100644
--- a/django/template/defaulttags.py
+++ b/django/template/defaulttags.py
@@ -649,8 +649,8 @@ def do_if(parser, token):
As you can see, the ``if`` tag can take an option ``{% else %}`` clause that
will be displayed if the test fails.
- ``if`` tags may use ``or`` or ``not`` to test a number of variables or to
- negate a given variable::
+ ``if`` tags may use ``or``, ``and`` or ``not`` to test a number of
+ variables or to negate a given variable::
{% if not athlete_list %}
There are no athletes.
@@ -660,19 +660,32 @@ def do_if(parser, token):
There are some athletes or some coaches.
{% endif %}
+ {% if athlete_list and coach_list %}
+ Both atheletes and coaches are available.
+ {% endif %}
+
{% if not athlete_list or coach_list %}
There are no athletes, or there are some coaches.
{% endif %}
- For simplicity, ``if`` tags do not allow ``and`` clauses. Use nested ``if``
- tags instead::
+ {% if athlete_list and not coach_list %}
+ There are some athletes and absolutely no coaches.
+ {% endif %}
- {% if athlete_list %}
- {% if coach_list %}
- Number of athletes: {{ athlete_list|count }}.
- Number of coaches: {{ coach_list|count }}.
- {% endif %}
+ ``if`` tags do not allow ``and`` and ``or`` clauses with the same
+ tag, because the order of logic would be ambigous. For example,
+ this is invalid::
+
+ {% if athlete_list and coach_list or cheerleader_list %}
+
+ If you need to combine and and or to do advanced logic, just use
+ nested if tags. For example:
+
+ {% if athlete_list %}
+ {% if coach_list or cheerleader_list %}
+ We have athletes, and either coaches or cheerleaders!
{% endif %}
+ {% endif %}
"""
bits = token.contents.split()
del bits[0]
diff --git a/django/template/loaders/app_directories.py b/django/template/loaders/app_directories.py
index c520689644..f0f4b1a70e 100644
--- a/django/template/loaders/app_directories.py
+++ b/django/template/loaders/app_directories.py
@@ -1,9 +1,14 @@
-# Wrapper for loading templates from "template" directories in installed app packages.
+"""
+Wrapper for loading templates from "template" directories in INSTALLED_APPS
+packages.
+"""
+
+import os
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from django.template import TemplateDoesNotExist
-import os
+from django.utils._os import safe_join
# At compile time, cache the directories to search.
app_template_dirs = []
@@ -28,8 +33,14 @@ for app in settings.INSTALLED_APPS:
app_template_dirs = tuple(app_template_dirs)
def get_template_sources(template_name, template_dirs=None):
- for template_dir in app_template_dirs:
- yield os.path.join(template_dir, template_name)
+ if not template_dirs:
+ template_dirs = app_template_dirs
+ for template_dir in template_dirs:
+ try:
+ yield safe_join(template_dir, template_name)
+ except ValueError:
+ # The joined path was located outside of template_dir.
+ pass
def load_template_source(template_name, template_dirs=None):
for filepath in get_template_sources(template_name, template_dirs):
diff --git a/django/template/loaders/filesystem.py b/django/template/loaders/filesystem.py
index 3ba4625cda..9997eb9a54 100644
--- a/django/template/loaders/filesystem.py
+++ b/django/template/loaders/filesystem.py
@@ -1,14 +1,20 @@
-# Wrapper for loading templates from the filesystem.
+"""
+Wrapper for loading templates from the filesystem.
+"""
from django.conf import settings
from django.template import TemplateDoesNotExist
-import os
+from django.utils._os import safe_join
def get_template_sources(template_name, template_dirs=None):
if not template_dirs:
template_dirs = settings.TEMPLATE_DIRS
for template_dir in template_dirs:
- yield os.path.join(template_dir, template_name)
+ try:
+ yield safe_join(template_dir, template_name)
+ except ValueError:
+ # The joined path was located outside of template_dir.
+ pass
def load_template_source(template_name, template_dirs=None):
tried = []
diff --git a/django/test/client.py b/django/test/client.py
index ed72ad8f77..7e62715205 100644
--- a/django/test/client.py
+++ b/django/test/client.py
@@ -195,7 +195,7 @@ class Client:
'CONTENT_LENGTH': None,
'CONTENT_TYPE': 'text/html; charset=utf-8',
'PATH_INFO': path,
- 'QUERY_STRING': urlencode(data),
+ 'QUERY_STRING': urlencode(data, doseq=True),
'REQUEST_METHOD': 'GET',
}
r.update(extra)
@@ -225,10 +225,11 @@ class Client:
"""Set the Client to appear as if it has sucessfully logged into a site.
Returns True if login is possible; False if the provided credentials
- are incorrect, or if the Sessions framework is not available.
+ are incorrect, or the user is inactive, or if the sessions framework is
+ not available.
"""
user = authenticate(**credentials)
- if user and 'django.contrib.sessions' in settings.INSTALLED_APPS:
+ if user and user.is_active and 'django.contrib.sessions' in settings.INSTALLED_APPS:
obj = Session.objects.get_new_session_object()
# Create a fake request to store login details
diff --git a/django/test/simple.py b/django/test/simple.py
index 5f7f86f220..6fa381ac4d 100644
--- a/django/test/simple.py
+++ b/django/test/simple.py
@@ -1,5 +1,6 @@
import unittest
from django.conf import settings
+from django.db.models import get_app, get_apps
from django.test import _doctest as doctest
from django.test.utils import setup_test_environment, teardown_test_environment
from django.test.utils import create_test_db, destroy_test_db
@@ -10,34 +11,10 @@ TEST_MODULE = 'tests'
doctestOutputChecker = OutputChecker()
-def build_suite(app_module):
- "Create a complete Django test suite for the provided application module"
- suite = unittest.TestSuite()
-
- # Load unit and doctests in the models.py file
- suite.addTest(unittest.defaultTestLoader.loadTestsFromModule(app_module))
- try:
- suite.addTest(doctest.DocTestSuite(app_module,
- checker=doctestOutputChecker,
- runner=DocTestRunner))
- except ValueError:
- # No doc tests in models.py
- pass
-
- # Check to see if a separate 'tests' module exists parallel to the
- # models module
+def get_tests(app_module):
try:
app_path = app_module.__name__.split('.')[:-1]
test_module = __import__('.'.join(app_path + [TEST_MODULE]), {}, {}, TEST_MODULE)
-
- suite.addTest(unittest.defaultTestLoader.loadTestsFromModule(test_module))
- try:
- suite.addTest(doctest.DocTestSuite(test_module,
- checker=doctestOutputChecker,
- runner=DocTestRunner))
- except ValueError:
- # No doc tests in tests.py
- pass
except ImportError, e:
# Couldn't import tests.py. Was it due to a missing file, or
# due to an import error in a tests.py that actually exists?
@@ -47,7 +24,7 @@ def build_suite(app_module):
mod = find_module(TEST_MODULE, [os.path.dirname(app_module.__file__)])
except ImportError:
# 'tests' module doesn't exist. Move on.
- pass
+ test_module = None
else:
# The module exists, so there must be an import error in the
# test module itself. We don't need the module; so if the
@@ -57,15 +34,87 @@ def build_suite(app_module):
if mod[0]:
mod[0].close()
raise
-
+ return test_module
+
+def build_suite(app_module):
+ "Create a complete Django test suite for the provided application module"
+ suite = unittest.TestSuite()
+
+ # Load unit and doctests in the models.py module. If module has
+ # a suite() method, use it. Otherwise build the test suite ourselves.
+ if hasattr(app_module, 'suite'):
+ suite.addTest(app_module.suite())
+ else:
+ suite.addTest(unittest.defaultTestLoader.loadTestsFromModule(app_module))
+ try:
+ suite.addTest(doctest.DocTestSuite(app_module,
+ checker=doctestOutputChecker,
+ runner=DocTestRunner))
+ except ValueError:
+ # No doc tests in models.py
+ pass
+
+ # Check to see if a separate 'tests' module exists parallel to the
+ # models module
+ test_module = get_tests(app_module)
+ if test_module:
+ # Load unit and doctests in the tests.py module. If module has
+ # a suite() method, use it. Otherwise build the test suite ourselves.
+ if hasattr(test_module, 'suite'):
+ suite.addTest(test_module.suite())
+ else:
+ suite.addTest(unittest.defaultTestLoader.loadTestsFromModule(test_module))
+ try:
+ suite.addTest(doctest.DocTestSuite(test_module,
+ checker=doctestOutputChecker,
+ runner=DocTestRunner))
+ except ValueError:
+ # No doc tests in tests.py
+ pass
return suite
-def run_tests(module_list, verbosity=1, extra_tests=[]):
+def build_test(label):
+ """Construct a test case a test with the specified label. Label should
+ be of the form model.TestClass or model.TestClass.test_method. Returns
+ an instantiated test or test suite corresponding to the label provided.
+
"""
- Run the unit tests for all the modules in the provided list.
- This testrunner will search each of the modules in the provided list,
- looking for doctests and unittests in models.py or tests.py within
- the module. A list of 'extra' tests may also be provided; these tests
+ parts = label.split('.')
+ if len(parts) < 2 or len(parts) > 3:
+ raise ValueError("Test label '%s' should be of the form app.TestCase or app.TestCase.test_method" % label)
+
+ app_module = get_app(parts[0])
+ TestClass = getattr(app_module, parts[1], None)
+
+ # Couldn't find the test class in models.py; look in tests.py
+ if TestClass is None:
+ test_module = get_tests(app_module)
+ if test_module:
+ TestClass = getattr(test_module, parts[1], None)
+
+ if len(parts) == 2: # label is app.TestClass
+ try:
+ return unittest.TestLoader().loadTestsFromTestCase(TestClass)
+ except TypeError:
+ raise ValueError("Test label '%s' does not refer to a test class" % label)
+ else: # label is app.TestClass.test_method
+ return TestClass(parts[2])
+
+def run_tests(test_labels, verbosity=1, interactive=True, extra_tests=[]):
+ """
+ Run the unit tests for all the test labels in the provided list.
+ Labels must be of the form:
+ - app.TestClass.test_method
+ Run a single specific test method
+ - app.TestClass
+ Run all the test methods in a given class
+ - app
+ Search for doctests and unittests in the named application.
+
+ When looking for tests, the test runner will look in the models and
+ tests modules for the application.
+
+ A list of 'extra' tests may also be provided; these tests
will be added to the test suite.
Returns the number of tests that failed.
@@ -74,15 +123,23 @@ def run_tests(module_list, verbosity=1, extra_tests=[]):
settings.DEBUG = False
suite = unittest.TestSuite()
-
- for module in module_list:
- suite.addTest(build_suite(module))
+
+ if test_labels:
+ for label in test_labels:
+ if '.' in label:
+ suite.addTest(build_test(label))
+ else:
+ app = get_app(label)
+ suite.addTest(build_suite(app))
+ else:
+ for app in get_apps():
+ suite.addTest(build_suite(app))
for test in extra_tests:
suite.addTest(test)
old_name = settings.DATABASE_NAME
- create_test_db(verbosity)
+ create_test_db(verbosity, autoclobber=not interactive)
result = unittest.TextTestRunner(verbosity=verbosity).run(suite)
destroy_test_db(old_name, verbosity)
diff --git a/django/test/testcases.py b/django/test/testcases.py
index e88741e94c..5373d822df 100644
--- a/django/test/testcases.py
+++ b/django/test/testcases.py
@@ -73,19 +73,23 @@ class TestCase(unittest.TestCase):
"Couldn't retrieve redirection page '%s': response code was %d (expected %d)" %
(path, redirect_response.status_code, target_status_code))
- def assertContains(self, response, text, count=1, status_code=200):
+ def assertContains(self, response, text, count=None, status_code=200):
"""Assert that a response indicates that a page was retreived successfully,
(i.e., the HTTP status code was as expected), and that ``text`` occurs ``count``
- times in the content of the response.
+ times in the content of the response. If ``count`` is None, the count doesn't
+ matter - the assertion is true if the text occurs at least once in the response.
"""
self.assertEqual(response.status_code, status_code,
"Couldn't retrieve page: Response code was %d (expected %d)'" %
(response.status_code, status_code))
real_count = response.content.count(text)
- self.assertEqual(real_count, count,
- "Found %d instances of '%s' in response (expected %d)" % (real_count, text, count))
-
+ if count is not None:
+ self.assertEqual(real_count, count,
+ "Found %d instances of '%s' in response (expected %d)" % (real_count, text, count))
+ else:
+ self.assertTrue(real_count != 0, "Couldn't find '%s' in response" % text)
+
def assertFormError(self, response, form, field, errors):
"Assert that a form used to render the response has a specific field error"
if not response.context:
diff --git a/django/test/utils.py b/django/test/utils.py
index 0836b7eac6..e9525b4dd4 100644
--- a/django/test/utils.py
+++ b/django/test/utils.py
@@ -123,7 +123,7 @@ def create_test_db(verbosity=1, autoclobber=False):
except Exception, e:
sys.stderr.write("Got an error creating the test database: %s\n" % e)
if not autoclobber:
- confirm = raw_input("It appears the test database, %s, already exists. Type 'yes' to delete it, or 'no' to cancel: " % TEST_DATABASE_NAME)
+ confirm = raw_input("Type 'yes' if you would like to try deleting the test database '%s', or 'no' to cancel: " % TEST_DATABASE_NAME)
if autoclobber or confirm == 'yes':
try:
if verbosity >= 1:
@@ -144,6 +144,10 @@ def create_test_db(verbosity=1, autoclobber=False):
management.syncdb(verbosity, interactive=False)
+ if settings.CACHE_BACKEND.startswith('db://'):
+ cache_name = settings.CACHE_BACKEND[len('db://'):]
+ management.createcachetable(cache_name)
+
# Get a cursor (even though we don't need one yet). This has
# the side effect of initializing the test database.
cursor = connection.cursor()
diff --git a/django/utils/_os.py b/django/utils/_os.py
new file mode 100644
index 0000000000..56ef0f2014
--- /dev/null
+++ b/django/utils/_os.py
@@ -0,0 +1,23 @@
+from os.path import join, normcase, abspath, sep
+
+def safe_join(base, *paths):
+ """
+ Joins one or more path components to the base path component intelligently.
+ Returns a normalized, absolute version of the final path.
+
+ The final path must be located inside of the base path component (otherwise
+ a ValueError is raised).
+ """
+ # We need to use normcase to ensure we don't false-negative on case
+ # insensitive operating systems (like Windows).
+ final_path = normcase(abspath(join(base, *paths)))
+ base_path = normcase(abspath(base))
+ base_path_len = len(base_path)
+ # Ensure final_path starts with base_path and that the next character after
+ # the final path is os.sep (or nothing, in which case final_path must be
+ # equal to base_path).
+ if not final_path.startswith(base_path) \
+ or final_path[base_path_len:base_path_len+1] not in ('', sep):
+ raise ValueError('the joined path is located outside of the base path'
+ ' component')
+ return final_path
diff --git a/django/utils/cache.py b/django/utils/cache.py
index 5b90ca291f..2753d86949 100644
--- a/django/utils/cache.py
+++ b/django/utils/cache.py
@@ -17,7 +17,10 @@ A example: i18n middleware would need to distinguish caches by the
"Accept-language" header.
"""
-import datetime, md5, re
+import md5
+import re
+import time
+from email.Utils import formatdate
from django.conf import settings
from django.core.cache import cache
from django.utils.encoding import smart_str
@@ -44,7 +47,7 @@ def patch_cache_control(response, **kwargs):
return (t[0].lower().replace('-', '_'), True)
def dictvalue(t):
- if t[1] == True:
+ if t[1] is True:
return t[0]
else:
return t[0] + '=' + smart_str(t[1])
@@ -73,16 +76,14 @@ def patch_response_headers(response, cache_timeout=None):
"""
if cache_timeout is None:
cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS
- now = datetime.datetime.utcnow()
+ if cache_timeout < 0:
+ cache_timeout = 0 # Can't have max-age negative
if not response.has_header('ETag'):
response['ETag'] = md5.new(response.content).hexdigest()
if not response.has_header('Last-Modified'):
- response['Last-Modified'] = now.strftime('%a, %d %b %Y %H:%M:%S GMT')
+ response['Last-Modified'] = formatdate()[:26] + "GMT"
if not response.has_header('Expires'):
- expires = now + datetime.timedelta(0, cache_timeout)
- response['Expires'] = expires.strftime('%a, %d %b %Y %H:%M:%S GMT')
- if cache_timeout < 0:
- cache_timeout = 0 # Can't have max-age negative
+ response['Expires'] = formatdate(time.time() + cache_timeout)[:26] + "GMT"
patch_cache_control(response, max_age=cache_timeout)
def add_never_cache_headers(response):
diff --git a/django/utils/dateformat.py b/django/utils/dateformat.py
index 8a90e21cb1..d5f3499d82 100644
--- a/django/utils/dateformat.py
+++ b/django/utils/dateformat.py
@@ -227,7 +227,7 @@ class DateFormat(TimeFormat):
week_number = 1
else:
j = day_of_year + (7 - weekday) + (jan1_weekday - 1)
- week_number = j / 7
+ week_number = j // 7
if jan1_weekday > 4:
week_number -= 1
return week_number
diff --git a/django/utils/decorators.py b/django/utils/decorators.py
index 54014a82b5..57ce29fca4 100644
--- a/django/utils/decorators.py
+++ b/django/utils/decorators.py
@@ -8,6 +8,9 @@ def decorator_from_middleware(middleware_class):
lets you use middleware functionality on a per-view basis.
"""
def _decorator_from_middleware(*args, **kwargs):
+ # For historical reasons, these "decorators" are also called as
+ # dec(func, *args) instead of dec(*args)(func). We handle both forms
+ # for backwards compatibility.
has_func = True
try:
view_func = kwargs.pop('view_func')
@@ -17,9 +20,7 @@ def decorator_from_middleware(middleware_class):
else:
has_func = False
if not (has_func and isinstance(view_func, types.FunctionType)):
- # For historical reasons, these decorators are also called as
- # dec(func, *args) instead of dec(*args)(func). This branch handles
- # the backwards compatibility.
+ # We are being called as a decorator.
if has_func:
args = (view_func,) + args
middleware = middleware_class(*args, **kwargs)
diff --git a/django/utils/encoding.py b/django/utils/encoding.py
index 7515d0c41b..2319496538 100644
--- a/django/utils/encoding.py
+++ b/django/utils/encoding.py
@@ -1,6 +1,5 @@
import types
import urllib
-from django.conf import settings
from django.utils.functional import Promise
class StrAndUnicode(object):
diff --git a/django/utils/feedgenerator.py b/django/utils/feedgenerator.py
index 064ec19120..6b6dedfbe9 100644
--- a/django/utils/feedgenerator.py
+++ b/django/utils/feedgenerator.py
@@ -41,7 +41,7 @@ class SyndicationFeed(object):
"Base class for all syndication feeds. Subclasses should provide write()"
def __init__(self, title, link, description, language=None, author_email=None,
author_name=None, author_link=None, subtitle=None, categories=None,
- feed_url=None, feed_copyright=None):
+ feed_url=None, feed_copyright=None, feed_guid=None):
to_unicode = lambda s: force_unicode(s, strings_only=True)
if categories:
categories = [force_unicode(c) for c in categories]
@@ -57,6 +57,7 @@ class SyndicationFeed(object):
'categories': categories or (),
'feed_url': iri_to_uri(feed_url),
'feed_copyright': to_unicode(feed_copyright),
+ 'id': feed_guid or link,
}
self.items = []
@@ -213,7 +214,7 @@ class Atom1Feed(SyndicationFeed):
handler.addQuickElement(u"link", "", {u"rel": u"alternate", u"href": self.feed['link']})
if self.feed['feed_url'] is not None:
handler.addQuickElement(u"link", "", {u"rel": u"self", u"href": self.feed['feed_url']})
- handler.addQuickElement(u"id", self.feed['link'])
+ handler.addQuickElement(u"id", self.feed['id'])
handler.addQuickElement(u"updated", rfc3339_date(self.latest_post_date()).decode('ascii'))
if self.feed['author_name'] is not None:
handler.startElement(u"author", {})
diff --git a/django/utils/functional.py b/django/utils/functional.py
index 656f3406c4..734704f6f3 100644
--- a/django/utils/functional.py
+++ b/django/utils/functional.py
@@ -3,18 +3,20 @@ def curry(_curried_func, *args, **kwargs):
return _curried_func(*(args+moreargs), **dict(kwargs, **morekwargs))
return _curried
-def memoize(func, cache):
+def memoize(func, cache, num_args):
"""
Wrap a function so that results for any argument tuple are stored in
'cache'. Note that the args to the function must be usable as dictionary
keys.
+
+ Only the first num_args are considered when creating the key.
"""
def wrapper(*args):
- if args in cache:
- return cache[args]
-
+ mem_args = args[:num_args]
+ if mem_args in cache:
+ return cache[mem_args]
result = func(*args)
- cache[args] = result
+ cache[mem_args] = result
return result
return wrapper
diff --git a/django/utils/html.py b/django/utils/html.py
index 56216b5d48..ebd04d1b3c 100644
--- a/django/utils/html.py
+++ b/django/utils/html.py
@@ -2,8 +2,8 @@
import re
import string
-import urllib
-from django.utils.encoding import force_unicode, smart_str
+
+from django.utils.encoding import force_unicode
from django.utils.functional import allow_lazy
# Configuration for urlize() function
@@ -26,12 +26,12 @@ trailing_empty_content_re = re.compile(r'(?:<p>(?:&nbsp;|\s|<br \/>)*?</p>\s*)+\
del x # Temporary variable
def escape(html):
- "Returns the given HTML with ampersands, quotes and carets encoded"
+ "Return the given HTML with ampersands, quotes and carets encoded."
return force_unicode(html).replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;').replace('"', '&quot;').replace("'", '&#39;')
escape = allow_lazy(escape, unicode)
def linebreaks(value):
- "Converts newlines into <p> and <br />s"
+ "Convert newlines into <p> and <br />s."
value = re.sub(r'\r\n|\r|\n', '\n', force_unicode(value)) # normalize newlines
paras = re.split('\n{2,}', value)
paras = [u'<p>%s</p>' % p.strip().replace('\n', '<br />') for p in paras]
@@ -39,31 +39,32 @@ def linebreaks(value):
linebreaks = allow_lazy(linebreaks, unicode)
def strip_tags(value):
- "Returns the given HTML with all tags stripped"
+ "Return the given HTML with all tags stripped."
return re.sub(r'<[^>]*?>', '', force_unicode(value))
strip_tags = allow_lazy(strip_tags)
def strip_spaces_between_tags(value):
- "Returns the given HTML with spaces between tags removed"
+ "Return the given HTML with spaces between tags removed."
return re.sub(r'>\s+<', '><', force_unicode(value))
strip_spaces_between_tags = allow_lazy(strip_spaces_between_tags, unicode)
def strip_entities(value):
- "Returns the given HTML with all entities (&something;) stripped"
- return re.sub(r'&(?:\w+|#\d);', '', force_unicode(value))
+ "Return the given HTML with all entities (&something;) stripped."
+ return re.sub(r'&(?:\w+|#\d+);', '', force_unicode(value))
strip_entities = allow_lazy(strip_entities, unicode)
def fix_ampersands(value):
- "Returns the given HTML with all unencoded ampersands encoded correctly"
+ "Return the given HTML with all unencoded ampersands encoded correctly."
return unencoded_ampersands_re.sub('&amp;', force_unicode(value))
fix_ampersands = allow_lazy(fix_ampersands, unicode)
def urlize(text, trim_url_limit=None, nofollow=False):
"""
- Converts any URLs in text into clickable links. Works on http://, https://
- and www. links. Links can have trailing punctuation (periods, commas,
- close-parens) and leading punctuation (opening parens) and it'll still do
- the right thing.
+ Convert any URLs in text into clickable links.
+
+ Works on http://, https://, and www. links. Links can have trailing
+ punctuation (periods, commas, close-parens) and leading punctuation
+ (opening parens) and it'll still do the right thing.
If trim_url_limit is not None, the URLs in link text longer than this limit
will truncated to trim_url_limit-3 characters and appended with an elipsis.
@@ -94,14 +95,14 @@ urlize = allow_lazy(urlize, unicode)
def clean_html(text):
"""
- Cleans the given HTML. Specifically, it does the following:
- * Converts <b> and <i> to <strong> and <em>.
- * Encodes all ampersands correctly.
- * Removes all "target" attributes from <a> tags.
- * Removes extraneous HTML, such as presentational tags that open and
+ Clean the given HTML. Specifically, do the following:
+ * Convert <b> and <i> to <strong> and <em>.
+ * Encode all ampersands correctly.
+ * Remove all "target" attributes from <a> tags.
+ * Remove extraneous HTML, such as presentational tags that open and
immediately close and <br clear="all">.
- * Converts hard-coded bullets into HTML unordered lists.
- * Removes stuff like "<p>&nbsp;&nbsp;</p>", but only if it's at the
+ * Convert hard-coded bullets into HTML unordered lists.
+ * Remove stuff like "<p>&nbsp;&nbsp;</p>", but only if it's at the
bottom of the text.
"""
from django.utils.text import normalize_newlines
@@ -120,8 +121,8 @@ def clean_html(text):
s = s.replace('<p>%s' % d, '<li>')
return u'<ul>\n%s\n</ul>' % s
text = hard_coded_bullets_re.sub(replace_p_tags, text)
- # Remove stuff like "<p>&nbsp;&nbsp;</p>", but only if it's at the bottom of the text.
+ # Remove stuff like "<p>&nbsp;&nbsp;</p>", but only if it's at the bottom
+ # of the text.
text = trailing_empty_content_re.sub('', text)
return text
clean_html = allow_lazy(clean_html, unicode)
-
diff --git a/django/utils/http.py b/django/utils/http.py
index 5a0c18d1c0..4c3b6af868 100644
--- a/django/utils/http.py
+++ b/django/utils/http.py
@@ -30,6 +30,9 @@ def urlencode(query, doseq=0):
"""
if hasattr(query, 'items'):
query = query.items()
- return urllib.urlencode([(smart_str(k), smart_str(v)) for k,
- v in query], doseq)
+ return urllib.urlencode(
+ [(smart_str(k),
+ isinstance(v, (list,tuple)) and [smart_str(i) for i in v] or smart_str(v))
+ for k, v in query],
+ doseq)
diff --git a/django/utils/maxlength.py b/django/utils/maxlength.py
new file mode 100644
index 0000000000..9216fe1c3a
--- /dev/null
+++ b/django/utils/maxlength.py
@@ -0,0 +1,67 @@
+"""
+Utilities for providing backwards compatibility for the maxlength argument,
+which has been replaced by max_length, see ticket #2101.
+"""
+
+from warnings import warn
+
+def get_maxlength(self):
+ return self.max_length
+
+def set_maxlength(self, value):
+ self.max_length = value
+
+def legacy_maxlength(max_length, maxlength):
+ """
+ Consolidates max_length and maxlength, providing backwards compatibilty
+ for the legacy "maxlength" argument.
+ If one of max_length or maxlength is given, then that value is returned.
+ If both are given, a TypeError is raised.
+ If maxlength is used at all, a deprecation warning is issued.
+ """
+ if maxlength is not None:
+ warn("maxlength is deprecated, use max_length instead.",
+ PendingDeprecationWarning,
+ stacklevel=3)
+ if max_length is not None:
+ raise TypeError("field can not take both the max_length"
+ " argument and the legacy maxlength argument.")
+ max_length = maxlength
+ return max_length
+
+def remove_maxlength(func):
+ """
+ A decorator to be used on a class's __init__ that provides backwards
+ compatibilty for the legacy "maxlength" keyword argument, i.e.
+ name = models.CharField(maxlength=20)
+ It does this by changing the passed "maxlength" keyword argument
+ (if it exists) into a "max_length" keyword argument.
+ """
+ def inner(self, *args, **kwargs):
+ max_length = kwargs.get('max_length', None)
+ # pop maxlength because we don't want this going to __init__.
+ maxlength = kwargs.pop('maxlength', None)
+ max_length = legacy_maxlength(max_length, maxlength)
+ # Only set the max_length keyword argument if we got a value back.
+ if max_length is not None:
+ kwargs['max_length'] = max_length
+ func(self, *args, **kwargs)
+ return inner
+
+# This metaclass is used in two places, and should be removed when legacy
+# support for maxlength is dropped.
+# * oldforms.FormField
+# * db.models.fields.Field
+
+class LegacyMaxlength(type):
+ """
+ Metaclass for providing backwards compatibility support for the
+ "maxlength" keyword argument.
+ """
+
+ def __init__(cls, name, bases, attrs):
+ super(LegacyMaxlength, cls).__init__(name, bases, attrs)
+ # Decorate the class's __init__ to remove any maxlength keyword.
+ cls.__init__ = remove_maxlength(cls.__init__)
+ # Support accessing and setting to the legacy maxlength attribute.
+ cls.maxlength = property(get_maxlength, set_maxlength)
diff --git a/django/utils/timesince.py b/django/utils/timesince.py
index 8ecf970439..455788e7d7 100644
--- a/django/utils/timesince.py
+++ b/django/utils/timesince.py
@@ -33,16 +33,14 @@ def timesince(d, now=None):
delta = now - (d - datetime.timedelta(0, 0, d.microsecond))
since = delta.days * 24 * 60 * 60 + delta.seconds
for i, (seconds, name) in enumerate(chunks):
- count = since / seconds
+ count = since // seconds
if count != 0:
break
- if count < 0:
- return ugettext('%d milliseconds') % math.floor((now - d).microseconds / 1000)
s = ugettext('%(number)d %(type)s') % {'number': count, 'type': name(count)}
if i + 1 < len(chunks):
# Now get the second item
seconds2, name2 = chunks[i + 1]
- count2 = (since - (seconds * count)) / seconds2
+ count2 = (since - (seconds * count)) // seconds2
if count2 != 0:
s += ugettext(', %(number)d %(type)s') % {'number': count2, 'type': name2(count2)}
return s
diff --git a/docs/add_ons.txt b/docs/add_ons.txt
index ffc4f7420f..8682208970 100644
--- a/docs/add_ons.txt
+++ b/docs/add_ons.txt
@@ -214,7 +214,7 @@ A framework for generating syndication feeds, in RSS and Atom, quite easily.
See the `syndication documentation`_.
-.. _syndication documentation: ../syndication/
+.. _syndication documentation: ../syndication_feeds/
Other add-ons
=============
diff --git a/docs/api_stability.txt b/docs/api_stability.txt
index cfaffeac6b..5ccf104327 100644
--- a/docs/api_stability.txt
+++ b/docs/api_stability.txt
@@ -82,9 +82,6 @@ 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 completely rewritten to
- deemphasize Manipulators in favor of validation-aware models.
-
- `Serialization`_ is under heavy development; changes are likely.
- The `authentication`_ framework is changing to be far more flexible, and
@@ -114,7 +111,7 @@ change:
.. _sending email: ../email/
.. _sessions: ../sessions/
.. _settings: ../settings/
-.. _syndication: ../syndication/
+.. _syndication: ../syndication_feeds/
.. _template language: ../templates/
.. _transactions: ../transactions/
.. _url dispatch: ../url_dispatch/
diff --git a/docs/authentication.txt b/docs/authentication.txt
index efe4d47513..589e8c9f1b 100644
--- a/docs/authentication.txt
+++ b/docs/authentication.txt
@@ -99,7 +99,7 @@ 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. This does not imply any
+ 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.
@@ -114,6 +114,18 @@ custom methods:
string is the correct password for the user. (This takes care of the
password hashing in making the comparison.)
+ * ``set_unusable_password()`` -- **New in Django development version.**
+ Marks the user as having no password set. This isn't the same as having
+ a blank string for a password. ``check_password()`` for this user will
+ never return ``True``. Doesn't save the ``User`` object.
+
+ You may need this if authentication for your application takes place
+ against an existing external source such as an LDAP directory.
+
+ * ``has_usable_password()`` -- **New in Django development version.**
+ Returns ``False`` if ``set_unusable_password()`` has been called for this
+ user.
+
* ``get_group_permissions()`` -- Returns a list of permission strings that
the user has, through his/her groups.
@@ -126,7 +138,7 @@ custom methods:
* ``has_perms(perm_list)`` -- Returns ``True`` if the user has each of the
specified permissions, where each perm is in the format
- ``"package.codename"``. If the user is inactive, this method will
+ ``"package.codename"``. If the user is inactive, this method will
always return ``False``.
* ``has_module_perms(package_name)`` -- Returns ``True`` if the user has
@@ -152,9 +164,11 @@ Manager functions
The ``User`` model has a custom manager that has the following helper functions:
- * ``create_user(username, email, password)`` -- Creates, saves and returns
- a ``User``. The ``username``, ``email`` and ``password`` are set as
- given, and the ``User`` gets ``is_active=True``.
+ * ``create_user(username, email, password=None)`` -- Creates, saves and
+ returns a ``User``. The ``username``, ``email`` and ``password`` are set
+ as given, and the ``User`` gets ``is_active=True``.
+
+ If no password is provided, ``set_unusable_password()`` will be called.
See _`Creating users` for example usage.
@@ -220,7 +234,7 @@ the setting and checking of these values behind the scenes.
Previous Django versions, such as 0.90, used simple MD5 hashes without password
salts. For backwards compatibility, those are still supported; they'll be
-converted automatically to the new style the first time ``check_password()``
+converted automatically to the new style the first time ``User.check_password()``
works correctly for a given user.
Anonymous users
diff --git a/docs/cache.txt b/docs/cache.txt
index e245e100e7..d13352b025 100644
--- a/docs/cache.txt
+++ b/docs/cache.txt
@@ -543,7 +543,7 @@ Order of MIDDLEWARE_CLASSES
If you use ``CacheMiddleware``, it's important to put it in the right place
within the ``MIDDLEWARE_CLASSES`` setting, because the cache middleware needs
to know which headers by which to vary the cache storage. Middleware always
-adds something the ``Vary`` response header when it can.
+adds something to the ``Vary`` response header when it can.
Put the ``CacheMiddleware`` after any middlewares that might add something to
the ``Vary`` header. The following middlewares do so:
diff --git a/docs/contributing.txt b/docs/contributing.txt
index e58b06881a..61c368d32a 100644
--- a/docs/contributing.txt
+++ b/docs/contributing.txt
@@ -279,6 +279,22 @@ Please follow these coding standards when writing code for inclusion in Django:
* Mark all strings for internationalization; see the `i18n documentation`_
for details.
+ * In docstrings, use "action words," like so::
+
+ def foo():
+ """
+ Calculates something and returns the result.
+ """
+ pass
+
+ Here's an example of what not to do::
+
+ def foo():
+ """
+ Calculate something and return the result.
+ """
+ pass
+
* Please don't put your name in the code you contribute. Our policy is to
keep contributors' names in the ``AUTHORS`` file distributed with Django
-- not scattered throughout the codebase itself. Feel free to include a
@@ -324,14 +340,14 @@ Model style
Do this::
class Person(models.Model):
- first_name = models.CharField(maxlength=20)
- last_name = models.CharField(maxlength=40)
+ first_name = models.CharField(max_length=20)
+ last_name = models.CharField(max_length=40)
Don't do this::
class Person(models.Model):
- FirstName = models.CharField(maxlength=20)
- Last_Name = models.CharField(maxlength=40)
+ FirstName = models.CharField(max_length=20)
+ Last_Name = models.CharField(max_length=40)
* The ``class Meta`` should appear *after* the fields are defined, with
a single blank line separating the fields and the class definition.
@@ -339,8 +355,8 @@ Model style
Do this::
class Person(models.Model):
- first_name = models.CharField(maxlength=20)
- last_name = models.CharField(maxlength=40)
+ first_name = models.CharField(max_length=20)
+ last_name = models.CharField(max_length=40)
class Meta:
verbose_name_plural = 'people'
@@ -348,8 +364,8 @@ Model style
Don't do this::
class Person(models.Model):
- first_name = models.CharField(maxlength=20)
- last_name = models.CharField(maxlength=40)
+ first_name = models.CharField(max_length=20)
+ last_name = models.CharField(max_length=40)
class Meta:
verbose_name_plural = 'people'
@@ -359,8 +375,8 @@ Model style
class Meta:
verbose_name_plural = 'people'
- first_name = models.CharField(maxlength=20)
- last_name = models.CharField(maxlength=40)
+ first_name = models.CharField(max_length=20)
+ last_name = models.CharField(max_length=40)
* The order of model inner classes and standard methods should be as
follows (noting that these are not all required):
@@ -529,11 +545,9 @@ To run the tests, ``cd`` to the ``tests/`` directory and type::
./runtests.py --settings=path.to.django.settings
Yes, the unit tests need a settings module, but only for database connection
-info -- the ``DATABASE_NAME`` (required, but will be ignored),
-``DATABASE_ENGINE``, ``DATABASE_USER`` and ``DATABASE_PASSWORD`` settings. 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.
+info, with the ``DATABASE_ENGINE`` setting. You will also need a ``ROOT_URLCONF``
+setting (its value is ignored; it just needs to be present) and a ``SITE_ID``
+setting (any non-zero integer value will do) in order for all the tests to pass.
The unit tests will not touch your existing databases; they create a new
database, called ``django_test_db``, which is deleted when the tests are
diff --git a/docs/databases.txt b/docs/databases.txt
index b73f39843c..ed0cb61bc3 100644
--- a/docs/databases.txt
+++ b/docs/databases.txt
@@ -124,7 +124,7 @@ Several other MySQLdb connection options may be useful, such as ``ssl``,
``use_unicode``, ``init_command``, and ``sql_mode``. Consult the
`MySQLdb documentation`_ for more details.
-.. _settings documentation: http://www.djangoproject.com/documentation/settings/#database-engine
+.. _settings documentation: ../settings/#database-engine
.. _MySQL option file: http://dev.mysql.com/doc/refman/5.0/en/option-files.html
.. _MySQLdb documentation: http://mysql-python.sourceforge.net/
diff --git a/docs/db-api.txt b/docs/db-api.txt
index ef3d811189..766a6ae519 100644
--- a/docs/db-api.txt
+++ b/docs/db-api.txt
@@ -12,22 +12,22 @@ Throughout this reference, we'll refer to the following models, which comprise
a weblog application::
class Blog(models.Model):
- name = models.CharField(maxlength=100)
+ name = models.CharField(max_length=100)
tagline = models.TextField()
def __unicode__(self):
return self.name
class Author(models.Model):
- name = models.CharField(maxlength=50)
- email = models.URLField()
+ name = models.CharField(max_length=50)
+ email = models.EmailField()
def __unicode__(self):
return self.name
class Entry(models.Model):
blog = models.ForeignKey(Blog)
- headline = models.CharField(maxlength=255)
+ headline = models.CharField(max_length=255)
body_text = models.TextField()
pub_date = models.DateTimeField()
authors = models.ManyToManyField(Author)
@@ -118,6 +118,79 @@ happens.
Explicitly specifying auto-primary-key values is mostly useful for bulk-saving
objects, when you're confident you won't have primary-key collision.
+What happens when you save?
+---------------------------
+
+When you save an object, Django performs the following steps:
+
+ 1. **Emit a ``pre_save`` signal.** This provides a notification that
+ an object is about to be saved. You can register a listener that
+ will be invoked whenever this signal is emitted. (These signals are
+ not yet documented.)
+
+ 2. **Pre-process the data.** Each field on the object is asked to
+ perform any automated data modification that the field may need
+ to perform.
+
+ Most fields do *no* pre-processing -- the field data is kept as-is.
+ Pre-processing is only used on fields that have special behavior.
+ For example, if your model has a ``DateField`` with ``auto_now=True``,
+ the pre-save phase will alter the data in the object to ensure that
+ the date field contains the current date stamp. (Our documentation
+ doesn't yet include a list of all the fields with this "special
+ behavior.")
+
+ 3. **Prepare the data for the database.** Each field is asked to provide
+ its current value in a data type that can be written to the database.
+
+ Most fields require *no* data preparation. Simple data types, such as
+ integers and strings, are 'ready to write' as a Python object. However,
+ more complex data types often require some modification.
+
+ For example, ``DateFields`` use a Python ``datetime`` object to store
+ data. Databases don't store ``datetime`` objects, so the field value
+ must be converted into an ISO-compliant date string for insertion
+ into the database.
+
+ 4. **Insert the data into the database.** The pre-processed, prepared
+ data is then composed into an SQL statement for insertion into the
+ database.
+
+ 5. **Emit a ``post_save`` signal.** As with the ``pre_save`` signal, this
+ is used to provide notification that an object has been successfully
+ saved. (These signals are not yet documented.)
+
+Raw Saves
+~~~~~~~~~
+
+**New in Django development version**
+
+The pre-processing step (#2 in the previous section) is useful, but it modifies
+the data stored in a field. This can cause problems if you're relying upon the
+data you provide being used as-is.
+
+For example, if you're setting up conditions for a test, you'll want the test
+conditions to be repeatable. If pre-processing is performed, the data used
+to specify test conditions may be modified, changing the conditions for the
+test each time the test is run.
+
+In cases such as this, you need to prevent pre-processing from being performed
+when you save an object. To do this, you can invoke a **raw save** by passing
+``raw=True`` as an argument to the ``save()`` method::
+
+ b4.save(raw=True) # Save object, but do no pre-processing
+
+A raw save skips the usual data pre-processing that is performed during the
+save. All other steps in the save (pre-save signal, data preparation, data
+insertion, and post-save signal) are performed as normal.
+
+.. admonition:: When to use a raw save
+
+ Generally speaking, you shouldn't need to use a raw save. Disabling field
+ pre-processing is an extraordinary measure that should only be required
+ in extraordinary circumstances, such as setting up reliable test
+ conditions.
+
Saving changes to objects
=========================
@@ -140,7 +213,7 @@ object of the right type to the field in question::
joe = Author.objects.create(name="Joe")
entry.author = joe
entry.save()
-
+
Django will complain if you try to assign an object of the wrong type.
How Django knows to UPDATE vs. INSERT
@@ -336,7 +409,7 @@ For example, this returns the first 5 objects (``LIMIT 5``)::
Entry.objects.all()[:5]
-This returns the fifth through tenth objects (``OFFSET 5 LIMIT 5``)::
+This returns the sixth through tenth objects (``OFFSET 5 LIMIT 5``)::
Entry.objects.all()[5:10]
@@ -1430,7 +1503,7 @@ precede the definition of any keyword arguments. For example::
See the `OR lookups examples page`_ for more examples.
-.. _OR lookups examples page: http://www.djangoproject.com/documentation/models/or_lookups/
+.. _OR lookups examples page: ../models/or_lookups/
Related objects
===============
@@ -1733,8 +1806,8 @@ following model::
('F', 'Female'),
)
class Person(models.Model):
- name = models.CharField(maxlength=20)
- gender = models.CharField(maxlength=1, choices=GENDER_CHOICES)
+ name = models.CharField(max_length=20)
+ gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
...each ``Person`` instance will have a ``get_gender_display()`` method. Example::
@@ -1761,7 +1834,7 @@ Note that in the case of identical date values, these methods will use the ID
as a fallback check. This guarantees that no records are skipped or duplicated.
For a full example, see the `lookup API sample model`_.
-.. _lookup API sample model: http://www.djangoproject.com/documentation/models/lookup/
+.. _lookup API sample model: ../models/lookup/
get_FOO_filename()
------------------
@@ -1818,8 +1891,8 @@ get_object_or_404()
One common idiom to use ``get()`` and raise ``Http404`` if the
object doesn't exist. This idiom is captured by ``get_object_or_404()``.
This function takes a Django model as its first argument and an
-arbitrary number of keyword arguments, which it passes to the manager's
-``get()`` function. It raises ``Http404`` if the object doesn't
+arbitrary number of keyword arguments, which it passes to the default
+manager's ``get()`` function. It raises ``Http404`` if the object doesn't
exist. For example::
# Get the Entry with a primary key of 3
@@ -1828,7 +1901,7 @@ exist. For example::
When you provide a model to this shortcut function, the default manager
is used to execute the underlying ``get()`` query. If you don't want to
use the default manager, or if you want to search a list of related objects,
-you can provide ``get_object_or_404()`` with a manager object instead.
+you can provide ``get_object_or_404()`` with a ``Manager`` object instead.
For example::
# Get the author of blog instance e with a name of 'Fred'
@@ -1838,6 +1911,14 @@ For example::
# entry with a primary key of 3
e = get_object_or_404(Entry.recent_entries, pk=3)
+**New in Django development version:** The first argument to
+``get_object_or_404()`` can be a ``QuerySet`` object. This is useful in cases
+where you've defined a custom manager method. For example::
+
+ # Use a QuerySet returned from a 'published' method of a custom manager
+ # in the search for an entry with primary key of 5
+ e = get_object_or_404(Entry.objects.published(), pk=5)
+
get_list_or_404()
-----------------
diff --git a/docs/distributions.txt b/docs/distributions.txt
index 4ec265f93c..f9b9cbe9f8 100644
--- a/docs/distributions.txt
+++ b/docs/distributions.txt
@@ -21,16 +21,17 @@ Linux distributions
Debian
------
-A `packaged version of Django`_ is available for `Debian GNU/Linux`_, and can be
-installed from either the "testing" or the "unstable" repositories by typing
-``apt-get install python-django``.
+A `packaged version of Django`_ is available for `Debian GNU/Linux`_. Version
+0.95.1 is available in the "stable" repository; Version 0.96 is available in
+the "testing" and "unstable" repositories. Regardless of your chosen repository,
+you can install Django by typing ``apt-get install python-django``.
When you install this package, ``apt`` will recommend installing a database
adapter; you should select and install the adapter for whichever database you
plan to use with Django.
.. _Debian GNU/Linux: http://www.debian.org/
-.. _packaged version of Django: http://packages.debian.org/testing/python/python-django
+.. _packaged version of Django: http://packages.debian.org/stable/python/python-django
Ubuntu
------
@@ -64,11 +65,24 @@ The `current Gentoo build`_ can be installed by typing ``emerge django``.
.. _Gentoo Linux: http://www.gentoo.org/
.. _current Gentoo build: http://packages.gentoo.org/packages/?category=dev-python;name=django
+Mac OS X
+========
+
+MacPorts
+--------
+
+Django 0.96 can be installed via the `MacPorts`_ system. If you're using Python 2.4,
+type ``sudo port install py-django-devel``. For Python 2.5, type ``sudo port
+install py25-django-devel``. MacPorts can also be used to install a database,
+and the Python interface to your chosen database.
+
+.. _MacPorts: http://www.macports.org/
+
For distributors
================
If you'd like to package Django for distribution, we'd be happy to help out!
-Please join the `django-developers mailing list`_ and introduce yourself.
+Please join the `django-developers mailing list`_ and introduce yourself.
We also encourage all distributors to subscribe to the `django-announce mailing
list`_, which is a (very) low-traffic list for announcing new releases of Django
diff --git a/docs/django-admin.txt b/docs/django-admin.txt
index 75c2738543..ad17907b5e 100644
--- a/docs/django-admin.txt
+++ b/docs/django-admin.txt
@@ -400,6 +400,19 @@ install them in the database. This includes any apps shipped with Django that
might be in ``INSTALLED_APPS`` by default. When you start a new project, run
this command to install the default apps.
+.. admonition:: Syncdb will not alter existing tables
+
+ ``syncdb`` will only create tables for models which have not yet been
+ installed. It will *never* issue ``ALTER TABLE`` statements to match
+ changes made to a model class after installation. Changes to model classes
+ and database schemas often involve some form of ambiguity and, in those
+ cases, Django would have to guess at the correct changes to make. There is
+ a risk that critical data would be lost in the process.
+
+ If you have made changes to a model and wish to alter the database tables
+ to match, use the ``sql`` command to display the new SQL structure and
+ compare that to your existing table schema to work out the changes.
+
If you're installing the ``django.contrib.auth`` application, ``syncdb`` will
give you the option of creating a superuser immediately.
diff --git a/docs/email.txt b/docs/email.txt
index 50dafaf8df..97bdec0037 100644
--- a/docs/email.txt
+++ b/docs/email.txt
@@ -314,7 +314,7 @@ To send a text and HTML combination, you could write::
subject, from_email, to = 'hello', 'from@example.com', 'to@example.com'
text_content = 'This is an important message.'
- html_content = '<p>This is an <strong>important</strong> message.'
+ html_content = '<p>This is an <strong>important</strong> message.</p>'
msg = EmailMultiAlternatives(subject, text_content, from_email, to)
msg.attach_alternative(html_content, "text/html")
msg.send()
diff --git a/docs/faq.txt b/docs/faq.txt
index 67ed8a49a5..844ea77809 100644
--- a/docs/faq.txt
+++ b/docs/faq.txt
@@ -42,7 +42,10 @@ Listen to his music. You'll like it.
Django is pronounced **JANG**-oh. Rhymes with FANG-oh. The "D" is silent.
+We've also recorded an `audio clip of the pronunciation`_.
+
.. _Django Reinhardt: http://en.wikipedia.org/wiki/Django_Reinhardt
+.. _audio clip of the pronunciation: http://red-bean.com/~adrian/django_pronunciation.mp3
Is Django stable?
-----------------
diff --git a/docs/fastcgi.txt b/docs/fastcgi.txt
index 81888bba76..dff1689905 100644
--- a/docs/fastcgi.txt
+++ b/docs/fastcgi.txt
@@ -93,7 +93,7 @@ protocol by using the ``protocol=<protocol_name>`` option with
``./manage.py runfcgi`` -- where ``<protocol_name>`` may be one of: ``fcgi``
(the default), ``scgi`` or ``ajp``. For example::
- ./manage.py runfcgi --protocol=scgi
+ ./manage.py runfcgi protocol=scgi
.. _flup: http://www.saddi.com/software/flup/
.. _fastcgi: http://www.fastcgi.com/
diff --git a/docs/forms.txt b/docs/forms.txt
index 18d3d3fcbe..18d322a8eb 100644
--- a/docs/forms.txt
+++ b/docs/forms.txt
@@ -37,11 +37,11 @@ this document, we'll be working with the following model, a "place" object::
)
class Place(models.Model):
- name = models.CharField(maxlength=100)
- address = models.CharField(maxlength=100, blank=True)
- city = models.CharField(maxlength=50, blank=True)
+ name = models.CharField(max_length=100)
+ address = models.CharField(max_length=100, blank=True)
+ city = models.CharField(max_length=50, blank=True)
state = models.USStateField()
- zip_code = models.CharField(maxlength=5, blank=True)
+ zip_code = models.CharField(max_length=5, blank=True)
place_type = models.IntegerField(choices=PLACE_TYPES)
class Admin:
@@ -388,7 +388,7 @@ for a "contact" form on a website::
def __init__(self):
self.fields = (
forms.EmailField(field_name="from", is_required=True),
- forms.TextField(field_name="subject", length=30, maxlength=200, is_required=True),
+ forms.TextField(field_name="subject", length=30, max_length=200, is_required=True),
forms.SelectField(field_name="urgency", choices=urgency_choices),
forms.LargeTextField(field_name="contents", is_required=True),
)
diff --git a/docs/i18n.txt b/docs/i18n.txt
index 9fe02c0342..38252edeb1 100644
--- a/docs/i18n.txt
+++ b/docs/i18n.txt
@@ -263,7 +263,7 @@ To pluralize, specify both the singular and plural forms with the
Internally, all block and inline translations use the appropriate
``ugettext`` / ``ungettext`` call.
-Each ``RequestContext`` has access to two translation-specific variables:
+Each ``RequestContext`` has access to three translation-specific variables:
* ``LANGUAGES`` is a list of tuples in which the first element is the
language code and the second is the language name (in that language).
diff --git a/docs/install.txt b/docs/install.txt
index e850e48955..1b2919f1bc 100644
--- a/docs/install.txt
+++ b/docs/install.txt
@@ -109,25 +109,29 @@ Install the Django code
=======================
Installation instructions are slightly different depending on whether you're
-using the latest official version or the latest development version.
+installing a distribution-specific package, downloading the the latest official
+release, or fetching the latest development version.
-It's easy either way.
+It's easy, no matter which way you choose.
-Installing the official version
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Installing a distribution-specific package
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 1. Check the `distribution specific notes`_ to see if your
- platform/distribution provides official Django packages/installers.
- Distribution-provided packages will typically allow for automatic
- installation of dependancies and easy upgrade paths.
+Check the `distribution specific notes`_ to see if your
+platform/distribution provides official Django packages/installers.
+Distribution-provided packages will typically allow for automatic
+installation of dependancies and easy upgrade paths.
- 2. Download the latest release from our `download page`_.
+Installing an official release
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 3. Untar the downloaded file (e.g. ``tar xzvf Django-NNN.tar.gz``).
+ 1. Download the latest release from our `download page`_.
- 4. Change into the downloaded directory (e.g. ``cd Django-NNN``).
+ 2. Untar the downloaded file (e.g. ``tar xzvf Django-NNN.tar.gz``).
- 5. Run ``sudo python setup.py install``.
+ 3. Change into the downloaded directory (e.g. ``cd Django-NNN``).
+
+ 4. Run ``sudo python setup.py install``.
The command will install Django in your Python installation's ``site-packages``
directory.
diff --git a/docs/middleware.txt b/docs/middleware.txt
index 0d533443d3..533f1ccede 100644
--- a/docs/middleware.txt
+++ b/docs/middleware.txt
@@ -116,6 +116,14 @@ not use this middleware. Anybody can spoof the value of
``HTTP_X_FORWARDED_FOR``, that means anybody can "fake" their IP address. Only
use this when you can absolutely trust the value of ``HTTP_X_FORWARDED_FOR``.
+django.middleware.locale.LocaleMiddleware
+-----------------------------------------
+
+Enables language selection based on data from the request. It customizes content
+for each user. See the `internationalization documentation`_.
+
+.. _`internationalization documentation`: ../i18n/
+
django.contrib.sessions.middleware.SessionMiddleware
----------------------------------------------------
diff --git a/docs/model-api.txt b/docs/model-api.txt
index 4b0bc0d238..ddeb481206 100644
--- a/docs/model-api.txt
+++ b/docs/model-api.txt
@@ -22,7 +22,7 @@ A companion to this document is the `official repository of model examples`_.
``tests/modeltests`` directory.)
.. _Database API reference: ../db-api/
-.. _official repository of model examples: http://www.djangoproject.com/documentation/models/
+.. _official repository of model examples: ../models/
Quick example
=============
@@ -33,8 +33,8 @@ This example model defines a ``Person``, which has a ``first_name`` and
from django.db import models
class Person(models.Model):
- first_name = models.CharField(maxlength=30)
- last_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
+ last_name = models.CharField(max_length=30)
``first_name`` and ``last_name`` are *fields* of the model. Each field is
specified as a class attribute, and each attribute maps to a database column.
@@ -69,13 +69,13 @@ attributes.
Example::
class Musician(models.Model):
- first_name = models.CharField(maxlength=50)
- last_name = models.CharField(maxlength=50)
- instrument = models.CharField(maxlength=100)
+ first_name = models.CharField(max_length=50)
+ last_name = models.CharField(max_length=50)
+ instrument = models.CharField(max_length=100)
class Album(models.Model):
artist = models.ForeignKey(Musician)
- name = models.CharField(maxlength=100)
+ name = models.CharField(max_length=100)
release_date = models.DateField()
num_stars = models.IntegerField()
@@ -142,14 +142,18 @@ For large amounts of text, use ``TextField``.
The admin represents this as an ``<input type="text">`` (a single-line input).
-``CharField`` has an extra required argument, ``maxlength``, the maximum length
-(in characters) of the field. The maxlength is enforced at the database level
+``CharField`` has an extra required argument, ``max_length``, the maximum length
+(in characters) of the field. The max_length is enforced at the database level
and in Django's validation.
+Django veterans: Note that the argument is now called ``max_length`` to
+provide consistency throughout Django. There is full legacy support for
+the old ``maxlength`` argument, but ``max_length`` is prefered.
+
``CommaSeparatedIntegerField``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-A field of integers separated by commas. As in ``CharField``, the ``maxlength``
+A field of integers separated by commas. As in ``CharField``, the ``max_length``
argument is required.
``DateField``
@@ -217,7 +221,7 @@ The admin represents this as an ``<input type="text">`` (a single-line input).
~~~~~~~~~~~~~~
A ``CharField`` that checks that the value is a valid e-mail address.
-This doesn't accept ``maxlength``; its ``maxlength`` is automatically set to
+This doesn't accept ``max_length``; its ``max_length`` is automatically set to
75.
``FileField``
@@ -400,7 +404,7 @@ Like a ``PositiveIntegerField``, but only allows values under a certain
containing only letters, numbers, underscores or hyphens. They're generally
used in URLs.
-Like a CharField, you can specify ``maxlength``. If ``maxlength`` is
+Like a CharField, you can specify ``max_length``. If ``max_length`` is
not specified, Django will use a default length of 50.
Implies ``db_index=True``.
@@ -447,9 +451,9 @@ and doesn't give a 404 response).
The admin represents this as an ``<input type="text">`` (a single-line input).
-``URLField`` takes an optional argument, ``maxlength``, the maximum length (in
-characters) of the field. The maxlength is enforced at the database level and
-in Django's validation. If you don't specify ``maxlength``, a default of 200
+``URLField`` takes an optional argument, ``max_length``, the maximum length (in
+characters) of the field. The maximum length is enforced at the database level and
+in Django's validation. If you don't specify ``max_length``, a default of 200
is used.
``USStateField``
@@ -536,7 +540,7 @@ The choices list can be defined either as part of your model class::
('M', 'Male'),
('F', 'Female'),
)
- gender = models.CharField(maxlength=1, choices=GENDER_CHOICES)
+ gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
or outside your model class altogether::
@@ -545,7 +549,7 @@ or outside your model class altogether::
('F', 'Female'),
)
class Foo(models.Model):
- gender = models.CharField(maxlength=1, choices=GENDER_CHOICES)
+ gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
For each model field that has ``choices`` set, Django will add a method to
retrieve the human-readable name for the field's current value. See
@@ -620,6 +624,12 @@ Extra "help" text to be displayed under the field on the object's admin
form. It's useful for documentation even if your object doesn't have an
admin form.
+Note that this value is *not* HTML-escaped when it's displayed in the admin
+interface. This lets you include HTML in ``help_text`` if you so desire. For
+example::
+
+ help_text="Please use the following format: <em>YYYY-MM-DD</em>."
+
``primary_key``
~~~~~~~~~~~~~~~
@@ -698,11 +708,11 @@ it using the field's attribute name, converting underscores to spaces.
In this example, the verbose name is ``"Person's first name"``::
- first_name = models.CharField("Person's first name", maxlength=30)
+ first_name = models.CharField("Person's first name", max_length=30)
In this example, the verbose name is ``"first name"``::
- first_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
``ForeignKey``, ``ManyToManyField`` and ``OneToOneField`` require the first
argument to be a model class, so use the ``verbose_name`` keyword argument::
@@ -727,7 +737,7 @@ Many-to-one relationships
To define a many-to-one relationship, use ``ForeignKey``. You use it just like
any other ``Field`` type: by including it as a class attribute of your model.
-``ForeignKey`` requires a positional argument: The class to which the model is
+``ForeignKey`` requires a positional argument: the class to which the model is
related.
For example, if a ``Car`` model has a ``Manufacturer`` -- that is, a
@@ -775,7 +785,7 @@ You can, of course, call the field whatever you want. For example::
See the `Many-to-one relationship model example`_ for a full example.
-.. _Many-to-one relationship model example: http://www.djangoproject.com/documentation/models/many_to_one/
+.. _Many-to-one relationship model example: ../models/many_to_one/
``ForeignKey`` fields take a number of extra arguments for defining how the
relationship should work. All are optional:
@@ -862,7 +872,7 @@ To define a many-to-many relationship, use ``ManyToManyField``. You use it just
like any other ``Field`` type: by including it as a class attribute of your
model.
-``ManyToManyField`` requires a positional argument: The class to which the
+``ManyToManyField`` requires a positional argument: the class to which the
model is related.
For example, if a ``Pizza`` has multiple ``Topping`` objects -- that is, a
@@ -902,7 +912,7 @@ set up above, the ``Pizza`` admin form would let users select the toppings.
See the `Many-to-many relationship model example`_ for a full example.
-.. _Many-to-many relationship model example: http://www.djangoproject.com/documentation/models/many_to_many/
+.. _Many-to-many relationship model example: ../models/many_to_many/
``ManyToManyField`` objects take a number of extra arguments for defining how
the relationship should work. All are optional:
@@ -959,7 +969,7 @@ model.
This is most useful on the primary key of an object when that object "extends"
another object in some way.
-``OneToOneField`` requires a positional argument: The class to which the
+``OneToOneField`` requires a positional argument: the class to which the
model is related.
For example, if you're building a database of "places", you would build pretty
@@ -979,7 +989,116 @@ as a read-only field when you edit an object in the admin interface:
See the `One-to-one relationship model example`_ for a full example.
-.. _One-to-one relationship model example: http://www.djangoproject.com/documentation/models/one_to_one/
+.. _One-to-one relationship model example: ../models/one_to_one/
+
+Custom field types
+------------------
+
+**New in Django development version**
+
+Django's built-in field types don't cover every possible database column type --
+only the common types, such as ``VARCHAR`` and ``INTEGER``. For more obscure
+column types, such as geographic polygons or even user-created types such as
+`PostgreSQL custom types`_, you can define your own Django ``Field`` subclasses.
+
+.. _PostgreSQL custom types: http://www.postgresql.org/docs/8.2/interactive/sql-createtype.html
+
+.. admonition:: Experimental territory
+
+ This is an area of Django that traditionally has not been documented, but
+ we're starting to include bits of documentation, one feature at a time.
+ Please forgive the sparseness of this section.
+
+ If you like living on the edge and are comfortable with the risk of
+ unstable, undocumented APIs, see the code for the core ``Field`` class
+ in ``django/db/models/fields/__init__.py`` -- but if/when the innards
+ change, don't say we didn't warn you.
+
+To create a custom field type, simply subclass ``django.db.models.Field``.
+Here is an incomplete list of the methods you should implement:
+
+``db_type()``
+~~~~~~~~~~~~~
+
+Returns the database column data type for the ``Field``, taking into account
+the current ``DATABASE_ENGINE`` setting.
+
+Say you've created a PostgreSQL custom type called ``mytype``. You can use this
+field with Django by subclassing ``Field`` and implementing the ``db_type()``
+method, like so::
+
+ from django.db import models
+
+ class MytypeField(models.Field):
+ def db_type(self):
+ return 'mytype'
+
+Once you have ``MytypeField``, you can use it in any model, just like any other
+``Field`` type::
+
+ class Person(models.Model):
+ name = models.CharField(max_length=80)
+ gender = models.CharField(max_length=1)
+ something_else = MytypeField()
+
+If you aim to build a database-agnostic application, you should account for
+differences in database column types. For example, the date/time column type
+in PostgreSQL is called ``timestamp``, while the same column in MySQL is called
+``datetime``. The simplest way to handle this in a ``db_type()`` method is to
+import the Django settings module and check the ``DATABASE_ENGINE`` setting.
+For example::
+
+ class MyDateField(models.Field):
+ def db_type(self):
+ from django.conf import settings
+ if settings.DATABASE_ENGINE == 'mysql':
+ return 'datetime'
+ else:
+ return 'timestamp'
+
+The ``db_type()`` method is only called by Django when the framework constructs
+the ``CREATE TABLE`` statements for your application -- that is, when you first
+create your tables. It's not called at any other time, so it can afford to
+execute slightly complex code, such as the ``DATABASE_ENGINE`` check in the
+above example.
+
+Some database column types accept parameters, such as ``CHAR(25)``, where the
+parameter ``25`` represents the maximum column length. In cases like these,
+it's more flexible if the parameter is specified in the model rather than being
+hard-coded in the ``db_type()`` method. For example, it wouldn't make much
+sense to have a ``CharMaxlength25Field``, shown here::
+
+ # This is a silly example of hard-coded parameters.
+ class CharMaxlength25Field(models.Field):
+ def db_type(self):
+ return 'char(25)'
+
+ # In the model:
+ class MyModel(models.Model):
+ # ...
+ my_field = CharMaxlength25Field()
+
+The better way of doing this would be to make the parameter specifiable at run
+time -- i.e., when the class is instantiated. To do that, just implement
+``__init__()``, like so::
+
+ # This is a much more flexible example.
+ class BetterCharField(models.Field):
+ def __init__(self, max_length, *args, **kwargs):
+ self.max_length = max_length
+ super(BetterCharField, self).__init__(*args, **kwargs)
+
+ def db_type(self):
+ return 'char(%s)' % self.max_length
+
+ # In the model:
+ class MyModel(models.Model):
+ # ...
+ my_field = BetterCharField(25)
+
+Note that if you implement ``__init__()`` on a ``Field`` subclass, it's
+important to call ``Field.__init__()`` -- i.e., the parent class'
+``__init__()`` method.
Meta options
============
@@ -987,7 +1106,7 @@ Meta options
Give your model metadata by using an inner ``class Meta``, like so::
class Foo(models.Model):
- bar = models.CharField(maxlength=30)
+ bar = models.CharField(max_length=30)
class Meta:
# ...
@@ -1077,7 +1196,7 @@ See `Specifying ordering`_ for more examples.
Note that, regardless of how many fields are in ``ordering``, the admin
site uses only the first field.
-.. _Specifying ordering: http://www.djangoproject.com/documentation/models/ordering/
+.. _Specifying ordering: ../models/ordering/
``permissions``
---------------
@@ -1161,8 +1280,8 @@ If you want your model to be visible to Django's admin site, give your model an
inner ``"class Admin"``, like so::
class Person(models.Model):
- first_name = models.CharField(maxlength=30)
- last_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
+ last_name = models.CharField(max_length=30)
class Admin:
# Admin options go here
@@ -1302,8 +1421,8 @@ that displays the ``__str__()`` representation of each object.
A few special cases to note about ``list_display``:
- * If the field is a ``ForeignKey``, Django will display the ``__str__()``
- of the related object.
+ * If the field is a ``ForeignKey``, Django will display the
+ ``__unicode__()`` of the related object.
* ``ManyToManyField`` fields aren't supported, because that would entail
executing a separate SQL statement for each row in the table. If you
@@ -1321,7 +1440,7 @@ A few special cases to note about ``list_display``:
Here's a full example model::
class Person(models.Model):
- name = models.CharField(maxlength=50)
+ name = models.CharField(max_length=50)
birthday = models.DateField()
class Admin:
@@ -1338,9 +1457,9 @@ A few special cases to note about ``list_display``:
Here's a full example model::
class Person(models.Model):
- first_name = models.CharField(maxlength=50)
- last_name = models.CharField(maxlength=50)
- color_code = models.CharField(maxlength=6)
+ first_name = models.CharField(max_length=50)
+ last_name = models.CharField(max_length=50)
+ color_code = models.CharField(max_length=6)
class Admin:
list_display = ('first_name', 'last_name', 'colored_name')
@@ -1356,7 +1475,7 @@ A few special cases to note about ``list_display``:
Here's a full example model::
class Person(models.Model):
- first_name = models.CharField(maxlength=50)
+ first_name = models.CharField(max_length=50)
birthday = models.DateField()
class Admin:
@@ -1384,8 +1503,8 @@ A few special cases to note about ``list_display``:
For example::
class Person(models.Model):
- first_name = models.CharField(maxlength=50)
- color_code = models.CharField(maxlength=6)
+ first_name = models.CharField(max_length=50)
+ color_code = models.CharField(max_length=6)
class Admin:
list_display = ('first_name', 'colored_first_name')
@@ -1553,7 +1672,7 @@ with an operator:
AND (first_name ILIKE 'lennon' OR last_name ILIKE 'lennon')
Note that the query input is split by spaces, so, following this example,
- it's not currently not possible to search for all records in which
+ it's currently not possible to search for all records in which
``first_name`` is exactly ``'john winston'`` (containing a space).
``@``
@@ -1635,13 +1754,13 @@ returns a list of all ``OpinionPoll`` objects, each with an extra
return result_list
class OpinionPoll(models.Model):
- question = models.CharField(maxlength=200)
+ question = models.CharField(max_length=200)
poll_date = models.DateField()
objects = PollManager()
class Response(models.Model):
poll = models.ForeignKey(Poll)
- person_name = models.CharField(maxlength=50)
+ person_name = models.CharField(max_length=50)
response = models.TextField()
With this example, you'd use ``OpinionPoll.objects.with_counts()`` to return
@@ -1657,8 +1776,8 @@ A ``Manager``'s base ``QuerySet`` returns all objects in the system. For
example, using this model::
class Book(models.Model):
- title = models.CharField(maxlength=100)
- author = models.CharField(maxlength=50)
+ title = models.CharField(max_length=100)
+ author = models.CharField(max_length=50)
...the statement ``Book.objects.all()`` will return all books in the database.
@@ -1676,8 +1795,8 @@ all objects, and one that returns only the books by Roald Dahl::
# Then hook it into the Book model explicitly.
class Book(models.Model):
- title = models.CharField(maxlength=100)
- author = models.CharField(maxlength=50)
+ title = models.CharField(max_length=100)
+ author = models.CharField(max_length=50)
objects = models.Manager() # The default manager.
dahl_objects = DahlBookManager() # The Dahl-specific manager.
@@ -1710,9 +1829,9 @@ For example::
return super(FemaleManager, self).get_query_set().filter(sex='F')
class Person(models.Model):
- first_name = models.CharField(maxlength=50)
- last_name = models.CharField(maxlength=50)
- sex = models.CharField(maxlength=1, choices=(('M', 'Male'), ('F', 'Female')))
+ first_name = models.CharField(max_length=50)
+ last_name = models.CharField(max_length=50)
+ sex = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female')))
people = models.Manager()
men = MaleManager()
women = FemaleManager()
@@ -1742,11 +1861,11 @@ model.
For example, this model has a few custom methods::
class Person(models.Model):
- first_name = models.CharField(maxlength=50)
- last_name = models.CharField(maxlength=50)
+ first_name = models.CharField(max_length=50)
+ last_name = models.CharField(max_length=50)
birth_date = models.DateField()
- address = models.CharField(maxlength=100)
- city = models.CharField(maxlength=50)
+ address = models.CharField(max_length=100)
+ city = models.CharField(max_length=50)
state = models.USStateField() # Yes, this is America-centric...
def baby_boomer_status(self):
@@ -1788,8 +1907,8 @@ Although this isn't required, it's strongly encouraged (see the description of
For example::
class Person(models.Model):
- first_name = models.CharField(maxlength=50)
- last_name = models.CharField(maxlength=50)
+ first_name = models.CharField(max_length=50)
+ last_name = models.CharField(max_length=50)
def __str__(self):
# Note use of django.utils.encoding.smart_str() here because
@@ -1806,8 +1925,8 @@ method for your model. The example in the previous section could be written
more simply as::
class Person(models.Model):
- first_name = models.CharField(maxlength=50)
- last_name = models.CharField(maxlength=50)
+ first_name = models.CharField(max_length=50)
+ last_name = models.CharField(max_length=50)
def __unicode__(self):
return u'%s %s' % (self.first_name, self.last_name)
@@ -1833,10 +1952,12 @@ Django uses this in its admin interface. If an object defines
link that will jump you directly to the object's public view, according to
``get_absolute_url()``.
-Also, a couple of other bits of Django, such as the syndication-feed framework,
+Also, a couple of other bits of Django, such as the `syndication feed framework`_,
use ``get_absolute_url()`` as a convenience to reward people who've defined the
method.
+.. _syndication feed framework: ../syndication_feeds/
+
It's good practice to use ``get_absolute_url()`` in templates, instead of
hard-coding your objects' URLs. For example, this template code is bad::
@@ -1871,7 +1992,7 @@ works out the correct full URL path using the URLconf, substituting the
parameters you have given into the URL. For example, if your URLconf
contained a line such as::
- (r'^/people/(\d+)/$', 'people.views.details'),
+ (r'^people/(\d+)/$', 'people.views.details'),
...your model could have a ``get_absolute_url`` method that looked like this::
@@ -1894,8 +2015,8 @@ Similarly, if you had a URLconf entry that looked like::
'day': self.created.day})
get_absolute_url = permalink(get_absolute_url)
-Notice that we specify an empty sequence for the second argument in this case,
-because we only want to pass keyword arguments, not named arguments.
+Notice that we specify an empty sequence for the second parameter in this case,
+because we only want to pass keyword parameters, not positional ones.
In this way, you're tying the model's absolute URL to the view that is used
to display it, without repeating the URL information anywhere. You can still
@@ -1947,7 +2068,7 @@ A classic use-case for overriding the built-in methods is if you want something
to happen whenever you save an object. For example::
class Blog(models.Model):
- name = models.CharField(maxlength=100)
+ name = models.CharField(max_length=100)
tagline = models.TextField()
def save(self):
@@ -1958,7 +2079,7 @@ to happen whenever you save an object. For example::
You can also prevent saving::
class Blog(models.Model):
- name = models.CharField(maxlength=100)
+ name = models.CharField(max_length=100)
tagline = models.TextField()
def save(self):
diff --git a/docs/modpython.txt b/docs/modpython.txt
index 388a6168f3..676aab19ac 100644
--- a/docs/modpython.txt
+++ b/docs/modpython.txt
@@ -50,8 +50,8 @@ directive. The latter is used for pointing at places on your filesystem,
whereas ``<Location>`` points at places in the URL structure of a Web site.
``<Directory>`` would be meaningless here.
-Also, if you've manually altered your ``PYTHONPATH`` to put your Django project
-on it, you'll need to tell mod_python:
+Also, if your Django project is not on the default ``PYTHONPATH`` for your
+computer, you'll have to tell mod_python where your project can be found:
.. parsed-literal::
diff --git a/docs/newforms.txt b/docs/newforms.txt
index c2e08c63b9..acc28604df 100644
--- a/docs/newforms.txt
+++ b/docs/newforms.txt
@@ -641,7 +641,7 @@ the "Outputting forms as HTML" section above.
The simplest way to display a form's HTML is to use the variable on its own,
like this::
- <form method="post">
+ <form method="post" action="">
<table>{{ form }}</table>
<input type="submit" />
</form>
@@ -653,7 +653,7 @@ class' ``__str__()`` method calls its ``as_table()`` method.
The following is equivalent but a bit more explicit::
- <form method="post">
+ <form method="post" action="">
<table>{{ form.as_table }}</table>
<input type="submit" />
</form>
@@ -675,7 +675,7 @@ individual fields for complete template control over the form's design.
The easiest way is to iterate over the form's fields, with
``{% for field in form %}``. For example::
- <form method="post">
+ <form method="post" action="">
<dl>
{% for field in form %}
<dt>{{ field.label }}</dt>
@@ -696,7 +696,7 @@ Alternatively, you can arrange the form's fields explicitly, by name. Do that
by accessing ``{{ form.fieldname }}``, where ``fieldname`` is the field's name.
For example::
- <form method="post">
+ <form method="post" action="">
<ul class="myformclass">
<li>{{ form.sender.label }} {{ form.sender }}</li>
<li class="helptext">{{ form.sender.help_text }}</li>
@@ -710,6 +710,49 @@ For example::
</ul>
</form>
+Binding uploaded files to a form
+--------------------------------
+
+**New in Django development version**
+
+Dealing with forms that have ``FileField`` and ``ImageField`` fields
+is a little more complicated than a normal form.
+
+Firstly, in order to upload files, you'll need to make sure that your
+``<form>`` element correctly defines the ``enctype`` as
+``"multipart/form-data"``::
+
+ <form enctype="multipart/form-data" method="post" action="/foo/">
+
+Secondly, when you use the form, you need to bind the file data. File
+data is handled separately to normal form data, so when your form
+contains a ``FileField`` and ``ImageField``, you will need to specify
+a second argument when you bind your form. So if we extend our
+ContactForm to include an ``ImageField`` called ``mugshot``, we
+need to bind the file data containing the mugshot image::
+
+ # Bound form with an image field
+ >>> data = {'subject': 'hello',
+ ... 'message': 'Hi there',
+ ... 'sender': 'foo@example.com',
+ ... 'cc_myself': True}
+ >>> file_data = {'mugshot': {'filename':'face.jpg'
+ ... 'content': <file data>}}
+ >>> f = ContactFormWithMugshot(data, file_data)
+
+In practice, you will usually specify ``request.FILES`` as the source
+of file data (just like you use ``request.POST`` as the source of
+form data)::
+
+ # Bound form with an image field, data from the request
+ >>> f = ContactFormWithMugshot(request.POST, request.FILES)
+
+Constructing an unbound form is the same as always -- just omit both
+form data *and* file data::
+
+ # Unbound form with a image field
+ >>> f = ContactFormWithMugshot()
+
Subclassing forms
-----------------
@@ -1099,6 +1142,54 @@ Has two optional arguments for validation, ``max_length`` and ``min_length``.
If provided, these arguments ensure that the string is at most or at least the
given length.
+``FileField``
+~~~~~~~~~~~~~
+
+**New in Django development version**
+
+ * Default widget: ``FileInput``
+ * Empty value: ``None``
+ * Normalizes to: An ``UploadedFile`` object that wraps the file content
+ and file name into a single object.
+ * Validates that non-empty file data has been bound to the form.
+
+An ``UploadedFile`` object has two attributes:
+
+ ====================== =====================================================
+ Argument Description
+ ====================== =====================================================
+ ``filename`` The name of the file, provided by the uploading
+ client.
+ ``content`` The array of bytes comprising the file content.
+ ====================== =====================================================
+
+The string representation of an ``UploadedFile`` is the same as the filename
+attribute.
+
+When you use a ``FileField`` on a form, you must also remember to
+`bind the file data to the form`_.
+
+.. _`bind the file data to the form`: `Binding uploaded files to a form`_
+
+``ImageField``
+~~~~~~~~~~~~~~
+
+**New in Django development version**
+
+ * Default widget: ``FileInput``
+ * Empty value: ``None``
+ * Normalizes to: An ``UploadedFile`` object that wraps the file content
+ and file name into a single object.
+ * Validates that file data has been bound to the form, and that the
+ file is of an image format understood by PIL.
+
+Using an ImageField requires that the `Python Imaging Library`_ is installed.
+
+When you use a ``FileField`` on a form, you must also remember to
+`bind the file data to the form`_.
+
+.. _Python Imaging Library: http://www.pythonware.com/products/pil/
+
``IntegerField``
~~~~~~~~~~~~~~~~
@@ -1222,7 +1313,7 @@ Custom form and field validation
Form validation happens when the data is cleaned. If you want to customise
this process, there are various places you can change, each one serving a
-different purpose. Thee types of cleaning methods are run during form
+different purpose. Three types of cleaning methods are run during form
processing. These are normally executed when you call the ``is_valid()``
method on a form. There are other things that can trigger cleaning and
validation (accessing the ``errors`` attribute or calling ``full_clean()``
@@ -1372,17 +1463,17 @@ the full list of conversions:
``AutoField`` Not represented in the form
``BooleanField`` ``BooleanField``
``CharField`` ``CharField`` with ``max_length`` set to
- the model field's ``maxlength``
+ the model field's ``max_length``
``CommaSeparatedIntegerField`` ``CharField``
``DateField`` ``DateField``
``DateTimeField`` ``DateTimeField``
``DecimalField`` ``DecimalField``
``EmailField`` ``EmailField``
- ``FileField`` ``CharField``
+ ``FileField`` ``FileField``
``FilePathField`` ``CharField``
``FloatField`` ``FloatField``
``ForeignKey`` ``ModelChoiceField`` (see below)
- ``ImageField`` ``CharField``
+ ``ImageField`` ``ImageField``
``IntegerField`` ``IntegerField``
``IPAddressField`` ``CharField``
``ManyToManyField`` ``ModelMultipleChoiceField`` (see
@@ -1452,15 +1543,15 @@ Consider this set of models::
)
class Author(models.Model):
- name = models.CharField(maxlength=100)
- title = models.CharField(maxlength=3, choices=TITLE_CHOICES)
+ name = models.CharField(max_length=100)
+ title = models.CharField(max_length=3, choices=TITLE_CHOICES)
birth_date = models.DateField(blank=True, null=True)
def __unicode__(self):
return self.name
class Book(models.Model):
- name = models.CharField(maxlength=100)
+ name = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
With these models, a call to ``form_for_model(Author)`` would return a ``Form``
@@ -1495,6 +1586,51 @@ example::
Note that ``save()`` will raise a ``ValueError`` if the data in the form
doesn't validate -- i.e., ``if form.errors``.
+This ``save()`` method accepts an optional ``commit`` keyword argument, which
+accepts either ``True`` or ``False``. If you call ``save()`` with
+``commit=False``, then it will return an object that hasn't yet been saved to
+the database. In this case, it's up to you to call ``save()`` on the resulting
+model instance. This is useful if you want to do custom processing on the
+object before saving it. ``commit`` is ``True`` by default.
+
+Another side effect of using ``commit=False`` is seen when your model has
+a many-to-many relation with another model. If your model has a many-to-many
+relation and you specify ``commit=False`` when you save a form, Django cannot
+immediately save the form data for the many-to-many relation. This is because
+it isn't possible to save many-to-many data for an instance until the instance
+exists in the database.
+
+To work around this problem, every time you save a form using ``commit=False``,
+Django adds a ``save_m2m()`` method to the form created by ``form_for_model``.
+After you've manually saved the instance produced by the form, you can invoke
+``save_m2m()`` to save the many-to-many form data. For example::
+
+ # Create a form instance with POST data.
+ >>> f = AuthorForm(request.POST)
+
+ # Create, but don't save the new author instance.
+ >>> new_author = f.save(commit=False)
+
+ # Modify the author in some way.
+ >>> new_author.some_field = 'some_value'
+
+ # Save the new instance.
+ >>> new_author.save()
+
+ # Now, save the many-to-many data for the form.
+ >>> f.save_m2m()
+
+Calling ``save_m2m()`` is only required if you use ``save(commit=False)``.
+When you use a simple ``save()`` on a form, all data -- including
+many-to-many data -- is saved without the need for any additional method calls.
+For example::
+
+ # Create a form instance with POST data.
+ >>> f = AuthorForm(request.POST)
+
+ # Create and save the new author instance. There's no need to do anything else.
+ >>> new_author = f.save()
+
Using an alternate base class
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/docs/overview.txt b/docs/overview.txt
index 041ad152c7..0fd1be5c85 100644
--- a/docs/overview.txt
+++ b/docs/overview.txt
@@ -25,14 +25,14 @@ far, it's been solving two years' worth of database-schema problems. Here's a
quick example::
class Reporter(models.Model):
- full_name = models.CharField(maxlength=70)
+ full_name = models.CharField(max_length=70)
def __unicode__(self):
return self.full_name
class Article(models.Model):
pub_date = models.DateTimeField()
- headline = models.CharField(maxlength=200)
+ headline = models.CharField(max_length=200)
article = models.TextField()
reporter = models.ForeignKey(Reporter)
@@ -54,7 +54,7 @@ Enjoy the free API
==================
With that, you've got a free, and rich, Python API to access your data. The API
-is created on the fly: No code generation necessary::
+is created on the fly, no code generation necessary::
>>> from mysite.models import Reporter, Article
@@ -124,7 +124,7 @@ is created on the fly: No code generation necessary::
# Delete an object with delete().
>>> r.delete()
-A dynamic admin interface: It's not just scaffolding -- it's the whole house
+A dynamic admin interface: it's not just scaffolding -- it's the whole house
============================================================================
Once your models are defined, Django can automatically create a professional,
@@ -134,7 +134,7 @@ your model classes::
class Article(models.Model):
pub_date = models.DateTimeField()
- headline = models.CharField(maxlength=200)
+ headline = models.CharField(max_length=200)
article = models.TextField()
reporter = models.ForeignKey(Reporter)
class Admin: pass
@@ -165,9 +165,9 @@ example above::
from django.conf.urls.defaults import *
urlpatterns = patterns('',
- (r'^/articles/(\d{4})/$', 'mysite.views.year_archive'),
- (r'^/articles/(\d{4})/(\d{2})/$', 'mysite.views.month_archive'),
- (r'^/articles/(\d{4})/(\d{2})/(\d+)/$', 'mysite.views.article_detail'),
+ (r'^articles/(\d{4})/$', 'mysite.views.year_archive'),
+ (r'^articles/(\d{4})/(\d{2})/$', 'mysite.views.month_archive'),
+ (r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'mysite.views.article_detail'),
)
The code above maps URLs, as simple regular expressions, to the location of
@@ -250,7 +250,7 @@ Finally, Django uses the concept of "template inheritance": That's what the
``{% extends "base.html" %}`` does. It means "First load the template called
'base', which has defined a bunch of blocks, and fill the blocks with the
following blocks." In short, that lets you dramatically cut down on redundancy
-in templates: Each template has to define only what's unique to that template.
+in templates: each template has to define only what's unique to that template.
Here's what the "base.html" template might look like::
@@ -288,14 +288,16 @@ This has been only a quick overview of Django's functionality. Some more useful
features:
* A caching framework that integrates with memcached or other backends.
- * A syndication framework that makes creating RSS and Atom feeds as easy as
+ * A `syndication framework`_ that makes creating RSS and Atom feeds as easy as
writing a small Python class.
* More sexy automatically-generated admin features -- this overview barely
scratched the surface.
+.. _syndication framework: ../syndication_feeds/
+
The next obvious steps are for you to `download Django`_, read `the tutorial`_
and join `the community`_. Thanks for your interest!
.. _download Django: http://www.djangoproject.com/download/
-.. _the tutorial: http://www.djangoproject.com/documentation/tutorial01/
+.. _the tutorial: ../tutorial01/
.. _the community: http://www.djangoproject.com/community/
diff --git a/docs/release_notes_0.95.txt b/docs/release_notes_0.95.txt
index 3709cacf5a..f2ecbb66e6 100644
--- a/docs/release_notes_0.95.txt
+++ b/docs/release_notes_0.95.txt
@@ -114,7 +114,7 @@ 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.
-.. _online: http://www.djangoproject.com/documentation/
+.. _online: http://www.djangoproject.com/documentation/0.95/
.. _Django website: http://www.djangoproject.com/
.. _FAQ: http://www.djangoproject.com/documentation/faq/
.. _django-users: http://groups.google.com/group/django-users
diff --git a/docs/request_response.txt b/docs/request_response.txt
index 0b985d563b..a17a60ff17 100644
--- a/docs/request_response.txt
+++ b/docs/request_response.txt
@@ -297,7 +297,7 @@ In contrast to ``HttpRequest`` objects, which are created automatically by
Django, ``HttpResponse`` objects are your responsibility. Each view you write
is responsible for instantiating, populating and returning an ``HttpResponse``.
-The ``HttpResponse`` class lives at ``django.http.HttpResponse``.
+The ``HttpResponse`` class lives in the ``django.http`` module.
Usage
-----
diff --git a/docs/sitemaps.txt b/docs/sitemaps.txt
index 550f448de1..1d4fba2626 100644
--- a/docs/sitemaps.txt
+++ b/docs/sitemaps.txt
@@ -21,7 +21,7 @@ you express this information in Python code.
It works much like Django's `syndication framework`_. To create a sitemap, just
write a ``Sitemap`` class and point to it in your URLconf_.
-.. _syndication framework: ../syndication/
+.. _syndication framework: ../syndication_feeds/
.. _URLconf: ../url_dispatch/
Installation
diff --git a/docs/sites.txt b/docs/sites.txt
index 12259b04c3..90a9d0f90f 100644
--- a/docs/sites.txt
+++ b/docs/sites.txt
@@ -46,7 +46,7 @@ that's represented by a ``ManyToManyField`` in the ``Article`` model::
from django.contrib.sites.models import Site
class Article(models.Model):
- headline = models.CharField(maxlength=200)
+ headline = models.CharField(max_length=200)
# ...
sites = models.ManyToManyField(Site)
@@ -87,7 +87,7 @@ like this::
from django.contrib.sites.models import Site
class Article(models.Model):
- headline = models.CharField(maxlength=200)
+ headline = models.CharField(max_length=200)
# ...
site = models.ForeignKey(Site)
@@ -229,7 +229,7 @@ Use ``CurrentSiteManager`` by adding it to your model explicitly. For example::
class Photo(models.Model):
photo = models.FileField(upload_to='/home/photos')
- photographer_name = models.CharField(maxlength=100)
+ photographer_name = models.CharField(max_length=100)
pub_date = models.DateField()
site = models.ForeignKey(Site)
objects = models.Manager()
@@ -257,7 +257,7 @@ this::
class Photo(models.Model):
photo = models.FileField(upload_to='/home/photos')
- photographer_name = models.CharField(maxlength=100)
+ photographer_name = models.CharField(max_length=100)
pub_date = models.DateField()
publish_on = models.ForeignKey(Site)
objects = models.Manager()
@@ -318,5 +318,23 @@ Here's how Django uses the sites framework:
.. _redirects framework: ../redirects/
.. _flatpages framework: ../flatpages/
-.. _syndication framework: ../syndication/
+.. _syndication framework: ../syndication_feeds/
.. _authentication framework: ../authentication/
+
+``RequestSite`` objects
+=======================
+
+**New in Django development version**
+
+Some ``django.contrib`` applications take advantage of the sites framework but
+are architected in a way that doesn't *require* the sites framework to be
+installed in your database. (Some people don't want to, or just aren't *able*
+to install the extra database table that the sites framework requires.) For
+those cases, the framework provides a ``RequestSite`` class, which can be used
+as a fallback when the database-backed sites framework is not available.
+
+A ``RequestSite`` object has a similar interface to a normal ``Site`` object,
+except its ``__init__()`` method takes an ``HttpRequest`` object. It's able to
+deduce the ``domain`` and ``name`` by looking at the request's domain. It has
+``save()`` and ``delete()`` methods to match the interface of ``Site``, but
+the methods raise ``NotImplementedError``.
diff --git a/docs/static_files.txt b/docs/static_files.txt
index b6a1d278fd..846c3eb56b 100644
--- a/docs/static_files.txt
+++ b/docs/static_files.txt
@@ -103,10 +103,10 @@ Do this by wrapping an ``if DEBUG`` statement around the
from django.conf import settings
urlpatterns = patterns('',
- (r'^/articles/2003/$', 'news.views.special_case_2003'),
- (r'^/articles/(?P<year>\d{4})/$', 'news.views.year_archive'),
- (r'^/articles/(?P<year>\d{4})/(?P<month>\d{2})/$', 'news.views.month_archive'),
- (r'^/articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d+)/$', 'news.views.article_detail'),
+ (r'^articles/2003/$', 'news.views.special_case_2003'),
+ (r'^articles/(?P<year>\d{4})/$', 'news.views.year_archive'),
+ (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', 'news.views.month_archive'),
+ (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d+)/$', 'news.views.article_detail'),
)
if settings.DEBUG:
diff --git a/docs/syndication_feeds.txt b/docs/syndication_feeds.txt
index 2a03e6d5a6..393572f3e2 100644
--- a/docs/syndication_feeds.txt
+++ b/docs/syndication_feeds.txt
@@ -31,6 +31,12 @@ To create a feed, just write a ``Feed`` class and point to it in your URLconf_.
Initialization
--------------
+If you're not using the latest Django development version, you'll need to make
+sure Django's sites framework is installed -- including its database table.
+(See the `sites framework documentation`_ for more information.) This has
+changed in the Django development version; the syndication feed framework no
+longer requires the sites framework.
+
To activate syndication feeds on your Django site, add this line to your
URLconf_::
@@ -72,6 +78,7 @@ The above example registers two feeds:
Once that's set up, you just need to define the ``Feed`` classes themselves.
+.. _sites framework documentation: ../sites/
.. _URLconf: ../url_dispatch/
.. _settings file: ../settings/
@@ -131,9 +138,14 @@ put into those elements.
* ``{{ obj }}`` -- The current object (one of whichever objects you
returned in ``items()``).
- * ``{{ site }}`` -- A ``django.models.core.sites.Site`` object
+ * ``{{ site }}`` -- A ``django.contrib.sites.models.Site`` object
representing the current site. This is useful for
- ``{{ site.domain }}`` or ``{{ site.name }}``.
+ ``{{ site.domain }}`` or ``{{ site.name }}``. Note that if you're
+ using the latest Django development version and do *not* have the
+ Django sites framework installed, this will be set to a
+ ``django.contrib.sites.models.RequestSite`` object. See the
+ `RequestSite section of the sites framework documentation`_ for
+ more.
If you don't create a template for either the title or description, the
framework will use the template ``"{{ obj }}"`` by default -- that is,
@@ -164,6 +176,7 @@ put into those elements.
.. _chicagocrime.org: http://www.chicagocrime.org/
.. _object-relational mapper: ../db-api/
.. _Django templates: ../templates/
+.. _RequestSite section of the sites framework documentation: ../sites/#requestsite-objects
A complex example
-----------------
@@ -416,6 +429,26 @@ This example illustrates all possible attributes and methods for a ``Feed`` clas
link = '/foo/bar/' # Hard-coded link.
+ # GUID -- One of the following three is optional. The framework looks
+ # for them in this order. This property is only used for Atom feeds
+ # (where it is the feed-level ID element). If not provided, the feed
+ # link is used as the ID.
+ #
+ # (New in Django development version)
+
+ def feed_guid(self, obj):
+ """
+ Takes the object returned by get_object() and returns the globally
+ unique ID for the feed as a normal Python string.
+ """
+
+ def feed_guid(self):
+ """
+ Returns the feed's globally unique ID as a normal Python string.
+ """
+
+ feed_guid = '/foo/bar/1234' # Hard-coded guid.
+
# DESCRIPTION -- One of the following three is required. The framework
# looks for them in this order.
@@ -556,7 +589,18 @@ This example illustrates all possible attributes and methods for a ``Feed`` clas
Returns the URL for every item in the feed.
"""
- # ITEM AUTHOR NAME --One of the following three is optional. The
+ # ITEM_GUID -- The following method is optional. This property is
+ # only used for Atom feeds (it is the ID element for an item in an
+ # Atom feed). If not provided, the item's link is used by default.
+ #
+ # (New in Django development version)
+
+ def item_guid(self, obj):
+ """
+ Takes an item, as return by items(), and returns the item's ID.
+ """
+
+ # ITEM AUTHOR NAME -- One of the following three is optional. The
# framework looks for them in this order.
def item_author_name(self, item):
diff --git a/docs/templates.txt b/docs/templates.txt
index f5ed1fe74b..0d53c281d1 100644
--- a/docs/templates.txt
+++ b/docs/templates.txt
@@ -741,8 +741,19 @@ regroup
Regroup a list of alike objects by a common attribute.
This complex tag is best illustrated by use of an example: say that ``people``
-is a list of ``Person`` objects that have ``first_name``, ``last_name``, and
-``gender`` attributes, and you'd like to display a list that looks like:
+is a list of people represented by dictionaries with ``first_name``,
+``last_name``, and ``gender`` keys::
+
+ people = [
+ {'first_name': 'George', 'last_name': 'Bush', 'gender': 'Male'},
+ {'first_name': 'Bill', 'last_name': 'Clinton', 'gender': 'Male'},
+ {'first_name': 'Margaret', 'last_name': 'Thatcher', 'gender': 'Female'},
+ {'first_name': 'Condoleezza', 'last_name': 'Rice', 'gender': 'Female'},
+ {'first_name': 'Pat', 'last_name': 'Smith', 'gender': 'Unknown'},
+ ]
+
+...and you'd like to display a hierarchical list that is ordered by gender,
+like this:
* Male:
* George Bush
@@ -753,33 +764,72 @@ is a list of ``Person`` objects that have ``first_name``, ``last_name``, and
* Unknown:
* Pat Smith
-The following snippet of template code would accomplish this dubious task::
+You can use the ``{% regroup %}`` tag to group the list of people by gender.
+The following snippet of template code would accomplish this::
+
+ {% regroup people by gender as gender_list %}
- {% regroup people by gender as grouped %}
<ul>
- {% for group in grouped %}
- <li>{{ group.grouper }}
+ {% for gender in gender_list %}
+ <li>{{ gender.grouper }}
<ul>
- {% for item in group.list %}
- <li>{{ item }}</li>
+ {% for item in gender.list %}
+ <li>{{ item.first_name }} {{ item.last_name }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
-As you can see, ``{% regroup %}`` populates a variable with a list of objects
-with ``grouper`` and ``list`` attributes. ``grouper`` contains the item that
-was grouped by; ``list`` contains the list of objects that share that
-``grouper``. In this case, ``grouper`` would be ``Male``, ``Female`` and
-``Unknown``, and ``list`` is the list of people with those genders.
+Let's walk through this example. ``{% regroup %}`` takes three arguments: the
+list you want to regroup, the attribute to group by, and the name of the
+resulting list. Here, we're regrouping the ``people`` list by the ``gender``
+attribute and calling the result ``gender_list``.
+
+``{% regroup %}`` produces a list (in this case, ``gender_list``) of
+**group objects**. Each group object has two attributes:
+
+ * ``grouper`` -- the item that was grouped by (e.g., the string "Male" or
+ "Female").
+ * ``list`` -- a list of all items in this group (e.g., a list of all people
+ with gender='Male').
+
+Note that ``{% regroup %}`` does not order its input! Our example relies on
+the fact that the ``people`` list was ordered by ``gender`` in the first place.
+If the ``people`` list did *not* order its members by ``gender``, the regrouping
+would naively display more than one group for a single gender. For example,
+say the ``people`` list was set to this (note that the males are not grouped
+together)::
+
+ people = [
+ {'first_name': 'Bill', 'last_name': 'Clinton', 'gender': 'Male'},
+ {'first_name': 'Pat', 'last_name': 'Smith', 'gender': 'Unknown'},
+ {'first_name': 'Margaret', 'last_name': 'Thatcher', 'gender': 'Female'},
+ {'first_name': 'George', 'last_name': 'Bush', 'gender': 'Male'},
+ {'first_name': 'Condoleezza', 'last_name': 'Rice', 'gender': 'Female'},
+ ]
+
+With this input for ``people``, the example ``{% regroup %}`` template code
+above would result in the following output:
+
+ * Male:
+ * Bill Clinton
+ * Unknown:
+ * Pat Smith
+ * Female:
+ * Margaret Thatcher
+ * Male:
+ * George Bush
+ * Female:
+ * Condoleezza Rice
+
+The easiest solution to this gotcha is to make sure in your view code that the
+data is ordered according to how you want to display it.
-Note that ``{% regroup %}`` does not work when the list to be grouped is not
-sorted by the key you are grouping by! This means that if your list of people
-was not sorted by gender, you'd need to make sure it is sorted before using it,
-i.e.::
+Another solution is to sort the data in the template using the ``dictsort``
+filter, if your data is in a list of dictionaries::
- {% regroup people|dictsort:"gender" by gender as grouped %}
+ {% regroup people|dictsort:"gender" by gender as gender_list %}
spaceless
~~~~~~~~~
@@ -950,7 +1000,7 @@ Removes all values of arg from the given string.
date
~~~~
-Formats a date according to the given format (same as the ``now`` tag).
+Formats a date according to the given format (same as the `now`_ tag).
default
~~~~~~~
@@ -965,14 +1015,14 @@ If value is ``None``, use given default.
dictsort
~~~~~~~~
-Takes a list of dicts, returns that list sorted by the property given in the
-argument.
+Takes a list of dictionaries, returns that list sorted by the key given in
+the argument.
dictsortreversed
~~~~~~~~~~~~~~~~
-Takes a list of dicts, returns that list sorted in reverse order by the
-property given in the argument.
+Takes a list of dictionaries, returns that list sorted in reverse order by the
+key given in the argument.
divisibleby
~~~~~~~~~~~
@@ -1189,7 +1239,10 @@ Strips all [X]HTML tags.
time
~~~~
-Formats a time according to the given format (same as the ``now`` tag).
+Formats a time according to the given format (same as the `now`_ tag).
+The time filter will only accept parameters in the format string that relate
+to the time of day, not the date (for obvious reasons). If you need to
+format a date, use the `date`_ filter.
timesince
~~~~~~~~~
diff --git a/docs/templates_python.txt b/docs/templates_python.txt
index 821f40fd8d..117656762f 100644
--- a/docs/templates_python.txt
+++ b/docs/templates_python.txt
@@ -674,9 +674,9 @@ If you are writing a template filter which only expects a string as the first
argument, you should use the included decorator ``stringfilter`` which will convert
an object to it's string value before being passed to your function::
- from django import template
+ from django.template.defaultfilters import stringfilter
- @template.stringfilter
+ @stringfilter
def lower(value):
return value.lower()
diff --git a/docs/testing.txt b/docs/testing.txt
index b326e0099d..52285f5e8e 100644
--- a/docs/testing.txt
+++ b/docs/testing.txt
@@ -62,7 +62,7 @@ model-level doctests in the docstring for each model.
For example::
- from django.db import model
+ from django.db import models
class Animal(models.Model):
"""
@@ -79,8 +79,8 @@ For example::
'The cat says "meow"'
"""
- name = models.CharField(maxlength=20)
- sound = models.CharField(maxlength=20)
+ name = models.CharField(max_length=20)
+ sound = models.CharField(max_length=20)
def speak(self):
return 'The %s says "%s"' % (self.name, self.sound)
@@ -118,10 +118,18 @@ An equivalent unittest test case for the above example would look like::
self.assertEquals(self.lion.speak(), 'The lion says "roar"')
self.assertEquals(self.cat.speak(), 'The cat says "meow"')
-When you `run your tests`_, the test utility will find all the test cases
-(that is, subclasses of ``unittest.TestCase``) in ``models.py`` and
-``tests.py``, automatically build a test suite out of those test cases,
-and run that suite.
+When you `run your tests`_, the default behavior of the test utility is
+to find all the test cases (that is, subclasses of ``unittest.TestCase``)
+in ``models.py`` and ``tests.py``, automatically build a test suite out of
+those test cases, and run that suite.
+
+**New in Django development version**
+
+However, if you define a method called ``suite()`` in either ``models.py`` or
+``tests.py``, that method will be used to construct the test suite for that
+module. This follows the `suggested organization`_ for unit tests. See the
+Python documentation for more details on how to construct a complex test
+suite.
For more details about ``unittest``, see the `standard library unittest
documentation`_.
@@ -129,6 +137,7 @@ documentation`_.
.. _unittest: http://docs.python.org/lib/module-unittest.html
.. _standard library unittest documentation: unittest_
.. _run your tests: `Running tests`_
+.. _suggested organization: http://docs.python.org/lib/organizing-tests.html
Which should I use?
-------------------
@@ -441,6 +450,9 @@ look like::
def setUp(self):
# test definitions as before
+ def testFluffyAnimals(self):
+ # A test that uses the fixtures
+
At the start of each test case, before ``setUp()`` is run, Django will
flush the database, returning the database the state it was in directly
after ``syncdb`` was called. Then, all the named fixtures are installed.
@@ -472,10 +484,11 @@ Normal Python unit tests have a wide range of assertions, such as
``django.TestCase`` adds to these, providing some assertions
that can be useful in testing the behavior of web sites.
-``assertContains(response, text, count=1, status_code=200)``
+``assertContains(response, text, count=None, status_code=200)``
Assert that a response indicates that a page could be retrieved and
- produced the nominated status code, and that ``text`` occurs ``count``
- times in the content of the response.
+ produced the nominated status code, and that ``text`` in the content
+ of the response. If ``count`` is provided, ``text`` must occur exactly
+ ``count`` times in the response.
``assertFormError(response, form, field, errors)``
Assert that a field on a form raised the provided list of errors when
@@ -561,6 +574,18 @@ but you only want to run the animals unit tests, run::
$ ./manage.py test animals
+**New in Django development version:** If you use unit tests, you can be more
+specific in the tests that are executed. To run a single test case in an
+application (for example, the AnimalTestCase described previously), add the
+name of the test case to the label on the command line::
+
+ $ ./manage.py test animals.AnimalTestCase
+
+**New in Django development version:** To run a single test method inside a
+test case, add the name of the test method to the label::
+
+ $ ./manage.py test animals.AnimalTestCase.testFluffyAnimals
+
When you run your tests, you'll see a bunch of text flow by as the test
database is created and models are initialized. This test database is
created from scratch every time you run your tests.
@@ -652,17 +677,36 @@ framework that can be executed from Python code.
Defining a test runner
----------------------
By convention, a test runner should be called ``run_tests``; however, you
-can call it anything you want. The only requirement is that it accept two
-arguments:
+can call it anything you want. The only requirement is that it has the
+same arguments as the Django test runner:
+
+``run_tests(test_labels, verbosity=1, interactive=True, extra_tests=[])``
+
+ **New in Django development version:** ``test_labels`` is a list of
+ strings describing the tests to be run. A test label can take one of
+ three forms:
-``run_tests(module_list, verbosity=1)``
- The module list is the list of Python modules that contain the models to be
- tested. This is the same format returned by ``django.db.models.get_apps()``
+ * ``app.TestCase.test_method`` - Run a single test method in a test case
+ * ``app.TestCase`` - Run all the test methods in a test case
+ * ``app`` - Search for and run all tests in the named application.
+
+ If ``test_labels`` has a value of ``None``, the test runner should run
+ search for tests in all the applications in ``INSTALLED_APPS``.
Verbosity determines the amount of notification and debug information that
will be printed to the console; ``0`` is no output, ``1`` is normal output,
and ``2`` is verbose output.
+ **New in Django development version:** If ``interactive`` is ``True``, the
+ test suite may ask the user for instructions when the test suite is
+ executed. An example of this behavior would be asking for permission to
+ delete an existing test database. If ``interactive`` is ``False``, the
+ test suite must be able to run without any manual intervention.
+
+ ``extra_tests`` is a list of extra ``TestCase`` instances to add to the
+ suite that is executed by the test runner. These extra tests are run
+ in addition to those discovered in the modules listed in ``module_list``.
+
This method should return the number of tests that failed.
Testing utilities
diff --git a/docs/tutorial01.txt b/docs/tutorial01.txt
index aea3af6922..4f39fb4141 100644
--- a/docs/tutorial01.txt
+++ b/docs/tutorial01.txt
@@ -22,10 +22,10 @@ installed.
.. admonition:: Where to get help:
If you're having trouble going through this tutorial, please post a message
- to `django-users`_ or drop by `#django`_ on ``irc.freenode.net`` and we'll
+ to `django-users`_ or drop by `#django`_ on ``irc.freenode.net`` and we'll
try to help.
-.. _django-users: http://groups.google.com/group/django-users
+.. _django-users: http://groups.google.com/group/django-users
.. _#django: irc://irc.freenode.net/django
Creating a project
@@ -42,7 +42,7 @@ code, then run the command ``django-admin.py startproject mysite``. This
will create a ``mysite`` directory in your current directory.
.. note::
-
+
You'll need to avoid naming projects after built-in Python or Django
components. In particular, this means you should avoid using names like
``django`` (which will conflict with Django itself) or ``site`` (which
@@ -251,12 +251,12 @@ These concepts are represented by simple Python classes. Edit the
from django.db import models
class Poll(models.Model):
- question = models.CharField(maxlength=200)
+ question = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
poll = models.ForeignKey(Poll)
- choice = models.CharField(maxlength=200)
+ choice = models.CharField(max_length=200)
votes = models.IntegerField()
The code is straightforward. Each model is represented by a class that
@@ -279,7 +279,7 @@ name for ``Poll.pub_date``. For all other fields in this model, the field's
machine-readable name will suffice as its human-readable name.
Some ``Field`` classes have required elements. ``CharField``, for example,
-requires that you give it a ``maxlength``. That's used not only in the database
+requires that you give it a ``max_length``. That's used not only in the database
schema, but in validation, as we'll soon see.
Finally, note a relationship is defined, using ``models.ForeignKey``. That tells
@@ -321,7 +321,7 @@ Now Django knows ``mysite`` includes the ``polls`` app. Let's run another comman
python manage.py sql polls
-You should see something similar to the following (the CREATE TABLE SQL statements
+You should see something similar to the following (the CREATE TABLE SQL statements
for the polls app)::
BEGIN;
@@ -341,7 +341,7 @@ for the polls app)::
Note the following:
* The exact output will vary depending on the database you are using.
-
+
* Table names are automatically generated by combining the name of the app
(``polls``) and the lowercase name of the model -- ``poll`` and
``choice``. (You can override this behavior.)
@@ -371,8 +371,8 @@ If you're interested, also run the following commands:
construction of your models.
* ``python manage.py sqlcustom polls`` -- Outputs any custom SQL statements
- (such as table modifications or constraints) that are defined for the
- application.
+ (such as table modifications or constraints) that are defined for the
+ application.
* ``python manage.py sqlclear polls`` -- Outputs the necessary ``DROP
TABLE`` statements for this app, according to which tables already exist
@@ -461,10 +461,10 @@ Once you're in the shell, explore the database API::
>>> p.question
"What's up?"
>>> p.pub_date
- datetime.datetime(2005, 7, 15, 12, 00, 53)
+ datetime.datetime(2007, 7, 15, 12, 00, 53)
# Change values by changing the attributes, then calling save().
- >>> p.pub_date = datetime(2005, 4, 1, 0, 0)
+ >>> p.pub_date = datetime(2007, 4, 1, 0, 0)
>>> p.save()
# objects.all() displays all the polls in the database.
@@ -494,19 +494,19 @@ admin.
.. admonition:: Why ``__unicode__()`` and not ``__str__()``?
- If you're familiar with Python, you might be in the habit of adding
- ``__str__()`` methods to your classes, not ``__unicode__()`` methods.
+ If you're familiar with Python, you might be in the habit of adding
+ ``__str__()`` methods to your classes, not ``__unicode__()`` methods.
We use ``__unicode__()`` here because Django models deal with Unicode by
default. All data stored in your database is converted to Unicode when it's
returned.
- Django models have a default ``__str__()`` method that calls ``__unicode__()``
- and converts the result to a UTF-8 bytestring. This means that ``unicode(p)``
- will return a Unicode string, and ``str(p)`` will return a normal string,
- with characters encoded as UTF-8.
+ Django models have a default ``__str__()`` method that calls
+ ``__unicode__()`` and converts the result to a UTF-8 bytestring. This means
+ that ``unicode(p)`` will return a Unicode string, and ``str(p)`` will return
+ a normal string, with characters encoded as UTF-8.
- If all of this is jibberish to you, just remember to add ``__unicode__()``
- methods to your models. With any luck, things should Just Work for you.
+ If all of this is jibberish to you, just remember to add ``__unicode__()``
+ methods to your models. With any luck, things should Just Work for you.
Note these are normal Python methods. Let's add a custom method, just for
demonstration::
@@ -537,9 +537,9 @@ Let's jump back into the Python interactive shell by running
>>> Poll.objects.filter(question__startswith='What')
[<Poll: What's up?>]
- # Get the poll whose year is 2005. Of course, if you're going through this
+ # Get the poll whose year is 2007. Of course, if you're going through this
# tutorial in another year, change as appropriate.
- >>> Poll.objects.get(pub_date__year=2005)
+ >>> Poll.objects.get(pub_date__year=2007)
<Poll: What's up?>
>>> Poll.objects.get(id=2)
@@ -580,9 +580,9 @@ Let's jump back into the Python interactive shell by running
# The API automatically follows relationships as far as you need.
# Use double underscores to separate relationships.
- # This works as many levels deep as you want. There's no limit.
- # Find all Choices for any poll whose pub_date is in 2005.
- >>> Choice.objects.filter(poll__pub_date__year=2005)
+ # This works as many levels deep as you want; there's no limit.
+ # Find all Choices for any poll whose pub_date is in 2007.
+ >>> Choice.objects.filter(poll__pub_date__year=2007)
[<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]
# Let's delete one of the choices. Use delete() for that.
diff --git a/docs/tutorial02.txt b/docs/tutorial02.txt
index 99f586b4a1..d96c38f2bd 100644
--- a/docs/tutorial02.txt
+++ b/docs/tutorial02.txt
@@ -240,7 +240,7 @@ default, provide enough fields for 3 Choices."
Then change the other fields in ``Choice`` to give them ``core=True``::
- choice = models.CharField(maxlength=200, core=True)
+ choice = models.CharField(max_length=200, core=True)
votes = models.IntegerField(core=True)
This tells Django: "When you edit a Choice on the Poll admin page, the 'choice'
@@ -362,8 +362,8 @@ think they should.
Customize the admin look and feel
=================================
-Clearly, having "Django administration" and "example.com" at the top of each
-admin page is ridiculous. It's just placeholder text.
+Clearly, having "Django administration" at the top of each admin page is
+ridiculous. It's just placeholder text.
That's easy to change, though, using Django's template system. The Django admin
is powered by Django itself, and its interfaces use Django's own template
@@ -389,7 +389,7 @@ as above, then copy ``django/contrib/admin/templates/admin/base_site.html`` to
``admin`` subdirectory.
Then, just edit the file and replace the generic Django text with your own
-site's name and URL as you see fit.
+site's name as you see fit.
Note that any of Django's default admin templates can be overridden. To
override a template, just do the same thing you did with ``base_site.html`` --
diff --git a/docs/tutorial03.txt b/docs/tutorial03.txt
index 41febe021d..d49a417dcf 100644
--- a/docs/tutorial03.txt
+++ b/docs/tutorial03.txt
@@ -355,8 +355,9 @@ view code.
Use the template system
=======================
-Back to our ``polls.detail`` view. Given the context variable ``poll``, here's
-what the template might look like::
+Back to the ``detail()`` view for our poll application. Given the context
+variable ``poll``, here's what the "polls/detail.html" template might look
+like::
<h1>{{ poll.question }}</h1>
<ul>
diff --git a/docs/tutorial04.txt b/docs/tutorial04.txt
index 5cc12c445d..553a76e9b1 100644
--- a/docs/tutorial04.txt
+++ b/docs/tutorial04.txt
@@ -8,8 +8,8 @@ application and will focus on simple form processing and cutting down our code.
Write a simple form
===================
-Let's update our poll detail template from the last tutorial, so that the
-template contains an HTML ``<form>`` element::
+Let's update our poll detail template ("polls/detail.html") from the last
+tutorial, so that the template contains an HTML ``<form>`` element::
<h1>{{ poll.question }}</h1>
@@ -193,7 +193,7 @@ Change it like so::
urlpatterns = patterns('',
(r'^$', 'django.views.generic.list_detail.object_list', info_dict),
(r'^(?P<object_id>\d+)/$', 'django.views.generic.list_detail.object_detail', info_dict),
- (r'^(?P<object_id>\d+)/results/$', 'django.views.generic.list_detail.object_detail', dict(info_dict, template_name='polls/results.html')),
+ (r'^(?P<object_id>\d+)/results/$', 'django.views.generic.list_detail.object_detail', dict(info_dict, template_name='polls/results.html'), 'poll_results'),
(r'^(?P<poll_id>\d+)/vote/$', 'mysite.polls.views.vote'),
)
@@ -209,6 +209,12 @@ objects" and "display a detail page for a particular type of object."
from the URL to be called ``"object_id"``, so we've changed ``poll_id`` to
``object_id`` for the generic views.
+ * We've added a name, ``poll_results``, to the results view so that we have
+ a way to refer to its URL later on (see `naming URL patterns`_ for more on
+ named patterns).
+
+.. _naming URL patterns: ../url_dispatch/#naming-url-patterns
+
By default, the ``object_detail`` generic view uses a template called
``<app name>/<model name>_detail.html``. In our case, it'll use the template
``"polls/poll_detail.html"``. Thus, rename your ``polls/detail.html`` template to
@@ -255,6 +261,15 @@ the new templates and context variables. Change the template call from
``polls/detail.html`` to ``polls/poll_detail.html``, and pass ``object`` in the
context instead of ``poll``.
+The last thing to do is fix the URL handling to account for the use of generic
+views. In the vote view above, we used the ``reverse()`` function to avoid
+hard-coding our URLs. Now that we've switched to a generic view, we'll need to
+change the ``reverse()`` call to point back to our new generic view. We can't
+simply use the view function anymore -- generic views can be (and are) used
+multiple times -- but we can use the name we've given::
+
+ return HttpResponseRedirect(reverse('poll_results', args=(p.id,)))
+
Run the server, and use your new polling app based on generic views.
For full details on generic views, see the `generic views documentation`_.
diff --git a/docs/url_dispatch.txt b/docs/url_dispatch.txt
index 402b1200b5..f9723a6a89 100644
--- a/docs/url_dispatch.txt
+++ b/docs/url_dispatch.txt
@@ -317,7 +317,7 @@ Old::
from django.conf.urls.defaults import *
urlpatterns = patterns('',
- (r'^/?$', 'django.views.generic.date_based.archive_index'),
+ (r'^$', 'django.views.generic.date_based.archive_index'),
(r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/$', 'django.views.generic.date_based.archive_month'),
(r'^tag/(?P<tag>\w+)/$', 'weblog.views.tag'),
)
@@ -327,7 +327,7 @@ New::
from django.conf.urls.defaults import *
urlpatterns = patterns('django.views.generic.date_based',
- (r'^/?$', 'archive_index'),
+ (r'^$', 'archive_index'),
(r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/$','archive_month'),
)
@@ -392,7 +392,7 @@ dictionary of extra keyword arguments to pass to the view function.
For example::
urlpatterns = patterns('blog.views',
- (r'^/blog/(?P<year>\d{4})/$', 'year_archive', {'foo': 'bar'}),
+ (r'^blog/(?P<year>\d{4})/$', 'year_archive', {'foo': 'bar'}),
)
In this example, for a request to ``/blog/2005/``, Django will call the
@@ -404,7 +404,7 @@ This technique is used in `generic views`_ and in the `syndication framework`_
to pass metadata and options to views.
.. _generic views: ../generic_views/
-.. _syndication framework: ../syndication/
+.. _syndication framework: ../syndication_feeds/
.. admonition:: Dealing with conflicts
diff --git a/tests/modeltests/basic/models.py b/tests/modeltests/basic/models.py
index 81656cf2df..d2220320a0 100644
--- a/tests/modeltests/basic/models.py
+++ b/tests/modeltests/basic/models.py
@@ -8,7 +8,7 @@ This is a basic model with only two non-primary-key fields.
from django.db import models
class Article(models.Model):
- headline = models.CharField(maxlength=100, default='Default headline')
+ headline = models.CharField(max_length=100, default='Default headline')
pub_date = models.DateTimeField()
class Meta:
diff --git a/tests/modeltests/choices/models.py b/tests/modeltests/choices/models.py
index cb1bd481cd..550e655e46 100644
--- a/tests/modeltests/choices/models.py
+++ b/tests/modeltests/choices/models.py
@@ -17,8 +17,8 @@ GENDER_CHOICES = (
)
class Person(models.Model):
- name = models.CharField(maxlength=20)
- gender = models.CharField(maxlength=1, choices=GENDER_CHOICES)
+ name = models.CharField(max_length=20)
+ gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
def __unicode__(self):
return self.name
diff --git a/tests/modeltests/custom_columns/models.py b/tests/modeltests/custom_columns/models.py
index fb2487802c..e1d0bc6e94 100644
--- a/tests/modeltests/custom_columns/models.py
+++ b/tests/modeltests/custom_columns/models.py
@@ -18,8 +18,8 @@ ManyToMany field. This has no effect on the API for querying the database.
from django.db import models
class Author(models.Model):
- first_name = models.CharField(maxlength=30, db_column='firstname')
- last_name = models.CharField(maxlength=30, db_column='last')
+ first_name = models.CharField(max_length=30, db_column='firstname')
+ last_name = models.CharField(max_length=30, db_column='last')
def __unicode__(self):
return u'%s %s' % (self.first_name, self.last_name)
@@ -29,7 +29,7 @@ class Author(models.Model):
ordering = ('last_name','first_name')
class Article(models.Model):
- headline = models.CharField(maxlength=100)
+ headline = models.CharField(max_length=100)
authors = models.ManyToManyField(Author, db_table='my_m2m_table')
def __unicode__(self):
diff --git a/tests/modeltests/custom_managers/models.py b/tests/modeltests/custom_managers/models.py
index 0b9edc88b9..40bf77e273 100644
--- a/tests/modeltests/custom_managers/models.py
+++ b/tests/modeltests/custom_managers/models.py
@@ -18,8 +18,8 @@ class PersonManager(models.Manager):
return self.filter(fun=True)
class Person(models.Model):
- first_name = models.CharField(maxlength=30)
- last_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
+ last_name = models.CharField(max_length=30)
fun = models.BooleanField()
objects = PersonManager()
@@ -33,8 +33,8 @@ class PublishedBookManager(models.Manager):
return super(PublishedBookManager, self).get_query_set().filter(is_published=True)
class Book(models.Model):
- title = models.CharField(maxlength=50)
- author = models.CharField(maxlength=30)
+ title = models.CharField(max_length=50)
+ author = models.CharField(max_length=30)
is_published = models.BooleanField()
published_objects = PublishedBookManager()
authors = models.ManyToManyField(Person, related_name='books')
@@ -49,7 +49,7 @@ class FastCarManager(models.Manager):
return super(FastCarManager, self).get_query_set().filter(top_speed__gt=150)
class Car(models.Model):
- name = models.CharField(maxlength=10)
+ name = models.CharField(max_length=10)
mileage = models.IntegerField()
top_speed = models.IntegerField(help_text="In miles per hour.")
cars = models.Manager()
diff --git a/tests/modeltests/custom_methods/models.py b/tests/modeltests/custom_methods/models.py
index 5a6581805a..b0ca4131a5 100644
--- a/tests/modeltests/custom_methods/models.py
+++ b/tests/modeltests/custom_methods/models.py
@@ -8,7 +8,7 @@ from django.db import models
import datetime
class Article(models.Model):
- headline = models.CharField(maxlength=100)
+ headline = models.CharField(max_length=100)
pub_date = models.DateField()
def __unicode__(self):
diff --git a/tests/modeltests/custom_pk/models.py b/tests/modeltests/custom_pk/models.py
index 276fecc371..53bbadbfd4 100644
--- a/tests/modeltests/custom_pk/models.py
+++ b/tests/modeltests/custom_pk/models.py
@@ -8,10 +8,10 @@ this behavior by explicitly adding ``primary_key=True`` to a field.
from django.db import models
class Employee(models.Model):
- employee_code = models.CharField(maxlength=10, primary_key=True,
+ employee_code = models.CharField(max_length=10, primary_key=True,
db_column = 'code')
- first_name = models.CharField(maxlength=20)
- last_name = models.CharField(maxlength=20)
+ first_name = models.CharField(max_length=20)
+ last_name = models.CharField(max_length=20)
class Meta:
ordering = ('last_name', 'first_name')
@@ -19,7 +19,7 @@ class Employee(models.Model):
return u"%s %s" % (self.first_name, self.last_name)
class Business(models.Model):
- name = models.CharField(maxlength=20, primary_key=True)
+ name = models.CharField(max_length=20, primary_key=True)
employees = models.ManyToManyField(Employee)
class Meta:
verbose_name_plural = 'businesses'
diff --git a/tests/modeltests/field_defaults/models.py b/tests/modeltests/field_defaults/models.py
index 7eafa03798..23c4733b8f 100644
--- a/tests/modeltests/field_defaults/models.py
+++ b/tests/modeltests/field_defaults/models.py
@@ -13,7 +13,7 @@ from django.db import models
from datetime import datetime
class Article(models.Model):
- headline = models.CharField(maxlength=100, default='Default headline')
+ headline = models.CharField(max_length=100, default='Default headline')
pub_date = models.DateTimeField(default=datetime.now)
def __unicode__(self):
diff --git a/tests/modeltests/fixtures/models.py b/tests/modeltests/fixtures/models.py
index c713aa723d..b59dc82884 100644
--- a/tests/modeltests/fixtures/models.py
+++ b/tests/modeltests/fixtures/models.py
@@ -11,7 +11,7 @@ FIXTURE_DIRS setting.
from django.db import models
class Article(models.Model):
- headline = models.CharField(maxlength=100, default='Default headline')
+ headline = models.CharField(max_length=100, default='Default headline')
pub_date = models.DateTimeField()
def __unicode__(self):
diff --git a/tests/modeltests/generic_relations/models.py b/tests/modeltests/generic_relations/models.py
index d77a2ee43d..ce1d824ca8 100644
--- a/tests/modeltests/generic_relations/models.py
+++ b/tests/modeltests/generic_relations/models.py
@@ -28,8 +28,8 @@ class TaggedItem(models.Model):
return self.tag
class Animal(models.Model):
- common_name = models.CharField(maxlength=150)
- latin_name = models.CharField(maxlength=150)
+ common_name = models.CharField(max_length=150)
+ latin_name = models.CharField(max_length=150)
tags = generic.GenericRelation(TaggedItem)
@@ -37,7 +37,7 @@ class Animal(models.Model):
return self.common_name
class Vegetable(models.Model):
- name = models.CharField(maxlength=150)
+ name = models.CharField(max_length=150)
is_yucky = models.BooleanField(default=True)
tags = generic.GenericRelation(TaggedItem)
@@ -46,7 +46,7 @@ class Vegetable(models.Model):
return self.name
class Mineral(models.Model):
- name = models.CharField(maxlength=150)
+ name = models.CharField(max_length=150)
hardness = models.PositiveSmallIntegerField()
# note the lack of an explicit GenericRelation here...
diff --git a/tests/modeltests/get_latest/models.py b/tests/modeltests/get_latest/models.py
index e54e5e32b7..099f1e28a6 100644
--- a/tests/modeltests/get_latest/models.py
+++ b/tests/modeltests/get_latest/models.py
@@ -11,7 +11,7 @@ into the future."
from django.db import models
class Article(models.Model):
- headline = models.CharField(maxlength=100)
+ headline = models.CharField(max_length=100)
pub_date = models.DateField()
expire_date = models.DateField()
class Meta:
@@ -21,7 +21,7 @@ class Article(models.Model):
return self.headline
class Person(models.Model):
- name = models.CharField(maxlength=30)
+ name = models.CharField(max_length=30)
birthday = models.DateField()
# Note that this model doesn't have "get_latest_by" set.
diff --git a/tests/modeltests/get_object_or_404/models.py b/tests/modeltests/get_object_or_404/models.py
index 5f449f4cfe..bd800317d3 100644
--- a/tests/modeltests/get_object_or_404/models.py
+++ b/tests/modeltests/get_object_or_404/models.py
@@ -3,11 +3,11 @@
get_object_or_404 is a shortcut function to be used in view functions for
performing a get() lookup and raising a Http404 exception if a DoesNotExist
-exception was rasied during the get() call.
+exception was raised during the get() call.
get_list_or_404 is a shortcut function to be used in view functions for
performing a filter() lookup and raising a Http404 exception if a DoesNotExist
-exception was rasied during the filter() call.
+exception was raised during the filter() call.
"""
from django.db import models
@@ -15,7 +15,7 @@ from django.http import Http404
from django.shortcuts import get_object_or_404, get_list_or_404
class Author(models.Model):
- name = models.CharField(maxlength=50)
+ name = models.CharField(max_length=50)
def __unicode__(self):
return self.name
@@ -26,7 +26,7 @@ class ArticleManager(models.Manager):
class Article(models.Model):
authors = models.ManyToManyField(Author)
- title = models.CharField(maxlength=50)
+ title = models.CharField(max_length=50)
objects = models.Manager()
by_a_sir = ArticleManager()
@@ -69,11 +69,28 @@ Http404: No Article matches the given query.
>>> get_object_or_404(Article.by_a_sir, title="Run away!")
<Article: Run away!>
+# QuerySets can be used too.
+>>> get_object_or_404(Article.objects.all(), title__contains="Run")
+<Article: Run away!>
+
+# Just as when using a get() lookup, you will get an error if more than one
+# object is returned.
+>>> get_object_or_404(Author.objects.all())
+Traceback (most recent call last):
+...
+AssertionError: get() returned more than one Author -- it returned ...! Lookup parameters were {}
+
+# Using an EmptyQuerySet raises a Http404 error.
+>>> get_object_or_404(Article.objects.none(), title__contains="Run")
+Traceback (most recent call last):
+...
+Http404: No Article matches the given query.
+
# get_list_or_404 can be used to get lists of objects
>>> get_list_or_404(a.article_set, title__icontains='Run')
[<Article: Run away!>]
-# Http404 is returned if the list is empty
+# Http404 is returned if the list is empty.
>>> get_list_or_404(a.article_set, title__icontains='Shrubbery')
Traceback (most recent call last):
...
@@ -83,4 +100,8 @@ Http404: No Article matches the given query.
>>> get_list_or_404(Article.by_a_sir, title__icontains="Run")
[<Article: Run away!>]
+# QuerySets can be used too.
+>>> get_list_or_404(Article.objects.all(), title__icontains="Run")
+[<Article: Run away!>]
+
"""}
diff --git a/tests/modeltests/get_or_create/models.py b/tests/modeltests/get_or_create/models.py
index ed26daa852..9f025dc582 100644
--- a/tests/modeltests/get_or_create/models.py
+++ b/tests/modeltests/get_or_create/models.py
@@ -8,8 +8,8 @@ parameters. If an object isn't found, it creates one with the given parameters.
from django.db import models
class Person(models.Model):
- first_name = models.CharField(maxlength=100)
- last_name = models.CharField(maxlength=100)
+ first_name = models.CharField(max_length=100)
+ last_name = models.CharField(max_length=100)
birthday = models.DateField()
def __unicode__(self):
diff --git a/tests/modeltests/invalid_models/models.py b/tests/modeltests/invalid_models/models.py
index 90f2f54632..d3d8a6ce45 100644
--- a/tests/modeltests/invalid_models/models.py
+++ b/tests/modeltests/invalid_models/models.py
@@ -5,31 +5,31 @@ This example exists purely to point out errors in models.
"""
from django.db import models
-
+model_errors = ""
class FieldErrors(models.Model):
charfield = models.CharField()
decimalfield = models.DecimalField()
filefield = models.FileField()
- prepopulate = models.CharField(maxlength=10, prepopulate_from='bad')
- choices = models.CharField(maxlength=10, choices='bad')
- choices2 = models.CharField(maxlength=10, choices=[(1,2,3),(1,2,3)])
- index = models.CharField(maxlength=10, db_index='bad')
+ prepopulate = models.CharField(max_length=10, prepopulate_from='bad')
+ choices = models.CharField(max_length=10, choices='bad')
+ choices2 = models.CharField(max_length=10, choices=[(1,2,3),(1,2,3)])
+ index = models.CharField(max_length=10, db_index='bad')
class Target(models.Model):
- tgt_safe = models.CharField(maxlength=10)
- clash1 = models.CharField(maxlength=10)
- clash2 = models.CharField(maxlength=10)
+ tgt_safe = models.CharField(max_length=10)
+ clash1 = models.CharField(max_length=10)
+ clash2 = models.CharField(max_length=10)
- clash1_set = models.CharField(maxlength=10)
+ clash1_set = models.CharField(max_length=10)
class Clash1(models.Model):
- src_safe = models.CharField(maxlength=10, core=True)
+ src_safe = models.CharField(max_length=10, core=True)
foreign = models.ForeignKey(Target)
m2m = models.ManyToManyField(Target)
class Clash2(models.Model):
- src_safe = models.CharField(maxlength=10, core=True)
+ src_safe = models.CharField(max_length=10, core=True)
foreign_1 = models.ForeignKey(Target, related_name='id')
foreign_2 = models.ForeignKey(Target, related_name='src_safe')
@@ -38,7 +38,7 @@ class Clash2(models.Model):
m2m_2 = models.ManyToManyField(Target, related_name='src_safe')
class Target2(models.Model):
- clash3 = models.CharField(maxlength=10)
+ clash3 = models.CharField(max_length=10)
foreign_tgt = models.ForeignKey(Target)
clashforeign_set = models.ForeignKey(Target)
@@ -46,7 +46,7 @@ class Target2(models.Model):
clashm2m_set = models.ManyToManyField(Target)
class Clash3(models.Model):
- src_safe = models.CharField(maxlength=10, core=True)
+ src_safe = models.CharField(max_length=10, core=True)
foreign_1 = models.ForeignKey(Target2, related_name='foreign_tgt')
foreign_2 = models.ForeignKey(Target2, related_name='m2m_tgt')
@@ -61,16 +61,16 @@ class ClashM2M(models.Model):
m2m = models.ManyToManyField(Target2)
class SelfClashForeign(models.Model):
- src_safe = models.CharField(maxlength=10, core=True)
- selfclashforeign = models.CharField(maxlength=10)
+ src_safe = models.CharField(max_length=10, core=True)
+ selfclashforeign = models.CharField(max_length=10)
selfclashforeign_set = models.ForeignKey("SelfClashForeign")
foreign_1 = models.ForeignKey("SelfClashForeign", related_name='id')
foreign_2 = models.ForeignKey("SelfClashForeign", related_name='src_safe')
class ValidM2M(models.Model):
- src_safe = models.CharField(maxlength=10)
- validm2m = models.CharField(maxlength=10)
+ src_safe = models.CharField(max_length=10)
+ validm2m = models.CharField(max_length=10)
# M2M fields are symmetrical by default. Symmetrical M2M fields
# on self don't require a related accessor, so many potential
@@ -84,8 +84,8 @@ class ValidM2M(models.Model):
m2m_4 = models.ManyToManyField('self')
class SelfClashM2M(models.Model):
- src_safe = models.CharField(maxlength=10)
- selfclashm2m = models.CharField(maxlength=10)
+ src_safe = models.CharField(max_length=10)
+ selfclashm2m = models.CharField(max_length=10)
# Non-symmetrical M2M fields _do_ have related accessors, so
# there is potential for clashes.
@@ -100,14 +100,14 @@ class SelfClashM2M(models.Model):
class Model(models.Model):
"But it's valid to call a model Model."
year = models.PositiveIntegerField() #1960
- make = models.CharField(maxlength=10) #Aston Martin
- name = models.CharField(maxlength=10) #DB 4 GT
+ make = models.CharField(max_length=10) #Aston Martin
+ name = models.CharField(max_length=10) #DB 4 GT
class Car(models.Model):
- colour = models.CharField(maxlength=5)
+ colour = models.CharField(max_length=5)
model = models.ForeignKey(Model)
-model_errors = """invalid_models.fielderrors: "charfield": CharFields require a "maxlength" attribute.
+model_errors = """invalid_models.fielderrors: "charfield": CharFields require a "max_length" attribute.
invalid_models.fielderrors: "decimalfield": DecimalFields require a "decimal_places" attribute.
invalid_models.fielderrors: "decimalfield": DecimalFields require a "max_digits" attribute.
invalid_models.fielderrors: "filefield": FileFields require an "upload_to" attribute.
diff --git a/tests/modeltests/lookup/models.py b/tests/modeltests/lookup/models.py
index 207b27a7d9..aa90d1e5ec 100644
--- a/tests/modeltests/lookup/models.py
+++ b/tests/modeltests/lookup/models.py
@@ -8,7 +8,7 @@ from django.db import models
from django.conf import settings
class Article(models.Model):
- headline = models.CharField(maxlength=100)
+ headline = models.CharField(max_length=100)
pub_date = models.DateTimeField()
class Meta:
ordering = ('-pub_date', 'headline')
@@ -132,9 +132,8 @@ True
[('headline', u'Article 7'), ('id', 7)]
[('headline', u'Article 1'), ('id', 1)]
-
-# you can use values() even on extra fields
->>> for d in Article.objects.extra( select={'id_plus_one' : 'id + 1'} ).values('id', 'id_plus_one'):
+# The values() method works with "extra" fields specified in extra(select).
+>>> for d in Article.objects.extra(select={'id_plus_one': 'id + 1'}).values('id', 'id_plus_one'):
... i = d.items()
... i.sort()
... i
@@ -145,15 +144,24 @@ True
[('id', 3), ('id_plus_one', 4)]
[('id', 7), ('id_plus_one', 8)]
[('id', 1), ('id_plus_one', 2)]
+>>> data = {'id_plus_one': 'id+1', 'id_plus_two': 'id+2', 'id_plus_three': 'id+3',
+... 'id_plus_four': 'id+4', 'id_plus_five': 'id+5', 'id_plus_six': 'id+6',
+... 'id_plus_seven': 'id+7', 'id_plus_eight': 'id+8'}
+>>> result = list(Article.objects.filter(id=1).extra(select=data).values(*data.keys()))[0]
+>>> result = result.items()
+>>> result.sort()
+>>> result
+[('id_plus_eight', 9), ('id_plus_five', 6), ('id_plus_four', 5), ('id_plus_one', 2), ('id_plus_seven', 8), ('id_plus_six', 7), ('id_plus_three', 4), ('id_plus_two', 3)]
-# however, an exception FieldDoesNotExist will still be thrown
-# if you try to access non-existent field (field that is neither on the model nor extra)
->>> Article.objects.extra( select={'id_plus_one' : 'id + 1'} ).values('id', 'id_plus_two')
+# However, an exception FieldDoesNotExist will be thrown if you specify a
+# non-existent field name in values() (a field that is neither in the model
+# nor in extra(select)).
+>>> Article.objects.extra(select={'id_plus_one': 'id + 1'}).values('id', 'id_plus_two')
Traceback (most recent call last):
...
FieldDoesNotExist: Article has no field named 'id_plus_two'
-# if you don't specify which fields, all are returned
+# If you don't specify field names to values(), all are returned.
>>> list(Article.objects.filter(id=5).values()) == [{'id': 5, 'headline': 'Article 5', 'pub_date': datetime(2005, 8, 1, 9, 0)}]
True
diff --git a/tests/modeltests/m2m_and_m2o/models.py b/tests/modeltests/m2m_and_m2o/models.py
index b5adc63b9d..0ab7a72d57 100644
--- a/tests/modeltests/m2m_and_m2o/models.py
+++ b/tests/modeltests/m2m_and_m2o/models.py
@@ -7,7 +7,7 @@ Make sure to set ``related_name`` if you use relationships to the same table.
from django.db import models
class User(models.Model):
- username = models.CharField(maxlength=20)
+ username = models.CharField(max_length=20)
class Issue(models.Model):
num = models.IntegerField()
diff --git a/tests/modeltests/m2m_intermediary/models.py b/tests/modeltests/m2m_intermediary/models.py
index 5e56f44872..0f93d5a154 100644
--- a/tests/modeltests/m2m_intermediary/models.py
+++ b/tests/modeltests/m2m_intermediary/models.py
@@ -13,14 +13,14 @@ writer").
from django.db import models
class Reporter(models.Model):
- first_name = models.CharField(maxlength=30)
- last_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
+ last_name = models.CharField(max_length=30)
def __unicode__(self):
return u"%s %s" % (self.first_name, self.last_name)
class Article(models.Model):
- headline = models.CharField(maxlength=100)
+ headline = models.CharField(max_length=100)
pub_date = models.DateField()
def __unicode__(self):
@@ -29,7 +29,7 @@ class Article(models.Model):
class Writer(models.Model):
reporter = models.ForeignKey(Reporter)
article = models.ForeignKey(Article)
- position = models.CharField(maxlength=100)
+ position = models.CharField(max_length=100)
def __unicode__(self):
return u'%s (%s)' % (self.reporter, self.position)
diff --git a/tests/modeltests/m2m_multiple/models.py b/tests/modeltests/m2m_multiple/models.py
index 78c35aafc2..26a0a2e798 100644
--- a/tests/modeltests/m2m_multiple/models.py
+++ b/tests/modeltests/m2m_multiple/models.py
@@ -10,7 +10,7 @@ Set ``related_name`` to designate what the reverse relationship is called.
from django.db import models
class Category(models.Model):
- name = models.CharField(maxlength=20)
+ name = models.CharField(max_length=20)
class Meta:
ordering = ('name',)
@@ -18,7 +18,7 @@ class Category(models.Model):
return self.name
class Article(models.Model):
- headline = models.CharField(maxlength=50)
+ headline = models.CharField(max_length=50)
pub_date = models.DateTimeField()
primary_categories = models.ManyToManyField(Category, related_name='primary_article_set')
secondary_categories = models.ManyToManyField(Category, related_name='secondary_article_set')
diff --git a/tests/modeltests/m2m_recursive/models.py b/tests/modeltests/m2m_recursive/models.py
index 28d98f0600..98f5ce526a 100644
--- a/tests/modeltests/m2m_recursive/models.py
+++ b/tests/modeltests/m2m_recursive/models.py
@@ -15,7 +15,7 @@ there will be a clash, and tests that symmetry is preserved where appropriate.
from django.db import models
class Person(models.Model):
- name = models.CharField(maxlength=20)
+ name = models.CharField(max_length=20)
friends = models.ManyToManyField('self')
idols = models.ManyToManyField('self', symmetrical=False, related_name='stalkers')
diff --git a/tests/modeltests/m2o_recursive/models.py b/tests/modeltests/m2o_recursive/models.py
index 7421061489..c38200a25b 100644
--- a/tests/modeltests/m2o_recursive/models.py
+++ b/tests/modeltests/m2o_recursive/models.py
@@ -13,7 +13,7 @@ Set ``related_name`` to designate what the reverse relationship is called.
from django.db import models
class Category(models.Model):
- name = models.CharField(maxlength=20)
+ name = models.CharField(max_length=20)
parent = models.ForeignKey('self', null=True, related_name='child_set')
def __unicode__(self):
diff --git a/tests/modeltests/m2o_recursive2/models.py b/tests/modeltests/m2o_recursive2/models.py
index a8460d6149..47af18ba0e 100644
--- a/tests/modeltests/m2o_recursive2/models.py
+++ b/tests/modeltests/m2o_recursive2/models.py
@@ -10,7 +10,7 @@ Set ``related_name`` to designate what the reverse relationship is called.
from django.db import models
class Person(models.Model):
- full_name = models.CharField(maxlength=20)
+ full_name = models.CharField(max_length=20)
mother = models.ForeignKey('self', null=True, related_name='mothers_child_set')
father = models.ForeignKey('self', null=True, related_name='fathers_child_set')
diff --git a/tests/modeltests/manipulators/models.py b/tests/modeltests/manipulators/models.py
index 7f1ff0e47b..2ee81f62b3 100644
--- a/tests/modeltests/manipulators/models.py
+++ b/tests/modeltests/manipulators/models.py
@@ -7,14 +7,14 @@ Each model gets an AddManipulator and ChangeManipulator by default.
from django.db import models
class Musician(models.Model):
- first_name = models.CharField(maxlength=30)
- last_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
+ last_name = models.CharField(max_length=30)
def __unicode__(self):
return u"%s %s" % (self.first_name, self.last_name)
class Album(models.Model):
- name = models.CharField(maxlength=100)
+ name = models.CharField(max_length=100)
musician = models.ForeignKey(Musician)
release_date = models.DateField(blank=True, null=True)
@@ -54,7 +54,7 @@ True
# Attempt to create an Album with an invalid musician.
>>> man.get_validation_errors(MultiValueDict({'name': ['Sallies Fforth'], 'musician': ['foo']}))
-{'musician': [u"Select a valid choice; 'foo' is not in ['', '1']."]}
+{'musician': [u"Select a valid choice; 'foo' is not in [u'', u'1']."]}
# Attempt to create an Album with an invalid release_date.
>>> man.get_validation_errors(MultiValueDict({'name': ['Sallies Fforth'], 'musician': ['1'], 'release_date': 'today'}))
diff --git a/tests/modeltests/many_to_many/models.py b/tests/modeltests/many_to_many/models.py
index 446a39b472..198c95c4d5 100644
--- a/tests/modeltests/many_to_many/models.py
+++ b/tests/modeltests/many_to_many/models.py
@@ -10,7 +10,7 @@ and a publication has multiple articles.
from django.db import models
class Publication(models.Model):
- title = models.CharField(maxlength=30)
+ title = models.CharField(max_length=30)
def __unicode__(self):
return self.title
@@ -19,7 +19,7 @@ class Publication(models.Model):
ordering = ('title',)
class Article(models.Model):
- headline = models.CharField(maxlength=100)
+ headline = models.CharField(max_length=100)
publications = models.ManyToManyField(Publication)
def __unicode__(self):
diff --git a/tests/modeltests/many_to_one/models.py b/tests/modeltests/many_to_one/models.py
index 1356b1924b..d5d07a1e21 100644
--- a/tests/modeltests/many_to_one/models.py
+++ b/tests/modeltests/many_to_one/models.py
@@ -7,15 +7,15 @@ To define a many-to-one relationship, use ``ForeignKey()`` .
from django.db import models
class Reporter(models.Model):
- first_name = models.CharField(maxlength=30)
- last_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
+ last_name = models.CharField(max_length=30)
email = models.EmailField()
def __unicode__(self):
return u"%s %s" % (self.first_name, self.last_name)
class Article(models.Model):
- headline = models.CharField(maxlength=100)
+ headline = models.CharField(max_length=100)
pub_date = models.DateField()
reporter = models.ForeignKey(Reporter)
diff --git a/tests/modeltests/many_to_one_null/models.py b/tests/modeltests/many_to_one_null/models.py
index 1469dbb5ca..60c5888371 100644
--- a/tests/modeltests/many_to_one_null/models.py
+++ b/tests/modeltests/many_to_one_null/models.py
@@ -8,13 +8,13 @@ To define a many-to-one relationship that can have a null foreign key, use
from django.db import models
class Reporter(models.Model):
- name = models.CharField(maxlength=30)
+ name = models.CharField(max_length=30)
def __unicode__(self):
return self.name
class Article(models.Model):
- headline = models.CharField(maxlength=100)
+ headline = models.CharField(max_length=100)
reporter = models.ForeignKey(Reporter, null=True)
class Meta:
diff --git a/tests/modeltests/model_forms/models.py b/tests/modeltests/model_forms/models.py
index a21bef02ce..d27f0b0e54 100644
--- a/tests/modeltests/model_forms/models.py
+++ b/tests/modeltests/model_forms/models.py
@@ -31,20 +31,20 @@ ARTICLE_STATUS = (
)
class Category(models.Model):
- name = models.CharField(maxlength=20)
- url = models.CharField('The URL', maxlength=40)
+ name = models.CharField(max_length=20)
+ url = models.CharField('The URL', max_length=40)
def __unicode__(self):
return self.name
class Writer(models.Model):
- name = models.CharField(maxlength=50, help_text='Use both first and last names.')
+ name = models.CharField(max_length=50, help_text='Use both first and last names.')
def __unicode__(self):
return self.name
class Article(models.Model):
- headline = models.CharField(maxlength=50)
+ headline = models.CharField(max_length=50)
pub_date = models.DateField()
created = models.DateField(editable=False)
writer = models.ForeignKey(Writer)
@@ -63,7 +63,7 @@ class Article(models.Model):
class PhoneNumber(models.Model):
phone = models.PhoneNumberField()
- description = models.CharField(maxlength=20)
+ description = models.CharField(max_length=20)
def __unicode__(self):
return self.phone
@@ -332,6 +332,28 @@ Create a new article, with no categories, via the form.
>>> new_art.categories.all()
[]
+Create a new article, with categories, via the form, but use commit=False.
+The m2m data won't be saved until save_m2m() is invoked on the form.
+>>> ArticleForm = form_for_model(Article)
+>>> f = ArticleForm({'headline': u'The walrus was Paul', 'pub_date': u'1967-11-01',
+... 'writer': u'1', 'article': u'Test.', 'categories': [u'1', u'2']})
+>>> new_art = f.save(commit=False)
+
+# Manually save the instance
+>>> new_art.save()
+>>> new_art.id
+4
+
+# The instance doesn't have m2m data yet
+>>> new_art = Article.objects.get(id=4)
+>>> new_art.categories.all()
+[]
+
+# Save the m2m data on the form
+>>> f.save_m2m()
+>>> new_art.categories.all()
+[<Category: Entertainment>, <Category: It's a test>]
+
Here, we define a custom Form. Because it happens to have the same fields as
the Category model, we can use save_instance() to apply its changes to an
existing Category instance.
diff --git a/tests/modeltests/model_inheritance/models.py b/tests/modeltests/model_inheritance/models.py
index 8fbd518928..ca00e96418 100644
--- a/tests/modeltests/model_inheritance/models.py
+++ b/tests/modeltests/model_inheritance/models.py
@@ -7,8 +7,8 @@ Model inheritance isn't yet supported.
from django.db import models
class Place(models.Model):
- name = models.CharField(maxlength=50)
- address = models.CharField(maxlength=80)
+ name = models.CharField(max_length=50)
+ address = models.CharField(max_length=80)
def __unicode__(self):
return u"%s the place" % self.name
diff --git a/tests/modeltests/mutually_referential/models.py b/tests/modeltests/mutually_referential/models.py
index 5a3897d21a..7cf7bf8bb2 100644
--- a/tests/modeltests/mutually_referential/models.py
+++ b/tests/modeltests/mutually_referential/models.py
@@ -7,11 +7,11 @@ To define a many-to-one relationship, use ``ForeignKey()`` .
from django.db.models import *
class Parent(Model):
- name = CharField(maxlength=100, core=True)
+ name = CharField(max_length=100, core=True)
bestchild = ForeignKey("Child", null=True, related_name="favoured_by")
class Child(Model):
- name = CharField(maxlength=100)
+ name = CharField(max_length=100)
parent = ForeignKey(Parent)
__test__ = {'API_TESTS':"""
diff --git a/tests/modeltests/one_to_one/models.py b/tests/modeltests/one_to_one/models.py
index 99228d21a8..2f3f22e628 100644
--- a/tests/modeltests/one_to_one/models.py
+++ b/tests/modeltests/one_to_one/models.py
@@ -9,8 +9,8 @@ In this example, a ``Place`` optionally can be a ``Restaurant``.
from django.db import models
class Place(models.Model):
- name = models.CharField(maxlength=50)
- address = models.CharField(maxlength=80)
+ name = models.CharField(max_length=50)
+ address = models.CharField(max_length=80)
def __unicode__(self):
return u"%s the place" % self.name
@@ -25,18 +25,18 @@ class Restaurant(models.Model):
class Waiter(models.Model):
restaurant = models.ForeignKey(Restaurant)
- name = models.CharField(maxlength=50)
+ name = models.CharField(max_length=50)
def __unicode__(self):
return u"%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)
+ primary_key = models.CharField(max_length=10, primary_key=True)
+ name = models.CharField(max_length = 50)
class RelatedModel(models.Model):
link = models.OneToOneField(ManualPrimaryKey)
- name = models.CharField(maxlength = 50)
+ name = models.CharField(max_length = 50)
__test__ = {'API_TESTS':"""
# Create a couple of Places.
diff --git a/tests/modeltests/or_lookups/models.py b/tests/modeltests/or_lookups/models.py
index 142df16081..ee2cfd2b95 100644
--- a/tests/modeltests/or_lookups/models.py
+++ b/tests/modeltests/or_lookups/models.py
@@ -14,7 +14,7 @@ a get_sql method).
from django.db import models
class Article(models.Model):
- headline = models.CharField(maxlength=50)
+ headline = models.CharField(max_length=50)
pub_date = models.DateTimeField()
class Meta:
diff --git a/tests/modeltests/ordering/models.py b/tests/modeltests/ordering/models.py
index 1c4e08c11c..3e651d4ee7 100644
--- a/tests/modeltests/ordering/models.py
+++ b/tests/modeltests/ordering/models.py
@@ -16,7 +16,7 @@ undefined -- not random, just undefined.
from django.db import models
class Article(models.Model):
- headline = models.CharField(maxlength=100)
+ headline = models.CharField(max_length=100)
pub_date = models.DateTimeField()
class Meta:
ordering = ('-pub_date', 'headline')
diff --git a/tests/modeltests/pagination/models.py b/tests/modeltests/pagination/models.py
index 2834d293e4..a7af2a7089 100644
--- a/tests/modeltests/pagination/models.py
+++ b/tests/modeltests/pagination/models.py
@@ -9,7 +9,7 @@ objects into easily readable pages.
from django.db import models
class Article(models.Model):
- headline = models.CharField(maxlength=100, default='Default headline')
+ headline = models.CharField(max_length=100, default='Default headline')
pub_date = models.DateTimeField()
def __unicode__(self):
diff --git a/tests/modeltests/properties/models.py b/tests/modeltests/properties/models.py
index 4ba6b1a808..5326e4ec5f 100644
--- a/tests/modeltests/properties/models.py
+++ b/tests/modeltests/properties/models.py
@@ -7,8 +7,8 @@ Use properties on models just like on any other Python object.
from django.db import models
class Person(models.Model):
- first_name = models.CharField(maxlength=30)
- last_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
+ last_name = models.CharField(max_length=30)
def _get_full_name(self):
return "%s %s" % (self.first_name, self.last_name)
diff --git a/tests/modeltests/reserved_names/models.py b/tests/modeltests/reserved_names/models.py
index acec978d86..a11b8d9f88 100644
--- a/tests/modeltests/reserved_names/models.py
+++ b/tests/modeltests/reserved_names/models.py
@@ -10,14 +10,14 @@ reserved-name usage.
from django.db import models
class Thing(models.Model):
- when = models.CharField(maxlength=1, primary_key=True)
- join = models.CharField(maxlength=1)
- like = models.CharField(maxlength=1)
- drop = models.CharField(maxlength=1)
- alter = models.CharField(maxlength=1)
- having = models.CharField(maxlength=1)
- where = models.DateField(maxlength=1)
- has_hyphen = models.CharField(maxlength=1, db_column='has-hyphen')
+ when = models.CharField(max_length=1, primary_key=True)
+ join = models.CharField(max_length=1)
+ like = models.CharField(max_length=1)
+ drop = models.CharField(max_length=1)
+ alter = models.CharField(max_length=1)
+ having = models.CharField(max_length=1)
+ where = models.DateField(max_length=1)
+ has_hyphen = models.CharField(max_length=1, db_column='has-hyphen')
class Meta:
db_table = 'select'
diff --git a/tests/modeltests/reverse_lookup/models.py b/tests/modeltests/reverse_lookup/models.py
index 957c1dfb96..80408ad761 100644
--- a/tests/modeltests/reverse_lookup/models.py
+++ b/tests/modeltests/reverse_lookup/models.py
@@ -7,20 +7,20 @@ This demonstrates the reverse lookup features of the database API.
from django.db import models
class User(models.Model):
- name = models.CharField(maxlength=200)
+ name = models.CharField(max_length=200)
def __unicode__(self):
return self.name
class Poll(models.Model):
- question = models.CharField(maxlength=200)
+ question = models.CharField(max_length=200)
creator = models.ForeignKey(User)
def __unicode__(self):
return self.question
class Choice(models.Model):
- name = models.CharField(maxlength=100)
+ name = models.CharField(max_length=100)
poll = models.ForeignKey(Poll, related_name="poll_choice")
related_poll = models.ForeignKey(Poll, related_name="related_choice")
diff --git a/tests/modeltests/save_delete_hooks/models.py b/tests/modeltests/save_delete_hooks/models.py
index 292cfd8e9e..c1b1d8f08b 100644
--- a/tests/modeltests/save_delete_hooks/models.py
+++ b/tests/modeltests/save_delete_hooks/models.py
@@ -8,8 +8,8 @@ the methods.
from django.db import models
class Person(models.Model):
- first_name = models.CharField(maxlength=20)
- last_name = models.CharField(maxlength=20)
+ first_name = models.CharField(max_length=20)
+ last_name = models.CharField(max_length=20)
def __unicode__(self):
return u"%s %s" % (self.first_name, self.last_name)
diff --git a/tests/modeltests/select_related/models.py b/tests/modeltests/select_related/models.py
index 235712ef27..43efab3a7d 100644
--- a/tests/modeltests/select_related/models.py
+++ b/tests/modeltests/select_related/models.py
@@ -12,48 +12,48 @@ from django.db import models
# Who remembers high school biology?
class Domain(models.Model):
- name = models.CharField(maxlength=50)
+ name = models.CharField(max_length=50)
def __unicode__(self):
return self.name
class Kingdom(models.Model):
- name = models.CharField(maxlength=50)
+ name = models.CharField(max_length=50)
domain = models.ForeignKey(Domain)
def __unicode__(self):
return self.name
class Phylum(models.Model):
- name = models.CharField(maxlength=50)
+ name = models.CharField(max_length=50)
kingdom = models.ForeignKey(Kingdom)
def __unicode__(self):
return self.name
class Klass(models.Model):
- name = models.CharField(maxlength=50)
+ name = models.CharField(max_length=50)
phylum = models.ForeignKey(Phylum)
def __unicode__(self):
return self.name
class Order(models.Model):
- name = models.CharField(maxlength=50)
+ name = models.CharField(max_length=50)
klass = models.ForeignKey(Klass)
def __unicode__(self):
return self.name
class Family(models.Model):
- name = models.CharField(maxlength=50)
+ name = models.CharField(max_length=50)
order = models.ForeignKey(Order)
def __unicode__(self):
return self.name
class Genus(models.Model):
- name = models.CharField(maxlength=50)
+ name = models.CharField(max_length=50)
family = models.ForeignKey(Family)
def __unicode__(self):
return self.name
class Species(models.Model):
- name = models.CharField(maxlength=50)
+ name = models.CharField(max_length=50)
genus = models.ForeignKey(Genus)
def __unicode__(self):
return self.name
diff --git a/tests/modeltests/serializers/models.py b/tests/modeltests/serializers/models.py
index b7543f9348..2ee6cfce67 100644
--- a/tests/modeltests/serializers/models.py
+++ b/tests/modeltests/serializers/models.py
@@ -8,7 +8,7 @@ to and from "flat" data (i.e. strings).
from django.db import models
class Category(models.Model):
- name = models.CharField(maxlength=20)
+ name = models.CharField(max_length=20)
class Meta:
ordering = ('name',)
@@ -17,7 +17,7 @@ class Category(models.Model):
return self.name
class Author(models.Model):
- name = models.CharField(maxlength=20)
+ name = models.CharField(max_length=20)
class Meta:
ordering = ('name',)
@@ -27,7 +27,7 @@ class Author(models.Model):
class Article(models.Model):
author = models.ForeignKey(Author)
- headline = models.CharField(maxlength=50)
+ headline = models.CharField(max_length=50)
pub_date = models.DateTimeField()
categories = models.ManyToManyField(Category)
diff --git a/tests/modeltests/str/models.py b/tests/modeltests/str/models.py
index b4d3adcd6d..644c6025ab 100644
--- a/tests/modeltests/str/models.py
+++ b/tests/modeltests/str/models.py
@@ -8,17 +8,16 @@ representation of the object. Do this not only for your own sanity when dealing
with the interactive prompt, but also because objects' representations are used
throughout Django's automatically-generated admin.
-Normally, you should write ``__unicode__``() method, since this will work for
+Normally, you should write ``__unicode__()`` method, since this will work for
all field types (and Django will automatically provide an appropriate
``__str__()`` method). However, you can write a ``__str__()`` method directly,
if you prefer. You must be careful to encode the results correctly, though.
"""
from django.db import models
-from django.utils.encoding import smart_str
class Article(models.Model):
- headline = models.CharField(maxlength=100)
+ headline = models.CharField(max_length=100)
pub_date = models.DateTimeField()
def __str__(self):
@@ -27,7 +26,7 @@ class Article(models.Model):
return self.headline
class InternationalArticle(models.Model):
- headline = models.CharField(maxlength=100)
+ headline = models.CharField(max_length=100)
pub_date = models.DateTimeField()
def __unicode__(self):
diff --git a/tests/modeltests/test_client/fixtures/testdata.json b/tests/modeltests/test_client/fixtures/testdata.json
index 5c9e415240..e9d3ebe9a8 100644
--- a/tests/modeltests/test_client/fixtures/testdata.json
+++ b/tests/modeltests/test_client/fixtures/testdata.json
@@ -16,5 +16,23 @@
"email": "testclient@example.com",
"date_joined": "2006-12-17 07:03:31"
}
+ },
+ {
+ "pk": "2",
+ "model": "auth.user",
+ "fields": {
+ "username": "inactive",
+ "first_name": "Inactive",
+ "last_name": "User",
+ "is_active": false,
+ "is_superuser": false,
+ "is_staff": false,
+ "last_login": "2006-12-17 07:03:31",
+ "groups": [],
+ "user_permissions": [],
+ "password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161",
+ "email": "testclient@example.com",
+ "date_joined": "2006-12-17 07:03:31"
+ }
}
] \ No newline at end of file
diff --git a/tests/modeltests/test_client/models.py b/tests/modeltests/test_client/models.py
index 06e574590f..951a41d61c 100644
--- a/tests/modeltests/test_client/models.py
+++ b/tests/modeltests/test_client/models.py
@@ -122,6 +122,18 @@ class ClientTest(TestCase):
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, "Valid POST Template")
+ def test_valid_form_with_hints(self):
+ "GET a form, providing hints in the GET data"
+ hints = {
+ 'text': 'Hello World',
+ 'multi': ('b','c','e')
+ }
+ response = self.client.get('/test_client/form_view/', data=hints)
+ self.assertEqual(response.status_code, 200)
+ self.assertTemplateUsed(response, "Form GET Template")
+ # Check that the multi-value data has been rolled out ok
+ self.assertContains(response, 'Select a valid choice.', 0)
+
def test_incomplete_data_form(self):
"POST incomplete data to a form"
post_data = {
@@ -228,6 +240,12 @@ class ClientTest(TestCase):
login = self.client.login(username='otheruser', password='nopassword')
self.failIf(login)
+ def test_view_with_inactive_login(self):
+ "Request a page that is protected with @login, but use an inactive login"
+
+ login = self.client.login(username='inactive', password='password')
+ self.failIf(login)
+
def test_session_modifying_view(self):
"Request a page that modifies the session"
# Session value isn't set initially
diff --git a/tests/modeltests/test_client/tests.py b/tests/modeltests/test_client/tests.py
new file mode 100644
index 0000000000..09f292e037
--- /dev/null
+++ b/tests/modeltests/test_client/tests.py
@@ -0,0 +1,20 @@
+# Validate that you can override the default test suite
+
+import unittest
+
+def suite():
+ """
+ Define a suite that deliberately ignores a test defined in
+ this module.
+ """
+
+ testSuite = unittest.TestSuite()
+ testSuite.addTest(SampleTests('testGoodStuff'))
+ return testSuite
+
+class SampleTests(unittest.TestCase):
+ def testGoodStuff(self):
+ pass
+
+ def testBadStuff(self):
+ self.fail("This test shouldn't run")
diff --git a/tests/modeltests/test_client/views.py b/tests/modeltests/test_client/views.py
index 21f577d758..81b4a2f283 100644
--- a/tests/modeltests/test_client/views.py
+++ b/tests/modeltests/test_client/views.py
@@ -84,7 +84,7 @@ def form_view(request):
t = Template('Invalid POST data. {{ form.errors }}', name='Invalid POST Template')
c = Context({'form': form})
else:
- form = TestForm()
+ form = TestForm(request.GET)
t = Template('Viewing base form. {{ form }}.', name='Form GET Template')
c = Context({'form': form})
@@ -107,7 +107,6 @@ def form_view_with_template(request):
'message': message
}
)
-
def login_protected_view(request):
"A simple view that is login protected."
diff --git a/tests/modeltests/transactions/models.py b/tests/modeltests/transactions/models.py
index d7eba6e4d3..06d21bbdd4 100644
--- a/tests/modeltests/transactions/models.py
+++ b/tests/modeltests/transactions/models.py
@@ -10,8 +10,8 @@ manually.
from django.db import models
class Reporter(models.Model):
- first_name = models.CharField(maxlength=30)
- last_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
+ last_name = models.CharField(max_length=30)
email = models.EmailField()
def __unicode__(self):
diff --git a/tests/modeltests/validation/models.py b/tests/modeltests/validation/models.py
index 5be2f867a4..aacd041678 100644
--- a/tests/modeltests/validation/models.py
+++ b/tests/modeltests/validation/models.py
@@ -12,7 +12,7 @@ from django.db import models
class Person(models.Model):
is_child = models.BooleanField()
- name = models.CharField(maxlength=20)
+ name = models.CharField(max_length=20)
birthdate = models.DateField()
favorite_moment = models.DateTimeField()
email = models.EmailField()
diff --git a/tests/regressiontests/bug639/models.py b/tests/regressiontests/bug639/models.py
index 7cfdfc82ef..fc241aba8c 100644
--- a/tests/regressiontests/bug639/models.py
+++ b/tests/regressiontests/bug639/models.py
@@ -2,7 +2,7 @@ import tempfile
from django.db import models
class Photo(models.Model):
- title = models.CharField(maxlength=30)
+ title = models.CharField(max_length=30)
image = models.FileField(upload_to=tempfile.gettempdir())
# Support code for the tests; this keeps track of how many times save() gets
diff --git a/tests/regressiontests/cache/tests.py b/tests/regressiontests/cache/tests.py
index 9dc7161c03..752083bd2f 100644
--- a/tests/regressiontests/cache/tests.py
+++ b/tests/regressiontests/cache/tests.py
@@ -1,10 +1,12 @@
+# -*- coding: utf-8 -*-
+
# Unit tests for cache framework
# Uses whatever cache backend is set in the test settings file.
from django.core.cache import cache
import time, unittest
-# functions/classes for complex data type tests
+# functions/classes for complex data type tests
def f():
return 42
class C:
@@ -19,8 +21,8 @@ class Cache(unittest.TestCase):
def test_non_existent(self):
# get with non-existent keys
- self.assertEqual(cache.get("does not exist"), None)
- self.assertEqual(cache.get("does not exist", "bang!"), "bang!")
+ self.assertEqual(cache.get("does_not_exist"), None)
+ self.assertEqual(cache.get("does_not_exist", "bang!"), "bang!")
def test_get_many(self):
# get_many
@@ -42,17 +44,16 @@ class Cache(unittest.TestCase):
def test_has_key(self):
# has_key
- cache.set("hello", "goodbye")
- self.assertEqual(cache.has_key("hello"), True)
- self.assertEqual(cache.has_key("goodbye"), False)
+ cache.set("hello1", "goodbye1")
+ self.assertEqual(cache.has_key("hello1"), True)
+ self.assertEqual(cache.has_key("goodbye1"), False)
- def test_in(self):
- cache.set("hello", "goodbye")
- self.assertEqual("hello" in cache, True)
- self.assertEqual("goodbye" in cache, False)
+ def test_in(self):
+ cache.set("hello2", "goodbye2")
+ self.assertEqual("hello2" in cache, True)
+ self.assertEqual("goodbye2" in cache, False)
def test_data_types(self):
- # test data types
stuff = {
'string' : 'this is a string',
'int' : 42,
@@ -62,15 +63,23 @@ class Cache(unittest.TestCase):
'function' : f,
'class' : C,
}
- for (key, value) in stuff.items():
- cache.set(key, value)
- self.assertEqual(cache.get(key), value)
-
+
def test_expiration(self):
# expiration
cache.set('expire', 'very quickly', 1)
time.sleep(2)
self.assertEqual(cache.get("expire"), None)
+ def test_unicode(self):
+ stuff = {
+ u'ascii': u'ascii_value',
+ u'unicode_ascii': u'Iñtërnâtiônàlizætiøn1',
+ u'Iñtërnâtiônàlizætiøn': u'Iñtërnâtiônàlizætiøn2',
+ u'ascii': {u'x' : 1 }
+ }
+ for (key, value) in stuff.items():
+ cache.set(key, value)
+ self.assertEqual(cache.get(key), value)
+
if __name__ == '__main__':
- unittest.main() \ No newline at end of file
+ unittest.main()
diff --git a/tests/regressiontests/datatypes/models.py b/tests/regressiontests/datatypes/models.py
index 8c5c8c285d..ff9666bc0c 100644
--- a/tests/regressiontests/datatypes/models.py
+++ b/tests/regressiontests/datatypes/models.py
@@ -7,7 +7,7 @@ from django.db import models
from django.conf import settings
class Donut(models.Model):
- name = models.CharField(maxlength=100)
+ name = models.CharField(max_length=100)
is_frosted = models.BooleanField(default=False)
has_sprinkles = models.NullBooleanField()
baked_date = models.DateField(null=True)
diff --git a/tests/regressiontests/fixtures_regress/fixtures/pretty.xml b/tests/regressiontests/fixtures_regress/fixtures/pretty.xml
new file mode 100644
index 0000000000..68e5710c6a
--- /dev/null
+++ b/tests/regressiontests/fixtures_regress/fixtures/pretty.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<django-objects version="1.0">
+ <object pk="1" model="fixtures_regress.stuff">
+ <field type="CharField" name="name">
+ <None/>
+ </field>
+ <field to="auth.user" name="owner" rel="ManyToOneRel">
+ <None/>
+ </field>
+ </object>
+</django-objects> \ No newline at end of file
diff --git a/tests/regressiontests/fixtures_regress/models.py b/tests/regressiontests/fixtures_regress/models.py
index 31528238e9..2c92839f0f 100644
--- a/tests/regressiontests/fixtures_regress/models.py
+++ b/tests/regressiontests/fixtures_regress/models.py
@@ -1,19 +1,27 @@
from django.db import models
+from django.contrib.auth.models import User
class Animal(models.Model):
- name = models.CharField(maxlength=150)
- latin_name = models.CharField(maxlength=150)
+ name = models.CharField(max_length=150)
+ latin_name = models.CharField(max_length=150)
def __unicode__(self):
return self.common_name
class Plant(models.Model):
- name = models.CharField(maxlength=150)
+ name = models.CharField(max_length=150)
class Meta:
# For testing when upper case letter in app name; regression for #4057
db_table = "Fixtures_regress_plant"
+class Stuff(models.Model):
+ name = models.CharField(max_length=20, null=True)
+ owner = models.ForeignKey(User, null=True)
+
+ def __unicode__(self):
+ return unicode(self.name) + u' is owned by ' + unicode(self.owner)
+
__test__ = {'API_TESTS':"""
>>> from django.core import management
@@ -26,4 +34,13 @@ __test__ = {'API_TESTS':"""
>>> animal = Animal(name='Platypus', latin_name='Ornithorhynchus anatinus')
>>> animal.save()
+###############################################
+# Regression test for ticket #4558 -- pretty printing of XML fixtures
+# doesn't affect parsing of None values.
+
+# Load a pretty-printed XML fixture with Nulls.
+>>> management.load_data(['pretty.xml'], verbosity=0)
+>>> Stuff.objects.all()
+[<Stuff: None is owned by None>]
+
"""}
diff --git a/tests/regressiontests/forms/localflavor.py b/tests/regressiontests/forms/localflavor.py
index 252aa10b34..132a61c30d 100644
--- a/tests/regressiontests/forms/localflavor.py
+++ b/tests/regressiontests/forms/localflavor.py
@@ -913,11 +913,11 @@ ValidationError: [u'This field requires only numbers.']
>>> f.clean('375.788.573-000')
Traceback (most recent call last):
...
-ValidationError: [u'Ensure this value has at most 14 characters.']
+ValidationError: [u'Ensure this value has at most 14 characters (it has 15).']
>>> f.clean('123.456.78')
Traceback (most recent call last):
...
-ValidationError: [u'Ensure this value has at least 11 characters.']
+ValidationError: [u'Ensure this value has at least 11 characters (it has 10).']
>>> f.clean('123456789555')
Traceback (most recent call last):
...
@@ -1208,11 +1208,11 @@ u'230880-3449'
>>> f.clean('230880343')
Traceback (most recent call last):
...
-ValidationError: [u'Ensure this value has at least 10 characters.']
+ValidationError: [u'Ensure this value has at least 10 characters (it has 9).']
>>> f.clean('230880343234')
Traceback (most recent call last):
...
-ValidationError: [u'Ensure this value has at most 11 characters.']
+ValidationError: [u'Ensure this value has at most 11 characters (it has 12).']
>>> f.clean('abcdefghijk')
Traceback (most recent call last):
...
@@ -1254,18 +1254,18 @@ ValidationError: [u'Enter a valid value.']
>>> f.clean('123456')
Traceback (most recent call last):
...
-ValidationError: [u'Ensure this value has at least 7 characters.']
+ValidationError: [u'Ensure this value has at least 7 characters (it has 6).']
>>> f.clean('123456555')
Traceback (most recent call last):
...
-ValidationError: [u'Ensure this value has at most 8 characters.']
+ValidationError: [u'Ensure this value has at most 8 characters (it has 9).']
>>> f.clean('abcdefg')
Traceback (most recent call last):
ValidationError: [u'Enter a valid value.']
>>> f.clean(' 1234567 ')
Traceback (most recent call last):
...
-ValidationError: [u'Ensure this value has at most 8 characters.']
+ValidationError: [u'Ensure this value has at most 8 characters (it has 9).']
>>> f.clean(' 12367 ')
Traceback (most recent call last):
...
@@ -1356,4 +1356,39 @@ Traceback (most recent call last):
...
ValidationError: [u'Enter valid a Chilean RUT. The format is XX.XXX.XXX-X.']
+## CLRegionSelect #########################################################
+>>> from django.contrib.localflavor.cl.forms import CLRegionSelect
+>>> f = CLRegionSelect()
+
+>>> f.render('foo', 'bar')
+u'<select name="foo">\n<option value="RM">Regi\xf3n Metropolitana de Santiago</option>\n<option value="I">Regi\xf3n de Tarapac\xe1</option>\n<option value="II">Regi\xf3n de Antofagasta</option>\n<option value="III">Regi\xf3n de Atacama</option>\n<option value="IV">Regi\xf3n de Coquimbo</option>\n<option value="V">Regi\xf3n de Valpara\xedso</option>\n<option value="VI">Regi\xf3n del Libertador Bernardo O&#39;Higgins</option>\n<option value="VII">Regi\xf3n del Maule</option>\n<option value="VIII">Regi\xf3n del B\xedo B\xedo</option>\n<option value="IX">Regi\xf3n de la Araucan\xeda</option>\n<option value="X">Regi\xf3n de los Lagos</option>\n<option value="XI">Regi\xf3n de Ays\xe9n del General Carlos Ib\xe1\xf1ez del Campo</option>\n<option value="XII">Regi\xf3n de Magallanes y la Ant\xe1rtica Chilena</option>\n<option value="XIV">Regi\xf3n de Los R\xedos</option>\n<option value="XV">Regi\xf3n de Arica-Parinacota</option>\n</select>'
+
+# SKPostalCodeField #########################################################
+
+>>> from django.contrib.localflavor.sk.forms import SKPostalCodeField
+>>> f = SKPostalCodeField()
+>>> f.clean('84545x')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a postal code in the format XXXXX or XXX XX.']
+>>> f.clean('91909')
+u'91909'
+>>> f.clean('917 01')
+u'91701'
+
+# SKRegionSelect ############################################################
+
+>>> from django.contrib.localflavor.sk.forms import SKRegionSelect
+>>> w = SKRegionSelect()
+>>> w.render('regions', 'TT')
+u'<select name="regions">\n<option value="BB">Banska Bystrica region</option>\n<option value="BA">Bratislava region</option>\n<option value="KE">Kosice region</option>\n<option value="NR">Nitra region</option>\n<option value="PO">Presov region</option>\n<option value="TN">Trencin region</option>\n<option value="TT" selected="selected">Trnava region</option>\n<option value="ZA">Zilina region</option>\n</select>'
+
+# SKDistrictSelect ##########################################################
+
+>>> from django.contrib.localflavor.sk.forms import SKDistrictSelect
+>>> w = SKDistrictSelect()
+>>> w.render('Districts', 'RK')
+u'<select name="Districts">\n<option value="BB">Banska Bystrica</option>\n<option value="BS">Banska Stiavnica</option>\n<option value="BJ">Bardejov</option>\n<option value="BN">Banovce nad Bebravou</option>\n<option value="BR">Brezno</option>\n<option value="BA1">Bratislava I</option>\n<option value="BA2">Bratislava II</option>\n<option value="BA3">Bratislava III</option>\n<option value="BA4">Bratislava IV</option>\n<option value="BA5">Bratislava V</option>\n<option value="BY">Bytca</option>\n<option value="CA">Cadca</option>\n<option value="DT">Detva</option>\n<option value="DK">Dolny Kubin</option>\n<option value="DS">Dunajska Streda</option>\n<option value="GA">Galanta</option>\n<option value="GL">Gelnica</option>\n<option value="HC">Hlohovec</option>\n<option value="HE">Humenne</option>\n<option value="IL">Ilava</option>\n<option value="KK">Kezmarok</option>\n<option value="KN">Komarno</option>\n<option value="KE1">Kosice I</option>\n<option value="KE2">Kosice II</option>\n<option value="KE3">Kosice III</option>\n<option value="KE4">Kosice IV</option>\n<option value="KEO">Kosice - okolie</option>\n<option value="KA">Krupina</option>\n<option value="KM">Kysucke Nove Mesto</option>\n<option value="LV">Levice</option>\n<option value="LE">Levoca</option>\n<option value="LM">Liptovsky Mikulas</option>\n<option value="LC">Lucenec</option>\n<option value="MA">Malacky</option>\n<option value="MT">Martin</option>\n<option value="ML">Medzilaborce</option>\n<option value="MI">Michalovce</option>\n<option value="MY">Myjava</option>\n<option value="NO">Namestovo</option>\n<option value="NR">Nitra</option>\n<option value="NM">Nove Mesto nad Vahom</option>\n<option value="NZ">Nove Zamky</option>\n<option value="PE">Partizanske</option>\n<option value="PK">Pezinok</option>\n<option value="PN">Piestany</option>\n<option value="PT">Poltar</option>\n<option value="PP">Poprad</option>\n<option value="PB">Povazska Bystrica</option>\n<option value="PO">Presov</option>\n<option value="PD">Prievidza</option>\n<option value="PU">Puchov</option>\n<option value="RA">Revuca</option>\n<option value="RS">Rimavska Sobota</option>\n<option value="RV">Roznava</option>\n<option value="RK" selected="selected">Ruzomberok</option>\n<option value="SB">Sabinov</option>\n<option value="SC">Senec</option>\n<option value="SE">Senica</option>\n<option value="SI">Skalica</option>\n<option value="SV">Snina</option>\n<option value="SO">Sobrance</option>\n<option value="SN">Spisska Nova Ves</option>\n<option value="SL">Stara Lubovna</option>\n<option value="SP">Stropkov</option>\n<option value="SK">Svidnik</option>\n<option value="SA">Sala</option>\n<option value="TO">Topolcany</option>\n<option value="TV">Trebisov</option>\n<option value="TN">Trencin</option>\n<option value="TT">Trnava</option>\n<option value="TR">Turcianske Teplice</option>\n<option value="TS">Tvrdosin</option>\n<option value="VK">Velky Krtis</option>\n<option value="VT">Vranov nad Toplou</option>\n<option value="ZM">Zlate Moravce</option>\n<option value="ZV">Zvolen</option>\n<option value="ZC">Zarnovica</option>\n<option value="ZH">Ziar nad Hronom</option>\n<option value="ZA">Zilina</option>\n</select>'
+
"""
+
diff --git a/tests/regressiontests/forms/tests.py b/tests/regressiontests/forms/tests.py
index d862e96441..d14ffc514e 100644
--- a/tests/regressiontests/forms/tests.py
+++ b/tests/regressiontests/forms/tests.py
@@ -5,6 +5,7 @@ from formsets import formset_tests
form_tests = r"""
>>> from django.newforms import *
+>>> from django.newforms.widgets import RadioFieldRenderer
>>> import datetime
>>> import time
>>> import re
@@ -173,27 +174,29 @@ u'<input type="hidden" class="special" value="foo@example.com" name="email" />'
# FileInput Widget ############################################################
+FileInput widgets don't ever show the value, because the old value is of no use
+if you are updating the form or if the provided file generated an error.
>>> w = FileInput()
>>> w.render('email', '')
u'<input type="file" name="email" />'
>>> w.render('email', None)
u'<input type="file" name="email" />'
>>> w.render('email', 'test@example.com')
-u'<input type="file" name="email" value="test@example.com" />'
+u'<input type="file" name="email" />'
>>> w.render('email', 'some "quoted" & ampersanded value')
-u'<input type="file" name="email" value="some &quot;quoted&quot; &amp; ampersanded value" />'
+u'<input type="file" name="email" />'
>>> w.render('email', 'test@example.com', attrs={'class': 'fun'})
-u'<input type="file" name="email" value="test@example.com" class="fun" />'
+u'<input type="file" name="email" class="fun" />'
You can also pass 'attrs' to the constructor:
>>> w = FileInput(attrs={'class': 'fun'})
>>> w.render('email', '')
u'<input type="file" class="fun" name="email" />'
>>> w.render('email', 'foo@example.com')
-u'<input type="file" class="fun" value="foo@example.com" name="email" />'
+u'<input type="file" class="fun" name="email" />'
>>> w.render('email', 'ŠĐĆŽćžšđ', attrs={'class': 'fun'})
-u'<input type="file" class="fun" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" name="email" />'
+u'<input type="file" class="fun" name="email" />'
# Textarea Widget #############################################################
@@ -615,11 +618,11 @@ If 'choices' is passed to both the constructor and render(), then they'll both b
<li><label><input type="radio" name="num" value="5" /> 5</label></li>
</ul>
-The render() method returns a RadioFieldRenderer object, whose str() is a <ul>.
+RadioSelect uses a RadioFieldRenderer to render the individual radio inputs.
You can manipulate that object directly to customize the way the RadioSelect
is rendered.
>>> w = RadioSelect()
->>> r = w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
+>>> r = w.get_renderer('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
>>> for inp in r:
... print inp
<label><input checked="checked" type="radio" name="beatle" value="J" /> John</label>
@@ -645,10 +648,21 @@ beatle J P Paul False
beatle J G George False
beatle J R Ringo False
+You can create your own custom renderers for RadioSelect to use.
+>>> class MyRenderer(RadioFieldRenderer):
+... def render(self):
+... return u'<br />\n'.join([unicode(choice) for choice in self])
+>>> w = RadioSelect(renderer=MyRenderer)
+>>> print w.render('beatle', 'G', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
+<label><input type="radio" name="beatle" value="J" /> John</label><br />
+<label><input type="radio" name="beatle" value="P" /> Paul</label><br />
+<label><input checked="checked" type="radio" name="beatle" value="G" /> George</label><br />
+<label><input type="radio" name="beatle" value="R" /> Ringo</label>
+
A RadioFieldRenderer object also allows index access to individual RadioInput
objects.
>>> w = RadioSelect()
->>> r = w.render('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
+>>> r = w.get_renderer('beatle', 'J', choices=(('J', 'John'), ('P', 'Paul'), ('G', 'George'), ('R', 'Ringo')))
>>> print r[1]
<label><input type="radio" name="beatle" value="P" /> Paul</label>
>>> print r[0]
@@ -897,7 +911,7 @@ u'1234567890'
>>> f.clean('1234567890a')
Traceback (most recent call last):
...
-ValidationError: [u'Ensure this value has at most 10 characters.']
+ValidationError: [u'Ensure this value has at most 10 characters (it has 11).']
CharField accepts an optional min_length parameter:
>>> f = CharField(min_length=10, required=False)
@@ -906,7 +920,7 @@ u''
>>> f.clean('12345')
Traceback (most recent call last):
...
-ValidationError: [u'Ensure this value has at least 10 characters.']
+ValidationError: [u'Ensure this value has at least 10 characters (it has 5).']
>>> f.clean('1234567890')
u'1234567890'
>>> f.clean('1234567890a')
@@ -920,7 +934,7 @@ ValidationError: [u'This field is required.']
>>> f.clean('12345')
Traceback (most recent call last):
...
-ValidationError: [u'Ensure this value has at least 10 characters.']
+ValidationError: [u'Ensure this value has at least 10 characters (it has 5).']
>>> f.clean('1234567890')
u'1234567890'
>>> f.clean('1234567890a')
@@ -1177,6 +1191,10 @@ ValidationError: [u'Ensure this value is greater than or equal to 0.5.']
Decimal("1.5")
>>> f.clean('0.5')
Decimal("0.5")
+>>> f.clean('.5')
+Decimal("0.5")
+>>> f.clean('00.50')
+Decimal("0.50")
# DateField ###################################################################
@@ -1440,11 +1458,11 @@ RegexField also access min_length and max_length parameters, for convenience.
>>> f.clean('123')
Traceback (most recent call last):
...
-ValidationError: [u'Ensure this value has at least 5 characters.']
+ValidationError: [u'Ensure this value has at least 5 characters (it has 3).']
>>> f.clean('abc')
Traceback (most recent call last):
...
-ValidationError: [u'Ensure this value has at least 5 characters.']
+ValidationError: [u'Ensure this value has at least 5 characters (it has 3).']
>>> f.clean('12345')
u'12345'
>>> f.clean('1234567890')
@@ -1452,7 +1470,7 @@ u'1234567890'
>>> f.clean('12345678901')
Traceback (most recent call last):
...
-ValidationError: [u'Ensure this value has at most 10 characters.']
+ValidationError: [u'Ensure this value has at most 10 characters (it has 11).']
>>> f.clean('12345a')
Traceback (most recent call last):
...
@@ -1509,13 +1527,49 @@ EmailField also access min_length and max_length parameters, for convenience.
>>> f.clean('a@foo.com')
Traceback (most recent call last):
...
-ValidationError: [u'Ensure this value has at least 10 characters.']
+ValidationError: [u'Ensure this value has at least 10 characters (it has 9).']
>>> f.clean('alf@foo.com')
u'alf@foo.com'
>>> f.clean('alf123456788@foo.com')
Traceback (most recent call last):
...
-ValidationError: [u'Ensure this value has at most 15 characters.']
+ValidationError: [u'Ensure this value has at most 15 characters (it has 20).']
+
+# FileField ##################################################################
+
+>>> f = FileField()
+>>> f.clean('')
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+
+>>> f.clean(None)
+Traceback (most recent call last):
+...
+ValidationError: [u'This field is required.']
+
+>>> f.clean({})
+Traceback (most recent call last):
+...
+ValidationError: [u'No file was submitted.']
+
+>>> f.clean('some content that is not a file')
+Traceback (most recent call last):
+...
+ValidationError: [u'No file was submitted. Check the encoding type on the form.']
+
+>>> f.clean({'filename': 'name', 'content':None})
+Traceback (most recent call last):
+...
+ValidationError: [u'The submitted file is empty.']
+
+>>> f.clean({'filename': 'name', 'content':''})
+Traceback (most recent call last):
+...
+ValidationError: [u'The submitted file is empty.']
+
+>>> type(f.clean({'filename': 'name', 'content':'Some File Content'}))
+<class 'django.newforms.fields.UploadedFile'>
# URLField ##################################################################
@@ -1619,13 +1673,13 @@ URLField also access min_length and max_length parameters, for convenience.
>>> f.clean('http://f.com')
Traceback (most recent call last):
...
-ValidationError: [u'Ensure this value has at least 15 characters.']
+ValidationError: [u'Ensure this value has at least 15 characters (it has 12).']
>>> f.clean('http://example.com')
u'http://example.com'
>>> f.clean('http://abcdefghijklmnopqrstuvwxyz.com')
Traceback (most recent call last):
...
-ValidationError: [u'Ensure this value has at most 20 characters.']
+ValidationError: [u'Ensure this value has at most 20 characters (it has 37).']
# BooleanField ################################################################
@@ -1797,7 +1851,7 @@ u'test@example.com'
>>> f.clean('longemailaddress@example.com')
Traceback (most recent call last):
...
-ValidationError: [u'Ensure this value has at most 20 characters.']
+ValidationError: [u'Ensure this value has at most 20 characters (it has 28).']
>>> f.clean('not an e-mail')
Traceback (most recent call last):
...
@@ -1817,7 +1871,7 @@ u'test@example.com'
>>> f.clean('longemailaddress@example.com')
Traceback (most recent call last):
...
-ValidationError: [u'Ensure this value has at most 20 characters.']
+ValidationError: [u'Ensure this value has at most 20 characters (it has 28).']
>>> f.clean('not an e-mail')
Traceback (most recent call last):
...
@@ -2558,7 +2612,7 @@ Instances of a dynamic Form do not persist fields from one Form instance to
the next.
>>> class MyForm(Form):
... def __init__(self, data=None, auto_id=False, field_list=[]):
-... Form.__init__(self, data, auto_id)
+... Form.__init__(self, data, auto_id=auto_id)
... for field in field_list:
... self.fields[field[0]] = field[1]
>>> field_list = [('field1', CharField()), ('field2', CharField())]
@@ -2576,7 +2630,7 @@ the next.
... default_field_1 = CharField()
... default_field_2 = CharField()
... def __init__(self, data=None, auto_id=False, field_list=[]):
-... Form.__init__(self, data, auto_id)
+... Form.__init__(self, data, auto_id=auto_id)
... for field in field_list:
... self.fields[field[0]] = field[1]
>>> field_list = [('field1', CharField()), ('field2', CharField())]
@@ -3231,6 +3285,35 @@ is different than its data. This is handled transparently, though.
<option value="3" selected="selected">No</option>
</select>
+# Forms with FileFields ################################################
+
+FileFields are a special case because they take their data from the request.FILES,
+not request.POST.
+
+>>> class FileForm(Form):
+... file1 = FileField()
+>>> f = FileForm(auto_id=False)
+>>> print f
+<tr><th>File1:</th><td><input type="file" name="file1" /></td></tr>
+
+>>> f = FileForm(data={}, files={}, auto_id=False)
+>>> print f
+<tr><th>File1:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="file" name="file1" /></td></tr>
+
+>>> f = FileForm(data={}, files={'file1': {'filename': 'name', 'content':''}}, auto_id=False)
+>>> print f
+<tr><th>File1:</th><td><ul class="errorlist"><li>The submitted file is empty.</li></ul><input type="file" name="file1" /></td></tr>
+
+>>> f = FileForm(data={}, files={'file1': 'something that is not a file'}, auto_id=False)
+>>> print f
+<tr><th>File1:</th><td><ul class="errorlist"><li>No file was submitted. Check the encoding type on the form.</li></ul><input type="file" name="file1" /></td></tr>
+
+>>> f = FileForm(data={}, files={'file1': {'filename': 'name', 'content':'some content'}}, auto_id=False)
+>>> print f
+<tr><th>File1:</th><td><input type="file" name="file1" /></td></tr>
+>>> f.is_valid()
+True
+
# Basic form processing in a view #############################################
>>> from django.template import Template, Context
@@ -3268,7 +3351,7 @@ Case 2: POST with erroneous data (a redisplayed form, with errors).
<form action="" method="post">
<table>
<tr><td colspan="2"><ul class="errorlist"><li>Please make sure your passwords match.</li></ul></td></tr>
-<tr><th>Username:</th><td><ul class="errorlist"><li>Ensure this value has at most 10 characters.</li></ul><input type="text" name="username" value="this-is-a-long-username" maxlength="10" /></td></tr>
+<tr><th>Username:</th><td><ul class="errorlist"><li>Ensure this value has at most 10 characters (it has 23).</li></ul><input type="text" name="username" value="this-is-a-long-username" maxlength="10" /></td></tr>
<tr><th>Password1:</th><td><input type="password" name="password1" value="foo" /></td></tr>
<tr><th>Password2:</th><td><input type="password" name="password2" value="bar" /></td></tr>
</table>
diff --git a/tests/regressiontests/initial_sql_regress/models.py b/tests/regressiontests/initial_sql_regress/models.py
index dedbba8e5c..7cf725991a 100644
--- a/tests/regressiontests/initial_sql_regress/models.py
+++ b/tests/regressiontests/initial_sql_regress/models.py
@@ -5,7 +5,7 @@ Regression tests for initial SQL insertion.
from django.db import models
class Simple(models.Model):
- name = models.CharField(maxlength = 50)
+ name = models.CharField(max_length = 50)
__test__ = {'API_TESTS':""}
diff --git a/tests/regressiontests/invalid_admin_options/models.py b/tests/regressiontests/invalid_admin_options/models.py
index 94e6ccdde1..9f77ef5e06 100644
--- a/tests/regressiontests/invalid_admin_options/models.py
+++ b/tests/regressiontests/invalid_admin_options/models.py
@@ -10,7 +10,7 @@ model_errors = ""
class ListDisplayBadOne(models.Model):
"Test list_display, list_display must be a list or tuple"
- first_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
class Admin:
list_display = 'first_name'
@@ -20,7 +20,7 @@ model_errors += """invalid_admin_options.listdisplaybadone: "admin.list_display"
class ListDisplayBadTwo(models.Model):
"Test list_display, list_display items must be attributes, methods or properties."
- first_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
class Admin:
list_display = ['first_name','nonexistent']
@@ -29,7 +29,7 @@ model_errors += """invalid_admin_options.listdisplaybadtwo: "admin.list_display"
"""
class ListDisplayBadThree(models.Model):
"Test list_display, list_display items can not be a ManyToManyField."
- first_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
nick_names = models.ManyToManyField('ListDisplayGood')
class Admin:
@@ -40,7 +40,7 @@ model_errors += """invalid_admin_options.listdisplaybadthree: "admin.list_displa
class ListDisplayGood(models.Model):
"Test list_display, Admin list_display can be a attribute, method or property."
- first_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
def _last_name(self):
return self.first_name
@@ -54,8 +54,8 @@ class ListDisplayGood(models.Model):
class ListDisplayLinksBadOne(models.Model):
"Test list_display_links, item must be included in list_display."
- first_name = models.CharField(maxlength=30)
- last_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
+ last_name = models.CharField(max_length=30)
class Admin:
list_display = ['last_name']
@@ -66,8 +66,8 @@ model_errors += """invalid_admin_options.listdisplaylinksbadone: "admin.list_dis
class ListDisplayLinksBadTwo(models.Model):
"Test list_display_links, must be a list or tuple."
- first_name = models.CharField(maxlength=30)
- last_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
+ last_name = models.CharField(max_length=30)
class Admin:
list_display = ['first_name','last_name']
@@ -80,8 +80,8 @@ model_errors += """invalid_admin_options.listdisplaylinksbadtwo: "admin.list_dis
## This is failing but the validation which should fail is not.
#class ListDisplayLinksBadThree(models.Model):
# "Test list_display_links, must define list_display to use list_display_links."
-# first_name = models.CharField(maxlength=30)
-# last_name = models.CharField(maxlength=30)
+# first_name = models.CharField(max_length=30)
+# last_name = models.CharField(max_length=30)
#
# class Admin:
# list_display_links = ('first_name',)
@@ -91,7 +91,7 @@ model_errors += """invalid_admin_options.listdisplaylinksbadtwo: "admin.list_dis
class ListDisplayLinksGood(models.Model):
"Test list_display_links, Admin list_display_list can be a attribute, method or property."
- first_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
def _last_name(self):
return self.first_name
@@ -106,7 +106,7 @@ class ListDisplayLinksGood(models.Model):
class ListFilterBadOne(models.Model):
"Test list_filter, must be a list or tuple."
- first_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
class Admin:
list_filter = 'first_name'
@@ -116,7 +116,7 @@ model_errors += """invalid_admin_options.listfilterbadone: "admin.list_filter",
class ListFilterBadTwo(models.Model):
"Test list_filter, must be a field not a property or method."
- first_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
def _last_name(self):
return self.first_name
@@ -134,7 +134,7 @@ invalid_admin_options.listfilterbadtwo: "admin.list_filter" refers to 'full_name
class DateHierarchyBadOne(models.Model):
"Test date_hierarchy, must be a date or datetime field."
- first_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
birth_day = models.DateField()
class Admin:
@@ -146,7 +146,7 @@ class DateHierarchyBadOne(models.Model):
class DateHierarchyBadTwo(models.Model):
"Test date_hieracrhy, must be a field."
- first_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
birth_day = models.DateField()
class Admin:
@@ -157,7 +157,7 @@ model_errors += """invalid_admin_options.datehierarchybadtwo: "admin.date_hierar
class DateHierarchyGood(models.Model):
"Test date_hieracrhy, must be a field."
- first_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
birth_day = models.DateField()
class Admin:
@@ -165,7 +165,7 @@ class DateHierarchyGood(models.Model):
class SearchFieldsBadOne(models.Model):
"Test search_fields, must be a list or tuple."
- first_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
class Admin:
search_fields = ('nonexistent')
@@ -176,7 +176,7 @@ class SearchFieldsBadOne(models.Model):
class SearchFieldsBadTwo(models.Model):
"Test search_fields, must be a field."
- first_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
def _last_name(self):
return self.first_name
@@ -191,8 +191,8 @@ class SearchFieldsBadTwo(models.Model):
class SearchFieldsGood(models.Model):
"Test search_fields, must be a list or tuple."
- first_name = models.CharField(maxlength=30)
- last_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
+ last_name = models.CharField(max_length=30)
class Admin:
search_fields = ['first_name','last_name']
@@ -200,7 +200,7 @@ class SearchFieldsGood(models.Model):
class JsBadOne(models.Model):
"Test js, must be a list or tuple"
- name = models.CharField(maxlength=30)
+ name = models.CharField(max_length=30)
class Admin:
js = 'test.js'
@@ -211,7 +211,7 @@ class JsBadOne(models.Model):
class SaveAsBad(models.Model):
"Test save_as, should be True or False"
- name = models.CharField(maxlength=30)
+ name = models.CharField(max_length=30)
class Admin:
save_as = 'not True or False'
@@ -222,7 +222,7 @@ class SaveAsBad(models.Model):
class SaveOnTopBad(models.Model):
"Test save_on_top, should be True or False"
- name = models.CharField(maxlength=30)
+ name = models.CharField(max_length=30)
class Admin:
save_on_top = 'not True or False'
@@ -233,7 +233,7 @@ class SaveOnTopBad(models.Model):
class ListSelectRelatedBad(models.Model):
"Test list_select_related, should be True or False"
- name = models.CharField(maxlength=30)
+ name = models.CharField(max_length=30)
class Admin:
list_select_related = 'not True or False'
@@ -244,7 +244,7 @@ class ListSelectRelatedBad(models.Model):
class ListPerPageBad(models.Model):
"Test list_per_page, should be a positive integer value."
- name = models.CharField(maxlength=30)
+ name = models.CharField(max_length=30)
class Admin:
list_per_page = 89.3
@@ -255,8 +255,8 @@ class ListPerPageBad(models.Model):
class FieldsBadOne(models.Model):
"Test fields, should be a tuple"
- first_name = models.CharField(maxlength=30)
- last_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
+ last_name = models.CharField(max_length=30)
class Admin:
fields = 'not a tuple'
@@ -267,8 +267,8 @@ class FieldsBadOne(models.Model):
class FieldsBadTwo(models.Model):
"""Test fields, 'fields' dict option is required."""
- first_name = models.CharField(maxlength=30)
- last_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
+ last_name = models.CharField(max_length=30)
class Admin:
fields = ('Name', {'description': 'this fieldset needs fields'})
@@ -279,8 +279,8 @@ class FieldsBadTwo(models.Model):
class FieldsBadThree(models.Model):
"""Test fields, 'classes' and 'description' are the only allowable extra dict options."""
- first_name = models.CharField(maxlength=30)
- last_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
+ last_name = models.CharField(max_length=30)
class Admin:
fields = ('Name', {'fields': ('first_name','last_name'),'badoption': 'verybadoption'})
@@ -291,8 +291,8 @@ class FieldsBadThree(models.Model):
class FieldsGood(models.Model):
"Test fields, working example"
- first_name = models.CharField(maxlength=30)
- last_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
+ last_name = models.CharField(max_length=30)
birth_day = models.DateField()
class Admin:
@@ -303,8 +303,8 @@ class FieldsGood(models.Model):
class OrderingBad(models.Model):
"Test ordering, must be a field."
- first_name = models.CharField(maxlength=30)
- last_name = models.CharField(maxlength=30)
+ first_name = models.CharField(max_length=30)
+ last_name = models.CharField(max_length=30)
class Admin:
ordering = 'nonexistent'
@@ -316,7 +316,7 @@ class OrderingBad(models.Model):
## TODO: Add a manager validator, this should fail gracefully.
#class ManagerBad(models.Model):
# "Test manager, must be a manager object."
-# first_name = models.CharField(maxlength=30)
+# first_name = models.CharField(max_length=30)
#
# class Admin:
# manager = 'nonexistent'
diff --git a/tests/regressiontests/many_to_one_regress/models.py b/tests/regressiontests/many_to_one_regress/models.py
index 8ddec98da4..57bbcd8489 100644
--- a/tests/regressiontests/many_to_one_regress/models.py
+++ b/tests/regressiontests/many_to_one_regress/models.py
@@ -12,15 +12,15 @@ class Second(models.Model):
# Protect against repetition of #1839, #2415 and #2536.
class Third(models.Model):
- name = models.CharField(maxlength=20)
+ name = models.CharField(max_length=20)
third = models.ForeignKey('self', null=True, related_name='child_set')
class Parent(models.Model):
- name = models.CharField(maxlength=20)
+ name = models.CharField(max_length=20)
bestchild = models.ForeignKey('Child', null=True, related_name='favored_by')
class Child(models.Model):
- name = models.CharField(maxlength=20)
+ name = models.CharField(max_length=20)
parent = models.ForeignKey(Parent)
diff --git a/tests/regressiontests/maxlength/__init__.py b/tests/regressiontests/maxlength/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/regressiontests/maxlength/__init__.py
diff --git a/tests/regressiontests/maxlength/models.py b/tests/regressiontests/maxlength/models.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/regressiontests/maxlength/models.py
diff --git a/tests/regressiontests/maxlength/tests.py b/tests/regressiontests/maxlength/tests.py
new file mode 100644
index 0000000000..8a5f874c78
--- /dev/null
+++ b/tests/regressiontests/maxlength/tests.py
@@ -0,0 +1,160 @@
+# Test access to max_length while still providing full backwards compatibility
+# with legacy maxlength attribute.
+"""
+
+Don't print out the deprecation warnings during testing.
+>>> from warnings import filterwarnings
+>>> filterwarnings("ignore")
+
+# legacy_maxlength function
+
+>>> from django.utils.maxlength import legacy_maxlength
+
+>>> legacy_maxlength(None, None)
+
+
+>>> legacy_maxlength(10, None)
+10
+
+>>> legacy_maxlength(None, 10)
+10
+
+>>> legacy_maxlength(10, 12)
+Traceback (most recent call last):
+...
+TypeError: field can not take both the max_length argument and the legacy maxlength argument.
+
+>>> legacy_maxlength(0, 10)
+Traceback (most recent call last):
+...
+TypeError: field can not take both the max_length argument and the legacy maxlength argument.
+
+>>> legacy_maxlength(0, None)
+0
+
+>>> legacy_maxlength(None, 0)
+0
+
+#===============================================================================
+# Fields
+#===============================================================================
+
+# Set up fields
+>>> from django.db.models import fields
+>>> new = fields.Field(max_length=15)
+>>> old = fields.Field(maxlength=10)
+
+# Ensure both max_length and legacy maxlength are not able to both be specified
+>>> fields.Field(maxlength=10, max_length=15)
+Traceback (most recent call last):
+ ...
+TypeError: field can not take both the max_length argument and the legacy maxlength argument.
+
+# Test max_length
+>>> new.max_length
+15
+>>> old.max_length
+10
+
+# Test accessing maxlength
+>>> new.maxlength
+15
+>>> old.maxlength
+10
+
+# Test setting maxlength
+>>> new.maxlength += 1
+>>> old.maxlength += 1
+>>> new.max_length
+16
+>>> old.max_length
+11
+
+# SlugField __init__ passes through max_length so test that too
+>>> fields.SlugField('new', max_length=15).max_length
+15
+>>> fields.SlugField('empty').max_length
+50
+>>> fields.SlugField('old', maxlength=10).max_length
+10
+
+#===============================================================================
+# (old)forms
+#===============================================================================
+
+>>> from django import oldforms
+
+# Test max_length attribute
+
+>>> oldforms.TextField('new', max_length=15).render('')
+u'<input type="text" id="id_new" class="vTextField" name="new" size="30" value="" maxlength="15" />'
+
+>>> oldforms.IntegerField('new', max_length=15).render('')
+u'<input type="text" id="id_new" class="vIntegerField" name="new" size="10" value="" maxlength="15" />'
+
+>>> oldforms.SmallIntegerField('new', max_length=15).render('')
+u'<input type="text" id="id_new" class="vSmallIntegerField" name="new" size="5" value="" maxlength="15" />'
+
+>>> oldforms.PositiveIntegerField('new', max_length=15).render('')
+u'<input type="text" id="id_new" class="vPositiveIntegerField" name="new" size="10" value="" maxlength="15" />'
+
+>>> oldforms.PositiveSmallIntegerField('new', max_length=15).render('')
+u'<input type="text" id="id_new" class="vPositiveSmallIntegerField" name="new" size="5" value="" maxlength="15" />'
+
+>>> oldforms.DatetimeField('new', max_length=15).render('')
+u'<input type="text" id="id_new" class="vDatetimeField" name="new" size="30" value="" maxlength="15" />'
+
+>>> oldforms.EmailField('new', max_length=15).render('')
+u'<input type="text" id="id_new" class="vEmailField" name="new" size="50" value="" maxlength="15" />'
+>>> oldforms.EmailField('new').render('')
+u'<input type="text" id="id_new" class="vEmailField" name="new" size="50" value="" maxlength="75" />'
+
+>>> oldforms.URLField('new', max_length=15).render('')
+u'<input type="text" id="id_new" class="vURLField" name="new" size="50" value="" maxlength="15" />'
+>>> oldforms.URLField('new').render('')
+u'<input type="text" id="id_new" class="vURLField" name="new" size="50" value="" maxlength="200" />'
+
+>>> oldforms.IPAddressField('new', max_length=15).render('')
+u'<input type="text" id="id_new" class="vIPAddressField" name="new" size="15" value="" maxlength="15" />'
+>>> oldforms.IPAddressField('new').render('')
+u'<input type="text" id="id_new" class="vIPAddressField" name="new" size="15" value="" maxlength="15" />'
+
+>>> oldforms.CommaSeparatedIntegerField('new', max_length=15).render('')
+u'<input type="text" id="id_new" class="vCommaSeparatedIntegerField" name="new" size="20" value="" maxlength="15" />'
+
+
+# Test legacy maxlength attribute
+
+>>> oldforms.TextField('old', maxlength=10).render('')
+u'<input type="text" id="id_old" class="vTextField" name="old" size="30" value="" maxlength="10" />'
+
+>>> oldforms.IntegerField('old', maxlength=10).render('')
+u'<input type="text" id="id_old" class="vIntegerField" name="old" size="10" value="" maxlength="10" />'
+
+>>> oldforms.SmallIntegerField('old', maxlength=10).render('')
+u'<input type="text" id="id_old" class="vSmallIntegerField" name="old" size="5" value="" maxlength="10" />'
+
+>>> oldforms.PositiveIntegerField('old', maxlength=10).render('')
+u'<input type="text" id="id_old" class="vPositiveIntegerField" name="old" size="10" value="" maxlength="10" />'
+
+>>> oldforms.PositiveSmallIntegerField('old', maxlength=10).render('')
+u'<input type="text" id="id_old" class="vPositiveSmallIntegerField" name="old" size="5" value="" maxlength="10" />'
+
+>>> oldforms.DatetimeField('old', maxlength=10).render('')
+u'<input type="text" id="id_old" class="vDatetimeField" name="old" size="30" value="" maxlength="10" />'
+
+>>> oldforms.EmailField('old', maxlength=10).render('')
+u'<input type="text" id="id_old" class="vEmailField" name="old" size="50" value="" maxlength="10" />'
+
+>>> oldforms.URLField('old', maxlength=10).render('')
+u'<input type="text" id="id_old" class="vURLField" name="old" size="50" value="" maxlength="10" />'
+
+>>> oldforms.IPAddressField('old', maxlength=10).render('')
+u'<input type="text" id="id_old" class="vIPAddressField" name="old" size="15" value="" maxlength="10" />'
+
+>>> oldforms.CommaSeparatedIntegerField('old', maxlength=10).render('')
+u'<input type="text" id="id_old" class="vCommaSeparatedIntegerField" name="old" size="20" value="" maxlength="10" />'
+"""
+if __name__ == "__main__":
+ import doctest
+ doctest.testmod()
diff --git a/tests/regressiontests/model_fields/__init__.py b/tests/regressiontests/model_fields/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/regressiontests/model_fields/__init__.py
diff --git a/tests/regressiontests/model_fields/models.py b/tests/regressiontests/model_fields/models.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/regressiontests/model_fields/models.py
diff --git a/tests/regressiontests/model_fields/tests.py b/tests/regressiontests/model_fields/tests.py
new file mode 100644
index 0000000000..e279a0669f
--- /dev/null
+++ b/tests/regressiontests/model_fields/tests.py
@@ -0,0 +1,18 @@
+"""
+>>> from django.db.models.fields import *
+
+# DecimalField
+
+>>> f = DecimalField()
+
+>>> f.to_python(3)
+Decimal("3")
+
+>>> f.to_python("3.14")
+Decimal("3.14")
+
+>>> f.to_python("abc")
+Traceback (most recent call last):
+...
+ValidationError: [u'This value must be a decimal number.']
+"""
diff --git a/tests/regressiontests/model_regress/models.py b/tests/regressiontests/model_regress/models.py
index b4d432d8fa..0fee831212 100644
--- a/tests/regressiontests/model_regress/models.py
+++ b/tests/regressiontests/model_regress/models.py
@@ -7,7 +7,7 @@ CHOICES = (
)
class Article(models.Model):
- headline = models.CharField(maxlength=100, default='Default headline')
+ headline = models.CharField(max_length=100, default='Default headline')
pub_date = models.DateTimeField()
status = models.IntegerField(blank=True, null=True, choices=CHOICES)
diff --git a/tests/regressiontests/null_queries/models.py b/tests/regressiontests/null_queries/models.py
index 2e903876bf..2aa36b2c1a 100644
--- a/tests/regressiontests/null_queries/models.py
+++ b/tests/regressiontests/null_queries/models.py
@@ -1,14 +1,14 @@
from django.db import models
class Poll(models.Model):
- question = models.CharField(maxlength=200)
+ question = models.CharField(max_length=200)
def __unicode__(self):
return u"Q: %s " % self.question
class Choice(models.Model):
poll = models.ForeignKey(Poll)
- choice = models.CharField(maxlength=200)
+ choice = models.CharField(max_length=200)
def __unicode__(self):
return u"Choice: %s in poll %s" % (self.choice, self.poll)
diff --git a/tests/regressiontests/one_to_one_regress/models.py b/tests/regressiontests/one_to_one_regress/models.py
index be48c842ed..c5ffd3fb3c 100644
--- a/tests/regressiontests/one_to_one_regress/models.py
+++ b/tests/regressiontests/one_to_one_regress/models.py
@@ -1,8 +1,8 @@
from django.db import models
class Place(models.Model):
- name = models.CharField(maxlength=50)
- address = models.CharField(maxlength=80)
+ name = models.CharField(max_length=50)
+ address = models.CharField(max_length=80)
def __unicode__(self):
return u"%s the place" % self.name
@@ -16,7 +16,7 @@ class Restaurant(models.Model):
return u"%s the restaurant" % self.place.name
class Favorites(models.Model):
- name = models.CharField(maxlength = 50)
+ name = models.CharField(max_length = 50)
restaurants = models.ManyToManyField(Restaurant)
def __unicode__(self):
diff --git a/tests/regressiontests/serializers_regress/models.py b/tests/regressiontests/serializers_regress/models.py
index b441885f10..e9df508822 100644
--- a/tests/regressiontests/serializers_regress/models.py
+++ b/tests/regressiontests/serializers_regress/models.py
@@ -16,7 +16,7 @@ class BooleanData(models.Model):
data = models.BooleanField(null=True)
class CharData(models.Model):
- data = models.CharField(maxlength=30, null=True)
+ data = models.CharField(max_length=30, null=True)
class DateData(models.Model):
data = models.DateField(null=True)
@@ -90,7 +90,7 @@ class Tag(models.Model):
ordering = ["data"]
class GenericData(models.Model):
- data = models.CharField(maxlength=30)
+ data = models.CharField(max_length=30)
tags = generic.GenericRelation(Tag)
@@ -102,13 +102,13 @@ class Anchor(models.Model):
"""This is a model that can be used as
something for other models to point at"""
- data = models.CharField(maxlength=30)
+ data = models.CharField(max_length=30)
class UniqueAnchor(models.Model):
"""This is a model that can be used as
something for other models to point at"""
- data = models.CharField(unique=True, maxlength=30)
+ data = models.CharField(unique=True, max_length=30)
class FKData(models.Model):
data = models.ForeignKey(Anchor, null=True)
@@ -117,7 +117,8 @@ class M2MData(models.Model):
data = models.ManyToManyField(Anchor, null=True)
class O2OData(models.Model):
- data = models.OneToOneField(Anchor, null=True)
+ # One to one field can't be null, since it is a PK.
+ data = models.OneToOneField(Anchor)
class FKSelfData(models.Model):
data = models.ForeignKey('self', null=True)
@@ -143,7 +144,7 @@ class BooleanPKData(models.Model):
data = models.BooleanField(primary_key=True)
class CharPKData(models.Model):
- data = models.CharField(maxlength=30, primary_key=True)
+ data = models.CharField(max_length=30, primary_key=True)
# class DatePKData(models.Model):
# data = models.DateField(primary_key=True)
@@ -175,8 +176,9 @@ class IntegerPKData(models.Model):
class IPAddressPKData(models.Model):
data = models.IPAddressField(primary_key=True)
-class NullBooleanPKData(models.Model):
- data = models.NullBooleanField(primary_key=True)
+# This is just a Boolean field with null=True, and we can't test a PK value of NULL.
+# class NullBooleanPKData(models.Model):
+# data = models.NullBooleanField(primary_key=True)
class PhonePKData(models.Model):
data = models.PhoneNumberField(primary_key=True)
@@ -206,6 +208,19 @@ class USStatePKData(models.Model):
# data = models.XMLField(primary_key=True)
class ComplexModel(models.Model):
- field1 = models.CharField(maxlength=10)
- field2 = models.CharField(maxlength=10)
- field3 = models.CharField(maxlength=10)
+ field1 = models.CharField(max_length=10)
+ field2 = models.CharField(max_length=10)
+ field3 = models.CharField(max_length=10)
+
+# Tests for handling fields with pre_save functions, or
+# models with save functions that modify data
+class AutoNowDateTimeData(models.Model):
+ data = models.DateTimeField(null=True, auto_now=True)
+
+class ModifyingSaveData(models.Model):
+ data = models.IntegerField(null=True)
+
+ def save(self):
+ "A save method that modifies the data in the object"
+ self.data = 666
+ super(ModifyingSaveData, self).save(raw)
diff --git a/tests/regressiontests/serializers_regress/tests.py b/tests/regressiontests/serializers_regress/tests.py
index 7c6da9d356..86dc311269 100644
--- a/tests/regressiontests/serializers_regress/tests.py
+++ b/tests/regressiontests/serializers_regress/tests.py
@@ -24,17 +24,20 @@ except ImportError:
from django.utils import _decimal as decimal
# A set of functions that can be used to recreate
-# test data objects of various kinds
+# test data objects of various kinds.
+# The save method is a raw base model save, to make
+# sure that the data in the database matches the
+# exact test case.
def data_create(pk, klass, data):
instance = klass(id=pk)
instance.data = data
- instance.save()
+ models.Model.save(instance, raw=True)
return instance
def generic_create(pk, klass, data):
instance = klass(id=pk)
instance.data = data[0]
- instance.save()
+ models.Model.save(instance, raw=True)
for tag in data[1:]:
instance.tags.create(data=tag)
return instance
@@ -42,25 +45,25 @@ def generic_create(pk, klass, data):
def fk_create(pk, klass, data):
instance = klass(id=pk)
setattr(instance, 'data_id', data)
- instance.save()
+ models.Model.save(instance, raw=True)
return instance
def m2m_create(pk, klass, data):
instance = klass(id=pk)
- instance.save()
+ models.Model.save(instance, raw=True)
instance.data = data
return instance
def o2o_create(pk, klass, data):
instance = klass()
instance.data_id = data
- instance.save()
+ models.Model.save(instance, raw=True)
return instance
def pk_create(pk, klass, data):
instance = klass()
instance.data = data
- instance.save()
+ models.Model.save(instance, raw=True)
return instance
# A set of functions that can be used to compare
@@ -233,8 +236,8 @@ The end."""),
(pk_obj, 682, IntegerPKData, 0),
# (XX, ImagePKData
(pk_obj, 690, IPAddressPKData, "127.0.0.1"),
- (pk_obj, 700, NullBooleanPKData, True),
- (pk_obj, 701, NullBooleanPKData, False),
+ # (pk_obj, 700, NullBooleanPKData, True),
+ # (pk_obj, 701, NullBooleanPKData, False),
(pk_obj, 710, PhonePKData, "212-634-5789"),
(pk_obj, 720, PositiveIntegerPKData, 123456789),
(pk_obj, 730, PositiveSmallIntegerPKData, 12),
@@ -249,6 +252,9 @@ The end."""),
# (pk_obj, 770, TimePKData, datetime.time(10,42,37)),
(pk_obj, 780, USStatePKData, "MA"),
# (pk_obj, 790, XMLPKData, "<foo></foo>"),
+
+ (data_obj, 800, AutoNowDateTimeData, datetime.datetime(2006,6,16,10,42,37)),
+ (data_obj, 810, ModifyingSaveData, 42),
]
# Because Oracle treats the empty string as NULL, Oracle is expected to fail
@@ -303,7 +309,7 @@ def fieldsTest(format, self):
management.flush(verbosity=0, interactive=False)
obj = ComplexModel(field1='first',field2='second',field3='third')
- obj.save()
+ obj.save(raw=True)
# Serialize then deserialize the test database
serialized_data = serializers.serialize(format, [obj], indent=2, fields=('field1','field3'))
@@ -319,7 +325,7 @@ def streamTest(format, self):
management.flush(verbosity=0, interactive=False)
obj = ComplexModel(field1='first',field2='second',field3='third')
- obj.save()
+ obj.save(raw=True)
# Serialize the test database to a stream
stream = StringIO()
diff --git a/tests/regressiontests/string_lookup/models.py b/tests/regressiontests/string_lookup/models.py
index 66651ce680..6a341070a4 100644
--- a/tests/regressiontests/string_lookup/models.py
+++ b/tests/regressiontests/string_lookup/models.py
@@ -2,14 +2,14 @@
from django.db import models
class Foo(models.Model):
- name = models.CharField(maxlength=50)
- friend = models.CharField(maxlength=50, blank=True)
+ name = models.CharField(max_length=50)
+ friend = models.CharField(max_length=50, blank=True)
def __unicode__(self):
return "Foo %s" % self.name
class Bar(models.Model):
- name = models.CharField(maxlength=50)
+ name = models.CharField(max_length=50)
normal = models.ForeignKey(Foo, related_name='normal_foo')
fwd = models.ForeignKey("Whiz")
back = models.ForeignKey("Foo")
@@ -18,20 +18,20 @@ class Bar(models.Model):
return "Bar %s" % self.place.name
class Whiz(models.Model):
- name = models.CharField(maxlength = 50)
+ name = models.CharField(max_length = 50)
def __unicode__(self):
return "Whiz %s" % self.name
class Child(models.Model):
parent = models.OneToOneField('Base')
- name = models.CharField(maxlength = 50)
+ name = models.CharField(max_length = 50)
def __unicode__(self):
return "Child %s" % self.name
class Base(models.Model):
- name = models.CharField(maxlength = 50)
+ name = models.CharField(max_length = 50)
def __unicode__(self):
return "Base %s" % self.name
diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py
index 5b4ff10bdb..0f7ac2f352 100644
--- a/tests/regressiontests/templates/tests.py
+++ b/tests/regressiontests/templates/tests.py
@@ -6,13 +6,17 @@ if __name__ == '__main__':
# before importing 'template'.
settings.configure()
+import os
+import unittest
+from datetime import datetime, timedelta
+
from django import template
from django.template import loader
+from django.template.loaders import app_directories, filesystem
from django.utils.translation import activate, deactivate, install, ugettext as _
from django.utils.tzinfo import LocalTimezone
-from datetime import datetime, timedelta
+
from unicode import unicode_tests
-import unittest
# Some other tests we would like to run
__test__ = {
@@ -75,6 +79,46 @@ class UTF8Class:
return u'ŠĐĆŽćžšđ'.encode('utf-8')
class Templates(unittest.TestCase):
+ def test_loaders_security(self):
+ def test_template_sources(path, template_dirs, expected_sources):
+ # Fix expected sources so they are normcased and abspathed
+ expected_sources = [os.path.normcase(os.path.abspath(s)) for s in expected_sources]
+ # Test app_directories loader
+ sources = app_directories.get_template_sources(path, template_dirs)
+ self.assertEqual(list(sources), expected_sources)
+ # Test filesystem loader
+ sources = filesystem.get_template_sources(path, template_dirs)
+ self.assertEqual(list(sources), expected_sources)
+
+ template_dirs = ['/dir1', '/dir2']
+ test_template_sources('index.html', template_dirs,
+ ['/dir1/index.html', '/dir2/index.html'])
+ test_template_sources('/etc/passwd', template_dirs,
+ [])
+ test_template_sources('etc/passwd', template_dirs,
+ ['/dir1/etc/passwd', '/dir2/etc/passwd'])
+ test_template_sources('../etc/passwd', template_dirs,
+ [])
+ test_template_sources('../../../etc/passwd', template_dirs,
+ [])
+ test_template_sources('/dir1/index.html', template_dirs,
+ ['/dir1/index.html'])
+ test_template_sources('../dir2/index.html', template_dirs,
+ ['/dir2/index.html'])
+ test_template_sources('/dir1blah', template_dirs,
+ [])
+ test_template_sources('../dir1blah', template_dirs,
+ [])
+
+ # Case insensitive tests (for win32). Not run unless we're on
+ # a case insensitive operating system.
+ if os.path.normcase('/TEST') == os.path.normpath('/test'):
+ template_dirs = ['/dir1', '/DIR2']
+ test_template_sources('index.html', template_dirs,
+ ['/dir1/index.html', '/dir2/index.html'])
+ test_template_sources('/DIR1/index.HTML', template_dirs,
+ ['/dir1/index.html'])
+
def test_templates(self):
# NOW and NOW_tz are used by timesince tag tests.
NOW = datetime.now()
@@ -602,7 +646,7 @@ class Templates(unittest.TestCase):
# translation of a constant string
'i18n13': ('{{ _("Page not found") }}', {'LANGUAGE_CODE': 'de'}, 'Seite nicht gefunden'),
- ### HANDLING OF TEMPLATE_TAG_IF_INVALID ###################################
+ ### HANDLING OF TEMPLATE_STRING_IF_INVALID ###################################
'invalidstr01': ('{{ var|default:"Foo" }}', {}, ('Foo','INVALID')),
'invalidstr02': ('{{ var|default_if_none:"Foo" }}', {}, ('','INVALID')),
@@ -735,7 +779,8 @@ class Templates(unittest.TestCase):
'url02' : ('{% url regressiontests.templates.views.client_action client.id, action="update" %}', {'client': {'id': 1}}, '/url_tag/client/1/update/'),
'url03' : ('{% url regressiontests.templates.views.index %}', {}, '/url_tag/'),
'url04' : ('{% url named.client client.id %}', {'client': {'id': 1}}, '/url_tag/named-client/1/'),
- 'url05' : (u'{% url метка_оператора 1 %}', {}, '/url_tag/unicode/1/'),
+ 'url05' : (u'{% url метка_оператора v %}', {'v': u'Ω'},
+ '/url_tag/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/'),
# Failures
'url-fail01' : ('{% url %}', {}, template.TemplateSyntaxError),
diff --git a/tests/regressiontests/templates/urls.py b/tests/regressiontests/templates/urls.py
index 4ac9eb29f7..d79f38e0a7 100644
--- a/tests/regressiontests/templates/urls.py
+++ b/tests/regressiontests/templates/urls.py
@@ -9,5 +9,7 @@ urlpatterns = patterns('',
(r'^client/(\d+)/$', views.client),
(r'^client/(\d+)/(?P<action>[^/]+)/$', views.client_action),
url(r'^named-client/(\d+)/$', views.client, name="named.client"),
- url(r'^unicode/(\d+)/$', views.client, name=u"метка_оператора"),
+
+ # Unicode strings are permitted everywhere.
+ url(ur'^Юникод/(\w+)/$', views.client, name=u"метка_оператора"),
)
diff --git a/tests/regressiontests/test_client_regress/models.py b/tests/regressiontests/test_client_regress/models.py
index f03615e961..e17770cd03 100644
--- a/tests/regressiontests/test_client_regress/models.py
+++ b/tests/regressiontests/test_client_regress/models.py
@@ -6,6 +6,47 @@ from django.test import Client, TestCase
from django.core import mail
import os
+class AssertContainsTests(TestCase):
+ def test_contains(self):
+ "Responses can be inspected for content, including counting repeated substrings"
+ response = self.client.get('/test_client_regress/no_template_view/')
+
+ self.assertContains(response, 'never', 0)
+ self.assertContains(response, 'once')
+ self.assertContains(response, 'once', 1)
+ self.assertContains(response, 'twice')
+ self.assertContains(response, 'twice', 2)
+
+ try:
+ self.assertContains(response, 'never', 1)
+ except AssertionError, e:
+ self.assertEquals(str(e), "Found 0 instances of 'never' in response (expected 1)")
+
+ try:
+ self.assertContains(response, 'once', 0)
+ except AssertionError, e:
+ self.assertEquals(str(e), "Found 1 instances of 'once' in response (expected 0)")
+
+ try:
+ self.assertContains(response, 'once', 2)
+ except AssertionError, e:
+ self.assertEquals(str(e), "Found 1 instances of 'once' in response (expected 2)")
+
+ try:
+ self.assertContains(response, 'twice', 1)
+ except AssertionError, e:
+ self.assertEquals(str(e), "Found 2 instances of 'twice' in response (expected 1)")
+
+ try:
+ self.assertContains(response, 'thrice')
+ except AssertionError, e:
+ self.assertEquals(str(e), "Couldn't find 'thrice' in response")
+
+ try:
+ self.assertContains(response, 'thrice', 3)
+ except AssertionError, e:
+ self.assertEquals(str(e), "Found 0 instances of 'thrice' in response (expected 3)")
+
class AssertTemplateUsedTests(TestCase):
fixtures = ['testdata.json']
diff --git a/tests/regressiontests/test_client_regress/views.py b/tests/regressiontests/test_client_regress/views.py
index 8728ab0d7d..d3fbcf8448 100644
--- a/tests/regressiontests/test_client_regress/views.py
+++ b/tests/regressiontests/test_client_regress/views.py
@@ -4,7 +4,7 @@ from django.shortcuts import render_to_response
def no_template_view(request):
"A simple view that expects a GET request, and returns a rendered template"
- return HttpResponse("No template used")
+ return HttpResponse("No template used. Sample content: twice once twice. Content ends.")
def file_upload_view(request):
"""
diff --git a/tests/regressiontests/utils/__init__.py b/tests/regressiontests/utils/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/regressiontests/utils/__init__.py
diff --git a/tests/regressiontests/utils/models.py b/tests/regressiontests/utils/models.py
new file mode 100644
index 0000000000..97a72bab14
--- /dev/null
+++ b/tests/regressiontests/utils/models.py
@@ -0,0 +1 @@
+# Test runner needs a models.py file.
diff --git a/tests/regressiontests/utils/tests.py b/tests/regressiontests/utils/tests.py
new file mode 100644
index 0000000000..258aea697e
--- /dev/null
+++ b/tests/regressiontests/utils/tests.py
@@ -0,0 +1,115 @@
+"""
+Tests for django.utils.
+"""
+
+from unittest import TestCase
+
+from django.utils import html
+
+class TestUtilsHtml(TestCase):
+
+ def check_output(self, function, value, output=None):
+ """
+ Check that function(value) equals output. If output is None,
+ check that function(value) equals value.
+ """
+ if output is None:
+ output = value
+ self.assertEqual(function(value), output)
+
+ def test_escape(self):
+ f = html.escape
+ items = (
+ ('&','&amp;'),
+ ('<', '&lt;'),
+ ('>', '&gt;'),
+ ('"', '&quot;'),
+ ("'", '&#39;'),
+ )
+ # Substitution patterns for testing the above items.
+ patterns = ("%s", "asdf%sfdsa", "%s1", "1%sb")
+ for value, output in items:
+ for pattern in patterns:
+ self.check_output(f, pattern % value, pattern % output)
+ # Check repeated values.
+ self.check_output(f, value * 2, output * 2)
+ # Verify it doesn't double replace &.
+ self.check_output(f, '<&', '&lt;&amp;')
+
+ def test_linebreaks(self):
+ f = html.linebreaks
+ items = (
+ ("para1\n\npara2\r\rpara3", "<p>para1</p>\n\n<p>para2</p>\n\n<p>para3</p>"),
+ ("para1\nsub1\rsub2\n\npara2", "<p>para1<br />sub1<br />sub2</p>\n\n<p>para2</p>"),
+ ("para1\r\n\r\npara2\rsub1\r\rpara4", "<p>para1</p>\n\n<p>para2<br />sub1</p>\n\n<p>para4</p>"),
+ ("para1\tmore\n\npara2", "<p>para1\tmore</p>\n\n<p>para2</p>"),
+ )
+ for value, output in items:
+ self.check_output(f, value, output)
+
+ def test_strip_tags(self):
+ f = html.strip_tags
+ items = (
+ ('<adf>a', 'a'),
+ ('</adf>a', 'a'),
+ ('<asdf><asdf>e', 'e'),
+ ('<f', '<f'),
+ ('</fe', '</fe'),
+ ('<x>b<y>', 'b'),
+ )
+ for value, output in items:
+ self.check_output(f, value, output)
+
+ def test_strip_spaces_between_tags(self):
+ f = html.strip_spaces_between_tags
+ # Strings that should come out untouched.
+ items = (' <adf>', '<adf> ', ' </adf> ', ' <f> x</f>')
+ for value in items:
+ self.check_output(f, value)
+ # Strings that have spaces to strip.
+ items = (
+ ('<d> </d>', '<d></d>'),
+ ('<p>hello </p>\n<p> world</p>', '<p>hello </p><p> world</p>'),
+ ('\n<p>\t</p>\n<p> </p>\n', '\n<p></p><p></p>\n'),
+ )
+ for value, output in items:
+ self.check_output(f, value, output)
+
+ def test_strip_entities(self):
+ f = html.strip_entities
+ # Strings that should come out untouched.
+ values = ("&", "&a", "&a", "a&#a")
+ for value in values:
+ self.check_output(f, value)
+ # Valid entities that should be stripped from the patterns.
+ entities = ("&#1;", "&#12;", "&a;", "&fdasdfasdfasdf;")
+ patterns = (
+ ("asdf %(entity)s ", "asdf "),
+ ("%(entity)s%(entity)s", ""),
+ ("&%(entity)s%(entity)s", "&"),
+ ("%(entity)s3", "3"),
+ )
+ for entity in entities:
+ for in_pattern, output in patterns:
+ self.check_output(f, in_pattern % {'entity': entity}, output)
+
+ def test_fix_ampersands(self):
+ f = html.fix_ampersands
+ # Strings without ampersands or with ampersands already encoded.
+ values = ("a&#1;", "b", "&a;", "&amp; &x; ", "asdf")
+ patterns = (
+ ("%s", "%s"),
+ ("&%s", "&amp;%s"),
+ ("&%s&", "&amp;%s&amp;"),
+ )
+ for value in values:
+ for in_pattern, out_pattern in patterns:
+ self.check_output(f, in_pattern % value, out_pattern % value)
+ # Strings with ampersands that need encoding.
+ items = (
+ ("&#;", "&amp;#;"),
+ ("&#875 ;", "&amp;#875 ;"),
+ ("&#4abc;", "&amp;#4abc;"),
+ )
+ for value, output in items:
+ self.check_output(f, value, output)
diff --git a/tests/runtests.py b/tests/runtests.py
index 5a76cf5a18..4cda2ac65d 100755
--- a/tests/runtests.py
+++ b/tests/runtests.py
@@ -73,7 +73,7 @@ class InvalidModelTestCase(unittest.TestCase):
self.assert_(not unexpected, "Unexpected Errors: " + '\n'.join(unexpected))
self.assert_(not missing, "Missing Errors: " + '\n'.join(missing))
-def django_tests(verbosity, tests_to_run):
+def django_tests(verbosity, interactive, test_labels):
from django.conf import settings
old_installed_apps = settings.INSTALLED_APPS
@@ -109,14 +109,13 @@ def django_tests(verbosity, tests_to_run):
# if the model was named on the command line, or
# no models were named (i.e., run all), import
# this model and add it to the list to test.
- if not tests_to_run or model_name in tests_to_run:
+ if not test_labels or model_name in set([label.split('.')[0] for label in test_labels]):
if verbosity >= 1:
print "Importing model %s" % model_name
mod = load_app(model_label)
if mod:
if model_label not in settings.INSTALLED_APPS:
settings.INSTALLED_APPS.append(model_label)
- test_models.append(mod)
except Exception, e:
sys.stderr.write("Error while importing %s:" % model_name + ''.join(traceback.format_exception(*sys.exc_info())[1:]))
continue
@@ -125,13 +124,13 @@ def django_tests(verbosity, tests_to_run):
extra_tests = []
for model_dir, model_name in get_invalid_models():
model_label = '.'.join([model_dir, model_name])
- if not tests_to_run or model_name in tests_to_run:
+ if not test_labels or model_name in test_labels:
print >> sys.stderr,'****', model_label
extra_tests.append(InvalidModelTestCase(model_label))
# Run the test suite, including the extra validation tests.
from django.test.simple import run_tests
- failures = run_tests(test_models, verbosity, extra_tests=extra_tests)
+ failures = run_tests(test_labels, verbosity=verbosity, interactive=interactive, extra_tests=extra_tests)
if failures:
sys.exit(failures)
@@ -150,6 +149,8 @@ if __name__ == "__main__":
parser.add_option('-v','--verbosity', action='store', dest='verbosity', default='0',
type='choice', choices=['0', '1', '2'],
help='Verbosity level; 0=minimal output, 1=normal output, 2=all output')
+ parser.add_option('--noinput', action='store_false', dest='interactive', default=True,
+ help='Tells Django to NOT prompt the user for input of any kind.')
parser.add_option('--settings',
help='Python path to settings module, e.g. "myproject.settings". If this isn\'t provided, the DJANGO_SETTINGS_MODULE environment variable will be used.')
options, args = parser.parse_args()
@@ -158,4 +159,4 @@ if __name__ == "__main__":
elif "DJANGO_SETTINGS_MODULE" not in os.environ:
parser.error("DJANGO_SETTINGS_MODULE is not set in the environment. "
"Set it or use --settings.")
- django_tests(int(options.verbosity), args)
+ django_tests(int(options.verbosity), options.interactive, args)