summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xdjango/bin/compile-messages.py24
-rwxr-xr-xdjango/bin/django-admin.py9
-rwxr-xr-xdjango/bin/make-messages.py89
-rw-r--r--django/conf/global_settings.py19
-rw-r--r--django/conf/locale/cs/LC_MESSAGES/django.mobin0 -> 16988 bytes
-rw-r--r--django/conf/locale/cs/LC_MESSAGES/django.po978
-rw-r--r--django/conf/locale/de/LC_MESSAGES/django.mobin0 -> 17824 bytes
-rw-r--r--django/conf/locale/de/LC_MESSAGES/django.po984
-rw-r--r--django/conf/locale/en/LC_MESSAGES/django.mobin0 -> 421 bytes
-rw-r--r--django/conf/locale/en/LC_MESSAGES/django.po927
-rw-r--r--django/conf/locale/es/LC_MESSAGES/django.mobin0 -> 5203 bytes
-rw-r--r--django/conf/locale/es/LC_MESSAGES/django.po959
-rw-r--r--django/conf/locale/fr/LC_MESSAGES/django.mobin0 -> 17763 bytes
-rw-r--r--django/conf/locale/fr/LC_MESSAGES/django.po995
-rw-r--r--django/conf/locale/gl/LC_MESSAGES/django.mobin0 -> 5322 bytes
-rw-r--r--django/conf/locale/gl/LC_MESSAGES/django.po955
-rw-r--r--django/conf/locale/it/LC_MESSAGES/django.mobin0 -> 16820 bytes
-rw-r--r--django/conf/locale/it/LC_MESSAGES/django.po981
-rw-r--r--django/conf/locale/pt_BR/LC_MESSAGES/django.mobin0 -> 16668 bytes
-rw-r--r--django/conf/locale/pt_BR/LC_MESSAGES/django.po981
-rw-r--r--django/conf/locale/ru/LC_MESSAGES/django.mobin0 -> 5134 bytes
-rw-r--r--django/conf/locale/ru/LC_MESSAGES/django.po956
-rw-r--r--django/conf/locale/sr/LC_MESSAGES/django.mobin0 -> 16564 bytes
-rw-r--r--django/conf/locale/sr/LC_MESSAGES/django.po981
-rw-r--r--django/conf/locale/zh_CN/LC_MESSAGES/django.mobin0 -> 15626 bytes
-rw-r--r--django/conf/locale/zh_CN/LC_MESSAGES/django.po951
-rw-r--r--django/conf/settings.py7
-rw-r--r--django/conf/urls/i18n.py5
-rw-r--r--django/contrib/admin/models/admin.py14
-rw-r--r--django/contrib/admin/templates/admin/404.html7
-rw-r--r--django/contrib/admin/templates/admin/500.html9
-rw-r--r--django/contrib/admin/templates/admin/base.html7
-rw-r--r--django/contrib/admin/templates/admin/base_site.html5
-rw-r--r--django/contrib/admin/templates/admin/delete_confirmation.html7
-rw-r--r--django/contrib/admin/templates/admin/index.html13
-rw-r--r--django/contrib/admin/templates/admin/login.html9
-rw-r--r--django/contrib/admin/templates/admin/object_history.html13
-rw-r--r--django/contrib/admin/templates/registration/logged_out.html7
-rw-r--r--django/contrib/admin/templates/registration/password_change_done.html9
-rw-r--r--django/contrib/admin/templates/registration/password_change_form.html17
-rw-r--r--django/contrib/admin/templates/registration/password_reset_done.html9
-rw-r--r--django/contrib/admin/templates/registration/password_reset_email.html15
-rw-r--r--django/contrib/admin/templates/registration/password_reset_form.html11
-rw-r--r--django/core/extensions.py6
-rw-r--r--django/core/meta/fields.py19
-rw-r--r--django/core/template/__init__.py150
-rw-r--r--django/core/template/defaulttags.py3
-rw-r--r--django/core/validators.py125
-rw-r--r--django/middleware/locale.py24
-rw-r--r--django/models/auth.py45
-rw-r--r--django/models/core.py56
-rw-r--r--django/templatetags/i18n.py217
-rw-r--r--django/utils/dates.py16
-rw-r--r--django/utils/functional.py61
-rw-r--r--django/utils/text.py2
-rw-r--r--django/utils/translation.py447
-rw-r--r--django/views/i18n.py22
-rw-r--r--docs/settings.txt7
-rw-r--r--docs/translation.txt438
-rw-r--r--tests/othertests/templates.py44
60 files changed, 12449 insertions, 186 deletions
diff --git a/django/bin/compile-messages.py b/django/bin/compile-messages.py
new file mode 100755
index 0000000000..0b5127f6b2
--- /dev/null
+++ b/django/bin/compile-messages.py
@@ -0,0 +1,24 @@
+#!/usr/bin/python
+
+import os
+import sys
+import getopt
+
+basedir = None
+
+if os.path.isdir(os.path.join('conf', 'locale')):
+ basedir = os.path.abspath(os.path.join('conf', 'locale'))
+elif os.path.isdir('locale'):
+ basedir = os.path.abspath('locale')
+else:
+ print "this script should be run from the django svn tree or your project or app tree"
+ sys.exit(1)
+
+for (dirpath, dirnames, filenames) in os.walk(basedir):
+ for file in filenames:
+ if file.endswith('.po'):
+ sys.stderr.write('processing file %s in %s\n' % (file, dirpath))
+ pf = os.path.splitext(os.path.join(dirpath, file))[0]
+ cmd = 'msgfmt -o %s.mo %s.po' % (pf, pf)
+ os.system(cmd)
+
diff --git a/django/bin/django-admin.py b/django/bin/django-admin.py
index 8cf042a5c1..89297d4cf9 100755
--- a/django/bin/django-admin.py
+++ b/django/bin/django-admin.py
@@ -3,6 +3,14 @@ from django.core import management
from optparse import OptionParser
import os, sys
+# switch to english, because django-admin creates database content
+# like permissions, and those shouldn't contain any translations
+try:
+ from django.utils import translation
+ translation.activate('en-us')
+except:
+ pass
+
ACTION_MAPPING = {
'adminindex': management.get_admin_index,
'createsuperuser': management.createsuperuser,
@@ -129,3 +137,4 @@ def main():
if __name__ == "__main__":
main()
+
diff --git a/django/bin/make-messages.py b/django/bin/make-messages.py
new file mode 100755
index 0000000000..c78faac694
--- /dev/null
+++ b/django/bin/make-messages.py
@@ -0,0 +1,89 @@
+#!/usr/bin/python
+
+import re
+import os
+import sys
+import getopt
+
+from django.utils.translation import templateize
+
+localedir = None
+
+if os.path.isdir(os.path.join('conf', 'locale')):
+ localedir = os.path.abspath(os.path.join('conf', 'locale'))
+elif os.path.isdir('locale'):
+ localedir = os.path.abspath('locale')
+else:
+ print "this script should be run from the django svn tree or your project or app tree"
+ sys.exit(1)
+
+(opts, args) = getopt.getopt(sys.argv[1:], 'l:d:va')
+
+lang = None
+domain = 'django'
+verbose = False
+all = False
+
+for o, v in opts:
+ if o == '-l':
+ lang = v
+ elif o == '-d':
+ domain = v
+ elif o == '-v':
+ verbose = True
+ elif o == '-a':
+ all = True
+
+if (lang is None and not all) or domain is None:
+ print "usage: make-messages.py -l <language>"
+ print " or: make-messages.py -a"
+ sys.exit(1)
+
+languages = []
+
+if lang is not None:
+ languages.append(lang)
+elif all:
+ languages = [el for el in os.listdir(localedir) if not el.startswith('.')]
+
+for lang in languages:
+
+ print "processing language", lang
+ basedir = os.path.join(localedir, lang, 'LC_MESSAGES')
+ if not os.path.isdir(basedir):
+ os.makedirs(basedir)
+
+ pofile = os.path.join(basedir, '%s.po' % domain)
+ potfile = os.path.join(basedir, '%s.pot' % domain)
+
+ if os.path.exists(potfile):
+ os.unlink(potfile)
+
+ for (dirpath, dirnames, filenames) in os.walk("."):
+ for file in filenames:
+ if file.endswith('.py') or file.endswith('.html'):
+ thefile = file
+ if file.endswith('.html'):
+ src = open(os.path.join(dirpath, file), "rb").read()
+ open(os.path.join(dirpath, '%s.py' % file), "wb").write(templateize(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 -o - "%s"' % (
+ os.path.exists(potfile) and '--omit-header' or '', domain, os.path.join(dirpath, thefile))
+ msgs = os.popen(cmd, 'r').read()
+ if thefile != file:
+ old = '#: '+os.path.join(dirpath, thefile)[2:]
+ new = '#: '+os.path.join(dirpath, file)[2:]
+ msgs = msgs.replace(old, new)
+ if msgs:
+ open(potfile, 'ab').write(msgs)
+ if thefile != file:
+ os.unlink(os.path.join(dirpath, thefile))
+
+ msgs = os.popen('msguniq %s' % potfile, 'r').read()
+ open(potfile, 'w').write(msgs)
+ if os.path.exists(pofile):
+ msgs = os.popen('msgmerge %s %s' % (pofile, potfile), 'r').read()
+ open(pofile, 'wb').write(msgs)
+ os.unlink(potfile)
+
diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py
index 40e230b04c..70d38d6993 100644
--- a/django/conf/global_settings.py
+++ b/django/conf/global_settings.py
@@ -1,6 +1,8 @@
# Default Django settings. Override these with settings in the module
# pointed-to by the DJANGO_SETTINGS_MODULE environment variable.
+from django.utils.translation import gettext_lazy as _
+
####################
# CORE #
####################
@@ -28,6 +30,23 @@ TIME_ZONE = 'America/Chicago'
# http://blogs.law.harvard.edu/tech/stories/storyReader$15
LANGUAGE_CODE = 'en-us'
+# Languages we provide translations for out of the base. The
+# language name should be the utf-8 encoded local name for the
+# language.
+LANGUAGES = (
+ ('cs', _('Czech')),
+ ('de', _('German')),
+ ('en', _('English')),
+ ('es', _('Spanish')),
+ ('fr', _('French')),
+ ('gl', _('Galician')),
+ ('it', _('Italian')),
+ ('pt-br', _('Brazilian')),
+ ('ru', _('Russian')),
+ ('sr', _('Serbian')),
+ ('zh-cn', _('Traditional Chinese')),
+)
+
# Not-necessarily-technical managers of the site. They get broken link
# notifications and other various e-mails.
MANAGERS = ADMINS
diff --git a/django/conf/locale/cs/LC_MESSAGES/django.mo b/django/conf/locale/cs/LC_MESSAGES/django.mo
new file mode 100644
index 0000000000..dd2e7649e6
--- /dev/null
+++ b/django/conf/locale/cs/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/cs/LC_MESSAGES/django.po b/django/conf/locale/cs/LC_MESSAGES/django.po
new file mode 100644
index 0000000000..1c091b014c
--- /dev/null
+++ b/django/conf/locale/cs/LC_MESSAGES/django.po
@@ -0,0 +1,978 @@
+# Translation of django.po to Czech
+# Copyright (C) 2005 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the DJANGO package.
+# Radek Svarz <translate@svarz.cz>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-11-03 12:26+0100\n"
+"PO-Revision-Date: 2005-10-31 19:42+0100\n"
+"Last-Translator: Radek Svarz <translate@svarz.cz>\n"
+"Language-Team: Czech\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:29
+#: 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
+msgid "Home"
+msgstr "Domů"
+
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Historie"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Datum/čas"
+
+#: contrib/admin/templates/admin/object_history.html:19 models/auth.py:47
+msgid "User"
+msgstr "Uživatel"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Akce"
+
+#: contrib/admin/templates/admin/object_history.html:26
+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í."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django správa webu"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django správa"
+
+#: contrib/admin/templates/admin/500.html:4
+#, fuzzy
+msgid "Server error"
+msgstr "Chyba serveru (500)"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Chyba serveru (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Chyba serveru <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 ""
+"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
+msgid "Page not found"
+msgstr "Stránka nenalezena"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Je nám líto, ale vyžádaná stránka nebyla nalezena."
+
+#: contrib/admin/templates/admin/index.html:27
+msgid "Add"
+msgstr "Přidat"
+
+#: contrib/admin/templates/admin/index.html:33
+msgid "Change"
+msgstr "Změnit"
+
+#: contrib/admin/templates/admin/index.html:43
+msgid "You don't have permission to edit anything."
+msgstr "Nemáte oprávnění nic měnit."
+
+#: contrib/admin/templates/admin/index.html:51
+msgid "Recent Actions"
+msgstr "Poslední akce"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "My Actions"
+msgstr "Mé akce"
+
+#: contrib/admin/templates/admin/index.html:56
+msgid "None available"
+msgstr "Nic"
+
+#: contrib/admin/templates/admin/login.html:15
+msgid "Username:"
+msgstr "Uživatelské jméno:"
+
+#: contrib/admin/templates/admin/login.html:18
+msgid "Password:"
+msgstr "Heslo:"
+
+#: contrib/admin/templates/admin/login.html:20
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "<a href=\"/password_reset/\">Zapomněl(a) jste své heslo?</a>"
+
+#: contrib/admin/templates/admin/login.html:24
+msgid "Log in"
+msgstr "Přihlášení"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Vítejte,"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Change password"
+msgstr "Změnit heslo"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Log out"
+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 v mazá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:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:18
+msgid "Yes, I'm sure"
+msgstr "Ano, jsem si jist"
+
+#: 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 "Změna hesla"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Změna hesla byla úspěšná"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Vaše heslo bylo změněno."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+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é."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mailová adresa:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Obnovit mé heslo"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Děkujeme Vám za Váš strávený čas na našich webových stránkách."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Přihlašte se znova"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+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."
+
+#: 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ě."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Staré heslo:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Nové heslo:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Potvrdit heslo:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Změnit mé heslo:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Dostal(a) jste tento e-mail, protože jste požádal(a) o obnovení hesla"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "pro Váš uživatelský účet na %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Vaše nové heslo je: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Můžete změnit toto heslo na následující stránce: "
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Vaše uživatelské jméno, pro případ, že jste zapomněl(a):"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Děkujeme za používání našeho webu!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Tým %(site_name)s"
+
+#: contrib/admin/models/admin.py:6
+msgid "action time"
+msgstr "čas akce"
+
+#: contrib/admin/models/admin.py:9
+msgid "object id"
+msgstr "object id"
+
+#: contrib/admin/models/admin.py:10
+msgid "object repr"
+msgstr "object repr"
+
+#: contrib/admin/models/admin.py:11
+msgid "action flag"
+msgstr "příznak akce"
+
+#: contrib/admin/models/admin.py:12
+msgid "change message"
+msgstr "zpráva změny"
+
+#: contrib/admin/models/admin.py:15
+msgid "log entry"
+msgstr "log záznam"
+
+#: contrib/admin/models/admin.py:16
+msgid "log entries"
+msgstr "log záznamy"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Pondělí"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Úterý"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Středa"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Čtvrtek"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Pátek"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sobota"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Neděle"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Leden"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Únor"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Březen"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Duben"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Květen"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Červen"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Červenec"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Srpen"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Září"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Říjen"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Listopad"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Prosinec"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Led."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Ún."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Srp."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Zář."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Říj."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "List."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Pros."
+
+#: models/core.py:5
+msgid "domain name"
+msgstr "jméno domény"
+
+#: models/core.py:6
+msgid "display name"
+msgstr "zobrazené jméno"
+
+#: models/core.py:8
+msgid "site"
+msgstr "web"
+
+#: models/core.py:9
+msgid "sites"
+msgstr "weby"
+
+#: models/core.py:22
+msgid "label"
+msgstr "nadpis"
+
+#: models/core.py:23 models/core.py:34 models/auth.py:6 models/auth.py:19
+msgid "name"
+msgstr "jméno"
+
+#: models/core.py:25
+msgid "package"
+msgstr "balík"
+
+#: models/core.py:26
+msgid "packages"
+msgstr "balíky"
+
+#: models/core.py:36
+msgid "python module name"
+msgstr "jméno modulu Pythonu"
+
+#: models/core.py:38
+msgid "content type"
+msgstr "typ obsahu"
+
+#: models/core.py:39
+msgid "content types"
+msgstr "typy obsahu"
+
+#: models/core.py:62
+msgid "redirect from"
+msgstr "přesměrovat z"
+
+#: models/core.py:63
+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:64
+msgid "redirect to"
+msgstr "přesměrovat na"
+
+#: models/core.py:65
+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:67
+msgid "redirect"
+msgstr "přesměrovat"
+
+#: models/core.py:68
+msgid "redirects"
+msgstr "přesměrování"
+
+#: models/core.py:81
+msgid "URL"
+msgstr "URL"
+
+#: models/core.py:82
+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:83
+msgid "title"
+msgstr "titulek"
+
+#: models/core.py:84
+msgid "content"
+msgstr "obsah"
+
+#: models/core.py:85
+msgid "enable comments"
+msgstr "povolit komentáře"
+
+#: models/core.py:86
+msgid "template name"
+msgstr "jméno šablony"
+
+#: models/core.py:87
+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:88
+msgid "registration required"
+msgstr "nutná registrace"
+
+#: models/core.py:88
+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."
+
+#: models/core.py:92
+#, fuzzy
+msgid "flat page"
+msgstr "plochá strana"
+
+#: models/core.py:93
+#, fuzzy
+msgid "flat pages"
+msgstr "ploché stránky"
+
+#: models/core.py:114
+msgid "session key"
+msgstr "klíč sezení"
+
+#: models/core.py:115
+msgid "session data"
+msgstr "data sezení"
+
+#: models/core.py:116
+msgid "expire date"
+msgstr "datum expirace"
+
+#: models/core.py:118
+msgid "session"
+msgstr "sezení"
+
+#: models/core.py:119
+msgid "sessions"
+msgstr "sezení"
+
+#: models/auth.py:8
+msgid "codename"
+msgstr "codename"
+
+#: models/auth.py:10
+msgid "Permission"
+msgstr "Oprávnění"
+
+#: models/auth.py:11 models/auth.py:58
+msgid "Permissions"
+msgstr "Oprávnění"
+
+#: models/auth.py:22
+msgid "Group"
+msgstr "Skupina"
+
+#: models/auth.py:23 models/auth.py:60
+msgid "Groups"
+msgstr "Skupiny"
+
+#: models/auth.py:33
+msgid "username"
+msgstr "uživatelské jméno"
+
+#: models/auth.py:34
+msgid "first name"
+msgstr "křestní jméno"
+
+#: models/auth.py:35
+msgid "last name"
+msgstr "příjmení"
+
+#: models/auth.py:36
+msgid "e-mail address"
+msgstr "e-mailová adresa"
+
+#: models/auth.py:37
+msgid "password"
+msgstr "heslo"
+
+#: models/auth.py:37
+msgid "Use an MD5 hash -- not the raw password."
+msgstr "Použije se MD5 hash -- ne čisté heslo."
+
+#: models/auth.py:38
+#, fuzzy
+msgid "staff status"
+msgstr "stav pracovníků"
+
+#: models/auth.py:38
+msgid "Designates whether the user can log into this admin site."
+msgstr "Rozhodne, zda se může uživatel přihlásit do správy webu."
+
+#: models/auth.py:39
+msgid "active"
+msgstr "aktivní"
+
+#: models/auth.py:40
+msgid "superuser status"
+msgstr "stav superuživatel"
+
+#: models/auth.py:41
+msgid "last login"
+msgstr "poslední přihlášení"
+
+#: models/auth.py:42
+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."
+
+#: models/auth.py:48
+msgid "Users"
+msgstr "Uživatelé"
+
+#: models/auth.py:57
+msgid "Personal info"
+msgstr "Osobní informace"
+
+#: models/auth.py:59
+msgid "Important dates"
+msgstr "Důležitá data"
+
+#: models/auth.py:182
+msgid "Message"
+msgstr "Zpráva"
+
+#: conf/global_settings.py:37
+msgid "Czech"
+msgstr "Česky"
+
+#: conf/global_settings.py:38
+msgid "German"
+msgstr "Německy"
+
+#: conf/global_settings.py:39
+msgid "English"
+msgstr "Anglicky"
+
+#: conf/global_settings.py:40
+msgid "Spanish"
+msgstr "Španělsky"
+
+#: conf/global_settings.py:41
+msgid "French"
+msgstr "Francouzsky"
+
+#: conf/global_settings.py:42
+#, fuzzy
+msgid "Galician"
+msgstr "Galicijský"
+
+#: conf/global_settings.py:43
+msgid "Italian"
+msgstr "Italsky"
+
+#: conf/global_settings.py:44
+msgid "Brazilian"
+msgstr "Brazilsky"
+
+#: conf/global_settings.py:45
+msgid "Russian"
+msgstr "Rusky"
+
+#: conf/global_settings.py:46
+#, fuzzy
+msgid "Serbian"
+msgstr "Srbsky"
+
+#: conf/global_settings.py:47
+msgid "Traditional Chinese"
+msgstr ""
+
+#: core/validators.py:58
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Tato hodnota musí obsahovat pouze znaky, čísla nebo podtržítka."
+
+#: core/validators.py:62
+msgid "This value must contain only letters, numbers, underscores and slashes."
+msgstr ""
+"Tato hodnota musí obsahovat pouze znaky, čísla, podtržítka nebo lomítka."
+
+#: core/validators.py:70
+msgid "Uppercase letters are not allowed here."
+msgstr "Velká písmena zde nejsou povolená."
+
+#: core/validators.py:74
+msgid "Lowercase letters are not allowed here."
+msgstr "Malá písmena zde nejsou povolená."
+
+#: core/validators.py:81
+msgid "Enter only digits separated by commas."
+msgstr "Vložte pouze cifry oddělené čárkami."
+
+#: core/validators.py:93
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Vložte platné e-mailové adresy oddělené čárkami."
+
+#: core/validators.py:100
+msgid "Please enter a valid IP address."
+msgstr "Prosíme, zadejte platnou IP adresu."
+
+#: core/validators.py:104
+msgid "Empty values are not allowed here."
+msgstr "Zde nejsou povolené prázdné hodnoty."
+
+#: core/validators.py:108
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Znaky, které nejsou čísla, nejsou zde povoleny."
+
+#: core/validators.py:112
+msgid "This value can't be comprised solely of digits."
+msgstr "Tato hodnota nemůže být složená pouze z cifer."
+
+#: core/validators.py:117
+msgid "Enter a whole number."
+msgstr "Vložte celé číslo."
+
+#: core/validators.py:121
+msgid "Only alphabetical characters are allowed here."
+msgstr "Zde jsou povoleny pouze alfanumerické znaky."
+
+#: core/validators.py:125
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Vložte platné datum ve formátu RRRR-MM-DD."
+
+#: core/validators.py:129
+msgid "Enter a valid time in HH:MM format."
+msgstr "Vložte platný čas ve formátu HH:MM."
+
+#: core/validators.py:133
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Vložte platné datum a čas ve formátu RRRR-MM-DD HH:MM."
+
+#: core/validators.py:137
+msgid "Enter a valid e-mail address."
+msgstr "Vložte platnou e-mailovou adresu."
+
+#: core/validators.py:149
+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:156
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s neukazuje na platný obrázek."
+
+#: core/validators.py:160
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Telefonní čísla musí být ve formátu XXX-XXX-XXXX. \"%s\" není platné."
+
+#: core/validators.py:168
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s neodkazuje na platné video ve formátu QuickTime."
+
+#: core/validators.py:172
+msgid "A valid URL is required."
+msgstr "Je vyžadováno platné URL."
+
+#: core/validators.py:186
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Je vyžadováno platné HTML. Konkrétní chyby jsou:\n"
+"%s"
+
+#: core/validators.py:193
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Špatně formované XML: %s"
+
+#: core/validators.py:203
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Neplatné URL: %s"
+
+#: core/validators.py:205
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Odkaz na URL %s je rozbitý."
+
+#: core/validators.py:211
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Vložte platnou zkraku U.S. státu."
+
+#: core/validators.py:226
+#, 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] "Mluvte slušně! Slovo %s zde není přípustné."
+msgstr[1] "Mluvte slušně! Slova %s zde nejsou přípustná."
+
+#: core/validators.py:233
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Toto pole se musí shodovat s polem '%s'."
+
+#: core/validators.py:252
+msgid "Please enter something for at least one field."
+msgstr "Prosíme, vložte něco alespoň pro jedno pole."
+
+#: core/validators.py:261 core/validators.py:272
+msgid "Please enter both fields or leave them both empty."
+msgstr "Prosíme, vložte obě pole, nebo je nechte obě prázdná."
+
+#: core/validators.py:279
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Toto pole musí být vyplněno, když %(field)s má %(value)s"
+
+#: core/validators.py:291
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Toto pole musí být vyplněno, když %(field)s nemá %(value)s"
+
+#: core/validators.py:310
+msgid "Duplicate values are not allowed."
+msgstr "Duplikátní hodnoty nejsou povolené."
+
+#: core/validators.py:333
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Tato hodnota musí být mocninou %s."
+
+#: core/validators.py:344
+msgid "Please enter a valid decimal number."
+msgstr "Prosíme, vložte platné číslo."
+
+#: core/validators.py:346
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Prosí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."
+
+#: core/validators.py:349
+#, 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."
+
+#: core/validators.py:359
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Ujistěte se, že posílaný soubor je velký nejméně %s bytů."
+
+#: core/validators.py:360
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Ujistěte se, že posílaný soubor je velký nejvíce %s bytů."
+
+#: core/validators.py:373
+msgid "The format for this field is wrong."
+msgstr "Formát pro toto pole je špatný."
+
+#: core/validators.py:388
+msgid "This field is invalid."
+msgstr "Toto pole není platné."
+
+#: core/validators.py:423
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Nemohl jsem získat nic z %s."
+
+#: core/validators.py:426
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "URL %(url)s vrátilo neplatnou hlavičku Content-Type '%(contenttype)s'."
+
+#: core/validators.py:459
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Prosíme, zavřete nezavřenou značku %(tag)s z řádky %(line)s. (Řádka začíná s "
+"\"%(start)s\".)"
+
+#: core/validators.py:463
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Nějaký text začínající na řádce %(line)s není povolen v tomto kontextu. "
+"(Řádka začíná s \"%(start)s\".)"
+
+#: core/validators.py:468
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" na řádce %(line)s je neplatný atribut. (Řádka začíná s \"%"
+"(start)s\".)"
+
+#: core/validators.py:473
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" na řádce %(line)s je neplatná značka. (Řádka začíná s \"%"
+"(start)s\".)"
+
+#: core/validators.py:477
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Značce na řádce %(line)s schází jeden nebo více požadovaných atributů. "
+"(Řádka začíná s \"%(start)s\".)"
+
+#: core/validators.py:482
+#, 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\".)"
+
+#: core/meta/fields.py:95
+msgid " Separate multiple IDs with commas."
+msgstr "Oddělte více identifikátorů čárkami."
+
+#: core/meta/fields.py:98
+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/de/LC_MESSAGES/django.mo b/django/conf/locale/de/LC_MESSAGES/django.mo
new file mode 100644
index 0000000000..73ce9d0476
--- /dev/null
+++ b/django/conf/locale/de/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/de/LC_MESSAGES/django.po b/django/conf/locale/de/LC_MESSAGES/django.po
new file mode 100644
index 0000000000..337076bae4
--- /dev/null
+++ b/django/conf/locale/de/LC_MESSAGES/django.po
@@ -0,0 +1,984 @@
+# SOME DESCRIPTIVE TITLE.
+# 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 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-11-03 12:26+0100\n"
+"PO-Revision-Date: 2005-10-08 00:03+0200\n"
+"Last-Translator: Georg Bauer <gb@bofh.ms>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:29
+#: 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
+msgid "Home"
+msgstr "Start"
+
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Geschichte"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Datum/Zeit"
+
+#: contrib/admin/templates/admin/object_history.html:19 models/auth.py:47
+msgid "User"
+msgstr "Benutzer"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Aktion"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j. N Y, H:i"
+
+#: 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 ""
+"Dieses Objekt hat keine nderungsgeschichte. Es wurde mglicherweise nicht "
+"ber diese Verwaltungsseiten angelegt."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django Systemverwaltung"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django Verwaltung"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Serverfehler"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Serverfehler (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Serverfehler <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 ""
+"Es hat einen Fehler gegeben. Dieser Fehler wurde an die Serververwalter per "
+"eMail weitergegeben und sollte bald behoben sein. Vielen Dank fr Ihr "
+"Verstndnis."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Seite nicht gefunden"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr ""
+"Es tut uns leid, aber die angeforderte Seite kann nicht gefunden werden."
+
+#: contrib/admin/templates/admin/index.html:27
+msgid "Add"
+msgstr "Zufgen"
+
+#: contrib/admin/templates/admin/index.html:33
+msgid "Change"
+msgstr "ndern"
+
+#: contrib/admin/templates/admin/index.html:43
+msgid "You don't have permission to edit anything."
+msgstr "Sie haben keine Berechtigung irgendwas zu ndern."
+
+#: contrib/admin/templates/admin/index.html:51
+msgid "Recent Actions"
+msgstr "Krzliche Aktionen"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "My Actions"
+msgstr "Meine Aktionen"
+
+#: contrib/admin/templates/admin/index.html:56
+msgid "None available"
+msgstr "Keine vorhanden"
+
+#: contrib/admin/templates/admin/login.html:15
+msgid "Username:"
+msgstr "Benutzername:"
+
+#: contrib/admin/templates/admin/login.html:18
+msgid "Password:"
+msgstr "Passwort:"
+
+#: contrib/admin/templates/admin/login.html:20
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Haben Sie <a href=\"/password_reset/\">ihr Passwort vergessen</a>?"
+
+#: contrib/admin/templates/admin/login.html:24
+msgid "Log in"
+msgstr "Anmelden"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Willkommen,"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Change password"
+msgstr "Passwort ndern"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Log out"
+msgstr "Abmelden"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:7
+#, 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 ""
+"Die Lschung des %(object_name)s '%(object)s' htte die Lschung von "
+"abhngigen Daten zur Folge, aber Sie haben nicht die ntigen Rechte um die "
+"folgenden abhngigen Daten zu lschen:"
+
+#: 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 ""
+"Sind Sie sicher, das Sie %(object_name)s \"%(object)s\" lschen wollen? Es "
+"werden zustzlich die folgenden abhngigen Daten mit gelscht:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:18
+msgid "Yes, I'm sure"
+msgstr "Ja, ich bin sicher"
+
+#: 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 "Kennwort ndern"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Erfolgreiche Kennwortnderung"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Ihr Kennwort wurde gendert."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Kennwort zurcksetzen"
+
+#: 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 ""
+"Sie haben Ihr Kennwort vergessen? Geben Sie bitte Ihre eMail-Adresse ein und "
+"wir setzen das Kennwort auf einen neuen Wert und schicken den per eMail an "
+"Sie raus."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "eMail-Adresse:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Mein Kennwort zurcksetzen"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Danke, dass Sie eine Weile bei uns waren."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Neu anmelden"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Erfolgreich Kennwort zurckgesetzt"
+
+#: 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 ""
+"Wir haben Ihnen ein neues Kennwort per eMail zugeschickt an die Adresse, die "
+"Sie uns gegeben haben. Es sollte in Krze ankommen."
+
+#: 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 ""
+"Bitte geben Sie aus Sicherheitsgrnden erst Ihr altes Kennwort und darunter "
+"dann zweimal (um sicherzustellen, das Sie es korrekt eingegeben haben) das "
+"neue Kennwort ein."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "altes Kennwort:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "neues Kennwort:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Kennwortwiederholung:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Mein Kennwort ndern"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Sie erhalten diese Mail, weil Sie ein neues Kennwort"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "fr ihren Benutzer bei %(site_name)s angefordert haben."
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Ihr neues Kennwort ist: %(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 "Sie knnen das Kennwort auf folgender Seite ndern:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Ihr Benutzername, falls Sie ihn vergessen haben:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Vielen Dank, das Sie unsere Seiten benutzen!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Das Team von %(site_name)s"
+
+#: contrib/admin/models/admin.py:6
+msgid "action time"
+msgstr "Zeit der Aktion"
+
+#: contrib/admin/models/admin.py:9
+msgid "object id"
+msgstr "Objekt ID"
+
+#: contrib/admin/models/admin.py:10
+msgid "object repr"
+msgstr "Objekt Darst."
+
+#: contrib/admin/models/admin.py:11
+msgid "action flag"
+msgstr "Aktionskennzeichen"
+
+#: contrib/admin/models/admin.py:12
+msgid "change message"
+msgstr "nderungsmeldung"
+
+#: contrib/admin/models/admin.py:15
+msgid "log entry"
+msgstr "Logeintrag"
+
+#: contrib/admin/models/admin.py:16
+msgid "log entries"
+msgstr "Logeintrge"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Montag"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Dienstag"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Mittwoch"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Donnerstag"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Freitag"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Samstag"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Sonntag"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Januar"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Februa"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Mrz"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "April"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Mai"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Juni"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Juli"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "August"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "September"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Oktober"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "November"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Dezember"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Aug."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Sept."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Okt."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dez."
+
+#: models/core.py:5
+msgid "domain name"
+msgstr "Domainname"
+
+#: models/core.py:6
+msgid "display name"
+msgstr "Anzeigename"
+
+#: models/core.py:8
+msgid "site"
+msgstr "Website"
+
+#: models/core.py:9
+msgid "sites"
+msgstr "Websites"
+
+#: models/core.py:22
+msgid "label"
+msgstr "Label"
+
+#: models/core.py:23 models/core.py:34 models/auth.py:6 models/auth.py:19
+msgid "name"
+msgstr "Name"
+
+#: models/core.py:25
+msgid "package"
+msgstr "Paket"
+
+#: models/core.py:26
+msgid "packages"
+msgstr "Pakete"
+
+#: models/core.py:36
+msgid "python module name"
+msgstr "Python Modulname"
+
+#: models/core.py:38
+msgid "content type"
+msgstr "Inhaltstyp"
+
+#: models/core.py:39
+msgid "content types"
+msgstr "Inhaltstypen"
+
+#: models/core.py:62
+msgid "redirect from"
+msgstr "Umleitung von"
+
+#: models/core.py:63
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Hier sollte ein absoluter Pfad stehen, ohne den Domainnamen. Beispiel: '/"
+"events/search/'."
+
+#: models/core.py:64
+msgid "redirect to"
+msgstr "Umleitung zu"
+
+#: models/core.py:65
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Hier mus entweder ein absoluter Pfad oder eine komplette URL mit http:// am "
+"Anfang stehen."
+
+#: models/core.py:67
+msgid "redirect"
+msgstr "Umleitung"
+
+#: models/core.py:68
+msgid "redirects"
+msgstr "Umleitungen"
+
+#: models/core.py:81
+msgid "URL"
+msgstr "URL"
+
+#: models/core.py:82
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Beispiel: '/about/contact/'. Wichtig: vorne und hinten muss ein / stehen."
+
+#: models/core.py:83
+msgid "title"
+msgstr "Titel"
+
+#: models/core.py:84
+msgid "content"
+msgstr "Inhalt"
+
+#: models/core.py:85
+msgid "enable comments"
+msgstr "Kommentare aktivieren"
+
+#: models/core.py:86
+msgid "template name"
+msgstr "Name der Vorlage"
+
+#: models/core.py:87
+msgid ""
+"Example: 'flatfiles/contact_page'. If this isn't provided, the system will "
+"use 'flatfiles/default'."
+msgstr ""
+"Beispiel: 'flatfiles/contact_page'. Wenn dieses Feld nicht gefllt ist, wird "
+"'flatfiles/default' als Standard gewhlt."
+
+#: models/core.py:88
+msgid "registration required"
+msgstr "Registrierung erforderlich"
+
+#: models/core.py:88
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Wenn hier ein Haken ist, knnen nur angemeldete Benutzer diese Seite sehen."
+
+#: models/core.py:92
+msgid "flat page"
+msgstr "Webseite"
+
+#: models/core.py:93
+msgid "flat pages"
+msgstr "Webseiten"
+
+#: models/core.py:114
+msgid "session key"
+msgstr "Sitzungs-ID"
+
+#: models/core.py:115
+msgid "session data"
+msgstr "Sitzungsdaten"
+
+#: models/core.py:116
+msgid "expire date"
+msgstr "Ablaufdatum"
+
+#: models/core.py:118
+msgid "session"
+msgstr "Sitzung"
+
+#: models/core.py:119
+msgid "sessions"
+msgstr "Sitzungen"
+
+#: models/auth.py:8
+msgid "codename"
+msgstr "Codename"
+
+#: models/auth.py:10
+msgid "Permission"
+msgstr "Berechtigung"
+
+#: models/auth.py:11 models/auth.py:58
+msgid "Permissions"
+msgstr "Berechtigungen"
+
+#: models/auth.py:22
+msgid "Group"
+msgstr "Gruppe"
+
+#: models/auth.py:23 models/auth.py:60
+msgid "Groups"
+msgstr "Gruppen"
+
+#: models/auth.py:33
+msgid "username"
+msgstr "Benutzername"
+
+#: models/auth.py:34
+msgid "first name"
+msgstr "Vorname"
+
+#: models/auth.py:35
+msgid "last name"
+msgstr "Nachname"
+
+#: models/auth.py:36
+msgid "e-mail address"
+msgstr "eMail-Adresse"
+
+#: models/auth.py:37
+msgid "password"
+msgstr "Passwort"
+
+#: models/auth.py:37
+msgid "Use an MD5 hash -- not the raw password."
+msgstr "Nicht das Passwort selber eintragen, sondern dessen MD5 signatur."
+
+#: models/auth.py:38
+msgid "staff status"
+msgstr "Administrator"
+
+#: models/auth.py:38
+msgid "Designates whether the user can log into this admin site."
+msgstr ""
+"Gibt an, ob der Benutzer sich an der Administrationsseite anmelden kann."
+
+#: models/auth.py:39
+msgid "active"
+msgstr "Aktiv"
+
+#: models/auth.py:40
+msgid "superuser status"
+msgstr "Hauptadmin."
+
+#: models/auth.py:41
+msgid "last login"
+msgstr "letzte Anmeldung"
+
+#: models/auth.py:42
+msgid "date joined"
+msgstr "Mitglied seit"
+
+#: 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 ""
+"Zustzlich zu den manuell angelegten Rechten erhlt dieser Benutzer auch "
+"alle Rechte, die seine zugewiesenen Gruppen haben."
+
+#: models/auth.py:48
+msgid "Users"
+msgstr "Benutzer"
+
+#: models/auth.py:57
+msgid "Personal info"
+msgstr "Persnliche Infos"
+
+#: models/auth.py:59
+msgid "Important dates"
+msgstr "Wichtige Daten"
+
+#: models/auth.py:182
+msgid "Message"
+msgstr "Mitteilung"
+
+#: conf/global_settings.py:37
+msgid "Czech"
+msgstr "Tschechisch"
+
+#: conf/global_settings.py:38
+msgid "German"
+msgstr "Deutsch"
+
+#: conf/global_settings.py:39
+msgid "English"
+msgstr "Englisch"
+
+#: conf/global_settings.py:40
+msgid "Spanish"
+msgstr "Spanisch"
+
+#: conf/global_settings.py:41
+msgid "French"
+msgstr "Franzsisch"
+
+#: conf/global_settings.py:42
+msgid "Galician"
+msgstr "Galicisch"
+
+#: conf/global_settings.py:43
+msgid "Italian"
+msgstr "Italienisch"
+
+#: conf/global_settings.py:44
+msgid "Brazilian"
+msgstr "Brasilianisch"
+
+#: conf/global_settings.py:45
+msgid "Russian"
+msgstr "Russisch"
+
+#: conf/global_settings.py:46
+msgid "Serbian"
+msgstr "Serbisch"
+
+#: conf/global_settings.py:47
+msgid "Traditional Chinese"
+msgstr ""
+
+#: core/validators.py:58
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Der Wert darf nur Buchstaben, Ziffern und Unterstriche enthalten."
+
+#: core/validators.py:62
+msgid "This value must contain only letters, numbers, underscores and slashes."
+msgstr ""
+"Der Wert darf nur Buchstaben, Ziffern, Unterstriche und Schrgstriche "
+"enthalten."
+
+#: core/validators.py:70
+msgid "Uppercase letters are not allowed here."
+msgstr "Grobuchstaben sind hier nicht erlaubt."
+
+#: core/validators.py:74
+msgid "Lowercase letters are not allowed here."
+msgstr "Kleinbuchstaben sind hier nicht erlaubt."
+
+#: core/validators.py:81
+msgid "Enter only digits separated by commas."
+msgstr "Hier sind nur durch Komma getrennte Ziffern erlaubt."
+
+#: core/validators.py:93
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Bitte mit Komma getrennte, gltige eMail-Adressen eingeben."
+
+#: core/validators.py:100
+msgid "Please enter a valid IP address."
+msgstr "Bitte eine gltige IP-Adresse eingeben."
+
+#: core/validators.py:104
+msgid "Empty values are not allowed here."
+msgstr "Dieses Feld darf nicht leer sein."
+
+#: core/validators.py:108
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Nichtnumerische Zeichen sind hier nicht erlaubt."
+
+#: core/validators.py:112
+msgid "This value can't be comprised solely of digits."
+msgstr "Dieser Wert darf nicht nur aus Ziffern bestehen."
+
+#: core/validators.py:117
+msgid "Enter a whole number."
+msgstr "Bitte eine ganze Zahl eingeben."
+
+#: core/validators.py:121
+msgid "Only alphabetical characters are allowed here."
+msgstr "Nur alphabetische Zeichen sind hier erlaubt."
+
+#: core/validators.py:125
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Bitte ein gltiges Datum im Format JJJJ-MM-TT eingeben."
+
+#: core/validators.py:129
+msgid "Enter a valid time in HH:MM format."
+msgstr "Bitte eine gltige Zeit im Format SS:MM eingeben."
+
+#: core/validators.py:133
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr ""
+"Bitte eine gltige Datum+Zeit Angabe im Format JJJJ-MM-TT SS:MM eingeben."
+
+#: core/validators.py:137
+msgid "Enter a valid e-mail address."
+msgstr "Bitte eine gltige eMail-Adresse eingeben"
+
+#: core/validators.py:149
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Bitte ein Bild hochladen. Die Datei, die hochgeladen wurde, ist kein Bild "
+"oder ist defekt."
+
+#: core/validators.py:156
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "Die URL %s zeigt nicht auf ein gltiges Bild."
+
+#: core/validators.py:160
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Telefonnummern mssen im Format XXX-XXX-XXXX sein. \"%s\" ist ungltig."
+
+#: core/validators.py:168
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "Die URL %s zeigt nicht auf ein gltiges QuickTime video."
+
+#: core/validators.py:172
+msgid "A valid URL is required."
+msgstr "Eine gltige URL ist hier verlangt."
+
+#: core/validators.py:186
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Bitte gltiges HTML eingeben. Fehler sind:\n"
+"%s"
+
+#: core/validators.py:193
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Ungltiges XML: %s"
+
+#: core/validators.py:203
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Ungltige URL: %s"
+
+#: core/validators.py:205
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Die URL %s funktioniert nicht."
+
+#: core/validators.py:211
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Bitte eine gltige Abkrzung fr einen US-Staat eingeben."
+
+#: core/validators.py:226
+#, 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] "Keine Schimpfworte! Das Wort %s ist hier nicht gern gesehen!"
+msgstr[1] "Keine Schimpfworte! Die Wrter %s sind hier nicht gern gesehen!"
+
+#: core/validators.py:233
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Dieses Feld muss zum Feld '%s' passen."
+
+#: core/validators.py:252
+msgid "Please enter something for at least one field."
+msgstr "Bitte mindestens eins der Felder ausfllen."
+
+#: core/validators.py:261 core/validators.py:272
+msgid "Please enter both fields or leave them both empty."
+msgstr "Bitte entweder beide Felder ausfllen, oder beide leer lassen."
+
+#: core/validators.py:279
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr ""
+"Dieses Feld muss gefllt sein, wenn Feld %(field)s den Wert %(value)s hat."
+
+#: core/validators.py:291
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr ""
+"Dieses Feld muss gefllt sein, wenn Feld %(field)s nicht %(value)s ist."
+
+#: core/validators.py:310
+msgid "Duplicate values are not allowed."
+msgstr "Doppelte Werte sind hier nicht erlaubt."
+
+#: core/validators.py:333
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Dieser Wert muss eine Potenz von %s sein."
+
+#: core/validators.py:344
+msgid "Please enter a valid decimal number."
+msgstr "Bitte eine gltige Dezimalzahl eingeben."
+
+#: core/validators.py:346
+#, 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] "Bitte eine gltige Dezimalzahl mit maximal %s Ziffer eingeben."
+msgstr[1] "Bitte eine gltige Dezimalzahl mit maximal %s Ziffern eingeben."
+
+#: core/validators.py:349
+#, 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] ""
+"Bitte eine gltige Dezimalzahl mit maximal %s Dezimalstelle eingeben."
+msgstr[1] ""
+"Bitte eine gltige Dezimalzahl mit maximal %s Dezimalstellen eingeben."
+
+#: core/validators.py:359
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+"Bitte sicherstellen, da die hochgeladene Datei mindestens %s Bytes gross "
+"ist."
+
+#: core/validators.py:360
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+"Bitte sicherstellen, da die hochgeladene Datei maximal %s Bytes gross ist."
+
+#: core/validators.py:373
+msgid "The format for this field is wrong."
+msgstr "Das Format fr dieses Feld ist falsch."
+
+#: core/validators.py:388
+msgid "This field is invalid."
+msgstr "Dieses Feld ist ungltig."
+
+#: core/validators.py:423
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Konnte nichts von %s empfangen."
+
+#: core/validators.py:426
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "Die URL %(url)s lieferte den falschen Content-Type '%(contenttype)s'."
+
+#: core/validators.py:459
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Bitte das ungeschlossene %(tag)s Tag in Zeile %(line)s schlieen. Die Zeile "
+"beginnt mit \"%(start)s\"."
+
+#: core/validators.py:463
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"In Zeile %(line)s ist Text, der nicht in dem Kontext erlaubt ist. Die Zeile "
+"beginnt mit \"%(start)s\"."
+
+#: core/validators.py:468
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"Das Attribute %(attr)s in Zeile %(line)s ist ungltig. Die Zeile beginnt mit "
+"\"%(start)s\"."
+
+#: core/validators.py:473
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"<%(tag)s> in Zeile %(line)s ist ungltig. Die Zeile beginnt mit \"%(start)s"
+"\"."
+
+#: core/validators.py:477
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Ein Tag in Zeile %(line)s hat eines oder mehrere Pflichtattribute nicht. Die "
+"Zeile beginnt mit \"%(start)s\"."
+
+#: core/validators.py:482
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Das Attribut %(attr)s in Zeile %(line)s hat einen ungltigen Wert. Die Zeile "
+"beginnt mit \"%(start)s\"."
+
+#: core/meta/fields.py:95
+msgid " Separate multiple IDs with commas."
+msgstr "Mehrere IDs knnen mit Komma getrennt werden."
+
+#: core/meta/fields.py:98
+msgid ""
+" Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+" Um mehr als eine Selektion zu treffen, \"Control\" oder auf dem Mac "
+"\"Command\" beim Klicken gedrckt halten."
diff --git a/django/conf/locale/en/LC_MESSAGES/django.mo b/django/conf/locale/en/LC_MESSAGES/django.mo
new file mode 100644
index 0000000000..ba26220d0e
--- /dev/null
+++ b/django/conf/locale/en/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/en/LC_MESSAGES/django.po b/django/conf/locale/en/LC_MESSAGES/django.po
new file mode 100644
index 0000000000..539b8b5015
--- /dev/null
+++ b/django/conf/locale/en/LC_MESSAGES/django.po
@@ -0,0 +1,927 @@
+# SOME DESCRIPTIVE TITLE.
+# 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.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-11-03 12:26+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:29
+#: 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
+msgid "Home"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:19 models/auth.py:47
+msgid "User"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:26
+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."
+msgstr ""
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr ""
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr ""
+
+#: 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/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr ""
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:27
+msgid "Add"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:33
+msgid "Change"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:43
+msgid "You don't have permission to edit anything."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:51
+msgid "Recent Actions"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "My Actions"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:56
+msgid "None available"
+msgstr ""
+
+#: contrib/admin/templates/admin/login.html:15
+msgid "Username:"
+msgstr ""
+
+#: contrib/admin/templates/admin/login.html:18
+msgid "Password:"
+msgstr ""
+
+#: contrib/admin/templates/admin/login.html:20
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr ""
+
+#: contrib/admin/templates/admin/login.html:24
+msgid "Log in"
+msgstr ""
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr ""
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Change password"
+msgstr ""
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Log out"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:7
+#, 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 ""
+
+#: 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 ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:18
+msgid "Yes, I'm sure"
+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_done.html:4
+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 ""
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr ""
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr ""
+
+#: contrib/admin/templates/registration/logged_out.html:10
+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 ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr ""
+
+#: contrib/admin/models/admin.py:6
+msgid "action time"
+msgstr ""
+
+#: contrib/admin/models/admin.py:9
+msgid "object id"
+msgstr ""
+
+#: contrib/admin/models/admin.py:10
+msgid "object repr"
+msgstr ""
+
+#: contrib/admin/models/admin.py:11
+msgid "action flag"
+msgstr ""
+
+#: contrib/admin/models/admin.py:12
+msgid "change message"
+msgstr ""
+
+#: contrib/admin/models/admin.py:15
+msgid "log entry"
+msgstr ""
+
+#: contrib/admin/models/admin.py:16
+msgid "log entries"
+msgstr ""
+
+#: 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: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 ""
+
+#: models/core.py:5
+msgid "domain name"
+msgstr ""
+
+#: models/core.py:6
+msgid "display name"
+msgstr ""
+
+#: models/core.py:8
+msgid "site"
+msgstr ""
+
+#: models/core.py:9
+msgid "sites"
+msgstr ""
+
+#: models/core.py:22
+msgid "label"
+msgstr ""
+
+#: models/core.py:23 models/core.py:34 models/auth.py:6 models/auth.py:19
+msgid "name"
+msgstr ""
+
+#: models/core.py:25
+msgid "package"
+msgstr ""
+
+#: models/core.py:26
+msgid "packages"
+msgstr ""
+
+#: models/core.py:36
+msgid "python module name"
+msgstr ""
+
+#: models/core.py:38
+msgid "content type"
+msgstr ""
+
+#: models/core.py:39
+msgid "content types"
+msgstr ""
+
+#: models/core.py:62
+msgid "redirect from"
+msgstr ""
+
+#: models/core.py:63
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+
+#: models/core.py:64
+msgid "redirect to"
+msgstr ""
+
+#: models/core.py:65
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+
+#: models/core.py:67
+msgid "redirect"
+msgstr ""
+
+#: models/core.py:68
+msgid "redirects"
+msgstr ""
+
+#: models/core.py:81
+msgid "URL"
+msgstr ""
+
+#: models/core.py:82
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+
+#: models/core.py:83
+msgid "title"
+msgstr ""
+
+#: models/core.py:84
+msgid "content"
+msgstr ""
+
+#: models/core.py:85
+msgid "enable comments"
+msgstr ""
+
+#: models/core.py:86
+msgid "template name"
+msgstr ""
+
+#: models/core.py:87
+msgid ""
+"Example: 'flatfiles/contact_page'. If this isn't provided, the system will "
+"use 'flatfiles/default'."
+msgstr ""
+
+#: models/core.py:88
+msgid "registration required"
+msgstr ""
+
+#: models/core.py:88
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+
+#: models/core.py:92
+msgid "flat page"
+msgstr ""
+
+#: models/core.py:93
+msgid "flat pages"
+msgstr ""
+
+#: models/core.py:114
+msgid "session key"
+msgstr ""
+
+#: models/core.py:115
+msgid "session data"
+msgstr ""
+
+#: models/core.py:116
+msgid "expire date"
+msgstr ""
+
+#: models/core.py:118
+msgid "session"
+msgstr ""
+
+#: models/core.py:119
+msgid "sessions"
+msgstr ""
+
+#: models/auth.py:8
+msgid "codename"
+msgstr ""
+
+#: models/auth.py:10
+msgid "Permission"
+msgstr ""
+
+#: models/auth.py:11 models/auth.py:58
+msgid "Permissions"
+msgstr ""
+
+#: models/auth.py:22
+msgid "Group"
+msgstr ""
+
+#: models/auth.py:23 models/auth.py:60
+msgid "Groups"
+msgstr ""
+
+#: models/auth.py:33
+msgid "username"
+msgstr ""
+
+#: models/auth.py:34
+msgid "first name"
+msgstr ""
+
+#: models/auth.py:35
+msgid "last name"
+msgstr ""
+
+#: models/auth.py:36
+msgid "e-mail address"
+msgstr ""
+
+#: models/auth.py:37
+msgid "password"
+msgstr ""
+
+#: models/auth.py:37
+msgid "Use an MD5 hash -- not the raw password."
+msgstr ""
+
+#: models/auth.py:38
+msgid "staff status"
+msgstr ""
+
+#: models/auth.py:38
+msgid "Designates whether the user can log into this admin site."
+msgstr ""
+
+#: models/auth.py:39
+msgid "active"
+msgstr ""
+
+#: models/auth.py:40
+msgid "superuser status"
+msgstr ""
+
+#: models/auth.py:41
+msgid "last login"
+msgstr ""
+
+#: models/auth.py:42
+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 ""
+
+#: models/auth.py:48
+msgid "Users"
+msgstr ""
+
+#: models/auth.py:57
+msgid "Personal info"
+msgstr ""
+
+#: models/auth.py:59
+msgid "Important dates"
+msgstr ""
+
+#: models/auth.py:182
+msgid "Message"
+msgstr ""
+
+#: conf/global_settings.py:37
+msgid "Czech"
+msgstr ""
+
+#: conf/global_settings.py:38
+msgid "German"
+msgstr ""
+
+#: conf/global_settings.py:39
+msgid "English"
+msgstr ""
+
+#: conf/global_settings.py:40
+msgid "Spanish"
+msgstr ""
+
+#: conf/global_settings.py:41
+msgid "French"
+msgstr ""
+
+#: conf/global_settings.py:42
+msgid "Galician"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "Italian"
+msgstr ""
+
+#: conf/global_settings.py:44
+msgid "Brazilian"
+msgstr ""
+
+#: conf/global_settings.py:45
+msgid "Russian"
+msgstr ""
+
+#: conf/global_settings.py:46
+msgid "Serbian"
+msgstr ""
+
+#: conf/global_settings.py:47
+msgid "Traditional Chinese"
+msgstr ""
+
+#: core/validators.py:58
+msgid "This value must contain only letters, numbers and underscores."
+msgstr ""
+
+#: core/validators.py:62
+msgid "This value must contain only letters, numbers, underscores and slashes."
+msgstr ""
+
+#: core/validators.py:70
+msgid "Uppercase letters are not allowed here."
+msgstr ""
+
+#: core/validators.py:74
+msgid "Lowercase letters are not allowed here."
+msgstr ""
+
+#: core/validators.py:81
+msgid "Enter only digits separated by commas."
+msgstr ""
+
+#: core/validators.py:93
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr ""
+
+#: core/validators.py:100
+msgid "Please enter a valid IP address."
+msgstr ""
+
+#: core/validators.py:104
+msgid "Empty values are not allowed here."
+msgstr ""
+
+#: core/validators.py:108
+msgid "Non-numeric characters aren't allowed here."
+msgstr ""
+
+#: core/validators.py:112
+msgid "This value can't be comprised solely of digits."
+msgstr ""
+
+#: core/validators.py:117
+msgid "Enter a whole number."
+msgstr ""
+
+#: core/validators.py:121
+msgid "Only alphabetical characters are allowed here."
+msgstr ""
+
+#: core/validators.py:125
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr ""
+
+#: core/validators.py:129
+msgid "Enter a valid time in HH:MM format."
+msgstr ""
+
+#: core/validators.py:133
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr ""
+
+#: core/validators.py:137
+msgid "Enter a valid e-mail address."
+msgstr ""
+
+#: core/validators.py:149
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+
+#: core/validators.py:156
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr ""
+
+#: core/validators.py:160
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+
+#: core/validators.py:168
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr ""
+
+#: core/validators.py:172
+msgid "A valid URL is required."
+msgstr ""
+
+#: core/validators.py:186
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+
+#: core/validators.py:193
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr ""
+
+#: core/validators.py:203
+#, python-format
+msgid "Invalid URL: %s"
+msgstr ""
+
+#: core/validators.py:205
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr ""
+
+#: core/validators.py:211
+msgid "Enter a valid U.S. state abbreviation."
+msgstr ""
+
+#: core/validators.py:226
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:233
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr ""
+
+#: core/validators.py:252
+msgid "Please enter something for at least one field."
+msgstr ""
+
+#: core/validators.py:261 core/validators.py:272
+msgid "Please enter both fields or leave them both empty."
+msgstr ""
+
+#: core/validators.py:279
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr ""
+
+#: core/validators.py:291
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr ""
+
+#: core/validators.py:310
+msgid "Duplicate values are not allowed."
+msgstr ""
+
+#: core/validators.py:333
+#, python-format
+msgid "This value must be a power of %s."
+msgstr ""
+
+#: core/validators.py:344
+msgid "Please enter a valid decimal number."
+msgstr ""
+
+#: core/validators.py:346
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:359
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+
+#: core/validators.py:360
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+
+#: core/validators.py:373
+msgid "The format for this field is wrong."
+msgstr ""
+
+#: core/validators.py:388
+msgid "This field is invalid."
+msgstr ""
+
+#: core/validators.py:423
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr ""
+
+#: core/validators.py:426
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+
+#: core/validators.py:459
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:463
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:468
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:473
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:477
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:482
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/meta/fields.py:95
+msgid " Separate multiple IDs with commas."
+msgstr ""
+
+#: core/meta/fields.py:98
+msgid ""
+" Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
diff --git a/django/conf/locale/es/LC_MESSAGES/django.mo b/django/conf/locale/es/LC_MESSAGES/django.mo
new file mode 100644
index 0000000000..71a633795c
--- /dev/null
+++ 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
new file mode 100644
index 0000000000..7a00bc51a3
--- /dev/null
+++ b/django/conf/locale/es/LC_MESSAGES/django.po
@@ -0,0 +1,959 @@
+# translation of django.po to Espaol
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Ricardo Javier Crdenes Medina <ricardo.cardenes@gmail.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-11-03 12:26+0100\n"
+"PO-Revision-Date: 2005-10-04 20:59GMT\n"
+"Last-Translator: Ricardo Javier Crdenes Medina <ricardo.cardenes@gmail."
+"com>\n"
+"Language-Team: Espaol <es@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.10.2\n"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:29
+#: 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
+msgid "Home"
+msgstr "Inicio"
+
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Histrico"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Fecha/hora"
+
+#: contrib/admin/templates/admin/object_history.html:19 models/auth.py:47
+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. N Y, H:i"
+
+#: 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 histrico de cambios. Probablemente no fue aadido "
+"usando este sitio de administracin."
+
+#: 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/500.html:4
+#, fuzzy
+msgid "Server error"
+msgstr "Error del servidor (500)"
+
+#: 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 electrnico y debera arreglarse en breve. Gracias por su "
+"paciencia"
+
+#: 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/index.html:27
+msgid "Add"
+msgstr "Agregar"
+
+#: contrib/admin/templates/admin/index.html:33
+msgid "Change"
+msgstr "Modificar"
+
+#: contrib/admin/templates/admin/index.html:43
+msgid "You don't have permission to edit anything."
+msgstr "No tiene permiso para editar nada."
+
+#: contrib/admin/templates/admin/index.html:51
+msgid "Recent Actions"
+msgstr "Acciones recientes"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "My Actions"
+msgstr "Mis acciones"
+
+#: contrib/admin/templates/admin/index.html:56
+msgid "None available"
+msgstr "Ninguno disponible"
+
+#: contrib/admin/templates/admin/login.html:15
+msgid "Username:"
+msgstr "Usuario:"
+
+#: contrib/admin/templates/admin/login.html:18
+msgid "Password:"
+msgstr "Clave:"
+
+#: contrib/admin/templates/admin/login.html:20
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Ha <a href=\"/password_reset/\">olvidado su clave</a>?"
+
+#: contrib/admin/templates/admin/login.html:24
+msgid "Log in"
+msgstr "Registrarse"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Bienvenido,"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Change password"
+msgstr "Cambiar clave"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Log out"
+msgstr "Terminar"
+
+#: 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 ""
+"Eliminar el %(object_name)s '%(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: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 ""
+"Est seguro de que quiere borrar los %(object_name)s \"%(object)s\"? Se "
+"borrarn los siguientes objetos relacionados:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:18
+msgid "Yes, I'm sure"
+msgstr "S, estoy seguro"
+
+#: 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 "Cambiar 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 con xito"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Su clave ha cambiado."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Recuperar clave"
+
+#: 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 clave? Introduzca su direccin de correo, 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:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Recuperar mi clave"
+
+#: 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/logged_out.html:10
+msgid "Log in again"
+msgstr "Registrarse 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 con xito"
+
+#: 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 "
+"recibirla en breve."
+
+#: 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 "
+"la nueva clave dos veces para verificar que la ha escrito correctamente."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Clave antigua:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Clave nueva:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Confirme clave:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+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 "Recibe 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 pgina:"
+
+#: 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/models/admin.py:6
+#, fuzzy
+msgid "action time"
+msgstr "Fecha/hora"
+
+#: contrib/admin/models/admin.py:9
+msgid "object id"
+msgstr ""
+
+#: contrib/admin/models/admin.py:10
+msgid "object repr"
+msgstr ""
+
+#: contrib/admin/models/admin.py:11
+msgid "action flag"
+msgstr ""
+
+#: contrib/admin/models/admin.py:12
+msgid "change message"
+msgstr ""
+
+#: contrib/admin/models/admin.py:15
+msgid "log entry"
+msgstr ""
+
+#: contrib/admin/models/admin.py:16
+msgid "log entries"
+msgstr ""
+
+#: 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: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 ""
+
+#: models/core.py:5
+msgid "domain name"
+msgstr ""
+
+#: models/core.py:6
+msgid "display name"
+msgstr ""
+
+#: models/core.py:8
+msgid "site"
+msgstr ""
+
+#: models/core.py:9
+msgid "sites"
+msgstr ""
+
+#: models/core.py:22
+msgid "label"
+msgstr ""
+
+#: models/core.py:23 models/core.py:34 models/auth.py:6 models/auth.py:19
+#, fuzzy
+msgid "name"
+msgstr "Usuario:"
+
+#: models/core.py:25
+msgid "package"
+msgstr ""
+
+#: models/core.py:26
+msgid "packages"
+msgstr ""
+
+#: models/core.py:36
+msgid "python module name"
+msgstr ""
+
+#: models/core.py:38
+msgid "content type"
+msgstr ""
+
+#: models/core.py:39
+msgid "content types"
+msgstr ""
+
+#: models/core.py:62
+msgid "redirect from"
+msgstr ""
+
+#: models/core.py:63
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+
+#: models/core.py:64
+msgid "redirect to"
+msgstr ""
+
+#: models/core.py:65
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+
+#: models/core.py:67
+msgid "redirect"
+msgstr ""
+
+#: models/core.py:68
+msgid "redirects"
+msgstr ""
+
+#: models/core.py:81
+msgid "URL"
+msgstr ""
+
+#: models/core.py:82
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+
+#: models/core.py:83
+msgid "title"
+msgstr ""
+
+#: models/core.py:84
+msgid "content"
+msgstr ""
+
+#: models/core.py:85
+msgid "enable comments"
+msgstr ""
+
+#: models/core.py:86
+msgid "template name"
+msgstr ""
+
+#: models/core.py:87
+msgid ""
+"Example: 'flatfiles/contact_page'. If this isn't provided, the system will "
+"use 'flatfiles/default'."
+msgstr ""
+
+#: models/core.py:88
+msgid "registration required"
+msgstr ""
+
+#: models/core.py:88
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+
+#: models/core.py:92
+msgid "flat page"
+msgstr ""
+
+#: models/core.py:93
+msgid "flat pages"
+msgstr ""
+
+#: models/core.py:114
+msgid "session key"
+msgstr ""
+
+#: models/core.py:115
+msgid "session data"
+msgstr ""
+
+#: models/core.py:116
+msgid "expire date"
+msgstr ""
+
+#: models/core.py:118
+msgid "session"
+msgstr ""
+
+#: models/core.py:119
+msgid "sessions"
+msgstr ""
+
+#: models/auth.py:8
+msgid "codename"
+msgstr ""
+
+#: models/auth.py:10
+msgid "Permission"
+msgstr ""
+
+#: models/auth.py:11 models/auth.py:58
+msgid "Permissions"
+msgstr ""
+
+#: models/auth.py:22
+msgid "Group"
+msgstr ""
+
+#: models/auth.py:23 models/auth.py:60
+msgid "Groups"
+msgstr ""
+
+#: models/auth.py:33
+#, fuzzy
+msgid "username"
+msgstr "Usuario:"
+
+#: models/auth.py:34
+msgid "first name"
+msgstr ""
+
+#: models/auth.py:35
+msgid "last name"
+msgstr ""
+
+#: models/auth.py:36
+#, fuzzy
+msgid "e-mail address"
+msgstr "Direccin de correo:"
+
+#: models/auth.py:37
+#, fuzzy
+msgid "password"
+msgstr "Clave:"
+
+#: models/auth.py:37
+msgid "Use an MD5 hash -- not the raw password."
+msgstr ""
+
+#: models/auth.py:38
+msgid "staff status"
+msgstr ""
+
+#: models/auth.py:38
+msgid "Designates whether the user can log into this admin site."
+msgstr ""
+
+#: models/auth.py:39
+msgid "active"
+msgstr ""
+
+#: models/auth.py:40
+msgid "superuser status"
+msgstr ""
+
+#: models/auth.py:41
+msgid "last login"
+msgstr ""
+
+#: models/auth.py:42
+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 ""
+
+#: models/auth.py:48
+#, fuzzy
+msgid "Users"
+msgstr "Usuario"
+
+#: models/auth.py:57
+msgid "Personal info"
+msgstr ""
+
+#: models/auth.py:59
+msgid "Important dates"
+msgstr ""
+
+#: models/auth.py:182
+msgid "Message"
+msgstr ""
+
+#: conf/global_settings.py:37
+msgid "Czech"
+msgstr ""
+
+#: conf/global_settings.py:38
+msgid "German"
+msgstr ""
+
+#: conf/global_settings.py:39
+msgid "English"
+msgstr ""
+
+#: conf/global_settings.py:40
+msgid "Spanish"
+msgstr ""
+
+#: conf/global_settings.py:41
+msgid "French"
+msgstr ""
+
+#: conf/global_settings.py:42
+msgid "Galician"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "Italian"
+msgstr ""
+
+#: conf/global_settings.py:44
+msgid "Brazilian"
+msgstr ""
+
+#: conf/global_settings.py:45
+msgid "Russian"
+msgstr ""
+
+#: conf/global_settings.py:46
+msgid "Serbian"
+msgstr ""
+
+#: conf/global_settings.py:47
+msgid "Traditional Chinese"
+msgstr ""
+
+#: core/validators.py:58
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Este valor debe contener slo letras, nmeros y guin bajo."
+
+#: core/validators.py:62
+#, fuzzy
+msgid "This value must contain only letters, numbers, underscores and slashes."
+msgstr "Este valor debe contener slo letras, nmeros y guin bajo."
+
+#: core/validators.py:70
+msgid "Uppercase letters are not allowed here."
+msgstr ""
+
+#: core/validators.py:74
+msgid "Lowercase letters are not allowed here."
+msgstr ""
+
+#: core/validators.py:81
+msgid "Enter only digits separated by commas."
+msgstr ""
+
+#: core/validators.py:93
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr ""
+
+#: core/validators.py:100
+msgid "Please enter a valid IP address."
+msgstr ""
+
+#: core/validators.py:104
+msgid "Empty values are not allowed here."
+msgstr ""
+
+#: core/validators.py:108
+msgid "Non-numeric characters aren't allowed here."
+msgstr ""
+
+#: core/validators.py:112
+msgid "This value can't be comprised solely of digits."
+msgstr ""
+
+#: core/validators.py:117
+msgid "Enter a whole number."
+msgstr ""
+
+#: core/validators.py:121
+msgid "Only alphabetical characters are allowed here."
+msgstr ""
+
+#: core/validators.py:125
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr ""
+
+#: core/validators.py:129
+msgid "Enter a valid time in HH:MM format."
+msgstr ""
+
+#: core/validators.py:133
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr ""
+
+#: core/validators.py:137
+#, fuzzy
+msgid "Enter a valid e-mail address."
+msgstr "Direccin de correo:"
+
+#: core/validators.py:149
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+
+#: core/validators.py:156
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr ""
+
+#: core/validators.py:160
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+
+#: core/validators.py:168
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr ""
+
+#: core/validators.py:172
+msgid "A valid URL is required."
+msgstr ""
+
+#: core/validators.py:186
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+
+#: core/validators.py:193
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr ""
+
+#: core/validators.py:203
+#, python-format
+msgid "Invalid URL: %s"
+msgstr ""
+
+#: core/validators.py:205
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr ""
+
+#: core/validators.py:211
+msgid "Enter a valid U.S. state abbreviation."
+msgstr ""
+
+#: core/validators.py:226
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:233
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr ""
+
+#: core/validators.py:252
+msgid "Please enter something for at least one field."
+msgstr ""
+
+#: core/validators.py:261 core/validators.py:272
+msgid "Please enter both fields or leave them both empty."
+msgstr ""
+
+#: core/validators.py:279
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr ""
+
+#: core/validators.py:291
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr ""
+
+#: core/validators.py:310
+msgid "Duplicate values are not allowed."
+msgstr ""
+
+#: core/validators.py:333
+#, python-format
+msgid "This value must be a power of %s."
+msgstr ""
+
+#: core/validators.py:344
+msgid "Please enter a valid decimal number."
+msgstr ""
+
+#: core/validators.py:346
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:359
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+
+#: core/validators.py:360
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+
+#: core/validators.py:373
+msgid "The format for this field is wrong."
+msgstr ""
+
+#: core/validators.py:388
+msgid "This field is invalid."
+msgstr ""
+
+#: core/validators.py:423
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr ""
+
+#: core/validators.py:426
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+
+#: core/validators.py:459
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:463
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:468
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:473
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:477
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:482
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/meta/fields.py:95
+msgid " Separate multiple IDs with commas."
+msgstr ""
+
+#: core/meta/fields.py:98
+msgid ""
+" Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+#~ msgid "Server error <em>(500)</em>"
+#~ msgstr "Error del servidor <em>(500)</em>"
+
+#~ msgid "Click to change"
+#~ msgstr "Cambie para modificar"
diff --git a/django/conf/locale/fr/LC_MESSAGES/django.mo b/django/conf/locale/fr/LC_MESSAGES/django.mo
new file mode 100644
index 0000000000..64ab862e5b
--- /dev/null
+++ 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
new file mode 100644
index 0000000000..6e88cc51f4
--- /dev/null
+++ b/django/conf/locale/fr/LC_MESSAGES/django.po
@@ -0,0 +1,995 @@
+# translation of django.po to french
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Laurent Rahuel <laurent.rahuel@gmail.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-11-03 12:26+0100\n"
+"PO-Revision-Date: 2005-10-18 12:27+0200\n"
+"Last-Translator: Laurent Rahuel <laurent.rahuel@gmail.com>\n"
+"Language-Team: franais <fr@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:29
+#: 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
+msgid "Home"
+msgstr "Accueil"
+
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Historique"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Date/Heure"
+
+#: contrib/admin/templates/admin/object_history.html:19 models/auth.py:47
+msgid "User"
+msgstr "Utilisateur"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Action"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j. N Y, H:i"
+
+#: 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 ""
+"Cet objet n'a pas d'historique de modification. Il n'a probablement pas t "
+"ajout au moyen de ce site d'administration."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Site d'administration de Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administration de Django"
+
+#: contrib/admin/templates/admin/500.html:4
+#, fuzzy
+msgid "Server error"
+msgstr "Erreur du serveur (500)"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Erreur du serveur (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Erreur du serveur <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 ""
+"Une erreur est survenue. Elle a t transmise par courriel aux "
+"administrateurs du site et sera corrige dans les meilleurs dlais. Merci "
+"pour votre patience."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Cette page n'a pas t trouve"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Nous sommes dsols, mais la page demande est introuvable."
+
+#: contrib/admin/templates/admin/index.html:27
+msgid "Add"
+msgstr "Ajouter"
+
+#: contrib/admin/templates/admin/index.html:33
+msgid "Change"
+msgstr "Modifier"
+
+#: contrib/admin/templates/admin/index.html:43
+msgid "You don't have permission to edit anything."
+msgstr "Vous n'avez pas la permission d'diter quoi que ce soit."
+
+#: contrib/admin/templates/admin/index.html:51
+msgid "Recent Actions"
+msgstr "Actions rcentes"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "My Actions"
+msgstr "Mes actions"
+
+#: contrib/admin/templates/admin/index.html:56
+msgid "None available"
+msgstr "Aucun(e) disponible"
+
+#: contrib/admin/templates/admin/login.html:15
+msgid "Username:"
+msgstr "Nom d'utilisateur"
+
+#: contrib/admin/templates/admin/login.html:18
+msgid "Password:"
+msgstr "Mot de passe"
+
+#: contrib/admin/templates/admin/login.html:20
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Avez vous <a href=\"/password_reset/\">perdu votre mot de passe</a>?"
+
+#: contrib/admin/templates/admin/login.html:24
+msgid "Log in"
+msgstr "Connectez vous"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Bienvenue,"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Change password"
+msgstr "Modifier votre mot de passe"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Log out"
+msgstr "Dconnection"
+
+#: 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 ""
+"Supprimer %(object_name)s '%(object)s' provoquerait la suppression des "
+"objets qui lui sont lis mais votre compte ne possde pas la permission de "
+"supprimer les types d'objets suivants:"
+
+#: 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 ""
+"tes vous certain de vouloir supprimer %(object_name)s \"%(object)s\"? Tous "
+"les lments lis suivants seront supprims:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:18
+msgid "Yes, I'm sure"
+msgstr "Oui, je suis certain"
+
+#: 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 "Modification de votre mot de passe"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Mot de passe modifi avec succs"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Votre mot de passe a t modifi."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Rinitialisation de votre mot de passe"
+
+#: 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 ""
+"Mot de passe perdu ? Saisissez votre adresse de courriel ci-dessous et nous "
+"annulerons votre mot de passe actuel avant de vous en faire parvenir un "
+"nouveau par courriel."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Courriel:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Rinitialiser mon mot de passe"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Merci pour le temps que vous avez accord au site aujourd'hui."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Connectez vous nouveau"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Mot de passe rinitialis avec succs"
+
+#: 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 ""
+"Nous vous avons envoy par courriel un nouveau mot de passe. Vous devriez le "
+"recevoir rapidement."
+
+#: 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 ""
+"Pour des raisons de scurit, veuillez entrer votre ancien mot de passe puis "
+"saisissez deux fois votre nouveau mot de passe afin que nous puissions "
+"vrifier que vous l'avez tap correctement."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Ancien mot de passe:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Nouveau mot de passe:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Confirmation de votre nouveau mot de passe"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Modifier mon mot de passe"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+"Vous recevez ce courriel car vous avez demand un changement de mot de passe"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "pour votre compte du 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: %(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:"
+
+#: 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:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Merci d'utiliser notre site!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "L'quipe %(site_name)s"
+
+#: contrib/admin/models/admin.py:6
+msgid "action time"
+msgstr "heure de l'action"
+
+#: contrib/admin/models/admin.py:9
+msgid "object id"
+msgstr "id de l'objet"
+
+#: contrib/admin/models/admin.py:10
+msgid "object repr"
+msgstr "repr de l'objet"
+
+#: contrib/admin/models/admin.py:11
+msgid "action flag"
+msgstr "drapeau de l'action"
+
+#: contrib/admin/models/admin.py:12
+msgid "change message"
+msgstr "message de modification"
+
+#: contrib/admin/models/admin.py:15
+msgid "log entry"
+msgstr "entre de log"
+
+#: contrib/admin/models/admin.py:16
+msgid "log entries"
+msgstr "entres de log"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Lundi"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Mardi"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Mercredi"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Jeudi"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Vendredi"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Samedi"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Dimanche"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Janvier"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Fvrier"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Mars"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Avril"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Mai"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Juin"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Juillet"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Aut"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Septembre"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Octobre"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Novembre"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Dcembre"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Fv."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Aut"
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Sept."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Oct."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dc."
+
+#: models/core.py:5
+msgid "domain name"
+msgstr "nom de domaine"
+
+#: models/core.py:6
+msgid "display name"
+msgstr "nom afficher"
+
+#: models/core.py:8
+msgid "site"
+msgstr "site"
+
+#: models/core.py:9
+msgid "sites"
+msgstr "sites"
+
+#: models/core.py:22
+msgid "label"
+msgstr "intitul"
+
+#: models/core.py:23 models/core.py:34 models/auth.py:6 models/auth.py:19
+msgid "name"
+msgstr "nom"
+
+#: models/core.py:25
+msgid "package"
+msgstr "paquetage"
+
+#: models/core.py:26
+msgid "packages"
+msgstr "paquetages"
+
+#: models/core.py:36
+msgid "python module name"
+msgstr "nom du module python"
+
+#: models/core.py:38
+msgid "content type"
+msgstr "type de contenu"
+
+#: models/core.py:39
+msgid "content types"
+msgstr "types de contenu"
+
+#: models/core.py:62
+msgid "redirect from"
+msgstr "redirig depuis"
+
+#: models/core.py:63
+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/'."
+
+#: models/core.py:64
+msgid "redirect to"
+msgstr "redirig vers"
+
+#: models/core.py:65
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Ceci peut tre soit un chemin absolu (voir ci-dessus) soit une URL complte "
+"dbutant par 'http://'."
+
+#: models/core.py:67
+msgid "redirect"
+msgstr "redirection"
+
+#: models/core.py:68
+msgid "redirects"
+msgstr "redirections"
+
+#: models/core.py:81
+msgid "URL"
+msgstr "URL"
+
+#: models/core.py:82
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Par exemple : '/about/contact/'. Vrifiez la prsence du caractre '/' en "
+"dbut et en fin de chaine."
+
+#: models/core.py:83
+msgid "title"
+msgstr "titre"
+
+#: models/core.py:84
+msgid "content"
+msgstr "contenu"
+
+#: models/core.py:85
+msgid "enable comments"
+msgstr "autoriser les commentaires"
+
+#: models/core.py:86
+msgid "template name"
+msgstr "nom du template"
+
+#: models/core.py:87
+msgid ""
+"Example: 'flatfiles/contact_page'. If this isn't provided, the system will "
+"use 'flatfiles/default'."
+msgstr ""
+"Par exemple: 'flatfiles/contact_page'. Sans dfinition, le systme utilisera "
+"'flatfiles/default'."
+
+#: models/core.py:88
+msgid "registration required"
+msgstr "enregistrement requis"
+
+#: models/core.py:88
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Si coch, seuls les utilisateurs connects auront la possibilit de voir "
+"cette page."
+
+#: models/core.py:92
+msgid "flat page"
+msgstr "page plat"
+
+#: models/core.py:93
+msgid "flat pages"
+msgstr "pages plat"
+
+#: models/core.py:114
+msgid "session key"
+msgstr "cl de session"
+
+#: models/core.py:115
+msgid "session data"
+msgstr "donne de session"
+
+#: models/core.py:116
+msgid "expire date"
+msgstr "date d'expiration"
+
+#: models/core.py:118
+msgid "session"
+msgstr "session"
+
+#: models/core.py:119
+msgid "sessions"
+msgstr "sessions"
+
+#: models/auth.py:8
+msgid "codename"
+msgstr "nom de code"
+
+#: models/auth.py:10
+msgid "Permission"
+msgstr "Permission"
+
+#: models/auth.py:11 models/auth.py:58
+msgid "Permissions"
+msgstr "Permissions"
+
+#: models/auth.py:22
+msgid "Group"
+msgstr "Groupe"
+
+#: models/auth.py:23 models/auth.py:60
+msgid "Groups"
+msgstr "Groupes"
+
+#: models/auth.py:33
+msgid "username"
+msgstr "nom d'utilisateur"
+
+#: models/auth.py:34
+msgid "first name"
+msgstr "prnom"
+
+#: models/auth.py:35
+msgid "last name"
+msgstr "nom"
+
+#: models/auth.py:36
+msgid "e-mail address"
+msgstr "courriel"
+
+#: models/auth.py:37
+msgid "password"
+msgstr "mot de passe"
+
+#: models/auth.py:37
+msgid "Use an MD5 hash -- not the raw password."
+msgstr "Utilisez une chaine crypte MD5 -- pas un mot de passe en clair."
+
+#: models/auth.py:38
+msgid "staff status"
+msgstr "statut staff"
+
+#: models/auth.py:38
+msgid "Designates whether the user can log into this admin site."
+msgstr "Prcise si l'utilisateur peut se connecter ce site d'administration."
+
+#: models/auth.py:39
+msgid "active"
+msgstr "actif"
+
+#: models/auth.py:40
+msgid "superuser status"
+msgstr "statut superuser"
+
+#: models/auth.py:41
+msgid "last login"
+msgstr "dernire connection"
+
+#: models/auth.py:42
+msgid "date joined"
+msgstr "date d'inscription"
+
+#: 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 ""
+"En plus des permissions qui lui sont manuellement assignes, cet utilisateur "
+"recevra aussi toutes les permissions de tous les groupes auquels il "
+"appartient. "
+
+#: models/auth.py:48
+msgid "Users"
+msgstr "Utilisateurs"
+
+#: models/auth.py:57
+msgid "Personal info"
+msgstr "Information personnelle"
+
+#: models/auth.py:59
+msgid "Important dates"
+msgstr "Dates importantes"
+
+#: models/auth.py:182
+msgid "Message"
+msgstr "Message"
+
+#: conf/global_settings.py:37
+msgid "Czech"
+msgstr "Tchque"
+
+#: conf/global_settings.py:38
+msgid "German"
+msgstr "Allemand"
+
+#: conf/global_settings.py:39
+msgid "English"
+msgstr "Anglais"
+
+#: conf/global_settings.py:40
+msgid "Spanish"
+msgstr "Espagnol"
+
+#: conf/global_settings.py:41
+msgid "French"
+msgstr "Franais"
+
+#: conf/global_settings.py:42
+msgid "Galician"
+msgstr "Galicien"
+
+#: conf/global_settings.py:43
+#, fuzzy
+msgid "Italian"
+msgstr "Italien"
+
+#: conf/global_settings.py:44
+msgid "Brazilian"
+msgstr "Brsilien"
+
+#: conf/global_settings.py:45
+msgid "Russian"
+msgstr "Russe"
+
+#: conf/global_settings.py:46
+#, fuzzy
+msgid "Serbian"
+msgstr "Serbe"
+
+#: conf/global_settings.py:47
+msgid "Traditional Chinese"
+msgstr ""
+
+#: core/validators.py:58
+msgid "This value must contain only letters, numbers and underscores."
+msgstr ""
+"Ce champ ne doit contenir que des lettres, des nombres et des sous-tirets."
+
+#: core/validators.py:62
+msgid "This value must contain only letters, numbers, underscores and slashes."
+msgstr ""
+"Ce champ ne doit contenir que des lettres, des nombres, des sous-tirets et "
+"des '/'."
+
+#: core/validators.py:70
+msgid "Uppercase letters are not allowed here."
+msgstr "Les lettres majuscules ne sont pas autorises ici."
+
+#: core/validators.py:74
+msgid "Lowercase letters are not allowed here."
+msgstr "Les lettres minuscules ne sont pas autorises ici."
+
+#: core/validators.py:81
+msgid "Enter only digits separated by commas."
+msgstr "Seulement des chiffres ([0-9]), spars par des virgules."
+
+#: core/validators.py:93
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Entrez des adresses de courriel valides spares par des virgules."
+
+#: core/validators.py:100
+msgid "Please enter a valid IP address."
+msgstr "Entrez une adresse IP valide."
+
+#: core/validators.py:104
+msgid "Empty values are not allowed here."
+msgstr "Vous ne pouvez pas laisser ce champ vide."
+
+#: core/validators.py:108
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Les caractres non numriques ne sont pas autoriss ici."
+
+#: core/validators.py:112
+msgid "This value can't be comprised solely of digits."
+msgstr "Cette valeur ne peut contenir que des chiffres [0-9]."
+
+#: core/validators.py:117
+msgid "Enter a whole number."
+msgstr "Entrez un nombre entier."
+
+#: core/validators.py:121
+msgid "Only alphabetical characters are allowed here."
+msgstr "Seules les lettres de l'alphabet sont autorises ici."
+
+#: core/validators.py:125
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Entrez une date valide au format AAAA-MM-JJ."
+
+#: core/validators.py:129
+msgid "Enter a valid time in HH:MM format."
+msgstr "Entrez une heure valide au format HH:MM."
+
+#: core/validators.py:133
+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."
+
+#: core/validators.py:137
+msgid "Enter a valid e-mail address."
+msgstr "Entrez une adresse de courriel valide."
+
+#: core/validators.py:149
+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."
+
+#: core/validators.py:156
+#, 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:160
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Les numros de tlphone doivent tre au format XX XX XX XX XX. \"%s\" est "
+"incorrect."
+
+#: core/validators.py:168
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "L'URL %s ne pointe pas vers une vido QuickTime valide."
+
+#: core/validators.py:172
+msgid "A valid URL is required."
+msgstr "Une URL valide est requise."
+
+#: core/validators.py:186
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Du HTML valide est requis. Les erreurs spcifiques sont:\n"
+"%s"
+
+#: core/validators.py:193
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML mal form: %s"
+
+#: core/validators.py:203
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL invalide: %s"
+
+#: core/validators.py:205
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "L'URL %s est un lien cass."
+
+#: core/validators.py:211
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Entrez une abrviation d'tat amricain valide."
+
+#: core/validators.py:226
+#, 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 autoriss ici."
+
+#: core/validators.py:233
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Ce champ doit correspondre au champ '%s'."
+
+#: core/validators.py:252
+msgid "Please enter something for at least one field."
+msgstr "S'il vous plat, saisissez au moins une valeur dans un des champs."
+
+#: core/validators.py:261 core/validators.py:272
+msgid "Please enter both fields or leave them both empty."
+msgstr "S'il vous plat, renseignez chaque champ ou laissez les deux vides."
+
+#: core/validators.py:279
+#, 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:291
+#, 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:310
+msgid "Duplicate values are not allowed."
+msgstr "Des valeurs identiques ne sont pas autorises."
+
+#: core/validators.py:333
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Cette valeur doit tre une puissance de %s."
+
+#: core/validators.py:344
+msgid "Please enter a valid decimal number."
+msgstr "S'il vous plat, saisissez un nombre dcimal valide."
+
+#: core/validators.py:346
+#, 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'il vous plat, saisissez un nombre dcimal valide avec au plus %s chiffre."
+msgstr[1] ""
+"S'il vous plat, saisissez un nombre dcimal valide avec au plus %s chiffres."
+
+#: core/validators.py:349
+#, 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'il vous plat, saisissez un nombre dcimal valide avec au plus %s dcimale"
+msgstr[1] ""
+"S'il vous plat, saisissez un nombre dcimal valide avec au plus %s dcimales"
+
+#: core/validators.py:359
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+"Vrifiez que le fichier transfr fait au moins une taille de %s octets."
+
+#: core/validators.py:360
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+"Vrifiez que le fichier transfr fait au plus une taille de %s octets."
+
+#: core/validators.py:373
+msgid "The format for this field is wrong."
+msgstr "Le format de ce champ est mauvais."
+
+#: core/validators.py:388
+msgid "This field is invalid."
+msgstr "Ce champ est invalide."
+
+#: core/validators.py:423
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Impossible de rcuprer quoi que ce soit depuis %s."
+
+#: core/validators.py:426
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"L'entte Content-Type '%(contenttype)s', renvoye par l'url %(url)s n'est "
+"pas valide."
+
+#: core/validators.py:459
+#, 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 dbutant par "
+"\"%(start)s\".)"
+
+#: core/validators.py:463
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Du texte commenant la ligne %(line)s n'est pas autoris dans ce contexte. "
+"(Ligne dbutant par \"%(start)s\".)"
+
+#: core/validators.py:468
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" ligne %(line)s n'est pas un attribut valide. (Ligne dbutant "
+"par \"%(start)s\".)"
+
+#: core/validators.py:473
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" ligne %(line)s n'est pas un tag valide. (Ligne dbutant par \"%"
+"(start)s\".)"
+
+#: core/validators.py:477
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Un tag, ou un ou plusieurs attributs, de la ligne %(line)s est manquant. "
+"(Ligne dbutant par \"%(start)s\".)"
+
+#: core/validators.py:482
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"La valeur de l'attribut \"%(attr)s\" de la ligne %(line)s n'est pas valide. "
+"(Ligne dbutant par \"%(start)s\".)"
+
+#: core/meta/fields.py:95
+msgid " Separate multiple IDs with commas."
+msgstr "Sparez les ID par des virgules."
+
+#: core/meta/fields.py:98
+msgid ""
+" Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Maintenez \"Control\", or \"Command\" sur un Mac, pour en slectionner plus "
+"d'une."
+
+#~ msgid "Messages"
+#~ msgstr "Messages"
diff --git a/django/conf/locale/gl/LC_MESSAGES/django.mo b/django/conf/locale/gl/LC_MESSAGES/django.mo
new file mode 100644
index 0000000000..b16c2bad9b
--- /dev/null
+++ b/django/conf/locale/gl/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/gl/LC_MESSAGES/django.po b/django/conf/locale/gl/LC_MESSAGES/django.po
new file mode 100644
index 0000000000..504316742c
--- /dev/null
+++ b/django/conf/locale/gl/LC_MESSAGES/django.po
@@ -0,0 +1,955 @@
+# Translation of django.po to Galego
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Afonso Fernández Nogueira <fonzzo.django@gmail.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-11-03 12:26+0100\n"
+"PO-Revision-Date: 2005-10-16 14:29+0100\n"
+"Last-Translator: Afonso Fernández Nogueira <fonzzo.django@gmail.com>\n"
+"Language-Team: Galego\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Galician\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:29
+#: 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
+msgid "Home"
+msgstr "Inicio"
+
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Histórico"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Data/hora"
+
+#: contrib/admin/templates/admin/object_history.html:19 models/auth.py:47
+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. N Y, H:i"
+
+#: 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 obxecto non ten histórico de cambios. Posibelmente non se creou usando "
+"este sitio de administración."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Administración de sitio Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administración de Django"
+
+#: contrib/admin/templates/admin/500.html:4
+#, fuzzy
+msgid "Server error"
+msgstr "Erro do servidor (500)"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Erro do servidor (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Erro do 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 ""
+"Houbo un erro. Xa se informou aos administradores do sitio por correo "
+"electrónico e debería quedar arranxado pronto. Grazas pola súa paciencia."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Páxina non atopada"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Sentímolo, pero non se atopou a páxina solicitada."
+
+#: contrib/admin/templates/admin/index.html:27
+msgid "Add"
+msgstr "Engadir"
+
+#: contrib/admin/templates/admin/index.html:33
+msgid "Change"
+msgstr "Modificar"
+
+#: contrib/admin/templates/admin/index.html:43
+msgid "You don't have permission to edit anything."
+msgstr "Non ten permiso para editar nada."
+
+#: contrib/admin/templates/admin/index.html:51
+msgid "Recent Actions"
+msgstr "Accións recentes"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "My Actions"
+msgstr "As miñas accións"
+
+#: contrib/admin/templates/admin/index.html:56
+msgid "None available"
+msgstr "Ningunha dispoñíbel"
+
+#: contrib/admin/templates/admin/login.html:15
+msgid "Username:"
+msgstr "Usuario:"
+
+#: contrib/admin/templates/admin/login.html:18
+msgid "Password:"
+msgstr "Contrasinal:"
+
+#: contrib/admin/templates/admin/login.html:20
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "<a href=\"/password_reset/\">Esqueceu o contrasinal</a>?"
+
+#: contrib/admin/templates/admin/login.html:24
+msgid "Log in"
+msgstr "Entrar"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Benvido,"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Change password"
+msgstr "Cambiar contrasinal"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Log out"
+msgstr "Saír"
+
+#: 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 ""
+"Borrar o %(object_name)s '%(object)s' resultaría na eliminación de obxectos "
+"relacionados, pero a súa conta non ten permiso para borrar os seguintes "
+"tipos de obxectos:"
+
+#: 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 ""
+"Seguro que quere borrar o %(object_name)s \"%(object)s\"? Eliminaranse os "
+"seguintes obxectos relacionados:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:18
+msgid "Yes, I'm sure"
+msgstr "Si, estou seguro"
+
+#: 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 "Cambiar o contrasinal"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "O seu contrasinal cambiouse correctamente."
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Cambiouse o seu contrasinal."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Recuperar o contrasinal"
+
+#: 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 ""
+"Esqueceu o contrasinal? Introduza o seu enderezo de correo electrónico "
+"embaixo e enviarémoslle un novo contrasinal."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Enderezo de correo electrónico:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Recuperar o meu contrasinal"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Grazas polo tempo que dedicou ao sitio web."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Entrar de novo"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "O contrasinal foi recuperado correctamente"
+
+#: 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 ""
+"Acabamos de enviarlle un novo contrasinal ao enderezo de correo indicado. "
+"Debería recibilo en breve."
+
+#: 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 razóns de seguridade, introduza o contrasinal actual. Despois introduza "
+"dúas veces o contrasinal para verificarmos que o escribiu correctamente."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Contrasinal actual:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Contrasinal novo:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Confirmar contrasinal:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Cambiar o contrasinal"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Recibe esta mensaxe porque solicitou recuperar o contrasinal"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "para a súa conta 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 "O seu novo contrasinal é: %(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 "Pode cambiar este contrasinal visitando esta páxina:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "No caso de que o esquecese, o seu nome de usuario é:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Grazas por usar o noso sitio web!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "O equipo de %(site_name)s"
+
+#: contrib/admin/models/admin.py:6
+#, fuzzy
+msgid "action time"
+msgstr "Data/hora"
+
+#: contrib/admin/models/admin.py:9
+msgid "object id"
+msgstr ""
+
+#: contrib/admin/models/admin.py:10
+msgid "object repr"
+msgstr ""
+
+#: contrib/admin/models/admin.py:11
+msgid "action flag"
+msgstr ""
+
+#: contrib/admin/models/admin.py:12
+msgid "change message"
+msgstr ""
+
+#: contrib/admin/models/admin.py:15
+msgid "log entry"
+msgstr ""
+
+#: contrib/admin/models/admin.py:16
+msgid "log entries"
+msgstr ""
+
+#: 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: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 ""
+
+#: models/core.py:5
+msgid "domain name"
+msgstr ""
+
+#: models/core.py:6
+msgid "display name"
+msgstr ""
+
+#: models/core.py:8
+msgid "site"
+msgstr ""
+
+#: models/core.py:9
+msgid "sites"
+msgstr ""
+
+#: models/core.py:22
+msgid "label"
+msgstr ""
+
+#: models/core.py:23 models/core.py:34 models/auth.py:6 models/auth.py:19
+#, fuzzy
+msgid "name"
+msgstr "Usuario:"
+
+#: models/core.py:25
+msgid "package"
+msgstr ""
+
+#: models/core.py:26
+msgid "packages"
+msgstr ""
+
+#: models/core.py:36
+msgid "python module name"
+msgstr ""
+
+#: models/core.py:38
+msgid "content type"
+msgstr ""
+
+#: models/core.py:39
+msgid "content types"
+msgstr ""
+
+#: models/core.py:62
+msgid "redirect from"
+msgstr ""
+
+#: models/core.py:63
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+
+#: models/core.py:64
+msgid "redirect to"
+msgstr ""
+
+#: models/core.py:65
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+
+#: models/core.py:67
+msgid "redirect"
+msgstr ""
+
+#: models/core.py:68
+msgid "redirects"
+msgstr ""
+
+#: models/core.py:81
+msgid "URL"
+msgstr ""
+
+#: models/core.py:82
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+
+#: models/core.py:83
+msgid "title"
+msgstr ""
+
+#: models/core.py:84
+msgid "content"
+msgstr ""
+
+#: models/core.py:85
+msgid "enable comments"
+msgstr ""
+
+#: models/core.py:86
+msgid "template name"
+msgstr ""
+
+#: models/core.py:87
+msgid ""
+"Example: 'flatfiles/contact_page'. If this isn't provided, the system will "
+"use 'flatfiles/default'."
+msgstr ""
+
+#: models/core.py:88
+msgid "registration required"
+msgstr ""
+
+#: models/core.py:88
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+
+#: models/core.py:92
+msgid "flat page"
+msgstr ""
+
+#: models/core.py:93
+msgid "flat pages"
+msgstr ""
+
+#: models/core.py:114
+msgid "session key"
+msgstr ""
+
+#: models/core.py:115
+msgid "session data"
+msgstr ""
+
+#: models/core.py:116
+msgid "expire date"
+msgstr ""
+
+#: models/core.py:118
+msgid "session"
+msgstr ""
+
+#: models/core.py:119
+msgid "sessions"
+msgstr ""
+
+#: models/auth.py:8
+msgid "codename"
+msgstr ""
+
+#: models/auth.py:10
+msgid "Permission"
+msgstr ""
+
+#: models/auth.py:11 models/auth.py:58
+msgid "Permissions"
+msgstr ""
+
+#: models/auth.py:22
+msgid "Group"
+msgstr ""
+
+#: models/auth.py:23 models/auth.py:60
+msgid "Groups"
+msgstr ""
+
+#: models/auth.py:33
+#, fuzzy
+msgid "username"
+msgstr "Usuario:"
+
+#: models/auth.py:34
+msgid "first name"
+msgstr ""
+
+#: models/auth.py:35
+msgid "last name"
+msgstr ""
+
+#: models/auth.py:36
+#, fuzzy
+msgid "e-mail address"
+msgstr "Enderezo de correo electrónico:"
+
+#: models/auth.py:37
+#, fuzzy
+msgid "password"
+msgstr "Contrasinal:"
+
+#: models/auth.py:37
+msgid "Use an MD5 hash -- not the raw password."
+msgstr ""
+
+#: models/auth.py:38
+msgid "staff status"
+msgstr ""
+
+#: models/auth.py:38
+msgid "Designates whether the user can log into this admin site."
+msgstr ""
+
+#: models/auth.py:39
+msgid "active"
+msgstr ""
+
+#: models/auth.py:40
+msgid "superuser status"
+msgstr ""
+
+#: models/auth.py:41
+msgid "last login"
+msgstr ""
+
+#: models/auth.py:42
+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 ""
+
+#: models/auth.py:48
+#, fuzzy
+msgid "Users"
+msgstr "Usuario"
+
+#: models/auth.py:57
+msgid "Personal info"
+msgstr ""
+
+#: models/auth.py:59
+msgid "Important dates"
+msgstr ""
+
+#: models/auth.py:182
+msgid "Message"
+msgstr ""
+
+#: conf/global_settings.py:37
+msgid "Czech"
+msgstr ""
+
+#: conf/global_settings.py:38
+msgid "German"
+msgstr ""
+
+#: conf/global_settings.py:39
+msgid "English"
+msgstr ""
+
+#: conf/global_settings.py:40
+msgid "Spanish"
+msgstr ""
+
+#: conf/global_settings.py:41
+msgid "French"
+msgstr ""
+
+#: conf/global_settings.py:42
+msgid "Galician"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "Italian"
+msgstr ""
+
+#: conf/global_settings.py:44
+msgid "Brazilian"
+msgstr ""
+
+#: conf/global_settings.py:45
+msgid "Russian"
+msgstr ""
+
+#: conf/global_settings.py:46
+msgid "Serbian"
+msgstr ""
+
+#: conf/global_settings.py:47
+msgid "Traditional Chinese"
+msgstr ""
+
+#: core/validators.py:58
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Este valor soamente pode conter letras, números e guións baixos (_)."
+
+#: core/validators.py:62
+#, fuzzy
+msgid "This value must contain only letters, numbers, underscores and slashes."
+msgstr "Este valor soamente pode conter letras, números e guións baixos (_)."
+
+#: core/validators.py:70
+msgid "Uppercase letters are not allowed here."
+msgstr ""
+
+#: core/validators.py:74
+msgid "Lowercase letters are not allowed here."
+msgstr ""
+
+#: core/validators.py:81
+msgid "Enter only digits separated by commas."
+msgstr ""
+
+#: core/validators.py:93
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr ""
+
+#: core/validators.py:100
+msgid "Please enter a valid IP address."
+msgstr ""
+
+#: core/validators.py:104
+msgid "Empty values are not allowed here."
+msgstr ""
+
+#: core/validators.py:108
+msgid "Non-numeric characters aren't allowed here."
+msgstr ""
+
+#: core/validators.py:112
+msgid "This value can't be comprised solely of digits."
+msgstr ""
+
+#: core/validators.py:117
+msgid "Enter a whole number."
+msgstr ""
+
+#: core/validators.py:121
+msgid "Only alphabetical characters are allowed here."
+msgstr ""
+
+#: core/validators.py:125
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr ""
+
+#: core/validators.py:129
+msgid "Enter a valid time in HH:MM format."
+msgstr ""
+
+#: core/validators.py:133
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr ""
+
+#: core/validators.py:137
+#, fuzzy
+msgid "Enter a valid e-mail address."
+msgstr "Enderezo de correo electrónico:"
+
+#: core/validators.py:149
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+
+#: core/validators.py:156
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr ""
+
+#: core/validators.py:160
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+
+#: core/validators.py:168
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr ""
+
+#: core/validators.py:172
+msgid "A valid URL is required."
+msgstr ""
+
+#: core/validators.py:186
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+
+#: core/validators.py:193
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr ""
+
+#: core/validators.py:203
+#, python-format
+msgid "Invalid URL: %s"
+msgstr ""
+
+#: core/validators.py:205
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr ""
+
+#: core/validators.py:211
+msgid "Enter a valid U.S. state abbreviation."
+msgstr ""
+
+#: core/validators.py:226
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:233
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr ""
+
+#: core/validators.py:252
+msgid "Please enter something for at least one field."
+msgstr ""
+
+#: core/validators.py:261 core/validators.py:272
+msgid "Please enter both fields or leave them both empty."
+msgstr ""
+
+#: core/validators.py:279
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr ""
+
+#: core/validators.py:291
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr ""
+
+#: core/validators.py:310
+msgid "Duplicate values are not allowed."
+msgstr ""
+
+#: core/validators.py:333
+#, python-format
+msgid "This value must be a power of %s."
+msgstr ""
+
+#: core/validators.py:344
+msgid "Please enter a valid decimal number."
+msgstr ""
+
+#: core/validators.py:346
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:359
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+
+#: core/validators.py:360
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+
+#: core/validators.py:373
+msgid "The format for this field is wrong."
+msgstr ""
+
+#: core/validators.py:388
+msgid "This field is invalid."
+msgstr ""
+
+#: core/validators.py:423
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr ""
+
+#: core/validators.py:426
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+
+#: core/validators.py:459
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:463
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:468
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:473
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:477
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:482
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/meta/fields.py:95
+msgid " Separate multiple IDs with commas."
+msgstr ""
+
+#: core/meta/fields.py:98
+msgid ""
+" Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+#~ msgid "Click to change"
+#~ msgstr "Faga clic para modificar"
diff --git a/django/conf/locale/it/LC_MESSAGES/django.mo b/django/conf/locale/it/LC_MESSAGES/django.mo
new file mode 100644
index 0000000000..94a16a3c63
--- /dev/null
+++ b/django/conf/locale/it/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/it/LC_MESSAGES/django.po b/django/conf/locale/it/LC_MESSAGES/django.po
new file mode 100644
index 0000000000..889cac0424
--- /dev/null
+++ b/django/conf/locale/it/LC_MESSAGES/django.po
@@ -0,0 +1,981 @@
+# SOME DESCRIPTIVE TITLE.
+# 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.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-11-03 12:26+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:29
+#: 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
+msgid "Home"
+msgstr "Pagina iniziale"
+
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Storia"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Data/ora"
+
+#: contrib/admin/templates/admin/object_history.html:19 models/auth.py:47
+msgid "User"
+msgstr "Utente"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Azione"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "Data/ora"
+
+#: 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 ""
+"Questo oggetto non ha cambiamenti storicizzati. Probabilmente non stato "
+"creato con questo sito di amministrazione."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Amministrazione sito Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Amministrazione Django"
+
+#: contrib/admin/templates/admin/500.html:4
+#, fuzzy
+msgid "Server error"
+msgstr "Errore del server (500)"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Errore del server (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Errore del Server <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 ""
+"C' stato un errore. E' stato riportato agli amministratori del sito via e-"
+"mail e verr risolto a breve. Grazie per la pazienza."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Pagina non trovata"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Spiacente, ma la pagina richiesta non esiste."
+
+#: contrib/admin/templates/admin/index.html:27
+msgid "Add"
+msgstr "Aggiungi"
+
+#: contrib/admin/templates/admin/index.html:33
+msgid "Change"
+msgstr "Cambia"
+
+#: contrib/admin/templates/admin/index.html:43
+msgid "You don't have permission to edit anything."
+msgstr "Non hai i permessi di modificare nulla."
+
+#: contrib/admin/templates/admin/index.html:51
+msgid "Recent Actions"
+msgstr "Azioni Recenti"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "My Actions"
+msgstr "Azioni Proprie"
+
+#: contrib/admin/templates/admin/index.html:56
+msgid "None available"
+msgstr "Nessuna disponibile"
+
+#: contrib/admin/templates/admin/login.html:15
+msgid "Username:"
+msgstr "Nome utente:"
+
+#: contrib/admin/templates/admin/login.html:18
+msgid "Password:"
+msgstr "Password:"
+
+#: contrib/admin/templates/admin/login.html:20
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Hai <a href=\"/password_reset/\">dimenticato la tua password</a>?"
+
+#: contrib/admin/templates/admin/login.html:24
+msgid "Log in"
+msgstr "Accedi"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Benvenuto,"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Change password"
+msgstr "Cambia la password"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Log out"
+msgstr "Esci"
+
+#: 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 ""
+"La rimozione di %(object_name)s '%(object)s' causerebbe la cancellazione "
+"degli oggetti relazionati, ma il tuo account non ha i permessi per rimuovere "
+"i seguenti tipi di oggetti:"
+
+#: 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 ""
+"Sei sicuro di voler rimuovere %(object_name)s \"%(object)s\"? I seguenti "
+"oggetti relazionati saranno rimossi:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:18
+msgid "Yes, I'm sure"
+msgstr "S, sono sicuro"
+
+#: 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 "Cambia la password"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "La password stata cambiata con successo"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "La tua password stata cambiata."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Resetta la password"
+
+#: 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 ""
+"Hai dimenticato la tua password? Inserisci il tuo indirizzo e-mail qui "
+"sotto, la tua password sar resettata e te ne verr spedita una nuova."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Indirizzo e-mail:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Resetta la mia password"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Grazie per aver speso il tuo tempo prezioso con questo sito."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Accedi di nuovo"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Password resettata con successo"
+
+#: 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 ""
+"Ti abbiamo inviato la nuova password all'indirizzo e-mail da te selezionato. "
+"Dovresti riceverla a breve."
+
+#: 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 ""
+"Inserisci la tua vecchia password, per ragioni di sicurezza, e poi la tua "
+"nuova password due volte per verificare che tu l'abbia scritta correttamente."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Vecchia password:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Nuova password:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Conferma password:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Cambia la mia password"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+"Hai ricevuto questa e-mail perch hai richesto di resettare la password"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "per il tuo account utente su %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "La tua nuova password : %(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 "Puoi cambiare la tua password su questa pagina:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Il tuo nome utente, in caso tu l'abbia dimenticato:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Ti ringraziamo per l'utilizzo del nostro sito!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Il team di %(site_name)s"
+
+#: contrib/admin/models/admin.py:6
+msgid "action time"
+msgstr "data azione"
+
+#: contrib/admin/models/admin.py:9
+msgid "object id"
+msgstr "id dell'oggetto"
+
+#: contrib/admin/models/admin.py:10
+msgid "object repr"
+msgstr "rappresentazione dell'oggetto"
+
+#: contrib/admin/models/admin.py:11
+msgid "action flag"
+msgstr "flag azione"
+
+#: contrib/admin/models/admin.py:12
+msgid "change message"
+msgstr "messaggio"
+
+#: contrib/admin/models/admin.py:15
+msgid "log entry"
+msgstr "voce di log"
+
+#: contrib/admin/models/admin.py:16
+msgid "log entries"
+msgstr "voci di log"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Luned"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Marted"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Mercoled"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Gioved"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Venerd"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sabato"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Domenica"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Gennaio"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Febbraio"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Marzo"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Aprile"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Maggio"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Giugno"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Luglio"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Agosto"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Settembre"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Ottobre"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Novembre"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Dicembre"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Gen."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Ago."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Set."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Ott."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dic."
+
+#: models/core.py:5
+msgid "domain name"
+msgstr "nome a dominio"
+
+#: models/core.py:6
+msgid "display name"
+msgstr "nome visualizzato"
+
+#: models/core.py:8
+msgid "site"
+msgstr "sito"
+
+#: models/core.py:9
+msgid "sites"
+msgstr "siti"
+
+#: models/core.py:22
+msgid "label"
+msgstr "etichetta"
+
+#: models/core.py:23 models/core.py:34 models/auth.py:6 models/auth.py:19
+msgid "name"
+msgstr "nome"
+
+#: models/core.py:25
+msgid "package"
+msgstr "pacchetto"
+
+#: models/core.py:26
+msgid "packages"
+msgstr "pacchetti"
+
+#: models/core.py:36
+msgid "python module name"
+msgstr "nome del modulo python"
+
+#: models/core.py:38
+msgid "content type"
+msgstr "tipo di contenuto"
+
+#: models/core.py:39
+msgid "content types"
+msgstr "tipo di contenuti"
+
+#: models/core.py:62
+msgid "redirect from"
+msgstr "redirigi da"
+
+#: models/core.py:63
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Un percorso assoluto, senza nome a dominio. Esempio: '/events/search/'.Un "
+"percorso assoluto, senza nome a dominio. Esempio: '/events/search/'."
+
+#: models/core.py:64
+msgid "redirect to"
+msgstr "redirigi verso"
+
+#: models/core.py:65
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Un percorso assoluto (come sopra) o un URL completa che inizi con 'http://'."
+
+#: models/core.py:67
+msgid "redirect"
+msgstr "redirigi"
+
+#: models/core.py:68
+msgid "redirects"
+msgstr "redirezioni"
+
+#: models/core.py:81
+msgid "URL"
+msgstr "URL"
+
+#: models/core.py:82
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Esempio: '/about/contact/'. Attenzione alla barra ('/') iniziale e finale."
+
+#: models/core.py:83
+msgid "title"
+msgstr "titolo"
+
+#: models/core.py:84
+msgid "content"
+msgstr "contenuto"
+
+#: models/core.py:85
+msgid "enable comments"
+msgstr "abilita commenti"
+
+#: models/core.py:86
+msgid "template name"
+msgstr "nome modello"
+
+#: models/core.py:87
+msgid ""
+"Example: 'flatfiles/contact_page'. If this isn't provided, the system will "
+"use 'flatfiles/default'."
+msgstr ""
+"Esempio: 'flatfiles/contact_page'. Se non specificato, il sistema user "
+"'flatfiles/default'."
+
+#: models/core.py:88
+msgid "registration required"
+msgstr "registrazione obbligatoria"
+
+#: models/core.py:88
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Se selezionata, solo gli utenti registrati potranno vedere la pagina."
+
+#: models/core.py:92
+msgid "flat page"
+msgstr "pagina statica"
+
+#: models/core.py:93
+msgid "flat pages"
+msgstr "pagine statiche"
+
+#: models/core.py:114
+msgid "session key"
+msgstr "chiave di sessione"
+
+#: models/core.py:115
+msgid "session data"
+msgstr "dati di sessione"
+
+#: models/core.py:116
+msgid "expire date"
+msgstr "data di scadenza"
+
+#: models/core.py:118
+msgid "session"
+msgstr "sessione"
+
+#: models/core.py:119
+msgid "sessions"
+msgstr "sessioni"
+
+#: models/auth.py:8
+msgid "codename"
+msgstr "nome in codice"
+
+#: models/auth.py:10
+msgid "Permission"
+msgstr "Permesso"
+
+#: models/auth.py:11 models/auth.py:58
+msgid "Permissions"
+msgstr "Permessi"
+
+#: models/auth.py:22
+msgid "Group"
+msgstr "Gruppo"
+
+#: models/auth.py:23 models/auth.py:60
+msgid "Groups"
+msgstr "Gruppi"
+
+#: models/auth.py:33
+msgid "username"
+msgstr "nome utente"
+
+#: models/auth.py:34
+msgid "first name"
+msgstr "nome"
+
+#: models/auth.py:35
+msgid "last name"
+msgstr "cognome"
+
+#: models/auth.py:36
+msgid "e-mail address"
+msgstr "indirizzo e-mail"
+
+#: models/auth.py:37
+msgid "password"
+msgstr "password"
+
+#: models/auth.py:37
+msgid "Use an MD5 hash -- not the raw password."
+msgstr "Usare il codice di controllo MD5 -- non la password."
+
+#: models/auth.py:38
+msgid "staff status"
+msgstr "amministratore"
+
+#: models/auth.py:38
+msgid "Designates whether the user can log into this admin site."
+msgstr "Autorizza l'utente ad accedere a questo sito di amministrazione."
+
+#: models/auth.py:39
+msgid "active"
+msgstr "attivo"
+
+#: models/auth.py:40
+msgid "superuser status"
+msgstr "stato superutente"
+
+#: models/auth.py:41
+msgid "last login"
+msgstr "ultimo accesso"
+
+#: models/auth.py:42
+msgid "date joined"
+msgstr "iscritto da"
+
+#: 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 ""
+"In aggiunta ai permessi assegnati manualmente, l'utente ricever anche tutti "
+"i permessi assegnati ad ogni gruppo cui appartiene."
+
+#: models/auth.py:48
+msgid "Users"
+msgstr "Utenti"
+
+#: models/auth.py:57
+msgid "Personal info"
+msgstr "Informazioni personali"
+
+#: models/auth.py:59
+msgid "Important dates"
+msgstr "Date importanti"
+
+#: models/auth.py:182
+msgid "Message"
+msgstr "Messaggio"
+
+#: conf/global_settings.py:37
+msgid "Czech"
+msgstr ""
+
+#: conf/global_settings.py:38
+msgid "German"
+msgstr "Tedesco"
+
+#: conf/global_settings.py:39
+msgid "English"
+msgstr "Inglese"
+
+#: conf/global_settings.py:40
+msgid "Spanish"
+msgstr "Spagnolo"
+
+#: conf/global_settings.py:41
+msgid "French"
+msgstr "Francese"
+
+#: conf/global_settings.py:42
+msgid "Galician"
+msgstr "Galiziano"
+
+#: conf/global_settings.py:43
+msgid "Italian"
+msgstr "Italiano"
+
+#: conf/global_settings.py:44
+msgid "Brazilian"
+msgstr "Brasiliano"
+
+#: conf/global_settings.py:45
+msgid "Russian"
+msgstr "Russo"
+
+#: conf/global_settings.py:46
+#, fuzzy
+msgid "Serbian"
+msgstr "Serbo"
+
+#: conf/global_settings.py:47
+msgid "Traditional Chinese"
+msgstr ""
+
+#: core/validators.py:58
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Sono ammesse solo lettere, numeri e sottolineature ('_')."
+
+#: core/validators.py:62
+msgid "This value must contain only letters, numbers, underscores and slashes."
+msgstr "Sono ammesse solo lettere, numeri, sottolineature ('_') e barre ('/')."
+
+#: core/validators.py:70
+msgid "Uppercase letters are not allowed here."
+msgstr "Non sono ammesse lettere maiuscole."
+
+#: core/validators.py:74
+msgid "Lowercase letters are not allowed here."
+msgstr "Non sono ammesse lettere minuscole."
+
+#: core/validators.py:81
+msgid "Enter only digits separated by commas."
+msgstr "Inserire solo numeri separati da virgole."
+
+#: core/validators.py:93
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Inserire indirizzi e-mail validi separati da virgole."
+
+#: core/validators.py:100
+msgid "Please enter a valid IP address."
+msgstr "Inserire un indirizzo IP valido."
+
+#: core/validators.py:104
+msgid "Empty values are not allowed here."
+msgstr "E' necessario inserire un valore."
+
+#: core/validators.py:108
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Sono ammessi soltanto caratteri alfabetici."
+
+#: core/validators.py:112
+msgid "This value can't be comprised solely of digits."
+msgstr "Il valore non pu essere composto solo da cifre."
+
+#: core/validators.py:117
+msgid "Enter a whole number."
+msgstr "Inserire un numero."
+
+#: core/validators.py:121
+msgid "Only alphabetical characters are allowed here."
+msgstr "Sono ammessi solo caratteri alfabetici."
+
+#: core/validators.py:125
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Inserire un data valida in formato YYYY-MM-DD."
+
+#: core/validators.py:129
+msgid "Enter a valid time in HH:MM format."
+msgstr "Inserire un orario valido in formato HH:MM."
+
+#: core/validators.py:133
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Inserire una data/ora in formato YYYY-MM-DD HH:MM."
+
+#: core/validators.py:137
+msgid "Enter a valid e-mail address."
+msgstr "Inserire un indirizzo e-mail valido."
+
+#: core/validators.py:149
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Caricare un'immagine valida. Il file inserito non un'immagine o corrotto."
+
+#: core/validators.py:156
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "L'URL %s non punta ad un'immagine valida."
+
+#: core/validators.py:160
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"I numeri di telefono devono essere in formato XXX-XXX-XXXX. \"%s\" non "
+"valido."
+
+#: core/validators.py:168
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "L'URL %s non punta ad un video QuickTime valido."
+
+#: core/validators.py:172
+msgid "A valid URL is required."
+msgstr "Inserire un URL valido."
+
+#: core/validators.py:186
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"E' richiesto HTML valido. Gli errori sono i seguenti:\n"
+"%s"
+
+#: core/validators.py:193
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML malformato: %s"
+
+#: core/validators.py:203
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL non valida: %s"
+
+#: core/validators.py:205
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "L'URL %s un link rotto."
+
+#: core/validators.py:211
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Inserire un nome di stato americano abbreviato valido."
+
+#: core/validators.py:226
+#, 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] "Attenzione! La parola %s non ammessa qui."
+msgstr[1] "Attenzione! Le parole %s non sono ammesse qui."
+
+#: core/validators.py:233
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Questo campo deve corrispondere al campo '%s'."
+
+#: core/validators.py:252
+msgid "Please enter something for at least one field."
+msgstr "Inserire almeno un campo."
+
+#: core/validators.py:261 core/validators.py:272
+msgid "Please enter both fields or leave them both empty."
+msgstr "Inserire entrambi i campi o lasciarli entrambi vuoti."
+
+#: core/validators.py:279
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Il campo obbligatorio se %(field)s %(value)s"
+
+#: core/validators.py:291
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Il campo non pu essere valorizzato se %(field)s non %(value)s"
+
+#: core/validators.py:310
+msgid "Duplicate values are not allowed."
+msgstr "Non sono ammessi valori duplicati."
+
+#: core/validators.py:333
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Il valore deve essere una potenza di %s."
+
+#: core/validators.py:344
+msgid "Please enter a valid decimal number."
+msgstr "Inserire un numero decimale valido."
+
+#: core/validators.py:346
+#, 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] "Inserire un numero decimale con non pi di %s cifre totali."
+msgstr[1] ""
+
+#: core/validators.py:349
+#, 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] "Inserire un decimale con non pi di %s cifre decimali."
+msgstr[1] ""
+
+#: core/validators.py:359
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Verifica che il file inserito sia almeno di %s byte."
+
+#: core/validators.py:360
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Verifica che il file inserito sia al massimo %d byte."
+
+#: core/validators.py:373
+msgid "The format for this field is wrong."
+msgstr "Formato del file non valido."
+
+#: core/validators.py:388
+msgid "This field is invalid."
+msgstr "Il campo non valido."
+
+#: core/validators.py:423
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Impossibile recuperare alcunch da %s."
+
+#: core/validators.py:426
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"L'URL %(url)s restituisce un Content-Type header non valido '%(contenttype)"
+"s'."
+
+#: core/validators.py:459
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Il tag %(tag)s alla linea %(line)s non chiuso. (La linea comincia con \"%"
+"(start)s\".)"
+
+#: core/validators.py:463
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Il testo che comincia a linea %(line)s non e' ammesso in questo contesto. "
+"(La linea comincia con \"%(start)s\".)"
+
+#: core/validators.py:468
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" alla linea %(line)s un attributo invalido. (La linea comincia "
+"con \"%(start)s\".)"
+
+#: core/validators.py:473
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" alla linea %(line)s tag non valido. (La linea comincia con \"%"
+"(start)s\".)"
+
+#: core/validators.py:477
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Un tag alla linea %(line)s manca di uno o pi attributi richiesti. (La linea "
+"comincia con \"%(start)s\".)"
+
+#: core/validators.py:482
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"L'attributo \"%(attr)s\" alla linea %(line)s ha un valore non valido. (La "
+"linea comincia con \"%(start)s\".)"
+
+#: core/meta/fields.py:95
+msgid " Separate multiple IDs with commas."
+msgstr " Separa ID multipli con virgole."
+
+#: core/meta/fields.py:98
+msgid ""
+" Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr " Premi \"Control\", o \"Command\" su Mac, per selezionarne pi di uno."
+
+#~ msgid "Itialian"
+#~ msgstr "Italiano"
+
+#~ msgid "Server error <em>(500)</em>"
+#~ msgstr "Errore del server <em>(500)</em>"
+
+#~ msgid "Click to change"
+#~ msgstr "Clicca per cambiare"
diff --git a/django/conf/locale/pt_BR/LC_MESSAGES/django.mo b/django/conf/locale/pt_BR/LC_MESSAGES/django.mo
new file mode 100644
index 0000000000..1a614f851e
--- /dev/null
+++ b/django/conf/locale/pt_BR/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/pt_BR/LC_MESSAGES/django.po b/django/conf/locale/pt_BR/LC_MESSAGES/django.po
new file mode 100644
index 0000000000..c8a19d92f7
--- /dev/null
+++ b/django/conf/locale/pt_BR/LC_MESSAGES/django.po
@@ -0,0 +1,981 @@
+# SOME DESCRIPTIVE TITLE.
+# 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.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-11-03 12:26+0100\n"
+"PO-Revision-Date: 2005-10-11 09:12GMT-3\n"
+"Last-Translator: João Paulo Farias <jpaulofarias@gmail.com>\n"
+"Language-Team: Português do Brasil <pt-br@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:29
+#: 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
+msgid "Home"
+msgstr "Início"
+
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Histórico"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Data/hora"
+
+#: contrib/admin/templates/admin/object_history.html:19 models/auth.py:47
+msgid "User"
+msgstr "Usuário"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Ação"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j. N Y, H:i"
+
+#: 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 não tem um histórico de alterações. Ele provavelmente não foi "
+"adicionado por este site de administração."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Site de administração do Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administração do Django"
+
+#: contrib/admin/templates/admin/500.html:4
+#, fuzzy
+msgid "Server error"
+msgstr "Erro no servidor (500)"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Erro no servidor (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Erro no 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 ""
+"Houve um erro. Este foi reportado aos administradores do site através d e-"
+"mail e deve ser consertado em breve. Obrigado pela compreensão."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Página não encontrada"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Desculpe, mas a página requisitada não pode ser encontrada."
+
+#: contrib/admin/templates/admin/index.html:27
+msgid "Add"
+msgstr "Adicionar"
+
+#: contrib/admin/templates/admin/index.html:33
+msgid "Change"
+msgstr "Modificar"
+
+#: contrib/admin/templates/admin/index.html:43
+msgid "You don't have permission to edit anything."
+msgstr "Você não tem permissão para edição."
+
+#: contrib/admin/templates/admin/index.html:51
+msgid "Recent Actions"
+msgstr "Ações Recentes"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "My Actions"
+msgstr "Minhas Ações"
+
+#: contrib/admin/templates/admin/index.html:56
+msgid "None available"
+msgstr "Nenhuma disponível"
+
+#: contrib/admin/templates/admin/login.html:15
+msgid "Username:"
+msgstr "Usuário:"
+
+#: contrib/admin/templates/admin/login.html:18
+msgid "Password:"
+msgstr "Senha:"
+
+#: contrib/admin/templates/admin/login.html:20
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Você <a href=\"/password_reset/\"esqueceu a senha</a>?"
+
+#: contrib/admin/templates/admin/login.html:24
+msgid "Log in"
+msgstr "Acessar"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Bem vindo,"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Change password"
+msgstr "Alterar senha"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Log out"
+msgstr "Encerrar sessão"
+
+#: 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 ""
+"A remoção de '%(object)s' %(object_name)s pode resultar na remoção de "
+"objetos relacionados, mas sua conta não tem a permissão para remoção dos "
+"seguintes tipos de objetos:"
+
+#: 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 ""
+"Você tem certeza que quer remover o \"%(object)s\" %(object_name)s? Todos os "
+"seguintes itens relacionados serão removidos:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:18
+msgid "Yes, I'm sure"
+msgstr "Sim, tenho certeza"
+
+#: 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 "Alterar senha"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Senha alterada com sucesso"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Sua senha foi alterada."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Reinicializar senha"
+
+#: 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 ""
+"Esqueceu a senha? Digite seu e-mail abaixo e nós iremos enviar uma nova "
+"senha para você."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Endereço de e-mail:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Reinicializar minha senha"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Obrigado por visitar nosso Web site hoje."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Acessar novamente"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Senha inicializada com sucesso"
+
+#: 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 ""
+"Nós enviamos uma nova senha para o e-mail que você informou. Você deve estar "
+"recebendo uma mensagem em breve."
+
+#: 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, informe sua senha antiga, por segurança, e então informe sua nova "
+"senha duas vezes para que possamos verificar que se ela está correta."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Senha antiga:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Nova senha:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Confirme a senha:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Alterar minha senha"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Você está recebendo este e-mail porque você pediu uma nova senha"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "para sua conta em %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Sua nova senha é: %(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 "Sinta-se livre para alterar esta senha visitando esta página:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Seu nome de usuário, caso tenha esquecido:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Obrigado por usar nosso site!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Time do %(site_name)s"
+
+#: contrib/admin/models/admin.py:6
+msgid "action time"
+msgstr "hora da ação"
+
+#: contrib/admin/models/admin.py:9
+msgid "object id"
+msgstr "id do objeto"
+
+#: contrib/admin/models/admin.py:10
+msgid "object repr"
+msgstr "repr do objeto"
+
+#: contrib/admin/models/admin.py:11
+msgid "action flag"
+msgstr "flag de ação"
+
+#: contrib/admin/models/admin.py:12
+msgid "change message"
+msgstr "alterar mensagem"
+
+#: contrib/admin/models/admin.py:15
+msgid "log entry"
+msgstr "entrada de log"
+
+#: contrib/admin/models/admin.py:16
+msgid "log entries"
+msgstr "entradas de log"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Segunda Feira"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Terça Feira"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Quarta Feira"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Quinta Feira"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Sexta Feira"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sábado"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Domingo"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Janeiro"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Fevereiro"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Março"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Abril"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Maio"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Junho"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Julho"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Agosto"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Setembro"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Outubro"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Novembro"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Dezembro"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Fev."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Ago."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Set."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Out."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dez."
+
+#: models/core.py:5
+msgid "domain name"
+msgstr "nome do domínio"
+
+#: models/core.py:6
+msgid "display name"
+msgstr "nome para exibição"
+
+#: models/core.py:8
+msgid "site"
+msgstr "site"
+
+#: models/core.py:9
+msgid "sites"
+msgstr "sites"
+
+#: models/core.py:22
+msgid "label"
+msgstr "etiqueta"
+
+#: models/core.py:23 models/core.py:34 models/auth.py:6 models/auth.py:19
+#, fuzzy
+msgid "name"
+msgstr "nome:"
+
+#: models/core.py:25
+msgid "package"
+msgstr "pacote"
+
+#: models/core.py:26
+msgid "packages"
+msgstr "pacotes"
+
+#: models/core.py:36
+msgid "python module name"
+msgstr "nome do módulo python"
+
+#: models/core.py:38
+msgid "content type"
+msgstr "tipo de conteúdo"
+
+#: models/core.py:39
+msgid "content types"
+msgstr "tipos de conteúdo"
+
+#: models/core.py:62
+msgid "redirect from"
+msgstr "redirecionar de"
+
+#: models/core.py:63
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Deve conter um caminho absoluto, excluindo o nome de domínio. Exemplo: '/"
+"eventos/busca/'."
+
+#: models/core.py:64
+msgid "redirect to"
+msgstr "redirecionar para"
+
+#: models/core.py:65
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Deve conter um caminho absoluto (como acima) ou uma URL completa, começando "
+"com 'http://'."
+
+#: models/core.py:67
+msgid "redirect"
+msgstr "redirecionar"
+
+#: models/core.py:68
+msgid "redirects"
+msgstr "redirecionamentos"
+
+#: models/core.py:81
+msgid "URL"
+msgstr "URL"
+
+#: models/core.py:82
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Exemplo: '/sobre/contato/'. Lembre-se das barras no começo e no final."
+
+#: models/core.py:83
+msgid "title"
+msgstr "título"
+
+#: models/core.py:84
+msgid "content"
+msgstr "conteúdo"
+
+#: models/core.py:85
+msgid "enable comments"
+msgstr "habilitar comentários"
+
+#: models/core.py:86
+msgid "template name"
+msgstr "nome do modelo"
+
+#: models/core.py:87
+msgid ""
+"Example: 'flatfiles/contact_page'. If this isn't provided, the system will "
+"use 'flatfiles/default'."
+msgstr ""
+"Exemplo: 'flatfiles/contact_page'. Se não for informado, será utilizado "
+"'flatfiles/default'."
+
+#: models/core.py:88
+msgid "registration required"
+msgstr "é obrigatório registrar"
+
+#: models/core.py:88
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Se estiver marcado, apenas usuários conectados poderão ver a página."
+
+#: models/core.py:92
+msgid "flat page"
+msgstr "página plana"
+
+#: models/core.py:93
+msgid "flat pages"
+msgstr "páginas planas"
+
+#: models/core.py:114
+msgid "session key"
+msgstr "chave da sessão"
+
+#: models/core.py:115
+msgid "session data"
+msgstr "dados da sessão"
+
+#: models/core.py:116
+msgid "expire date"
+msgstr "data de expiração"
+
+#: models/core.py:118
+msgid "session"
+msgstr "sessão"
+
+#: models/core.py:119
+msgid "sessions"
+msgstr "sessões"
+
+#: models/auth.py:8
+msgid "codename"
+msgstr "nome código"
+
+#: models/auth.py:10
+msgid "Permission"
+msgstr "Permissão"
+
+#: models/auth.py:11 models/auth.py:58
+msgid "Permissions"
+msgstr "Permissões"
+
+#: models/auth.py:22
+msgid "Group"
+msgstr "Grupo"
+
+#: models/auth.py:23 models/auth.py:60
+msgid "Groups"
+msgstr "Grupos"
+
+#: models/auth.py:33
+#, fuzzy
+msgid "username"
+msgstr "usuário"
+
+#: models/auth.py:34
+msgid "first name"
+msgstr "primeiro nome"
+
+#: models/auth.py:35
+msgid "last name"
+msgstr "último nome"
+
+#: models/auth.py:36
+#, fuzzy
+msgid "e-mail address"
+msgstr "endereço de e-mail:"
+
+#: models/auth.py:37
+#, fuzzy
+msgid "password"
+msgstr "senha"
+
+#: models/auth.py:37
+msgid "Use an MD5 hash -- not the raw password."
+msgstr "Usar um código MD5 -- não o texto da senha."
+
+#: models/auth.py:38
+msgid "staff status"
+msgstr "status da equipe"
+
+#: models/auth.py:38
+msgid "Designates whether the user can log into this admin site."
+msgstr "Informa se o usuário pode acessar este site de administração."
+
+#: models/auth.py:39
+msgid "active"
+msgstr "ativar"
+
+#: models/auth.py:40
+msgid "superuser status"
+msgstr "status de superusuário"
+
+#: models/auth.py:41
+msgid "last login"
+msgstr "último login"
+
+#: models/auth.py:42
+msgid "date joined"
+msgstr "data de registro"
+
+#: 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 ""
+"Em adição às permissões atribuídas manualmente, este usuário também terá "
+"todas as permissões dadas a cada grupo que participar."
+
+#: models/auth.py:48
+#, fuzzy
+msgid "Users"
+msgstr "Usuários"
+
+#: models/auth.py:57
+msgid "Personal info"
+msgstr "Informações pessoais"
+
+#: models/auth.py:59
+msgid "Important dates"
+msgstr "Datas importantes"
+
+#: models/auth.py:182
+msgid "Message"
+msgstr "Mensagem"
+
+#: conf/global_settings.py:37
+msgid "Czech"
+msgstr "Tcheco"
+
+#: conf/global_settings.py:38
+msgid "German"
+msgstr "Alemão"
+
+#: conf/global_settings.py:39
+msgid "English"
+msgstr "Inglês"
+
+#: conf/global_settings.py:40
+msgid "Spanish"
+msgstr "Espanhol"
+
+#: conf/global_settings.py:41
+msgid "French"
+msgstr "Francês"
+
+#: conf/global_settings.py:42
+msgid "Galician"
+msgstr "Galiciano"
+
+#: conf/global_settings.py:43
+msgid "Italian"
+msgstr "Italiano"
+
+#: conf/global_settings.py:44
+msgid "Brazilian"
+msgstr "Brazileiro"
+
+#: conf/global_settings.py:45
+msgid "Russian"
+msgstr "Russo"
+
+#: conf/global_settings.py:46
+#, fuzzy
+msgid "Serbian"
+msgstr "Sérvio"
+
+#: conf/global_settings.py:47
+msgid "Traditional Chinese"
+msgstr ""
+
+#: core/validators.py:58
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Deve conter apenas letras, números e sublinhados (_)."
+
+#: core/validators.py:62
+msgid "This value must contain only letters, numbers, underscores and slashes."
+msgstr "Deve conter apenas letras, números, sublinhados (_) e barras (/)."
+
+#: core/validators.py:70
+msgid "Uppercase letters are not allowed here."
+msgstr "Letras em maiúsculo não são permitidas aqui."
+
+#: core/validators.py:74
+msgid "Lowercase letters are not allowed here."
+msgstr "Letras em minúsculo não são permitidas aqui."
+
+#: core/validators.py:81
+msgid "Enter only digits separated by commas."
+msgstr "Informe apenas dígitos separados por vírgulas."
+
+#: core/validators.py:93
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Informe endereços de email válidos separados por vírgulas."
+
+#: core/validators.py:100
+msgid "Please enter a valid IP address."
+msgstr "Informe um endereço IP válido."
+
+#: core/validators.py:104
+msgid "Empty values are not allowed here."
+msgstr "Valores em branco não são permitidos."
+
+#: core/validators.py:108
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Caracteres não numéricos não são permitidos."
+
+#: core/validators.py:112
+msgid "This value can't be comprised solely of digits."
+msgstr "Este valor não pode conter apenas dígitos."
+
+#: core/validators.py:117
+msgid "Enter a whole number."
+msgstr "Informe um número inteiro."
+
+#: core/validators.py:121
+msgid "Only alphabetical characters are allowed here."
+msgstr "Apenas caracteres do alfabeto são permitidos aqui."
+
+#: core/validators.py:125
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Informe uma data válida no formato AAAA-MM-DD."
+
+#: core/validators.py:129
+msgid "Enter a valid time in HH:MM format."
+msgstr "Informe uma hora válida no formato HH:MM."
+
+#: core/validators.py:133
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Informe uma data/hora válida no formato AAAA-MM-DD HH:MM."
+
+#: core/validators.py:137
+msgid "Enter a valid e-mail address."
+msgstr "Informe um endereço de email válido."
+
+#: core/validators.py:149
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Envie uma imagem válida. O arquivo enviado não é uma imagem ou está "
+"corrompido."
+
+#: core/validators.py:156
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "A URL %s não aponta para um imagem válida."
+
+#: core/validators.py:160
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Números de telefone deves estar no formato XXX-XXX-XXXX.\"%s\" é inválido."
+
+#: core/validators.py:168
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "A URL %s não aponta para um vídeo QuickTime válido."
+
+#: core/validators.py:172
+msgid "A valid URL is required."
+msgstr "Uma URL válida é exigida."
+
+#: core/validators.py:186
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"HTML válido é exigido. Estes são os erros específicos:\n"
+"%s"
+
+#: core/validators.py:193
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML mal formado: %s"
+
+#: core/validators.py:203
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL inválida: %s"
+
+#: core/validators.py:205
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "A URL %s é um link quebrado."
+
+#: core/validators.py:211
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Informe uma abreviação válida de nome de um estado dos EUA."
+
+#: core/validators.py:226
+#, 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] "Lave sua boca! A palavra %s não é permitida aqui."
+msgstr[1] "Lave sua boca! As palavras %s não são permitidas aqui."
+
+#: core/validators.py:233
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Este campo deve ser igual ao campo '%s'."
+
+#: core/validators.py:252
+msgid "Please enter something for at least one field."
+msgstr "Informe algo em pelo menos um campo."
+
+#: core/validators.py:261 core/validators.py:272
+msgid "Please enter both fields or leave them both empty."
+msgstr "Informe ambos os campos ou deixe ambos vazios."
+
+#: core/validators.py:279
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Este campo deve ser informado se o campo %(field)s for %(value)s."
+
+#: core/validators.py:291
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Este campo deve ser dado se o campo %(field)s não for %(value)s."
+
+#: core/validators.py:310
+msgid "Duplicate values are not allowed."
+msgstr "Valores duplicados não são permitidos."
+
+#: core/validators.py:333
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Este valor deve ser uma potência de %s."
+
+#: core/validators.py:344
+msgid "Please enter a valid decimal number."
+msgstr "Informe um número decimal."
+
+#: core/validators.py:346
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:349
+#, 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] "Informe um número decimal com no máximo %s casa decimal."
+msgstr[1] "Informe um número decimal com no máximo %s casas decimais."
+
+#: core/validators.py:359
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Verifique se o arquivo enviado tem pelo menos %s bytes."
+
+#: core/validators.py:360
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Verifique se o arquivo enviado tem no máximo %s bytes."
+
+#: core/validators.py:373
+msgid "The format for this field is wrong."
+msgstr "O formato deste campo está errado."
+
+#: core/validators.py:388
+msgid "This field is invalid."
+msgstr "Este campo é inválido."
+
+#: core/validators.py:423
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Não foi possível receber dados de %s."
+
+#: core/validators.py:426
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"A URL %(url)s retornou um cabeçalho '%(contenttype)s' de Content-Type "
+"inválido."
+
+#: core/validators.py:459
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Por favor, feche a tag %(tag)s na linha %(line)s. (A linha começa com \"%"
+"(start)s\".)"
+
+#: core/validators.py:463
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Algum texto começando na linha %(line)s não é permitido no contexto. (Linha "
+"começa com \"%(start)s\".)"
+
+#: core/validators.py:468
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" na linha %(line)s não é um atributo válido. (Linha começa com "
+"\"%(start)s\".)"
+
+#: core/validators.py:473
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" na linha %(line)s é uma tag inválida. (Linha começa com \"%"
+"(start)s\".)"
+
+#: core/validators.py:477
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Uma tag na linha %(line)s está não apresenta um ou mais atributos exigidos."
+"(Linha começa com \"%(start)s\".)"
+
+#: core/validators.py:482
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"O atributo \"%(attr)s\" na linha %(line)s tem um valor inválido. (Linha "
+"começa com \"%(start)s\".)"
+
+#: core/meta/fields.py:95
+msgid " Separate multiple IDs with commas."
+msgstr " Separe IDs múltiplos com vírgulas."
+
+#: core/meta/fields.py:98
+msgid ""
+" Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+" Mantenha pressionado \"Control\", ou \"Command\" num Mac para selecionar "
+"mais de uma opção."
+
+#~ msgid "Click to change"
+#~ msgstr "Clique para alterar"
diff --git a/django/conf/locale/ru/LC_MESSAGES/django.mo b/django/conf/locale/ru/LC_MESSAGES/django.mo
new file mode 100644
index 0000000000..a0d8e62c44
--- /dev/null
+++ b/django/conf/locale/ru/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/ru/LC_MESSAGES/django.po b/django/conf/locale/ru/LC_MESSAGES/django.po
new file mode 100644
index 0000000000..bcecf85709
--- /dev/null
+++ b/django/conf/locale/ru/LC_MESSAGES/django.po
@@ -0,0 +1,956 @@
+# Translation of django.po to russian.
+# Copyright (C) 2005 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Dmitry Sorokin <ds@dial.com.ru>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-11-03 12:26+0100\n"
+"PO-Revision-Date: 2005-10-05 00:00\n"
+"Last-Translator: Dmitry Sorokin <ds@@dial.com.ru>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=koi8-r\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:29
+#: 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
+msgid "Home"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "/"
+
+#: contrib/admin/templates/admin/object_history.html:19 models/auth.py:47
+msgid "User"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j. N Y, H:i"
+
+#: 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 ""
+" . "
+" ."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr " Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr " Django"
+
+#: contrib/admin/templates/admin/500.html:4
+#, fuzzy
+msgid "Server error"
+msgstr " (500)"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr " (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr " <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+" . e-mail "
+" . ."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr " "
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr " , ."
+
+#: contrib/admin/templates/admin/index.html:27
+msgid "Add"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:33
+msgid "Change"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:43
+msgid "You don't have permission to edit anything."
+msgstr " ."
+
+#: contrib/admin/templates/admin/index.html:51
+msgid "Recent Actions"
+msgstr " "
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "My Actions"
+msgstr " "
+
+#: contrib/admin/templates/admin/index.html:56
+msgid "None available"
+msgstr ""
+
+#: contrib/admin/templates/admin/login.html:15
+msgid "Username:"
+msgstr ":"
+
+#: contrib/admin/templates/admin/login.html:18
+msgid "Password:"
+msgstr ":"
+
+#: contrib/admin/templates/admin/login.html:20
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr " <a href=\"/password_reset/\"> </a>?"
+
+#: contrib/admin/templates/admin/login.html:24
+msgid "Log in"
+msgstr ""
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr " ,"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Change password"
+msgstr " "
+
+#: contrib/admin/templates/admin/base.html:23
+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' "
+", "
+":"
+
+#: 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\"? "
+" :"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:18
+msgid "Yes, I'm sure"
+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 "La password stata cambiata con successo"
+
+#: 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_done.html:4
+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 ""
+" ? e-mail , "
+" e-mail ."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mail :"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr " "
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr " ."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+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 " "
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr " %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr " : %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr " :"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr " , :"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr " !"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr " di %(site_name)s"
+
+#: contrib/admin/models/admin.py:6
+#, fuzzy
+msgid "action time"
+msgstr "/"
+
+#: contrib/admin/models/admin.py:9
+msgid "object id"
+msgstr ""
+
+#: contrib/admin/models/admin.py:10
+msgid "object repr"
+msgstr ""
+
+#: contrib/admin/models/admin.py:11
+msgid "action flag"
+msgstr ""
+
+#: contrib/admin/models/admin.py:12
+msgid "change message"
+msgstr ""
+
+#: contrib/admin/models/admin.py:15
+msgid "log entry"
+msgstr ""
+
+#: contrib/admin/models/admin.py:16
+msgid "log entries"
+msgstr ""
+
+#: 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: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 ""
+
+#: models/core.py:5
+msgid "domain name"
+msgstr ""
+
+#: models/core.py:6
+msgid "display name"
+msgstr ""
+
+#: models/core.py:8
+msgid "site"
+msgstr ""
+
+#: models/core.py:9
+msgid "sites"
+msgstr ""
+
+#: models/core.py:22
+msgid "label"
+msgstr ""
+
+#: models/core.py:23 models/core.py:34 models/auth.py:6 models/auth.py:19
+#, fuzzy
+msgid "name"
+msgstr ":"
+
+#: models/core.py:25
+msgid "package"
+msgstr ""
+
+#: models/core.py:26
+msgid "packages"
+msgstr ""
+
+#: models/core.py:36
+msgid "python module name"
+msgstr ""
+
+#: models/core.py:38
+msgid "content type"
+msgstr ""
+
+#: models/core.py:39
+msgid "content types"
+msgstr ""
+
+#: models/core.py:62
+msgid "redirect from"
+msgstr ""
+
+#: models/core.py:63
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+
+#: models/core.py:64
+msgid "redirect to"
+msgstr ""
+
+#: models/core.py:65
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+
+#: models/core.py:67
+msgid "redirect"
+msgstr ""
+
+#: models/core.py:68
+msgid "redirects"
+msgstr ""
+
+#: models/core.py:81
+msgid "URL"
+msgstr ""
+
+#: models/core.py:82
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+
+#: models/core.py:83
+msgid "title"
+msgstr ""
+
+#: models/core.py:84
+msgid "content"
+msgstr ""
+
+#: models/core.py:85
+msgid "enable comments"
+msgstr ""
+
+#: models/core.py:86
+msgid "template name"
+msgstr ""
+
+#: models/core.py:87
+msgid ""
+"Example: 'flatfiles/contact_page'. If this isn't provided, the system will "
+"use 'flatfiles/default'."
+msgstr ""
+
+#: models/core.py:88
+msgid "registration required"
+msgstr ""
+
+#: models/core.py:88
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+
+#: models/core.py:92
+msgid "flat page"
+msgstr ""
+
+#: models/core.py:93
+msgid "flat pages"
+msgstr ""
+
+#: models/core.py:114
+msgid "session key"
+msgstr ""
+
+#: models/core.py:115
+msgid "session data"
+msgstr ""
+
+#: models/core.py:116
+msgid "expire date"
+msgstr ""
+
+#: models/core.py:118
+msgid "session"
+msgstr ""
+
+#: models/core.py:119
+msgid "sessions"
+msgstr ""
+
+#: models/auth.py:8
+msgid "codename"
+msgstr ""
+
+#: models/auth.py:10
+msgid "Permission"
+msgstr ""
+
+#: models/auth.py:11 models/auth.py:58
+msgid "Permissions"
+msgstr ""
+
+#: models/auth.py:22
+msgid "Group"
+msgstr ""
+
+#: models/auth.py:23 models/auth.py:60
+msgid "Groups"
+msgstr ""
+
+#: models/auth.py:33
+#, fuzzy
+msgid "username"
+msgstr ":"
+
+#: models/auth.py:34
+msgid "first name"
+msgstr ""
+
+#: models/auth.py:35
+msgid "last name"
+msgstr ""
+
+#: models/auth.py:36
+#, fuzzy
+msgid "e-mail address"
+msgstr "E-mail :"
+
+#: models/auth.py:37
+#, fuzzy
+msgid "password"
+msgstr ":"
+
+#: models/auth.py:37
+msgid "Use an MD5 hash -- not the raw password."
+msgstr ""
+
+#: models/auth.py:38
+msgid "staff status"
+msgstr ""
+
+#: models/auth.py:38
+msgid "Designates whether the user can log into this admin site."
+msgstr ""
+
+#: models/auth.py:39
+msgid "active"
+msgstr ""
+
+#: models/auth.py:40
+msgid "superuser status"
+msgstr ""
+
+#: models/auth.py:41
+msgid "last login"
+msgstr ""
+
+#: models/auth.py:42
+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 ""
+
+#: models/auth.py:48
+#, fuzzy
+msgid "Users"
+msgstr ""
+
+#: models/auth.py:57
+msgid "Personal info"
+msgstr ""
+
+#: models/auth.py:59
+msgid "Important dates"
+msgstr ""
+
+#: models/auth.py:182
+msgid "Message"
+msgstr ""
+
+#: conf/global_settings.py:37
+msgid "Czech"
+msgstr ""
+
+#: conf/global_settings.py:38
+msgid "German"
+msgstr ""
+
+#: conf/global_settings.py:39
+msgid "English"
+msgstr ""
+
+#: conf/global_settings.py:40
+msgid "Spanish"
+msgstr ""
+
+#: conf/global_settings.py:41
+msgid "French"
+msgstr ""
+
+#: conf/global_settings.py:42
+msgid "Galician"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "Italian"
+msgstr ""
+
+#: conf/global_settings.py:44
+msgid "Brazilian"
+msgstr ""
+
+#: conf/global_settings.py:45
+msgid "Russian"
+msgstr ""
+
+#: conf/global_settings.py:46
+msgid "Serbian"
+msgstr ""
+
+#: conf/global_settings.py:47
+msgid "Traditional Chinese"
+msgstr ""
+
+#: core/validators.py:58
+msgid "This value must contain only letters, numbers and underscores."
+msgstr " , ."
+
+#: core/validators.py:62
+#, fuzzy
+msgid "This value must contain only letters, numbers, underscores and slashes."
+msgstr " , ."
+
+#: core/validators.py:70
+msgid "Uppercase letters are not allowed here."
+msgstr ""
+
+#: core/validators.py:74
+msgid "Lowercase letters are not allowed here."
+msgstr ""
+
+#: core/validators.py:81
+msgid "Enter only digits separated by commas."
+msgstr ""
+
+#: core/validators.py:93
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr ""
+
+#: core/validators.py:100
+msgid "Please enter a valid IP address."
+msgstr ""
+
+#: core/validators.py:104
+msgid "Empty values are not allowed here."
+msgstr ""
+
+#: core/validators.py:108
+msgid "Non-numeric characters aren't allowed here."
+msgstr ""
+
+#: core/validators.py:112
+msgid "This value can't be comprised solely of digits."
+msgstr ""
+
+#: core/validators.py:117
+msgid "Enter a whole number."
+msgstr ""
+
+#: core/validators.py:121
+msgid "Only alphabetical characters are allowed here."
+msgstr ""
+
+#: core/validators.py:125
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr ""
+
+#: core/validators.py:129
+msgid "Enter a valid time in HH:MM format."
+msgstr ""
+
+#: core/validators.py:133
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr ""
+
+#: core/validators.py:137
+#, fuzzy
+msgid "Enter a valid e-mail address."
+msgstr "E-mail :"
+
+#: core/validators.py:149
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+
+#: core/validators.py:156
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr ""
+
+#: core/validators.py:160
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+
+#: core/validators.py:168
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr ""
+
+#: core/validators.py:172
+msgid "A valid URL is required."
+msgstr ""
+
+#: core/validators.py:186
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+
+#: core/validators.py:193
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr ""
+
+#: core/validators.py:203
+#, python-format
+msgid "Invalid URL: %s"
+msgstr ""
+
+#: core/validators.py:205
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr ""
+
+#: core/validators.py:211
+msgid "Enter a valid U.S. state abbreviation."
+msgstr ""
+
+#: core/validators.py:226
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:233
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr ""
+
+#: core/validators.py:252
+msgid "Please enter something for at least one field."
+msgstr ""
+
+#: core/validators.py:261 core/validators.py:272
+msgid "Please enter both fields or leave them both empty."
+msgstr ""
+
+#: core/validators.py:279
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr ""
+
+#: core/validators.py:291
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr ""
+
+#: core/validators.py:310
+msgid "Duplicate values are not allowed."
+msgstr ""
+
+#: core/validators.py:333
+#, python-format
+msgid "This value must be a power of %s."
+msgstr ""
+
+#: core/validators.py:344
+msgid "Please enter a valid decimal number."
+msgstr ""
+
+#: core/validators.py:346
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:359
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+
+#: core/validators.py:360
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+
+#: core/validators.py:373
+msgid "The format for this field is wrong."
+msgstr ""
+
+#: core/validators.py:388
+msgid "This field is invalid."
+msgstr ""
+
+#: core/validators.py:423
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr ""
+
+#: core/validators.py:426
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+
+#: core/validators.py:459
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:463
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:468
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:473
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:477
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:482
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/meta/fields.py:95
+msgid " Separate multiple IDs with commas."
+msgstr ""
+
+#: core/meta/fields.py:98
+msgid ""
+" Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+#~ msgid "Server error <em>(500)</em>"
+#~ msgstr " <em>(500)</em>"
+
+#~ msgid "Click to change"
+#~ msgstr " "
diff --git a/django/conf/locale/sr/LC_MESSAGES/django.mo b/django/conf/locale/sr/LC_MESSAGES/django.mo
new file mode 100644
index 0000000000..3bbc3ab768
--- /dev/null
+++ b/django/conf/locale/sr/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/sr/LC_MESSAGES/django.po b/django/conf/locale/sr/LC_MESSAGES/django.po
new file mode 100644
index 0000000000..d9f1325faa
--- /dev/null
+++ b/django/conf/locale/sr/LC_MESSAGES/django.po
@@ -0,0 +1,981 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Django Serbian (latin) translation v1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-11-03 12:26+0100\n"
+"PO-Revision-Date: 2005-11-03 00:28+0100\n"
+"Last-Translator: Petar Marić <petar.maric@gmail.com>\n"
+"Language-Team: Nesh <nesh@studioquatro.co.yu> & Petar <petar.maric@gmail."
+"com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
+"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Poedit-Language: Serbian\n"
+"X-Poedit-Country: YUGOSLAVIA\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Poedit-Basepath: ../../../../\n"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:29
+#: 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
+msgid "Home"
+msgstr "Početna strana"
+
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Istorija"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Datum/vreme"
+
+#: contrib/admin/templates/admin/object_history.html:19 models/auth.py:47
+msgid "User"
+msgstr "Korisnik"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Akcija"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j. N Y, H:i"
+
+#: 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 ""
+"Ovaj objekat nema istoriju promena. Najverovatnije nije dodat korišćenjem "
+"administracije sajta."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django administracija sajta"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django administracija"
+
+#: contrib/admin/templates/admin/500.html:4
+#, fuzzy
+msgid "Server error"
+msgstr "Greška na serveru (500)"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Greška na serveru (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Greška na serveru <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 ""
+"Dogodila se greška koja je prijavljena administratorima i biće popravljena "
+"uskoro. Hvala Vam na strpljenju."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Strana nije pronađena"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Tražena strana ne postoji."
+
+#: contrib/admin/templates/admin/index.html:27
+msgid "Add"
+msgstr "Dodaj"
+
+#: contrib/admin/templates/admin/index.html:33
+msgid "Change"
+msgstr "Izmena"
+
+#: contrib/admin/templates/admin/index.html:43
+msgid "You don't have permission to edit anything."
+msgstr "Nemate prava da vršite izmene."
+
+#: contrib/admin/templates/admin/index.html:51
+msgid "Recent Actions"
+msgstr "Skorije akcije"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "My Actions"
+msgstr "Moje akcije"
+
+#: contrib/admin/templates/admin/index.html:56
+msgid "None available"
+msgstr "Nema dostupnih"
+
+#: contrib/admin/templates/admin/login.html:15
+msgid "Username:"
+msgstr "Korisničko ime:"
+
+#: contrib/admin/templates/admin/login.html:18
+msgid "Password:"
+msgstr "Lozinka:"
+
+#: contrib/admin/templates/admin/login.html:20
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Da li ste <a href=\"/password_reset/\">zaboravili Vašu lozinku?</a>?"
+
+#: contrib/admin/templates/admin/login.html:24
+msgid "Log in"
+msgstr "Prijavi se"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Dobrodošli,"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Change password"
+msgstr "Izmeni lozinku"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Log out"
+msgstr "Odjavi 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 ""
+"Brisanjem %(object_name)s '%(object)s' došlo bi do brisanja dodatnih "
+"podataka, ali nemate prava da brišete sledeće tipove podataka:"
+
+#: 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 ""
+"Da li ste sigurni da želite da obrišete %(object_name)s \"%(object)s\"? Biće "
+"obrisani i sledeći pridruženi objekti:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:18
+msgid "Yes, I'm sure"
+msgstr "Da, siguran sam"
+
+#: 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 "Izmena lozinke"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Lozinka je uspešno izmenjena"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Vaša lozinka je izmenjena."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Resetovanje lozinke"
+
+#: 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 ""
+"Zaboravili ste svoju lozinku? Unesite vašu e-mail adresu i dobićete novu "
+"lozinku na dati e-mail."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mail adresa:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Resetuj moju lozinku"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Hvala Vam na poseti."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Prijavi se ponovo"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Vaša lozinka je uspešno resetovana"
+
+#: 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 ""
+"Nova lozinka poslata vam je na zadatu e-mail adresu. E-mail bi trebao da "
+"stigne u narednih nekoliko minuta."
+
+#: 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 ""
+"Unesite staru lozinku, nakon toga unesite novu lozinku dva puta, radi "
+"provere ispravnosti unosa."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Stara lozinka:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Nova lozinka:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Potvrdite novu lozinku:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Izmeni moju lozinku"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Primili ste ovaj e-mail jer ste tražili resetovanje lozinke"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "za vaš korisnički nalog na %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Vaša nova lozinka je: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Lozinku možete izmeniti na sledećoj strani:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Vaše korisničko ime, u slučaju da ste zaboravili:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Hvala Vam na poseti!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s tim"
+
+#: contrib/admin/models/admin.py:6
+msgid "action time"
+msgstr "Datum/vreme akcije"
+
+#: contrib/admin/models/admin.py:9
+msgid "object id"
+msgstr "id objekta"
+
+#: contrib/admin/models/admin.py:10
+msgid "object repr"
+msgstr "opis objekta"
+
+#: contrib/admin/models/admin.py:11
+msgid "action flag"
+msgstr "akcija"
+
+#: contrib/admin/models/admin.py:12
+msgid "change message"
+msgstr "opis promene"
+
+#: contrib/admin/models/admin.py:15
+msgid "log entry"
+msgstr "unos u dnevnik izmena"
+
+#: contrib/admin/models/admin.py:16
+msgid "log entries"
+msgstr "unosi u dnevnik izmena"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Ponedeljak"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Utorak"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Sreda"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Četvrtak"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Petak"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Subota"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Nedelja"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Januar"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Februar"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Mart"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "April"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Maj"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Jun"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Jul"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Avgust"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Septembar"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Oktobar"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Novembar"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Decembar"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Avg."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Sept."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Okt."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dec."
+
+#: models/core.py:5
+msgid "domain name"
+msgstr "ime domena"
+
+#: models/core.py:6
+msgid "display name"
+msgstr "naziv"
+
+#: models/core.py:8
+msgid "site"
+msgstr "sajt"
+
+#: models/core.py:9
+msgid "sites"
+msgstr "sajtovi"
+
+#: models/core.py:22
+msgid "label"
+msgstr ""
+
+#: models/core.py:23 models/core.py:34 models/auth.py:6 models/auth.py:19
+msgid "name"
+msgstr "ime"
+
+#: models/core.py:25
+msgid "package"
+msgstr ""
+
+#: models/core.py:26
+msgid "packages"
+msgstr ""
+
+#: models/core.py:36
+msgid "python module name"
+msgstr "ime python modula"
+
+#: models/core.py:38
+msgid "content type"
+msgstr "tip sadržaja"
+
+#: models/core.py:39
+msgid "content types"
+msgstr "tipovi sadržaja"
+
+#: models/core.py:62
+msgid "redirect from"
+msgstr "redirekcija od"
+
+#: models/core.py:63
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Ovde treba upisati apsolutnu putanju bez imena domena. Primer: '/events/"
+"search/'."
+
+#: models/core.py:64
+msgid "redirect to"
+msgstr "redirekcija na"
+
+#: models/core.py:65
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Ovo može biti apsolutna putanja (kao gore) ili puni URL koji počinje sa "
+"'http://'."
+
+#: models/core.py:67
+msgid "redirect"
+msgstr "redirekcija"
+
+#: models/core.py:68
+msgid "redirects"
+msgstr "redirekcije"
+
+# nesh: ovo se valjda ne prevodi
+# petar: ne prevodi se
+#: models/core.py:81
+msgid "URL"
+msgstr ""
+
+#: models/core.py:82
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Primer: '/about/contact/'. Proverite da li ste uneli početnu i kranju kosu "
+"crtu."
+
+#: models/core.py:83
+msgid "title"
+msgstr "naslov"
+
+#: models/core.py:84
+msgid "content"
+msgstr "sadržaj"
+
+#: models/core.py:85
+msgid "enable comments"
+msgstr "omogućite komentare"
+
+#: models/core.py:86
+msgid "template name"
+msgstr "ime templejta"
+
+#: models/core.py:87
+msgid ""
+"Example: 'flatfiles/contact_page'. If this isn't provided, the system will "
+"use 'flatfiles/default'."
+msgstr ""
+"Primer: 'flatfiles/contact-page'. Ako nije dato sistem će koristiti "
+"'flatfiles/default'."
+
+#: models/core.py:88
+msgid "registration required"
+msgstr "samo za registrovane korisnike"
+
+#: models/core.py:88
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Ako izaberete ovu opciju samo prijavljeni korisnici će imati pristup datoj "
+"strani."
+
+#: models/core.py:92
+msgid "flat page"
+msgstr "statična strana"
+
+#: models/core.py:93
+msgid "flat pages"
+msgstr "statične strane"
+
+#: models/core.py:114
+msgid "session key"
+msgstr "ključ sesije"
+
+#: models/core.py:115
+msgid "session data"
+msgstr "podaci sesije"
+
+#: models/core.py:116
+msgid "expire date"
+msgstr "datum prestanka važenja sesije"
+
+#: models/core.py:118
+msgid "session"
+msgstr "sesija"
+
+#: models/core.py:119
+msgid "sessions"
+msgstr "sesije"
+
+#: models/auth.py:8
+msgid "codename"
+msgstr ""
+
+#: models/auth.py:10
+msgid "Permission"
+msgstr "Pravo"
+
+#: models/auth.py:11 models/auth.py:58
+msgid "Permissions"
+msgstr "Prava"
+
+#: models/auth.py:22
+msgid "Group"
+msgstr "Grupa"
+
+#: models/auth.py:23 models/auth.py:60
+msgid "Groups"
+msgstr "Grupe"
+
+#: models/auth.py:33
+msgid "username"
+msgstr "korisničko ime"
+
+#: models/auth.py:34
+msgid "first name"
+msgstr "ime"
+
+#: models/auth.py:35
+msgid "last name"
+msgstr "prezime"
+
+#: models/auth.py:36
+msgid "e-mail address"
+msgstr "e-mail adresa"
+
+#: models/auth.py:37
+msgid "password"
+msgstr "lozinka"
+
+#: models/auth.py:37
+msgid "Use an MD5 hash -- not the raw password."
+msgstr "Unesite MD5 hash šifre -- ne unosite sam tekst šifre."
+
+#: models/auth.py:38
+msgid "staff status"
+msgstr "dozvoli pristup administraciji sajta"
+
+#: models/auth.py:38
+msgid "Designates whether the user can log into this admin site."
+msgstr "Određuje da li će korisnik imati pristup administratorskom delu sajta."
+
+#: models/auth.py:39
+msgid "active"
+msgstr "aktivan"
+
+#: models/auth.py:40
+msgid "superuser status"
+msgstr "da li je korisnik administrator"
+
+#: models/auth.py:41
+msgid "last login"
+msgstr "vreme poslednje posete"
+
+#: models/auth.py:42
+msgid "date joined"
+msgstr "datum otvaranja naloga"
+
+#: 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 ""
+"Uz ručno dodata prava, korisnik će dobiti sva prava iz grupa kojima pripada."
+
+#: models/auth.py:48
+msgid "Users"
+msgstr "Korisnici"
+
+#: models/auth.py:57
+msgid "Personal info"
+msgstr "Lične informacije"
+
+#: models/auth.py:59
+msgid "Important dates"
+msgstr "Važni datumi"
+
+#: models/auth.py:182
+msgid "Message"
+msgstr "Poruka"
+
+#: conf/global_settings.py:37
+msgid "Czech"
+msgstr "Češki"
+
+#: conf/global_settings.py:38
+msgid "German"
+msgstr "Nemački"
+
+#: conf/global_settings.py:39
+msgid "English"
+msgstr "Engleski"
+
+#: conf/global_settings.py:40
+msgid "Spanish"
+msgstr "Španski"
+
+#: conf/global_settings.py:41
+msgid "French"
+msgstr "Francuski"
+
+#: conf/global_settings.py:42
+msgid "Galician"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "Italian"
+msgstr "Italijanski"
+
+#: conf/global_settings.py:44
+msgid "Brazilian"
+msgstr "Brazilski"
+
+#: conf/global_settings.py:45
+msgid "Russian"
+msgstr "Ruski"
+
+#: conf/global_settings.py:46
+msgid "Serbian"
+msgstr "Srpski"
+
+#: conf/global_settings.py:47
+msgid "Traditional Chinese"
+msgstr ""
+
+# nesh: Ovo je opis za stari SlugField
+#: core/validators.py:58
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Ovo polje može sadržati samo slova, brojeve i donju crtu (_)."
+
+#: core/validators.py:62
+msgid "This value must contain only letters, numbers, underscores and slashes."
+msgstr ""
+"Ovo polje može sadržati samo slova, brojeve, donju crtu (_) i kose crte."
+
+#: core/validators.py:70
+msgid "Uppercase letters are not allowed here."
+msgstr "Velika slova ovde nisu dozvoljena."
+
+#: core/validators.py:74
+msgid "Lowercase letters are not allowed here."
+msgstr "Mala slova ovde nisu dozvoljena."
+
+#: core/validators.py:81
+msgid "Enter only digits separated by commas."
+msgstr "Unesite samo brojeve razdvojene zarezima."
+
+#: core/validators.py:93
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Unesite ispravne e-mail adrese razdvojene zarezima."
+
+#: core/validators.py:100
+msgid "Please enter a valid IP address."
+msgstr "Unesite ispravnu IP adresu."
+
+#: core/validators.py:104
+msgid "Empty values are not allowed here."
+msgstr "Prazne vrednosti ovde nisu dozvoljene."
+
+#: core/validators.py:108
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Ovde možete uneti samo brojeve."
+
+#: core/validators.py:112
+msgid "This value can't be comprised solely of digits."
+msgstr "Podatak se ne može sastojati samo od brojeva."
+
+#: core/validators.py:117
+msgid "Enter a whole number."
+msgstr "Unesite celi broj."
+
+#: core/validators.py:121
+msgid "Only alphabetical characters are allowed here."
+msgstr "Ovde možete koristiti samo slova."
+
+#: core/validators.py:125
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Unesite ispravan datum u YYYY-MM-DD formatu."
+
+#: core/validators.py:129
+msgid "Enter a valid time in HH:MM format."
+msgstr "Unesite ispravno vreme u HH:MM formatu."
+
+#: core/validators.py:133
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Unesite ispravan datum i vreme u YYYY-MM-DD HH:MM formatu."
+
+#: core/validators.py:137
+msgid "Enter a valid e-mail address."
+msgstr "Unesite ispravnu e-mail adresu."
+
+#: core/validators.py:149
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Pošaljite ispravnu sliku. Fajl koji ste poslali ili nije slika ili je sam "
+"fajl oštećen."
+
+#: core/validators.py:156
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s ne pokazuje na ispravnu sliku"
+
+# nesh: tel. brojevi su u američkom formatu, ovo se ionako neće koristiti u i18n delu
+#: core/validators.py:160
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+
+#: core/validators.py:168
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s ne pokazuje na ispravni QuickTime video fajl."
+
+#: core/validators.py:172
+msgid "A valid URL is required."
+msgstr "Unesite ispravan URL."
+
+#: core/validators.py:186
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Unesite ispravan HTML. Greške su:\n"
+"%s"
+
+#: core/validators.py:193
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Neispravan XML: %s"
+
+#: core/validators.py:203
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Neispravan URL: %s"
+
+#: core/validators.py:205
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL %s je neispravan link."
+
+# nesh: Ni ovo nije interesantno za i18n
+#: core/validators.py:211
+msgid "Enter a valid U.S. state abbreviation."
+msgstr ""
+
+#: core/validators.py:226
+#, 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] "Pripazi na jezik! %s reč nije ovde dozvoljena."
+msgstr[1] "Pripazi na jezik! %s reči nisu ovde dozvoljene."
+msgstr[2] "Pripazi na jezik! %s reči nisu ovde dozvoljene."
+
+#: core/validators.py:233
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Ovo polje mora biti jednako sa poljem '%s'."
+
+#: core/validators.py:252
+msgid "Please enter something for at least one field."
+msgstr "Morate popuniti barem jedno polje."
+
+#: core/validators.py:261 core/validators.py:272
+msgid "Please enter both fields or leave them both empty."
+msgstr "Popunite oba polja ili oba ostavite prazna."
+
+#: core/validators.py:279
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Ovo polje mora biti uneto ako polje %(field)s ima vrednost %(value)s"
+
+#: core/validators.py:291
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Ovo polje mora biti uneto ako polje %(field)s nema vrednost %(value)s"
+
+#: core/validators.py:310
+msgid "Duplicate values are not allowed."
+msgstr "Duple vrednosti nisu dozvoljene."
+
+#: core/validators.py:333
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Vrednost mora biti stepena %s."
+
+#: core/validators.py:344
+msgid "Please enter a valid decimal number."
+msgstr "Unesite ispravan decimalni broj."
+
+#: core/validators.py:346
+#, 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] "Unesite ispravan decimalni broj sa %s cifrom."
+msgstr[1] "Unesite ispravan decimalni broj sa %s cifre."
+msgstr[2] "Unesite ispravan decimalni broj sa %s cifara."
+
+#: core/validators.py:349
+#, 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] "Unesite decimalni broj sa najviše %s decimalnim mestom."
+msgstr[1] "Unesite decimalni broj sa najviše %s decimalna mesta."
+msgstr[2] "Unesite decimalni broj sa najviše %s decimalnih mesta."
+
+#: core/validators.py:359
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Veličina fajla mora biti najmanje %s bajtova."
+
+#: core/validators.py:360
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Veličina fajla mora biti najviše %s bajtova."
+
+#: core/validators.py:373
+msgid "The format for this field is wrong."
+msgstr "Pogrešan format polja."
+
+#: core/validators.py:388
+msgid "This field is invalid."
+msgstr "Neispravno polje."
+
+#: core/validators.py:423
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Ništa nije moglo da se skine sa URL-a %s."
+
+#: core/validators.py:426
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"Sa URL-a %(url)s se vratio pogrešan Content-Type header '%(contenttype)s'."
+
+#: core/validators.py:459
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Zatvorite nezatvoren tag \"%(tag)s\" iz reda %(line)s. (Red počinje sa \"%"
+"(start)s\".)"
+
+#: core/validators.py:463
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Tekst koji počinje u redu %(line)s nije dozvoljen u ovom kontekstu. (Red "
+"počinje sa \"%(start)s\".)"
+
+#: core/validators.py:468
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"Atribut \"%(attr)s\" u red %(line)s je neispravan. (Red počinje sa \"%(start)"
+"s\".)"
+
+#: core/validators.py:473
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"Tag \"<%(tag)s>\" u redu %(line)s je neispravan. (Red počinje \"%(start)s\".)"
+
+#: core/validators.py:477
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Tag-u u redu %(line)s nedostaje jedan ili više atributa. (Red počinje sa \"%"
+"(start)s\".)"
+
+#: core/validators.py:482
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Atribut \"%(attr)s\" u redu %(line)s ima neispravnu vrednost. (Red počinje "
+"sa \"%(start)s\".)"
+
+#: core/meta/fields.py:95
+msgid " Separate multiple IDs with commas."
+msgstr " Odvojite višestruke ID-ove zarezima."
+
+#: core/meta/fields.py:98
+msgid ""
+" Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+" Koristite \"Ctrl\" (PC) ili \"Jabuku\" (Mek) da bi ste selektovali više "
+"stavki."
diff --git a/django/conf/locale/zh_CN/LC_MESSAGES/django.mo b/django/conf/locale/zh_CN/LC_MESSAGES/django.mo
new file mode 100644
index 0000000000..1c941ad0f5
--- /dev/null
+++ 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
new file mode 100644
index 0000000000..575bd0f2fd
--- /dev/null
+++ b/django/conf/locale/zh_CN/LC_MESSAGES/django.po
@@ -0,0 +1,951 @@
+# SOME DESCRIPTIVE TITLE.
+# 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 v1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-11-03 12:26+0100\n"
+"PO-Revision-Date: 2005-10-30 15:46+0800\n"
+"Last-Translator: limodou <limodou@gmail.com>\n"
+"Language-Team: Simplified Chinese <limodou@gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Chinese\n"
+"X-Poedit-Country: CHINA\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:29
+#: 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
+msgid "Home"
+msgstr "首页"
+
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "历史"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "日期/时间"
+
+#: contrib/admin/templates/admin/object_history.html:19 models/auth.py:47
+msgid "User"
+msgstr "用户"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "动作"
+
+#: contrib/admin/templates/admin/object_history.html:26
+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."
+msgstr "此对象没有修改历史。可能不能通过这个管理站点来增加。"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django管理站点"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django管理员"
+
+#: contrib/admin/templates/admin/500.html:4
+#, fuzzy
+msgid "Server error"
+msgstr "服务器错误(500)"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "服务器错误(500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "服务器错误 <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"存在一个错误。它已经通过电子邮件被报告给站点管理员了,并且应该很快被改正。谢"
+"谢你的关心。"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "页面没有找到"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "很报歉,请求页面无法找到。"
+
+#: contrib/admin/templates/admin/index.html:27
+msgid "Add"
+msgstr "增加"
+
+#: contrib/admin/templates/admin/index.html:33
+msgid "Change"
+msgstr "修改"
+
+#: contrib/admin/templates/admin/index.html:43
+msgid "You don't have permission to edit anything."
+msgstr "你无权修改任何东西。"
+
+#: contrib/admin/templates/admin/index.html:51
+msgid "Recent Actions"
+msgstr "最近动作"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "My Actions"
+msgstr "我的动作"
+
+#: contrib/admin/templates/admin/index.html:56
+msgid "None available"
+msgstr "无可用的"
+
+#: contrib/admin/templates/admin/login.html:15
+msgid "Username:"
+msgstr "用户名:"
+
+#: contrib/admin/templates/admin/login.html:18
+msgid "Password:"
+msgstr "口令:"
+
+#: contrib/admin/templates/admin/login.html:20
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "<a href=\"/password_reset/\">忘记你的密码</a>?"
+
+#: contrib/admin/templates/admin/login.html:24
+msgid "Log in"
+msgstr "登录"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "欢迎,"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Change password"
+msgstr "修改口令"
+
+#: contrib/admin/templates/admin/base.html:23
+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' 会导致删除相关的对象,但你的帐号无权删除下"
+"列类型的对象:"
+
+#: 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\"?所有相关的项目都将被删除:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:18
+msgid "Yes, I'm sure"
+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_done.html:4
+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 ""
+"忘记你的口令?在下面输入你的邮箱地址,我们将重设你的口令并且将新的口令通过邮"
+"件发送给你。"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "邮箱地址:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "重设我的口令"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "感谢今天在本网站花费了您的一些宝贵时间。"
+
+#: contrib/admin/templates/registration/logged_out.html:10
+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 "你所收到的这封邮件是由于你请求了口令重设"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "在 %(site_name)s 你的用户帐号"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "你的新口令是: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "到这个页面可以自由地修改口令:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "你的用户名,一旦你忘记了:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "感谢使用我们的站点!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s 小组"
+
+#: contrib/admin/models/admin.py:6
+msgid "action time"
+msgstr "动作时间"
+
+#: contrib/admin/models/admin.py:9
+msgid "object id"
+msgstr "对象id"
+
+#: contrib/admin/models/admin.py:10
+msgid "object repr"
+msgstr "对象表示"
+
+#: contrib/admin/models/admin.py:11
+msgid "action flag"
+msgstr "动作标志"
+
+#: contrib/admin/models/admin.py:12
+msgid "change message"
+msgstr "修改消息"
+
+#: contrib/admin/models/admin.py:15
+msgid "log entry"
+msgstr "日志记录"
+
+#: contrib/admin/models/admin.py:16
+msgid "log entries"
+msgstr "日志记录"
+
+#: 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: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 "十二月"
+
+#: models/core.py:5
+msgid "domain name"
+msgstr "域名"
+
+#: models/core.py:6
+msgid "display name"
+msgstr "显示名"
+
+#: models/core.py:8
+msgid "site"
+msgstr "站点"
+
+#: models/core.py:9
+msgid "sites"
+msgstr "站点"
+
+#: models/core.py:22
+msgid "label"
+msgstr "标签"
+
+#: models/core.py:23 models/core.py:34 models/auth.py:6 models/auth.py:19
+msgid "name"
+msgstr "名称"
+
+#: models/core.py:25
+msgid "package"
+msgstr "包"
+
+#: models/core.py:26
+msgid "packages"
+msgstr "包"
+
+#: models/core.py:36
+msgid "python module name"
+msgstr "python模块名"
+
+#: models/core.py:38
+msgid "content type"
+msgstr "内容类型"
+
+#: models/core.py:39
+msgid "content types"
+msgstr "内容类型"
+
+#: models/core.py:62
+msgid "redirect from"
+msgstr "重定向自"
+
+#: models/core.py:63
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr "应该是一个绝对路径,不包括域名。例如:'/events/search/'。"
+
+#: models/core.py:64
+msgid "redirect to"
+msgstr "重定向到"
+
+#: models/core.py:65
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr "可以是绝对路径(同上)或以'http://'开始的全URL。"
+
+#: models/core.py:67
+msgid "redirect"
+msgstr "重定向"
+
+#: models/core.py:68
+msgid "redirects"
+msgstr "重定向"
+
+#: models/core.py:81
+msgid "URL"
+msgstr ""
+
+#: models/core.py:82
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "例如:'/about/contact/'。请确保前导和结尾的除号。"
+
+#: models/core.py:83
+msgid "title"
+msgstr "标题"
+
+#: models/core.py:84
+msgid "content"
+msgstr "内容"
+
+#: models/core.py:85
+msgid "enable comments"
+msgstr "允许评论"
+
+#: models/core.py:86
+msgid "template name"
+msgstr "模板名称"
+
+#: models/core.py:87
+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:88
+msgid "registration required"
+msgstr "请先注册"
+
+#: models/core.py:88
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "如果被选中,仅登录用户才可以查看此页。"
+
+#: models/core.py:92
+msgid "flat page"
+msgstr "简单页面"
+
+#: models/core.py:93
+msgid "flat pages"
+msgstr "简单页面"
+
+#: models/core.py:114
+msgid "session key"
+msgstr "session键字"
+
+#: models/core.py:115
+msgid "session data"
+msgstr "session数据"
+
+#: models/core.py:116
+msgid "expire date"
+msgstr "过期日期"
+
+#: models/core.py:118
+msgid "session"
+msgstr ""
+
+#: models/core.py:119
+msgid "sessions"
+msgstr ""
+
+#: models/auth.py:8
+msgid "codename"
+msgstr "代码名称"
+
+#: models/auth.py:10
+msgid "Permission"
+msgstr "许可"
+
+#: models/auth.py:11 models/auth.py:58
+msgid "Permissions"
+msgstr "许可"
+
+#: models/auth.py:22
+msgid "Group"
+msgstr "组"
+
+#: models/auth.py:23 models/auth.py:60
+msgid "Groups"
+msgstr "组"
+
+#: models/auth.py:33
+msgid "username"
+msgstr "用户名"
+
+#: models/auth.py:34
+msgid "first name"
+msgstr "名字"
+
+#: models/auth.py:35
+msgid "last name"
+msgstr "姓"
+
+#: models/auth.py:36
+msgid "e-mail address"
+msgstr "邮件地址"
+
+#: models/auth.py:37
+msgid "password"
+msgstr "口令"
+
+#: models/auth.py:37
+msgid "Use an MD5 hash -- not the raw password."
+msgstr "使用MD5的哈希值 -- 不是原始的口令。"
+
+#: models/auth.py:38
+msgid "staff status"
+msgstr "人员状态"
+
+#: models/auth.py:38
+msgid "Designates whether the user can log into this admin site."
+msgstr "指定是否用户可以登录到这个管理站点。"
+
+#: models/auth.py:39
+msgid "active"
+msgstr "活动"
+
+#: models/auth.py:40
+msgid "superuser status"
+msgstr "超级用户状态"
+
+#: models/auth.py:41
+msgid "last login"
+msgstr "上次登录"
+
+#: models/auth.py:42
+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 ""
+"除了手动设置权限以外,用户也会从他(她)所在的小组获得所赋组小组的所有权限。"
+
+#: models/auth.py:48
+msgid "Users"
+msgstr "用户"
+
+#: models/auth.py:57
+msgid "Personal info"
+msgstr "个人信息"
+
+#: models/auth.py:59
+msgid "Important dates"
+msgstr "重要日期"
+
+#: models/auth.py:182
+msgid "Message"
+msgstr "消息"
+
+#: conf/global_settings.py:37
+msgid "Czech"
+msgstr "捷克语"
+
+#: conf/global_settings.py:38
+msgid "German"
+msgstr "德语"
+
+#: conf/global_settings.py:39
+msgid "English"
+msgstr "英语"
+
+#: conf/global_settings.py:40
+msgid "Spanish"
+msgstr "西斑牙语"
+
+#: conf/global_settings.py:41
+msgid "French"
+msgstr "法语"
+
+#: conf/global_settings.py:42
+msgid "Galician"
+msgstr "加利西亚语"
+
+#: conf/global_settings.py:43
+msgid "Italian"
+msgstr "意大利语"
+
+#: conf/global_settings.py:44
+msgid "Brazilian"
+msgstr "巴西语"
+
+#: conf/global_settings.py:45
+msgid "Russian"
+msgstr "俄语"
+
+#: conf/global_settings.py:46
+#, fuzzy
+msgid "Serbian"
+msgstr "塞尔维亚语"
+
+#: conf/global_settings.py:47
+msgid "Traditional Chinese"
+msgstr ""
+
+#: core/validators.py:58
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "此值只能包含字母、数字和下划线。"
+
+#: core/validators.py:62
+msgid "This value must contain only letters, numbers, underscores and slashes."
+msgstr "此值只能包含字母、数字、下划线和斜线。"
+
+#: core/validators.py:70
+msgid "Uppercase letters are not allowed here."
+msgstr "这里不允许大写字母。"
+
+#: core/validators.py:74
+msgid "Lowercase letters are not allowed here."
+msgstr "这里不允许小写字母。"
+
+#: core/validators.py:81
+msgid "Enter only digits separated by commas."
+msgstr "只能输入用逗号分隔的数字。"
+
+#: core/validators.py:93
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "输入用逗号分隔的有效邮件地址。"
+
+#: core/validators.py:100
+msgid "Please enter a valid IP address."
+msgstr "请输入一个有效的IP地址。"
+
+#: core/validators.py:104
+msgid "Empty values are not allowed here."
+msgstr "这里不允许输入空值。"
+
+#: core/validators.py:108
+msgid "Non-numeric characters aren't allowed here."
+msgstr "这里不允许非数字字符。"
+
+#: core/validators.py:112
+msgid "This value can't be comprised solely of digits."
+msgstr "此值不能全部由数字组成。"
+
+#: core/validators.py:117
+msgid "Enter a whole number."
+msgstr "输入整数。"
+
+#: core/validators.py:121
+msgid "Only alphabetical characters are allowed here."
+msgstr "这里只允许字母。"
+
+#: core/validators.py:125
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "输入一个 YYYY-MM-DD 格式的有效日期。"
+
+#: core/validators.py:129
+msgid "Enter a valid time in HH:MM format."
+msgstr "输入一个 HH:MM 格式的有效时间。"
+
+#: core/validators.py:133
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "输入一个 YYYY-MM-DD HH:MM 格式的有效日期/时间。"
+
+#: core/validators.py:137
+msgid "Enter a valid e-mail address."
+msgstr "输入一个有效的邮件地址。"
+
+#: core/validators.py:149
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr "上传一个有效的图片。您所上传的文件或者不是图片或是一个破坏的图片。"
+
+#: core/validators.py:156
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s 指向的不是一个有效的图片。"
+
+#: core/validators.py:160
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "电话号码必须为 XXX-XXX-XXXX 格式。\"%s\"是无效的。"
+
+#: core/validators.py:168
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s 指向的不是一个有效的 QuickTime 视频。"
+
+#: core/validators.py:172
+msgid "A valid URL is required."
+msgstr "需要是一个有效的URL。"
+
+#: core/validators.py:186
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"需要有效的HTML。详细的错误是:\n"
+"%s"
+
+#: core/validators.py:193
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "格式错误的 XML: %s"
+
+#: core/validators.py:203
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "无效 URL: %s"
+
+#: core/validators.py:205
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL %s 是一个断开的链接。"
+
+#: core/validators.py:211
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "输入一个有效的 U.S. 州缩写。"
+
+#: core/validators.py:226
+#, fuzzy, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "小心你的嘴!%s 不允许在这里出现。"
+msgstr[1] "小心你的嘴!%s 不允许在这里出现。"
+
+#: core/validators.py:233
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "这个字段必须与 '%s' 字段相匹配。"
+
+#: core/validators.py:252
+msgid "Please enter something for at least one field."
+msgstr "请至少在一个字段上输入些什么。"
+
+#: core/validators.py:261 core/validators.py:272
+msgid "Please enter both fields or leave them both empty."
+msgstr "请要么两个字段都输入或者两个字段都空着。"
+
+#: core/validators.py:279
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "如果 %(field)s 是 %(value)s 时这个字段必须给出"
+
+#: core/validators.py:291
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "如果 %(field)s 不是 %(value)s 时这个字段必须给出"
+
+#: core/validators.py:310
+msgid "Duplicate values are not allowed."
+msgstr "重复值不允许。"
+
+#: core/validators.py:333
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "这个值必须是 %s 的乘方。"
+
+#: core/validators.py:344
+msgid "Please enter a valid decimal number."
+msgstr "请输入一个有效的小数。"
+
+#: core/validators.py:346
+#, fuzzy, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "请输入一个有效的小数,最多 %s 个数字。"
+msgstr[1] "请输入一个有效的小数,最多 %s 个数字。"
+
+#: core/validators.py:349
+#, fuzzy, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "请输入一个有效的小数,最多 %s 个小数位。"
+msgstr[1] "请输入一个有效的小数,最多 %s 个小数位。"
+
+#: core/validators.py:359
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "请确保你上传的文件至少 %s 字节大。"
+
+#: core/validators.py:360
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "请确保你上传的文件至多 %s 字节大。"
+
+#: core/validators.py:373
+msgid "The format for this field is wrong."
+msgstr "这个字段的格式不正确。"
+
+#: core/validators.py:388
+msgid "This field is invalid."
+msgstr "这个字段无效。"
+
+#: core/validators.py:423
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "不能从 %s 得到任何东西。"
+
+#: core/validators.py:426
+#, 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:459
+#, 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:463
+#, 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:468
+#, 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:473
+#, 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:477
+#, 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:482
+#, 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\"。)"
+
+#: core/meta/fields.py:95
+msgid " Separate multiple IDs with commas."
+msgstr " 用逗号分隔多个ID。"
+
+#: core/meta/fields.py:98
+msgid ""
+" Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr " 按下 \"Control\",或者在Mac上按 \"Command\" 来选择一个或多个值。"
diff --git a/django/conf/settings.py b/django/conf/settings.py
index 29b8f043aa..2001a06ffd 100644
--- a/django/conf/settings.py
+++ b/django/conf/settings.py
@@ -55,3 +55,10 @@ for k in dir(me):
if not k.startswith('_') and k != 'me' and k != k.upper():
delattr(me, k)
del me, k
+
+# as the last step, install the translation machinery and
+# remove the module again to not clutter the namespace.
+from django.utils import translation
+translation.install()
+del translation
+
diff --git a/django/conf/urls/i18n.py b/django/conf/urls/i18n.py
new file mode 100644
index 0000000000..00e2d6017b
--- /dev/null
+++ b/django/conf/urls/i18n.py
@@ -0,0 +1,5 @@
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('',
+ (r'^setlang/$', 'django.views.i18n.set_language'),
+)
diff --git a/django/contrib/admin/models/admin.py b/django/contrib/admin/models/admin.py
index 473642e24c..b7f9bd03fc 100644
--- a/django/contrib/admin/models/admin.py
+++ b/django/contrib/admin/models/admin.py
@@ -1,17 +1,19 @@
from django.core import meta
from django.models import auth, core
+from django.utils.translation import gettext_lazy as _
class LogEntry(meta.Model):
- action_time = meta.DateTimeField(auto_now=True)
+ action_time = meta.DateTimeField(_('action time'), auto_now=True)
user = meta.ForeignKey(auth.User)
content_type = meta.ForeignKey(core.ContentType, blank=True, null=True)
- object_id = meta.TextField(blank=True, null=True)
- object_repr = meta.CharField(maxlength=200)
- action_flag = meta.PositiveSmallIntegerField()
- change_message = meta.TextField(blank=True)
+ object_id = meta.TextField(_('object id'), blank=True, null=True)
+ object_repr = meta.CharField(_('object repr'), maxlength=200)
+ action_flag = meta.PositiveSmallIntegerField(_('action flag'))
+ change_message = meta.TextField(_('change message'), blank=True)
class META:
module_name = 'log'
- verbose_name_plural = 'log entries'
+ verbose_name = _('log entry')
+ verbose_name_plural = _('log entries')
db_table = 'django_admin_log'
ordering = ('-action_time',)
module_constants = {
diff --git a/django/contrib/admin/templates/admin/404.html b/django/contrib/admin/templates/admin/404.html
index 9d7876ecbf..d791f565ba 100644
--- a/django/contrib/admin/templates/admin/404.html
+++ b/django/contrib/admin/templates/admin/404.html
@@ -1,11 +1,12 @@
{% extends "admin/base_site" %}
+{% load i18n %}
-{% block title %}Page not found{% endblock %}
+{% block title %}{% trans 'Page not found' %}{% endblock %}
{% block content %}
-<h2>Page not found</h2>
+<h2>{% trans 'Page not found' %}</h2>
-<p>We're sorry, but the requested page could not be found.</p>
+<p>{% trans "We're sorry, but the requested page could not be found." %}</p>
{% endblock %}
diff --git a/django/contrib/admin/templates/admin/500.html b/django/contrib/admin/templates/admin/500.html
index 34a28ff0f5..9d3e3de32c 100644
--- a/django/contrib/admin/templates/admin/500.html
+++ b/django/contrib/admin/templates/admin/500.html
@@ -1,11 +1,12 @@
{% extends "admin/base_site" %}
+{% load i18n %}
-{% block breadcrumbs %}<div class="breadcrumbs"><a href="/">Home</a> &rsaquo; Server error</div>{% endblock %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="/">{% trans "Home" %}</a> &rsaquo; {% trans "Server error" %}</div>{% endblock %}
-{% block title %}Server error (500){% endblock %}
+{% block title %}{% trans 'Server error (500)' %}{% endblock %}
{% block content %}
-<h1>Server Error <em>(500)</em></h1>
-<p>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.</p>
+<h1>{% trans 'Server Error <em>(500)</em>' %}</h1>
+<p>{% trans "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." %}</p>
{% endblock %}
diff --git a/django/contrib/admin/templates/admin/base.html b/django/contrib/admin/templates/admin/base.html
index 64c80b934c..0c0ae4aabd 100644
--- a/django/contrib/admin/templates/admin/base.html
+++ b/django/contrib/admin/templates/admin/base.html
@@ -1,11 +1,12 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="{{ LANGUAGE_CODE }}" xml:lang="{{ LANGUAGE_CODE }}">
<head>
<title>{% block title %}{% endblock %}</title>
<link rel="stylesheet" type="text/css" href="{% block stylesheet %}{% load adminmedia %}{% admin_media_prefix %}css/base.css{% endblock %}" />
{% block extrastyle %}{% endblock %}
{% block extrahead %}{% endblock %}
</head>
+{% load i18n %}
<body class="{% if is_popup %}popup {% endif %}{% block bodyclass %}{% endblock %}">
@@ -19,13 +20,13 @@
{% block branding %}{% endblock %}
</div>
{% if not user.is_anonymous %}
- <div id="user-tools">Welcome, <strong>{% if user.first_name %}{{ user.first_name }}{% else %}{{ user.username }}{% endif %}</strong>. <br />{% block userlinks %}<a href="/admin/password_change/">Change password</a> / <a href="/admin/logout/">Log out</a>{% endblock %}</div>
+ <div id="user-tools">{% trans 'Welcome,' %} <strong>{% if user.first_name %}{{ user.first_name }}{% else %}{{ user.username }}{% endif %}</strong>. <br />{% block userlinks %}<a href="/admin/password_change/">{% trans 'Change password' %}</a> / <a href="/admin/logout/">{% trans 'Log out' %}</a>{% endblock %}</div>
{% endif %}
{% block nav-global %}{% endblock %}
<br class="clear" />
</div>
<!-- END Header -->
- {% block breadcrumbs %}<div class="breadcrumbs"><a href="/">Home</a>{% if title %} &rsaquo; {{ title }}{% endif %}</div>{% endblock %}
+ {% block breadcrumbs %}<div class="breadcrumbs"><a href="/">{% trans 'Home' %}</a>{% if title %} &rsaquo; {{ title }}{% endif %}</div>{% endblock %}
{% endif %}
{% if messages %}
diff --git a/django/contrib/admin/templates/admin/base_site.html b/django/contrib/admin/templates/admin/base_site.html
index 7113c06d6c..cb2ea43254 100644
--- a/django/contrib/admin/templates/admin/base_site.html
+++ b/django/contrib/admin/templates/admin/base_site.html
@@ -1,9 +1,10 @@
{% extends "admin/base" %}
+{% load i18n %}
-{% block title %}{{ title }} | Django site admin{% endblock %}
+{% block title %}{{ title }} | {% trans 'Django site admin' %}{% endblock %}
{% block branding %}
-<h1 id="site-name">Django administration</h1>
+<h1 id="site-name">{% trans 'Django administration' %}</h1>
<h2 id="site-url"><a href="http://www.example.com/">example.com</a></h2>
{% endblock %}
diff --git a/django/contrib/admin/templates/admin/delete_confirmation.html b/django/contrib/admin/templates/admin/delete_confirmation.html
index 99b1cdce7a..0bff003980 100644
--- a/django/contrib/admin/templates/admin/delete_confirmation.html
+++ b/django/contrib/admin/templates/admin/delete_confirmation.html
@@ -1,20 +1,21 @@
{% extends "admin/base_site" %}
+{% load i18n %}
{% block content %}
{% if perms_lacking %}
- <p>Deleting the {{ object_name }} "{{ object }}" would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:</p>
+ <p>{% blocktrans %}Deleting the {{ object_name }} '{{ object }}' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktrans %}</p>
<ul>
{% for obj in perms_lacking %}
<li>{{ obj }}</li>
{% endfor %}
</ul>
{% else %}
- <p>Are you sure you want to delete the {{ object_name }} "{{ object }}"? All of the following related items will be deleted:</p>
+ <p>{% blocktrans %}Are you sure you want to delete the {{ object_name }} "{{ object }}"? All of the following related items will be deleted:{% endblocktrans %}</p>
<ul>{{ deleted_objects|unordered_list }}</ul>
<form action="" method="post">
<input type="hidden" name="post" value="yes" />
- <input type="submit" value="Yes, I'm sure" />
+ <input type="submit" value="{% trans "Yes, I'm sure" %}" />
</form>
{% endif %}
diff --git a/django/contrib/admin/templates/admin/index.html b/django/contrib/admin/templates/admin/index.html
index 5f00c84261..9822ed92c2 100644
--- a/django/contrib/admin/templates/admin/index.html
+++ b/django/contrib/admin/templates/admin/index.html
@@ -1,4 +1,5 @@
{% extends "admin/base_site" %}
+{% load i18n %}
{% block coltype %}colMS{% endblock %}
{% block bodyclass %}dashboard{% endblock %}
@@ -23,13 +24,13 @@
{% endif %}
{% if model.perms.add %}
- <td class="x50"><a href="{{ model.admin_url }}add/" class="addlink">Add</a></td>
+ <td class="x50"><a href="{{ model.admin_url }}add/" class="addlink">{% trans 'Add' %}</a></td>
{% else %}
<td class="x50">&nbsp;</td>
{% endif %}
{% if model.perms.change %}
- <td class="x75"><a href="{{ model.admin_url }}" class="changelink">Change</a></td>
+ <td class="x75"><a href="{{ model.admin_url }}" class="changelink">{% trans 'Change' %}</a></td>
{% else %}
<td class="x75">&nbsp;</td>
{% endif %}
@@ -39,7 +40,7 @@
</div>
{% endfor %}
{% else %}
- <p>You don't have permission to edit anything.</p>
+ <p>{% trans "You don't have permission to edit anything." %}</p>
{% endif %}
</div>
{% endblock %}
@@ -47,12 +48,12 @@
{% block sidebar %}
<div id="content-related">
<div class="module" id="recent-actions-module">
- <h2>Recent Actions</h2>
- <h3>My Actions</h3>
+ <h2>{% trans 'Recent Actions' %}</h2>
+ <h3>{% trans 'My Actions' %}</h3>
{% load log %}
{% get_admin_log 10 as admin_log for_user user %}
{% if not admin_log %}
- <p>None available</p>
+ <p>{% trans 'None available' %}</p>
{% else %}
<ul class="actionlist">
{% for entry in admin_log %}
diff --git a/django/contrib/admin/templates/admin/login.html b/django/contrib/admin/templates/admin/login.html
index ef4aa5aae2..ea823e1020 100644
--- a/django/contrib/admin/templates/admin/login.html
+++ b/django/contrib/admin/templates/admin/login.html
@@ -1,4 +1,5 @@
{% extends "admin/base_site" %}
+{% load i18n %}
{% block breadcrumbs %}{% endblock %}
@@ -11,16 +12,16 @@
<form action="{{ app_path }}" method="post">
<p class="aligned">
-<label for="id_username">Username:</label> <input type="text" name="username" id="id_username" />
+<label for="id_username">{% trans 'Username:' %}</label> <input type="text" name="username" id="id_username" />
</p>
<p class="aligned">
-<label for="id_password">Password:</label> <input type="password" name="password" id="id_password" />
+<label for="id_password">{% trans 'Password:' %}</label> <input type="password" name="password" id="id_password" />
<input type="hidden" name="this_is_the_login_form" value="1" />
-<input type="hidden" name="post_data" value="{{ post_data }}" />{% comment %} <span class="help">Have you <a href="/password_reset/">forgotten your password</a>?</span>{% endcomment %}
+<input type="hidden" name="post_data" value="{{ post_data }}" />{% comment %} <span class="help">{% trans 'Have you <a href="/password_reset/">forgotten your password</a>?' %}</span>{% endcomment %}
</p>
<div class="aligned ">
-<label>&nbsp;</label><input type="submit" value="Log in" />
+<label>&nbsp;</label><input type="submit" value="{% trans 'Log in' %}" />
</div>
</form>
diff --git a/django/contrib/admin/templates/admin/object_history.html b/django/contrib/admin/templates/admin/object_history.html
index d50936665a..847cfdf2af 100644
--- a/django/contrib/admin/templates/admin/object_history.html
+++ b/django/contrib/admin/templates/admin/object_history.html
@@ -1,7 +1,8 @@
{% extends "admin/base_site" %}
+{% load i18n %}
{% block breadcrumbs %}
-<div class="breadcrumbs"><a href="../../../../">Home</a> &rsaquo; <a href="../../">{{ module_name }}</a> &rsaquo; <a href="../">{{ object|truncatewords:"18" }}</a> &rsaquo; History</div>
+<div class="breadcrumbs"><a href="../../../../">{% trans 'Home' %}</a> &rsaquo; <a href="../../">{{ module_name }}</a> &rsaquo; <a href="../">{{ object|truncatewords:"18" }}</a> &rsaquo; {% trans 'History' %}</div>
{% endblock %}
{% block content %}
@@ -14,15 +15,15 @@
<table id="change-history">
<thead>
<tr>
- <th>Date/time</th>
- <th>User</th>
- <th>Action</th>
+ <th>{% trans 'Date/time' %}</th>
+ <th>{% trans 'User' %}</th>
+ <th>{% trans 'Action' %}</th>
</tr>
</thead>
<tbody>
{% for action in action_list %}
<tr>
- <th>{{ action.action_time|date:"N j, Y, P" }}</th>
+ <th>{{ action.action_time|date:_("DATE_WITH_TIME_FULL") }}</th>
<td>{{ action.get_user.username }}{% if action.get_user.first_name %} ({{ action.get_user.first_name }} {{ action.get_user.last_name }}){% endif %}</td>
<td>{{ action.change_message}}</td>
</tr>
@@ -32,7 +33,7 @@
{% else %}
- <p>This object doesn't have a change history. It probably wasn't added via this admin site.</p>
+ <p>{% trans "This object doesn't have a change history. It probably wasn't added via this admin site." %}</p>
{% endif %}
diff --git a/django/contrib/admin/templates/registration/logged_out.html b/django/contrib/admin/templates/registration/logged_out.html
index 1f4bd29790..756f82aadc 100644
--- a/django/contrib/admin/templates/registration/logged_out.html
+++ b/django/contrib/admin/templates/registration/logged_out.html
@@ -1,11 +1,12 @@
{% extends "admin/base_site" %}
+{% load i18n %}
-{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">Home</a></div>{% endblock %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a></div>{% endblock %}
{% block content %}
-<p>Thanks for spending some quality time with the Web site today.</p>
+<p>{% trans "Thanks for spending some quality time with the Web site today." %}</p>
-<p><a href="../">Log in again</a></p>
+<p><a href="../">{% trans 'Log in again' %}</a></p>
{% endblock %}
diff --git a/django/contrib/admin/templates/registration/password_change_done.html b/django/contrib/admin/templates/registration/password_change_done.html
index 4345b9bcaa..f163e55a68 100644
--- a/django/contrib/admin/templates/registration/password_change_done.html
+++ b/django/contrib/admin/templates/registration/password_change_done.html
@@ -1,13 +1,14 @@
{% extends "admin/base_site" %}
+{% load i18n %}
-{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">Home</a> &rsaquo; Password change</div>{% endblock %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a> &rsaquo; {% trans 'Password change' %}</div>{% endblock %}
-{% block title %}Password change successful{% endblock %}
+{% block title %}{% trans 'Password change successful' %}{% endblock %}
{% block content %}
-<h1>Password change successful</h1>
+<h1>{% trans 'Password change successful' %}</h1>
-<p>Your password was changed.</p>
+<p>{% trans 'Your password was changed.' %}</p>
{% endblock %}
diff --git a/django/contrib/admin/templates/registration/password_change_form.html b/django/contrib/admin/templates/registration/password_change_form.html
index 104249991c..32e5569458 100644
--- a/django/contrib/admin/templates/registration/password_change_form.html
+++ b/django/contrib/admin/templates/registration/password_change_form.html
@@ -1,25 +1,26 @@
{% extends "admin/base_site" %}
+{% load i18n %}
-{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">Home</a> &rsaquo; Password change</div>{% endblock %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a> &rsaquo; {% trans 'Password change' %}</div>{% endblock %}
-{% block title %}Password change{% endblock %}
+{% block title %}{% trans 'Password change' %}{% endblock %}
{% block content %}
-<h1>Password change</h1>
+<h1>{% trans 'Password change' %}</h1>
-<p>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.</p>
+<p>{% trans "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." %}</p>
<form action="" method="post">
{% if form.old_password.errors %}{{ form.old_password.html_error_list }}{% endif %}
-<p class="aligned wide"><label for="id_old_password">Old password:</label>{{ form.old_password }}</p>
+<p class="aligned wide"><label for="id_old_password">{% trans 'Old password:' %}</label>{{ form.old_password }}</p>
{% if form.new_password1.errors %}{{ form.new_password1.html_error_list }}{% endif %}
-<p class="aligned wide"><label for="id_new_password1">New password:</label>{{ form.new_password1 }}</p>
+<p class="aligned wide"><label for="id_new_password1">{% trans 'New password:' %}</label>{{ form.new_password1 }}</p>
{% if form.new_password2.errors %}{{ form.new_password2.html_error_list }}{% endif %}
-<p class="aligned wide"><label for="id_new_password2">Confirm password:</label>{{ form.new_password2 }}</p>
+<p class="aligned wide"><label for="id_new_password2">{% trans 'Confirm password:' %}</label>{{ form.new_password2 }}</p>
-<p><input type="submit" value="Change my password" /></p>
+<p><input type="submit" value="{% trans 'Change my password' %}" /></p>
</form>
{% endblock %}
diff --git a/django/contrib/admin/templates/registration/password_reset_done.html b/django/contrib/admin/templates/registration/password_reset_done.html
index a8573e8e0e..dff293c931 100644
--- a/django/contrib/admin/templates/registration/password_reset_done.html
+++ b/django/contrib/admin/templates/registration/password_reset_done.html
@@ -1,13 +1,14 @@
{% extends "admin/base_site" %}
+{% load i18n %}
-{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">Home</a> &rsaquo; Password reset</div>{% endblock %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a> &rsaquo; {% trans 'Password reset' %}</div>{% endblock %}
-{% block title %}Password reset successful{% endblock %}
+{% block title %}{% trans 'Password reset successful' %}{% endblock %}
{% block content %}
-<h1>Password reset successful</h1>
+<h1>{% trans 'Password reset successful' %}</h1>
-<p>We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly.</p>
+<p>{% trans "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly." %}</p>
{% endblock %}
diff --git a/django/contrib/admin/templates/registration/password_reset_email.html b/django/contrib/admin/templates/registration/password_reset_email.html
index 4a5bb920d6..b9a0257392 100644
--- a/django/contrib/admin/templates/registration/password_reset_email.html
+++ b/django/contrib/admin/templates/registration/password_reset_email.html
@@ -1,14 +1,15 @@
-You're receiving this e-mail because you requested a password reset
-for your user account at {{ site_name }}.
+{% load i18n %}
+{% trans "You're receiving this e-mail because you requested a password reset" %}
+{% trans "for your user account at %(site_name)s" %}.
-Your new password is: {{ new_password }}
+{% trans "Your new password is: %(new_password)s" %}
-Feel free to change this password by going to this page:
+{% trans "Feel free to change this password by going to this page:" %}
http://{{ domain }}/password_change/
-Your username, in case you've forgotten, is {{ user.username }}
+{% trans "Your username, in case you've forgotten:" %} {{ user.username }}
-Thanks for using our site!
+{% trans "Thanks for using our site!" %}
-The {{ site_name }} team
+{% trans "The %(site_name)s team" %}
diff --git a/django/contrib/admin/templates/registration/password_reset_form.html b/django/contrib/admin/templates/registration/password_reset_form.html
index 4f9bcb5fc5..8db1ede42f 100644
--- a/django/contrib/admin/templates/registration/password_reset_form.html
+++ b/django/contrib/admin/templates/registration/password_reset_form.html
@@ -1,18 +1,19 @@
{% extends "admin/base_site" %}
+{% load i18n %}
-{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">Home</a> &rsaquo; Password reset</div>{% endblock %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a> &rsaquo; {% trans 'Password reset' %}</div>{% endblock %}
-{% block title %}Password reset{% endblock %}
+{% block title %}{% trans "Password reset" %}{% endblock %}
{% block content %}
-<h1>Password reset</h1>
+<h1>{% trans "Password reset") }}</h1>
-<p>Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you.</p>
+<p>{% trans "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you." %}</p>
<form action="" method="post">
{% if form.email.errors %}{{ form.email.html_error_list }}{% endif %}
-<p><label for="id_email">E-mail address:</label> {{ form.email }} <input type="submit" value="Reset my password" /></p>
+<p><label for="id_email">{% trans 'E-mail address:' %}</label> {{ form.email }} <input type="submit" value="{% trans 'Reset my password' %}" /></p>
</form>
{% endblock %}
diff --git a/django/core/extensions.py b/django/core/extensions.py
index a7eaf3b06f..6bd24c4dbf 100644
--- a/django/core/extensions.py
+++ b/django/core/extensions.py
@@ -33,6 +33,12 @@ class DjangoContext(Context):
self['user'] = request.user
self['messages'] = request.user.get_and_delete_messages()
self['perms'] = PermWrapper(request.user)
+ from django.conf import settings
+ self['LANGUAGES'] = settings.LANGUAGES
+ if hasattr(request, 'LANGUAGE_CODE'):
+ self['LANGUAGE_CODE'] = request.LANGUAGE_CODE
+ else:
+ self['LANGUAGE_CODE'] = settings.LANGUAGE_CODE
if DEBUG and request.META.get('REMOTE_ADDR') in INTERNAL_IPS:
self['debug'] = True
from django.core import db
diff --git a/django/core/meta/fields.py b/django/core/meta/fields.py
index 5d82e61dcd..a15432dcd2 100644
--- a/django/core/meta/fields.py
+++ b/django/core/meta/fields.py
@@ -1,8 +1,9 @@
from django.conf import settings
from django.core import formfields, validators
from django.core.exceptions import ObjectDoesNotExist
-from django.utils.functional import curry
+from django.utils.functional import curry, lazy
from django.utils.text import capfirst
+from django.utils.translation import gettext_lazy
import datetime, os
# Random entropy string used by "default" param.
@@ -26,6 +27,16 @@ prep_for_like_query = lambda x: str(x).replace("%", "\%").replace("_", "\_")
# returns the <ul> class for a given radio_admin value
get_ul_class = lambda x: 'radiolist%s' % ((x == HORIZONTAL) and ' inline' or '')
+def string_concat(*strings):
+ """"
+ lazy variant of string concatenation, needed for translations that are
+ constructed from multiple parts. Handles lazy strings and non-strings by
+ first turning all arguments to strings, before joining them.
+ """
+ return ''.join([str(el) for el in strings])
+
+string_concat = lazy(string_concat, str)
+
def manipulator_valid_rel_key(f, self, field_data, all_data):
"Validates that the value is a valid foreign key"
mod = f.rel.to.get_model_module()
@@ -80,9 +91,11 @@ class Field(object):
self.db_column = db_column
if rel and isinstance(rel, ManyToMany):
if rel.raw_id_admin:
- self.help_text += ' Separate multiple IDs with commas.'
+ self.help_text = string_concat(self.help_text,
+ gettext_lazy(' Separate multiple IDs with commas.'))
else:
- self.help_text += ' Hold down "Control", or "Command" on a Mac, to select more than one.'
+ self.help_text = string_concat(self.help_text,
+ gettext_lazy(' Hold down "Control", or "Command" on a Mac, to select more than one.'))
# Set db_index to True if the field has a relationship and doesn't explicitly set db_index.
if db_index is None:
diff --git a/django/core/template/__init__.py b/django/core/template/__init__.py
index 71a8e621c8..2f1caf657f 100644
--- a/django/core/template/__init__.py
+++ b/django/core/template/__init__.py
@@ -234,6 +234,97 @@ class Parser:
def delete_first_token(self):
del self.tokens[0]
+class TokenParser:
+ """
+ You need to subclass this class and implement the
+ top method to parse your template line. When instantiating
+ the parser, you pass in the line from the django template
+ parser.
+
+ If your tag needs to know what tag name it was called with,
+ you find it in the tagname instance variable of the parser.
+ """
+
+ def __init__(self, subject):
+ self.subject = subject
+ self.pointer = 0
+ self.backout = []
+ self.tagname = self.tag()
+
+ def top(self):
+ """
+ You need to overload this method to do the actual parsing
+ and return the result.
+ """
+ raise NotImplemented
+
+ def more(self):
+ """
+ This returns True if there is more stuff in the tag.
+ """
+ return self.pointer < len(self.subject)
+
+ def back(self):
+ """
+ This method undos the last microparser. This can be
+ used for lookahead and backtracking.
+ """
+ if not len(self.backout):
+ raise TemplateSyntaxError, "back called without some previous parsing"
+ self.pointer = self.backout.pop()
+
+ def tag(self):
+ """
+ This microparser just returns the next tag from the line.
+ """
+ subject = self.subject
+ i = self.pointer
+ if i >= len(subject):
+ raise TemplateSyntaxError, "expected another tag, found end of string: %s" % subject
+ p = i
+ while i < len(subject) and subject[i] not in (' ', '\t'):
+ i += 1
+ s = subject[p:i]
+ while i < len(subject) and subject[i] in (' ', '\t'):
+ i += 1
+ self.backout.append(self.pointer)
+ self.pointer = i
+ return s
+
+ def value(self):
+ """
+ This microparser parses for a value - some string constant or
+ variable name.
+ """
+ subject = self.subject
+ i = self.pointer
+ if i >= len(subject):
+ raise TemplateSyntaxError, "searching for value expected another value, found end of string: %s" % subject
+ if subject[i] in ('"', "'"):
+ p = i
+ i += 1
+ while i < len(subject) and subject[i] != subject[p]:
+ i += 1
+ if i >= len(subject):
+ raise TemplateSyntaxError, "searching for value, unexpected end of string in column %d: %s" % subject
+ i += 1
+ res = subject[p:i]
+ while i < len(subject) and subject[i] in (' ', '\t'):
+ i += 1
+ self.backout.append(self.pointer)
+ self.pointer = i
+ return res
+ else:
+ p = i
+ while i < len(subject) and subject[i] not in (' ', '\t'):
+ i += 1
+ s = subject[p:i]
+ while i < len(subject) and subject[i] in (' ', '\t'):
+ i += 1
+ self.backout.append(self.pointer)
+ self.pointer = i
+ return s
+
class FilterParser:
"""Parse a variable token and its optional filters (all as a single string),
and return a list of tuples of the filter name and arguments.
@@ -255,8 +346,12 @@ class FilterParser:
self.filters = []
self.current_filter_name = None
self.current_filter_arg = None
- # First read the variable part
- self.var = self.read_alphanumeric_token()
+ # First read the variable part - decide on wether we need
+ # to parse a string or a variable by peeking into the stream
+ if self.peek_char() in ('_', '"', "'"):
+ self.var = self.read_constant_string_token()
+ else:
+ self.var = self.read_alphanumeric_token()
if not self.var:
raise TemplateSyntaxError, "Could not read variable name: '%s'" % self.s
if self.var.find(VARIABLE_ATTRIBUTE_SEPARATOR + '_') > -1 or self.var[0] == '_':
@@ -269,6 +364,12 @@ class FilterParser:
# We have a filter separator; start reading the filters
self.read_filters()
+ def peek_char(self):
+ try:
+ return self.s[self.i+1]
+ except IndexError:
+ return None
+
def next_char(self):
self.i = self.i + 1
try:
@@ -276,6 +377,37 @@ class FilterParser:
except IndexError:
self.current = None
+ def read_constant_string_token(self):
+ """Read a constant string that must be delimited by either "
+ or ' characters. The string is returned with it's delimiters."""
+ val = ''
+ qchar = None
+ i18n = False
+ self.next_char()
+ if self.current == '_':
+ i18n = True
+ self.next_char()
+ if self.current != '(':
+ raise TemplateSyntaxError, "Bad character (expecting '(') '%s'" % self.current
+ self.next_char()
+ if not self.current in ('"', "'"):
+ raise TemplateSyntaxError, "Bad character (expecting '\"' or ''') '%s'" % self.current
+ qchar = self.current
+ val += qchar
+ while 1:
+ self.next_char()
+ if self.current == qchar:
+ break
+ val += self.current
+ val += self.current
+ self.next_char()
+ if i18n:
+ if self.current != ')':
+ raise TemplateSyntaxError, "Bad character (expecting ')') '%s'" % self.current
+ self.next_char()
+ val = qchar+_(val.strip(qchar))+qchar
+ return val
+
def read_alphanumeric_token(self):
"""Read a variable name or filter name, which are continuous strings of
alphanumeric characters + the underscore"""
@@ -318,8 +450,15 @@ class FilterParser:
return (self.current_filter_name, self.current_filter_arg)
def read_arg(self):
- # First read a "
+ # First read a " or a _("
self.next_char()
+ translated = False
+ if self.current == '_':
+ self.next_char()
+ if self.current != '(':
+ raise TemplateSyntaxError, "Bad character (expecting '(') '%s'" % self.current
+ translated = True
+ self.next_char()
if self.current != '"':
raise TemplateSyntaxError, "Bad character (expecting '\"') '%s'" % self.current
self.escaped = False
@@ -346,6 +485,11 @@ class FilterParser:
arg += self.current
# self.current must now be '"'
self.next_char()
+ if translated:
+ if self.current != ')':
+ raise TemplateSyntaxError, "Bad character (expecting ')') '%s'" % self.current
+ self.next_char()
+ arg = _(arg)
return arg
def get_filters_from_token(token):
diff --git a/django/core/template/defaulttags.py b/django/core/template/defaulttags.py
index 535d0b81e1..d7c53fe947 100644
--- a/django/core/template/defaulttags.py
+++ b/django/core/template/defaulttags.py
@@ -2,7 +2,10 @@
from django.core.template import Node, NodeList, Template, Context, resolve_variable, resolve_variable_with_filters, get_filters_from_token, registered_filters
from django.core.template import TemplateSyntaxError, VariableDoesNotExist, BLOCK_TAG_START, BLOCK_TAG_END, VARIABLE_TAG_START, VARIABLE_TAG_END, register_tag
+from django.utils import translation
+
import sys
+import re
class CommentNode(Node):
def render(self, context):
diff --git a/django/core/validators.py b/django/core/validators.py
index 09a733f348..e6a7b069cf 100644
--- a/django/core/validators.py
+++ b/django/core/validators.py
@@ -25,6 +25,7 @@ slug_re = re.compile(r'^[-\w]+$')
url_re = re.compile(r'^http://\S+$')
from django.conf.settings import JING_PATH
+from django.utils.translation import gettext_lazy, ngettext
class ValidationError(Exception):
def __init__(self, message):
@@ -54,11 +55,11 @@ class CriticalValidationError(Exception):
def isAlphaNumeric(field_data, all_data):
if not alnum_re.search(field_data):
- raise ValidationError, "This value must contain only letters, numbers and underscores."
+ raise ValidationError, _("This value must contain only letters, numbers and underscores.")
def isAlphaNumericURL(field_data, all_data):
if not alnumurl_re.search(field_data):
- raise ValidationError, "This value must contain only letters, numbers, underscores or slashes."
+ raise ValidationError, _("This value must contain only letters, numbers, underscores and slashes.")
def isSlug(field_data, all_data):
if not slug_re.search(field_data):
@@ -66,18 +67,18 @@ def isSlug(field_data, all_data):
def isLowerCase(field_data, all_data):
if field_data.lower() != field_data:
- raise ValidationError, "Uppercase letters are not allowed here."
+ raise ValidationError, _("Uppercase letters are not allowed here.")
def isUpperCase(field_data, all_data):
if field_data.upper() != field_data:
- raise ValidationError, "Lowercase letters are not allowed here."
+ raise ValidationError, _("Lowercase letters are not allowed here.")
def isCommaSeparatedIntegerList(field_data, all_data):
for supposed_int in field_data.split(','):
try:
int(supposed_int)
except ValueError:
- raise ValidationError, "Enter only digits separated by commas."
+ raise ValidationError, _("Enter only digits separated by commas.")
def isCommaSeparatedEmailList(field_data, all_data):
"""
@@ -89,51 +90,51 @@ def isCommaSeparatedEmailList(field_data, all_data):
try:
isValidEmail(supposed_email.strip(), '')
except ValidationError:
- raise ValidationError, "Enter valid e-mail addresses separated by commas."
+ raise ValidationError, _("Enter valid e-mail addresses separated by commas.")
def isValidIPAddress4(field_data, all_data):
if ip4_re.search(field_data):
valid_parts = [el for el in field_data.split('.') if 0 <= int(el) <= 255]
if len(valid_parts) == 4:
return
- raise validators.ValidationError, "Please enter a valid IP address."
+ raise validators.ValidationError, _("Please enter a valid IP address.")
def isNotEmpty(field_data, all_data):
if field_data.strip() == '':
- raise ValidationError, "Empty values are not allowed here."
+ raise ValidationError, _("Empty values are not allowed here.")
def isOnlyDigits(field_data, all_data):
if not field_data.isdigit():
- raise ValidationError, "Non-numeric characters aren't allowed here."
+ raise ValidationError, _("Non-numeric characters aren't allowed here.")
def isNotOnlyDigits(field_data, all_data):
if field_data.isdigit():
- raise ValidationError, "This value can't be comprised solely of digits."
+ raise ValidationError, _("This value can't be comprised solely of digits.")
def isInteger(field_data, all_data):
# This differs from isOnlyDigits because this accepts the negative sign
if not integer_re.search(field_data):
- raise ValidationError, "Enter a whole number."
+ raise ValidationError, _("Enter a whole number.")
def isOnlyLetters(field_data, all_data):
if not field_data.isalpha():
- raise ValidationError, "Only alphabetical characters are allowed here."
+ raise ValidationError, _("Only alphabetical characters are allowed here.")
def isValidANSIDate(field_data, all_data):
if not ansi_date_re.search(field_data):
- raise ValidationError, 'Enter a valid date in YYYY-MM-DD format.'
+ raise ValidationError, _('Enter a valid date in YYYY-MM-DD format.')
def isValidANSITime(field_data, all_data):
if not ansi_time_re.search(field_data):
- raise ValidationError, 'Enter a valid time in HH:MM format.'
+ raise ValidationError, _('Enter a valid time in HH:MM format.')
def isValidANSIDatetime(field_data, all_data):
if not ansi_datetime_re.search(field_data):
- raise ValidationError, 'Enter a valid date/time in YYYY-MM-DD HH:MM format.'
+ raise ValidationError, _('Enter a valid date/time in YYYY-MM-DD HH:MM format.')
def isValidEmail(field_data, all_data):
if not email_re.search(field_data):
- raise ValidationError, 'Enter a valid e-mail address.'
+ raise ValidationError, _('Enter a valid e-mail address.')
def isValidImage(field_data, all_data):
"""
@@ -145,18 +146,18 @@ def isValidImage(field_data, all_data):
try:
Image.open(StringIO(field_data['content']))
except IOError: # Python Imaging Library doesn't recognize it as an image
- raise ValidationError, "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
+ raise ValidationError, _("Upload a valid image. The file you uploaded was either not an image or a corrupted image.")
def isValidImageURL(field_data, all_data):
uc = URLMimeTypeCheck(('image/jpeg', 'image/gif', 'image/png'))
try:
uc(field_data, all_data)
except URLMimeTypeCheck.InvalidContentType:
- raise ValidationError, "The URL %s does not point to a valid image." % field_data
+ raise ValidationError, _("The URL %s does not point to a valid image.") % field_data
def isValidPhone(field_data, all_data):
if not phone_re.search(field_data):
- raise ValidationError, 'Phone numbers must be in XXX-XXX-XXXX format. "%s" is invalid.' % field_data
+ raise ValidationError, _('Phone numbers must be in XXX-XXX-XXXX format. "%s" is invalid.') % field_data
def isValidQuicktimeVideoURL(field_data, all_data):
"Checks that the given URL is a video that can be played by QuickTime (qt, mpeg)"
@@ -164,11 +165,11 @@ def isValidQuicktimeVideoURL(field_data, all_data):
try:
uc(field_data, all_data)
except URLMimeTypeCheck.InvalidContentType:
- raise ValidationError, "The URL %s does not point to a valid QuickTime video." % field_data
+ raise ValidationError, _("The URL %s does not point to a valid QuickTime video.") % field_data
def isValidURL(field_data, all_data):
if not url_re.search(field_data):
- raise ValidationError, "A valid URL is required."
+ raise ValidationError, _("A valid URL is required.")
def isValidHTML(field_data, all_data):
import urllib, urllib2
@@ -182,14 +183,14 @@ def isValidHTML(field_data, all_data):
return
from xml.dom.minidom import parseString
error_messages = [e.firstChild.wholeText for e in parseString(u.read()).getElementsByTagName('messages')[0].getElementsByTagName('msg')]
- raise ValidationError, "Valid HTML is required. Specific errors are:\n%s" % "\n".join(error_messages)
+ raise ValidationError, _("Valid HTML is required. Specific errors are:\n%s") % "\n".join(error_messages)
def isWellFormedXml(field_data, all_data):
from xml.dom.minidom import parseString
try:
parseString(field_data)
except Exception, e: # Naked except because we're not sure what will be thrown
- raise ValidationError, "Badly formed XML: %s" % str(e)
+ raise ValidationError, _("Badly formed XML: %s") % str(e)
def isWellFormedXmlFragment(field_data, all_data):
isWellFormedXml('<root>%s</root>' % field_data, all_data)
@@ -199,15 +200,15 @@ def isExistingURL(field_data, all_data):
try:
u = urllib2.urlopen(field_data)
except ValueError:
- raise ValidationError, "Invalid URL: %s" % field_data
+ raise ValidationError, _("Invalid URL: %s") % field_data
except: # urllib2.HTTPError, urllib2.URLError, httplib.InvalidURL, etc.
- raise ValidationError, "The URL %s is a broken link." % field_data
+ raise ValidationError, _("The URL %s is a broken link.") % field_data
def isValidUSState(field_data, all_data):
"Checks that the given string is a valid two-letter U.S. state abbreviation"
states = ['AA', 'AE', 'AK', 'AL', 'AP', 'AR', 'AS', 'AZ', 'CA', 'CO', 'CT', 'DC', 'DE', 'FL', 'FM', 'GA', 'GU', 'HI', 'IA', 'ID', 'IL', 'IN', 'KS', 'KY', 'LA', 'MA', 'MD', 'ME', 'MH', 'MI', 'MN', 'MO', 'MP', 'MS', 'MT', 'NC', 'ND', 'NE', 'NH', 'NJ', 'NM', 'NV', 'NY', 'OH', 'OK', 'OR', 'PA', 'PR', 'PW', 'RI', 'SC', 'SD', 'TN', 'TX', 'UT', 'VA', 'VI', 'VT', 'WA', 'WI', 'WV', 'WY']
if field_data.upper() not in states:
- raise ValidationError, "Enter a valid U.S. state abbreviation."
+ raise ValidationError, _("Enter a valid U.S. state abbreviation.")
def hasNoProfanities(field_data, all_data):
"""
@@ -222,15 +223,14 @@ def hasNoProfanities(field_data, all_data):
if words_seen:
from django.utils.text import get_text_list
plural = len(words_seen) > 1
- raise ValidationError, "Watch your mouth! The word%s %s %s not allowed here." % \
- (plural and 's' or '',
- get_text_list(['"%s%s%s"' % (i[0], '-'*(len(i)-2), i[-1]) for i in words_seen], 'and'),
- plural and 'are' or 'is')
+ raise ValidationError, ngettext("Watch your mouth! The word %s is not allowed here.",
+ "Watch your mouth! The words %s are not allowed here.", plural) % \
+ get_text_list(['"%s%s%s"' % (i[0], '-'*(len(i)-2), i[-1]) for i in words_seen], 'and')
class AlwaysMatchesOtherField:
def __init__(self, other_field_name, error_message=None):
self.other = other_field_name
- self.error_message = error_message or "This field must match the '%s' field." % self.other
+ self.error_message = error_message or gettext_lazy("This field must match the '%s' field.") % self.other
self.always_test = True
def __call__(self, field_data, all_data):
@@ -249,7 +249,7 @@ class ValidateIfOtherFieldEquals:
v(field_data, all_data)
class RequiredIfOtherFieldNotGiven:
- def __init__(self, other_field_name, error_message="Please enter something for at least one field."):
+ def __init__(self, other_field_name, error_message=gettext_lazy("Please enter something for at least one field.")):
self.other, self.error_message = other_field_name, error_message
self.always_test = True
@@ -258,7 +258,7 @@ class RequiredIfOtherFieldNotGiven:
raise ValidationError, self.error_message
class RequiredIfOtherFieldsGiven:
- def __init__(self, other_field_names, error_message="Please enter both fields or leave them both empty."):
+ def __init__(self, other_field_names, error_message=gettext_lazy("Please enter both fields or leave them both empty.")):
self.other, self.error_message = other_field_names, error_message
self.always_test = True
@@ -269,14 +269,15 @@ class RequiredIfOtherFieldsGiven:
class RequiredIfOtherFieldGiven(RequiredIfOtherFieldsGiven):
"Like RequiredIfOtherFieldsGiven, but takes a single field name instead of a list."
- def __init__(self, other_field_name, error_message="Please enter both fields or leave them both empty."):
+ def __init__(self, other_field_name, error_message=gettext_lazy("Please enter both fields or leave them both empty.")):
RequiredIfOtherFieldsGiven.__init__(self, [other_field_name], error_message)
class RequiredIfOtherFieldEquals:
def __init__(self, other_field, other_value, error_message=None):
self.other_field = other_field
self.other_value = other_value
- self.error_message = error_message or "This field must be given if %s is %s" % (other_field, other_value)
+ self.error_message = error_message or gettext_lazy("This field must be given if %(field)s is %(value)s") % {
+ 'field': other_field, 'value': other_value}
self.always_test = True
def __call__(self, field_data, all_data):
@@ -287,7 +288,8 @@ class RequiredIfOtherFieldDoesNotEqual:
def __init__(self, other_field, other_value, error_message=None):
self.other_field = other_field
self.other_value = other_value
- self.error_message = error_message or "This field must be given if %s is not %s" % (other_field, other_value)
+ self.error_message = error_message or gettext_lazy("This field must be given if %(field)s is not %(value)s") % {
+ 'field': other_field, 'value': other_value}
self.always_test = True
def __call__(self, field_data, all_data):
@@ -305,7 +307,7 @@ class IsLessThanOtherField:
class UniqueAmongstFieldsWithPrefix:
def __init__(self, field_name, prefix, error_message):
self.field_name, self.prefix = field_name, prefix
- self.error_message = error_message or "Duplicate values are not allowed."
+ self.error_message = error_message or gettext_lazy("Duplicate values are not allowed.")
def __call__(self, field_data, all_data):
for field_name, value in all_data.items():
@@ -328,7 +330,7 @@ class IsAPowerOf:
from math import log
val = log(int(field_data)) / log(self.power_of)
if val != int(val):
- raise ValidationError, "This value must be a power of %s." % self.power_of
+ raise ValidationError, _("This value must be a power of %s.") % self.power_of
class IsValidFloat:
def __init__(self, max_digits, decimal_places):
@@ -339,13 +341,13 @@ class IsValidFloat:
try:
float(data)
except ValueError:
- raise ValidationError, "Please enter a valid decimal number."
+ raise ValidationError, _("Please enter a valid decimal number.")
if len(data) > (self.max_digits + 1):
- raise ValidationError, "Please enter a valid decimal number with at most %s total digit%s." % \
- (self.max_digits, self.max_digits > 1 and 's' or '')
+ raise ValidationError, ngettext( "Please enter a valid decimal number with at most %s total digit.",
+ "Please enter a valid decimal number with at most %s total digits.", self.max_digits) % self.max_digits
if '.' in data and len(data.split('.')[1]) > self.decimal_places:
- raise ValidationError, "Please enter a valid decimal number with at most %s decimal place%s." % \
- (self.decimal_places, self.decimal_places > 1 and 's' or '')
+ raise ValidationError, ngettext("Please enter a valid decimal number with at most %s decimal place.",
+ "Please enter a valid decimal number with at most %s decimal places.", self.decimal_places) % self.decimal_places
class HasAllowableSize:
"""
@@ -354,8 +356,8 @@ class HasAllowableSize:
"""
def __init__(self, min_size=None, max_size=None, min_error_message=None, max_error_message=None):
self.min_size, self.max_size = min_size, max_size
- self.min_error_message = min_error_message or "Make sure your uploaded file is at least %s bytes big." % min_size
- self.max_error_message = max_error_message or "Make sure your uploaded file is at most %s bytes big." % min_size
+ self.min_error_message = min_error_message or gettext_lazy("Make sure your uploaded file is at least %s bytes big.") % min_size
+ self.max_error_message = max_error_message or gettext_lazy("Make sure your uploaded file is at most %s bytes big.") % min_size
def __call__(self, field_data, all_data):
if self.min_size is not None and len(field_data['content']) < self.min_size:
@@ -368,7 +370,7 @@ class MatchesRegularExpression:
Checks that the field matches the given regular-expression. The regex
should be in string format, not already compiled.
"""
- def __init__(self, regexp, error_message="The format for this field is wrong."):
+ def __init__(self, regexp, error_message=gettext_lazy("The format for this field is wrong.")):
self.regexp = re.compile(regexp)
self.error_message = error_message
@@ -383,7 +385,7 @@ class AnyValidator:
as a validation error. The message is rather unspecific, so it's best to
specify one on instantiation.
"""
- def __init__(self, validator_list=[], error_message="This field is invalid."):
+ def __init__(self, validator_list=[], error_message=gettext_lazy("This field is invalid.")):
self.validator_list = validator_list
self.error_message = error_message
for v in validator_list:
@@ -418,10 +420,11 @@ class URLMimeTypeCheck:
try:
info = urllib2.urlopen(field_data).info()
except (urllib2.HTTPError, urllib2.URLError):
- raise URLMimeTypeCheck.CouldNotRetrieve, "Could not retrieve anything from %s." % field_data
+ raise URLMimeTypeCheck.CouldNotRetrieve, _("Could not retrieve anything from %s.") % field_data
content_type = info['content-type']
if content_type not in self.mime_type_list:
- raise URLMimeTypeCheck.InvalidContentType, "The URL %s returned the invalid Content-Type header '%s'." % (field_data, content_type)
+ raise URLMimeTypeCheck.InvalidContentType, _("The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'.") % {
+ 'url': field_data, 'contenttype': content_type}
class RelaxNGCompact:
"Validate against a Relax NG compact schema"
@@ -453,31 +456,31 @@ class RelaxNGCompact:
# Scrape the Jing error messages to reword them more nicely.
m = re.search(r'Expected "(.*?)" to terminate element starting on line (\d+)', message)
if m:
- display_errors.append('Please close the unclosed %s tag from line %s. (Line starts with "%s".)' % \
- (m.group(1).replace('/', ''), m.group(2), lines[int(m.group(2)) - 1][:30]))
+ display_errors.append(_('Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "%(start)s".)') % \
+ {'tag':m.group(1).replace('/', ''), 'line':m.group(2), 'start':lines[int(m.group(2)) - 1][:30]})
continue
if message.strip() == 'text not allowed here':
- display_errors.append('Some text starting on line %s is not allowed in that context. (Line starts with "%s".)' % \
- (line, lines[int(line) - 1][:30]))
+ display_errors.append(_('Some text starting on line %(line)s is not allowed in that context. (Line starts with "%(start)s".)') % \
+ {'line':line, 'start':lines[int(line) - 1][:30]})
continue
m = re.search(r'\s*attribute "(.*?)" not allowed at this point; ignored', message)
if m:
- display_errors.append('"%s" on line %s is an invalid attribute. (Line starts with "%s".)' % \
- (m.group(1), line, lines[int(line) - 1][:30]))
+ display_errors.append(_('"%(attr)s" on line %(line)s is an invalid attribute. (Line starts with "%(start)s".)') % \
+ {'attr':m.group(1), 'line':line, 'start':lines[int(line) - 1][:30]})
continue
m = re.search(r'\s*unknown element "(.*?)"', message)
if m:
- display_errors.append('"<%s>" on line %s is an invalid tag. (Line starts with "%s".)' % \
- (m.group(1), line, lines[int(line) - 1][:30]))
+ display_errors.append(_('"<%(tag)s>" on line %(line)s is an invalid tag. (Line starts with "%(start)s".)') % \
+ {'tag':m.group(1), 'line':line, 'start':lines[int(line) - 1][:30]})
continue
if message.strip() == 'required attributes missing':
- display_errors.append('A tag on line %s is missing one or more required attributes. (Line starts with "%s".)' % \
- (line, lines[int(line) - 1][:30]))
+ display_errors.append(_('A tag on line %(line)s is missing one or more required attributes. (Line starts with "%(start)s".)') % \
+ {'line':line, 'start':lines[int(line) - 1][:30]})
continue
m = re.search(r'\s*bad value for attribute "(.*?)"', message)
if m:
- display_errors.append('The "%s" attribute on line %s has an invalid value. (Line starts with "%s".)' % \
- (m.group(1), line, lines[int(line) - 1][:30]))
+ display_errors.append(_('The "%(attr)s" attribute on line %(line)s has an invalid value. (Line starts with "%(start)s".)') % \
+ {'attr':m.group(1), 'line':line, 'start':lines[int(line) - 1][:30]})
continue
# Failing all those checks, use the default error message.
display_error = 'Line %s: %s [%s]' % (line, message, level.strip())
diff --git a/django/middleware/locale.py b/django/middleware/locale.py
new file mode 100644
index 0000000000..83ecbdcc67
--- /dev/null
+++ b/django/middleware/locale.py
@@ -0,0 +1,24 @@
+"this is the locale selecting middleware that will look at accept headers"
+
+from django.utils.cache import patch_vary_headers
+from django.utils import translation
+
+class LocaleMiddleware:
+ """
+ This is a very simple middleware that parses a request
+ and decides what translation object to install in the current
+ thread context. This allows pages to be dynamically
+ translated to the language the user desires (if the language
+ is available, of course).
+ """
+
+ def process_request(self, request):
+ language = translation.get_language_from_request(request)
+ translation.activate(language)
+ request.LANGUAGE_CODE = translation.get_language()
+
+ def process_response(self, request, response):
+ patch_vary_headers(response, ('Accept-Language',))
+ translation.deactivate()
+ return response
+
diff --git a/django/models/auth.py b/django/models/auth.py
index 2a65290085..f06822b145 100644
--- a/django/models/auth.py
+++ b/django/models/auth.py
@@ -1,11 +1,14 @@
from django.core import meta, validators
from django.models import core
+from django.utils.translation import gettext_lazy as _
class Permission(meta.Model):
- name = meta.CharField(maxlength=50)
+ name = meta.CharField(_('name'), maxlength=50)
package = meta.ForeignKey(core.Package, db_column='package')
- codename = meta.CharField(maxlength=100)
+ codename = meta.CharField(_('codename'), maxlength=100)
class META:
+ verbose_name = _('Permission')
+ verbose_name_plural = _('Permissions')
unique_together = (('package', 'codename'),)
ordering = ('package', 'codename')
@@ -13,9 +16,11 @@ class Permission(meta.Model):
return "%s | %s" % (self.package, self.name)
class Group(meta.Model):
- name = meta.CharField(maxlength=80, unique=True)
+ name = meta.CharField(_('name'), maxlength=80, unique=True)
permissions = meta.ManyToManyField(Permission, blank=True, filter_interface=meta.HORIZONTAL)
class META:
+ verbose_name = _('Group')
+ verbose_name_plural = _('Groups')
ordering = ('name',)
admin = meta.Admin(
search_fields = ('name',),
@@ -25,20 +30,22 @@ class Group(meta.Model):
return self.name
class User(meta.Model):
- username = meta.CharField(maxlength=30, unique=True, validator_list=[validators.isAlphaNumeric])
- first_name = meta.CharField(maxlength=30, blank=True)
- last_name = meta.CharField(maxlength=30, blank=True)
- email = meta.EmailField('e-mail address', blank=True)
- password_md5 = meta.CharField('password', maxlength=32, help_text="Use an MD5 hash -- not the raw password.")
- is_staff = meta.BooleanField('staff status', help_text="Designates whether the user can log into this admin site.")
- is_active = meta.BooleanField('active', default=True)
- is_superuser = meta.BooleanField('superuser status')
- last_login = meta.DateTimeField(default=meta.LazyDate())
- date_joined = meta.DateTimeField(default=meta.LazyDate())
+ username = meta.CharField(_('username'), maxlength=30, unique=True, validator_list=[validators.isAlphaNumeric])
+ first_name = meta.CharField(_('first name'), maxlength=30, blank=True)
+ last_name = meta.CharField(_('last name'), maxlength=30, blank=True)
+ email = meta.EmailField(_('e-mail address'), blank=True)
+ password_md5 = meta.CharField(_('password'), maxlength=32, help_text=_("Use an MD5 hash -- not the raw password."))
+ is_staff = meta.BooleanField(_('staff status'), help_text=_("Designates whether the user can log into this admin site."))
+ is_active = meta.BooleanField(_('active'), default=True)
+ is_superuser = meta.BooleanField(_('superuser status'))
+ last_login = meta.DateTimeField(_('last login'), default=meta.LazyDate())
+ date_joined = meta.DateTimeField(_('date joined'), default=meta.LazyDate())
groups = meta.ManyToManyField(Group, blank=True,
- help_text="In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in.")
+ help_text=_("In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."))
user_permissions = meta.ManyToManyField(Permission, blank=True, filter_interface=meta.HORIZONTAL)
class META:
+ verbose_name = _('User')
+ verbose_name_plural = _('Users')
module_constants = {
'SESSION_KEY': '_auth_user_id',
}
@@ -47,10 +54,10 @@ class User(meta.Model):
admin = meta.Admin(
fields = (
(None, {'fields': ('username', 'password_md5')}),
- ('Personal info', {'fields': ('first_name', 'last_name', 'email')}),
- ('Permissions', {'fields': ('is_staff', 'is_active', 'is_superuser', 'user_permissions')}),
- ('Important dates', {'fields': ('last_login', 'date_joined')}),
- ('Groups', {'fields': ('groups',)}),
+ (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
+ (_('Permissions'), {'fields': ('is_staff', 'is_active', 'is_superuser', 'user_permissions')}),
+ (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
+ (_('Groups'), {'fields': ('groups',)}),
),
list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff'),
list_filter = ('is_staff', 'is_superuser'),
@@ -172,7 +179,7 @@ class User(meta.Model):
class Message(meta.Model):
user = meta.ForeignKey(User)
- message = meta.TextField()
+ message = meta.TextField(_('Message'))
def __repr__(self):
return self.message
diff --git a/django/models/core.py b/django/models/core.py
index 939373f7ec..89695c21b2 100644
--- a/django/models/core.py
+++ b/django/models/core.py
@@ -1,9 +1,12 @@
from django.core import meta, validators
+from django.utils.translation import gettext_lazy as _
class Site(meta.Model):
- domain = meta.CharField('domain name', maxlength=100)
- name = meta.CharField('display name', maxlength=50)
+ domain = meta.CharField(_('domain name'), maxlength=100)
+ name = meta.CharField(_('display name'), maxlength=50)
class META:
+ verbose_name = _('site')
+ verbose_name_plural = _('sites')
db_table = 'sites'
ordering = ('domain',)
@@ -16,9 +19,11 @@ class Site(meta.Model):
return get_object(pk=SITE_ID)
class Package(meta.Model):
- label = meta.CharField(maxlength=20, primary_key=True)
- name = meta.CharField(maxlength=30, unique=True)
+ label = meta.CharField(_('label'), maxlength=20, primary_key=True)
+ name = meta.CharField(_('name'), maxlength=30, unique=True)
class META:
+ verbose_name = _('package')
+ verbose_name_plural = _('packages')
db_table = 'packages'
ordering = ('name',)
@@ -26,10 +31,12 @@ class Package(meta.Model):
return self.name
class ContentType(meta.Model):
- name = meta.CharField(maxlength=100)
+ name = meta.CharField(_('name'), maxlength=100)
package = meta.ForeignKey(Package, db_column='package')
- python_module_name = meta.CharField(maxlength=50)
+ python_module_name = meta.CharField(_('python module name'), maxlength=50)
class META:
+ verbose_name = _('content type')
+ verbose_name_plural = _('content types')
db_table = 'content_types'
ordering = ('package', 'name')
unique_together = (('package', 'python_module_name'),)
@@ -52,11 +59,13 @@ class ContentType(meta.Model):
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://'.")
+ 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',)
@@ -69,18 +78,19 @@ class Redirect(meta.Model):
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(maxlength=200)
- content = meta.TextField()
- enable_comments = meta.BooleanField()
- template_name = meta.CharField(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(help_text="If this is checked, only logged-in users will be able to view the page.")
+ 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 = _('flat page')
+ verbose_name_plural = _('flat pages')
ordering = ('url',)
admin = meta.Admin(
fields = (
@@ -101,10 +111,12 @@ import base64, md5, random, sys
import cPickle as pickle
class Session(meta.Model):
- session_key = meta.CharField(maxlength=40, primary_key=True)
- session_data = meta.TextField()
- expire_date = meta.DateTimeField()
+ session_key = meta.CharField(_('session key'), maxlength=40, primary_key=True)
+ session_data = meta.TextField(_('session data'))
+ expire_date = meta.DateTimeField(_('expire date'))
class META:
+ verbose_name = _('session')
+ verbose_name_plural = _('sessions')
module_constants = {
'base64': base64,
'md5': md5,
diff --git a/django/templatetags/i18n.py b/django/templatetags/i18n.py
new file mode 100644
index 0000000000..e9702f2dc3
--- /dev/null
+++ b/django/templatetags/i18n.py
@@ -0,0 +1,217 @@
+"Default tags used by the template system, available to all templates."
+
+from django.core.template import Node, NodeList, Template, Context, resolve_variable, resolve_variable_with_filters, registered_filters
+from django.core.template import TemplateSyntaxError, register_tag, TokenParser
+from django.core.template import TOKEN_BLOCK, TOKEN_TEXT, TOKEN_VAR
+from django.utils import translation
+
+import sys
+import re
+
+class GetAvailableLanguagesNode(Node):
+
+ def __init__(self, variable):
+ self.variable = variable
+
+ def render(self, context):
+ from django.conf.settings import LANGUAGES
+ context[self.variable] = LANGUAGES
+ return ''
+
+class GetCurrentLanguageNode(Node):
+
+ def __init__(self, variable):
+ self.variable = variable
+
+ def render(self, context):
+ context[self.variable] = translation.get_language()
+ return ''
+
+class TranslateNode(Node):
+
+ def __init__(self, value, noop):
+ self.value = value
+ self.noop = noop
+
+ def render(self, context):
+ value = resolve_variable(self.value, context)
+ if self.noop:
+ return value
+ else:
+ return translation.gettext(value)
+
+class BlockTranslateNode(Node):
+
+ def __init__(self, extra_context, singular, plural=None, countervar=None, counter=None):
+ self.extra_context = extra_context
+ self.singular = singular
+ self.plural = plural
+ self.countervar = countervar
+ self.counter = counter
+
+ def render_token_list(self, tokens):
+ result = []
+ for token in tokens:
+ if token.token_type == TOKEN_TEXT:
+ result.append(token.contents)
+ elif token.token_type == TOKEN_VAR:
+ result.append('%%(%s)s' % token.contents)
+ return ''.join(result)
+
+ def render(self, context):
+ context.push()
+ for var,val in self.extra_context.items():
+ context[var] = resolve_variable_with_filters(val, context)
+ singular = self.render_token_list(self.singular) % context
+ if self.plural and self.countervar and self.counter:
+ count = resolve_variable_with_filters(self.counter, context)
+ context[self.countervar] = count
+ plural = self.render_token_list(self.plural) % context
+ result = translation.ngettext(singular, plural, count) % context
+ else:
+ result = translation.gettext(singular) % context
+ context.pop()
+ return result
+
+def do_get_available_languages(parser, token):
+ """
+ This will store a list of available languages
+ in the context.
+
+ Usage is as follows::
+
+ {% get_available_languages as languages %}
+ {% for language in languages %}
+ ...
+ {% endfor %}
+
+ This will just pull the LANGUAGES setting from
+ your setting file (or the default settings) and
+ put it into the named variable.
+ """
+
+ args = token.contents.split()
+ if len(args) != 3 or args[1] != 'as':
+ raise TemplateSyntaxError, "'get_available_languages' requires 'as variable' (got %r)" % args
+ return GetAvailableLanguagesNode(args[2])
+
+def do_get_current_language(parser, token):
+ """
+ This will store the current language in
+ the context.
+
+ Usage is as follows::
+
+ {% get_current_language as language %}
+
+ This will fetch the currently active language and
+ put it's value into the ``language`` context
+ variable.
+ """
+
+ args = token.contents.split()
+ if len(args) != 3 or args[1] != 'as':
+ raise TemplateSyntaxError, "'get_available_languages' requires 'as variable' (got %r)" % args
+ return GetCurrentLanguageNode(args[2])
+
+def do_translate(parser, token):
+ """
+ This will mark a string for translation and will
+ translate the string for the current language.
+
+ Usage is like this::
+
+ {% trans "this is a test" %}
+
+ This will mark the string for translation so it will
+ be pulled out by mark-messages.py into the .po files
+ and will run the string through the translation engine.
+
+ There is a second form::
+
+ {% trans "this is a test" noop %}
+
+ This will only mark for translation, but will return
+ the string unchanged. Use it when you need to store
+ values into forms that should be translated later on.
+
+ You can use variables instead of constant strings
+ to translate stuff you marked somewhere else::
+
+ {% trans variable %}
+
+ This will just try to translate the contents of
+ the variable ``variable``. Make sure that the string
+ in there is something that is in the .po file.
+ """
+
+ class TranslateParser(TokenParser):
+
+ def top(self):
+ value = self.value()
+ if self.more():
+ if self.tag() == 'noop':
+ noop = True
+ else:
+ raise TemplateSyntaxError, "only option for 'trans' is 'noop'"
+ else:
+ noop = False
+ return (value, noop)
+
+ (value, noop) = TranslateParser(token.contents).top()
+ return TranslateNode(value, noop)
+
+def do_block_translate(parser, token):
+ """
+ """
+ class BlockTranslateParser(TokenParser):
+
+ def top(self):
+ countervar = None
+ counter = None
+ extra_context = {}
+ while self.more():
+ tag = self.tag()
+ if tag == 'with' or tag == 'and':
+ value = self.value()
+ if self.tag() != 'as':
+ raise TemplateSyntaxError, "variable bindings in 'blocktrans' must be 'with value as variable'"
+ extra_context[self.tag()] = value
+ elif tag == 'count':
+ counter = self.value()
+ if self.tag() != 'as':
+ raise TemplateSyntaxError, "counter specification in 'blocktrans' must be 'count value as variable'"
+ countervar = self.tag()
+ else:
+ raise TemplateSyntaxError, "unknown subtag %s for 'blocktrans' found" % tag
+ return (countervar, counter, extra_context)
+
+ (countervar, counter, extra_context) = BlockTranslateParser(token.contents).top()
+
+ singular = []
+ plural = []
+ while parser.tokens:
+ token = parser.next_token()
+ if token.token_type in (TOKEN_VAR, TOKEN_TEXT):
+ singular.append(token)
+ else:
+ break
+ if countervar and counter:
+ if token.contents.strip() != 'plural':
+ raise TemplateSyntaxError, "'blocktrans' doesn't allow other block tags inside it" % tag
+ while parser.tokens:
+ token = parser.next_token()
+ if token.token_type in (TOKEN_VAR, TOKEN_TEXT):
+ plural.append(token)
+ else:
+ break
+ if token.contents.strip() != 'endblocktrans':
+ raise TemplateSyntaxError, "'blocktrans' doesn't allow other block tags (seen %r) inside it" % token.contents
+
+ return BlockTranslateNode(extra_context, singular, plural, countervar, counter)
+
+register_tag('get_available_languages', do_get_available_languages)
+register_tag('get_current_language', do_get_current_language)
+register_tag('trans', do_translate)
+register_tag('blocktrans', do_block_translate)
+
diff --git a/django/utils/dates.py b/django/utils/dates.py
index 2ae0cc1a6e..12fb7b2b76 100644
--- a/django/utils/dates.py
+++ b/django/utils/dates.py
@@ -1,17 +1,19 @@
"Commonly-used date structures"
+from django.utils.translation import gettext_lazy as _
+
WEEKDAYS = {
- 0:'Monday', 1:'Tuesday', 2:'Wednesday', 3:'Thursday', 4:'Friday',
- 5:'Saturday', 6:'Sunday'
+ 0:_('Monday'), 1:_('Tuesday'), 2:_('Wednesday'), 3:_('Thursday'), 4:_('Friday'),
+ 5:_('Saturday'), 6:_('Sunday')
}
WEEKDAYS_REV = {
'monday':0, 'tuesday':1, 'wednesday':2, 'thursday':3, 'friday':4,
'saturday':5, 'sunday':6
}
MONTHS = {
- 1:'January', 2:'February', 3:'March', 4:'April', 5:'May', 6:'June',
- 7:'July', 8:'August', 9:'September', 10:'October', 11:'November',
- 12:'December'
+ 1:_('January'), 2:_('February'), 3:_('March'), 4:_('April'), 5:_('May'), 6:_('June'),
+ 7:_('July'), 8:_('August'), 9:_('September'), 10:_('October'), 11:_('November'),
+ 12:_('December')
}
MONTHS_3 = {
1:'jan', 2:'feb', 3:'mar', 4:'apr', 5:'may', 6:'jun', 7:'jul', 8:'aug',
@@ -22,6 +24,6 @@ MONTHS_3_REV = {
'sep':9, 'oct':10, 'nov':11, 'dec':12
}
MONTHS_AP = { # month names in Associated Press style
- 1:'Jan.', 2:'Feb.', 3:'March', 4:'April', 5:'May', 6:'June', 7:'July',
- 8:'Aug.', 9:'Sept.', 10:'Oct.', 11:'Nov.', 12:'Dec.'
+ 1:_('Jan.'), 2:_('Feb.'), 3:_('March'), 4:_('April'), 5:_('May'), 6:_('June'), 7:_('July'),
+ 8:_('Aug.'), 9:_('Sept.'), 10:_('Oct.'), 11:_('Nov.'), 12:_('Dec.')
}
diff --git a/django/utils/functional.py b/django/utils/functional.py
index f3b0598763..2b3ca8293e 100644
--- a/django/utils/functional.py
+++ b/django/utils/functional.py
@@ -2,3 +2,64 @@ def curry(*args, **kwargs):
def _curried(*moreargs, **morekwargs):
return args[0](*(args[1:]+moreargs), **dict(kwargs.items() + morekwargs.items()))
return _curried
+
+def lazy(func, *resultclasses):
+
+ """
+ lazy turns any callable passed in into a lazy evaluated callable.
+ you need to give result classes or types - at least one is needed
+ so that the automatic forcing of the lazy evaluation code is
+ triggered. Results are not memoized - the function is evaluated
+ on every access.
+ """
+
+ class __proxy__:
+
+ """
+ This inner class encapsulates the code that should be evaluated
+ lazyly. On calling of one of the magic methods it will force
+ the evaluation and store the result - afterwards the result
+ is delivered directly. So the result is memoized.
+ """
+
+ def __init__(self, args, kw):
+ self.__func = func
+ self.__args = args
+ self.__kw = kw
+ self.__dispatch = {}
+ for resultclass in resultclasses:
+ self.__dispatch[resultclass] = {}
+ for (k, v) in resultclass.__dict__.items():
+ setattr(self, k, self.__promise__(resultclass, k, v))
+
+ def __promise__(self, klass, funcname, func):
+
+ """
+ This function builds a wrapper around some magic method and
+ registers that magic method for the given type and methodname.
+ """
+
+ def __wrapper__(*args, **kw):
+ """
+ This wrapper function automatically triggers the evaluation of
+ a lazy value. It then applies the given magic method of the
+ result type.
+ """
+ res = self.__func(*self.__args, **self.__kw)
+ return self.__dispatch[type(res)][funcname](res, *args, **kw)
+
+ if not self.__dispatch.has_key(klass):
+ self.__dispatch[klass] = {}
+ self.__dispatch[klass][funcname] = func
+ return __wrapper__
+
+ def __wrapper__(*args, **kw):
+ """
+ This wrapper function just creates the proxy object that is returned
+ instead of the actual value.
+ """
+ return __proxy__(args, kw)
+
+ return __wrapper__
+
+
diff --git a/django/utils/text.py b/django/utils/text.py
index 0d6f20a7d6..6ac8352ac6 100644
--- a/django/utils/text.py
+++ b/django/utils/text.py
@@ -55,7 +55,7 @@ def get_text_list(list_, last_word='or'):
"""
if len(list_) == 0: return ''
if len(list_) == 1: return list_[0]
- return '%s %s %s' % (', '.join([i for i in list_][:-1]), last_word, list_[-1])
+ return '%s %s %s' % (', '.join([str(i) for i in list_][:-1]), last_word, list_[-1])
def normalize_newlines(text):
return re.sub(r'\r\n|\r|\n', '\n', text)
diff --git a/django/utils/translation.py b/django/utils/translation.py
new file mode 100644
index 0000000000..0d40a636c8
--- /dev/null
+++ b/django/utils/translation.py
@@ -0,0 +1,447 @@
+"translation helper functions"
+
+import os
+import re
+import sys
+import gettext as gettext_module
+from cStringIO import StringIO
+
+from django.utils.functional import lazy
+
+try:
+ import threading
+ hasThreads = True
+except ImportError:
+ hasThreads = False
+
+if hasThreads:
+ currentThread = threading.currentThread
+else:
+ def currentThread():
+ return 'no threading'
+
+# translations are cached in a dictionary for
+# every language+app tuple. The active translations
+# are stored by threadid to make them thread local.
+_translations = {}
+_active = {}
+
+# the default translation is based on the settings file
+_default = None
+
+# this is a cache for accept-header to translation
+# object mappings to prevent the accept parser to
+# run multiple times for one user
+_accepted = {}
+
+def to_locale(language):
+ "turn a language name (en-us) into a locale name (en_US)"
+ p = language.find('-')
+ if p >= 0:
+ return language[:p].lower()+'_'+language[p+1:].upper()
+ else:
+ return language.lower()
+
+def to_language(locale):
+ "turns a locale name (en_US) into a language name (en-us)"
+ p = locale.find('_')
+ if p >= 0:
+ return locale[:p].lower()+'-'+locale[p+1:].lower()
+ else:
+ return locale.lower()
+
+class DjangoTranslation(gettext_module.GNUTranslations):
+ """
+ This class sets up the GNUTranslations context with
+ regard to output charset. Django uses a defined
+ DEFAULT_CHARSET as the output charset on Python 2.4 -
+ with Python 2.3, you need to use DjangoTranslation23.
+ """
+
+ def __init__(self, *args, **kw):
+ from django.conf import settings
+ gettext_module.GNUTranslations.__init__(self, *args, **kw)
+ # starting with Python 2.4, there is a function to define
+ # the output charset. Before 2.4, the output charset is
+ # identical with the translation file charset.
+ try:
+ self.set_output_charset(settings.DEFAULT_CHARSET)
+ except AttributeError:
+ pass
+ self.django_output_charset = settings.DEFAULT_CHARSET
+ self.__language = '??'
+
+ def merge(self, other):
+ self._catalog.update(other._catalog)
+
+ def set_language(self, language):
+ self.__language = language
+
+ def language(self):
+ return self.__language
+
+ def __repr__(self):
+ return "<DjangoTranslation lang:%s>" % self.__language
+
+
+class DjangoTranslation23(DjangoTranslation):
+
+ """
+ This is a compatibility class that is only used with Python 2.3.
+ The reason is, Python 2.3 doesn't support set_output_charset on
+ translation objects and so needs this wrapper class to make sure
+ that input charsets from translation files are correctly translated
+ to output charsets.
+
+ With a full switch to Python 2.4, this can be removed from the source.
+ """
+
+ def gettext(self, msgid):
+ res = self.ugettext(msgid)
+ return res.encode(self.django_output_charset)
+
+ def ngettext(self, msgid1, msgid2, n):
+ res = self.ungettext(msgid1, msgid2, n)
+ return res.encode(self.django_output_charset)
+
+def translation(language):
+ """
+ This function returns a translation object. app must be the fully
+ qualified name of the application.
+
+ This translation object will be constructed out of multiple GNUTranslations
+ objects by merging their catalogs. It will construct a object for the requested
+ language and add a fallback to the default language, if that is different
+ from the requested language.
+ """
+ global _translations
+
+ t = _translations.get(language, None)
+ if t is not None:
+ return t
+
+ from django.conf import settings
+
+ # set up the right translation class
+ klass = DjangoTranslation
+ if sys.version_info < (2, 4):
+ klass = DjangoTranslation23
+
+ globalpath = os.path.join(os.path.dirname(settings.__file__), 'locale')
+
+ parts = os.environ['DJANGO_SETTINGS_MODULE'].split('.')
+ project = __import__(parts[0], {}, {}, [])
+ projectpath = os.path.join(os.path.dirname(project.__file__), 'locale')
+
+ def _fetch(lang, fallback=None):
+
+ global _translations
+
+ loc = to_locale(lang)
+
+ res = _translations.get(lang, None)
+ if res is not None:
+ return res
+
+ def _translation(path):
+ try:
+ t = gettext_module.translation('django', path, [loc], klass)
+ t.set_language(lang)
+ return t
+ except IOError, e:
+ return None
+
+ res = _translation(globalpath)
+
+ def _merge(path):
+ t = _translation(path)
+ if t is not None:
+ if res is None:
+ return t
+ else:
+ res.merge(t)
+ return res
+
+ if hasattr(settings, 'LOCALE_PATHS'):
+ for localepath in settings.LOCALE_PATHS:
+ if os.path.isdir(localepath):
+ res = _merge(localepath)
+
+ if os.path.isdir(projectpath):
+ res = _merge(projectpath)
+
+ for appname in settings.INSTALLED_APPS:
+ p = appname.rfind('.')
+ if p >= 0:
+ app = getattr(__import__(appname[:p], {}, {}, [appname[p+1:]]), appname[p+1:])
+ else:
+ app = __import__(appname, {}, {}, [])
+
+ apppath = os.path.join(os.path.dirname(app.__file__), 'locale')
+
+ if os.path.isdir(apppath):
+ res = _merge(apppath)
+
+ if res is None:
+ if fallback is not None:
+ res = fallback
+ else:
+ return gettext_module.NullTranslations()
+ _translations[lang] = res
+ return res
+
+ default_translation = _fetch(settings.LANGUAGE_CODE)
+ current_translation = _fetch(language, fallback=default_translation)
+
+ return current_translation
+
+def activate(language):
+ """
+ This function fetches the translation object for a given
+ tuple of application name and language and installs it as
+ the current translation object for the current thread.
+ """
+ _active[currentThread()] = translation(language)
+
+def deactivate():
+ """
+ This function deinstalls the currently active translation
+ object so that further _ calls will resolve against the
+ default translation object, again.
+ """
+ global _active
+
+ if _active.has_key(currentThread()):
+ del _active[currentThread()]
+
+def get_language():
+ """
+ This function returns the currently selected language.
+ """
+ t = _active.get(currentThread(), None)
+ if t is not None:
+ try:
+ return to_language(t.language())
+ except AttributeError:
+ pass
+ # if we don't have a real translation object, we assume
+ # it's the default language.
+ from django.conf.settings import LANGUAGE_CODE
+ return LANGUAGE_CODE
+
+def gettext(message):
+ """
+ This function will be patched into the builtins module to
+ provide the _ helper function. It will use the current
+ thread as a discriminator to find the translation object
+ to use. If no current translation is activated, the
+ message will be run through the default translation
+ object.
+ """
+ global _default, _active
+
+ t = _active.get(currentThread(), None)
+ if t is not None:
+ return t.gettext(message)
+ if _default is None:
+ from django.conf import settings
+ _default = translation(settings.LANGUAGE_CODE)
+ return _default.gettext(message)
+
+def gettext_noop(message):
+ """
+ This function is used to just mark strings for translation
+ but to not translate them now. This can be used to store
+ strings in global variables that should stay in the base
+ language (because they might be used externally) and will
+ be translated later on.
+ """
+ return message
+
+def ngettext(singular, plural, number):
+ """
+ This function returns the translation of either the singular
+ or plural, based on the number.
+ """
+ global _default, _active
+
+ t = _active.get(currentThread(), None)
+ if t is not None:
+ return t.ngettext(singular, plural, number)
+ if _default is None:
+ from django.conf import settings
+ _default = translation('*', settings.LANGUAGE_CODE)
+ return _default.ngettext(singular, plural, number)
+
+gettext_lazy = lazy(gettext, str)
+ngettext_lazy = lazy(ngettext, str)
+
+def check_for_language(lang_code):
+ """
+ This function checks wether there is a global language
+ file for the given language code. This is used to decide
+ wether a user-provided language is available.
+ """
+ from django.conf import settings
+ globalpath = os.path.join(os.path.dirname(settings.__file__), 'locale')
+ if gettext_module.find('django', globalpath, [to_locale(lang_code)]) is not None:
+ return True
+ else:
+ return False
+
+def get_language_from_request(request):
+ """
+ analyze the request to find what language the user
+ wants the system to show.
+ """
+ global _accepted
+
+ from django.conf import settings
+ globalpath = os.path.join(os.path.dirname(settings.__file__), 'locale')
+
+ if hasattr(request, 'session'):
+ lang_code = request.session.get('django_language', None)
+ if lang_code is not None and check_for_language(lang_code):
+ return lang_code
+
+ lang_code = request.COOKIES.get('django_language', None)
+ if lang_code is not None and check_for_language(lang_code):
+ return lang_code
+
+ accept = request.META.get('HTTP_ACCEPT_LANGUAGE', None)
+ if accept is not None:
+
+ t = _accepted.get(accept, None)
+ if t is not None:
+ return t
+
+ def _parsed(el):
+ p = el.find(';q=')
+ if p >= 0:
+ lang = el[:p].strip()
+ order = int(float(el[p+3:].strip())*100)
+ else:
+ lang = el
+ order = 100
+ if lang.find('-') >= 0:
+ (lang, sublang) = lang.split('-')
+ lang = lang.lower() + '_' + sublang.upper()
+ return (lang, order)
+
+ langs = [_parsed(el) for el in accept.split(',')]
+ langs.sort(lambda a,b: -1*cmp(a[1], b[1]))
+
+ for lang, order in langs:
+ langfile = gettext_module.find('django', globalpath, [to_locale(lang)])
+ if langfile:
+ # reconstruct the actual language from the language
+ # filename, because otherwise we might incorrectly
+ # report de_DE if we only have de available, but
+ # did find de_DE because of language normalization
+ lang = langfile[len(globalpath):].split('/')[1]
+ _accepted[accept] = lang
+ return lang
+
+ return settings.LANGUAGE_CODE
+
+def install():
+ """
+ This installs the gettext function as the default
+ translation function under the name _.
+ """
+ __builtins__['_'] = gettext
+
+
+dot_re = re.compile(r'\S')
+def blankout(src, char):
+ """
+ This is used in the templateize function and changes every
+ non-whitespace character to the given char.
+ """
+ return dot_re.sub(char, src)
+
+inline_re = re.compile(r"""^\s*trans\s+((?:".*?")|(?:'.*?'))\s*""")
+block_re = re.compile(r"""^\s*blocktrans(?:\s+|$)""")
+endblock_re = re.compile(r"""^\s*endblocktrans$""")
+plural_re = re.compile(r"""^\s*plural$""")
+constant_re = re.compile(r"""_\(((?:".*?")|(?:'.*?'))\)""")
+def templateize(src):
+ from django.core.template import tokenize, TOKEN_TEXT, TOKEN_VAR, TOKEN_BLOCK
+ """
+ This function turns a django template into something that is
+ understood by xgettext. It does so by translating the django
+ translation tags into standard gettext function invocations.
+ """
+ out = StringIO()
+ intrans = False
+ inplural = False
+ singular = []
+ plural = []
+ for t in tokenize(src):
+ if intrans:
+ if t.token_type == TOKEN_BLOCK:
+ endbmatch = endblock_re.match(t.contents)
+ pluralmatch = plural_re.match(t.contents)
+ if endbmatch:
+ if inplural:
+ out.write(' ngettext(%r,%r,count) ' % (''.join(singular), ''.join(plural)))
+ for part in singular:
+ out.write(blankout(part, 'S'))
+ for part in plural:
+ out.write(blankout(part, 'P'))
+ else:
+ out.write(' gettext(%r) ' % ''.join(singular))
+ for part in singular:
+ out.write(blankout(part, 'S'))
+ intrans = False
+ inplural = False
+ singular = []
+ plural = []
+ elif pluralmatch:
+ inplural = True
+ else:
+ raise SyntaxError, "translation blocks must not include other block tags: %s" % t.contents
+ elif t.token_type == TOKEN_VAR:
+ if inplural:
+ plural.append('%%(%s)s' % t.contents)
+ else:
+ singular.append('%%(%s)s' % t.contents)
+ elif t.token_type == TOKEN_TEXT:
+ if inplural:
+ plural.append(t.contents)
+ else:
+ singular.append(t.contents)
+ else:
+ if t.token_type == TOKEN_BLOCK:
+ imatch = inline_re.match(t.contents)
+ bmatch = block_re.match(t.contents)
+ cmatches = constant_re.findall(t.contents)
+ if imatch:
+ g = imatch.group(1)
+ if g[0] == '"': g = g.strip('"')
+ elif g[0] == "'": g = g.strip("'")
+ out.write(' gettext(%r) ' % g)
+ elif bmatch:
+ intrans = True
+ inplural = False
+ singular = []
+ plural = []
+ elif cmatches:
+ for cmatch in cmatches:
+ out.write(' _(%s) ' % cmatch)
+ else:
+ out.write(blankout(t.contents, 'B'))
+ elif t.token_type == TOKEN_VAR:
+ parts = t.contents.split('|')
+ cmatch = constant_re.match(parts[0])
+ if cmatch:
+ out.write(' _(%s) ' % cmatch.group(1))
+ for p in parts[1:]:
+ if p.find(':_(') >= 0:
+ out.write(' %s ' % p.split(':',1)[1])
+ else:
+ out.write(blankout(p, 'F'))
+ else:
+ out.write(blankout(t.contents, 'X'))
+ return out.getvalue()
+
diff --git a/django/views/i18n.py b/django/views/i18n.py
new file mode 100644
index 0000000000..7bb2f00b2f
--- /dev/null
+++ b/django/views/i18n.py
@@ -0,0 +1,22 @@
+from django.utils import httpwrappers
+from django.utils.translation import check_for_language
+
+def set_language(request):
+ """
+ Redirect to a given url while setting the chosen language in the
+ session or cookie. The url and the language code need to be
+ specified in the GET paramters.
+ """
+ lang_code = request.GET['language']
+ next = request.GET.get('next', None)
+ if not next:
+ next = request.META.get('HTTP_REFERER', None)
+ if not next:
+ next = '/'
+ response = httpwrappers.HttpResponseRedirect(next)
+ if check_for_language(lang_code):
+ if hasattr(request, 'session'):
+ request.session['django_language'] = lang_code
+ else:
+ response.set_cookie('django_language', lang_code)
+ return response
diff --git a/docs/settings.txt b/docs/settings.txt
index acbbca96d4..1d65d44c88 100644
--- a/docs/settings.txt
+++ b/docs/settings.txt
@@ -355,9 +355,12 @@ See http://www.thaiopensource.com/relaxng/jing.html .
LANGUAGE_CODE
-------------
-Default: ``'en-us'``
+Default: ``'en'``
-A string representing the language code for this installation.
+A string representing the language code for this installation. This should
+be in locale format, that's 'en_US' for us-english. If you want to send
+out the language in your HTML code, use the LANGUAGE_CODE attribute of the
+request, instead, as the chosen language will depend on the browsers settings.
MANAGERS
--------
diff --git a/docs/translation.txt b/docs/translation.txt
new file mode 100644
index 0000000000..637719b879
--- /dev/null
+++ b/docs/translation.txt
@@ -0,0 +1,438 @@
+======================
+How to do translations
+======================
+
+Django has support for internationalization of program strings and template
+content. Translations use the ``gettext`` library to produce strings in several
+languages. Here's an overview of how translation works with Django.
+
+The goal of this document is to explain how to use translations in projects,
+how to add translations to Django patches and how to update and create
+translation files.
+
+Using translations in Python
+============================
+
+The translation machinery in Django uses the standard ``gettext`` module that
+comes with Python. Django uses in its own functions and classes, but it uses
+standard ``gettext`` machinery under the hood.
+
+To translate strings in your code, use one of the ``gettext`` helper functions.
+There are essentially two ways to use them:
+
+ * Use the ``_()`` function, which is available globally. This function
+ translates any string value.
+ * Use ``django.utils.translation`` and import ``gettext`` or
+ ``gettext_noop`` from there. ``gettext`` is identical to ``_()``.
+
+Note one important thing about translations: The system can only translate
+strings it knows about. That means you have to mark strings for translation.
+This is done either by calling ``_()``, ``gettext()`` or ``gettext_noop()`` on
+string constants. You can translate variable values or computed values, but the
+system needs to know those strings beforehand.
+
+The usual method is to build your strings using string interpolation and using
+the ``gettext`` functions to do the actual translation. Example::
+
+ def hello_world(request, name, site):
+ page = _('Hello %(name)s, welcome to %(site)s!') % {
+ 'name': name,
+ 'site': site,
+ }
+ return HttpResponse(page)
+
+This short snippet shows one important thing: You shouldn't use positional
+string interpolation (e.g., ``%s`` or ``%d``). Use the named string
+interpolation (e.g., ``%(name)s``), instead. Do this because other languages
+might require reordering of text.
+
+The other two helper functions are similar::
+
+ from django.utils.translation import gettext
+ def hello_world(request, name, site):
+ page = gettext('Hello %(name)s, welcome to %(site)s!') % {
+ 'name': name,
+ 'site': site,
+ }
+ return HttpResponse(page)
+
+The difference here is that ``gettext`` is explicitly imported.
+
+Two important helper functions are available: ``gettext`` and ``gettext_noop``.
+
+ * ``gettext`` is just like ``_()`` -- it translates its argument.
+ * ``gettext_noop`` is different. It marks a string for inclusion into the
+ message file but doesn't do translation. Instead, the string is later
+ translated from a variable. Use this if you have constant strings that
+ should be stored in the source language because they are exchanged over
+ systems or users -- such as strings in a database -- but should be
+ translated at the last possible point in time, such as when the string is
+ presented to the user.
+
+One function, ``django.utils.translation.gettext_lazy()``, isn't available in
+the standard ``gettext`` module. Use it for lazily translated strings, such as
+messages in Django models that are stored internally and translated on access
+-- but not translated on storage, as that would only take the default language
+into account.
+
+For example, to translate a model's ``help_text``, do the following::
+
+ from django.utils.translation import gettext_lazy
+
+ class MyThing(meta.Model):
+ name = meta.CharField(help_text=gettext_lazy('This is the help text'))
+
+In this example, ``gettext_lazy()`` stores a lazy reference to the string --
+not the actual translation. The translation itself will be done when the string
+is used in a string context, such as template rendering on the Django admin site.
+
+If you don't like the verbose name ``gettext_lazy``, you can just alias it as
+``_``, like so::
+
+ from django.utils.translation import gettext_lazy as _
+
+ class MyThing(meta.Model):
+ name = meta.CharField(help_text=_('This is the help text'))
+
+Always use lazy translations in Django models. And it's a good idea to add
+translations for the field names and table names, too. This means writing
+explicit ``verbose_name`` and ``verbose_name_plural`` options in the ``META``
+class, though::
+
+ from django.utils.translation import gettext_lazy as _
+
+ class MyThing(meta.Model):
+ name = meta.CharField(_('name'), help_text=_('This is the help text'))
+ class META:
+ verbose_name = _('my thing')
+ verbose_name_plural = _('mythings')
+
+A standard problem with translations is pluralization of strings. Use
+``ngettext`` to solve this problem. Example::
+
+ def hello_world(request, count):
+ from django.utils.translation import ngettext
+ page = ngettext('there is %(count)d object', 'there are %(count)d objects', count) % {
+ 'count': count,
+ }
+ return HttpResponse(page)
+
+Using translations in templates
+===============================
+
+Using translations in Django templates uses two template tags and a slightly
+different syntax than standard gettext. The ``{% trans %}`` template tag
+translates a constant string or a variable content::
+
+ <title>{% trans 'This is the title.' %}</title>
+
+If you only want to mark some value for translation, but translate it
+later from a variable, use the ``noop`` option::
+
+ <input name="field" value="{% trans "value" noop %}"/>
+
+It is not possible to use variables in this constant string. If you
+have variables you need to put in your translations, you have to use the
+``{% blocktrans %}`` tag::
+
+ {% blocktrans %}This will have {{ value }} inside{% endblocktrans %}
+
+If your expressions are more complex (like you need to have filters applied),
+you need to bind them to local variables for the translation block::
+
+ {% blocktrans with value|filter as variable %}
+ This will have {{ value }} inside
+ {% endblocktrans %}
+
+The last variant is the pluralization form: you need to specify both the singular
+and plural sentence with intersparsed variables like this::
+
+ {% blocktrans count list|counted as counter %}
+ There is only one {{ name }} object.
+ {% plural %}
+ There are {{ counter }} {{ name }} objects.
+ {% endblocktrans %}
+
+Internally all block translations and inline translations are translated into
+the actual gettext/ngettext call.
+
+Each ``DjangoContext`` has access to two 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).
+ * ``LANGUAGE_CODE`` is the current user's preferred language, as a string.
+ Example: ``en-us``. (See "How language preference is discovered", below.)
+
+If you don't use the ``DjangoContext`` extension, you can get those values with
+two tags::
+
+ {% get_current_language as LANGUAGE_CODE %}
+ {% get_available_languages as LANGUAGES %}
+
+All tags live in the ``i18n`` tag library, so you need to specify
+``{% load i18n %}`` in the head of your template to make use of them.
+
+There are some places where you will encounter constant strings in your template code.
+One is filter arguments, the other are normal string constants for tags. If you need to
+translate those, you can use the ``_("....")`` syntax::
+
+ {% some_special_tag _("Page not found") value|yesno:_("yes,no") %}
+
+In this case both the filter and the tag will see the already translated string, so they
+don't need to be aware of translations. And both strings will be pulled out of the templates
+for translation and stored in the .po files.
+
+The ``setlang`` redirect view
+-----------------------------
+
+Django comes with a view, ``django.views.i18n.set_language`` that sets a user's
+language preference and redirects back to the previous page. For example, put
+this HTML code in your template::
+
+ <form action="/i18n/setlang/" method="POST">
+ <input name="next" type="hidden" value="/next/page/" />
+ <select name="language">
+ {% for lang in LANGUAGES %}
+ <option value="{{ lang.0 }}">{{ lang.1 }}</option>
+ {% endfor %}
+ </select>
+ <input type="submit" value="Go" />
+ </form>
+
+When a user submits the form, his chosen language will be saved in a cookie,
+and he'll be redirected either to the URL specified in the ``next`` field, or,
+if ``next`` is empty, to the URL in the ``Referer`` header. If the ``Referer``
+is blank -- say, if a user's browser suppresses that header -- then the user
+will be redirected to ``/`` (the site root) as a fallback.
+
+Activate the ``setlang`` redirect view by adding the following line to your
+URLconf::
+
+ (r'^i18n/', include('django.conf.urls.i18n'),
+
+Note that this example makes the view available at ``/i18n/setlang/``.
+
+How language preference is discovered
+=====================================
+
+Django has a very flexible model of deciding which language should be used --
+installation-wide, for a particular user, or both.
+
+To set an installation-wide language preference, set ``LANGUAGE_CODE`` in your
+settings file. Django uses this language as the default translation -- the
+final attempt if no other translator finds a translation.
+
+If all you want to do is run Django with your native language, and a language
+file is available for your language, all you need to do is set
+``LANGUAGE_CODE``.
+
+If you want to let each individual user specify which language he or she
+prefers, use ``LocaleMiddleware``. ``LocaleMiddleware`` enables language
+selection based on data from the request. It lets each user have his or her own
+setting.
+
+To use ``LocaleMiddleware``, add ``'django.middleware.locale.LocaleMiddleware'``
+to your ``MIDDLEWARE_CLASSES`` setting. Because middleware order matters, you
+should follow these guidelines:
+
+ * Make sure it's one of the first middlewares installed.
+ * It should come after ``SessionMiddleware``, because ``LocaleMiddleware``
+ makes use of session data.
+
+For example, your ``MIDDLEWARE_CLASSES`` might look like this::
+
+ MIDDLEWARE_CLASSES = (
+ 'django.middleware.sessions.SessionMiddleware',
+ 'django.middleware.locale.LocaleMiddleware',
+ 'django.middleware.common.CommonMiddleware',
+ )
+
+``LocaleMiddleware`` tries to determine the user's language preference by
+following this algorithm:
+
+ * First, it looks for a ``django_language`` key in the the current user's
+ session.
+ * Failing that, it looks for a cookie called ``django_language``.
+ * Failing that, it looks at the ``Accept-Language`` HTTP header. This
+ header is sent by your browser and tells the server which language(s) you
+ prefer, in order by priority. Django tries each language in the header
+ until it finds one with available translations.
+ * Failing that, it uses the global ``LANGUAGE_CODE`` setting.
+
+Notes:
+
+ * In each of these places, the language preference is expected to be in the
+ standard language format, as a string. For example, Brazilian is
+ ``pt-br``.
+ * If a base language is available but the sublanguage specified is not,
+ Django uses the base language. For example, if a user specifies ``de-at``
+ (Austrian German) but Django only has ``de`` available, Django uses
+ ``de``.
+
+Once ``LocaleMiddleware`` determines the user's preference, it makes this
+preference available as ``request.LANGUAGE_CODE`` for each `request object`_.
+Feel free to read this value in your view code. Here's a simple example::
+
+ def hello_world(request, count):
+ if request.LANGUAGE_CODE == 'de-at':
+ return HttpResponse("You prefer to read Austrian German.")
+ else:
+ return HttpResponse("You prefer to read another language.")
+
+Note that, with static (middleware-less) translation, the language is in
+``settings.LANGUAGE_CODE``, while with dynamic (middleware) translation, it's
+in ``request.LANGUAGE_CODE``.
+
+.. _request object: http://www.djangoproject.com/documentation/request_response/#httprequest-objects
+
+Creating language files
+=======================
+
+So, you've tagged all of your strings for later translation. But you need to
+write the translations themselves.
+
+They need to be in a format grokable by ``gettext``. You need to update them.
+You may need to create new ones for new languages. This section shows you how
+to do it.
+
+Creating message files
+----------------------
+
+The first step is to create a message file for a new language. Django comes
+with a tool, ``make-messages.py``, that automates this.
+
+To run it on the Django source tree, navigate to the ``django`` directory
+itself -- not a Subversion check out, but the one linked to via ``$PYTHONPATH``
+or located somewhere on that path.
+
+Then run this command::
+
+ bin/make-messages.py -l de
+
+...where ``de`` is the language code for the message file you want to create.
+
+This script runs over the entire Django source tree and pulls out all strings
+marked for translation, creating or updating the language's message file.
+
+When it's done, it will have created (or updated) a message file under the
+directory ``conf/locale``. In this example, the file will be
+``conf/locale/de/LC_MESSAGES/django.po``.
+
+If you don't have the ``gettext`` utilities installed, ``make-messages.py``
+will create empty files. If that's the case, either install the ``gettext``
+utilities or just copy the English message file
+(``conf/locale/en/LC_MESSAGES/django.po``) and use it as a starting point; it's
+just an empty translation file.
+
+Once you've created the ``.po`` file, edit the file with your favorite text
+editor. First, edit the charset line (search for ``"CHARSET"``) and set it to
+the charset you'll be using to edit the content. Then, proceed to write your
+translations.
+
+The language code for storage is in locale format -- so it's ``pt_BR`` for
+Brazilian and ``de_AT`` for Austrian German.
+
+Every message in the message file is in the same format:
+
+ * One line is the msgid. This is the actual string in the source. Don't
+ change it.
+ * The other line is msgstr. This is the translation. It starts out empty.
+ You change it.
+
+Long messages are a special case. There, the first string directly after the
+msgstr (or msgid) is an empty string. Then the content itself will be written
+over the next few lines as one string per line. Those strings are directly
+concatenated. Don't forget trailing spaces within the strings; otherwise,
+they'll be tacked together without whitespace!
+
+Compiling message files
+-----------------------
+
+After you create your message file, you'll need to transform it into a more
+efficient form to be read by ``gettext``. Do this with the
+``compile-messages.py`` utility. This tool runs over all available ``.po``
+files and creates ``.mo`` files. Run it like this::
+
+ bin/compile-messages.py
+
+That's it. You made your first translation. Now, if you configure your browser
+to request your language, Django apps will use your language preference.
+
+Another thing: Please submit the name of your newly-created language in that
+native language, so we can add it to the global list of available languages
+that is mirrored in ``settings.LANGUAGES`` (and the ``LANGUAGES`` template
+variable).
+
+Using translations in your own projects
+=======================================
+
+Of course, your own projects should make use of translations. Django makes this
+simple, because it looks for message files in several locations.
+
+Django looks for translations by following this algorithm:
+
+ * First, it looks for a ``locale`` directory in the application directory
+ of the view that's being called. If it finds a translation for the
+ selected language, the translation will be installed.
+ * Next, it looks for a ``locale`` directory in the project directory. If it
+ finds a translation, the translation will be installed.
+ * Finally, it checks the base translation in ``django/conf/locale``.
+
+This way, you can write applications that include their own translations, and
+you can override base translations in your project path if you want to do that.
+Or, you can just build a big project out of several apps and put all
+translations into one big project message file. The choice is yours.
+
+All message file repositories are structured the same way. They are:
+
+ * ``$APPPATH/locale/<language>/LC_MESSAGES/django.(po|mo)``
+ * ``$PROJECTPATH/locale/<language>/LC_MESSAGES/django.(po|mo)``
+ * all paths listed in ``LOCALE_PATHS`` in your settings file are
+ searched in that order for ``<language>/LC_MESSAGES/django.(po|mo)``
+ * ``$PYTHONPATH/django/conf/locale/<language>/LC_MESSAGES/django.(po|mo)``
+
+To create message files, you use the same ``make-messages.py`` tool as with the
+Django message files. You only need to be in the right place -- in the directory
+where either the ``conf/locale`` (in case of the source tree) or the ``locale/``
+(in case of app messages or project messages) directory are located. And you
+use the same ``compile-messages.py`` to produce the binary ``django.mo`` files that
+are used by ``gettext``.
+
+Application message files are a bit complicated to discover -- they need the
+``LocaleMiddleware``. If you don't use the middleware, only the Django message
+files and project message files will be processed.
+
+Finally, you should give some thought to the structure of your translation
+files. If your applications need to be delivered to other users and will
+be used in other projects, you might want to use app-specific translations.
+But using app-specific translations and project translations could produce
+weird problems with ``make-messages``: ``make-messages`` will traverse all directories
+below the current path and so might put message IDs into the project
+message file that are already in application message files.
+
+The easiest way out is to store applications that are not part of the project
+(and so carry their own translations) outside the project tree. That way,
+``make-messages`` on the project level will only translate strings that are
+connected to your explicit project and not strings that are distributed
+independently.
+
+Specialities of Django translation
+==================================
+
+If you know ``gettext``, you might note these specialities in the way Django
+does translation:
+
+ * The string domain is always ``django``. The string domain is used to
+ differentiate between different programs that store their data in a
+ common messagefile library (usually ``/usr/share/locale/``). In Django's
+ case, there are Django-specific locale libraries, so the domain itself
+ isn't used. We could store app message files with different names and put
+ them, say, in the project library, but we decided against this. With
+ message files in the application tree, apps can be distributed more
+ easily.
+ * Django only uses ``gettext`` and ``gettext_noop``. That's because Django
+ always uses ``DEFAULT_CHARSET`` strings internally. There isn't much use
+ in using ``ugettext``, because you'll always need to produce utf-8
+ anyway.
+ * Django doesn't use ``xgettext`` alone. It uses Python wrappers around
+ ``xgettext`` and ``msgfmt``. That's mostly for convenience.
diff --git a/tests/othertests/templates.py b/tests/othertests/templates.py
index d451612713..ec6c55fb05 100644
--- a/tests/othertests/templates.py
+++ b/tests/othertests/templates.py
@@ -1,5 +1,6 @@
from django.core import template
from django.core.template import loader
+from django.utils.translation import activate, deactivate
# Helper objects for template tests
class SomeClass:
@@ -215,6 +216,45 @@ TEMPLATE_TESTS = {
# Raise exception for custom tags used in child with {% load %} tag in parent, not in child
'exception04': ("{% extends 'inheritance17' %}{% block first %}{% echo 400 %}5678{% endblock %}", {}, template.TemplateSyntaxError),
+
+ # simple translation of a string delimited by '
+ 'i18n01': ("{% load i18n %}{% trans 'xxxyyyxxx' %}", {}, "xxxyyyxxx"),
+
+ # simple translation of a string delimited by "
+ 'i18n02': ('{% load i18n %}{% trans "xxxyyyxxx" %}', {}, "xxxyyyxxx"),
+
+ # simple translation of a variable
+ 'i18n03': ('{% load i18n %}{% blocktrans %}{{ anton }}{% endblocktrans %}', {'anton': 'xxxyyyxxx'}, "xxxyyyxxx"),
+
+ # simple translation of a variable and filter
+ 'i18n04': ('{% load i18n %}{% blocktrans with anton|lower as berta %}{{ berta }}{% endblocktrans %}', {'anton': 'XXXYYYXXX'}, "xxxyyyxxx"),
+
+ # simple translation of a string with interpolation
+ 'i18n05': ('{% load i18n %}{% blocktrans %}xxx{{ anton }}xxx{% endblocktrans %}', {'anton': 'yyy'}, "xxxyyyxxx"),
+
+ # simple translation of a string to german
+ 'i18n06': ('{% load i18n %}{% trans "Page not found" %}', {'LANGUAGE_CODE': 'de'}, "Seite nicht gefunden"),
+
+ # translation of singular form
+ 'i18n07': ('{% load i18n %}{% blocktrans count number as counter %}singular{% plural %}plural{% endblocktrans %}', {'number': 1}, "singular"),
+
+ # translation of plural form
+ 'i18n08': ('{% load i18n %}{% blocktrans count number as counter %}singular{% plural %}plural{% endblocktrans %}', {'number': 2}, "plural"),
+
+ # simple non-translation (only marking) of a string to german
+ 'i18n09': ('{% load i18n %}{% trans "Page not found" noop %}', {'LANGUAGE_CODE': 'de'}, "Page not found"),
+
+ # translation of a variable with a translated filter
+ 'i18n10': ('{{ bool|yesno:_("ja,nein") }}', {'bool': True}, 'ja'),
+
+ # translation of a variable with a non-translated filter
+ 'i18n11': ('{{ bool|yesno:"ja,nein" }}', {'bool': True}, 'ja'),
+
+ # usage of the get_available_languages tag
+ 'i18n12': ('{% load i18n %}{% get_available_languages as langs %}{% for lang in langs %}{% ifequal lang.0 "de" %}{{ lang.0 }}{% endifequal %}{% endfor %}', {}, 'de'),
+
+ # translation of a constant string
+ 'i18n13': ('{{ _("Page not found") }}', {'LANGUAGE_CODE': 'de'}, 'Seite nicht gefunden'),
}
def test_template_loader(template_name, template_dirs=None):
@@ -233,6 +273,8 @@ def run_tests(verbosity=0, standalone=False):
tests = TEMPLATE_TESTS.items()
tests.sort()
for name, vals in tests:
+ if 'LANGUAGE_CODE' in vals[1]:
+ activate(vals[1]['LANGUAGE_CODE'])
try:
output = loader.get_template(name).render(template.Context(vals[1]))
except Exception, e:
@@ -244,6 +286,8 @@ def run_tests(verbosity=0, standalone=False):
print "Template test: %s -- FAILED. Got %s, exception: %s" % (name, e.__class__, e)
failed_tests.append(name)
continue
+ if 'LANGUAGE_CODE' in vals[1]:
+ deactivate()
if output == vals[2]:
if verbosity:
print "Template test: %s -- Passed" % name