From 394eafb840ae2fe0dd2ebde42d32b8b937e706ec Mon Sep 17 00:00:00 2001 From: Adrian Holovaty Date: Fri, 11 Nov 2005 00:25:03 +0000 Subject: [PATCH 1/8] Updated middleware.txt to note that response middleware is applied in reverse git-svn-id: http://code.djangoproject.com/svn/django/trunk@1161 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- docs/middleware.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/middleware.txt b/docs/middleware.txt index d920e88370..edaa5915e4 100644 --- a/docs/middleware.txt +++ b/docs/middleware.txt @@ -27,7 +27,8 @@ name. For example, here's the default ``MIDDLEWARE_CLASSES`` created by "django.middleware.doc.XViewMiddleware", ) -Django applies middleware in the order it's defined in ``MIDDLEWARE_CLASSES``. +Django applies middleware in the order it's defined in ``MIDDLEWARE_CLASSES``, +except in the case of response middleware, which is applied in reverse order. A Django installation doesn't require any middleware -- e.g., ``MIDDLEWARE_CLASSES`` can be empty, if you'd like -- but it's strongly From d38e882695f7cbeed645346281eaa9b651619a48 Mon Sep 17 00:00:00 2001 From: Adrian Holovaty Date: Fri, 11 Nov 2005 01:14:02 +0000 Subject: [PATCH 2/8] Updated docs/middleware.txt to say exception middleware is applied in reverse order. git-svn-id: http://code.djangoproject.com/svn/django/trunk@1162 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- docs/middleware.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/middleware.txt b/docs/middleware.txt index edaa5915e4..a7a5474d84 100644 --- a/docs/middleware.txt +++ b/docs/middleware.txt @@ -28,7 +28,8 @@ name. For example, here's the default ``MIDDLEWARE_CLASSES`` created by ) Django applies middleware in the order it's defined in ``MIDDLEWARE_CLASSES``, -except in the case of response middleware, which is applied in reverse order. +except in the case of response and exception middleware, which is applied in +reverse order. A Django installation doesn't require any middleware -- e.g., ``MIDDLEWARE_CLASSES`` can be empty, if you'd like -- but it's strongly From 57d2a0f62c0b95e79e1262d4331b3e2c71e6ced6 Mon Sep 17 00:00:00 2001 From: Jacob Kaplan-Moss Date: Fri, 11 Nov 2005 02:52:16 +0000 Subject: [PATCH 3/8] Entries in INSTALLED_APPS can now be of the form "django.contrib.*", which means every app under "django.contrib". git-svn-id: http://code.djangoproject.com/svn/django/trunk@1163 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/conf/settings.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/django/conf/settings.py b/django/conf/settings.py index 2001a06ffd..f455f65afe 100644 --- a/django/conf/settings.py +++ b/django/conf/settings.py @@ -44,6 +44,19 @@ for setting in dir(mod): setting_value = (setting_value,) # In case the user forgot the comma. setattr(me, setting, setting_value) +# Expand entries in INSTALLED_APPS like "django.contrib.*" to a list +# of all those apps. +new_installed_apps = [] +for app in me.INSTALLED_APPS: + if app.endswith('.*'): + appdir = os.path.dirname(__import__(app[:-2], '', '', ['']).__file__) + for d in os.listdir(appdir): + if d.isalpha() and os.path.isdir(os.path.join(appdir, d)): + new_installed_apps.append('%s.%s' % (app[:-2], d)) + else: + new_installed_apps.append(app) +me.INSTALLED_APPS = new_installed_apps + # save DJANGO_SETTINGS_MODULE in case anyone in the future cares me.SETTINGS_MODULE = os.environ.get(ENVIRONMENT_VARIABLE, '') From d0a0a545383a1a1f1b5cba30034d779079ceec5d Mon Sep 17 00:00:00 2001 From: Adrian Holovaty Date: Fri, 11 Nov 2005 03:25:52 +0000 Subject: [PATCH 4/8] Added INSTALLED_APPS to docs/settings.txt git-svn-id: http://code.djangoproject.com/svn/django/trunk@1164 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- docs/settings.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/settings.txt b/docs/settings.txt index 9b7eb2004a..a44a2e0994 100644 --- a/docs/settings.txt +++ b/docs/settings.txt @@ -358,6 +358,17 @@ Default: ``('/cgi-bin/', '/_vti_bin', '/_vti_inf')`` A tuple of strings that specify beginnings of URLs that should be ignored by the 404 e-mailer. See ``SEND_BROKEN_LINK_EMAILS`` and ``IGNORABLE_404_ENDS``. +INSTALLED_APPS +-------------- + +Default: Not defined + +A tuple of strings designating all applications that are enabled in this Django +installation. Each string should be a full Python path to a Python package that +contains a Django application, as created by `django-admin.py startapp`_. + +.. _django-admin.py startapp: http://www.djangoproject.com/documentation/django_admin/#startapp-appname + INTERNAL_IPS ------------ From a11a1d5e1690fb334758fc2dbaa5478aecc8ab63 Mon Sep 17 00:00:00 2001 From: Adrian Holovaty Date: Fri, 11 Nov 2005 03:50:21 +0000 Subject: [PATCH 5/8] Added SITE_ID to docs/settings.txt git-svn-id: http://code.djangoproject.com/svn/django/trunk@1165 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- docs/settings.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/settings.txt b/docs/settings.txt index a44a2e0994..c4eeb2e636 100644 --- a/docs/settings.txt +++ b/docs/settings.txt @@ -499,6 +499,15 @@ See the `session docs`_. ``'hotclub'`` is a reference to the Hot Club of France, the band Django Reinhardt played in. +SITE_ID +------- + +Default: Not defined + +The ID, as an integer, of the current site in the ``sites`` database. This is +used so that application data can hook into specific site(s) and a single +database can manage content for multiple sites. + TEMPLATE_DIRS ------------- From 1b035c35d9bb288589d813393e635bc9546c914b Mon Sep 17 00:00:00 2001 From: Adrian Holovaty Date: Fri, 11 Nov 2005 04:45:05 +0000 Subject: [PATCH 6/8] BACKWARDS-INCOMPATIBLE CHANGE -- Moved flatpages and redirects to standalone apps in django.contrib that are NOT installed by default. See http://code.djangoproject.com/wiki/BackwardsIncompatibleChanges for full migration information. git-svn-id: http://code.djangoproject.com/svn/django/trunk@1166 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/conf/global_settings.py | 3 - django/contrib/flatpages/__init__.py | 0 django/contrib/flatpages/middleware.py | 15 +++ django/contrib/flatpages/models/__init__.py | 1 + django/contrib/flatpages/models/flatpages.py | 33 +++++ .../flatpages/urls.py} | 2 +- .../flatpages/views.py} | 22 ++-- django/contrib/redirects/__init__.py | 0 django/contrib/redirects/middleware.py | 27 +++++ django/contrib/redirects/models/__init__.py | 1 + django/contrib/redirects/models/redirects.py | 23 ++++ django/middleware/common.py | 11 -- django/models/core.py | 52 +------- django/views/defaults.py | 39 ++---- docs/flatpages.txt | 114 ++++++++++++++++++ docs/legacy_databases.txt | 3 - docs/middleware.txt | 4 - docs/model-api.txt | 2 +- docs/redirects.txt | 72 +++++++++++ docs/settings.txt | 8 -- docs/url_dispatch.txt | 1 - 21 files changed, 310 insertions(+), 123 deletions(-) create mode 100644 django/contrib/flatpages/__init__.py create mode 100644 django/contrib/flatpages/middleware.py create mode 100644 django/contrib/flatpages/models/__init__.py create mode 100644 django/contrib/flatpages/models/flatpages.py rename django/{conf/urls/flatfiles.py => contrib/flatpages/urls.py} (55%) rename django/{views/core/flatfiles.py => contrib/flatpages/views.py} (66%) create mode 100644 django/contrib/redirects/__init__.py create mode 100644 django/contrib/redirects/middleware.py create mode 100644 django/contrib/redirects/models/__init__.py create mode 100644 django/contrib/redirects/models/redirects.py create mode 100644 docs/flatpages.txt create mode 100644 docs/redirects.txt diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py index afb2953742..03609ffee6 100644 --- a/django/conf/global_settings.py +++ b/django/conf/global_settings.py @@ -135,9 +135,6 @@ ALLOWED_INCLUDE_ROOTS = () # is an admin. ADMIN_FOR = () -# Whether to check the flat-pages table as a last resort for all 404 errors. -USE_FLAT_PAGES = True - # 404s that may be ignored. IGNORABLE_404_STARTS = ('/cgi-bin/', '/_vti_bin', '/_vti_inf') IGNORABLE_404_ENDS = ('mail.pl', 'mailform.pl', 'mail.cgi', 'mailform.cgi', 'favicon.ico', '.php') diff --git a/django/contrib/flatpages/__init__.py b/django/contrib/flatpages/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/django/contrib/flatpages/middleware.py b/django/contrib/flatpages/middleware.py new file mode 100644 index 0000000000..9c4e0bb44e --- /dev/null +++ b/django/contrib/flatpages/middleware.py @@ -0,0 +1,15 @@ +from django.contrib.flatpages.views import flatpage +from django.conf.settings import DEBUG + +class FlatpageFallbackMiddleware: + def process_response(self, request, response): + if response.status_code != 404: + return response # No need to check for a flatpage for non-404 responses. + try: + return flatpage(request, request.path) + # Return the original response if any errors happened. Because this + # is a middleware, we can't assume the errors will be caught elsewhere. + except: + if DEBUG: + raise + return response diff --git a/django/contrib/flatpages/models/__init__.py b/django/contrib/flatpages/models/__init__.py new file mode 100644 index 0000000000..bb46349b5a --- /dev/null +++ b/django/contrib/flatpages/models/__init__.py @@ -0,0 +1 @@ +__all__ = ['flatpages'] diff --git a/django/contrib/flatpages/models/flatpages.py b/django/contrib/flatpages/models/flatpages.py new file mode 100644 index 0000000000..cfb2741d34 --- /dev/null +++ b/django/contrib/flatpages/models/flatpages.py @@ -0,0 +1,33 @@ +from django.core import meta, validators +from django.models.core import Site +from django.utils.translation import gettext_lazy as _ + +class FlatPage(meta.Model): + url = meta.CharField(_('URL'), maxlength=100, validator_list=[validators.isAlphaNumericURL], + help_text=_("Example: '/about/contact/'. Make sure to have leading and trailing slashes.")) + title = meta.CharField(_('title'), maxlength=200) + content = meta.TextField(_('content')) + enable_comments = meta.BooleanField(_('enable comments')) + template_name = meta.CharField(_('template name'), maxlength=70, blank=True, + help_text=_("Example: 'flatpages/contact_page'. If this isn't provided, the system will use 'flatpages/default'.")) + registration_required = meta.BooleanField(_('registration required'), help_text=_("If this is checked, only logged-in users will be able to view the page.")) + sites = meta.ManyToManyField(Site) + class META: + db_table = 'django_flatpages' + verbose_name = _('flat page') + verbose_name_plural = _('flat pages') + ordering = ('url',) + admin = meta.Admin( + fields = ( + (None, {'fields': ('url', 'title', 'content', 'sites')}), + ('Advanced options', {'classes': 'collapse', 'fields': ('enable_comments', 'registration_required', 'template_name')}), + ), + list_filter = ('sites',), + search_fields = ('url', 'title'), + ) + + def __repr__(self): + return "%s -- %s" % (self.url, self.title) + + def get_absolute_url(self): + return self.url diff --git a/django/conf/urls/flatfiles.py b/django/contrib/flatpages/urls.py similarity index 55% rename from django/conf/urls/flatfiles.py rename to django/contrib/flatpages/urls.py index 1d29463319..c78022c4e4 100644 --- a/django/conf/urls/flatfiles.py +++ b/django/contrib/flatpages/urls.py @@ -1,5 +1,5 @@ from django.conf.urls.defaults import * urlpatterns = patterns('django.views', - (r'^(?P.*)$', 'core.flatfiles.flat_file'), + (r'^(?P.*)$', 'django.contrib.flatpages.views.flatpage'), ) diff --git a/django/views/core/flatfiles.py b/django/contrib/flatpages/views.py similarity index 66% rename from django/views/core/flatfiles.py rename to django/contrib/flatpages/views.py index ded33d4cdd..48cd4526ab 100644 --- a/django/views/core/flatfiles.py +++ b/django/contrib/flatpages/views.py @@ -1,28 +1,28 @@ from django.core import template_loader from django.core.extensions import get_object_or_404, DjangoContext -from django.models.core import flatfiles +from django.models.flatpages import flatpages from django.utils.httpwrappers import HttpResponse from django.conf.settings import SITE_ID -DEFAULT_TEMPLATE = 'flatfiles/default' +DEFAULT_TEMPLATE = 'flatpages/default' -def flat_file(request, url): +def flatpage(request, url): """ - Flat file view + Flat page view. - Models: `core.flatfiles` + Models: `flatpages.flatpages` Templates: Uses the template defined by the ``template_name`` field, - or `flatfiles/default` if template_name is not defined. + or `flatpages/default` if template_name is not defined. Context: - flatfile - `flatfiles.flatfiles` object + flatpage + `flatpages.flatpages` object """ if not url.startswith('/'): url = "/" + url - f = get_object_or_404(flatfiles, url__exact=url, sites__id__exact=SITE_ID) + f = get_object_or_404(flatpages, url__exact=url, sites__id__exact=SITE_ID) # If registration is required for accessing this page, and the user isn't # logged in, redirect to the login page. - if request.user.is_anonymous() and f.registration_required: + if f.registration_required and request.user.is_anonymous(): from django.views.auth.login import redirect_to_login return redirect_to_login(request.path) if f.template_name: @@ -30,6 +30,6 @@ def flat_file(request, url): else: t = template_loader.get_template(DEFAULT_TEMPLATE) c = DjangoContext(request, { - 'flatfile': f, + 'flatpage': f, }) return HttpResponse(t.render(c)) diff --git a/django/contrib/redirects/__init__.py b/django/contrib/redirects/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/django/contrib/redirects/middleware.py b/django/contrib/redirects/middleware.py new file mode 100644 index 0000000000..c8f09ada8e --- /dev/null +++ b/django/contrib/redirects/middleware.py @@ -0,0 +1,27 @@ +from django.models.redirects import redirects +from django.utils import httpwrappers +from django.conf.settings import APPEND_SLASH, SITE_ID + +class RedirectFallbackMiddleware: + def process_response(self, request, response): + if response.status_code != 404: + return response # No need to check for a redirect for non-404 responses. + path = request.get_full_path() + try: + r = redirects.get_object(site__id__exact=SITE_ID, old_path__exact=path) + except redirects.RedirectDoesNotExist: + r = None + if r is None and APPEND_SLASH: + # Try removing the trailing slash. + try: + r = redirects.get_object(site__id__exact=SITE_ID, + old_path__exact=path[:path.rfind('/')]+path[path.rfind('/')+1:]) + except redirects.RedirectDoesNotExist: + pass + if r is not None: + if r == '': + return httpwrappers.HttpResponseGone() + return httpwrappers.HttpResponseRedirect(r.new_path) + + # No redirect was found. Return the response. + return response diff --git a/django/contrib/redirects/models/__init__.py b/django/contrib/redirects/models/__init__.py new file mode 100644 index 0000000000..05063b2146 --- /dev/null +++ b/django/contrib/redirects/models/__init__.py @@ -0,0 +1 @@ +__all__ = ['redirects'] diff --git a/django/contrib/redirects/models/redirects.py b/django/contrib/redirects/models/redirects.py new file mode 100644 index 0000000000..06dcdb38ac --- /dev/null +++ b/django/contrib/redirects/models/redirects.py @@ -0,0 +1,23 @@ +from django.core import meta +from django.models.core import Site +from django.utils.translation import gettext_lazy as _ + +class Redirect(meta.Model): + site = meta.ForeignKey(Site, radio_admin=meta.VERTICAL) + old_path = meta.CharField(_('redirect from'), maxlength=200, db_index=True, + help_text=_("This should be an absolute path, excluding the domain name. Example: '/events/search/'.")) + new_path = meta.CharField(_('redirect to'), maxlength=200, blank=True, + help_text=_("This can be either an absolute path (as above) or a full URL starting with 'http://'.")) + class META: + verbose_name = _('redirect') + verbose_name_plural = _('redirects') + db_table = 'django_redirects' + unique_together=(('site', 'old_path'),) + ordering = ('old_path',) + admin = meta.Admin( + list_filter = ('site',), + search_fields = ('old_path', 'new_path'), + ) + + def __repr__(self): + return "%s ---> %s" % (self.old_path, self.new_path) diff --git a/django/middleware/common.py b/django/middleware/common.py index fb37f653c1..1e437170e3 100644 --- a/django/middleware/common.py +++ b/django/middleware/common.py @@ -1,8 +1,6 @@ from django.conf import settings -from django.core import exceptions from django.utils import httpwrappers from django.core.mail import mail_managers -from django.views.core.flatfiles import flat_file import md5, os class CommonMiddleware: @@ -17,9 +15,6 @@ class CommonMiddleware: - ETags: If the USE_ETAGS setting is set, ETags will be calculated from the entire page content and Not Modified responses will be returned appropriately. - - - Flat files: For 404 responses, a flat file matching the given path - will be looked up and used if found. """ def process_request(self, request): @@ -55,12 +50,6 @@ class CommonMiddleware: def process_response(self, request, response): "Check for a flat page (for 404s) and calculate the Etag, if needed." if response.status_code == 404: - if settings.USE_FLAT_PAGES: - try: - return flat_file(request, request.path) - except exceptions.Http404: - pass - if settings.SEND_BROKEN_LINK_EMAILS: # If the referrer was from an internal link or a non-search-engine site, # send a note to the managers. diff --git a/django/models/core.py b/django/models/core.py index 1c52affdfd..17519b53d8 100644 --- a/django/models/core.py +++ b/django/models/core.py @@ -1,6 +1,6 @@ import base64, md5, random, sys import cPickle as pickle -from django.core import meta, validators +from django.core import meta from django.utils.translation import gettext_lazy as _ class Site(meta.Model): @@ -63,56 +63,6 @@ class ContentType(meta.Model): """ return self.get_model_module().get_object(**kwargs) -class Redirect(meta.Model): - site = meta.ForeignKey(Site, radio_admin=meta.VERTICAL) - old_path = meta.CharField(_('redirect from'), maxlength=200, db_index=True, - help_text=_("This should be an absolute path, excluding the domain name. Example: '/events/search/'.")) - new_path = meta.CharField(_('redirect to'), maxlength=200, blank=True, - help_text=_("This can be either an absolute path (as above) or a full URL starting with 'http://'.")) - class META: - verbose_name = _('redirect') - verbose_name_plural = _('redirects') - db_table = 'redirects' - unique_together=(('site', 'old_path'),) - ordering = ('old_path',) - admin = meta.Admin( - list_filter = ('site',), - search_fields = ('old_path', 'new_path'), - ) - - def __repr__(self): - return "%s ---> %s" % (self.old_path, self.new_path) - -class FlatFile(meta.Model): - url = meta.CharField(_('URL'), maxlength=100, validator_list=[validators.isAlphaNumericURL], - help_text=_("Example: '/about/contact/'. Make sure to have leading and trailing slashes.")) - title = meta.CharField(_('title'), maxlength=200) - content = meta.TextField(_('content')) - enable_comments = meta.BooleanField(_('enable comments')) - template_name = meta.CharField(_('template name'), maxlength=70, blank=True, - help_text=_("Example: 'flatfiles/contact_page'. If this isn't provided, the system will use 'flatfiles/default'.")) - registration_required = meta.BooleanField(_('registration required'), help_text=_("If this is checked, only logged-in users will be able to view the page.")) - sites = meta.ManyToManyField(Site) - class META: - db_table = 'flatfiles' - verbose_name = _('flat page') - verbose_name_plural = _('flat pages') - ordering = ('url',) - admin = meta.Admin( - fields = ( - (None, {'fields': ('url', 'title', 'content', 'sites')}), - ('Advanced options', {'classes': 'collapse', 'fields': ('enable_comments', 'registration_required', 'template_name')}), - ), - list_filter = ('sites',), - search_fields = ('url', 'title'), - ) - - def __repr__(self): - return "%s -- %s" % (self.url, self.title) - - def get_absolute_url(self): - return self.url - class Session(meta.Model): session_key = meta.CharField(_('session key'), maxlength=40, primary_key=True) session_data = meta.TextField(_('session data')) diff --git a/django/views/defaults.py b/django/views/defaults.py index 45e5636c5a..062f1a8cf5 100644 --- a/django/views/defaults.py +++ b/django/views/defaults.py @@ -4,7 +4,7 @@ from django.models.core import sites, contenttypes from django.utils import httpwrappers def shortcut(request, content_type_id, object_id): - """Redirect to an object's page based on a content-type ID and an object ID""" + "Redirect to an object's page based on a content-type ID and an object ID." # Look up the object, making sure it's got a get_absolute_url() function. try: content_type = contenttypes.get_object(pk=content_type_id) @@ -15,23 +15,23 @@ def shortcut(request, content_type_id, object_id): absurl = obj.get_absolute_url() except AttributeError: raise Http404, "%s objects don't have get_absolute_url() methods" % content_type.name - - # Try to figure out the object's domain so we can do a cross-site redirect - # if necessary + + # Try to figure out the object's domain, so we can do a cross-site redirect + # if necessary. # If the object actually defines a domain, we're done. if absurl.startswith('http://'): return httpwrappers.HttpResponseRedirect(absurl) object_domain = None - + # Next, look for an many-to-many relationship to sites if hasattr(obj, 'get_site_list'): site_list = obj.get_site_list() if site_list: object_domain = site_list[0].domain - - # Next, look for a many-to-one relationship to sites + + # Next, look for a many-to-one relationship to sites elif hasattr(obj, 'get_site'): try: object_domain = obj.get_site().domain @@ -55,34 +55,15 @@ def page_not_found(request): Templates: `404` Context: None """ - from django.models.core import redirects - from django.conf.settings import APPEND_SLASH, SITE_ID - path = request.get_full_path() - try: - r = redirects.get_object(site__id__exact=SITE_ID, old_path__exact=path) - except redirects.RedirectDoesNotExist: - r = None - if r is None and APPEND_SLASH: - # Try removing the trailing slash. - try: - r = redirects.get_object(site__id__exact=SITE_ID, old_path__exact=path[:path.rfind('/')]+path[path.rfind('/')+1:]) - except redirects.RedirectDoesNotExist: - pass - if r is not None: - if r == '': - return httpwrappers.HttpResponseGone() - return httpwrappers.HttpResponseRedirect(r.new_path) t = loader.get_template('404') - c = Context() - return httpwrappers.HttpResponseNotFound(t.render(c)) + return httpwrappers.HttpResponseNotFound(t.render(Context())) def server_error(request): """ - 500 Error handler + 500 error handler. Templates: `500` Context: None """ t = loader.get_template('500') - c = Context() - return httpwrappers.HttpResponseServerError(t.render(c)) + return httpwrappers.HttpResponseServerError(t.render(Context())) diff --git a/docs/flatpages.txt b/docs/flatpages.txt new file mode 100644 index 0000000000..5c0520dae0 --- /dev/null +++ b/docs/flatpages.txt @@ -0,0 +1,114 @@ +================= +The flatpages app +================= + +Django comes with an optional "flatpages" application. It lets you store simple +"flat" HTML content in a database and handles the management for you. + +A flatpage is a simple object with a URL, title and content. Use it for +one-off, special-case pages, such as "About" or "Privacy Policy" pages, that +you want to store in a database but for which you don't want to develop a +custom Django application. + +A flatpage can use a custom template or a default, systemwide flatpage +template. It can be associated with one, or multiple, sites. + +Here are some examples of flatpages on Django-powered sites: + + * http://www.chicagocrime.org/about/ + * http://www.lawrence.com/about/contact/ + +Installation +============ + +To install the flatpages app, follow these two steps: + + 1. Add ``"django.contrib.flatpages"`` to your INSTALLED_APPS_ setting. + 2. Add ``"django.contrib.flatpages.middleware.FlatpageFallbackMiddleware"`` + to your MIDDLEWARE_CLASSES_ setting. + 3. Run the command ``django-admin.py install flatpages``. + +.. _INSTALLED_APPS: http://www.djangoproject.com/documentation/settings/#installed-apps +.. _MIDDLEWARE_CLASSES: http://www.djangoproject.com/documentation/settings/#middleware-classes + +How it works +============ + +``django-admin.py install flatpages`` creates two tables in your database: +``django_flatpages`` and ``django_flatpages_sites``. ``django_flatpages`` is a +simple lookup table that essentially maps a URL to a title and bunch of text +content. ``django_flatpages_sites`` associates a flatpage with a site. + +The ``FlatpageFallbackMiddleware`` does all of the work. Each time any Django +application raises a 404 error, this middleware checks the flatpages database +for the requested URL as a last resort. Specifically, it checks for a flatpage +with the given URL with a site ID that corresponds to the SITE_ID_ setting. + +If it finds a match, it follows this algorithm: + + * If the flatpage has a custom template, it loads that template. Otherwise, + it loads the template ``flatpages/default``. + * It passes that template a single context variable, ``flatpage``, which is + the flatpage object. It uses DjangoContext_ in rendering the template. + +If it doesn't find a match, the request continues to be processed as usual. + +The middleware only gets activated for 404s -- not for 500s or responses of any +other status code. + +Note that the order of ``MIDDLEWARE_CLASSES`` matters. Generally, you can put +``FlatpageFallbackMiddleware`` at the end of the list, because it's a last +resort. + +For more on middleware, read the `middleware docs`_. + +.. _SITE_ID: http://www.djangoproject.com/documentation/settings/#site-id +.. _DjangoContext: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-djangocontext +.. _middleware docs: http://www.djangoproject.com/documentation/middleware/ + +How to add, change and delete flatpages +======================================= + +Via the admin interface +----------------------- + +If you've activated the automatic Django admin interface, you should see a +"Flatpages" section on the admin index page. Edit flatpages as you edit any +other object in the system. + +Via the Python API +------------------ + +Flatpages are represented by a standard `Django model`_, which lives in +`django/contrib/flatpages/models/flatpages.py`_. You can access flatpage +objects via the `Django database API`_. + +.. _Django model: http://www.djangoproject.com/documentation/model_api/ +.. _django/contrib/flatpages/models/flatpages.py: http://code.djangoproject.com/browser/django/trunk/django/contrib/flatpages/models/flatpages.py +.. _Django database API: http://www.djangoproject.com/documentation/db_api/ + +Flatpage templates +================== + +By default, flatpages are rendered via the template ``flatpages/default``, but +you can override that for a particular flatpage. + +Creating the ``flatpages/default`` template is your responsibility; in your +template directory, just create a ``flatpages`` directory containing a file +``default.html``. + +Flatpage templates are passed a single context variable, ``flatpage``, which is +the flatpage object. + +Here's a sample ``flatpages/default`` template:: + + + + + {{ flatpage.title }} + + + {{ flatpage.content }} + + diff --git a/docs/legacy_databases.txt b/docs/legacy_databases.txt index beddc74134..f1b8f85970 100644 --- a/docs/legacy_databases.txt +++ b/docs/legacy_databases.txt @@ -69,10 +69,7 @@ following names: * ``sites`` * ``packages`` * ``content_types`` - * ``redirects`` - * ``flatfiles`` * ``core_sessions`` - * ``flatfiles_sites`` * ``auth_permissions`` * ``auth_groups`` * ``auth_users`` diff --git a/docs/middleware.txt b/docs/middleware.txt index a7a5474d84..5a01f728d4 100644 --- a/docs/middleware.txt +++ b/docs/middleware.txt @@ -72,10 +72,6 @@ Adds a few conveniences for perfectionists: MD5-hashing the page content, and it'll take care of sending ``Not Modified`` responses, if appropriate. -* Handles flat pages. Every time Django encounters a 404 -- either within - a view or as a result of no URLconfs matching -- it will check the - database of flat pages based on the current URL. - django.middleware.doc.XViewMiddleware ------------------------------------- diff --git a/docs/model-api.txt b/docs/model-api.txt index a9190c78fe..51086e426e 100644 --- a/docs/model-api.txt +++ b/docs/model-api.txt @@ -831,7 +831,7 @@ object, which takes the following parameters. All are optional. "click to expand" link. Fieldsets with the ``wide`` style will be given extra horizontal space. - For example (taken from the ``core.flatfiles`` model):: + For example (taken from the ``django.contrib.flatpages`` model):: fields = ( (None, { diff --git a/docs/redirects.txt b/docs/redirects.txt new file mode 100644 index 0000000000..08fae8a8dc --- /dev/null +++ b/docs/redirects.txt @@ -0,0 +1,72 @@ +================= +The redirects app +================= + +Django comes with an optional redirects application. It lets you store simple +redirects in a database and handles the redirecting for you. + +Installation +============ + +To install the redirects app, follow these two steps: + + 1. Add ``"django.contrib.redirects"`` to your INSTALLED_APPS_ setting. + 2. Add ``"django.contrib.redirects.middleware.RedirectFallbackMiddleware"`` + to your MIDDLEWARE_CLASSES_ setting. + 3. Run the command ``django-admin.py install redirects``. + +.. _INSTALLED_APPS: http://www.djangoproject.com/documentation/settings/#installed-apps +.. _MIDDLEWARE_CLASSES: http://www.djangoproject.com/documentation/settings/#middleware-classes + +How it works +============ + +``django-admin.py install redirects`` creates a ``django_redirects`` table in +your database. This is a simple lookup table with ``site_id``, ``old_path`` and +``new_path`` fields. + +The ``RedirectFallbackMiddleware`` does all of the work. Each time any Django +application raises a 404 error, this middleware checks the redirects database +for the requested URL as a last resort. Specifically, it checks for a redirect +with the given ``old_path`` with a site ID that corresponds to the SITE_ID_ +setting. + + * If it finds a match, and ``new_path`` is not empty, it redirects to + ``new_path``. + * If it finds a match, and ``new_path`` is empty, it sends a 410 ("Gone") + HTTP header and empty (content-less) response. + * If it doesn't find a match, the request continues to be processed as + usual. + +The middleware only gets activated for 404s -- not for 500s or responses of any +other status code. + +Note that the order of ``MIDDLEWARE_CLASSES`` matters. Generally, you can put +``RedirectFallbackMiddleware`` at the end of the list, because it's a last +resort. + +For more on middleware, read the `middleware docs`_. + +.. _SITE_ID: http://www.djangoproject.com/documentation/settings/#site-id +.. _middleware docs: http://www.djangoproject.com/documentation/middleware/ + +How to add, change and delete redirects +======================================= + +Via the admin interface +----------------------- + +If you've activated the automatic Django admin interface, you should see a +"Redirects" section on the admin index page. Edit redirects as you edit any +other object in the system. + +Via the Python API +------------------ + +Redirects are represented by a standard `Django model`_, which lives in +`django/contrib/redirects/models/redirects.py`_. You can access redirect +objects via the `Django database API`_. + +.. _Django model: http://www.djangoproject.com/documentation/model_api/ +.. _django/contrib/redirects/models/redirects.py: http://code.djangoproject.com/browser/django/trunk/django/contrib/redirects/models/redirects.py +.. _Django database API: http://www.djangoproject.com/documentation/db_api/ diff --git a/docs/settings.txt b/docs/settings.txt index c4eeb2e636..b5287b26a2 100644 --- a/docs/settings.txt +++ b/docs/settings.txt @@ -562,14 +562,6 @@ A boolean that specifies whether to output the "Etag" header. This saves bandwidth but slows down performance. This is only used if ``CommonMiddleware`` is installed (see the `middleware docs`_). -USE_FLAT_PAGES --------------- - -Default: ``True`` - -Whether to check the flat-pages table as a last resort for all 404 errors. This -is only used if ``CommonMiddleware`` is installed (see the `middleware docs`_). - .. _cache docs: http://www.djangoproject.com/documentation/cache/ .. _middleware docs: http://www.djangoproject.com/documentation/middleware/ .. _session docs: http://www.djangoproject.com/documentation/sessions/ diff --git a/docs/url_dispatch.txt b/docs/url_dispatch.txt index 3a3feea8be..363d31174a 100644 --- a/docs/url_dispatch.txt +++ b/docs/url_dispatch.txt @@ -56,7 +56,6 @@ module that will be used for the entire site. Here's the URLconf for the (r'^documentation/', include('django_website.apps.docs.urls.docs')), (r'^comments/', include('django.contrib.comments.urls.comments')), (r'^rss/', include('django.conf.urls.rss')), - (r'', include('django.conf.urls.flatfiles')), ) Note that an included URLconf receives any captured parameters from parent From e0ae394e64869ceedf9781ebd4003b9b50cfb1d2 Mon Sep 17 00:00:00 2001 From: Adrian Holovaty Date: Fri, 11 Nov 2005 05:13:57 +0000 Subject: [PATCH 7/8] Small bugfix to flatpages URLconf from [1166] git-svn-id: http://code.djangoproject.com/svn/django/trunk@1167 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/flatpages/urls.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/django/contrib/flatpages/urls.py b/django/contrib/flatpages/urls.py index c78022c4e4..49289304ff 100644 --- a/django/contrib/flatpages/urls.py +++ b/django/contrib/flatpages/urls.py @@ -1,5 +1,5 @@ from django.conf.urls.defaults import * -urlpatterns = patterns('django.views', - (r'^(?P.*)$', 'django.contrib.flatpages.views.flatpage'), +urlpatterns = patterns('django.contrib.flatpages.views', + (r'^(?P.*)$', 'flatpage'), ) From 1fccca25d5806c0a3cd8ec9ce545bd80719e8220 Mon Sep 17 00:00:00 2001 From: Georg Bauer Date: Fri, 11 Nov 2005 08:06:21 +0000 Subject: [PATCH 8/8] fixes #765, #767 and #770 - new sk, cs and zh_CN translations. thx vlado, Radek and limodou. git-svn-id: http://code.djangoproject.com/svn/django/trunk@1168 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/conf/locale/cs/LC_MESSAGES/django.mo | Bin 17670 -> 17863 bytes django/conf/locale/cs/LC_MESSAGES/django.po | 233 ++++++------------ django/conf/locale/sk/LC_MESSAGES/django.mo | Bin 17529 -> 18582 bytes django/conf/locale/sk/LC_MESSAGES/django.po | 48 +++- .../conf/locale/zh_CN/LC_MESSAGES/django.mo | Bin 15626 -> 16928 bytes .../conf/locale/zh_CN/LC_MESSAGES/django.po | 203 ++++++--------- 6 files changed, 197 insertions(+), 287 deletions(-) diff --git a/django/conf/locale/cs/LC_MESSAGES/django.mo b/django/conf/locale/cs/LC_MESSAGES/django.mo index 5c201bd7fb5231577ffc882e23867f673c80f200..ea693a8dcc3ccd1181f279f83a580685b06b64fb 100644 GIT binary patch delta 4651 zcmYk?P(e{dK%DXrij@Lcp-BQ|Q!+r}Npw0v*-v}`AG3+p zDsj13rC2$CDmq7Vnn9MvS*}0U^t5yyYY(Tx&dyq;?fvRhBt@k9t5P zolrED!+5@Vk-``nI#Ca}gk$k4YCyVsJOp9_CSw{FV>IqW zt;}KMKXaKMy8i~I;-I^YnTOf947Z^M_D>At`KF&jI)005a9X6Zgq_x7s2QBL^>e5h zzi;awVGi|APy>!+AM}72%*8m=#Hz6g*W3Cx=+*~-z}M{ftV9%GF|?de1uj47!5 zvT*{=!Rc6oKf(^w0RN0S1D~Ppzk%xK9~g}P9?AOaoZX=z5eMI6%n(dR?O`rzCJRt2 zu*lYzpgMdS_4#U?f{m!pA41Le6!M?xwe8oDN11+9|AV7ge~sksDE0}*pgK&#nV5wo z*od)s1zYexxDnU$%EaOKI2GeK5E@7kwqgrvKto15hc+5Dkz~{a(%rTp2eoARsF4-e z8%mI8nNrl!H=*8!?bdeGk{(4Jt}ax^Q87;YIGjm+5^5zXaS3ilj+=4cprF(FEo$#_ zW1X#NLVX_`LY?mSP&5A$AH#ZH8FkQun)x-<83^OmiN`!F##$`G9!$mM7*Xa1^yPU!!K=!@Bxn5NZoTZ~|6f0`5jXJcU}ZZqy3)pdNGyEATeXz%oWvj_s)X z{l@EgZuW+PJ{XDG`)Jf*OvL-K2>H*v%nvQ$In)5IqRvbJqmtnmfTK}+9*>&PG<0D$ zY76I}p7SUU;`wH&{YAAJs5hWG*n&F6du@9M>aZR~&ESl!UqHrU`cM=3uWi4Lx-XE? zdIyNAk48UCK(`u_>oir(17Z=71d80@}+0mQT=#OGd_d5 zuNMRH3TgmX6Ig$Z_;VVD;w@Ci|3kIACORJo!RtO8I4q?7n@OB#EJ$^y2l7f}QH6KZ9yS#RRK)c<9FpE%X&cN#9HJrjrG3%FMA{~Hv-Xc)ua zRCSbw8c-H$Ksl%_m}`GOABRvcMlEp#4#xEuhud&AzJ)pX6{_FVX^t7z*%+kvKc9kT zvJlnLVq{FF67>bNA2st=Py>1$b^n{T{UquE-57!wP+Rjc4nrTlR@H9=>WqxVP|U$t zz5nwm=mGVp8`oO5pjKuN&chBY!>>>?UBvgTFK@*ajygMA zQT^=2eB6%-cr%mrUqT_2;f7-!=HW)9FY^J$qdzA~4^BkQFb`X>3QMscM_^$#U$a=l zk6GA>I{kk~ty~1}+#|RSITq&POx9mZd54Ava2%h~4a-q0(}f!OS=3qR#d7=*HL$cC z=K&?CnQy`f+=ZI?tH`RGw^3Vg%hor{X1l4Mc2m#;67O?5NJBk18@2ayF&2waOV@zo z@jOQ1mzaYA{H4;~=As6&2-VM0+g@qwYf)R>jCzgTtrRrUJ*Y2?1E>d|Ky}z->z|RSG?Iw9gKnNCPY`X_7@}(w(I9zYyqC75$d<(sGLPsG=8{e1L*nk^2WQCp zZ#gh4$OfYK`Nu?C@;K2zwU5Wh6ryVZnM%6IYvhO5T~xF^Zx9yDTp$D284Ayki|Y0z z+d2tbZTTqrli%3-gZK!kC%+{<mmODXbwsA;)cFs`Yu?PX0jlka1)ud7TVgn<)&pm62FZeyROm zPGPA1#m{iEEe~*>LIOEq8$QBPQbnq5+d->nCuw9XSw=<^U8l(^;zza;T`RT!6%>Y$ z9P)ee9!Vl^6J0+g-K2!16J75*nBUA3XP(K%iWtFA1p1jDq09Rd2X)Tqu6VZ+S)pcu1t2{}gOI`j& zW!0;edv?V)`?^w7VpB6Rr+OkLe(W1WKj#ltuc~VB+?@QNUvRFsuV++GPCelYs99Z0 fx$Up%>w*^2TbXK}Co(1l2GZe$gQ{(wz0vpoC%5Mt delta 4464 zcmZwKdvuR=0LSs~{AQcNunBYNhuMso&7^JEX6}ZmNHQe1vW83^XxdjG@$6E0Ow+( zz!JkzOkn>Hd?fHYxNqX$c|Hg3dc za4QC4^DzH)j`4C5PDM1H zKbE5gbPeaDhjmeT5$gJtsO#6E<8Q!LY_pc5IZkiQVuz-iIBVxg8vj zTJtHW>vK@;u$oCsHNJEn)>TVpN-@7y1Te1YNX?F1YSlp zklNZE=?K)Czku!V06v00;z(V`qthAJAXVlVs$-Y2KSsB8XJ9&N0Qut=0;BZ& z*Nt+gE)jL(p{UI<+qxKoC@)8??HW|WTTvs~iCVHfs2d$d{r-%tzhKK(P`|%{+N`x1 z?cLnpH0DIRvNfvbv9{a|xz_Z;+W3U6pN6__4(djWZFxBcQeJ1v8|?SnF_`)aRLA#O zkD{YZ_L;5t7Bzw^sD^K$ZWPG0@DeliF&HCJBaTH~my99U7uA8Gs184b4R92y-Kn-d zA44cFXwUqAAHbtS#c(QeIvB%0Q^kii)m79c>)p|qnOKI}wV|=@jbc$9NCUb)Vokcauk;ewX2J!iG1Q$Tem(y$uZ}URWP?vk7HZ5 zehj9dcKt-u<64F}_y=kU#>TrHoPbG`pTxPi8MS0B`3t3iIWe55C-JB$Nw)UF9+U^# z?~70)UXIyVf(`Hw%tucb_l-9X)y^_hN7kTzSBjeYP4@e8tgq+a$BCx)5Z1*nF%o~k zURZ~}x#^gRYWQXAYHJy);Vr0v>_oLwi8Nu3pa*ZFMtmF9p;}#aJ?kIBiN0uvx!F5z}Gksf57$_#||BbBe4-y;sE>vlKxu7U8eT)~@iA!_KA3e-eHdzHB2XP~gPPg)sHZ9w_0$YTI^>va_r&C)dcFYFzzWoj*P=$S)z(*_ zhw?rQ#46NCkD?krkNW*D7>>VV0P=8|r9=n&)Vx9V==s-8KP0(ChZ<`XO=E6FTd_daeWdA1yh(}`x{UDa{_|2;mXR@0e4#*q`Gj66;B zF4#eId_c5Z&534fDA`Ih<%>u@=}dN#PDDpEIZ7TRj&`Yzr^tHp94RK6@+dNmtRgjs zo`$wH1>8sCYL2I4h`dMMA-#!?Bczg~la3nyJWh1H;Nt&W!{;utfgB_K$y)L# z*+gCkt(4LyoFI*>O0GxxvS1)T4;Wsyuu$&2J;;*{_)i0J4=^imnGf;}F> z9%L{XY3o+wHqzCW7hA;?a)>-aQb{$@F^R;G2o?T49RFLXFBOwX+P`1;&)V5?x%Iep zw6z;POAZhZ$s&nlKB+lcaq\n" "Language-Team: Czech\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" -"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Poedit-Language: Czech\n" "X-Poedit-Country: CZECH REPUBLIC\n" @@ -66,7 +65,8 @@ msgstr "Historie" msgid "Date/time" msgstr "Datum/čas" -#: contrib/admin/templates/admin/object_history.html:19 models/auth.py:47 +#: contrib/admin/templates/admin/object_history.html:19 +#: models/auth.py:47 msgid "User" msgstr "Uživatel" @@ -79,12 +79,8 @@ msgid "DATE_WITH_TIME_FULL" msgstr "Plné datum s časem" #: 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 "" -"Tento objekt nemá historii změn. Pravděpodobně nebyl přidán přes " -"administrátorské rozhraní." +msgid "This object doesn't have a change history. It probably wasn't added via this admin site." +msgstr "Tento objekt nemá historii změn. Pravděpodobně nebyl přidán přes administrátorské rozhraní." #: contrib/admin/templates/admin/base_site.html:4 msgid "Django site admin" @@ -107,12 +103,8 @@ msgid "Server Error (500)" msgstr "Chyba serveru (500)" #: contrib/admin/templates/admin/500.html:10 -msgid "" -"There's been an error. It's been reported to the site administrators via e-" -"mail and should be fixed shortly. Thanks for your patience." -msgstr "" -"Nastala chyba. Ta byla oznámena administrátorovi serveru pomocí e-mailu a " -"měla by být brzy odstraněna. Děkujeme za trpělivost." +msgid "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience." +msgstr "Nastala chyba. Ta byla oznámena administrátorovi serveru pomocí e-mailu a měla by být brzy odstraněna. Děkujeme za trpělivost." #: contrib/admin/templates/admin/404.html:4 #: contrib/admin/templates/admin/404.html:8 @@ -177,22 +169,13 @@ msgstr "Odhlásit se" #: contrib/admin/templates/admin/delete_confirmation.html:7 #, fuzzy, python-format -msgid "" -"Deleting the %(object_name)s '%(object)s' would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Mazání %(object_name)s '%(object)s' by vyústilo ve vymazání souvisejících " -"objektů, ale Váš účet nemá oprávnění pro mazání následujících typů objektů:" +msgid "Deleting the %(object_name)s '%(object)s' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:" +msgstr "Mazání %(object_name)s '%(object)s' by vyústilo ve vymazání souvisejících objektů, ale Váš účet nemá oprávnění pro mazání následujících typů objektů:" #: contrib/admin/templates/admin/delete_confirmation.html:14 #, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of " -"the following related items will be deleted:" -msgstr "" -"Jste si jist(á), že chcete smazat %(object_name)s \"%(object)s\"? Všechny " -"následující související položky budou smazány:" +msgid "Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of the following related items will be deleted:" +msgstr "Jste si jist(á), že chcete smazat %(object_name)s \"%(object)s\"? Všechny následující související položky budou smazány:" #: contrib/admin/templates/admin/delete_confirmation.html:18 msgid "Yes, I'm sure" @@ -221,12 +204,8 @@ msgid "Password reset" msgstr "Obnovení hesla" #: contrib/admin/templates/registration/password_reset_form.html:12 -msgid "" -"Forgotten your password? Enter your e-mail address below, and we'll reset " -"your password and e-mail the new one to you." -msgstr "" -"Zapomněl(a) jste heslo? Vložte níže Vaši e-mailovou adresu a my Vaše heslo " -"obnovíme a zašleme Vám e-mailem nové." +msgid "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you." +msgstr "Zapomněl(a) jste heslo? Vložte níže Vaši e-mailovou adresu a my Vaše heslo obnovíme a zašleme Vám e-mailem nové." #: contrib/admin/templates/registration/password_reset_form.html:16 msgid "E-mail address:" @@ -250,20 +229,12 @@ msgid "Password reset successful" msgstr "Obnovení hesla bylo úspěšné" #: contrib/admin/templates/registration/password_reset_done.html:12 -msgid "" -"We've e-mailed a new password to the e-mail address you submitted. You " -"should be receiving it shortly." -msgstr "" -"Poslali jsme Vám e-mailem nové heslo na adresu, kterou jste zadal(a). Měl(a) " -"byste ji dostat během okamžiku." +msgid "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly." +msgstr "Poslali jsme Vám e-mailem nové heslo na adresu, kterou jste zadal(a). Měl(a) byste ji dostat během okamžiku." #: contrib/admin/templates/registration/password_change_form.html:12 -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Prosíme, pro zabezpečení vložte svoje staré heslo a poté vložte dvakrát nové " -"heslo, takže můžeme ověřit, že jste ho napsal(a) správně." +msgid "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly." +msgstr "Prosíme, pro zabezpečení vložte svoje staré heslo a poté vložte dvakrát nové heslo, takže můžeme ověřit, že jste ho napsal(a) správně." #: contrib/admin/templates/registration/password_change_form.html:17 msgid "Old password:" @@ -348,23 +319,28 @@ msgstr "Leden" msgid "February" msgstr "Únor" -#: utils/dates.py:14 utils/dates.py:27 +#: utils/dates.py:14 +#: utils/dates.py:27 msgid "March" msgstr "Březen" -#: utils/dates.py:14 utils/dates.py:27 +#: utils/dates.py:14 +#: utils/dates.py:27 msgid "April" msgstr "Duben" -#: utils/dates.py:14 utils/dates.py:27 +#: utils/dates.py:14 +#: utils/dates.py:27 msgid "May" msgstr "Květen" -#: utils/dates.py:14 utils/dates.py:27 +#: utils/dates.py:14 +#: utils/dates.py:27 msgid "June" msgstr "Červen" -#: utils/dates.py:15 utils/dates.py:27 +#: utils/dates.py:15 +#: utils/dates.py:27 msgid "July" msgstr "Červenec" @@ -436,7 +412,10 @@ msgstr "weby" msgid "label" msgstr "nadpis" -#: models/core.py:29 models/core.py:40 models/auth.py:6 models/auth.py:19 +#: models/core.py:29 +#: models/core.py:40 +#: models/auth.py:6 +#: models/auth.py:19 msgid "name" msgstr "jméno" @@ -465,23 +444,16 @@ msgid "redirect from" msgstr "přesměrovat z" #: models/core.py:69 -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" -"Toto by měla být absolutní cesta, bez domény. Např. '/udalosti/hledat/'." +msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'." +msgstr "Toto by měla být absolutní cesta, bez domény. Např. '/udalosti/hledat/'." #: models/core.py:70 msgid "redirect to" msgstr "přesměrovat na" #: models/core.py:71 -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." -msgstr "" -"Toto může být buď absolutní cesta (jako nahoře) nebo plné URL začínající na " -"'http://'." +msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'." +msgstr "Toto může být buď absolutní cesta (jako nahoře) nebo plné URL začínající na 'http://'." #: models/core.py:73 msgid "redirect" @@ -496,10 +468,8 @@ msgid "URL" msgstr "URL" #: models/core.py:88 -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" -"Příklad: '/o/kontakt/'. Ujistěte se, že máte počáteční a konečná lomítka." +msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "Příklad: '/o/kontakt/'. Ujistěte se, že máte počáteční a konečná lomítka." #: models/core.py:89 msgid "title" @@ -518,12 +488,8 @@ msgid "template name" msgstr "jméno šablony" #: models/core.py:93 -msgid "" -"Example: 'flatfiles/contact_page'. If this isn't provided, the system will " -"use 'flatfiles/default'." -msgstr "" -"Například: 'flatfiles/kontaktni_stranka'. Pokud toto není zadáno, systém " -"použije 'flatfiles/default'." +msgid "Example: 'flatfiles/contact_page'. If this isn't provided, the system will use 'flatfiles/default'." +msgstr "Například: 'flatfiles/kontaktni_stranka'. Pokud toto není zadáno, systém použije 'flatfiles/default'." #: models/core.py:94 msgid "registration required" @@ -531,9 +497,7 @@ msgstr "nutná registrace" #: models/core.py:94 msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Pokud je zaškrtnuto, pouze přihlášení uživatelé budou moci prohlížet tuto " -"stránku." +msgstr "Pokud je zaškrtnuto, pouze přihlášení uživatelé budou moci prohlížet tuto stránku." #: models/core.py:98 msgid "flat page" @@ -571,7 +535,8 @@ msgstr "codename" msgid "Permission" msgstr "Oprávnění" -#: models/auth.py:11 models/auth.py:58 +#: models/auth.py:11 +#: models/auth.py:58 msgid "Permissions" msgstr "Oprávnění" @@ -579,7 +544,8 @@ msgstr "Oprávnění" msgid "Group" msgstr "Skupina" -#: models/auth.py:23 models/auth.py:60 +#: models/auth.py:23 +#: models/auth.py:60 msgid "Groups" msgstr "Skupiny" @@ -633,12 +599,8 @@ msgid "date joined" msgstr "datum zaregistrování" #: models/auth.py:44 -msgid "" -"In addition to the permissions manually assigned, this user will also get " -"all permissions granted to each group he/she is in." -msgstr "" -"Kromě manuálně přidělených oprávnění uživatel dostane všechna oprávnění pro " -"každou skupinu, ve které je." +msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in." +msgstr "Kromě manuálně přidělených oprávnění uživatel dostane všechna oprávnění pro každou skupinu, ve které je." #: models/auth.py:48 msgid "Users" @@ -658,7 +620,7 @@ msgstr "Zpráva" #: conf/global_settings.py:36 msgid "Bengali" -msgstr "" +msgstr "Bengálsky" #: conf/global_settings.py:37 msgid "Czech" @@ -666,7 +628,7 @@ msgstr "Česky" #: conf/global_settings.py:38 msgid "Welsh" -msgstr "" +msgstr "Welšsky" #: conf/global_settings.py:39 msgid "German" @@ -685,9 +647,8 @@ msgid "French" msgstr "Francouzsky" #: conf/global_settings.py:43 -#, fuzzy msgid "Galician" -msgstr "Galicijský" +msgstr "Galicijsky" #: conf/global_settings.py:44 msgid "Italian" @@ -703,7 +664,7 @@ msgstr "Brazilsky" #: conf/global_settings.py:47 msgid "Romanian" -msgstr "" +msgstr "Rumunsky" #: conf/global_settings.py:48 msgid "Russian" @@ -711,7 +672,7 @@ msgstr "Rusky" #: conf/global_settings.py:49 msgid "Slovak" -msgstr "" +msgstr "Slovensky" #: conf/global_settings.py:50 msgid "Serbian" @@ -727,8 +688,7 @@ msgstr "Tato hodnota musí obsahovat pouze znaky, čísla nebo podtržítka." #: core/validators.py:63 msgid "This value must contain only letters, numbers, underscores and slashes." -msgstr "" -"Tato hodnota musí obsahovat pouze znaky, čísla, podtržítka nebo lomítka." +msgstr "Tato hodnota musí obsahovat pouze znaky, čísla, podtržítka nebo lomítka." #: core/validators.py:71 msgid "Uppercase letters are not allowed here." @@ -787,12 +747,8 @@ msgid "Enter a valid e-mail address." msgstr "Vložte platnou e-mailovou adresu." #: core/validators.py:147 -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Nahrajte na server platný obrázek. Soubor, který jste nahrál(a) nebyl " -"obrázek, nebo byl porušen." +msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image." +msgstr "Nahrajte na server platný obrázek. Soubor, který jste nahrál(a) nebyl obrázek, nebo byl porušen." #: core/validators.py:154 #, python-format @@ -858,7 +814,8 @@ msgstr "Toto pole se musí shodovat s polem '%s'." msgid "Please enter something for at least one field." msgstr "Prosíme, vložte něco alespoň pro jedno pole." -#: core/validators.py:259 core/validators.py:270 +#: core/validators.py:259 +#: core/validators.py:270 msgid "Please enter both fields or leave them both empty." msgstr "Prosíme, vložte obě pole, nebo je nechte obě prázdná." @@ -888,8 +845,7 @@ msgstr "Prosíme, vložte platné číslo." #: core/validators.py:344 #, python-format msgid "Please enter a valid decimal number with at most %s total digit." -msgid_plural "" -"Please enter a valid decimal number with at most %s total digits." +msgid_plural "Please enter a valid decimal number with at most %s total digits." msgstr[0] "Prosíme, vložte platné číslo s nejvíce %s cifrou celkem." msgstr[1] "Prosíme, vložte platné číslo s nejvíce %s ciframi celkem." msgstr[2] "Prosíme, vložte platné číslo s nejvíce %s ciframi celkem." @@ -897,16 +853,10 @@ msgstr[2] "Prosíme, vložte platné číslo s nejvíce %s ciframi celkem." #: core/validators.py:347 #, python-format msgid "Please enter a valid decimal number with at most %s decimal place." -msgid_plural "" -"Please enter a valid decimal number with at most %s decimal places." -msgstr[0] "" -"Prosíme, vložte platné číslo s nejvíce %s cifrou za desetinnou čárkou celkem." -msgstr[1] "" -"Prosíme, vložte platné číslo s nejvíce %s ciframi za desetinnou čárkou " -"celkem." -msgstr[2] "" -"Prosíme, vložte platné číslo s nejvíce %s ciframi za desetinnou čárkou " -"celkem." +msgid_plural "Please enter a valid decimal number with at most %s decimal places." +msgstr[0] "Prosíme, vložte platné číslo s nejvíce %s cifrou za desetinnou čárkou celkem." +msgstr[1] "Prosíme, vložte platné číslo s nejvíce %s ciframi za desetinnou čárkou celkem." +msgstr[2] "Prosíme, vložte platné číslo s nejvíce %s ciframi za desetinnou čárkou celkem." #: core/validators.py:357 #, python-format @@ -933,71 +883,44 @@ msgstr "Nemohl jsem získat nic z %s." #: core/validators.py:424 #, python-format -msgid "" -"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." +msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." msgstr "URL %(url)s vrátilo neplatnou hlavičku Content-Type '%(contenttype)s'." #: core/validators.py:457 #, python-format -msgid "" -"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with " -"\"%(start)s\".)" -msgstr "" -"Prosíme, zavřete nezavřenou značku %(tag)s z řádky %(line)s. (Řádka začíná s " -"\"%(start)s\".)" +msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)" +msgstr "Prosíme, zavřete nezavřenou značku %(tag)s z řádky %(line)s. (Řádka začíná s \"%(start)s\".)" #: core/validators.py:461 #, python-format -msgid "" -"Some text starting on line %(line)s is not allowed in that context. (Line " -"starts with \"%(start)s\".)" -msgstr "" -"Nějaký text začínající na řádce %(line)s není povolen v tomto kontextu. " -"(Řádka začíná s \"%(start)s\".)" +msgid "Some text starting on line %(line)s is not allowed in that context. (Line starts with \"%(start)s\".)" +msgstr "Nějaký text začínající na řádce %(line)s není povolen v tomto kontextu. (Řádka začíná s \"%(start)s\".)" #: core/validators.py:466 #, python-format -msgid "" -"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%" -"(start)s\".)" -msgstr "" -"\"%(attr)s\" na řádce %(line)s je neplatný atribut. (Řádka začíná s \"%" -"(start)s\".)" +msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)" +msgstr "\"%(attr)s\" na řádce %(line)s je neplatný atribut. (Řádka začíná s \"%(start)s\".)" #: core/validators.py:471 #, python-format -msgid "" -"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%" -"(start)s\".)" -msgstr "" -"\"<%(tag)s>\" na řádce %(line)s je neplatná značka. (Řádka začíná s \"%" -"(start)s\".)" +msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)" +msgstr "\"<%(tag)s>\" na řádce %(line)s je neplatná značka. (Řádka začíná s \"%(start)s\".)" #: core/validators.py:475 #, python-format -msgid "" -"A tag on line %(line)s is missing one or more required attributes. (Line " -"starts with \"%(start)s\".)" -msgstr "" -"Značce na řádce %(line)s schází jeden nebo více požadovaných atributů. " -"(Řádka začíná s \"%(start)s\".)" +msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)" +msgstr "Značce na řádce %(line)s schází jeden nebo více požadovaných atributů. (Řádka začíná s \"%(start)s\".)" #: core/validators.py:480 #, python-format -msgid "" -"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line " -"starts with \"%(start)s\".)" -msgstr "" -"Atribut \"%(attr)s\" na řádce %(line)s má neplatnou hodnotu. (Řádka začína s " -"\"%(start)s\".)" +msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)" +msgstr "Atribut \"%(attr)s\" na řádce %(line)s má neplatnou hodnotu. (Řádka začína s \"%(start)s\".)" #: core/meta/fields.py:111 msgid " Separate multiple IDs with commas." msgstr "Oddělte více identifikátorů čárkami." #: core/meta/fields.py:114 -msgid "" -" Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" -"Podržte \"Control\", nebo \"Command\" na Macu pro vybrání více jak jedné " -"položky." +msgid " Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "Podržte \"Control\", nebo \"Command\" na Macu pro vybrání více jak jedné položky." + diff --git a/django/conf/locale/sk/LC_MESSAGES/django.mo b/django/conf/locale/sk/LC_MESSAGES/django.mo index a5bc1eeb7acb7a2548fa1803d31eafd09793f00d..8dc45e23e61d82109accb2ca4441ace825a4e846 100644 GIT binary patch delta 5538 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 U;D1Nj?yoqP#!4qv%o>ySA3nh)@c;k- delta 4511 zcmYk;4^)=b0mt$C@<%{W6p;{6UqO-NkDy|}BymY1pcu69KZ2q#6;TQQrLW;iEte+# ziB&UNx`~;Mw_J&(rG@NxT$3|bcyyf|JFU)~9k!ii`}_U9&vp77e(&er=Y5|0+~+>` zJ}(EJcirCM@?4Jy*l*Z6NgR2!k1_pR#_S5yUSrMAzyu5$$T66VCAbx<@Dq&2 z@e#(*gegXUEWsaG2sGf+a%yf%tSRf7x^=b z_|W+c7>rx+2yVx0Oyeqpu?E%7794?lFr4d~b_((A_z;8e3rxhDn1qp>Jsxv$D6U40 z#BSuzc=^!rU6_I2U=hYg8M7GcP#wFBS$Gv2G4eh}itC$aRlvQd16yqURn(mxwe=I2 zNBtzKqyNAF{4Y+!0LEV#0jz%|5 z!~)Dj52|Btqn>dG>i9FLb~>>yUc!F(87AYG*dGVQIFBqohVj=Or?5i}WTH;U#WXBJ zov;ygXFHKU(_;6(g|unTq2|Cf)P=vqQ0zsu_aA%^!(xq@gGK1Z!?BG2(-b~tM-$Fq z322gig5&V-sE#D@;J0HrszZN3O{Tw~I&OwJk1iP1k%6fFu}IS<0X4FdQIosaTH&Ff zNwNlY!WGmIUdIRV3#9XAwFK!q(GJ=jWg% z>2$k)4r(%1qdH!1>l=|K%~Kf2_08+{i+0q3@1ZW#Y3tn>K>eDn|IvQ`XAENhx2TTm zHf0EEl1141DAWz4q1v57*B6)Vfj3YW{svFrZ7jf} zsm{B;7j?(MycF~dhoH{Sv-MKc&~8BHquGZ1nWKDYm3@k=XcNv%=c$=A4+X8q$B>&c zD^csR1()GPtilQDPR9sao&<&**^_Y$WuoZPeJF3Ccs5x=o+J#}%FCo9Y<|?Wqw~&=={)v;(%}=S`AB&Jj zVMeTKTz&#hl$f9ik3htZ$+ttM+B@=`Q!;EVWMdgoAJo>J9fAuEsN{JIu&- z&dWvmWb#oXu?ZLA5gd$xIgEc1g;)ye;WE^$-j5oh)2MfT4<5jO;XG{qp7XPN3#U>K znZz$A&O{cBc?suZ7nWdRE)y6VQSBc?y{a$gGXCm76f;84unIL2%h4a#pzf>@N8_JR z7aG90YP~N+t@m2g99e~09Z%p^^dj@wOvq#Oa4D+&i>MLq&ht3y_ZmCm*l`OBF>H#{ z({hZVz6DvjrUmuvE?_^rit6}Rw%%*&=KD^^LQowIM?IPt)T2wpaLn;gP|pid%d8wD zu?C}XGir70v){K^+faAbff|9EsN?^Nx?o?%cOVW%wL2QsP8RCUb5R}gOrxM7DML-R zxu^!KPW($@E4Dk-sb`ek;I1oA9VXEicB0dt0ETTT3khFmLS963d_Z6;^A zzVEq=#*fIoTN9P%iJt3I_KO3k(b;e7dH5r8o@gQ#kq^jj@-mrArjuIo7FkEy$vLu; zcvkSCjiqWfl15e7mXWc((%p~uC~hLLM3d|pqU}kthb$p10N)Y>-w%}JHR0Pz`K-6) zR!5K7O5rfcA@7hm#7(r^v}KSPXe)Ct z8!$r8|5p?=W3|OQn8)xr@(TGWIY{!!G4e3Evo%myMHZ8vlMZqpd75ZjKz`;cIsfsf zc!*@#eY*btw_%jtwzW*_{rDl7Z|iSb6S3TuKgK%JZ0ql%KN(LRCyU4$qV0%-?{yqX z*>jqYZRDsb>7 PubUgE-u7\n" -"Language-Team: Slovak \n" +"Language-Team: Slovak \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -114,11 +114,11 @@ msgstr "" #: contrib/admin/templates/admin/404.html:4 #: contrib/admin/templates/admin/404.html:8 msgid "Page not found" -msgstr "Stránka sa nenašla" +msgstr "Stránka nebola nájdená" #: contrib/admin/templates/admin/404.html:10 msgid "We're sorry, but the requested page could not be found." -msgstr "Ľutujeme, ale požadovaná stránka sa nenašla." +msgstr "Ľutujeme, ale požadovaná stránka nebola nájdená." #: contrib/admin/templates/admin/index.html:27 msgid "Add" @@ -993,3 +993,41 @@ msgid "" msgstr "" " Podržte \"Control\", alebo \"Command\" na Mac_u, na výber viac ako jednej " "položky." +#:commit +msgid "Post a comment" +msgstr "Pošli komentár" + + +msgid "Comments" +msgstr "Komentáre" + +msgid "Comment" +msgstr "Komentár" + +msgid "Your name" +msgstr "Vaše meno" + +msgid "Preview revised comment" +msgstr "Ukázať upravený komentár" + +msgid "Post public comment" +msgstr "Zveréjniť komentár" + +msgid "Preview comment" +msgstr "Ukázať komentár" + +msgid "Posted by" +msgstr "Poslané" + +msgid "Or edit it again" +msgstr "Alebo ho vytvorte znova" + +msgid "Please correct the following errors." +msgstr "Odstráňte nasledujúce chyby, prosím." + +msgid "Looks like you followed a bad link. If you think it is our fault, please let us know" +msgstr "Pozrite si linku , kde vzikla chyba. Ak si myslíte, že je to naša chyba, dajte nám to vedieť, prosím" + +msgid "Here is a link to the homepage. You know, just in case" +msgstr "Tu je adresa úvodnej stránky. Ak by ste ju potrebovali" + diff --git a/django/conf/locale/zh_CN/LC_MESSAGES/django.mo b/django/conf/locale/zh_CN/LC_MESSAGES/django.mo index 9b5281536d7165d17e0350ada4f3208c6323d884..0b816cf39727167b462d28a1f988b997b85af0f2 100644 GIT binary patch delta 5466 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 O(B8x9CS~l0E&c_6f?)0d delta 4352 zcmYk<32;@_9mnzWvIhu(Bp`{9g+LavLRJDsRucu9RDqz70>-j0MT!9-T(m$yskA)N zvSU;#B8xl`K?Pa{9c#7B6g%zEYD#gS;f-8DtE19tYqh)WEUH z&hgJB@S@LWp-xbMaaf8&aVYk}rKoW>VixCjJE-UcA7X#}3}f*c=HP!Y4>Oo$8P;Pz zT!mVZ?WloIp^m?RgYg!Q!y?{n!4;^9{RuU(OIXeM-Bl`2;eg)$((N!iPzUa}_EFRo zpRo3696|dd)P!U2@lTM5b+l7Z7d8#saDlb2ppO3*JzwwH-21 z#}#2NR$wJIV+Fp5n&7Wc_x?QU_zS3U{)k=hub6=U?8EvOP`OP*_r!+8k3+ zA3Tj(s*h0<`W!j8OJK)M$2{bAyA7z#wFkBIS5YgOmF_>r6HuFT9)@IOBv zbwS>5b1{}jDi2Fg zdus}6C7O|y@!V`GI>AD$!d*BEzd#*0oXgM&9zfly2Go@{<7nK7IrtfBrLLn+n840yj=!ADL8Y7vm4v0s-=3Q^pfVrsmD^L>{hA#z}I5yC} z$PL%-E@1t&hw4y!VJ|l0x5z$pQ}X>=(VEZt$I!9bI@aMd+MBHXck>$ZW#w*QJSGnE z2S`O-c_wPYWvE*+0@*&U5q11hvki42?bhBpi1pV2d+5+pupc$RpHTx}LoHckf#08s zx`KSv#OqPJya7wG74O40klXJ5hWv9~3;oYmp^mS^B3$fI8A)XqPQ|ZK0}ta}ISO^) zgS@Q8R_niwns{WfKX3x-_aRJu{wkBjhK?2ZFV{Qh#( zz$49iv%#EfHlxOQ!rDtvE43W;YxuJHiM@Zz*K-l9n@$jqx}qMafzr%ehrDUYSib~AwMf_3+h%Lu>Mol{xsa?{(os5S5X7sK@Awkv}Gb{z}|R2W~06t zTafP>_daTZU*T{J4DoMSEj~wk0qXNNFbSjhBSPcegW=~t-8%Bj64cUFB7Z};N!Wt( zPy>CAn&?H;2`{6L@6V0aV>c4@x$QUx52Nn&b>!~4Vtz36bTp%su0rkVbWjVQ%f@(b)}=N-H4ib6YB9@YkzI;-$b2A8z%tTXZ*alXNZb!5952`zfQOd;WCcb56Dl6c5r7| zK}C-eixU3pXR*C;2+xwyWI35k-XtT5N+WrPY$orMZR9O7mH34-zei1*sk8imigvZi zMAC&c5G}LH5ppllGM^$3k|)S?qQZr{QRES_fE1BdqT8!-n&|0zm@Lzk^Z5S1@MML{ zB=a@%ZL=PqB0scthPe}mka^^J>ubZO$sn?wWRuQvhDrqSN_a^ny9keM_#19K>Ty%q zL+VH-(Jxsn=`3rgj3B!IJc;4LPkgwn2XJl!($NvdWr2Z1o_Xovut9d<1dXOz7 zha{6}L}dvXLpG2;be)ocPYImm*{e{z) zY$YncAa9Tm`H(zD`jK{`((L2*;w-CoqA!{6k%Q!Aq9-DX>?aQqoj?5F=W^^IJID-j zAL%U5QfVPSCJV`KvX-c<^Kn1IjaC;Ake+0=8kCu&g1k!x6P2#SdnH_T?&mm%OtE$; z)>!=*R+H}5K8mkfU2Gz+-qk)p{kwOy7g5hA-N;WJX3\n" "Language-Team: Simplified Chinese \n" "MIME-Version: 1.0\n" @@ -17,6 +17,7 @@ msgstr "" "X-Poedit-Language: Chinese\n" "X-Poedit-Country: CHINA\n" "X-Poedit-SourceCharset: utf-8\n" +"Plural-Forms: nplurals=1; plural=0;\n" #: contrib/admin/models/admin.py:6 msgid "action time" @@ -65,7 +66,8 @@ msgstr "历史" msgid "Date/time" msgstr "日期/时间" -#: contrib/admin/templates/admin/object_history.html:19 models/auth.py:47 +#: contrib/admin/templates/admin/object_history.html:19 +#: models/auth.py:47 msgid "User" msgstr "用户" @@ -78,9 +80,7 @@ msgid "DATE_WITH_TIME_FULL" msgstr "N j, 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." +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 @@ -92,9 +92,8 @@ msgid "Django administration" msgstr "Django管理员" #: contrib/admin/templates/admin/500.html:4 -#, fuzzy msgid "Server error" -msgstr "服务器错误(500)" +msgstr "服务器错误" #: contrib/admin/templates/admin/500.html:6 msgid "Server error (500)" @@ -105,12 +104,8 @@ msgid "Server Error (500)" msgstr "服务器错误 (500)" #: contrib/admin/templates/admin/500.html:10 -msgid "" -"There's been an error. It's been reported to the site administrators via e-" -"mail and should be fixed shortly. Thanks for your patience." -msgstr "" -"存在一个错误。它已经通过电子邮件被报告给站点管理员了,并且应该很快被改正。谢" -"谢你的关心。" +msgid "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience." +msgstr "存在一个错误。它已经通过电子邮件被报告给站点管理员了,并且应该很快被改正。谢谢你的关心。" #: contrib/admin/templates/admin/404.html:4 #: contrib/admin/templates/admin/404.html:8 @@ -174,22 +169,14 @@ msgid "Log out" msgstr "注销" #: contrib/admin/templates/admin/delete_confirmation.html:7 -#, fuzzy, python-format -msgid "" -"Deleting the %(object_name)s '%(object)s' would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"删除 %(object_name)s '%(object)s' 会导致删除相关的对象,但你的帐号无权删除下" -"列类型的对象:" +#, python-format +msgid "Deleting the %(object_name)s '%(object)s' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:" +msgstr "删除 %(object_name)s '%(object)s' 会导致删除相关的对象,但你的帐号无权删除下列类型的对象:" #: contrib/admin/templates/admin/delete_confirmation.html:14 #, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of " -"the following related items will be deleted:" -msgstr "" -"你确信相要删除 %(object_name)s \"%(object)s\"?所有相关的项目都将被删除:" +msgid "Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of the following related items will be deleted:" +msgstr "你确信相要删除 %(object_name)s \"%(object)s\"?所有相关的项目都将被删除:" #: contrib/admin/templates/admin/delete_confirmation.html:18 msgid "Yes, I'm sure" @@ -218,12 +205,8 @@ msgid "Password reset" msgstr "口令重设" #: contrib/admin/templates/registration/password_reset_form.html:12 -msgid "" -"Forgotten your password? Enter your e-mail address below, and we'll reset " -"your password and e-mail the new one to you." -msgstr "" -"忘记你的口令?在下面输入你的邮箱地址,我们将重设你的口令并且将新的口令通过邮" -"件发送给你。" +msgid "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you." +msgstr "忘记你的口令?在下面输入你的邮箱地址,我们将重设你的口令并且将新的口令通过邮件发送给你。" #: contrib/admin/templates/registration/password_reset_form.html:16 msgid "E-mail address:" @@ -247,19 +230,12 @@ msgid "Password reset successful" msgstr "口令重设成功" #: contrib/admin/templates/registration/password_reset_done.html:12 -msgid "" -"We've e-mailed a new password to the e-mail address you submitted. You " -"should be receiving it shortly." -msgstr "" -"我们已经按你所提交的邮箱地址发送了一个新的口令给你。你应该很会收到这封邮件。" +msgid "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly." +msgstr "我们已经按你所提交的邮箱地址发送了一个新的口令给你。你应该很会收到这封邮件。" #: contrib/admin/templates/registration/password_change_form.html:12 -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"请输入你的旧口令,为了安全起见,接着要输入你的新口令两遍,这样我们可以校验你" -"输入的是否正确。" +msgid "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly." +msgstr "请输入你的旧口令,为了安全起见,接着要输入你的新口令两遍,这样我们可以校验你输入的是否正确。" #: contrib/admin/templates/registration/password_change_form.html:17 msgid "Old password:" @@ -344,23 +320,28 @@ msgstr "一月" msgid "February" msgstr "二月" -#: utils/dates.py:14 utils/dates.py:27 +#: utils/dates.py:14 +#: utils/dates.py:27 msgid "March" msgstr "三月" -#: utils/dates.py:14 utils/dates.py:27 +#: utils/dates.py:14 +#: utils/dates.py:27 msgid "April" msgstr "四月" -#: utils/dates.py:14 utils/dates.py:27 +#: utils/dates.py:14 +#: utils/dates.py:27 msgid "May" msgstr "五月" -#: utils/dates.py:14 utils/dates.py:27 +#: utils/dates.py:14 +#: utils/dates.py:27 msgid "June" msgstr "六月" -#: utils/dates.py:15 utils/dates.py:27 +#: utils/dates.py:15 +#: utils/dates.py:27 msgid "July" msgstr "七月" @@ -432,7 +413,10 @@ msgstr "站点" msgid "label" msgstr "标签" -#: models/core.py:29 models/core.py:40 models/auth.py:6 models/auth.py:19 +#: models/core.py:29 +#: models/core.py:40 +#: models/auth.py:6 +#: models/auth.py:19 msgid "name" msgstr "名称" @@ -461,9 +445,7 @@ msgid "redirect from" msgstr "重定向自" #: models/core.py:69 -msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." +msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'." msgstr "应该是一个绝对路径,不包括域名。例如:'/events/search/'。" #: models/core.py:70 @@ -471,9 +453,7 @@ msgid "redirect to" msgstr "重定向到" #: models/core.py:71 -msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." +msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'." msgstr "可以是绝对路径(同上)或以'http://'开始的全URL。" #: models/core.py:73 @@ -489,8 +469,7 @@ msgid "URL" msgstr "" #: models/core.py:88 -msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes." msgstr "例如:'/about/contact/'。请确保前导和结尾的除号。" #: models/core.py:89 @@ -510,11 +489,8 @@ msgid "template name" msgstr "模板名称" #: models/core.py:93 -msgid "" -"Example: 'flatfiles/contact_page'. If this isn't provided, the system will " -"use 'flatfiles/default'." -msgstr "" -"例如:'flatfiles/contact_page'。如果未提供,系统将使用'flatfiles/default'。" +msgid "Example: 'flatfiles/contact_page'. If this isn't provided, the system will use 'flatfiles/default'." +msgstr "例如:'flatfiles/contact_page'。如果未提供,系统将使用'flatfiles/default'。" #: models/core.py:94 msgid "registration required" @@ -560,7 +536,8 @@ msgstr "代码名称" msgid "Permission" msgstr "许可" -#: models/auth.py:11 models/auth.py:58 +#: models/auth.py:11 +#: models/auth.py:58 msgid "Permissions" msgstr "许可" @@ -568,7 +545,8 @@ msgstr "许可" msgid "Group" msgstr "组" -#: models/auth.py:23 models/auth.py:60 +#: models/auth.py:23 +#: models/auth.py:60 msgid "Groups" msgstr "组" @@ -621,11 +599,8 @@ msgid "date joined" msgstr "加入日期" #: models/auth.py:44 -msgid "" -"In addition to the permissions manually assigned, this user will also get " -"all permissions granted to each group he/she is in." -msgstr "" -"除了手动设置权限以外,用户也会从他(她)所在的小组获得所赋组小组的所有权限。" +msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in." +msgstr "除了手动设置权限以外,用户也会从他(她)所在的小组获得所赋组小组的所有权限。" #: models/auth.py:48 msgid "Users" @@ -645,7 +620,7 @@ msgstr "消息" #: conf/global_settings.py:36 msgid "Bengali" -msgstr "" +msgstr "孟加拉语" #: conf/global_settings.py:37 msgid "Czech" @@ -653,7 +628,7 @@ msgstr "捷克语" #: conf/global_settings.py:38 msgid "Welsh" -msgstr "" +msgstr "威尔士语" #: conf/global_settings.py:39 msgid "German" @@ -681,7 +656,7 @@ msgstr "意大利语" #: conf/global_settings.py:45 msgid "Norwegian" -msgstr "" +msgstr "挪威语" #: conf/global_settings.py:46 msgid "Brazilian" @@ -689,7 +664,7 @@ msgstr "巴西语" #: conf/global_settings.py:47 msgid "Romanian" -msgstr "" +msgstr "罗马尼亚语" #: conf/global_settings.py:48 msgid "Russian" @@ -697,16 +672,15 @@ msgstr "俄语" #: conf/global_settings.py:49 msgid "Slovak" -msgstr "" +msgstr "斯洛伐克语" #: conf/global_settings.py:50 -#, fuzzy msgid "Serbian" msgstr "塞尔维亚语" #: conf/global_settings.py:51 msgid "Simplified Chinese" -msgstr "" +msgstr "简体中文" #: core/validators.py:59 msgid "This value must contain only letters, numbers and underscores." @@ -773,9 +747,7 @@ msgid "Enter a valid e-mail address." msgstr "输入一个有效的邮件地址。" #: core/validators.py:147 -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." +msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image." msgstr "上传一个有效的图片。您所上传的文件或者不是图片或是一个破坏的图片。" #: core/validators.py:154 @@ -826,11 +798,10 @@ msgid "Enter a valid U.S. state abbreviation." msgstr "输入一个有效的 U.S. 州缩写。" #: core/validators.py:224 -#, fuzzy, python-format +#, python-format msgid "Watch your mouth! The word %s is not allowed here." msgid_plural "Watch your mouth! The words %s are not allowed here." -msgstr[0] "小心你的嘴!%s 不允许在这里出现。" -msgstr[1] "小心你的嘴!%s 不允许在这里出现。" +msgstr[0] "看住你的嘴!%s 不允许在这里出现。" #: core/validators.py:231 #, python-format @@ -841,7 +812,8 @@ msgstr "这个字段必须与 '%s' 字段相匹配。" msgid "Please enter something for at least one field." msgstr "请至少在一个字段上输入些什么。" -#: core/validators.py:259 core/validators.py:270 +#: core/validators.py:259 +#: core/validators.py:270 msgid "Please enter both fields or leave them both empty." msgstr "请要么两个字段都输入或者两个字段都空着。" @@ -869,20 +841,16 @@ msgid "Please enter a valid decimal number." msgstr "请输入一个有效的小数。" #: core/validators.py:344 -#, fuzzy, python-format +#, python-format msgid "Please enter a valid decimal number with at most %s total digit." -msgid_plural "" -"Please enter a valid decimal number with at most %s total digits." -msgstr[0] "请输入一个有效的小数,最多 %s 个数字。" -msgstr[1] "请输入一个有效的小数,最多 %s 个数字。" +msgid_plural "Please enter a valid decimal number with at most %s total digits." +msgstr[0] "请输入一个有效的小数,最多 %s 个数字。 " #: core/validators.py:347 -#, fuzzy, python-format +#, python-format msgid "Please enter a valid decimal number with at most %s decimal place." -msgid_plural "" -"Please enter a valid decimal number with at most %s decimal places." -msgstr[0] "请输入一个有效的小数,最多 %s 个小数位。" -msgstr[1] "请输入一个有效的小数,最多 %s 个小数位。" +msgid_plural "Please enter a valid decimal number with at most %s decimal places." +msgstr[0] "请输入一个有效的小数,最多 %s 个小数位。 " #: core/validators.py:357 #, python-format @@ -909,63 +877,44 @@ msgstr "不能从 %s 得到任何东西。" #: core/validators.py:424 #, python-format -msgid "" -"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." +msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." msgstr "URL %(url)s 返回了无效的 Content-Type 头 '%(contenttype)s'。" #: core/validators.py:457 #, python-format -msgid "" -"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with " -"\"%(start)s\".)" -msgstr "" -"请关闭未关闭的 %(tag)s 标签从第 %(line)s 行。(行开始于 \"%(start)s\"。)" +msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)" +msgstr "请关闭未关闭的 %(tag)s 标签从第 %(line)s 行。(行开始于 \"%(start)s\"。)" #: core/validators.py:461 #, python-format -msgid "" -"Some text starting on line %(line)s is not allowed in that context. (Line " -"starts with \"%(start)s\".)" -msgstr "" -"在 %(line)s 行开始的一些文本不允许在那个上下文中。(行开始于 \"%(start)s\"。)" +msgid "Some text starting on line %(line)s is not allowed in that context. (Line starts with \"%(start)s\".)" +msgstr "在 %(line)s 行开始的一些文本不允许在那个上下文中。(行开始于 \"%(start)s\"。)" #: core/validators.py:466 #, python-format -msgid "" -"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%" -"(start)s\".)" -msgstr "" -"在 %(line)s 行的\"%(attr)s\"不是一个有效的属性。(行开始于 \"%(start)s\"。)" +msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)" +msgstr "在 %(line)s 行的\"%(attr)s\"不是一个有效的属性。(行开始于 \"%(start)s\"。)" #: core/validators.py:471 #, python-format -msgid "" -"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%" -"(start)s\".)" -msgstr "" -"在 %(line)s 行的\"<%(tag)s>\"不是一个有效的标签。(行开始于 \"%(start)s\"。)" +msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)" +msgstr "在 %(line)s 行的\"<%(tag)s>\"不是一个有效的标签。(行开始于 \"%(start)s\"。)" #: core/validators.py:475 #, python-format -msgid "" -"A tag on line %(line)s is missing one or more required attributes. (Line " -"starts with \"%(start)s\".)" -msgstr "" -"在行 %(line)s 的标签少了一个或多个必须的属性。(行开始于 \"%(start)s\"。)" +msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)" +msgstr "在行 %(line)s 的标签少了一个或多个必须的属性。(行开始于 \"%(start)s\"。)" #: core/validators.py:480 #, python-format -msgid "" -"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line " -"starts with \"%(start)s\".)" -msgstr "" -"在行 %(line)s 的\"%(attr)s\"属性有一个无效的值。(行开始于 \"%(start)s\"。)" +msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)" +msgstr "在行 %(line)s 的\"%(attr)s\"属性有一个无效的值。(行开始于 \"%(start)s\"。)" #: core/meta/fields.py:111 msgid " Separate multiple IDs with commas." msgstr " 用逗号分隔多个ID。" #: core/meta/fields.py:114 -msgid "" -" Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid " Hold down \"Control\", or \"Command\" on a Mac, to select more than one." msgstr " 按下 \"Control\",或者在Mac上按 \"Command\" 来选择一个或多个值。" +