Added translation strings to django.contrib.comments. Taken from new-admin.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@1364 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Adrian Holovaty 2005-11-23 15:42:09 +00:00
parent 55089cc02d
commit d215cbd63a
4 changed files with 77 additions and 62 deletions

View File

@ -1,32 +1,35 @@
from django.core import meta from django.core import meta
from django.models import auth, core from django.models import auth, core
from django.utils.translation import gettext_lazy as _
class Comment(meta.Model): class Comment(meta.Model):
user = meta.ForeignKey(auth.User, raw_id_admin=True) user = meta.ForeignKey(auth.User, raw_id_admin=True)
content_type = meta.ForeignKey(core.ContentType) content_type = meta.ForeignKey(core.ContentType)
object_id = meta.IntegerField('object ID') object_id = meta.IntegerField(_('object ID'))
headline = meta.CharField(maxlength=255, blank=True) headline = meta.CharField(_('headline'), maxlength=255, blank=True)
comment = meta.TextField(maxlength=3000) comment = meta.TextField(_('comment'), maxlength=3000)
rating1 = meta.PositiveSmallIntegerField('rating #1', blank=True, null=True) rating1 = meta.PositiveSmallIntegerField(_('rating #1'), blank=True, null=True)
rating2 = meta.PositiveSmallIntegerField('rating #2', blank=True, null=True) rating2 = meta.PositiveSmallIntegerField(_('rating #2'), blank=True, null=True)
rating3 = meta.PositiveSmallIntegerField('rating #3', blank=True, null=True) rating3 = meta.PositiveSmallIntegerField(_('rating #3'), blank=True, null=True)
rating4 = meta.PositiveSmallIntegerField('rating #4', blank=True, null=True) rating4 = meta.PositiveSmallIntegerField(_('rating #4'), blank=True, null=True)
rating5 = meta.PositiveSmallIntegerField('rating #5', blank=True, null=True) rating5 = meta.PositiveSmallIntegerField(_('rating #5'), blank=True, null=True)
rating6 = meta.PositiveSmallIntegerField('rating #6', blank=True, null=True) rating6 = meta.PositiveSmallIntegerField(_('rating #6'), blank=True, null=True)
rating7 = meta.PositiveSmallIntegerField('rating #7', blank=True, null=True) rating7 = meta.PositiveSmallIntegerField(_('rating #7'), blank=True, null=True)
rating8 = meta.PositiveSmallIntegerField('rating #8', blank=True, null=True) rating8 = meta.PositiveSmallIntegerField(_('rating #8'), blank=True, null=True)
# This field designates whether to use this row's ratings in aggregate # This field designates whether to use this row's ratings in aggregate
# functions (summaries). We need this because people are allowed to post # functions (summaries). We need this because people are allowed to post
# multiple reviews on the same thing, but the system will only use the # multiple reviews on the same thing, but the system will only use the
# latest one (with valid_rating=True) in tallying the reviews. # latest one (with valid_rating=True) in tallying the reviews.
valid_rating = meta.BooleanField('is valid rating') valid_rating = meta.BooleanField(_('is valid rating'))
submit_date = meta.DateTimeField('date/time submitted', auto_now_add=True) submit_date = meta.DateTimeField(_('date/time submitted'), auto_now_add=True)
is_public = meta.BooleanField() is_public = meta.BooleanField(_('is public'))
ip_address = meta.IPAddressField('IP address', blank=True, null=True) ip_address = meta.IPAddressField(_('IP address'), blank=True, null=True)
is_removed = meta.BooleanField(help_text='Check this box if the comment is inappropriate. A "This comment has been removed" message will be displayed instead.') is_removed = meta.BooleanField(_('is removed'), help_text=_('Check this box if the comment is inappropriate. A "This comment has been removed" message will be displayed instead.'))
site = meta.ForeignKey(core.Site) site = meta.ForeignKey(core.Site)
class META: class META:
db_table = 'comments' db_table = 'comments'
verbose_name = _('Comment')
verbose_name_plural = _('Comments')
module_constants = { module_constants = {
# min. and max. allowed dimensions for photo resizing (in pixels) # min. and max. allowed dimensions for photo resizing (in pixels)
'MIN_PHOTO_DIMENSION': 5, 'MIN_PHOTO_DIMENSION': 5,
@ -79,7 +82,7 @@ class Comment(meta.Model):
except ObjectDoesNotExist: except ObjectDoesNotExist:
return None return None
get_content_object.short_description = 'Content object' get_content_object.short_description = _('Content object')
def _fill_karma_cache(self): def _fill_karma_cache(self):
"Helper function that populates good/bad karma caches" "Helper function that populates good/bad karma caches"
@ -107,9 +110,9 @@ class Comment(meta.Model):
return self._karma_total_good + self._karma_total_bad return self._karma_total_good + self._karma_total_bad
def get_as_text(self): def get_as_text(self):
return 'Posted by %s at %s\n\n%s\n\nhttp://%s%s' % \ return _('Posted by %(user)s at %(date)s\n\n%(comment)s\n\nhttp://%(domain)s%(url)s') % \
(self.get_user().username, self.submit_date, {'user': self.get_user().username, 'date': self.submit_date,
self.comment, self.get_site().domain, self.get_absolute_url()) 'comment': self.comment, 'domain': self.get_site().domain, 'url': self.get_absolute_url()}
def _module_get_security_hash(options, photo_options, rating_options, target): def _module_get_security_hash(options, photo_options, rating_options, target):
""" """
@ -155,17 +158,19 @@ class Comment(meta.Model):
class FreeComment(meta.Model): class FreeComment(meta.Model):
# A FreeComment is a comment by a non-registered user. # A FreeComment is a comment by a non-registered user.
content_type = meta.ForeignKey(core.ContentType) content_type = meta.ForeignKey(core.ContentType)
object_id = meta.IntegerField('object ID') object_id = meta.IntegerField(_('object ID'))
comment = meta.TextField(maxlength=3000) comment = meta.TextField(_('comment'), maxlength=3000)
person_name = meta.CharField("person's name", maxlength=50) person_name = meta.CharField(_("person's name"), maxlength=50)
submit_date = meta.DateTimeField('date/time submitted', auto_now_add=True) submit_date = meta.DateTimeField(_('date/time submitted'), auto_now_add=True)
is_public = meta.BooleanField() is_public = meta.BooleanField(_('is public'))
ip_address = meta.IPAddressField() ip_address = meta.IPAddressField(_('ip address'))
# TODO: Change this to is_removed, like Comment # TODO: Change this to is_removed, like Comment
approved = meta.BooleanField('approved by staff') approved = meta.BooleanField(_('approved by staff'))
site = meta.ForeignKey(core.Site) site = meta.ForeignKey(core.Site)
class META: class META:
db_table = 'comments_free' db_table = 'comments_free'
verbose_name = _('Free comment')
verbose_name_plural = _('Free comments')
ordering = ('-submit_date',) ordering = ('-submit_date',)
admin = meta.Admin( admin = meta.Admin(
fields = ( fields = (
@ -196,15 +201,17 @@ class FreeComment(meta.Model):
except ObjectDoesNotExist: except ObjectDoesNotExist:
return None return None
get_content_object.short_description = 'Content object' get_content_object.short_description = _('Content object')
class KarmaScore(meta.Model): class KarmaScore(meta.Model):
user = meta.ForeignKey(auth.User) user = meta.ForeignKey(auth.User)
comment = meta.ForeignKey(Comment) comment = meta.ForeignKey(Comment)
score = meta.SmallIntegerField(db_index=True) score = meta.SmallIntegerField(_('score'), db_index=True)
scored_date = meta.DateTimeField(auto_now=True) scored_date = meta.DateTimeField(_('score date'), auto_now=True)
class META: class META:
module_name = 'karma' module_name = 'karma'
verbose_name = _('Karma score')
verbose_name_plural = _('Karma scores')
unique_together = (('user', 'comment'),) unique_together = (('user', 'comment'),)
module_constants = { module_constants = {
# what users get if they don't have any karma # what users get if they don't have any karma
@ -213,7 +220,7 @@ class KarmaScore(meta.Model):
} }
def __repr__(self): def __repr__(self):
return "%d rating by %s" % (self.score, self.get_user()) return _("%(score)d rating by %(user)s") % {'score': self.score, 'user': self.get_user()}
def _module_vote(user_id, comment_id, score): def _module_vote(user_id, comment_id, score):
try: try:
@ -238,13 +245,15 @@ class KarmaScore(meta.Model):
class UserFlag(meta.Model): class UserFlag(meta.Model):
user = meta.ForeignKey(auth.User) user = meta.ForeignKey(auth.User)
comment = meta.ForeignKey(Comment) comment = meta.ForeignKey(Comment)
flag_date = meta.DateTimeField(auto_now_add=True) flag_date = meta.DateTimeField(_('flag date'), auto_now_add=True)
class META: class META:
db_table = 'comments_user_flags' db_table = 'comments_user_flags'
verbose_name = _('User flag')
verbose_name_plural = _('User flags')
unique_together = (('user', 'comment'),) unique_together = (('user', 'comment'),)
def __repr__(self): def __repr__(self):
return "Flag by %r" % self.get_user() return _("Flag by %r") % self.get_user()
def _module_flag(comment, user): def _module_flag(comment, user):
""" """
@ -259,17 +268,20 @@ class UserFlag(meta.Model):
except UserFlagDoesNotExist: except UserFlagDoesNotExist:
from django.core.mail import mail_managers from django.core.mail import mail_managers
f = UserFlag(None, user.id, comment.id, None) f = UserFlag(None, user.id, comment.id, None)
message = 'This comment was flagged by %s:\n\n%s' % (user.username, comment.get_as_text()) message = _('This comment was flagged by %(user)s:\n\n%(text)s') % {'user': user.username, 'text': comment.get_as_text()}
mail_managers('Comment flagged', message, fail_silently=True) mail_managers('Comment flagged', message, fail_silently=True)
f.save() f.save()
class ModeratorDeletion(meta.Model): class ModeratorDeletion(meta.Model):
user = meta.ForeignKey(auth.User, verbose_name='moderator') user = meta.ForeignKey(auth.User, verbose_name='moderator')
comment = meta.ForeignKey(Comment) comment = meta.ForeignKey(Comment)
deletion_date = meta.DateTimeField(auto_now_add=True) deletion_date = meta.DateTimeField(_('deletion date'), auto_now_add=True)
class META: class META:
db_table = 'comments_moderator_deletions' db_table = 'comments_moderator_deletions'
verbose_name = _('Moderator deletion')
verbose_name_plural = _('Moderator deletions')
unique_together = (('user', 'comment'),) unique_together = (('user', 'comment'),)
def __repr__(self): def __repr__(self):
return "Moderator deletion by %r" % self.get_user() return _("Moderator deletion by %r") % self.get_user()

View File

@ -7,17 +7,18 @@ from django.models.core import contenttypes
import re import re
COMMENT_FORM = ''' COMMENT_FORM = '''
{% load i18n %}
{% if display_form %} {% if display_form %}
<form {% if photos_optional or photos_required %}enctype="multipart/form-data" {% endif %}action="/comments/post/" method="post"> <form {% if photos_optional or photos_required %}enctype="multipart/form-data" {% endif %}action="/comments/post/" method="post">
{% if user.is_anonymous %} {% if user.is_anonymous %}
<p>Username: <input type="text" name="username" id="id_username" /><br />Password: <input type="password" name="password" id="id_password" /> (<a href="/accounts/password_reset/">Forgotten your password?</a>)</p> <p>{% trans "Username:" %} <input type="text" name="username" id="id_username" /><br />{% trans "Password:" %} <input type="password" name="password" id="id_password" /> (<a href="/accounts/password_reset/">{% trans "Forgotten your password?" %}</a>)</p>
{% else %} {% else %}
<p>Username: <strong>{{ user.username }}</strong> (<a href="/accounts/logout/">Log out</a>)</p> <p>{% trans "Username:" %} <strong>{{ user.username }}</strong> (<a href="/accounts/logout/">{% trans "Log out" %}</a>)</p>
{% endif %} {% endif %}
{% if ratings_optional or ratings_required %} {% if ratings_optional or ratings_required %}
<p>Ratings ({% if ratings_required %}Required{% else %}Optional{% endif %}):</p> <p>{% trans "Ratings" %} ({% if ratings_required %}{% trans "Required" %}{% else %}{% trans "Optional" %}{% endif %}):</p>
<table> <table>
<tr><th>&nbsp;</th>{% for value in rating_range %}<th>{{ value }}</th>{% endfor %}</tr> <tr><th>&nbsp;</th>{% for value in rating_range %}<th>{{ value }}</th>{% endfor %}</tr>
{% for rating in rating_choices %} {% for rating in rating_choices %}
@ -28,16 +29,16 @@ COMMENT_FORM = '''
{% endif %} {% endif %}
{% if photos_optional or photos_required %} {% if photos_optional or photos_required %}
<p>Post a photo ({% if photos_required %}Required{% else %}Optional{% endif %}): <input type="file" name="photo" /></p> <p>{% trans "Post a photo" %} ({% if photos_required %}{% trans "Required" %}{% else %}{% trans "Optional" %}{% endif %}): <input type="file" name="photo" /></p>
<input type="hidden" name="photo_options" value="{{ photo_options }}" /> <input type="hidden" name="photo_options" value="{{ photo_options }}" />
{% endif %} {% endif %}
<p>Comment:<br /><textarea name="comment" id="id_comment" rows="10" cols="60"></textarea></p> <p>{% trans "Comment:" %}<br /><textarea name="comment" id="id_comment" rows="10" cols="60"></textarea></p>
<input type="hidden" name="options" value="{{ options }}" /> <input type="hidden" name="options" value="{{ options }}" />
<input type="hidden" name="target" value="{{ target }}" /> <input type="hidden" name="target" value="{{ target }}" />
<input type="hidden" name="gonzo" value="{{ hash }}" /> <input type="hidden" name="gonzo" value="{{ hash }}" />
<p><input type="submit" name="preview" value="Preview comment" /></p> <p><input type="submit" name="preview" value="{% trans "Preview comment" %}" /></p>
</form> </form>
{% endif %} {% endif %}
''' '''
@ -45,12 +46,12 @@ COMMENT_FORM = '''
FREE_COMMENT_FORM = ''' FREE_COMMENT_FORM = '''
{% if display_form %} {% if display_form %}
<form action="/comments/postfree/" method="post"> <form action="/comments/postfree/" method="post">
<p>Your name: <input type="text" id="id_person_name" name="person_name" /></p> <p>{% trans "Your name:" %} <input type="text" id="id_person_name" name="person_name" /></p>
<p>Comment:<br /><textarea name="comment" id="id_comment" rows="10" cols="60"></textarea></p> <p>{% trans "Comment:" %}<br /><textarea name="comment" id="id_comment" rows="10" cols="60"></textarea></p>
<input type="hidden" name="options" value="{{ options }}" /> <input type="hidden" name="options" value="{{ options }}" />
<input type="hidden" name="target" value="{{ target }}" /> <input type="hidden" name="target" value="{{ target }}" />
<input type="hidden" name="gonzo" value="{{ hash }}" /> <input type="hidden" name="gonzo" value="{{ hash }}" />
<p><input type="submit" name="preview" value="Preview comment" /></p> <p><input type="submit" name="preview" value="{% trans "Preview comment" %}" /></p>
</form> </form>
{% endif %} {% endif %}
''' '''

View File

@ -9,6 +9,7 @@ from django.parts.auth.formfields import AuthenticationForm
from django.utils.httpwrappers import HttpResponseRedirect from django.utils.httpwrappers import HttpResponseRedirect
from django.utils.text import normalize_newlines from django.utils.text import normalize_newlines
from django.conf.settings import BANNED_IPS, COMMENTS_ALLOW_PROFANITIES, COMMENTS_SKETCHY_USERS_GROUP, COMMENTS_FIRST_FEW, SITE_ID from django.conf.settings import BANNED_IPS, COMMENTS_ALLOW_PROFANITIES, COMMENTS_SKETCHY_USERS_GROUP, COMMENTS_FIRST_FEW, SITE_ID
from django.utils.translation import ngettext
import base64, datetime import base64, datetime
COMMENTS_PER_PAGE = 20 COMMENTS_PER_PAGE = 20
@ -21,7 +22,7 @@ class PublicCommentManipulator(AuthenticationForm):
choices = [(c, c) for c in ratings_range] choices = [(c, c) for c in ratings_range]
def get_validator_list(rating_num): def get_validator_list(rating_num):
if rating_num <= num_rating_choices: if rating_num <= num_rating_choices:
return [validators.RequiredIfOtherFieldsGiven(['rating%d' % i for i in range(1, 9) if i != rating_num], "This rating is required because you've entered at least one other rating.")] return [validators.RequiredIfOtherFieldsGiven(['rating%d' % i for i in range(1, 9) if i != rating_num], _("This rating is required because you've entered at least one other rating."))]
else: else:
return [] return []
self.fields.extend([ self.fields.extend([
@ -105,11 +106,12 @@ class PublicCommentManipulator(AuthenticationForm):
# If the commentor has posted fewer than COMMENTS_FIRST_FEW comments, # If the commentor has posted fewer than COMMENTS_FIRST_FEW comments,
# send the comment to the managers. # send the comment to the managers.
if self.user_cache.get_comments_comment_count() <= COMMENTS_FIRST_FEW: if self.user_cache.get_comments_comment_count() <= COMMENTS_FIRST_FEW:
message = 'This comment was posted by a user who has posted fewer than %s comments:\n\n%s' % \ message = ngettext('This comment was posted by a user who has posted fewer than %(count)s comment:\n\n%(text)s',
(COMMENTS_FIRST_FEW, c.get_as_text()) 'This comment was posted by a user who has posted fewer than %(count)s comments:\n\n%(text)s') % \
{'count': COMMENTS_FIRST_FEW, 'text': c.get_as_text()}
mail_managers("Comment posted by rookie user", message) mail_managers("Comment posted by rookie user", message)
if COMMENTS_SKETCHY_USERS_GROUP and COMMENTS_SKETCHY_USERS_GROUP in [g.id for g in self.user_cache.get_group_list()]: if COMMENTS_SKETCHY_USERS_GROUP and COMMENTS_SKETCHY_USERS_GROUP in [g.id for g in self.user_cache.get_group_list()]:
message = 'This comment was posted by a sketchy user:\n\n%s' % c.get_as_text() message = _('This comment was posted by a sketchy user:\n\n%(text)s') % {'text': c.get_as_text()}
mail_managers("Comment posted by sketchy user (%s)" % self.user_cache.username, c.get_as_text()) mail_managers("Comment posted by sketchy user (%s)" % self.user_cache.username, c.get_as_text())
return c return c
@ -181,15 +183,15 @@ def post_comment(request):
choice of ratings choice of ratings
""" """
if not request.POST: if not request.POST:
raise Http404, "Only POSTs are allowed" raise Http404, _("Only POSTs are allowed")
try: try:
options, target, security_hash = request.POST['options'], request.POST['target'], request.POST['gonzo'] options, target, security_hash = request.POST['options'], request.POST['target'], request.POST['gonzo']
except KeyError: except KeyError:
raise Http404, "One or more of the required fields wasn't submitted" raise Http404, _("One or more of the required fields wasn't submitted")
photo_options = request.POST.get('photo_options', '') photo_options = request.POST.get('photo_options', '')
rating_options = normalize_newlines(request.POST.get('rating_options', '')) rating_options = normalize_newlines(request.POST.get('rating_options', ''))
if comments.get_security_hash(options, photo_options, rating_options, target) != security_hash: if comments.get_security_hash(options, photo_options, rating_options, target) != security_hash:
raise Http404, "Somebody tampered with the comment form (security violation)" raise Http404, _("Somebody tampered with the comment form (security violation)")
# Now we can be assured the data is valid. # Now we can be assured the data is valid.
if rating_options: if rating_options:
rating_range, rating_choices = comments.get_rating_options(base64.decodestring(rating_options)) rating_range, rating_choices = comments.get_rating_options(base64.decodestring(rating_options))
@ -199,7 +201,7 @@ def post_comment(request):
try: try:
obj = contenttypes.get_object(pk=content_type_id).get_object_for_this_type(pk=object_id) obj = contenttypes.get_object(pk=content_type_id).get_object_for_this_type(pk=object_id)
except ObjectDoesNotExist: except ObjectDoesNotExist:
raise Http404, "The comment form had an invalid 'target' parameter -- the object ID was invalid" raise Http404, _("The comment form had an invalid 'target' parameter -- the object ID was invalid")
option_list = options.split(',') # options is something like 'pa,ra' option_list = options.split(',') # options is something like 'pa,ra'
new_data = request.POST.copy() new_data = request.POST.copy()
new_data['content_type_id'] = content_type_id new_data['content_type_id'] = content_type_id
@ -249,7 +251,7 @@ def post_comment(request):
comment = manipulator.save(new_data) comment = manipulator.save(new_data)
return HttpResponseRedirect("/comments/posted/?c=%s:%s" % (content_type_id, object_id)) return HttpResponseRedirect("/comments/posted/?c=%s:%s" % (content_type_id, object_id))
else: else:
raise Http404, "The comment form didn't provide either 'preview' or 'post'" raise Http404, _("The comment form didn't provide either 'preview' or 'post'")
def post_free_comment(request): def post_free_comment(request):
""" """
@ -272,19 +274,19 @@ def post_free_comment(request):
post a comment). post a comment).
""" """
if not request.POST: if not request.POST:
raise Http404, "Only POSTs are allowed" raise Http404, _("Only POSTs are allowed")
try: try:
options, target, security_hash = request.POST['options'], request.POST['target'], request.POST['gonzo'] options, target, security_hash = request.POST['options'], request.POST['target'], request.POST['gonzo']
except KeyError: except KeyError:
raise Http404, "One or more of the required fields wasn't submitted" raise Http404, _("One or more of the required fields wasn't submitted")
if comments.get_security_hash(options, '', '', target) != security_hash: if comments.get_security_hash(options, '', '', target) != security_hash:
raise Http404, "Somebody tampered with the comment form (security violation)" raise Http404, _("Somebody tampered with the comment form (security violation)")
content_type_id, object_id = target.split(':') # target is something like '52:5157' content_type_id, object_id = target.split(':') # target is something like '52:5157'
content_type = contenttypes.get_object(pk=content_type_id) content_type = contenttypes.get_object(pk=content_type_id)
try: try:
obj = content_type.get_object_for_this_type(pk=object_id) obj = content_type.get_object_for_this_type(pk=object_id)
except ObjectDoesNotExist: except ObjectDoesNotExist:
raise Http404, "The comment form had an invalid 'target' parameter -- the object ID was invalid" raise Http404, _("The comment form had an invalid 'target' parameter -- the object ID was invalid")
option_list = options.split(',') option_list = options.split(',')
new_data = request.POST.copy() new_data = request.POST.copy()
new_data['content_type_id'] = content_type_id new_data['content_type_id'] = content_type_id
@ -313,7 +315,7 @@ def post_free_comment(request):
comment = manipulator.save(new_data) comment = manipulator.save(new_data)
return HttpResponseRedirect("/comments/posted/?c=%s:%s" % (content_type_id, object_id)) return HttpResponseRedirect("/comments/posted/?c=%s:%s" % (content_type_id, object_id))
else: else:
raise Http404, "The comment form didn't provide either 'preview' or 'post'" raise Http404, _("The comment form didn't provide either 'preview' or 'post'")
def comment_was_posted(request): def comment_was_posted(request):
""" """

View File

@ -15,13 +15,13 @@ def vote(request, comment_id, vote):
if not rating: if not rating:
raise Http404, "Invalid vote" raise Http404, "Invalid vote"
if request.user.is_anonymous(): if request.user.is_anonymous():
raise Http404, "Anonymous users cannot vote" raise Http404, _("Anonymous users cannot vote")
try: try:
comment = comments.get_object(pk=comment_id) comment = comments.get_object(pk=comment_id)
except comments.CommentDoesNotExist: except comments.CommentDoesNotExist:
raise Http404, "Invalid comment ID" raise Http404, _("Invalid comment ID")
if comment.user_id == request.user.id: if comment.user_id == request.user.id:
raise Http404, "No voting for yourself" raise Http404, _("No voting for yourself")
karma.vote(request.user.id, comment_id, rating) karma.vote(request.user.id, comment_id, rating)
# Reload comment to ensure we have up to date karma count # Reload comment to ensure we have up to date karma count
comment = comments.get_object(pk=comment_id) comment = comments.get_object(pk=comment_id)