Fixed #30400 -- Improved typography of user facing strings.

Thanks Claude Paroz for assistance with translations.
This commit is contained in:
Jon Dufresne 2019-06-27 09:39:47 -07:00 committed by Mariusz Felisiak
parent 2b03e8e9e8
commit 42b9a23267
64 changed files with 195 additions and 195 deletions

View File

@ -131,7 +131,7 @@ msgid "Added \"%(object)s\"."
msgstr "Ajout de « %(object)s »." msgstr "Ajout de « %(object)s »."
#, python-format #, python-format
msgid "Changed \"%(object)s\" - %(changes)s" msgid "Changed “%(object)s” - %(changes)s"
msgstr "Modification de « %(object)s » - %(changes)s" msgstr "Modification de « %(object)s » - %(changes)s"
#, python-format #, python-format
@ -142,7 +142,7 @@ msgid "LogEntry Object"
msgstr "Objet de journal" msgstr "Objet de journal"
#, python-brace-format #, python-brace-format
msgid "Added {name} \"{object}\"." msgid "Added {name} “{object}”."
msgstr "Ajout de {name} « {object} »." msgstr "Ajout de {name} « {object} »."
msgid "Added." msgid "Added."
@ -152,7 +152,7 @@ msgid "and"
msgstr "et" msgstr "et"
#, python-brace-format #, python-brace-format
msgid "Changed {fields} for {name} \"{object}\"." msgid "Changed {fields} for {name} “{object}”."
msgstr "Modification de {fields} pour l'objet {name} « {object} »." msgstr "Modification de {fields} pour l'objet {name} « {object} »."
#, python-brace-format #, python-brace-format
@ -160,7 +160,7 @@ msgid "Changed {fields}."
msgstr "Modification de {fields}." msgstr "Modification de {fields}."
#, python-brace-format #, python-brace-format
msgid "Deleted {name} \"{object}\"." msgid "Deleted {name} “{object}”."
msgstr "Suppression de {name} « {object} »." msgstr "Suppression de {name} « {object} »."
msgid "No fields changed." msgid "No fields changed."

View File

@ -73,14 +73,14 @@ class LogEntry(models.Model):
def __str__(self): def __str__(self):
if self.is_addition(): if self.is_addition():
return gettext('Added "%(object)s".') % {'object': self.object_repr} return gettext('Added %(object)s.') % {'object': self.object_repr}
elif self.is_change(): elif self.is_change():
return gettext('Changed "%(object)s" - %(changes)s') % { return gettext('Changed %(object)s” — %(changes)s') % {
'object': self.object_repr, 'object': self.object_repr,
'changes': self.get_change_message(), 'changes': self.get_change_message(),
} }
elif self.is_deletion(): elif self.is_deletion():
return gettext('Deleted "%(object)s."') % {'object': self.object_repr} return gettext('Deleted %(object)s.”') % {'object': self.object_repr}
return gettext('LogEntry Object') return gettext('LogEntry Object')
@ -108,7 +108,7 @@ class LogEntry(models.Model):
if 'added' in sub_message: if 'added' in sub_message:
if sub_message['added']: if sub_message['added']:
sub_message['added']['name'] = gettext(sub_message['added']['name']) sub_message['added']['name'] = gettext(sub_message['added']['name'])
messages.append(gettext('Added {name} "{object}".').format(**sub_message['added'])) messages.append(gettext('Added {name} {object}.').format(**sub_message['added']))
else: else:
messages.append(gettext('Added.')) messages.append(gettext('Added.'))
@ -118,7 +118,7 @@ class LogEntry(models.Model):
) )
if 'name' in sub_message['changed']: if 'name' in sub_message['changed']:
sub_message['changed']['name'] = gettext(sub_message['changed']['name']) sub_message['changed']['name'] = gettext(sub_message['changed']['name'])
messages.append(gettext('Changed {fields} for {name} "{object}".').format( messages.append(gettext('Changed {fields} for {name} {object}.').format(
**sub_message['changed'] **sub_message['changed']
)) ))
else: else:
@ -126,7 +126,7 @@ class LogEntry(models.Model):
elif 'deleted' in sub_message: elif 'deleted' in sub_message:
sub_message['deleted']['name'] = gettext(sub_message['deleted']['name']) sub_message['deleted']['name'] = gettext(sub_message['deleted']['name'])
messages.append(gettext('Deleted {name} "{object}".').format(**sub_message['deleted'])) messages.append(gettext('Deleted {name} {object}.').format(**sub_message['deleted']))
change_message = ' '.join(msg[0].upper() + msg[1:] for msg in messages) change_message = ' '.join(msg[0].upper() + msg[1:] for msg in messages)
return change_message or gettext('No fields changed.') return change_message or gettext('No fields changed.')

View File

