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 Binary files /dev/null and b/django/conf/locale/cs/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/cs/LC_MESSAGES/django.po b/django/conf/locale/cs/LC_MESSAGES/django.po 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 Binary files /dev/null and b/django/conf/locale/de/LC_MESSAGES/django.mo 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 m�glicherweise 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 f�r Ihr " +"Verst�ndnis." + +#: 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 "Zuf�gen" + +#: 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 "K�rzliche 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 L�schung des %(object_name)s '%(object)s' h�tte die L�schung von " +"abh�ngigen Daten zur Folge, aber Sie haben nicht die n�tigen Rechte um die " +"folgenden abh�ngigen Daten zu l�schen:" + +#: 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\" l�schen wollen? Es " +"werden zus�tzlich die folgenden abh�ngigen Daten mit gel�scht:" + +#: 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 Kennwort�nderung" + +#: contrib/admin/templates/registration/password_change_done.html:12 +msgid "Your password was changed." +msgstr "Ihr Kennwort wurde ge�ndert." + +#: 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 zur�cksetzen" + +#: 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 zur�cksetzen" + +#: 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 zur�ckgesetzt" + +#: 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 K�rze 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 Sicherheitsgr�nden 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 "f�r 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 k�nnen 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 "Logeintr�ge" + +#: 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 "M�rz" + +#: 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 gef�llt ist, wird " +"'flatfiles/default' als Standard gew�hlt." + +#: 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, k�nnen 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 "" +"Zus�tzlich zu den manuell angelegten Rechten erh�lt 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 "Pers�nliche 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 "Franz�sisch" + +#: 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 Schr�gstriche " +"enthalten." + +#: core/validators.py:70 +msgid "Uppercase letters are not allowed here." +msgstr "Gro�buchstaben 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, g�ltige eMail-Adressen eingeben." + +#: core/validators.py:100 +msgid "Please enter a valid IP address." +msgstr "Bitte eine g�ltige 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 g�ltiges Datum im Format JJJJ-MM-TT eingeben." + +#: core/validators.py:129 +msgid "Enter a valid time in HH:MM format." +msgstr "Bitte eine g�ltige 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 g�ltige 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 g�ltige 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 g�ltiges Bild." + +#: core/validators.py:160 +#, python-format +msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid." +msgstr "" +"Telefonnummern m�ssen im Format XXX-XXX-XXXX sein. \"%s\" ist ung�ltig." + +#: 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 g�ltiges QuickTime video." + +#: core/validators.py:172 +msgid "A valid URL is required." +msgstr "Eine g�ltige URL ist hier verlangt." + +#: core/validators.py:186 +#, python-format +msgid "" +"Valid HTML is required. Specific errors are:\n" +"%s" +msgstr "" +"Bitte g�ltiges HTML eingeben. Fehler sind:\n" +"%s" + +#: core/validators.py:193 +#, python-format +msgid "Badly formed XML: %s" +msgstr "Ung�ltiges XML: %s" + +#: core/validators.py:203 +#, python-format +msgid "Invalid URL: %s" +msgstr "Ung�ltige 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 g�ltige Abk�rzung f�r 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 W�rter %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 ausf�llen." + +#: core/validators.py:261 core/validators.py:272 +msgid "Please enter both fields or leave them both empty." +msgstr "Bitte entweder beide Felder ausf�llen, 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 gef�llt 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 gef�llt 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 g�ltige 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 g�ltige Dezimalzahl mit maximal %s Ziffer eingeben." +msgstr[1] "Bitte eine g�ltige 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 g�ltige Dezimalzahl mit maximal %s Dezimalstelle eingeben." +msgstr[1] "" +"Bitte eine g�ltige 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 f�r dieses Feld ist falsch." + +#: core/validators.py:388 +msgid "This field is invalid." +msgstr "Dieses Feld ist ung�ltig." + +#: 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 schlie�en. 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 ung�ltig. 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 ung�ltig. 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 ung�ltigen Wert. Die Zeile " +"beginnt mit \"%(start)s\"." + +#: core/meta/fields.py:95 +msgid " Separate multiple IDs with commas." +msgstr "Mehrere IDs k�nnen 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 gedr�ckt 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 Binary files /dev/null and b/django/conf/locale/en/LC_MESSAGES/django.mo 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 Binary files /dev/null and b/django/conf/locale/es/LC_MESSAGES/django.mo 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 Espa�ol +# This file is distributed under the same license as the PACKAGE package. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. +# Ricardo Javier C�rdenes 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 C�rdenes Medina <ricardo.cardenes@gmail." +"com>\n" +"Language-Team: Espa�ol <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 "Hist�rico" + +#: 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 "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 objeto no tiene hist�rico de cambios. Probablemente no fue a�adido " +"usando este sitio de administraci�n." + +#: contrib/admin/templates/admin/base_site.html:4 +msgid "Django site admin" +msgstr "Sitio de administraci�n de Django" + +#: contrib/admin/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "Administraci�n de Django" + +#: contrib/admin/templates/admin/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 electr�nico y deber�a 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 "P�gina no encontrada" + +#: contrib/admin/templates/admin/404.html:10 +msgid "We're sorry, but the requested page could not be found." +msgstr "Lo sentimos, pero no se encuentra la p�gina solicitada." + +#: contrib/admin/templates/admin/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' provocar�a la eliminaci�n de " +"objetos relacionados, pero su cuenta no tiene permiso para borrar los " +"siguientes tipos de objetos:" + +#: contrib/admin/templates/admin/delete_confirmation.html: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 " +"borrar�n 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 direcci�n 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 "Direcci�n 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 "Recuperaci�n 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 direcci�n que ha suministrado. Deber�a " +"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 despu�s 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 p�gina:" + +#: contrib/admin/templates/registration/password_reset_email.html:11 +msgid "Your username, in case you've forgotten:" +msgstr "Su nombre de usuario, en caso de haberlo olvidado:" + +#: contrib/admin/templates/registration/password_reset_email.html:13 +msgid "Thanks for using our site!" +msgstr "�Gracias por usar nuestro sitio!" + +#: contrib/admin/templates/registration/password_reset_email.html:15 +#, python-format +msgid "The %(site_name)s team" +msgstr "El equipo de %(site_name)s" + +#: contrib/admin/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 "Direcci�n 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 s�lo letras, n�meros y gui�n bajo." + +#: core/validators.py:62 +#, fuzzy +msgid "This value must contain only letters, numbers, underscores and slashes." +msgstr "Este valor debe contener s�lo letras, n�meros y gui�n 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 "Direcci�n 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 Binary files /dev/null and b/django/conf/locale/fr/LC_MESSAGES/django.mo 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: fran�ais <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 corrig�e dans les meilleurs d�lais. 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� trouv�e" + +#: contrib/admin/templates/admin/404.html:10 +msgid "We're sorry, but the requested page could not be found." +msgstr "Nous sommes d�sol�s, mais la page demand�e 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 r�centes" + +#: 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 "D�connection" + +#: 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 li�s mais votre compte ne poss�de 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 �l�ments li�s suivants seront supprim�s:" + +#: 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 succ�s" + +#: 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 "R�initialisation 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 "R�initialiser 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 r�initialis� avec succ�s" + +#: 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 s�curit�, veuillez entrer votre ancien mot de passe puis " +"saisissez deux fois votre nouveau mot de passe afin que nous puissions " +"v�rifier 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 "entr�e de log" + +#: contrib/admin/models/admin.py:16 +msgid "log entries" +msgstr "entr�es 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 "F�vrier" + +#: 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 "A�ut" + +#: 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 "D�cembre" + +#: utils/dates.py:27 +msgid "Jan." +msgstr "Jan." + +#: utils/dates.py:27 +msgid "Feb." +msgstr "F�v." + +#: utils/dates.py:28 +msgid "Aug." +msgstr "A�ut" + +#: 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 "D�c." + +#: 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 compl�te " +"d�butant 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/'. V�rifiez la pr�sence du caract�re '/' en " +"d�but 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 d�finition, le syst�me 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 connect�s 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 "donn�e 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 "pr�nom" + +#: 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 crypt�e 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 "Pr�cise 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 "derni�re 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 assign�es, 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 "Tch�que" + +#: 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 "Fran�ais" + +#: 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 "Br�silien" + +#: 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 autoris�es ici." + +#: core/validators.py:74 +msgid "Lowercase letters are not allowed here." +msgstr "Les lettres minuscules ne sont pas autoris�es ici." + +#: core/validators.py:81 +msgid "Enter only digits separated by commas." +msgstr "Seulement des chiffres ([0-9]), s�par�s par des virgules." + +#: core/validators.py:93 +msgid "Enter valid e-mail addresses separated by commas." +msgstr "Entrez des adresses de courriel valides s�par�es par des virgules." + +#: core/validators.py: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 caract�res non num�riques ne sont pas autoris�s 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 autoris�es 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 num�ros de t�l�phone 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 vid�o 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 sp�cifiques 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 abr�viation d'�tat am�ricain 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 autoris�s 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 pla�t, 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 pla�t, 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 autoris�es." + +#: 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 pla�t, saisissez un nombre d�cimal 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 pla�t, saisissez un nombre d�cimal valide avec au plus %s chiffre." +msgstr[1] "" +"S'il vous pla�t, saisissez un nombre d�cimal 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 pla�t, saisissez un nombre d�cimal valide avec au plus %s d�cimale" +msgstr[1] "" +"S'il vous pla�t, saisissez un nombre d�cimal valide avec au plus %s d�cimales" + +#: core/validators.py:359 +#, python-format +msgid "Make sure your uploaded file is at least %s bytes big." +msgstr "" +"V�rifiez que le fichier transf�r� fait au moins une taille de %s octets." + +#: core/validators.py:360 +#, python-format +msgid "Make sure your uploaded file is at most %s bytes big." +msgstr "" +"V�rifiez que le fichier transf�r� fait au plus une taille de %s octets." + +#: 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 r�cup�rer 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'ent�te Content-Type '%(contenttype)s', renvoy�e 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 d�butant 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 commen�ant � la ligne %(line)s n'est pas autoris� dans ce contexte. " +"(Ligne d�butant 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 d�butant " +"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 d�butant 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 d�butant 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 d�butant par \"%(start)s\".)" + +#: core/meta/fields.py:95 +msgid " Separate multiple IDs with commas." +msgstr "S�parez 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 s�lectionner 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 Binary files /dev/null and b/django/conf/locale/gl/LC_MESSAGES/django.mo 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 Binary files /dev/null and b/django/conf/locale/it/LC_MESSAGES/django.mo 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 Binary files /dev/null and b/django/conf/locale/pt_BR/LC_MESSAGES/django.mo 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 Binary files /dev/null and b/django/conf/locale/ru/LC_MESSAGES/django.mo 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 Binary files /dev/null and b/django/conf/locale/sr/LC_MESSAGES/django.mo 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 Binary files /dev/null and b/django/conf/locale/zh_CN/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/zh_CN/LC_MESSAGES/django.po b/django/conf/locale/zh_CN/LC_MESSAGES/django.po 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> › Server error</div>{% endblock %} +{% block breadcrumbs %}<div class="breadcrumbs"><a href="/">{% trans "Home" %}</a> › {% 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 %} › {{ title }}{% endif %}</div>{% endblock %} + {% block breadcrumbs %}<div class="breadcrumbs"><a href="/">{% trans 'Home' %}</a>{% if title %} › {{ 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"> </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"> </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> </label><input type="submit" value="Log in" /> +<label> </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> › <a href="../../">{{ module_name }}</a> › <a href="../">{{ object|truncatewords:"18" }}</a> › History</div> +<div class="breadcrumbs"><a href="../../../../">{% trans 'Home' %}</a> › <a href="../../">{{ module_name }}</a> › <a href="../">{{ object|truncatewords:"18" }}</a> › {% 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> › Password change</div>{% endblock %} +{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a> › {% 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> › Password change</div>{% endblock %} +{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a> › {% 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> › Password reset</div>{% endblock %} +{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a> › {% 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> › Password reset</div>{% endblock %} +{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a> › {% 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