@ -269,7 +269,7 @@ class BaseModelAdmin(metaclass=forms.MediaDefiningClass):
form_field = db_field.formfield(**kwargs) form_field = db_field.formfield(**kwargs)
if (isinstance(form_field.widget, SelectMultiple) and if (isinstance(form_field.widget, SelectMultiple) and
not isinstance(form_field.widget, (CheckboxSelectMultiple, AutocompleteSelectMultiple))): not isinstance(form_field.widget, (CheckboxSelectMultiple, AutocompleteSelectMultiple))):
msg = _('Hold down "Control", or "Command" on a Mac, to select more than one.') msg = _('Hold down “Control”, or “Command” on a Mac, to select more than one.')
help_text = form_field.help_text help_text = form_field.help_text
form_field.help_text = format_lazy('{} {}', help_text, msg) if help_text else msg form_field.help_text = format_lazy('{} {}', help_text, msg) if help_text else msg
return form_field return form_field
@ -1202,7 +1202,7 @@ class ModelAdmin(BaseModelAdmin):
"_saveasnew" in request.POST and self.save_as_continue and "_saveasnew" in request.POST and self.save_as_continue and
self.has_change_permission(request, obj) self.has_change_permission(request, obj)
): ):
msg = _('The {name} "{obj}" was added successfully.') msg = _('The {name} {obj} was added successfully.')
if self.has_change_permission(request, obj): if self.has_change_permission(request, obj):
msg += ' ' + _('You may edit it again below.') msg += ' ' + _('You may edit it again below.')
self.message_user(request, format_html(msg, **msg_dict), messages.SUCCESS) self.message_user(request, format_html(msg, **msg_dict), messages.SUCCESS)
@ -1216,7 +1216,7 @@ class ModelAdmin(BaseModelAdmin):
elif "_addanother" in request.POST: elif "_addanother" in request.POST:
msg = format_html( msg = format_html(
_('The {name} "{obj}" was added successfully. You may add another {name} below.'), _('The {name} {obj} was added successfully. You may add another {name} below.'),
**msg_dict **msg_dict
) )
self.message_user(request, msg, messages.SUCCESS) self.message_user(request, msg, messages.SUCCESS)
@ -1226,7 +1226,7 @@ class ModelAdmin(BaseModelAdmin):
else: else:
msg = format_html( msg = format_html(
_('The {name} "{obj}" was added successfully.'), _('The {name} {obj} was added successfully.'),
**msg_dict **msg_dict
) )
self.message_user(request, msg, messages.SUCCESS) self.message_user(request, msg, messages.SUCCESS)
@ -1266,7 +1266,7 @@ class ModelAdmin(BaseModelAdmin):
} }
if "_continue" in request.POST: if "_continue" in request.POST:
msg = format_html( msg = format_html(
_('The {name} "{obj}" was changed successfully. You may edit it again below.'), _('The {name} {obj} was changed successfully. You may edit it again below.'),
**msg_dict **msg_dict
) )
self.message_user(request, msg, messages.SUCCESS) self.message_user(request, msg, messages.SUCCESS)
@ -1276,7 +1276,7 @@ class ModelAdmin(BaseModelAdmin):
elif "_saveasnew" in request.POST: elif "_saveasnew" in request.POST:
msg = format_html( msg = format_html(
_('The {name} "{obj}" was added successfully. You may edit it again below.'), _('The {name} {obj} was added successfully. You may edit it again below.'),
**msg_dict **msg_dict
) )
self.message_user(request, msg, messages.SUCCESS) self.message_user(request, msg, messages.SUCCESS)
@ -1289,7 +1289,7 @@ class ModelAdmin(BaseModelAdmin):
elif "_addanother" in request.POST: elif "_addanother" in request.POST:
msg = format_html( msg = format_html(
_('The {name} "{obj}" was changed successfully. You may add another {name} below.'), _('The {name} {obj} was changed successfully. You may add another {name} below.'),
**msg_dict **msg_dict
) )
self.message_user(request, msg, messages.SUCCESS) self.message_user(request, msg, messages.SUCCESS)
@ -1301,7 +1301,7 @@ class ModelAdmin(BaseModelAdmin):
else: else:
msg = format_html( msg = format_html(
_('The {name} "{obj}" was changed successfully.'), _('The {name} {obj} was changed successfully.'),
**msg_dict **msg_dict
) )
self.message_user(request, msg, messages.SUCCESS) self.message_user(request, msg, messages.SUCCESS)
@ -1422,7 +1422,7 @@ class ModelAdmin(BaseModelAdmin):
self.message_user( self.message_user(
request, request,
_('The %(name)s "%(obj)s" was deleted successfully.') % { _('The %(name)s %(obj)s was deleted successfully.') % {
'name': opts.verbose_name, 'name': opts.verbose_name,
'obj': obj_display, 'obj': obj_display,
}, },
@ -1501,7 +1501,7 @@ class ModelAdmin(BaseModelAdmin):
Create a message informing the user that the object doesn't exist Create a message informing the user that the object doesn't exist
and return a redirect to the admin index page. and return a redirect to the admin index page.
""" """
msg = _("""%(name)s with ID "%(key)s" doesn't exist. Perhaps it was deleted?""") % { msg = _('%(name)s with ID “%(key)s” doesnt exist. Perhaps it was deleted?') % {
'name': opts.verbose_name, 'name': opts.verbose_name,
'key': unquote(object_id), 'key': unquote(object_id),
} }

View File

@ -7,6 +7,6 @@
<h2>{% trans 'Page not found' %}</h2> <h2>{% trans 'Page not found' %}</h2>
<p>{% trans "We're sorry, but the requested page could not be found." %}</p> <p>{% trans 'Were sorry, but the requested page could not be found.' %}</p>
{% endblock %} {% endblock %}

View File

@ -12,6 +12,6 @@
{% block content %} {% block content %}
<h1>{% trans 'Server Error <em>(500)</em>' %}</h1> <h1>{% trans 'Server Error <em>(500)</em>' %}</h1>
<p>{% trans "There's been an error. It's been reported to the site administrators via email and should be fixed shortly. Thanks for your patience." %}</p> <p>{% trans 'Theres been an error. Its been reported to the site administrators via email and should be fixed shortly. Thanks for your patience.' %}</p>
{% endblock %} {% endblock %}

View File

@ -3,7 +3,7 @@
{% block form_top %} {% block form_top %}
{% if not is_popup %} {% if not is_popup %}
<p>{% trans "First, enter a username and password. Then, you'll be able to edit more user options." %}</p> <p>{% trans 'First, enter a username and password. Then, youll be able to edit more user options.' %}</p>
{% else %} {% else %}
<p>{% trans "Enter a username and password." %}</p> <p>{% trans "Enter a username and password." %}</p>
{% endif %} {% endif %}

View File

@ -44,7 +44,7 @@
<input type="hidden" name="post" value="yes"> <input type="hidden" name="post" value="yes">
{% if is_popup %}<input type="hidden" name="{{ is_popup_var }}" value="1">{% endif %} {% if is_popup %}<input type="hidden" name="{{ is_popup_var }}" value="1">{% endif %}
{% if to_field %}<input type="hidden" name="{{ to_field_var }}" value="{{ to_field }}">{% endif %} {% if to_field %}<input type="hidden" name="{{ to_field_var }}" value="{{ to_field }}">{% endif %}
<input type="submit" value="{% trans "Yes, I'm sure" %}"> <input type="submit" value="{% trans 'Yes, Im sure' %}">
<a href="#" class="button cancel-link">{% trans "No, take me back" %}</a> <a href="#" class="button cancel-link">{% trans "No, take me back" %}</a>
</div> </div>
</form> </form>

View File

@ -47,7 +47,7 @@
{% endfor %} {% endfor %}
<input type="hidden" name="action" value="delete_selected"> <input type="hidden" name="action" value="delete_selected">
<input type="hidden" name="post" value="yes"> <input type="hidden" name="post" value="yes">
<input type="submit" value="{% trans "Yes, I'm sure" %}"> <input type="submit" value="{% trans 'Yes, Im sure' %}">
<a href="#" class="button cancel-link">{% trans "No, take me back" %}</a> <a href="#" class="button cancel-link">{% trans "No, take me back" %}</a>
</div> </div>
</form> </form>

View File

@ -48,7 +48,7 @@
</div> </div>
{% endfor %} {% endfor %}
{% else %} {% else %}
<p>{% trans "You don't have permission to view or edit anything." %}</p> <p>{% trans 'You dont have permission to view or edit anything.' %}</p>
{% endif %} {% endif %}
</div> </div>
{% endblock %} {% endblock %}

View File

@ -9,5 +9,5 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<p>{% trans "Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user." %}</p> <p>{% trans 'Somethings wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user.' %}</p>
{% endblock %} {% endblock %}

View File

@ -35,7 +35,7 @@
</tbody> </tbody>
</table> </table>
{% else %} {% else %}
<p>{% trans "This object doesn't have a change history. It probably wasn't added via this admin site." %}</p> <p>{% trans 'This object doesnt have a change history. It probably wasnt added via this admin site.' %}</p>
{% endif %} {% endif %}
</div> </div>
</div> </div>

View File

@ -23,7 +23,7 @@
{% endif %} {% endif %}
<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> <p>{% trans 'Please enter your old password, for securitys sake, and then enter your new password twice so we can verify you typed it in correctly.' %}</p>
<fieldset class="module aligned wide"> <fieldset class="module aligned wide">

View File

@ -12,8 +12,8 @@
{% block content_title %}<h1>{{ title }}</h1>{% endblock %} {% block content_title %}<h1>{{ title }}</h1>{% endblock %}
{% block content %} {% block content %}
<p>{% trans "We've emailed you instructions for setting your password, if an account exists with the email you entered. You should receive them shortly." %}</p> <p>{% trans 'Weve emailed you instructions for setting your password, if an account exists with the email you entered. You should receive them shortly.' %}</p>
<p>{% trans "If you don't receive an email, please make sure you've entered the address you registered with, and check your spam folder." %}</p> <p>{% trans 'If you dont receive an email, please make sure youve entered the address you registered with, and check your spam folder.' %}</p>
{% endblock %} {% endblock %}

View File

@ -5,7 +5,7 @@
{% block reset_link %} {% block reset_link %}
{{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %} {{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
{% endblock %} {% endblock %}
{% trans "Your username, in case you've forgotten:" %} {{ user.get_username }} {% trans 'Your username, in case youve forgotten:' %} {{ user.get_username }}
{% trans "Thanks for using our site!" %} {% trans "Thanks for using our site!" %}

View File

@ -13,7 +13,7 @@
{% block content_title %}<h1>{{ title }}</h1>{% endblock %} {% block content_title %}<h1>{{ title }}</h1>{% endblock %}
{% block content %} {% block content %}
<p>{% trans "Forgotten your password? Enter your email address below, and we'll email instructions for setting a new one." %}</p> <p>{% trans 'Forgotten your password? Enter your email address below, and well email instructions for setting a new one.' %}</p>
<form method="post">{% csrf_token %} <form method="post">{% csrf_token %}
<fieldset class="module aligned"> <fieldset class="module aligned">

View File

@ -13,10 +13,10 @@
{% block title %}{% blocktrans %}Template: {{ name }}{% endblocktrans %}{% endblock %} {% block title %}{% blocktrans %}Template: {{ name }}{% endblocktrans %}{% endblock %}
{% block content %} {% block content %}
<h1>{% blocktrans %}Template: "{{ name }}"{% endblocktrans %}</h1> <h1>{% blocktrans %}Template: <q>{{ name }}</q>{% endblocktrans %}</h1>
{# Translators: Search is not a verb here, it qualifies path (a search path) #} {# Translators: Search is not a verb here, it qualifies path (a search path) #}
<h2>{% blocktrans %}Search path for template "{{ name }}":{% endblocktrans %}</h2> <h2>{% blocktrans %}Search path for template <q>{{ name }}</q>:{% endblocktrans %}</h2>
<ol> <ol>
{% for template in templates|dictsort:"order" %} {% for template in templates|dictsort:"order" %}
<li><code>{{ template.file }}</code>{% if not template.exists %} <em>{% trans '(does not exist)' %}</em>{% endif %}</li> <li><code>{{ template.file }}</code>{% if not template.exists %} <em>{% trans '(does not exist)' %}</em>{% endif %}</li>

View File

@ -73,7 +73,7 @@ class UserCreationForm(forms.ModelForm):
password. password.
""" """
error_messages = { error_messages = {
'password_mismatch': _("The two password fields didn't match."), 'password_mismatch': _('The two password fields didnt match.'),
} }
password1 = forms.CharField( password1 = forms.CharField(
label=_("Password"), label=_("Password"),
@ -134,9 +134,9 @@ class UserChangeForm(forms.ModelForm):
password = ReadOnlyPasswordHashField( password = ReadOnlyPasswordHashField(
label=_("Password"), label=_("Password"),
help_text=_( help_text=_(
"Raw passwords are not stored, so there is no way to see this " 'Raw passwords are not stored, so there is no way to see this '
"user's password, but you can change the password using " 'users password, but you can change the password using '
"<a href=\"{}\">this form</a>." '<a href="{}">this form</a>.'
), ),
) )
@ -314,7 +314,7 @@ class SetPasswordForm(forms.Form):
password password
""" """
error_messages = { error_messages = {
'password_mismatch': _("The two password fields didn't match."), 'password_mismatch': _('The two password fields didnt match.'),
} }
new_password1 = forms.CharField( new_password1 = forms.CharField(
label=_("New password"), label=_("New password"),
@ -387,7 +387,7 @@ class AdminPasswordChangeForm(forms.Form):
A form used to change the password of a user in the admin interface. A form used to change the password of a user in the admin interface.
""" """
error_messages = { error_messages = {
'password_mismatch': _("The two password fields didn't match."), 'password_mismatch': _('The two password fields didnt match.'),
} }
required_css_class = 'required' required_css_class = 'required'
password1 = forms.CharField( password1 = forms.CharField(

View File

@ -253,7 +253,7 @@ msgstr[1] ""
msgid "The password is too similar to the %(verbose_name)s." msgid "The password is too similar to the %(verbose_name)s."
msgstr "Le mot de passe est trop semblable au champ « %(verbose_name)s »." msgstr "Le mot de passe est trop semblable au champ « %(verbose_name)s »."
msgid "Your password can't be too similar to your other personal information." msgid "Your password cant be too similar to your other personal information."
msgstr "" msgstr ""
"Votre mot de passe ne peut pas trop ressembler à vos autres informations " "Votre mot de passe ne peut pas trop ressembler à vos autres informations "
"personnelles." "personnelles."
@ -261,14 +261,14 @@ msgstr ""
msgid "This password is too common." msgid "This password is too common."
msgstr "Ce mot de passe est trop courant." msgstr "Ce mot de passe est trop courant."
msgid "Your password can't be a commonly used password." msgid "Your password cant be a commonly used password."
msgstr "" msgstr ""
"Votre mot de passe ne peut pas être un mot de passe couramment utilisé." "Votre mot de passe ne peut pas être un mot de passe couramment utilisé."
msgid "This password is entirely numeric." msgid "This password is entirely numeric."
msgstr "Ce mot de passe est entièrement numérique." msgstr "Ce mot de passe est entièrement numérique."
msgid "Your password can't be entirely numeric." msgid "Your password cant be entirely numeric."
msgstr "Votre mot de passe ne peut pas être entièrement numérique." msgstr "Votre mot de passe ne peut pas être entièrement numérique."
#, python-format #, python-format

View File

@ -154,7 +154,7 @@ class UserAttributeSimilarityValidator:
) )
def get_help_text(self): def get_help_text(self):
return _("Your password can't be too similar to your other personal information.") return _('Your password cant be too similar to your other personal information.')
class CommonPasswordValidator: class CommonPasswordValidator:
@ -185,7 +185,7 @@ class CommonPasswordValidator:
) )
def get_help_text(self): def get_help_text(self):
return _("Your password can't be a commonly used password.") return _('Your password cant be a commonly used password.')
class NumericPasswordValidator: class NumericPasswordValidator:
@ -200,4 +200,4 @@ class NumericPasswordValidator:
) )
def get_help_text(self): def get_help_text(self):
return _("Your password can't be entirely numeric.") return _('Your password cant be entirely numeric.')

View File

@ -21,7 +21,7 @@ def shortcut(request, content_type_id, object_id):
obj = content_type.get_object_for_this_type(pk=object_id) obj = content_type.get_object_for_this_type(pk=object_id)
except (ObjectDoesNotExist, ValueError): except (ObjectDoesNotExist, ValueError):
raise Http404( raise Http404(
_("Content type %(ct_id)s object %(obj_id)s doesn't exist") % _('Content type %(ct_id)s object %(obj_id)s doesnt exist') %
{'ct_id': content_type_id, 'obj_id': object_id} {'ct_id': content_type_id, 'obj_id': object_id}
) )
@ -29,7 +29,7 @@ def shortcut(request, content_type_id, object_id):
get_absolute_url = obj.get_absolute_url get_absolute_url = obj.get_absolute_url
except AttributeError: except AttributeError:
raise Http404( raise Http404(
_("%(ct_name)s objects don't have a get_absolute_url() method") % _('%(ct_name)s objects dont have a get_absolute_url() method') %
{'ct_name': content_type.name} {'ct_name': content_type.name}
) )
absurl = get_absolute_url() absurl = get_absolute_url()

View File

@ -9,7 +9,7 @@ class FlatpageForm(forms.ModelForm):
label=_("URL"), label=_("URL"),
max_length=100, max_length=100,
regex=r'^[-\w/\.~]+$', regex=r'^[-\w/\.~]+$',
help_text=_("Example: '/about/contact/'. Make sure to have leading and trailing slashes."), help_text=_('Example: “/about/contact/”. Make sure to have leading and trailing slashes.'),
error_messages={ error_messages={
"invalid": _( "invalid": _(
"This value must contain only letters, numbers, dots, " "This value must contain only letters, numbers, dots, "
@ -26,7 +26,7 @@ class FlatpageForm(forms.ModelForm):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
if not self._trailing_slash_required(): if not self._trailing_slash_required():
self.fields['url'].help_text = _( self.fields['url'].help_text = _(
"Example: '/about/contact'. Make sure to have a leading slash." 'Example: “/about/contact”. Make sure to have a leading slash.'
) )
def _trailing_slash_required(self): def _trailing_slash_required(self):

View File

@ -18,8 +18,8 @@ class Migration(migrations.Migration):
('enable_comments', models.BooleanField(default=False, verbose_name='enable comments')), ('enable_comments', models.BooleanField(default=False, verbose_name='enable comments')),
('template_name', models.CharField( ('template_name', models.CharField(
help_text=( help_text=(
"Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use " 'Example: “flatpages/contact_page.html”. If this isnt provided, the system will use '
"'flatpages/default.html'." '“flatpages/default.html”.'
), max_length=70, verbose_name='template name', blank=True ), max_length=70, verbose_name='template name', blank=True
)), )),
('registration_required', models.BooleanField( ('registration_required', models.BooleanField(

View File

@ -15,8 +15,8 @@ class FlatPage(models.Model):
max_length=70, max_length=70,
blank=True, blank=True,
help_text=_( help_text=_(
"Example: 'flatpages/contact_page.html'. If this isn't provided, " 'Example: “flatpages/contact_page.html”. If this isnt provided, '
"the system will use 'flatpages/default.html'." 'the system will use “flatpages/default.html”.'
), ),
) )
registration_required = models.BooleanField( registration_required = models.BooleanField(

View File

@ -198,7 +198,7 @@ class GeometryField(BaseSpatialField):
""" """
The base Geometry field -- maps to the OpenGIS Specification Geometry type. The base Geometry field -- maps to the OpenGIS Specification Geometry type.
""" """
description = _("The base Geometry field -- maps to the OpenGIS Specification Geometry type.") description = _('The base Geometry field — maps to the OpenGIS Specification Geometry type.')
form_class = forms.GeometryField form_class = forms.GeometryField
# The OpenGIS Geometry name. # The OpenGIS Geometry name.
geom_type = 'GEOMETRY' geom_type = 'GEOMETRY'

View File

@ -11,7 +11,7 @@ def feed(request, url, feed_dict=None):
try: try:
f = feed_dict[slug] f = feed_dict[slug]
except KeyError: except KeyError:
raise Http404(_("Slug %r isn't registered.") % slug) raise Http404(_('Slug %r isnt registered.') % slug)
instance = f() instance = f()
instance.feed_url = getattr(f, 'feed_url', None) or request.path instance.feed_url = getattr(f, 'feed_url', None) or request.path

View File

@ -15,7 +15,7 @@ class HStoreField(CheckFieldDefaultMixin, Field):
empty_strings_allowed = False empty_strings_allowed = False
description = _('Map of strings to strings/nulls') description = _('Map of strings to strings/nulls')
default_error_messages = { default_error_messages = {
'not_a_string': _('The value of "%(key)s" is not a string or null.'), 'not_a_string': _('The value of %(key)s is not a string or null.'),
} }
_default_hint = ('dict', '{}') _default_hint = ('dict', '{}')

View File

@ -16,7 +16,7 @@ class JSONString(str):
class JSONField(forms.CharField): class JSONField(forms.CharField):
default_error_messages = { default_error_messages = {
'invalid': _("'%(value)s' value must be valid JSON."), 'invalid': _('%(value)s” value must be valid JSON.'),
} }
widget = forms.Textarea widget = forms.Textarea

View File

@ -20,11 +20,11 @@ class Migration(migrations.Migration):
)), )),
('old_path', models.CharField( ('old_path', models.CharField(
help_text=( help_text=(
"This should be an absolute path, excluding the domain name. Example: '/events/search/'." 'This should be an absolute path, excluding the domain name. Example: “/events/search/”.'
), max_length=200, verbose_name='redirect from', db_index=True ), max_length=200, verbose_name='redirect from', db_index=True
)), )),
('new_path', models.CharField( ('new_path', models.CharField(
help_text="This can be either an absolute path (as above) or a full URL starting with 'http://'.", help_text='This can be either an absolute path (as above) or a full URL starting with “http://”.',
max_length=200, verbose_name='redirect to', blank=True max_length=200, verbose_name='redirect to', blank=True
)), )),
], ],

View File

@ -9,13 +9,13 @@ class Redirect(models.Model):
_('redirect from'), _('redirect from'),
max_length=200, max_length=200,
db_index=True, db_index=True,
help_text=_("This should be an absolute path, excluding the domain name. Example: '/events/search/'."), help_text=_('This should be an absolute path, excluding the domain name. Example: “/events/search/”.'),
) )
new_path = models.CharField( new_path = models.CharField(
_('redirect to'), _('redirect to'),
max_length=200, max_length=200,
blank=True, blank=True,
help_text=_("This can be either an absolute path (as above) or a full URL starting with 'http://'."), help_text=_('This can be either an absolute path (as above) or a full URL starting with “http://”.'),
) )
class Meta: class Meta:

View File

@ -236,14 +236,14 @@ slug_re = _lazy_re_compile(r'^[-a-zA-Z0-9_]+\Z')
validate_slug = RegexValidator( validate_slug = RegexValidator(
slug_re, slug_re,
# Translators: "letters" means latin letters: a-z and A-Z. # Translators: "letters" means latin letters: a-z and A-Z.
_("Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."), _('Enter a valid “slug” consisting of letters, numbers, underscores or hyphens.'),
'invalid' 'invalid'
) )
slug_unicode_re = _lazy_re_compile(r'^[-\w]+\Z') slug_unicode_re = _lazy_re_compile(r'^[-\w]+\Z')
validate_unicode_slug = RegexValidator( validate_unicode_slug = RegexValidator(
slug_unicode_re, slug_unicode_re,
_("Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or hyphens."), _('Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or hyphens.'),
'invalid' 'invalid'
) )
@ -466,8 +466,8 @@ class DecimalValidator:
@deconstructible @deconstructible
class FileExtensionValidator: class FileExtensionValidator:
message = _( message = _(
"File extension '%(extension)s' is not allowed. " 'File extension “%(extension)s” is not allowed. '
"Allowed extensions are: '%(allowed_extensions)s'." 'Allowed extensions are: %(allowed_extensions)s.'
) )
code = 'invalid_extension' code = 'invalid_extension'

View File

@ -899,7 +899,7 @@ class AutoField(Field):
empty_strings_allowed = False empty_strings_allowed = False
default_error_messages = { default_error_messages = {
'invalid': _("'%(value)s' value must be an integer."), 'invalid': _('%(value)s” value must be an integer.'),
} }
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -986,8 +986,8 @@ class BigAutoField(AutoField):
class BooleanField(Field): class BooleanField(Field):
empty_strings_allowed = False empty_strings_allowed = False
default_error_messages = { default_error_messages = {
'invalid': _("'%(value)s' value must be either True or False."), 'invalid': _('%(value)s” value must be either True or False.'),
'invalid_nullable': _("'%(value)s' value must be either True, False, or None."), 'invalid_nullable': _('%(value)s” value must be either True, False, or None.'),
} }
description = _("Boolean (Either True or False)") description = _("Boolean (Either True or False)")
@ -1143,10 +1143,10 @@ class DateTimeCheckMixin:
class DateField(DateTimeCheckMixin, Field): class DateField(DateTimeCheckMixin, Field):
empty_strings_allowed = False empty_strings_allowed = False
default_error_messages = { default_error_messages = {
'invalid': _("'%(value)s' value has an invalid date format. It must be " 'invalid': _('%(value)s” value has an invalid date format. It must be '
"in YYYY-MM-DD format."), 'in YYYY-MM-DD format.'),
'invalid_date': _("'%(value)s' value has the correct format (YYYY-MM-DD) " 'invalid_date': _('%(value)s” value has the correct format (YYYY-MM-DD) '
"but it is an invalid date."), 'but it is an invalid date.'),
} }
description = _("Date (without time)") description = _("Date (without time)")
@ -1286,13 +1286,13 @@ class DateField(DateTimeCheckMixin, Field):
class DateTimeField(DateField): class DateTimeField(DateField):
empty_strings_allowed = False empty_strings_allowed = False
default_error_messages = { default_error_messages = {
'invalid': _("'%(value)s' value has an invalid format. It must be in " 'invalid': _('%(value)s” value has an invalid format. It must be in '
"YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format."), 'YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format.'),
'invalid_date': _("'%(value)s' value has the correct format " 'invalid_date': _("%(value)s value has the correct format "
"(YYYY-MM-DD) but it is an invalid date."), "(YYYY-MM-DD) but it is an invalid date."),
'invalid_datetime': _("'%(value)s' value has the correct format " 'invalid_datetime': _('%(value)s” value has the correct format '
"(YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " '(YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) '
"but it is an invalid date/time."), 'but it is an invalid date/time.'),
} }
description = _("Date (with time)") description = _("Date (with time)")
@ -1442,7 +1442,7 @@ class DateTimeField(DateField):
class DecimalField(Field): class DecimalField(Field):
empty_strings_allowed = False empty_strings_allowed = False
default_error_messages = { default_error_messages = {
'invalid': _("'%(value)s' value must be a decimal number."), 'invalid': _('%(value)s” value must be a decimal number.'),
} }
description = _("Decimal number") description = _("Decimal number")
@ -1583,8 +1583,8 @@ class DurationField(Field):
""" """
empty_strings_allowed = False empty_strings_allowed = False
default_error_messages = { default_error_messages = {
'invalid': _("'%(value)s' value has an invalid format. It must be in " 'invalid': _('%(value)s” value has an invalid format. It must be in '
"[DD] [[HH:]MM:]ss[.uuuuuu] format.") '[DD] [[HH:]MM:]ss[.uuuuuu] format.')
} }
description = _("Duration") description = _("Duration")
@ -1725,7 +1725,7 @@ class FilePathField(Field):
class FloatField(Field): class FloatField(Field):
empty_strings_allowed = False empty_strings_allowed = False
default_error_messages = { default_error_messages = {
'invalid': _("'%(value)s' value must be a float."), 'invalid': _('%(value)s” value must be a float.'),
} }
description = _("Floating point number") description = _("Floating point number")
@ -1760,7 +1760,7 @@ class FloatField(Field):
class IntegerField(Field): class IntegerField(Field):
empty_strings_allowed = False empty_strings_allowed = False
default_error_messages = { default_error_messages = {
'invalid': _("'%(value)s' value must be an integer."), 'invalid': _('%(value)s” value must be an integer.'),
} }
description = _("Integer") description = _("Integer")
@ -1967,8 +1967,8 @@ class GenericIPAddressField(Field):
class NullBooleanField(BooleanField): class NullBooleanField(BooleanField):
default_error_messages = { default_error_messages = {
'invalid': _("'%(value)s' value must be either None, True or False."), 'invalid': _('%(value)s” value must be either None, True or False.'),
'invalid_nullable': _("'%(value)s' value must be either None, True or False."), 'invalid_nullable': _('%(value)s” value must be either None, True or False.'),
} }
description = _("Boolean (Either True, False or None)") description = _("Boolean (Either True, False or None)")
@ -2099,10 +2099,10 @@ class TextField(Field):
class TimeField(DateTimeCheckMixin, Field): class TimeField(DateTimeCheckMixin, Field):
empty_strings_allowed = False empty_strings_allowed = False
default_error_messages = { default_error_messages = {
'invalid': _("'%(value)s' value has an invalid format. It must be in " 'invalid': _('%(value)s” value has an invalid format. It must be in '
"HH:MM[:ss[.uuuuuu]] format."), 'HH:MM[:ss[.uuuuuu]] format.'),
'invalid_time': _("'%(value)s' value has the correct format " 'invalid_time': _('%(value)s” value has the correct format '
"(HH:MM[:ss[.uuuuuu]]) but it is an invalid time."), '(HH:MM[:ss[.uuuuuu]]) but it is an invalid time.'),
} }
description = _("Time") description = _("Time")
@ -2317,7 +2317,7 @@ class BinaryField(Field):
class UUIDField(Field): class UUIDField(Field):
default_error_messages = { default_error_messages = {
'invalid': _("'%(value)s' is not a valid UUID."), 'invalid': _('%(value)s” is not a valid UUID.'),
} }
description = _('Universally unique identifier') description = _('Universally unique identifier')
empty_strings_allowed = False empty_strings_allowed = False

View File

@ -1272,7 +1272,7 @@ class ModelMultipleChoiceField(ModelChoiceField):
'list': _('Enter a list of values.'), 'list': _('Enter a list of values.'),
'invalid_choice': _('Select a valid choice. %(value)s is not one of the' 'invalid_choice': _('Select a valid choice. %(value)s is not one of the'
' available choices.'), ' available choices.'),
'invalid_pk_value': _('"%(pk)s" is not a valid value.') 'invalid_pk_value': _('%(pk)s is not a valid value.')
} }
def __init__(self, queryset, **kwargs): def __init__(self, queryset, **kwargs):

View File

@ -159,7 +159,7 @@ def from_current_timezone(value):
return timezone.make_aware(value, current_timezone) return timezone.make_aware(value, current_timezone)
except Exception as exc: except Exception as exc:
raise ValidationError( raise ValidationError(
_('%(datetime)s couldn\'t be interpreted ' _('%(datetime)s couldnt be interpreted '
'in time zone %(current_timezone)s; it ' 'in time zone %(current_timezone)s; it '
'may be ambiguous or it may not exist.'), 'may be ambiguous or it may not exist.'),
code='ambiguous_timezone', code='ambiguous_timezone',

View File

@ -112,21 +112,21 @@ def csrf_failure(request, reason="", template_name=CSRF_FAILURE_TEMPLATE_NAME):
'reason': reason, 'reason': reason,
'no_referer': reason == REASON_NO_REFERER, 'no_referer': reason == REASON_NO_REFERER,
'no_referer1': _( 'no_referer1': _(
"You are seeing this message because this HTTPS site requires a " 'You are seeing this message because this HTTPS site requires a '
"'Referer header' to be sent by your Web browser, but none was " '“Referer header” to be sent by your Web browser, but none was '
"sent. This header is required for security reasons, to ensure " 'sent. This header is required for security reasons, to ensure '
"that your browser is not being hijacked by third parties."), 'that your browser is not being hijacked by third parties.'),
'no_referer2': _( 'no_referer2': _(
"If you have configured your browser to disable 'Referer' headers, " 'If you have configured your browser to disable “Referer” headers, '
"please re-enable them, at least for this site, or for HTTPS " 'please re-enable them, at least for this site, or for HTTPS '
"connections, or for 'same-origin' requests."), 'connections, or for “same-origin” requests.'),
'no_referer3': _( 'no_referer3': _(
"If you are using the <meta name=\"referrer\" " 'If you are using the <meta name="referrer" '
"content=\"no-referrer\"> tag or including the 'Referrer-Policy: " 'content=\"no-referrer\"> tag or including the “Referrer-Policy: '
"no-referrer' header, please remove them. The CSRF protection " 'no-referrer” header, please remove them. The CSRF protection '
"requires the 'Referer' header to do strict referer checking. If " 'requires the “Referer” header to do strict referer checking. If '
"you're concerned about privacy, use alternatives like " 'youre concerned about privacy, use alternatives like '
"<a rel=\"noreferrer\" ...> for links to third-party sites."), '<a rel=\"noreferrer\" …> for links to third-party sites.'),
'no_cookie': reason == REASON_NO_CSRF_COOKIE, 'no_cookie': reason == REASON_NO_CSRF_COOKIE,
'no_cookie1': _( 'no_cookie1': _(
"You are seeing this message because this site requires a CSRF " "You are seeing this message because this site requires a CSRF "
@ -134,9 +134,9 @@ def csrf_failure(request, reason="", template_name=CSRF_FAILURE_TEMPLATE_NAME):
"security reasons, to ensure that your browser is not being " "security reasons, to ensure that your browser is not being "
"hijacked by third parties."), "hijacked by third parties."),
'no_cookie2': _( 'no_cookie2': _(
"If you have configured your browser to disable cookies, please " 'If you have configured your browser to disable cookies, please '
"re-enable them, at least for this site, or for 'same-origin' " 're-enable them, at least for this site, or for “same-origin” '
"requests."), 'requests.'),
'DEBUG': settings.DEBUG, 'DEBUG': settings.DEBUG,
'docs_version': get_docs_version(), 'docs_version': get_docs_version(),
'more': _("More information is available with DEBUG=True."), 'more': _("More information is available with DEBUG=True."),

View File

@ -620,7 +620,7 @@ def _date_from_string(year, year_format, month='', month_format='', day='', day_
try: try:
return datetime.datetime.strptime(datestr, format).date() return datetime.datetime.strptime(datestr, format).date()
except ValueError: except ValueError:
raise Http404(_("Invalid date string '%(datestr)s' given format '%(format)s'") % { raise Http404(_('Invalid date string “%(datestr)s” given format “%(format)s') % {
'datestr': datestr, 'datestr': datestr,
'format': format, 'format': format,
}) })

View File

@ -64,7 +64,7 @@ class MultipleObjectMixin(ContextMixin):
if page == 'last': if page == 'last':
page_number = paginator.num_pages page_number = paginator.num_pages
else: else:
raise Http404(_("Page is not 'last', nor can it be converted to an int.")) raise Http404(_('Page is not “last”, nor can it be converted to an int.'))
try: try:
page = paginator.page(page_number) page = paginator.page(page_number)
return (paginator, page, page.object_list, page.has_other_pages()) return (paginator, page, page.object_list, page.has_other_pages())
@ -151,7 +151,7 @@ class BaseListView(MultipleObjectMixin, View):
else: else:
is_empty = not self.object_list is_empty = not self.object_list
if is_empty: if is_empty:
raise Http404(_("Empty list and '%(class_name)s.allow_empty' is False.") % { raise Http404(_('Empty list and “%(class_name)s.allow_empty” is False.') % {
'class_name': self.__class__.__name__, 'class_name': self.__class__.__name__,
}) })
context = self.get_context_data() context = self.get_context_data()

View File

@ -39,7 +39,7 @@ def serve(request, path, document_root=None, show_indexes=False):
return directory_index(path, fullpath) return directory_index(path, fullpath)
raise Http404(_("Directory indexes are not allowed here.")) raise Http404(_("Directory indexes are not allowed here."))
if not fullpath.exists(): if not fullpath.exists():
raise Http404(_('"%(path)s" does not exist') % {'path': fullpath}) raise Http404(_('%(path)s does not exist') % {'path': fullpath})
# Respect the If-Modified-Since header. # Respect the If-Modified-Since header.
statobj = fullpath.stat() statobj = fullpath.stat()
if not was_modified_since(request.META.get('HTTP_IF_MODIFIED_SINCE'), if not was_modified_since(request.META.get('HTTP_IF_MODIFIED_SINCE'),

View File

@ -382,7 +382,7 @@
</svg> </svg>
<div> <div>
<h4>{% trans "Django Documentation" %}</h4> <h4>{% trans "Django Documentation" %}</h4>
<p>{% trans "Topics, references, &amp; how-to's" %}</p> <p>{% trans 'Topics, references, &amp; how-tos' %}</p>
</div> </div>
</div> </div>
</a> </a>

View File

@ -1115,7 +1115,7 @@ class GetAdminLogTests(TestCase):
'{{ entry|safe }}' '{{ entry|safe }}'
'{% endfor %}' '{% endfor %}'
) )
self.assertEqual(t.render(Context({})), 'Added "<User: jondoe>".') self.assertEqual(t.render(Context({})), 'Added “<User: jondoe>”.')
def test_missing_args(self): def test_missing_args(self):
msg = "'get_admin_log' statements require two arguments" msg = "'get_admin_log' statements require two arguments"

View File

@ -105,7 +105,7 @@ class AdminDocViewTests(TestDataMixin, AdminDocsTestCase):
def test_template_detail(self): def test_template_detail(self):
response = self.client.get(reverse('django-admindocs-templates', args=['admin_doc/template_detail.html'])) response = self.client.get(reverse('django-admindocs-templates', args=['admin_doc/template_detail.html']))
self.assertContains(response, '<h1>Template: "admin_doc/template_detail.html"</h1>', html=True) self.assertContains(response, '<h1>Template: <q>admin_doc/template_detail.html</q></h1>', html=True)
def test_missing_docutils(self): def test_missing_docutils(self):
utils.docutils_is_available = False utils.docutils_is_available = False

View File

@ -131,9 +131,9 @@ class LogEntryTests(TestCase):
) )
self.assertEqual( self.assertEqual(
logentry.get_change_message(), logentry.get_change_message(),
'Changed Domain. Added article "Added article". ' 'Changed Domain. Added article “Added article”. '
'Changed Title and not_a_form_field for article "Changed Title". ' 'Changed Title and not_a_form_field for article “Changed Title”. '
'Deleted article "Title second article".' 'Deleted article “Title second article”.'
) )
with translation.override('fr'): with translation.override('fr'):

View File

@ -899,7 +899,7 @@ class StateAdminForm(forms.ModelForm):
class Meta: class Meta:
model = State model = State
fields = '__all__' fields = '__all__'
labels = {"name": "State name (from form's Meta.labels)"} labels = {'name': 'State name (from forms Meta.labels)'}
@property @property
def changed_data(self): def changed_data(self):

View File

@ -39,7 +39,7 @@ class AdminHistoryViewTests(TestCase):
logentry = LogEntry.objects.filter(content_type__model__iexact='state').latest('id') logentry = LogEntry.objects.filter(content_type__model__iexact='state').latest('id')
self.assertEqual( self.assertEqual(
logentry.get_change_message(), logentry.get_change_message(),
'Changed State name (from form\'s Meta.labels), ' 'Changed State name (from forms Meta.labels), '
'nolabel_form_field and not_a_form_field. ' 'nolabel_form_field and not_a_form_field. '
'Changed City verbose_name for city "%s".' % city 'Changed City verbose_name for city %s.' % city
) )

View File

@ -227,7 +227,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
self.assertRedirects(response, reverse('admin:index')) self.assertRedirects(response, reverse('admin:index'))
self.assertEqual( self.assertEqual(
[m.message for m in response.context['messages']], [m.message for m in response.context['messages']],
["""section with ID "abc/<b>" doesn't exist. Perhaps it was deleted?"""] ['section with ID “abc/<b>” doesnt exist. Perhaps it was deleted?']
) )
def test_basic_edit_GET_old_url_redirect(self): def test_basic_edit_GET_old_url_redirect(self):
@ -248,7 +248,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
self.assertRedirects(response, reverse('admin:index')) self.assertRedirects(response, reverse('admin:index'))
self.assertEqual( self.assertEqual(
[m.message for m in response.context['messages']], [m.message for m in response.context['messages']],
["""super villain with ID "abc" doesn't exist. Perhaps it was deleted?"""] ['super villain with ID “abc” doesnt exist. Perhaps it was deleted?']
) )
def test_basic_add_POST(self): def test_basic_add_POST(self):
@ -1705,7 +1705,7 @@ class AdminViewPermissionsTest(TestCase):
self.assertEqual(Article.objects.count(), 4) self.assertEqual(Article.objects.count(), 4)
article = Article.objects.latest('pk') article = Article.objects.latest('pk')
response = self.client.get(reverse('admin:admin_views_article_change', args=(article.pk,))) response = self.client.get(reverse('admin:admin_views_article_change', args=(article.pk,)))
self.assertContains(response, '<li class="success">The article "Døm ikke" was added successfully.</li>') self.assertContains(response, '<li class="success">The article “Døm ikke” was added successfully.</li>')
article.delete() article.delete()
self.client.get(reverse('admin:logout')) self.client.get(reverse('admin:logout'))
@ -2113,7 +2113,7 @@ class AdminViewPermissionsTest(TestCase):
self.assertRedirects(response, reverse('admin:index')) self.assertRedirects(response, reverse('admin:index'))
self.assertEqual( self.assertEqual(
[m.message for m in response.context['messages']], [m.message for m in response.context['messages']],
["""article with ID "nonexistent" doesn't exist. Perhaps it was deleted?"""] ['article with ID “nonexistent” doesnt exist. Perhaps it was deleted?']
) )
def test_history_view(self): def test_history_view(self):
@ -2170,7 +2170,7 @@ class AdminViewPermissionsTest(TestCase):
self.assertRedirects(response, reverse('admin:index')) self.assertRedirects(response, reverse('admin:index'))
self.assertEqual( self.assertEqual(
[m.message for m in response.context['messages']], [m.message for m in response.context['messages']],
["""article with ID "foo" doesn't exist. Perhaps it was deleted?"""] ['article with ID “foo” doesnt exist. Perhaps it was deleted?']
) )
def test_conditionally_show_add_section_link(self): def test_conditionally_show_add_section_link(self):
@ -2399,7 +2399,7 @@ class AdminViewPermissionsTest(TestCase):
response = self.client.post(reverse('admin:admin_views_article_add'), post_data, follow=True) response = self.client.post(reverse('admin:admin_views_article_add'), post_data, follow=True)
self.assertContains( self.assertContains(
response, response,
'<li class="success">The article "Fun &amp; games" was added successfully.</li>', '<li class="success">The article “Fun &amp; games” was added successfully.</li>',
html=True html=True
) )
@ -3689,7 +3689,7 @@ class AdminCustomQuerysetTest(TestCase):
self.assertRedirects(response, reverse('admin:index')) self.assertRedirects(response, reverse('admin:index'))
self.assertEqual( self.assertEqual(
[m.message for m in response.context['messages']], [m.message for m in response.context['messages']],
["""empty model with ID "1" doesn't exist. Perhaps it was deleted?"""] ['empty model with ID “1” doesnt exist. Perhaps it was deleted?']
) )
def test_add_model_modeladmin_defer_qs(self): def test_add_model_modeladmin_defer_qs(self):
@ -3709,8 +3709,8 @@ class AdminCustomQuerysetTest(TestCase):
pk = CoverLetter.objects.all()[0].pk pk = CoverLetter.objects.all()[0].pk
self.assertContains( self.assertContains(
response, response,
'<li class="success">The cover letter "<a href="%s">' '<li class="success">The cover letter <a href="%s">'
'Candidate, Best</a>" was added successfully.</li>' % 'Candidate, Best</a> was added successfully.</li>' %
reverse('admin:admin_views_coverletter_change', args=(pk,)), html=True reverse('admin:admin_views_coverletter_change', args=(pk,)), html=True
) )
@ -3728,8 +3728,8 @@ class AdminCustomQuerysetTest(TestCase):
sm = ShortMessage.objects.all()[0] sm = ShortMessage.objects.all()[0]
self.assertContains( self.assertContains(
response, response,
'<li class="success">The short message "<a href="%s">' '<li class="success">The short message <a href="%s">'
'%s</a>" was added successfully.</li>' % '%s</a> was added successfully.</li>' %
(reverse('admin:admin_views_shortmessage_change', args=(sm.pk,)), sm), html=True (reverse('admin:admin_views_shortmessage_change', args=(sm.pk,)), sm), html=True
) )
@ -3750,8 +3750,8 @@ class AdminCustomQuerysetTest(TestCase):
pk = Telegram.objects.all()[0].pk pk = Telegram.objects.all()[0].pk
self.assertContains( self.assertContains(
response, response,
'<li class="success">The telegram "<a href="%s">' '<li class="success">The telegram <a href="%s">'
'Urgent telegram</a>" was added successfully.</li>' % 'Urgent telegram</a> was added successfully.</li>' %
reverse('admin:admin_views_telegram_change', args=(pk,)), html=True reverse('admin:admin_views_telegram_change', args=(pk,)), html=True
) )
@ -3769,8 +3769,8 @@ class AdminCustomQuerysetTest(TestCase):
p = Paper.objects.all()[0] p = Paper.objects.all()[0]
self.assertContains( self.assertContains(
response, response,
'<li class="success">The paper "<a href="%s">' '<li class="success">The paper <a href="%s">'
'%s</a>" was added successfully.</li>' % '%s</a> was added successfully.</li>' %
(reverse('admin:admin_views_paper_change', args=(p.pk,)), p), html=True (reverse('admin:admin_views_paper_change', args=(p.pk,)), p), html=True
) )
@ -3795,8 +3795,8 @@ class AdminCustomQuerysetTest(TestCase):
# representation is set by model's __str__() # representation is set by model's __str__()
self.assertContains( self.assertContains(
response, response,
'<li class="success">The cover letter "<a href="%s">' '<li class="success">The cover letter <a href="%s">'
'John Doe II</a>" was changed successfully.</li>' % 'John Doe II</a> was changed successfully.</li>' %
reverse('admin:admin_views_coverletter_change', args=(cl.pk,)), html=True reverse('admin:admin_views_coverletter_change', args=(cl.pk,)), html=True
) )
@ -3818,8 +3818,8 @@ class AdminCustomQuerysetTest(TestCase):
# instance representation is set by __str__(). # instance representation is set by __str__().
self.assertContains( self.assertContains(
response, response,
'<li class="success">The short message "<a href="%s">' '<li class="success">The short message <a href="%s">'
'%s</a>" was changed successfully.</li>' % '%s</a> was changed successfully.</li>' %
(reverse('admin:admin_views_shortmessage_change', args=(sm.pk,)), sm), html=True (reverse('admin:admin_views_shortmessage_change', args=(sm.pk,)), sm), html=True
) )
@ -3843,8 +3843,8 @@ class AdminCustomQuerysetTest(TestCase):
# representation is set by model's __str__() # representation is set by model's __str__()
self.assertContains( self.assertContains(
response, response,
'<li class="success">The telegram "<a href="%s">' '<li class="success">The telegram <a href="%s">'
'Telegram without typo</a>" was changed successfully.</li>' % 'Telegram without typo</a> was changed successfully.</li>' %
reverse('admin:admin_views_telegram_change', args=(t.pk,)), html=True reverse('admin:admin_views_telegram_change', args=(t.pk,)), html=True
) )
@ -3865,8 +3865,8 @@ class AdminCustomQuerysetTest(TestCase):
# instance representation is set by __str__(). # instance representation is set by __str__().
self.assertContains( self.assertContains(
response, response,
'<li class="success">The paper "<a href="%s">' '<li class="success">The paper <a href="%s">'
'%s</a>" was changed successfully.</li>' % '%s</a> was changed successfully.</li>' %
(reverse('admin:admin_views_paper_change', args=(p.pk,)), p), html=True (reverse('admin:admin_views_paper_change', args=(p.pk,)), p), html=True
) )
@ -5161,8 +5161,8 @@ class UserAdminTest(TestCase):
response = self.client.get(new_user_url) response = self.client.get(new_user_url)
self.assertContains( self.assertContains(
response, response,
'<li class="success">The user "<a href="%s">' '<li class="success">The user <a href="%s">'
'%s</a>" was added successfully. You may edit it again below.</li>' '%s</a> was added successfully. You may edit it again below.</li>'
% (new_user_url, new_user), % (new_user_url, new_user),
html=True, html=True,
) )
@ -5175,7 +5175,7 @@ class UserAdminTest(TestCase):
}) })
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertFormError(response, 'adminform', 'password', []) self.assertFormError(response, 'adminform', 'password', [])
self.assertFormError(response, 'adminform', 'password2', ["The two password fields didn't match."]) self.assertFormError(response, 'adminform', 'password2', ['The two password fields didnt match.'])
def test_user_fk_add_popup(self): def test_user_fk_add_popup(self):
"""User addition through a FK popup should return the appropriate JavaScript response.""" """User addition through a FK popup should return the appropriate JavaScript response."""

View File

@ -181,7 +181,7 @@ class AdminFormfieldForDBFieldTests(SimpleTestCase):
f = ma.formfield_for_dbfield(Advisor._meta.get_field('companies'), request=None) f = ma.formfield_for_dbfield(Advisor._meta.get_field('companies'), request=None)
self.assertEqual( self.assertEqual(
f.help_text, f.help_text,
'Hold down "Control", or "Command" on a Mac, to select more than one.' 'Hold down “Control”, or “Command” on a Mac, to select more than one.'
) )

View File

@ -236,7 +236,7 @@ class UserCreationFormTest(TestDataMixin, TestCase):
form = UserCreationForm() form = UserCreationForm()
self.assertEqual( self.assertEqual(
form.fields['password1'].help_text, form.fields['password1'].help_text,
'<ul><li>Your password can&#x27;t be too similar to your other personal information.</li></ul>' '<ul><li>Your password cant be too similar to your other personal information.</li></ul>'
) )
@override_settings(AUTH_PASSWORD_VALIDATORS=[ @override_settings(AUTH_PASSWORD_VALIDATORS=[

View File

@ -178,7 +178,7 @@ class UserAttributeSimilarityValidatorTest(TestCase):
def test_help_text(self): def test_help_text(self):
self.assertEqual( self.assertEqual(
UserAttributeSimilarityValidator().get_help_text(), UserAttributeSimilarityValidator().get_help_text(),
"Your password can't be too similar to your other personal information." 'Your password cant be too similar to your other personal information.'
) )
@ -210,7 +210,7 @@ class CommonPasswordValidatorTest(SimpleTestCase):
def test_help_text(self): def test_help_text(self):
self.assertEqual( self.assertEqual(
CommonPasswordValidator().get_help_text(), CommonPasswordValidator().get_help_text(),
"Your password can't be a commonly used password." 'Your password cant be a commonly used password.'
) )
@ -227,7 +227,7 @@ class NumericPasswordValidatorTest(SimpleTestCase):
def test_help_text(self): def test_help_text(self):
self.assertEqual( self.assertEqual(
NumericPasswordValidator().get_help_text(), NumericPasswordValidator().get_help_text(),
"Your password can't be entirely numeric." 'Your password cant be entirely numeric.'
) )

View File

@ -51,8 +51,8 @@ class FlatpageAdminFormTests(TestCase):
with translation.override('en'): with translation.override('en'):
self.assertEqual( self.assertEqual(
form.fields['url'].help_text, form.fields['url'].help_text,
"Example: '/about/contact/'. Make sure to have leading and " 'Example: “/about/contact/”. Make sure to have leading and '
"trailing slashes." 'trailing slashes.'
) )
self.assertFalse(form.is_valid()) self.assertFalse(form.is_valid())
self.assertEqual(form.errors['url'], ["URL is missing a trailing slash."]) self.assertEqual(form.errors['url'], ["URL is missing a trailing slash."])
@ -64,7 +64,7 @@ class FlatpageAdminFormTests(TestCase):
with translation.override('en'): with translation.override('en'):
self.assertEqual( self.assertEqual(
form.fields['url'].help_text, form.fields['url'].help_text,
"Example: '/about/contact'. Make sure to have a leading slash." 'Example: “/about/contact”. Make sure to have a leading slash.'
) )
def test_flatpage_admin_form_url_uniqueness_validation(self): def test_flatpage_admin_form_url_uniqueness_validation(self):

View File

@ -66,7 +66,7 @@ class ImageFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
with open(img_path, 'rb') as img_file: with open(img_path, 'rb') as img_file:
img_data = img_file.read() img_data = img_file.read()
img_file = SimpleUploadedFile('1x1.txt', img_data) img_file = SimpleUploadedFile('1x1.txt', img_data)
with self.assertRaisesMessage(ValidationError, "File extension 'txt' is not allowed."): with self.assertRaisesMessage(ValidationError, 'File extension “txt” is not allowed.'):
f.clean(img_file) f.clean(img_file)
def test_widget_attrs_default_accept(self): def test_widget_attrs_default_accept(self):

View File

@ -276,7 +276,7 @@ class FormsErrorMessagesTestCase(SimpleTestCase, AssertFormErrorsMixin):
self.assertHTMLEqual( self.assertHTMLEqual(
t.render(Context({'form': f})), t.render(Context({'form': f})),
'<ul class="errorlist"><li>field<ul class="errorlist">' '<ul class="errorlist"><li>field<ul class="errorlist">'
'<li>&quot;&lt;script&gt;&quot; is not a valid value.</li>' '<li>“&lt;script&gt;” is not a valid value.</li>'
'</ul></li></ul>' '</ul></li></ul>'
) )

View File

@ -1275,7 +1275,7 @@ class AutodetectorTests(TestCase):
"testapp", "model", [("id", models.AutoField(primary_key=True, validators=[ "testapp", "model", [("id", models.AutoField(primary_key=True, validators=[
RegexValidator( RegexValidator(
re.compile('^[-a-zA-Z0-9_]+\\Z'), re.compile('^[-a-zA-Z0-9_]+\\Z'),
"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'Enter a valid “slug” consisting of letters, numbers, underscores or hyphens.',
'invalid' 'invalid'
) )
]))] ]))]
@ -1292,7 +1292,7 @@ class AutodetectorTests(TestCase):
"testapp", "model", [("id", models.AutoField(primary_key=True, validators=[ "testapp", "model", [("id", models.AutoField(primary_key=True, validators=[
RegexValidator( RegexValidator(
re.compile('^[a-z]+\\Z', 32), re.compile('^[a-z]+\\Z', 32),
"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'Enter a valid “slug” consisting of letters, numbers, underscores or hyphens.',
'invalid' 'invalid'
) )
]))] ]))]

View File

@ -21,7 +21,7 @@ class DecimalFieldTests(TestCase):
# Uses default rounding of ROUND_HALF_EVEN. # Uses default rounding of ROUND_HALF_EVEN.
self.assertEqual(f.to_python(2.0625), Decimal('2.062')) self.assertEqual(f.to_python(2.0625), Decimal('2.062'))
self.assertEqual(f.to_python(2.1875), Decimal('2.188')) self.assertEqual(f.to_python(2.1875), Decimal('2.188'))
msg = "'abc' value must be a decimal number." msg = '“abc” value must be a decimal number.'
with self.assertRaisesMessage(ValidationError, msg): with self.assertRaisesMessage(ValidationError, msg):
f.to_python('abc') f.to_python('abc')

View File

@ -74,8 +74,8 @@ class TestValidation(SimpleTestCase):
self.assertEqual(cm.exception.code, 'invalid') self.assertEqual(cm.exception.code, 'invalid')
self.assertEqual( self.assertEqual(
cm.exception.message % cm.exception.params, cm.exception.message % cm.exception.params,
"'not a datetime' value has an invalid format. " '“not a datetime” value has an invalid format. '
"It must be in [DD] [[HH:]MM:]ss[.uuuuuu] format." 'It must be in [DD] [[HH:]MM:]ss[.uuuuuu] format.'
) )

View File

@ -133,7 +133,7 @@ class TestValidation(SimpleTestCase):
with self.assertRaises(exceptions.ValidationError) as cm: with self.assertRaises(exceptions.ValidationError) as cm:
field.clean('550e8400', None) field.clean('550e8400', None)
self.assertEqual(cm.exception.code, 'invalid') self.assertEqual(cm.exception.code, 'invalid')
self.assertEqual(cm.exception.message % cm.exception.params, "'550e8400' is not a valid UUID.") self.assertEqual(cm.exception.message % cm.exception.params, '“550e8400” is not a valid UUID.')
def test_uuid_instance_ok(self): def test_uuid_instance_ok(self):
field = models.UUIDField() field = models.UUIDField()

View File

@ -29,5 +29,5 @@ class ModelFormBaseTest(TestCase):
def test_model_multiple_choice_field_uuid_pk(self): def test_model_multiple_choice_field_uuid_pk(self):
f = forms.ModelMultipleChoiceField(UUIDPK.objects.all()) f = forms.ModelMultipleChoiceField(UUIDPK.objects.all())
with self.assertRaisesMessage(ValidationError, "'invalid_uuid' is not a valid UUID."): with self.assertRaisesMessage(ValidationError, '“invalid_uuid” is not a valid UUID.'):
f.clean(['invalid_uuid']) f.clean(['invalid_uuid'])

View File

@ -1358,7 +1358,7 @@ class ModelFormBasicTests(TestCase):
self.assertEqual(f.errors['name'], ['This field is required.']) self.assertEqual(f.errors['name'], ['This field is required.'])
self.assertEqual( self.assertEqual(
f.errors['slug'], f.errors['slug'],
["Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."] ['Enter a valid “slug” consisting of letters, numbers, underscores or hyphens.']
) )
self.assertEqual(f.cleaned_data, {'url': 'foo'}) self.assertEqual(f.cleaned_data, {'url': 'foo'})
msg = "The Category could not be created because the data didn't validate." msg = "The Category could not be created because the data didn't validate."

View File

@ -251,7 +251,7 @@ class TestValidation(PostgreSQLSimpleTestCase):
with self.assertRaises(exceptions.ValidationError) as cm: with self.assertRaises(exceptions.ValidationError) as cm:
field.clean({'a': 1}, None) field.clean({'a': 1}, None)
self.assertEqual(cm.exception.code, 'not_a_string') self.assertEqual(cm.exception.code, 'not_a_string')
self.assertEqual(cm.exception.message % cm.exception.params, 'The value of "a" is not a string or null.') self.assertEqual(cm.exception.message % cm.exception.params, 'The value of “a” is not a string or null.')
def test_none_allowed_as_value(self): def test_none_allowed_as_value(self):
field = HStoreField() field = HStoreField()

View File

@ -426,7 +426,7 @@ class TestFormField(PostgreSQLSimpleTestCase):
field = forms.JSONField() field = forms.JSONField()
with self.assertRaises(exceptions.ValidationError) as cm: with self.assertRaises(exceptions.ValidationError) as cm:
field.clean('{some badly formed: json}') field.clean('{some badly formed: json}')
self.assertEqual(cm.exception.messages[0], "'{some badly formed: json}' value must be valid JSON.") self.assertEqual(cm.exception.messages[0], '{some badly formed: json}” value must be valid JSON.')
def test_formfield(self): def test_formfield(self):
model_field = JSONField() model_field = JSONField()

View File

@ -1103,8 +1103,8 @@ class NewFormsTests(TestCase):
self.assertFalse(form.is_valid()) self.assertFalse(form.is_valid())
self.assertEqual( self.assertEqual(
form.errors['dt'], [ form.errors['dt'], [
"2011-03-27 02:30:00 couldn't be interpreted in time zone " '2011-03-27 02:30:00 couldnt be interpreted in time zone '
"Europe/Paris; it may be ambiguous or it may not exist." 'Europe/Paris; it may be ambiguous or it may not exist.'
] ]
) )
@ -1114,8 +1114,8 @@ class NewFormsTests(TestCase):
self.assertFalse(form.is_valid()) self.assertFalse(form.is_valid())
self.assertEqual( self.assertEqual(
form.errors['dt'], [ form.errors['dt'], [
"2011-10-30 02:30:00 couldn't be interpreted in time zone " '2011-10-30 02:30:00 couldnt be interpreted in time zone '
"Europe/Paris; it may be ambiguous or it may not exist." 'Europe/Paris; it may be ambiguous or it may not exist.'
] ]
) )

View File

@ -250,7 +250,7 @@ class TestUtilsText(SimpleTestCase):
# The format string can be lazy. (string comes from contrib.admin) # The format string can be lazy. (string comes from contrib.admin)
s = format_lazy( s = format_lazy(
gettext_lazy("Added {name} \"{object}\"."), gettext_lazy('Added {name}{object}”.'),
name='article', object='My first try', name='article', object='My first try',
) )
with override('fr'): with override('fr'):

View File

@ -13,49 +13,49 @@ class ValidationMessagesTest(TestCase):
def test_autofield_field_raises_error_message(self): def test_autofield_field_raises_error_message(self):
f = models.AutoField(primary_key=True) f = models.AutoField(primary_key=True)
self._test_validation_messages(f, 'fõo', ["'fõo' value must be an integer."]) self._test_validation_messages(f, 'fõo', ['“fõo” value must be an integer.'])
def test_integer_field_raises_error_message(self): def test_integer_field_raises_error_message(self):
f = models.IntegerField() f = models.IntegerField()
self._test_validation_messages(f, 'fõo', ["'fõo' value must be an integer."]) self._test_validation_messages(f, 'fõo', ['“fõo” value must be an integer.'])
def test_boolean_field_raises_error_message(self): def test_boolean_field_raises_error_message(self):
f = models.BooleanField() f = models.BooleanField()
self._test_validation_messages(f, 'fõo', ["'fõo' value must be either True or False."]) self._test_validation_messages(f, 'fõo', ['“fõo” value must be either True or False.'])
def test_nullable_boolean_field_raises_error_message(self): def test_nullable_boolean_field_raises_error_message(self):
f = models.BooleanField(null=True) f = models.BooleanField(null=True)
self._test_validation_messages(f, 'fõo', ["'fõo' value must be either True, False, or None."]) self._test_validation_messages(f, 'fõo', ['“fõo” value must be either True, False, or None.'])
def test_float_field_raises_error_message(self): def test_float_field_raises_error_message(self):
f = models.FloatField() f = models.FloatField()
self._test_validation_messages(f, 'fõo', ["'fõo' value must be a float."]) self._test_validation_messages(f, 'fõo', ['“fõo” value must be a float.'])
def test_decimal_field_raises_error_message(self): def test_decimal_field_raises_error_message(self):
f = models.DecimalField() f = models.DecimalField()
self._test_validation_messages(f, 'fõo', ["'fõo' value must be a decimal number."]) self._test_validation_messages(f, 'fõo', ['“fõo” value must be a decimal number.'])
def test_null_boolean_field_raises_error_message(self): def test_null_boolean_field_raises_error_message(self):
f = models.NullBooleanField() f = models.NullBooleanField()
self._test_validation_messages(f, 'fõo', ["'fõo' value must be either None, True or False."]) self._test_validation_messages(f, 'fõo', ['“fõo” value must be either None, True or False.'])
def test_date_field_raises_error_message(self): def test_date_field_raises_error_message(self):
f = models.DateField() f = models.DateField()
self._test_validation_messages( self._test_validation_messages(
f, 'fõo', f, 'fõo',
["'fõo' value has an invalid date format. It must be in YYYY-MM-DD format."] ['“fõo” value has an invalid date format. It must be in YYYY-MM-DD format.']
) )
self._test_validation_messages( self._test_validation_messages(
f, 'aaaa-10-10', f, 'aaaa-10-10',
["'aaaa-10-10' value has an invalid date format. It must be in YYYY-MM-DD format."] ['“aaaa-10-10” value has an invalid date format. It must be in YYYY-MM-DD format.']
) )
self._test_validation_messages( self._test_validation_messages(
f, '2011-13-10', f, '2011-13-10',
["'2011-13-10' value has the correct format (YYYY-MM-DD) but it is an invalid date."] ['“2011-13-10” value has the correct format (YYYY-MM-DD) but it is an invalid date.']
) )
self._test_validation_messages( self._test_validation_messages(
f, '2011-10-32', f, '2011-10-32',
["'2011-10-32' value has the correct format (YYYY-MM-DD) but it is an invalid date."] ['“2011-10-32” value has the correct format (YYYY-MM-DD) but it is an invalid date.']
) )
def test_datetime_field_raises_error_message(self): def test_datetime_field_raises_error_message(self):
@ -63,18 +63,18 @@ class ValidationMessagesTest(TestCase):
# Wrong format # Wrong format
self._test_validation_messages( self._test_validation_messages(
f, 'fõo', f, 'fõo',
["'fõo' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format."] ['“fõo” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format.']
) )
# Correct format but invalid date # Correct format but invalid date
self._test_validation_messages( self._test_validation_messages(
f, '2011-10-32', f, '2011-10-32',
["'2011-10-32' value has the correct format (YYYY-MM-DD) but it is an invalid date."] ['“2011-10-32” value has the correct format (YYYY-MM-DD) but it is an invalid date.']
) )
# Correct format but invalid date/time # Correct format but invalid date/time
self._test_validation_messages( self._test_validation_messages(
f, '2011-10-32 10:10', f, '2011-10-32 10:10',
["'2011-10-32 10:10' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " ['“2011-10-32 10:10” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) '
"but it is an invalid date/time."] 'but it is an invalid date/time.']
) )
def test_time_field_raises_error_message(self): def test_time_field_raises_error_message(self):
@ -82,10 +82,10 @@ class ValidationMessagesTest(TestCase):
# Wrong format # Wrong format
self._test_validation_messages( self._test_validation_messages(
f, 'fõo', f, 'fõo',
["'fõo' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] format."] ['“fõo” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] format.']
) )
# Correct format but invalid time # Correct format but invalid time
self._test_validation_messages( self._test_validation_messages(
f, '25:50', f, '25:50',
["'25:50' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an invalid time."] ['“25:50” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an invalid time.']
) )

View File

@ -44,22 +44,22 @@ class CsrfViewTests(SimpleTestCase):
self.assertContains( self.assertContains(
response, response,
'You are seeing this message because this HTTPS site requires a ' 'You are seeing this message because this HTTPS site requires a '
'&#x27;Referer header&#x27; to be sent by your Web browser, but ' '“Referer header” to be sent by your Web browser, but '
'none was sent.', 'none was sent.',
status_code=403, status_code=403,
) )
self.assertContains( self.assertContains(
response, response,
'If you have configured your browser to disable &#x27;Referer&#x27; ' 'If you have configured your browser to disable “Referer” '
'headers, please re-enable them, at least for this site, or for ' 'headers, please re-enable them, at least for this site, or for '
'HTTPS connections, or for &#x27;same-origin&#x27; requests.', 'HTTPS connections, or for “same-origin” requests.',
status_code=403, status_code=403,
) )
self.assertContains( self.assertContains(
response, response,
'If you are using the &lt;meta name=&quot;referrer&quot; ' 'If you are using the &lt;meta name=&quot;referrer&quot; '
'content=&quot;no-referrer&quot;&gt; tag or including the ' 'content=&quot;no-referrer&quot;&gt; tag or including the '
'&#x27;Referrer-Policy: no-referrer&#x27; header, please remove them.', '“Referrer-Policy: no-referrer” header, please remove them.',
status_code=403, status_code=403,
) )