Refs #30585 -- Updated project templates and tests to use (block)translate tags.

This commit is contained in:
Mike Hansen 2019-09-23 08:31:21 -07:00 committed by Mariusz Felisiak
parent d291c72bf2
commit 35d36d9462
74 changed files with 547 additions and 532 deletions

View File

@ -1,12 +1,12 @@
{% extends "admin/base_site.html" %} {% extends "admin/base_site.html" %}
{% load i18n %} {% load i18n %}
{% block title %}{% trans 'Page not found' %}{% endblock %} {% block title %}{% translate 'Page not found' %}{% endblock %}
{% block content %} {% block content %}
<h2>{% trans 'Page not found' %}</h2> <h2>{% translate 'Page not found' %}</h2>
<p>{% trans 'Were sorry, but the requested page could not be found.' %}</p> <p>{% translate 'Were sorry, but the requested page could not be found.' %}</p>
{% endblock %} {% endblock %}

View File

@ -3,15 +3,15 @@
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; {% trans 'Server error' %} &rsaquo; {% translate 'Server error' %}
</div> </div>
{% endblock %} {% endblock %}
{% block title %}{% trans 'Server error (500)' %}{% endblock %} {% block title %}{% translate 'Server error (500)' %}{% endblock %}
{% block content %} {% block content %}
<h1>{% trans 'Server Error <em>(500)</em>' %}</h1> <h1>{% translate 'Server Error <em>(500)</em>' %}</h1>
<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> <p>{% translate '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

@ -5,7 +5,7 @@
{% for field in action_form %}{% if field.label %}<label>{{ field.label }} {% endif %}{{ field }}{% if field.label %}</label>{% endif %}{% endfor %} {% for field in action_form %}{% if field.label %}<label>{{ field.label }} {% endif %}{{ field }}{% if field.label %}</label>{% endif %}{% endfor %}
{% endblock %} {% endblock %}
{% block actions-submit %} {% block actions-submit %}
<button type="submit" class="button" title="{% trans "Run the selected action" %}" name="index" value="{{ action_index|default:0 }}">{% trans "Go" %}</button> <button type="submit" class="button" title="{% translate "Run the selected action" %}" name="index" value="{{ action_index|default:0 }}">{% translate "Go" %}</button>
{% endblock %} {% endblock %}
{% block actions-counter %} {% block actions-counter %}
{% if actions_selection_counter %} {% if actions_selection_counter %}
@ -13,9 +13,9 @@
{% if cl.result_count != cl.result_list|length %} {% if cl.result_count != cl.result_list|length %}
<span class="all">{{ selection_note_all }}</span> <span class="all">{{ selection_note_all }}</span>
<span class="question"> <span class="question">
<a href="#" title="{% trans "Click here to select the objects across all pages" %}">{% blocktrans with cl.result_count as total_count %}Select all {{ total_count }} {{ module_name }}{% endblocktrans %}</a> <a href="#" title="{% translate "Click here to select the objects across all pages" %}">{% blocktranslate with cl.result_count as total_count %}Select all {{ total_count }} {{ module_name }}{% endblocktranslate %}</a>
</span> </span>
<span class="clear"><a href="#">{% trans "Clear selection" %}</a></span> <span class="clear"><a href="#">{% translate "Clear selection" %}</a></span>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% endblock %} {% endblock %}

View File

@ -6,7 +6,7 @@
{% if not is_popup %} {% if not is_popup %}
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; &rsaquo;
{% for app in app_list %} {% for app in app_list %}
{{ app.name }} {{ app.name }}

View File

@ -3,8 +3,8 @@
{% block form_top %} {% block form_top %}
{% if not is_popup %} {% if not is_popup %}
<p>{% trans 'First, enter a username and password. Then, youll be able to edit more user options.' %}</p> <p>{% translate '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>{% translate "Enter a username and password." %}</p>
{% endif %} {% endif %}
{% endblock %} {% endblock %}

View File

@ -10,11 +10,11 @@
{% if not is_popup %} {% if not is_popup %}
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a> &rsaquo; <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a>
&rsaquo; <a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a> &rsaquo; <a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a>
&rsaquo; <a href="{% url opts|admin_urlname:'change' original.pk|admin_urlquote %}">{{ original|truncatewords:"18" }}</a> &rsaquo; <a href="{% url opts|admin_urlname:'change' original.pk|admin_urlquote %}">{{ original|truncatewords:"18" }}</a>
&rsaquo; {% trans 'Change password' %} &rsaquo; {% translate 'Change password' %}
</div> </div>
{% endblock %} {% endblock %}
{% endif %} {% endif %}
@ -25,11 +25,11 @@
{% if is_popup %}<input type="hidden" name="_popup" value="1">{% endif %} {% if is_popup %}<input type="hidden" name="_popup" value="1">{% endif %}
{% if form.errors %} {% if form.errors %}
<p class="errornote"> <p class="errornote">
{% if form.errors.items|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %} {% if form.errors.items|length == 1 %}{% translate "Please correct the error below." %}{% else %}{% translate "Please correct the errors below." %}{% endif %}
</p> </p>
{% endif %} {% endif %}
<p>{% blocktrans with username=original %}Enter a new password for the user <strong>{{ username }}</strong>.{% endblocktrans %}</p> <p>{% blocktranslate with username=original %}Enter a new password for the user <strong>{{ username }}</strong>.{% endblocktranslate %}</p>
<fieldset class="module aligned"> <fieldset class="module aligned">
@ -52,7 +52,7 @@
</fieldset> </fieldset>
<div class="submit-row"> <div class="submit-row">
<input type="submit" value="{% trans 'Change password' %}" class="default"> <input type="submit" value="{% translate 'Change password' %}" class="default">
</div> </div>
</div> </div>

View File

@ -32,23 +32,23 @@
{% if has_permission %} {% if has_permission %}
<div id="user-tools"> <div id="user-tools">
{% block welcome-msg %} {% block welcome-msg %}
{% trans 'Welcome,' %} {% translate 'Welcome,' %}
<strong>{% firstof user.get_short_name user.get_username %}</strong>. <strong>{% firstof user.get_short_name user.get_username %}</strong>.
{% endblock %} {% endblock %}
{% block userlinks %} {% block userlinks %}
{% if site_url %} {% if site_url %}
<a href="{{ site_url }}">{% trans 'View site' %}</a> / <a href="{{ site_url }}">{% translate 'View site' %}</a> /
{% endif %} {% endif %}
{% if user.is_active and user.is_staff %} {% if user.is_active and user.is_staff %}
{% url 'django-admindocs-docroot' as docsroot %} {% url 'django-admindocs-docroot' as docsroot %}
{% if docsroot %} {% if docsroot %}
<a href="{{ docsroot }}">{% trans 'Documentation' %}</a> / <a href="{{ docsroot }}">{% translate 'Documentation' %}</a> /
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if user.has_usable_password %} {% if user.has_usable_password %}
<a href="{% url 'admin:password_change' %}">{% trans 'Change password' %}</a> / <a href="{% url 'admin:password_change' %}">{% translate 'Change password' %}</a> /
{% endif %} {% endif %}
<a href="{% url 'admin:logout' %}">{% trans 'Log out' %}</a> <a href="{% url 'admin:logout' %}">{% translate 'Log out' %}</a>
{% endblock %} {% endblock %}
</div> </div>
{% endif %} {% endif %}
@ -58,7 +58,7 @@
<!-- END Header --> <!-- END Header -->
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
{% if title %} &rsaquo; {{ title }}{% endif %} {% if title %} &rsaquo; {{ title }}{% endif %}
</div> </div>
{% endblock %} {% endblock %}

View File

@ -15,10 +15,10 @@
{% if not is_popup %} {% if not is_popup %}
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a> &rsaquo; <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a>
&rsaquo; {% if has_view_permission %}<a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a>{% else %}{{ opts.verbose_name_plural|capfirst }}{% endif %} &rsaquo; {% if has_view_permission %}<a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a>{% else %}{{ opts.verbose_name_plural|capfirst }}{% endif %}
&rsaquo; {% if add %}{% blocktrans with name=opts.verbose_name %}Add {{ name }}{% endblocktrans %}{% else %}{{ original|truncatewords:"18" }}{% endif %} &rsaquo; {% if add %}{% blocktranslate with name=opts.verbose_name %}Add {{ name }}{% endblocktranslate %}{% else %}{{ original|truncatewords:"18" }}{% endif %}
</div> </div>
{% endblock %} {% endblock %}
{% endif %} {% endif %}
@ -40,7 +40,7 @@
{% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %} {% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %}
{% if errors %} {% if errors %}
<p class="errornote"> <p class="errornote">
{% if errors|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %} {% if errors|length == 1 %}{% translate "Please correct the error below." %}{% else %}{% translate "Please correct the errors below." %}{% endif %}
</p> </p>
{{ adminform.form.non_field_errors }} {{ adminform.form.non_field_errors }}
{% endif %} {% endif %}

View File

@ -2,7 +2,7 @@
{% block object-tools-items %} {% block object-tools-items %}
<li> <li>
{% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %} {% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %}
<a href="{% add_preserved_filters history_url %}" class="historylink">{% trans "History" %}</a> <a href="{% add_preserved_filters history_url %}" class="historylink">{% translate "History" %}</a>
</li> </li>
{% if has_absolute_url %}<li><a href="{{ absolute_url }}" class="viewsitelink">{% trans "View on site" %}</a></li>{% endif %} {% if has_absolute_url %}<li><a href="{{ absolute_url }}" class="viewsitelink">{% translate "View on site" %}</a></li>{% endif %}
{% endblock %} {% endblock %}

View File

@ -28,7 +28,7 @@
{% if not is_popup %} {% if not is_popup %}
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; <a href="{% url 'admin:app_list' app_label=cl.opts.app_label %}">{{ cl.opts.app_config.verbose_name }}</a> &rsaquo; <a href="{% url 'admin:app_list' app_label=cl.opts.app_label %}">{{ cl.opts.app_config.verbose_name }}</a>
&rsaquo; {{ cl.opts.verbose_name_plural|capfirst }} &rsaquo; {{ cl.opts.verbose_name_plural|capfirst }}
</div> </div>
@ -48,7 +48,7 @@
{% endblock %} {% endblock %}
{% if cl.formset and cl.formset.errors %} {% if cl.formset and cl.formset.errors %}
<p class="errornote"> <p class="errornote">
{% if cl.formset.total_error_count == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %} {% if cl.formset.total_error_count == 1 %}{% translate "Please correct the error below." %}{% else %}{% translate "Please correct the errors below." %}{% endif %}
</p> </p>
{{ cl.formset.non_form_errors }} {{ cl.formset.non_form_errors }}
{% endif %} {% endif %}
@ -59,7 +59,7 @@
{% block filters %} {% block filters %}
{% if cl.has_filters %} {% if cl.has_filters %}
<div id="changelist-filter"> <div id="changelist-filter">
<h2>{% trans 'Filter' %}</h2> <h2>{% translate 'Filter' %}</h2>
{% for spec in cl.filter_specs %}{% admin_list_filter cl spec %}{% endfor %} {% for spec in cl.filter_specs %}{% admin_list_filter cl spec %}{% endfor %}
</div> </div>
{% endif %} {% endif %}

View File

@ -5,7 +5,7 @@
<li> <li>
{% url cl.opts|admin_urlname:'add' as add_url %} {% url cl.opts|admin_urlname:'add' as add_url %}
<a href="{% add_preserved_filters add_url is_popup to_field %}" class="addlink"> <a href="{% add_preserved_filters add_url is_popup to_field %}" class="addlink">
{% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %} {% blocktranslate with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktranslate %}
</a> </a>
</li> </li>
{% endif %} {% endif %}

View File

@ -14,9 +14,9 @@
{% if header.sortable %} {% if header.sortable %}
{% if header.sort_priority > 0 %} {% if header.sort_priority > 0 %}
<div class="sortoptions"> <div class="sortoptions">
<a class="sortremove" href="{{ header.url_remove }}" title="{% trans "Remove from sorting" %}"></a> <a class="sortremove" href="{{ header.url_remove }}" title="{% translate "Remove from sorting" %}"></a>
{% if num_sorted_fields > 1 %}<span class="sortpriority" title="{% blocktrans with priority_number=header.sort_priority %}Sorting priority: {{ priority_number }}{% endblocktrans %}">{{ header.sort_priority }}</span>{% endif %} {% if num_sorted_fields > 1 %}<span class="sortpriority" title="{% blocktranslate with priority_number=header.sort_priority %}Sorting priority: {{ priority_number }}{% endblocktranslate %}">{{ header.sort_priority }}</span>{% endif %}
<a href="{{ header.url_toggle }}" class="toggle {% if header.ascending %}ascending{% else %}descending{% endif %}" title="{% trans "Toggle sorting" %}"></a> <a href="{{ header.url_toggle }}" class="toggle {% if header.ascending %}ascending{% else %}descending{% endif %}" title="{% translate "Toggle sorting" %}"></a>
</div> </div>
{% endif %} {% endif %}
{% endif %} {% endif %}

View File

@ -11,41 +11,41 @@
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a> &rsaquo; <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a>
&rsaquo; <a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a> &rsaquo; <a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a>
&rsaquo; <a href="{% url opts|admin_urlname:'change' object.pk|admin_urlquote %}">{{ object|truncatewords:"18" }}</a> &rsaquo; <a href="{% url opts|admin_urlname:'change' object.pk|admin_urlquote %}">{{ object|truncatewords:"18" }}</a>
&rsaquo; {% trans 'Delete' %} &rsaquo; {% translate 'Delete' %}
</div> </div>
{% endblock %} {% endblock %}
{% block content %} {% block content %}
{% if perms_lacking %} {% if perms_lacking %}
<p>{% blocktrans with escaped_object=object %}Deleting the {{ object_name }} '{{ escaped_object }}' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktrans %}</p> <p>{% blocktranslate with escaped_object=object %}Deleting the {{ object_name }} '{{ escaped_object }}' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktranslate %}</p>
<ul> <ul>
{% for obj in perms_lacking %} {% for obj in perms_lacking %}
<li>{{ obj }}</li> <li>{{ obj }}</li>
{% endfor %} {% endfor %}
</ul> </ul>
{% elif protected %} {% elif protected %}
<p>{% blocktrans with escaped_object=object %}Deleting the {{ object_name }} '{{ escaped_object }}' would require deleting the following protected related objects:{% endblocktrans %}</p> <p>{% blocktranslate with escaped_object=object %}Deleting the {{ object_name }} '{{ escaped_object }}' would require deleting the following protected related objects:{% endblocktranslate %}</p>
<ul> <ul>
{% for obj in protected %} {% for obj in protected %}
<li>{{ obj }}</li> <li>{{ obj }}</li>
{% endfor %} {% endfor %}
</ul> </ul>
{% else %} {% else %}
<p>{% blocktrans with escaped_object=object %}Are you sure you want to delete the {{ object_name }} "{{ escaped_object }}"? All of the following related items will be deleted:{% endblocktrans %}</p> <p>{% blocktranslate with escaped_object=object %}Are you sure you want to delete the {{ object_name }} "{{ escaped_object }}"? All of the following related items will be deleted:{% endblocktranslate %}</p>
{% include "admin/includes/object_delete_summary.html" %} {% include "admin/includes/object_delete_summary.html" %}
<h2>{% trans "Objects" %}</h2> <h2>{% translate "Objects" %}</h2>
<ul>{{ deleted_objects|unordered_list }}</ul> <ul>{{ deleted_objects|unordered_list }}</ul>
<form method="post">{% csrf_token %} <form method="post">{% csrf_token %}
<div> <div>
<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, Im sure' %}"> <input type="submit" value="{% translate 'Yes, Im sure' %}">
<a href="#" class="button cancel-link">{% trans "No, take me back" %}</a> <a href="#" class="button cancel-link">{% translate "No, take me back" %}</a>
</div> </div>
</form> </form>
{% endif %} {% endif %}

View File

@ -11,32 +11,32 @@
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a> &rsaquo; <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a>
&rsaquo; <a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a> &rsaquo; <a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a>
&rsaquo; {% trans 'Delete multiple objects' %} &rsaquo; {% translate 'Delete multiple objects' %}
</div> </div>
{% endblock %} {% endblock %}
{% block content %} {% block content %}
{% if perms_lacking %} {% if perms_lacking %}
<p>{% blocktrans %}Deleting the selected {{ objects_name }} would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktrans %}</p> <p>{% blocktranslate %}Deleting the selected {{ objects_name }} would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktranslate %}</p>
<ul> <ul>
{% for obj in perms_lacking %} {% for obj in perms_lacking %}
<li>{{ obj }}</li> <li>{{ obj }}</li>
{% endfor %} {% endfor %}
</ul> </ul>
{% elif protected %} {% elif protected %}
<p>{% blocktrans %}Deleting the selected {{ objects_name }} would require deleting the following protected related objects:{% endblocktrans %}</p> <p>{% blocktranslate %}Deleting the selected {{ objects_name }} would require deleting the following protected related objects:{% endblocktranslate %}</p>
<ul> <ul>
{% for obj in protected %} {% for obj in protected %}
<li>{{ obj }}</li> <li>{{ obj }}</li>
{% endfor %} {% endfor %}
</ul> </ul>
{% else %} {% else %}
<p>{% blocktrans %}Are you sure you want to delete the selected {{ objects_name }}? All of the following objects and their related items will be deleted:{% endblocktrans %}</p> <p>{% blocktranslate %}Are you sure you want to delete the selected {{ objects_name }}? All of the following objects and their related items will be deleted:{% endblocktranslate %}</p>
{% include "admin/includes/object_delete_summary.html" %} {% include "admin/includes/object_delete_summary.html" %}
<h2>{% trans "Objects" %}</h2> <h2>{% translate "Objects" %}</h2>
{% for deletable_object in deletable_objects %} {% for deletable_object in deletable_objects %}
<ul>{{ deletable_object|unordered_list }}</ul> <ul>{{ deletable_object|unordered_list }}</ul>
{% endfor %} {% endfor %}
@ -47,8 +47,8 @@
{% 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, Im sure' %}"> <input type="submit" value="{% translate 'Yes, Im sure' %}">
<a href="#" class="button cancel-link">{% trans "No, take me back" %}</a> <a href="#" class="button cancel-link">{% translate "No, take me back" %}</a>
</div> </div>
</form> </form>
{% endif %} {% endif %}

View File

@ -9,9 +9,9 @@
{{ inline_admin_formset.formset.non_form_errors }} {{ inline_admin_formset.formset.non_form_errors }}
{% for inline_admin_form in inline_admin_formset %}<div class="inline-related{% if inline_admin_form.original or inline_admin_form.show_url %} has_original{% endif %}{% if forloop.last and inline_admin_formset.has_add_permission %} empty-form last-related{% endif %}" id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}"> {% for inline_admin_form in inline_admin_formset %}<div class="inline-related{% if inline_admin_form.original or inline_admin_form.show_url %} has_original{% endif %}{% if forloop.last and inline_admin_formset.has_add_permission %} empty-form last-related{% endif %}" id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}">
<h3><b>{{ inline_admin_formset.opts.verbose_name|capfirst }}:</b>&nbsp;<span class="inline_label">{% if inline_admin_form.original %}{{ inline_admin_form.original }}{% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %} <a href="{% url inline_admin_form.model_admin.opts|admin_urlname:'change' inline_admin_form.original.pk|admin_urlquote %}" class="{% if inline_admin_formset.has_change_permission %}inlinechangelink{% else %}inlineviewlink{% endif %}">{% if inline_admin_formset.has_change_permission %}{% trans "Change" %}{% else %}{% trans "View" %}{% endif %}</a>{% endif %} <h3><b>{{ inline_admin_formset.opts.verbose_name|capfirst }}:</b>&nbsp;<span class="inline_label">{% if inline_admin_form.original %}{{ inline_admin_form.original }}{% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %} <a href="{% url inline_admin_form.model_admin.opts|admin_urlname:'change' inline_admin_form.original.pk|admin_urlquote %}" class="{% if inline_admin_formset.has_change_permission %}inlinechangelink{% else %}inlineviewlink{% endif %}">{% if inline_admin_formset.has_change_permission %}{% translate "Change" %}{% else %}{% translate "View" %}{% endif %}</a>{% endif %}
{% else %}#{{ forloop.counter }}{% endif %}</span> {% else %}#{{ forloop.counter }}{% endif %}</span>
{% if inline_admin_form.show_url %}<a href="{{ inline_admin_form.absolute_url }}">{% trans "View on site" %}</a>{% endif %} {% if inline_admin_form.show_url %}<a href="{{ inline_admin_form.absolute_url }}">{% translate "View on site" %}</a>{% endif %}
{% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission and inline_admin_form.original %}<span class="delete">{{ inline_admin_form.deletion_field.field }} {{ inline_admin_form.deletion_field.label_tag }}</span>{% endif %} {% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission and inline_admin_form.original %}<span class="delete">{{ inline_admin_form.deletion_field.field }} {{ inline_admin_form.deletion_field.label_tag }}</span>{% endif %}
</h3> </h3>
{% if inline_admin_form.form.non_field_errors %}{{ inline_admin_form.form.non_field_errors }}{% endif %} {% if inline_admin_form.form.non_field_errors %}{{ inline_admin_form.form.non_field_errors }}{% endif %}

View File

@ -17,7 +17,7 @@
</th> </th>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
{% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission %}<th>{% trans "Delete?" %}</th>{% endif %} {% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission %}<th>{% translate "Delete?" %}</th>{% endif %}
</tr></thead> </tr></thead>
<tbody> <tbody>
@ -31,9 +31,9 @@
{% if inline_admin_form.original or inline_admin_form.show_url %}<p> {% if inline_admin_form.original or inline_admin_form.show_url %}<p>
{% if inline_admin_form.original %} {% if inline_admin_form.original %}
{{ inline_admin_form.original }} {{ inline_admin_form.original }}
{% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %}<a href="{% url inline_admin_form.model_admin.opts|admin_urlname:'change' inline_admin_form.original.pk|admin_urlquote %}" class="{% if inline_admin_formset.has_change_permission %}inlinechangelink{% else %}inlineviewlink{% endif %}">{% if inline_admin_formset.has_change_permission %}{% trans "Change" %}{% else %}{% trans "View" %}{% endif %}</a>{% endif %} {% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %}<a href="{% url inline_admin_form.model_admin.opts|admin_urlname:'change' inline_admin_form.original.pk|admin_urlquote %}" class="{% if inline_admin_formset.has_change_permission %}inlinechangelink{% else %}inlineviewlink{% endif %}">{% if inline_admin_formset.has_change_permission %}{% translate "Change" %}{% else %}{% translate "View" %}{% endif %}</a>{% endif %}
{% endif %} {% endif %}
{% if inline_admin_form.show_url %}<a href="{{ inline_admin_form.absolute_url }}">{% trans "View on site" %}</a>{% endif %} {% if inline_admin_form.show_url %}<a href="{{ inline_admin_form.absolute_url }}">{% translate "View on site" %}</a>{% endif %}
</p>{% endif %} </p>{% endif %}
{% if inline_admin_form.needs_explicit_pk_field %}{{ inline_admin_form.pk_field.field }}{% endif %} {% if inline_admin_form.needs_explicit_pk_field %}{{ inline_admin_form.pk_field.field }}{% endif %}
{% if inline_admin_form.fk_field %}{{ inline_admin_form.fk_field.field }}{% endif %} {% if inline_admin_form.fk_field %}{{ inline_admin_form.fk_field.field }}{% endif %}

View File

@ -1,5 +1,5 @@
{% load i18n %} {% load i18n %}
<h3>{% blocktrans with filter_title=title %} By {{ filter_title }} {% endblocktrans %}</h3> <h3>{% blocktranslate with filter_title=title %} By {{ filter_title }} {% endblocktranslate %}</h3>
<ul> <ul>
{% for choice in choices %} {% for choice in choices %}
<li{% if choice.selected %} class="selected"{% endif %}> <li{% if choice.selected %} class="selected"{% endif %}>

View File

@ -1,5 +1,5 @@
{% load i18n %} {% load i18n %}
<h2>{% trans "Summary" %}</h2> <h2>{% translate "Summary" %}</h2>
<ul> <ul>
{% for model_name, object_count in model_count %} {% for model_name, object_count in model_count %}
<li>{{ model_name|capfirst }}: {{ object_count }}</li> <li>{{ model_name|capfirst }}: {{ object_count }}</li>

View File

@ -17,7 +17,7 @@
<div class="app-{{ app.app_label }} module"> <div class="app-{{ app.app_label }} module">
<table> <table>
<caption> <caption>
<a href="{{ app.app_url }}" class="section" title="{% blocktrans with name=app.name %}Models in the {{ name }} application{% endblocktrans %}">{{ app.name }}</a> <a href="{{ app.app_url }}" class="section" title="{% blocktranslate with name=app.name %}Models in the {{ name }} application{% endblocktranslate %}">{{ app.name }}</a>
</caption> </caption>
{% for model in app.models %} {% for model in app.models %}
<tr class="model-{{ model.object_name|lower }}"> <tr class="model-{{ model.object_name|lower }}">
@ -28,16 +28,16 @@
{% endif %} {% endif %}
{% if model.add_url %} {% if model.add_url %}
<td><a href="{{ model.add_url }}" class="addlink">{% trans 'Add' %}</a></td> <td><a href="{{ model.add_url }}" class="addlink">{% translate 'Add' %}</a></td>
{% else %} {% else %}
<td>&nbsp;</td> <td>&nbsp;</td>
{% endif %} {% endif %}
{% if model.admin_url %} {% if model.admin_url %}
{% if model.view_only %} {% if model.view_only %}
<td><a href="{{ model.admin_url }}" class="viewlink">{% trans 'View' %}</a></td> <td><a href="{{ model.admin_url }}" class="viewlink">{% translate 'View' %}</a></td>
{% else %} {% else %}
<td><a href="{{ model.admin_url }}" class="changelink">{% trans 'Change' %}</a></td> <td><a href="{{ model.admin_url }}" class="changelink">{% translate 'Change' %}</a></td>
{% endif %} {% endif %}
{% else %} {% else %}
<td>&nbsp;</td> <td>&nbsp;</td>
@ -48,7 +48,7 @@
</div> </div>
{% endfor %} {% endfor %}
{% else %} {% else %}
<p>{% trans 'You dont have permission to view or edit anything.' %}</p> <p>{% translate 'You dont have permission to view or edit anything.' %}</p>
{% endif %} {% endif %}
</div> </div>
{% endblock %} {% endblock %}
@ -56,12 +56,12 @@
{% block sidebar %} {% block sidebar %}
<div id="content-related"> <div id="content-related">
<div class="module" id="recent-actions-module"> <div class="module" id="recent-actions-module">
<h2>{% trans 'Recent actions' %}</h2> <h2>{% translate 'Recent actions' %}</h2>
<h3>{% trans 'My actions' %}</h3> <h3>{% translate 'My actions' %}</h3>
{% load log %} {% load log %}
{% get_admin_log 10 as admin_log for_user user %} {% get_admin_log 10 as admin_log for_user user %}
{% if not admin_log %} {% if not admin_log %}
<p>{% trans 'None available' %}</p> <p>{% translate 'None available' %}</p>
{% else %} {% else %}
<ul class="actionlist"> <ul class="actionlist">
{% for entry in admin_log %} {% for entry in admin_log %}
@ -75,7 +75,7 @@
{% if entry.content_type %} {% if entry.content_type %}
<span class="mini quiet">{% filter capfirst %}{{ entry.content_type.name }}{% endfilter %}</span> <span class="mini quiet">{% filter capfirst %}{{ entry.content_type.name }}{% endfilter %}</span>
{% else %} {% else %}
<span class="mini quiet">{% trans 'Unknown content' %}</span> <span class="mini quiet">{% translate 'Unknown content' %}</span>
{% endif %} {% endif %}
</li> </li>
{% endfor %} {% endfor %}

View File

@ -3,11 +3,11 @@
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; {{ title }} &rsaquo; {{ title }}
</div> </div>
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<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> <p>{% translate '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

@ -18,7 +18,7 @@
{% block content %} {% block content %}
{% if form.errors and not form.non_field_errors %} {% if form.errors and not form.non_field_errors %}
<p class="errornote"> <p class="errornote">
{% if form.errors.items|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %} {% if form.errors.items|length == 1 %}{% translate "Please correct the error below." %}{% else %}{% translate "Please correct the errors below." %}{% endif %}
</p> </p>
{% endif %} {% endif %}
@ -34,10 +34,10 @@
{% if user.is_authenticated %} {% if user.is_authenticated %}
<p class="errornote"> <p class="errornote">
{% blocktrans trimmed %} {% blocktranslate trimmed %}
You are authenticated as {{ username }}, but are not authorized to You are authenticated as {{ username }}, but are not authorized to
access this page. Would you like to login to a different account? access this page. Would you like to login to a different account?
{% endblocktrans %} {% endblocktranslate %}
</p> </p>
{% endif %} {% endif %}
@ -54,11 +54,11 @@
{% url 'admin_password_reset' as password_reset_url %} {% url 'admin_password_reset' as password_reset_url %}
{% if password_reset_url %} {% if password_reset_url %}
<div class="password-reset-link"> <div class="password-reset-link">
<a href="{{ password_reset_url }}">{% trans 'Forgotten your password or username?' %}</a> <a href="{{ password_reset_url }}">{% translate 'Forgotten your password or username?' %}</a>
</div> </div>
{% endif %} {% endif %}
<div class="submit-row"> <div class="submit-row">
<label>&nbsp;</label><input type="submit" value="{% trans 'Log in' %}"> <label>&nbsp;</label><input type="submit" value="{% translate 'Log in' %}">
</div> </div>
</form> </form>

View File

@ -3,11 +3,11 @@
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a> &rsaquo; <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a>
&rsaquo; <a href="{% url opts|admin_urlname:'changelist' %}">{{ module_name }}</a> &rsaquo; <a href="{% url opts|admin_urlname:'changelist' %}">{{ module_name }}</a>
&rsaquo; <a href="{% url opts|admin_urlname:'change' object.pk|admin_urlquote %}">{{ object|truncatewords:"18" }}</a> &rsaquo; <a href="{% url opts|admin_urlname:'change' object.pk|admin_urlquote %}">{{ object|truncatewords:"18" }}</a>
&rsaquo; {% trans 'History' %} &rsaquo; {% translate 'History' %}
</div> </div>
{% endblock %} {% endblock %}
@ -19,9 +19,9 @@
<table id="change-history"> <table id="change-history">
<thead> <thead>
<tr> <tr>
<th scope="col">{% trans 'Date/time' %}</th> <th scope="col">{% translate 'Date/time' %}</th>
<th scope="col">{% trans 'User' %}</th> <th scope="col">{% translate 'User' %}</th>
<th scope="col">{% trans 'Action' %}</th> <th scope="col">{% translate 'Action' %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -35,7 +35,7 @@
</tbody> </tbody>
</table> </table>
{% else %} {% else %}
<p>{% trans 'This object doesnt have a change history. It probably wasnt added via this admin site.' %}</p> <p>{% translate 'This object doesnt have a change history. It probably wasnt added via this admin site.' %}</p>
{% endif %} {% endif %}
</div> </div>
</div> </div>

View File

@ -7,6 +7,6 @@
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{{ cl.result_count }} {% if cl.result_count == 1 %}{{ cl.opts.verbose_name }}{% else %}{{ cl.opts.verbose_name_plural }}{% endif %} {{ cl.result_count }} {% if cl.result_count == 1 %}{{ cl.opts.verbose_name }}{% else %}{{ cl.opts.verbose_name_plural }}{% endif %}
{% if show_all_url %}&nbsp;&nbsp;<a href="{{ show_all_url }}" class="showall">{% trans 'Show all' %}</a>{% endif %} {% if show_all_url %}&nbsp;&nbsp;<a href="{{ show_all_url }}" class="showall">{% translate 'Show all' %}</a>{% endif %}
{% if cl.formset and cl.result_count %}<input type="submit" name="_save" class="default" value="{% trans 'Save' %}">{% endif %} {% if cl.formset and cl.result_count %}<input type="submit" name="_save" class="default" value="{% translate 'Save' %}">{% endif %}
</p> </p>

View File

@ -1,6 +1,6 @@
{% load i18n static %}<!DOCTYPE html> {% load i18n static %}<!DOCTYPE html>
<html> <html>
<head><title>{% trans 'Popup closing…' %}</title></head> <head><title>{% translate 'Popup closing…' %}</title></head>
<body> <body>
<script id="django-admin-popup-response-constants" <script id="django-admin-popup-response-constants"
src="{% static "admin/js/popup_response.js" %}" src="{% static "admin/js/popup_response.js" %}"

View File

@ -4,9 +4,9 @@
<div><!-- DIV needed for valid HTML --> <div><!-- DIV needed for valid HTML -->
<label for="searchbar"><img src="{% static "admin/img/search.svg" %}" alt="Search"></label> <label for="searchbar"><img src="{% static "admin/img/search.svg" %}" alt="Search"></label>
<input type="text" size="40" name="{{ search_var }}" value="{{ cl.query }}" id="searchbar" autofocus> <input type="text" size="40" name="{{ search_var }}" value="{{ cl.query }}" id="searchbar" autofocus>
<input type="submit" value="{% trans 'Search' %}"> <input type="submit" value="{% translate 'Search' %}">
{% if show_result_count %} {% if show_result_count %}
<span class="small quiet">{% blocktrans count counter=cl.result_count %}{{ counter }} result{% plural %}{{ counter }} results{% endblocktrans %} (<a href="?{% if cl.is_popup %}_popup=1{% endif %}">{% if cl.show_full_result_count %}{% blocktrans with full_result_count=cl.full_result_count %}{{ full_result_count }} total{% endblocktrans %}{% else %}{% trans "Show all" %}{% endif %}</a>)</span> <span class="small quiet">{% blocktranslate count counter=cl.result_count %}{{ counter }} result{% plural %}{{ counter }} results{% endblocktranslate %} (<a href="?{% if cl.is_popup %}_popup=1{% endif %}">{% if cl.show_full_result_count %}{% blocktranslate with full_result_count=cl.full_result_count %}{{ full_result_count }} total{% endblocktranslate %}{% else %}{% translate "Show all" %}{% endif %}</a>)</span>
{% endif %} {% endif %}
{% for pair in cl.params.items %} {% for pair in cl.params.items %}
{% if pair.0 != search_var %}<input type="hidden" name="{{ pair.0 }}" value="{{ pair.1 }}">{% endif %} {% if pair.0 != search_var %}<input type="hidden" name="{{ pair.0 }}" value="{{ pair.1 }}">{% endif %}

View File

@ -1,14 +1,14 @@
{% load i18n admin_urls %} {% load i18n admin_urls %}
<div class="submit-row"> <div class="submit-row">
{% block submit-row %} {% block submit-row %}
{% if show_save %}<input type="submit" value="{% trans 'Save' %}" class="default" name="_save">{% endif %} {% if show_save %}<input type="submit" value="{% translate 'Save' %}" class="default" name="_save">{% endif %}
{% if show_delete_link and original %} {% if show_delete_link and original %}
{% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %} {% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %}
<p class="deletelink-box"><a href="{% add_preserved_filters delete_url %}" class="deletelink">{% trans "Delete" %}</a></p> <p class="deletelink-box"><a href="{% add_preserved_filters delete_url %}" class="deletelink">{% translate "Delete" %}</a></p>
{% endif %} {% endif %}
{% if show_save_as_new %}<input type="submit" value="{% trans 'Save as new' %}" name="_saveasnew">{% endif %} {% if show_save_as_new %}<input type="submit" value="{% translate 'Save as new' %}" name="_saveasnew">{% endif %}
{% if show_save_and_add_another %}<input type="submit" value="{% trans 'Save and add another' %}" name="_addanother">{% endif %} {% if show_save_and_add_another %}<input type="submit" value="{% translate 'Save and add another' %}" name="_addanother">{% endif %}
{% if show_save_and_continue %}<input type="submit" value="{% if can_change %}{% trans 'Save and continue editing' %}{% else %}{% trans 'Save and view' %}{% endif %}" name="_continue">{% endif %} {% if show_save_and_continue %}<input type="submit" value="{% if can_change %}{% translate 'Save and continue editing' %}{% else %}{% translate 'Save and view' %}{% endif %}" name="_continue">{% endif %}
{% if show_close %}<a href="{% url opts|admin_urlname:'changelist' %}" class="closelink">{% trans 'Close' %}</a>{% endif %} {% if show_close %}<a href="{% url opts|admin_urlname:'changelist' %}" class="closelink">{% translate 'Close' %}</a>{% endif %}
{% endblock %} {% endblock %}
</div> </div>

View File

@ -7,22 +7,22 @@
{% if can_change_related %} {% if can_change_related %}
<a class="related-widget-wrapper-link change-related" id="change_id_{{ name }}" <a class="related-widget-wrapper-link change-related" id="change_id_{{ name }}"
data-href-template="{{ change_related_template_url }}?{{ url_params }}" data-href-template="{{ change_related_template_url }}?{{ url_params }}"
title="{% blocktrans %}Change selected {{ model }}{% endblocktrans %}"> title="{% blocktranslate %}Change selected {{ model }}{% endblocktranslate %}">
<img src="{% static 'admin/img/icon-changelink.svg' %}" alt="{% trans 'Change' %}"> <img src="{% static 'admin/img/icon-changelink.svg' %}" alt="{% translate 'Change' %}">
</a> </a>
{% endif %} {% endif %}
{% if can_add_related %} {% if can_add_related %}
<a class="related-widget-wrapper-link add-related" id="add_id_{{ name }}" <a class="related-widget-wrapper-link add-related" id="add_id_{{ name }}"
href="{{ add_related_url }}?{{ url_params }}" href="{{ add_related_url }}?{{ url_params }}"
title="{% blocktrans %}Add another {{ model }}{% endblocktrans %}"> title="{% blocktranslate %}Add another {{ model }}{% endblocktranslate %}">
<img src="{% static 'admin/img/icon-addlink.svg' %}" alt="{% trans 'Add' %}"> <img src="{% static 'admin/img/icon-addlink.svg' %}" alt="{% translate 'Add' %}">
</a> </a>
{% endif %} {% endif %}
{% if can_delete_related %} {% if can_delete_related %}
<a class="related-widget-wrapper-link delete-related" id="delete_id_{{ name }}" <a class="related-widget-wrapper-link delete-related" id="delete_id_{{ name }}"
data-href-template="{{ delete_related_template_url }}?{{ url_params }}" data-href-template="{{ delete_related_template_url }}?{{ url_params }}"
title="{% blocktrans %}Delete selected {{ model }}{% endblocktrans %}"> title="{% blocktranslate %}Delete selected {{ model }}{% endblocktranslate %}">
<img src="{% static 'admin/img/icon-deletelink.svg' %}" alt="{% trans 'Delete' %}"> <img src="{% static 'admin/img/icon-deletelink.svg' %}" alt="{% translate 'Delete' %}">
</a> </a>
{% endif %} {% endif %}
{% endif %} {% endif %}

View File

@ -1,12 +1,12 @@
{% extends "admin/base_site.html" %} {% extends "admin/base_site.html" %}
{% load i18n %} {% load i18n %}
{% block breadcrumbs %}<div class="breadcrumbs"><a href="{% url 'admin:index' %}">{% trans 'Home' %}</a></div>{% endblock %} {% block breadcrumbs %}<div class="breadcrumbs"><a href="{% url 'admin:index' %}">{% translate 'Home' %}</a></div>{% endblock %}
{% block content %} {% block content %}
<p>{% trans "Thanks for spending some quality time with the Web site today." %}</p> <p>{% translate "Thanks for spending some quality time with the Web site today." %}</p>
<p><a href="{% url 'admin:index' %}">{% trans 'Log in again' %}</a></p> <p><a href="{% url 'admin:index' %}">{% translate 'Log in again' %}</a></p>
{% endblock %} {% endblock %}

View File

@ -1,15 +1,15 @@
{% extends "admin/base_site.html" %} {% extends "admin/base_site.html" %}
{% load i18n %} {% load i18n %}
{% block userlinks %}{% url 'django-admindocs-docroot' as docsroot %}{% if docsroot %}<a href="{{ docsroot }}">{% trans 'Documentation' %}</a> / {% endif %}{% trans 'Change password' %} / <a href="{% url 'admin:logout' %}">{% trans 'Log out' %}</a>{% endblock %} {% block userlinks %}{% url 'django-admindocs-docroot' as docsroot %}{% if docsroot %}<a href="{{ docsroot }}">{% translate 'Documentation' %}</a> / {% endif %}{% translate 'Change password' %} / <a href="{% url 'admin:logout' %}">{% translate 'Log out' %}</a>{% endblock %}
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; {% trans 'Password change' %} &rsaquo; {% translate 'Password change' %}
</div> </div>
{% endblock %} {% endblock %}
{% block title %}{{ title }}{% endblock %} {% block title %}{{ title }}{% endblock %}
{% block content_title %}<h1>{{ title }}</h1>{% endblock %} {% block content_title %}<h1>{{ title }}</h1>{% endblock %}
{% block content %} {% block content %}
<p>{% trans 'Your password was changed.' %}</p> <p>{% translate 'Your password was changed.' %}</p>
{% endblock %} {% endblock %}

View File

@ -1,11 +1,11 @@
{% extends "admin/base_site.html" %} {% extends "admin/base_site.html" %}
{% load i18n static %} {% load i18n static %}
{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}">{% endblock %} {% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}">{% endblock %}
{% block userlinks %}{% url 'django-admindocs-docroot' as docsroot %}{% if docsroot %}<a href="{{ docsroot }}">{% trans 'Documentation' %}</a> / {% endif %} {% trans 'Change password' %} / <a href="{% url 'admin:logout' %}">{% trans 'Log out' %}</a>{% endblock %} {% block userlinks %}{% url 'django-admindocs-docroot' as docsroot %}{% if docsroot %}<a href="{{ docsroot }}">{% translate 'Documentation' %}</a> / {% endif %} {% translate 'Change password' %} / <a href="{% url 'admin:logout' %}">{% translate 'Log out' %}</a>{% endblock %}
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; {% trans 'Password change' %} &rsaquo; {% translate 'Password change' %}
</div> </div>
{% endblock %} {% endblock %}
@ -18,12 +18,12 @@
<div> <div>
{% if form.errors %} {% if form.errors %}
<p class="errornote"> <p class="errornote">
{% if form.errors.items|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %} {% if form.errors.items|length == 1 %}{% translate "Please correct the error below." %}{% else %}{% translate "Please correct the errors below." %}{% endif %}
</p> </p>
{% endif %} {% endif %}
<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> <p>{% translate '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">
@ -51,7 +51,7 @@
</fieldset> </fieldset>
<div class="submit-row"> <div class="submit-row">
<input type="submit" value="{% trans 'Change my password' %}" class="default"> <input type="submit" value="{% translate 'Change my password' %}" class="default">
</div> </div>
</div> </div>

View File

@ -3,8 +3,8 @@
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; {% trans 'Password reset' %} &rsaquo; {% translate 'Password reset' %}
</div> </div>
{% endblock %} {% endblock %}
@ -13,8 +13,8 @@
{% block content %} {% block content %}
<p>{% trans "Your password has been set. You may go ahead and log in now." %}</p> <p>{% translate "Your password has been set. You may go ahead and log in now." %}</p>
<p><a href="{{ login_url }}">{% trans 'Log in' %}</a></p> <p><a href="{{ login_url }}">{% translate 'Log in' %}</a></p>
{% endblock %} {% endblock %}

View File

@ -4,8 +4,8 @@
{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}">{% endblock %} {% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}">{% endblock %}
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; {% trans 'Password reset confirmation' %} &rsaquo; {% translate 'Password reset confirmation' %}
</div> </div>
{% endblock %} {% endblock %}
@ -15,27 +15,27 @@
{% if validlink %} {% if validlink %}
<p>{% trans "Please enter your new password twice so we can verify you typed it in correctly." %}</p> <p>{% translate "Please enter your new password twice so we can verify you typed it in correctly." %}</p>
<form method="post">{% csrf_token %} <form method="post">{% csrf_token %}
<fieldset class="module aligned"> <fieldset class="module aligned">
<div class="form-row field-password1"> <div class="form-row field-password1">
{{ form.new_password1.errors }} {{ form.new_password1.errors }}
<label for="id_new_password1">{% trans 'New password:' %}</label> <label for="id_new_password1">{% translate 'New password:' %}</label>
{{ form.new_password1 }} {{ form.new_password1 }}
</div> </div>
<div class="form-row field-password2"> <div class="form-row field-password2">
{{ form.new_password2.errors }} {{ form.new_password2.errors }}
<label for="id_new_password2">{% trans 'Confirm password:' %}</label> <label for="id_new_password2">{% translate 'Confirm password:' %}</label>
{{ form.new_password2 }} {{ form.new_password2 }}
</div> </div>
<input type="submit" value="{% trans 'Change my password' %}"> <input type="submit" value="{% translate 'Change my password' %}">
</fieldset> </fieldset>
</form> </form>
{% else %} {% else %}
<p>{% trans "The password reset link was invalid, possibly because it has already been used. Please request a new password reset." %}</p> <p>{% translate "The password reset link was invalid, possibly because it has already been used. Please request a new password reset." %}</p>
{% endif %} {% endif %}

View File

@ -3,8 +3,8 @@
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; {% trans 'Password reset' %} &rsaquo; {% translate 'Password reset' %}
</div> </div>
{% endblock %} {% endblock %}
@ -12,8 +12,8 @@
{% block content_title %}<h1>{{ title }}</h1>{% endblock %} {% block content_title %}<h1>{{ title }}</h1>{% endblock %}
{% block content %} {% block content %}
<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>{% translate '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 dont receive an email, please make sure youve entered the address you registered with, and check your spam folder.' %}</p> <p>{% translate '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

@ -1,14 +1,14 @@
{% load i18n %}{% autoescape off %} {% load i18n %}{% autoescape off %}
{% blocktrans %}You're receiving this email because you requested a password reset for your user account at {{ site_name }}.{% endblocktrans %} {% blocktranslate %}You're receiving this email because you requested a password reset for your user account at {{ site_name }}.{% endblocktranslate %}
{% trans "Please go to the following page and choose a new password:" %} {% translate "Please go to the following page and choose a new password:" %}
{% 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 youve forgotten:' %} {{ user.get_username }} {% translate 'Your username, in case youve forgotten:' %} {{ user.get_username }}
{% trans "Thanks for using our site!" %} {% translate "Thanks for using our site!" %}
{% blocktrans %}The {{ site_name }} team{% endblocktrans %} {% blocktranslate %}The {{ site_name }} team{% endblocktranslate %}
{% endautoescape %} {% endautoescape %}

View File

@ -4,8 +4,8 @@
{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}">{% endblock %} {% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}">{% endblock %}
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; {% trans 'Password reset' %} &rsaquo; {% translate 'Password reset' %}
</div> </div>
{% endblock %} {% endblock %}
@ -13,16 +13,16 @@
{% 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 well email instructions for setting a new one.' %}</p> <p>{% translate '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">
<div class="form-row field-email"> <div class="form-row field-email">
{{ form.email.errors }} {{ form.email.errors }}
<label for="id_email">{% trans 'Email address:' %}</label> <label for="id_email">{% translate 'Email address:' %}</label>
{{ form.email }} {{ form.email }}
</div> </div>
<input type="submit" value="{% trans 'Reset my password' %}"> <input type="submit" value="{% translate 'Reset my password' %}">
</fieldset> </fieldset>
</form> </form>

View File

@ -3,24 +3,24 @@
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; <a href="{% url 'django-admindocs-docroot' %}">{% trans 'Documentation' %}</a> &rsaquo; <a href="{% url 'django-admindocs-docroot' %}">{% translate 'Documentation' %}</a>
&rsaquo; {% trans 'Bookmarklets' %} &rsaquo; {% translate 'Bookmarklets' %}
</div> </div>
{% endblock %} {% endblock %}
{% block title %}{% trans "Documentation bookmarklets" %}{% endblock %} {% block title %}{% translate "Documentation bookmarklets" %}{% endblock %}
{% block content %} {% block content %}
<p class="help">{% blocktrans trimmed %} <p class="help">{% blocktranslate trimmed %}
To install bookmarklets, drag the link to your bookmarks toolbar, or right-click To install bookmarklets, drag the link to your bookmarks toolbar, or right-click
the link and add it to your bookmarks. Now you can select the bookmarklet the link and add it to your bookmarks. Now you can select the bookmarklet
from any page in the site. from any page in the site.
{% endblocktrans %}</p> {% endblocktranslate %}</p>
<div id="content-main"> <div id="content-main">
<h3><a href="javascript:(function(){if(typeof XMLHttpRequest!='undefined'){x=new XMLHttpRequest()}else{return;}x.open('HEAD',location.href,false);x.send(null);try{view=x.getResponseHeader('x-view');}catch(e){alert('No view found for this page');return;}if(view=='undefined'){alert('No view found for this page');}document.location='{% url 'django-admindocs-views-index' %}'+view+'/';})()">{% trans "Documentation for this page" %}</a></h3> <h3><a href="javascript:(function(){if(typeof XMLHttpRequest!='undefined'){x=new XMLHttpRequest()}else{return;}x.open('HEAD',location.href,false);x.send(null);try{view=x.getResponseHeader('x-view');}catch(e){alert('No view found for this page');return;}if(view=='undefined'){alert('No view found for this page');}document.location='{% url 'django-admindocs-views-index' %}'+view+'/';})()">{% translate "Documentation for this page" %}</a></h3>
<p>{% trans "Jumps you from any page to the documentation for the view that generates that page." %}</p> <p>{% translate "Jumps you from any page to the documentation for the view that generates that page." %}</p>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -3,31 +3,31 @@
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; {% trans 'Documentation' %} &rsaquo; {% translate 'Documentation' %}
</div> </div>
{% endblock %} {% endblock %}
{% block title %}{% trans 'Documentation' %}{% endblock %} {% block title %}{% translate 'Documentation' %}{% endblock %}
{% block content %} {% block content %}
<h1>{% trans 'Documentation' %}</h1> <h1>{% translate 'Documentation' %}</h1>
<div id="content-main"> <div id="content-main">
<h3><a href="tags/">{% trans 'Tags' %}</a></h3> <h3><a href="tags/">{% translate 'Tags' %}</a></h3>
<p>{% trans 'List of all the template tags and their functions.' %}</p> <p>{% translate 'List of all the template tags and their functions.' %}</p>
<h3><a href="filters/">{% trans 'Filters' %}</a></h3> <h3><a href="filters/">{% translate 'Filters' %}</a></h3>
<p>{% trans 'Filters are actions which can be applied to variables in a template to alter the output.' %}</p> <p>{% translate 'Filters are actions which can be applied to variables in a template to alter the output.' %}</p>
<h3><a href="models/">{% trans 'Models' %}</a></h3> <h3><a href="models/">{% translate 'Models' %}</a></h3>
<p>{% trans 'Models are descriptions of all the objects in the system and their associated fields. Each model has a list of fields which can be accessed as template variables' %}.</p> <p>{% translate 'Models are descriptions of all the objects in the system and their associated fields. Each model has a list of fields which can be accessed as template variables' %}.</p>
<h3><a href="views/">{% trans 'Views' %}</a></h3> <h3><a href="views/">{% translate 'Views' %}</a></h3>
<p>{% trans 'Each page on the public site is generated by a view. The view defines which template is used to generate the page and which objects are available to that template.' %}</p> <p>{% translate 'Each page on the public site is generated by a view. The view defines which template is used to generate the page and which objects are available to that template.' %}</p>
<h3><a href="bookmarklets/">{% trans 'Bookmarklets' %}</a></h3> <h3><a href="bookmarklets/">{% translate 'Bookmarklets' %}</a></h3>
<p>{% trans 'Tools for your browser to quickly access admin functionality.' %}</p> <p>{% translate 'Tools for your browser to quickly access admin functionality.' %}</p>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -3,20 +3,20 @@
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; {% trans 'Documentation' %} &rsaquo; {% translate 'Documentation' %}
</div> </div>
{% endblock %} {% endblock %}
{% block title %}{% trans 'Please install docutils' %}{% endblock %} {% block title %}{% translate 'Please install docutils' %}{% endblock %}
{% block content %} {% block content %}
<h1>{% trans 'Documentation' %}</h1> <h1>{% translate 'Documentation' %}</h1>
<div id="content-main"> <div id="content-main">
<h3>{% blocktrans with "http://docutils.sf.net/" as link %}The admin documentation system requires Python's <a href="{{ link }}">docutils</a> library.{% endblocktrans %}</h3> <h3>{% blocktranslate with "http://docutils.sf.net/" as link %}The admin documentation system requires Python's <a href="{{ link }}">docutils</a> library.{% endblocktranslate %}</h3>
<p>{% blocktrans with "http://docutils.sf.net/" as link %}Please ask your administrators to install <a href="{{ link }}">docutils</a>.{% endblocktrans %}</p> <p>{% blocktranslate with "http://docutils.sf.net/" as link %}Please ask your administrators to install <a href="{{ link }}">docutils</a>.{% endblocktranslate %}</p>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -11,14 +11,14 @@
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; <a href="{% url 'django-admindocs-docroot' %}">{% trans 'Documentation' %}</a> &rsaquo; <a href="{% url 'django-admindocs-docroot' %}">{% translate 'Documentation' %}</a>
&rsaquo; <a href="{% url 'django-admindocs-models-index' %}">{% trans 'Models' %}</a> &rsaquo; <a href="{% url 'django-admindocs-models-index' %}">{% translate 'Models' %}</a>
&rsaquo; {{ name }} &rsaquo; {{ name }}
</div> </div>
{% endblock %} {% endblock %}
{% block title %}{% blocktrans %}Model: {{ name }}{% endblocktrans %}{% endblock %} {% block title %}{% blocktranslate %}Model: {{ name }}{% endblocktranslate %}{% endblock %}
{% block content %} {% block content %}
<div id="content-main"> <div id="content-main">
@ -27,14 +27,14 @@
{{ description }} {{ description }}
<h3>{% trans 'Fields' %}</h3> <h3>{% translate 'Fields' %}</h3>
<div class="module"> <div class="module">
<table class="model"> <table class="model">
<thead> <thead>
<tr> <tr>
<th>{% trans 'Field' %}</th> <th>{% translate 'Field' %}</th>
<th>{% trans 'Type' %}</th> <th>{% translate 'Type' %}</th>
<th>{% trans 'Description' %}</th> <th>{% translate 'Description' %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -50,14 +50,14 @@
</div> </div>
{% if methods %} {% if methods %}
<h3>{% trans 'Methods with arguments' %}</h3> <h3>{% translate 'Methods with arguments' %}</h3>
<div class="module"> <div class="module">
<table class="model"> <table class="model">
<thead> <thead>
<tr> <tr>
<th>{% trans 'Method' %}</th> <th>{% translate 'Method' %}</th>
<th>{% trans 'Arguments' %}</th> <th>{% translate 'Arguments' %}</th>
<th>{% trans 'Description' %}</th> <th>{% translate 'Description' %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -73,6 +73,6 @@
</div> </div>
{% endif %} {% endif %}
<p class="small"><a href="{% url 'django-admindocs-models-index' %}">&lsaquo; {% trans 'Back to Model documentation' %}</a></p> <p class="small"><a href="{% url 'django-admindocs-models-index' %}">&lsaquo; {% translate 'Back to Model documentation' %}</a></p>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -5,17 +5,17 @@
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; <a href="{% url 'django-admindocs-docroot' %}">{% trans 'Documentation' %}</a> &rsaquo; <a href="{% url 'django-admindocs-docroot' %}">{% translate 'Documentation' %}</a>
&rsaquo; {% trans 'Models' %} &rsaquo; {% translate 'Models' %}
</div> </div>
{% endblock %} {% endblock %}
{% block title %}{% trans 'Models' %}{% endblock %} {% block title %}{% translate 'Models' %}{% endblock %}
{% block content %} {% block content %}
<h1>{% trans 'Model documentation' %}</h1> <h1>{% translate 'Model documentation' %}</h1>
{% regroup models by app_config as grouped_models %} {% regroup models by app_config as grouped_models %}
@ -40,7 +40,7 @@
{% block sidebar %} {% block sidebar %}
<div id="content-related" class="sidebar"> <div id="content-related" class="sidebar">
<div class="module"> <div class="module">
<h2>{% trans 'Model groups' %}</h2> <h2>{% translate 'Model groups' %}</h2>
<ul> <ul>
{% regroup models by app_config as grouped_models %} {% regroup models by app_config as grouped_models %}
{% for group in grouped_models %} {% for group in grouped_models %}

View File

@ -3,25 +3,25 @@
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; <a href="{% url 'django-admindocs-docroot' %}">{% trans 'Documentation' %}</a> &rsaquo; <a href="{% url 'django-admindocs-docroot' %}">{% translate 'Documentation' %}</a>
&rsaquo; {% trans 'Templates' %} &rsaquo; {% translate 'Templates' %}
&rsaquo; {{ name }} &rsaquo; {{ name }}
</div> </div>
{% endblock %} {% endblock %}
{% block title %}{% blocktrans %}Template: {{ name }}{% endblocktrans %}{% endblock %} {% block title %}{% blocktranslate %}Template: {{ name }}{% endblocktranslate %}{% endblock %}
{% block content %} {% block content %}
<h1>{% blocktrans %}Template: <q>{{ name }}</q>{% endblocktrans %}</h1> <h1>{% blocktranslate %}Template: <q>{{ name }}</q>{% endblocktranslate %}</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 <q>{{ name }}</q>:{% endblocktrans %}</h2> <h2>{% blocktranslate %}Search path for template <q>{{ name }}</q>:{% endblocktranslate %}</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>{% translate '(does not exist)' %}</em>{% endif %}</li>
{% endfor %} {% endfor %}
</ol> </ol>
<p class="small"><a href="{% url 'django-admindocs-docroot' %}">&lsaquo; {% trans 'Back to Documentation' %}</a></p> <p class="small"><a href="{% url 'django-admindocs-docroot' %}">&lsaquo; {% translate 'Back to Documentation' %}</a></p>
{% endblock %} {% endblock %}

View File

@ -4,23 +4,23 @@
{% block coltype %}colSM{% endblock %} {% block coltype %}colSM{% endblock %}
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; <a href="{% url 'django-admindocs-docroot' %}">{% trans 'Documentation' %}</a> &rsaquo; <a href="{% url 'django-admindocs-docroot' %}">{% translate 'Documentation' %}</a>
&rsaquo; {% trans 'Filters' %} &rsaquo; {% translate 'Filters' %}
</div> </div>
{% endblock %} {% endblock %}
{% block title %}{% trans 'Template filters' %}{% endblock %} {% block title %}{% translate 'Template filters' %}{% endblock %}
{% block content %} {% block content %}
<h1>{% trans 'Template filter documentation' %}</h1> <h1>{% translate 'Template filter documentation' %}</h1>
<div id="content-main"> <div id="content-main">
{% regroup filters|dictsort:"library" by library as filter_libraries %} {% regroup filters|dictsort:"library" by library as filter_libraries %}
{% for library in filter_libraries %} {% for library in filter_libraries %}
<div class="module"> <div class="module">
<h2>{% firstof library.grouper _("Built-in filters") %}</h2> <h2>{% firstof library.grouper _("Built-in filters") %}</h2>
{% if library.grouper %}<p class="small quiet">{% blocktrans with code="{"|add:"% load "|add:library.grouper|add:" %"|add:"}" %}To use these filters, put <code>{{ code }}</code> in your template before using the filter.{% endblocktrans %}</p><hr>{% endif %} {% if library.grouper %}<p class="small quiet">{% blocktranslate with code="{"|add:"% load "|add:library.grouper|add:" %"|add:"}" %}To use these filters, put <code>{{ code }}</code> in your template before using the filter.{% endblocktranslate %}</p><hr>{% endif %}
{% for filter in library.list|dictsort:"name" %} {% for filter in library.list|dictsort:"name" %}
<h3 id="{{ library.grouper|default:"built_in" }}-{{ filter.name }}">{{ filter.name }}</h3> <h3 id="{{ library.grouper|default:"built_in" }}-{{ filter.name }}">{{ filter.name }}</h3>
{{ filter.title }} {{ filter.title }}

View File

@ -4,23 +4,23 @@
{% block coltype %}colSM{% endblock %} {% block coltype %}colSM{% endblock %}
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; <a href="{% url 'django-admindocs-docroot' %}">{% trans 'Documentation' %}</a> &rsaquo; <a href="{% url 'django-admindocs-docroot' %}">{% translate 'Documentation' %}</a>
&rsaquo; {% trans 'Tags' %} &rsaquo; {% translate 'Tags' %}
</div> </div>
{% endblock %} {% endblock %}
{% block title %}{% trans 'Template tags' %}{% endblock %} {% block title %}{% translate 'Template tags' %}{% endblock %}
{% block content %} {% block content %}
<h1>{% trans 'Template tag documentation' %}</h1> <h1>{% translate 'Template tag documentation' %}</h1>
<div id="content-main"> <div id="content-main">
{% regroup tags|dictsort:"library" by library as tag_libraries %} {% regroup tags|dictsort:"library" by library as tag_libraries %}
{% for library in tag_libraries %} {% for library in tag_libraries %}
<div class="module"> <div class="module">
<h2>{% firstof library.grouper _("Built-in tags") %}</h2> <h2>{% firstof library.grouper _("Built-in tags") %}</h2>
{% if library.grouper %}<p class="small quiet">{% blocktrans with code="{"|add:"% load "|add:library.grouper|add:" %"|add:"}" %}To use these tags, put <code>{{ code }}</code> in your template before using the tag.{% endblocktrans %}</p><hr>{% endif %} {% if library.grouper %}<p class="small quiet">{% blocktranslate with code="{"|add:"% load "|add:library.grouper|add:" %"|add:"}" %}To use these tags, put <code>{{ code }}</code> in your template before using the tag.{% endblocktranslate %}</p><hr>{% endif %}
{% for tag in library.list|dictsort:"name" %} {% for tag in library.list|dictsort:"name" %}
<h3 id="{{ library.grouper|default:"built_in" }}-{{ tag.name }}">{{ tag.name }}</h3> <h3 id="{{ library.grouper|default:"built_in" }}-{{ tag.name }}">{{ tag.name }}</h3>
<h4>{{ tag.title|striptags }}</h4> <h4>{{ tag.title|striptags }}</h4>

View File

@ -3,13 +3,13 @@
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; <a href="{% url 'django-admindocs-docroot' %}">{% trans 'Documentation' %}</a> &rsaquo; <a href="{% url 'django-admindocs-docroot' %}">{% translate 'Documentation' %}</a>
&rsaquo; <a href="{% url 'django-admindocs-views-index' %}">{% trans 'Views' %}</a> &rsaquo; <a href="{% url 'django-admindocs-views-index' %}">{% translate 'Views' %}</a>
&rsaquo; {{ name }} &rsaquo; {{ name }}
</div> </div>
{% endblock %} {% endblock %}
{% block title %}{% blocktrans %}View: {{ name }}{% endblocktrans %}{% endblock %} {% block title %}{% blocktranslate %}View: {{ name }}{% endblocktranslate %}{% endblock %}
{% block content %} {% block content %}
@ -20,14 +20,14 @@
{{ body }} {{ body }}
{% if meta.Context %} {% if meta.Context %}
<h3>{% trans 'Context:' %}</h3> <h3>{% translate 'Context:' %}</h3>
<p>{{ meta.Context }}</p> <p>{{ meta.Context }}</p>
{% endif %} {% endif %}
{% if meta.Templates %} {% if meta.Templates %}
<h3>{% trans 'Templates:' %}</h3> <h3>{% translate 'Templates:' %}</h3>
<p>{{ meta.Templates }}</p> <p>{{ meta.Templates }}</p>
{% endif %} {% endif %}
<p class="small"><a href="{% url 'django-admindocs-views-index' %}">&lsaquo; {% trans 'Back to View documentation' %}</a></p> <p class="small"><a href="{% url 'django-admindocs-views-index' %}">&lsaquo; {% translate 'Back to View documentation' %}</a></p>
{% endblock %} {% endblock %}

View File

@ -4,27 +4,27 @@
{% block coltype %}colSM{% endblock %} {% block coltype %}colSM{% endblock %}
{% block breadcrumbs %} {% block breadcrumbs %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; <a href="{% url 'django-admindocs-docroot' %}">{% trans 'Documentation' %}</a> &rsaquo; <a href="{% url 'django-admindocs-docroot' %}">{% translate 'Documentation' %}</a>
&rsaquo; {% trans 'Views' %} &rsaquo; {% translate 'Views' %}
</div> </div>
{% endblock %} {% endblock %}
{% block title %}{% trans 'Views' %}{% endblock %} {% block title %}{% translate 'Views' %}{% endblock %}
{% block content %} {% block content %}
<h1>{% trans 'View documentation' %}</h1> <h1>{% translate 'View documentation' %}</h1>
{% regroup views|dictsort:'namespace' by namespace as views_by_ns %} {% regroup views|dictsort:'namespace' by namespace as views_by_ns %}
<div id="content-related" class="sidebar"> <div id="content-related" class="sidebar">
<div class="module"> <div class="module">
<h2>{% trans 'Jump to namespace' %}</h2> <h2>{% translate 'Jump to namespace' %}</h2>
<ul> <ul>
{% for ns_views in views_by_ns %} {% for ns_views in views_by_ns %}
<li><a href="#ns|{{ ns_views.grouper }}"> <li><a href="#ns|{{ ns_views.grouper }}">
{% if ns_views.grouper %}{{ ns_views.grouper }} {% if ns_views.grouper %}{{ ns_views.grouper }}
{% else %}{% trans "Empty namespace" %}{% endif %} {% else %}{% translate "Empty namespace" %}{% endif %}
</a></li> </a></li>
{% endfor %} {% endfor %}
</ul> </ul>
@ -37,18 +37,18 @@
<div class="module"> <div class="module">
<h2 id="ns|{{ ns_views.grouper }}"> <h2 id="ns|{{ ns_views.grouper }}">
{% if ns_views.grouper %} {% if ns_views.grouper %}
{% blocktrans with ns_views.grouper as name %}Views by namespace {{ name }}{% endblocktrans %} {% blocktranslate with ns_views.grouper as name %}Views by namespace {{ name }}{% endblocktranslate %}
{% else %} {% else %}
{% blocktrans %}Views by empty namespace{% endblocktrans %} {% blocktranslate %}Views by empty namespace{% endblocktranslate %}
{% endif %} {% endif %}
</h2> </h2>
{% for view in ns_views.list|dictsort:"url" %} {% for view in ns_views.list|dictsort:"url" %}
{% ifchanged %} {% ifchanged %}
<h3><a href="{% url 'django-admindocs-views-detail' view=view.full_name %}">{{ view.url }}</a></h3> <h3><a href="{% url 'django-admindocs-views-detail' view=view.full_name %}">{{ view.url }}</a></h3>
<p class="small quiet">{% blocktrans with view.full_name as full_name and view.url_name as url_name %} <p class="small quiet">{% blocktranslate with view.full_name as full_name and view.url_name as url_name %}
View function: <code>{{ full_name }}</code>. Name: <code>{{ url_name }}</code>. View function: <code>{{ full_name }}</code>. Name: <code>{{ url_name }}</code>.
{% endblocktrans %}</p> {% endblocktranslate %}</p>
<p>{{ view.title }}</p> <p>{{ view.title }}</p>
<hr> <hr>
{% endifchanged %} {% endifchanged %}

View File

@ -1,3 +1,3 @@
{% load i18n %}{% autoescape off %} {% load i18n %}{% autoescape off %}
{% blocktrans %}Password reset on {{ site_name }}{% endblocktrans %} {% blocktranslate %}Password reset on {{ site_name }}{% endblocktranslate %}
{% endautoescape %} {% endautoescape %}

View File

@ -32,9 +32,9 @@
</script> </script>
<div id="{{ id }}_map"{% if LANGUAGE_BIDI %} dir="ltr"{% endif %}></div> <div id="{{ id }}_map"{% if LANGUAGE_BIDI %} dir="ltr"{% endif %}></div>
{% if editable %} {% if editable %}
<a href="javascript:{{ module }}.clearFeatures()">{% trans "Delete all Features" %}</a> <a href="javascript:{{ module }}.clearFeatures()">{% translate "Delete all Features" %}</a>
{% endif %} {% endif %}
{% if display_wkt %}<p>{% trans "WKT debugging window:" %} </p>{% endif %} {% if display_wkt %}<p>{% translate "WKT debugging window:" %} </p>{% endif %}
<textarea id="{{ id }}" class="vWKTField required" cols="150" rows="10" name="{{ name }}">{{ wkt }}</textarea> <textarea id="{{ id }}" class="vWKTField required" cols="150" rows="10" name="{{ name }}">{{ wkt }}</textarea>
<script>{% block init_function %}{{ module }}.init();{% endblock %}</script> <script>{% block init_function %}{{ module }}.init();{% endblock %}</script>
</span> </span>

View File

@ -9,8 +9,8 @@
<div id="{{ id }}_div_map"> <div id="{{ id }}_div_map">
<div id="{{ id }}_map"></div> <div id="{{ id }}_map"></div>
{% if not disabled %}<span class="clear_features"><a href="javascript:{{ module }}.clearFeatures()">{% trans "Delete all Features" %}</a></span>{% endif %} {% if not disabled %}<span class="clear_features"><a href="javascript:{{ module }}.clearFeatures()">{% translate "Delete all Features" %}</a></span>{% endif %}
{% if display_raw %}<p>{% trans "Debugging window (serialized value)" %}</p>{% endif %} {% if display_raw %}<p>{% translate "Debugging window (serialized value)" %}</p>{% endif %}
<textarea id="{{ id }}" class="vSerializedField required" cols="150" rows="10" name="{{ name }}">{{ serialized }}</textarea> <textarea id="{{ id }}" class="vSerializedField required" cols="150" rows="10" name="{{ name }}">{{ serialized }}</textarea>
<script> <script>
{% block map_options %}var map_options = {};{% endblock %} {% block map_options %}var map_options = {};{% endblock %}

View File

@ -1418,10 +1418,10 @@ def widthratio(parser, token):
(because 175/200 = .875; .875 * 100 = 87.5 which is rounded up to 88). (because 175/200 = .875; .875 * 100 = 87.5 which is rounded up to 88).
In some cases you might want to capture the result of widthratio in a In some cases you might want to capture the result of widthratio in a
variable. It can be useful for instance in a blocktrans like this:: variable. It can be useful for instance in a blocktranslate like this::
{% widthratio this_value max_value max_width as width %} {% widthratio this_value max_value max_width as width %}
{% blocktrans %}The width is: {{ width }}{% endblocktrans %} {% blocktranslate %}The width is: {{ width }}{% endblocktranslate %}
""" """
bits = token.split_contents() bits = token.split_contents()
if len(bits) == 4: if len(bits) == 4:

View File

@ -324,7 +324,7 @@ def do_translate(parser, token):
Usage:: Usage::
{% trans "this is a test" %} {% translate "this is a test" %}
This marks the string for translation so it will be pulled out by This marks the string for translation so it will be pulled out by
makemessages into the .po files and runs the string through the translation makemessages into the .po files and runs the string through the translation
@ -332,7 +332,7 @@ def do_translate(parser, token):
There is a second form:: There is a second form::
{% trans "this is a test" noop %} {% translate "this is a test" noop %}
This marks the string for translation, but returns the string unchanged. This marks the string for translation, but returns the string unchanged.
Use it when you need to store values into forms that should be translated Use it when you need to store values into forms that should be translated
@ -341,19 +341,19 @@ def do_translate(parser, token):
You can use variables instead of constant strings You can use variables instead of constant strings
to translate stuff you marked somewhere else:: to translate stuff you marked somewhere else::
{% trans variable %} {% translate variable %}
This tries to translate the contents of the variable ``variable``. Make This tries to translate the contents of the variable ``variable``. Make
sure that the string in there is something that is in the .po file. sure that the string in there is something that is in the .po file.
It is possible to store the translated string into a variable:: It is possible to store the translated string into a variable::
{% trans "this is a test" as var %} {% translate "this is a test" as var %}
{{ var }} {{ var }}
Contextual translations are also supported:: Contextual translations are also supported::
{% trans "this is a test" context "greeting" %} {% translate "this is a test" context "greeting" %}
This is equivalent to calling pgettext instead of (u)gettext. This is equivalent to calling pgettext instead of (u)gettext.
""" """
@ -417,37 +417,37 @@ def do_block_translate(parser, token):
Usage:: Usage::
{% blocktrans with bar=foo|filter boo=baz|filter %} {% blocktranslate with bar=foo|filter boo=baz|filter %}
This is {{ bar }} and {{ boo }}. This is {{ bar }} and {{ boo }}.
{% endblocktrans %} {% endblocktranslate %}
Additionally, this supports pluralization:: Additionally, this supports pluralization::
{% blocktrans count count=var|length %} {% blocktranslate count count=var|length %}
There is {{ count }} object. There is {{ count }} object.
{% plural %} {% plural %}
There are {{ count }} objects. There are {{ count }} objects.
{% endblocktrans %} {% endblocktranslate %}
This is much like ngettext, only in template syntax. This is much like ngettext, only in template syntax.
The "var as value" legacy format is still supported:: The "var as value" legacy format is still supported::
{% blocktrans with foo|filter as bar and baz|filter as boo %} {% blocktranslate with foo|filter as bar and baz|filter as boo %}
{% blocktrans count var|length as count %} {% blocktranslate count var|length as count %}
The translated string can be stored in a variable using `asvar`:: The translated string can be stored in a variable using `asvar`::
{% blocktrans with bar=foo|filter boo=baz|filter asvar var %} {% blocktranslate with bar=foo|filter boo=baz|filter asvar var %}
This is {{ bar }} and {{ boo }}. This is {{ bar }} and {{ boo }}.
{% endblocktrans %} {% endblocktranslate %}
{{ var }} {{ var }}
Contextual translations are supported:: Contextual translations are supported::
{% blocktrans with bar=foo|filter context "greeting" %} {% blocktranslate with bar=foo|filter context "greeting" %}
This is {{ bar }}. This is {{ bar }}.
{% endblocktrans %} {% endblocktranslate %}
This is equivalent to calling pgettext/npgettext instead of This is equivalent to calling pgettext/npgettext instead of
(u)gettext/(u)ngettext. (u)gettext/(u)ngettext.

View File

@ -62,10 +62,10 @@ DEFAULT_DIRECTORY_INDEX_TEMPLATE = """
<meta http-equiv="Content-type" content="text/html; charset=utf-8"> <meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-us"> <meta http-equiv="Content-Language" content="en-us">
<meta name="robots" content="NONE,NOARCHIVE"> <meta name="robots" content="NONE,NOARCHIVE">
<title>{% blocktrans %}Index of {{ directory }}{% endblocktrans %}</title> <title>{% blocktranslate %}Index of {{ directory }}{% endblocktranslate %}</title>
</head> </head>
<body> <body>
<h1>{% blocktrans %}Index of {{ directory }}{% endblocktrans %}</h1> <h1>{% blocktranslate %}Index of {{ directory }}{% endblocktranslate %}</h1>
<ul> <ul>
{% if directory != "/" %} {% if directory != "/" %}
<li><a href="../">../</a></li> <li><a href="../">../</a></li>

View File

@ -4,7 +4,7 @@
<html{% if LANGUAGE_BIDI %} dir="rtl"{% endif %}> <html{% if LANGUAGE_BIDI %} dir="rtl"{% endif %}>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>{% trans "Django: the Web framework for perfectionists with deadlines." %}</title> <title>{% translate "Django: the Web framework for perfectionists with deadlines." %}</title>
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="/static/admin/css/fonts.css"> <link rel="stylesheet" type="text/css" href="/static/admin/css/fonts.css">
<style type="text/css"> <style type="text/css">
@ -343,7 +343,7 @@
</a> </a>
</div> </div>
<div class="release-notes"> <div class="release-notes">
<p>{% blocktrans %}View <a href="https://docs.djangoproject.com/en/{{ version }}/releases/" target="_blank" rel="noopener">release notes</a> for Django {{ version }}{% endblocktrans %}</p> <p>{% blocktranslate %}View <a href="https://docs.djangoproject.com/en/{{ version }}/releases/" target="_blank" rel="noopener">release notes</a> for Django {{ version }}{% endblocktranslate %}</p>
</div> </div>
</header> </header>
<main> <main>
@ -365,8 +365,8 @@
<path class="flame" d="M 6.7 1.14 l 2.8 4.7 s 1.3 3 -1.82 3.22 l -5.4 0 s -3.28 -.14 -1.74 -3.26 l 2.76 -4.7 s 1.7 -2.3 3.4 0 z" fill="#AA2247"></path> <path class="flame" d="M 6.7 1.14 l 2.8 4.7 s 1.3 3 -1.82 3.22 l -5.4 0 s -3.28 -.14 -1.74 -3.26 l 2.76 -4.7 s 1.7 -2.3 3.4 0 z" fill="#AA2247"></path>
</svg> </svg>
</div> </div>
<h2>{% trans "The install worked successfully! Congratulations!" %}</h2> <h2>{% translate "The install worked successfully! Congratulations!" %}</h2>
<p>{% blocktrans %}You are seeing this page because <a href="https://docs.djangoproject.com/en/{{ version }}/ref/settings/#debug" target="_blank" rel="noopener">DEBUG=True</a> is in your settings file and you have not configured any URLs.{% endblocktrans %}</p> <p>{% blocktranslate %}You are seeing this page because <a href="https://docs.djangoproject.com/en/{{ version }}/ref/settings/#debug" target="_blank" rel="noopener">DEBUG=True</a> is in your settings file and you have not configured any URLs.{% endblocktranslate %}</p>
</main> </main>
<footer class="u-clearfix"> <footer class="u-clearfix">
<a href="https://docs.djangoproject.com/en/{{ version }}/" target="_blank" rel="noopener"> <a href="https://docs.djangoproject.com/en/{{ version }}/" target="_blank" rel="noopener">
@ -381,8 +381,8 @@
<path clip-path="url(#b)" d="M9 21c0 .55.45 1 1 1h4c.55 0 1-.45 1-1v-1H9v1zm3-19C8.14 2 5 5.14 5 9c0 2.38 1.19 4.47 3 5.74V17c0 .55.45 1 1 1h6c.55 0 1-.45 1-1v-2.26c1.81-1.27 3-3.36 3-5.74 0-3.86-3.14-7-7-7zm2.85 11.1l-.85.6V16h-4v-2.3l-.85-.6C7.8 12.16 7 10.63 7 9c0-2.76 2.24-5 5-5s5 2.24 5 5c0 1.63-.8 3.16-2.15 4.1z"></path> <path clip-path="url(#b)" d="M9 21c0 .55.45 1 1 1h4c.55 0 1-.45 1-1v-1H9v1zm3-19C8.14 2 5 5.14 5 9c0 2.38 1.19 4.47 3 5.74V17c0 .55.45 1 1 1h6c.55 0 1-.45 1-1v-2.26c1.81-1.27 3-3.36 3-5.74 0-3.86-3.14-7-7-7zm2.85 11.1l-.85.6V16h-4v-2.3l-.85-.6C7.8 12.16 7 10.63 7 9c0-2.76 2.24-5 5-5s5 2.24 5 5c0 1.63-.8 3.16-2.15 4.1z"></path>
</svg> </svg>
<div> <div>
<h4>{% trans "Django Documentation" %}</h4> <h4>{% translate "Django Documentation" %}</h4>
<p>{% trans 'Topics, references, &amp; how-tos' %}</p> <p>{% translate 'Topics, references, &amp; how-tos' %}</p>
</div> </div>
</div> </div>
</a> </a>
@ -393,8 +393,8 @@
<path d="M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z"></path> <path d="M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z"></path>
</svg> </svg>
<div> <div>
<h4>{% trans "Tutorial: A Polling App" %}</h4> <h4>{% translate "Tutorial: A Polling App" %}</h4>
<p>{% trans "Get started with Django" %}</p> <p>{% translate "Get started with Django" %}</p>
</div> </div>
</div> </div>
</a> </a>
@ -405,8 +405,8 @@
<path d="M16.5 13c-1.2 0-3.07.34-4.5 1-1.43-.67-3.3-1-4.5-1C5.33 13 1 14.08 1 16.25V19h22v-2.75c0-2.17-4.33-3.25-6.5-3.25zm-4 4.5h-10v-1.25c0-.54 2.56-1.75 5-1.75s5 1.21 5 1.75v1.25zm9 0H14v-1.25c0-.46-.2-.86-.52-1.22.88-.3 1.96-.53 3.02-.53 2.44 0 5 1.21 5 1.75v1.25zM7.5 12c1.93 0 3.5-1.57 3.5-3.5S9.43 5 7.5 5 4 6.57 4 8.5 5.57 12 7.5 12zm0-5.5c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 5.5c1.93 0 3.5-1.57 3.5-3.5S18.43 5 16.5 5 13 6.57 13 8.5s1.57 3.5 3.5 3.5zm0-5.5c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2z"></path> <path d="M16.5 13c-1.2 0-3.07.34-4.5 1-1.43-.67-3.3-1-4.5-1C5.33 13 1 14.08 1 16.25V19h22v-2.75c0-2.17-4.33-3.25-6.5-3.25zm-4 4.5h-10v-1.25c0-.54 2.56-1.75 5-1.75s5 1.21 5 1.75v1.25zm9 0H14v-1.25c0-.46-.2-.86-.52-1.22.88-.3 1.96-.53 3.02-.53 2.44 0 5 1.21 5 1.75v1.25zM7.5 12c1.93 0 3.5-1.57 3.5-3.5S9.43 5 7.5 5 4 6.57 4 8.5 5.57 12 7.5 12zm0-5.5c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 5.5c1.93 0 3.5-1.57 3.5-3.5S18.43 5 16.5 5 13 6.57 13 8.5s1.57 3.5 3.5 3.5zm0-5.5c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2z"></path>
</svg> </svg>
<div> <div>
<h4>{% trans "Django Community" %}</h4> <h4>{% translate "Django Community" %}</h4>
<p>{% trans "Connect, get help, or contribute" %}</p> <p>{% translate "Connect, get help, or contribute" %}</p>
</div> </div>
</div> </div>
</a> </a>

View File

@ -2,5 +2,5 @@
{% load i18n %} {% load i18n %}
{% block actions-submit %} {% block actions-submit %}
<button type="submit" class="button override-actions" title="{% trans "Run the selected action" %}" name="index" value="{{ action_index|default:0 }}">{% trans "Go" %}</button> <button type="submit" class="button override-actions" title="{% translate "Run the selected action" %}" name="index" value="{{ action_index|default:0 }}">{% translate "Go" %}</button>
{% endblock %} {% endblock %}

View File

@ -2,6 +2,6 @@
{% load i18n admin_urls %} {% load i18n admin_urls %}
{% block object-tools-items %} {% block object-tools-items %}
<li><a href="#" id="change-form-export" class="override-change_form_object_tools change-form-object-tools-item">{% trans "Export" %}</a></li> <li><a href="#" id="change-form-export" class="override-change_form_object_tools change-form-object-tools-item">{% translate "Export" %}</a></li>
{{ block.super }} {{ block.super }}
{% endblock %} {% endblock %}

View File

@ -2,6 +2,6 @@
{% load i18n admin_urls %} {% load i18n admin_urls %}
{% block object-tools-items %} {% block object-tools-items %}
<li><a href="#" id="change-list-export" class="override-change_list_object_tools change-list-object-tools-item">{% trans "Export" %}</a></li> <li><a href="#" id="change-list-export" class="override-change_list_object_tools change-list-object-tools-item">{% translate "Export" %}</a></li>
{{ block.super }} {{ block.super }}
{% endblock %} {% endblock %}

View File

@ -14,9 +14,9 @@
{% if header.sortable %} {% if header.sortable %}
{% if header.sort_priority > 0 %} {% if header.sort_priority > 0 %}
<div class="sortoptions"> <div class="sortoptions">
<a class="sortremove" href="{{ header.url_remove }}" title="{% trans "Remove from sorting" %}"></a> <a class="sortremove" href="{{ header.url_remove }}" title="{% translate "Remove from sorting" %}"></a>
{% if num_sorted_fields > 1 %}<span class="sortpriority" title="{% blocktrans with priority_number=header.sort_priority %}Sorting priority: {{ priority_number }}{% endblocktrans %}">{{ header.sort_priority }}</span>{% endif %} {% if num_sorted_fields > 1 %}<span class="sortpriority" title="{% blocktranslate with priority_number=header.sort_priority %}Sorting priority: {{ priority_number }}{% endblocktranslate %}">{{ header.sort_priority }}</span>{% endif %}
<a href="{{ header.url_toggle }}" class="toggle {% if header.ascending %}ascending{% else %}descending{% endif %}" title="{% trans "Toggle sorting" %}"></a> <a href="{{ header.url_toggle }}" class="toggle {% if header.ascending %}ascending{% else %}descending{% endif %}" title="{% translate "Toggle sorting" %}"></a>
</div> </div>
{% endif %} {% endif %}
{% endif %} {% endif %}

View File

@ -5,5 +5,5 @@
<select id="date-selector" class="override-date_hierarchy">{% for choice in choices %} <select id="date-selector" class="override-date_hierarchy">{% for choice in choices %}
<option{% if choice.link %} value="{{ choice.link }}"{% endif %}>{{ choice.title }}</option> <option{% if choice.link %} value="{{ choice.link }}"{% endif %}>{{ choice.title }}</option>
{% endfor %}</select> {% endfor %}</select>
<button id="date-selected">{% trans "Go" %}</button> <button id="date-selected">{% translate "Go" %}</button>
{% endblock %} {% endblock %}

View File

@ -7,6 +7,6 @@
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{{ cl.result_count }} {% if cl.result_count == 1 %}{{ cl.opts.verbose_name }}{% else %}{{ cl.opts.verbose_name_plural }}{% endif %} {{ cl.result_count }} {% if cl.result_count == 1 %}{{ cl.opts.verbose_name }}{% else %}{{ cl.opts.verbose_name_plural }}{% endif %}
{% if show_all_url %}&nbsp;&nbsp;<a href="{{ show_all_url }}" class="showall">{% trans 'Show all' %}</a>{% endif %} {% if show_all_url %}&nbsp;&nbsp;<a href="{{ show_all_url }}" class="showall">{% translate 'Show all' %}</a>{% endif %}
{% if cl.formset and cl.result_count %}<input type="submit" name="_save" class="default" value="{% trans 'Save' %}"/>{% endif %} {% if cl.formset and cl.result_count %}<input type="submit" name="_save" class="default" value="{% translate 'Save' %}"/>{% endif %}
</p> </p>

View File

@ -4,9 +4,9 @@
<div><!-- DIV needed for valid HTML --> <div><!-- DIV needed for valid HTML -->
<label for="searchbar"><img src="{% static "admin/img/search.svg" %}" alt="Search" /></label> <label for="searchbar"><img src="{% static "admin/img/search.svg" %}" alt="Search" /></label>
<input type="text" size="40" name="{{ search_var }}" value="{{ cl.query }}" id="searchbar" autofocus /> <input type="text" size="40" name="{{ search_var }}" value="{{ cl.query }}" id="searchbar" autofocus />
<input type="submit" value="{% trans 'Search' %}" /> <input type="submit" value="{% translate 'Search' %}" />
{% if show_result_count %} {% if show_result_count %}
<span class="small quiet">{% blocktrans count counter=cl.result_count %}{{ counter }} result{% plural %}{{ counter }} results{% endblocktrans %} (<a href="?{% if cl.is_popup %}_popup=1{% endif %}">{% if cl.show_full_result_count %}{% blocktrans with full_result_count=cl.full_result_count %}{{ full_result_count }} total{% endblocktrans %}{% else %}{% trans "Show all" %}{% endif %}</a>)</span> <span class="small quiet">{% blocktranslate count counter=cl.result_count %}{{ counter }} result{% plural %}{{ counter }} results{% endblocktranslate %} (<a href="?{% if cl.is_popup %}_popup=1{% endif %}">{% if cl.show_full_result_count %}{% blocktranslate with full_result_count=cl.full_result_count %}{{ full_result_count }} total{% endblocktranslate %}{% else %}{% translate "Show all" %}{% endif %}</a>)</span>
{% endif %} {% endif %}
{% for pair in cl.params.items %} {% for pair in cl.params.items %}
{% if pair.0 != search_var %}<input type="hidden" name="{{ pair.0 }}" value="{{ pair.1 }}"/>{% endif %} {% if pair.0 != search_var %}<input type="hidden" name="{{ pair.0 }}" value="{{ pair.1 }}"/>{% endif %}

View File

@ -2,6 +2,6 @@
{% load i18n admin_urls %} {% load i18n admin_urls %}
{% block submit-row %} {% block submit-row %}
{% if show_publish %}<input type="submit" value="{% trans 'Publish' %}" class="default" name="_publish" />{% endif %} {% if show_publish %}<input type="submit" value="{% translate 'Publish' %}" class="default" name="_publish" />{% endif %}
{{ block.super }} {{ block.super }}
{% endblock %} {% endblock %}

View File

@ -1,2 +1,2 @@
{% load i18n %} {% load i18n %}
{% trans "This should be ignored." %} {% translate "This should be ignored." %}

View File

@ -1,13 +1,13 @@
{% load i18n %} {% load i18n %}
{# ignored comment #1 #}{% trans "Translatable literal #9a" %} {# ignored comment #1 #}{% translate "Translatable literal #9a" %}
{# Translators: ignored i18n comment #1 #}{% trans "Translatable literal #9b" %} {# Translators: ignored i18n comment #1 #}{% translate "Translatable literal #9b" %}
{# Translators: ignored i18n comment #2 #}{# ignored comment #2 #}{% trans "Translatable literal #9c" %} {# Translators: ignored i18n comment #2 #}{# ignored comment #2 #}{% translate "Translatable literal #9c" %}
{# ignored comment #3 #}{# Translators: ignored i18n comment #3 #}{% trans "Translatable literal #9d" %} {# ignored comment #3 #}{# Translators: ignored i18n comment #3 #}{% translate "Translatable literal #9d" %}
{# ignored comment #4 #}{% trans "Translatable literal #9e" %}{# ignored comment #5 #} {# ignored comment #4 #}{% translate "Translatable literal #9e" %}{# ignored comment #5 #}
{# Translators: ignored i18n comment #4 #}{% trans "Translatable literal #9f" %}{# Translators: valid i18n comment #5 #} {# Translators: ignored i18n comment #4 #}{% translate "Translatable literal #9f" %}{# Translators: valid i18n comment #5 #}
{% trans "Translatable literal #9g" %}{# Translators: valid i18n comment #6 #} {% translate "Translatable literal #9g" %}{# Translators: valid i18n comment #6 #}
{# ignored comment #6 #}{% trans "Translatable literal #9h" %}{# Translators: valid i18n comment #7 #} {# ignored comment #6 #}{% translate "Translatable literal #9h" %}{# Translators: valid i18n comment #7 #}
{% trans "Translatable literal #9i" %} {% translate "Translatable literal #9i" %}
{# Translators: valid i18n comment #8 #}{# Translators: valid i18n comment #9 #} {# Translators: valid i18n comment #8 #}{# Translators: valid i18n comment #9 #}
{% trans "Translatable literal #9j" %} {% translate "Translatable literal #9j" %}

View File

@ -3,6 +3,6 @@
This file has a literal with plural forms. When processed first, makemessages This file has a literal with plural forms. When processed first, makemessages
shouldn't create a .po file with duplicate `Plural-Forms` headers shouldn't create a .po file with duplicate `Plural-Forms` headers
{% endcomment %} {% endcomment %}
{% blocktrans count number=3 %}{{ number }} Bar{% plural %}{{ number }} Bars{% endblocktrans %} {% blocktranslate count number=3 %}{{ number }} Bar{% plural %}{{ number }} Bars{% endblocktranslate %}
{% translate 'First `translate`, then `blocktranslate` with a plural' %} {% translate 'First `translate`, then `blocktranslate` with a plural' %}

View File

@ -1,2 +1,2 @@
{% load i18n %} {% load i18n %}
{% trans "This subdir should be ignored too." %} {% translate "This subdir should be ignored too." %}

View File

@ -1,3 +1,3 @@
{% load i18n %} {% load i18n %}
<p>This template contains an error (no endblocktrans)</p> <p>This template contains an error (no endblocktranslate)</p>
<p>{% blocktrans %}This should fail{% blocktrans %}</p> <p>{% blocktranslate %}This should fail{% blocktranslate %}</p>

View File

@ -2,103 +2,104 @@
{% comment %}Translators: Django comment block for translators {% comment %}Translators: Django comment block for translators
string's meaning unveiled string's meaning unveiled
{% endcomment %} {% endcomment %}
{% trans "This literal should be included." %} {% translate "This literal should be included." %}
{% trans "This literal should also be included wrapped or not wrapped depending on the use of the --no-wrap option." %} {% translate "This literal should also be included wrapped or not wrapped depending on the use of the --no-wrap option." %}
{% comment %}Some random comment {% comment %}Some random comment
Some random comment Some random comment
Translators: One-line translator comment #1 Translators: One-line translator comment #1
{% endcomment %} {% endcomment %}
{% trans "Translatable literal #1a" %} {% translate "Translatable literal #1a" %}
{% comment %}Some random comment {% comment %}Some random comment
Some random comment Some random comment
Translators: Two-line translator comment #1 Translators: Two-line translator comment #1
continued here. continued here.
{% endcomment %} {% endcomment %}
{% trans "Translatable literal #1b" %} {% translate "Translatable literal #1b" %}
{% comment %}Some random comment {% comment %}Some random comment
Translators: One-line translator comment #2 Translators: One-line translator comment #2
{% endcomment %} {% endcomment %}
{% trans "Translatable literal #2a" %} {% translate "Translatable literal #2a" %}
{% comment %}Some random comment {% comment %}Some random comment
Translators: Two-line translator comment #2 Translators: Two-line translator comment #2
continued here. continued here.
{% endcomment %} {% endcomment %}
{% trans "Translatable literal #2b" %} {% translate "Translatable literal #2b" %}
{% comment %} {% comment %}
Translators: One-line translator comment #3 Translators: One-line translator comment #3
{% endcomment %} {% endcomment %}
{% trans "Translatable literal #3a" %} {% translate "Translatable literal #3a" %}
{% comment %} {% comment %}
Translators: Two-line translator comment #3 Translators: Two-line translator comment #3
continued here. continued here.
{% endcomment %} {% endcomment %}
{% trans "Translatable literal #3b" %} {% translate "Translatable literal #3b" %}
{% comment %} Translators: One-line translator comment #4{% endcomment %} {% comment %} Translators: One-line translator comment #4{% endcomment %}
{% trans "Translatable literal #4a" %} {% translate "Translatable literal #4a" %}
{% comment %} Translators: Two-line translator comment #4 {% comment %} Translators: Two-line translator comment #4
continued here.{% endcomment %} continued here.{% endcomment %}
{% trans "Translatable literal #4b" %} {% translate "Translatable literal #4b" %}
{% comment %} Translators: One-line translator comment #5 -- with non ASCII characters: áéíóúö{% endcomment %} {% comment %} Translators: One-line translator comment #5 -- with non ASCII characters: áéíóúö{% endcomment %}
{% trans "Translatable literal #5a" %} {% translate "Translatable literal #5a" %}
{% comment %} Translators: Two-line translator comment #5 -- with non ASCII characters: áéíóúö {% comment %} Translators: Two-line translator comment #5 -- with non ASCII characters: áéíóúö
continued here.{% endcomment %} continued here.{% endcomment %}
{% trans "Translatable literal #6b" %} {% translate "Translatable literal #6b" %}
{% trans "Translatable literal #7a" context "Special trans context #1" %} {% translate "Translatable literal #7a" context "Special trans context #1" %}
{% trans "Translatable literal #7b" as var context "Special trans context #2" %} {% translate "Translatable literal #7b" as var context "Special trans context #2" %}
{% trans "Translatable literal #7c" context "Special trans context #3" as var %} {% translate "Translatable literal #7c" context "Special trans context #3" as var %}
{% trans "Translatable literal #7.1a" | upper context "context #7.1a" %} {% translate "Translatable literal #7.1a" | upper context "context #7.1a" %}
{% trans "Translatable literal #7.1b" |upper as var context "context #7.1b" %} {% translate "Translatable literal #7.1b" |upper as var context "context #7.1b" %}
{% trans "Translatable literal #7.1c"| upper context "context #7.1c" as var %} {% translate "Translatable literal #7.1c"| upper context "context #7.1c" as var %}
{% trans "Translatable literal #7.1d"|add:" foo" context "context #7.1d" %} {% translate "Translatable literal #7.1d"|add:" foo" context "context #7.1d" %}
{% trans "Translatable literal #7.1e"|add:' ûè本' as var context "context #7.1e" %} {% translate "Translatable literal #7.1e"|add:' ûè本' as var context "context #7.1e" %}
{% with foo=" foo" %} {% with foo=" foo" %}
{% trans "Translatable literal #7.1f"|add:foo context "context #7.1f" as var %} {% translate "Translatable literal #7.1f"|add:foo context "context #7.1f" as var %}
{% endwith %} {% endwith %}
{% trans "Translatable literal #7.1g"|add:2 context "context #7.1g" as var %} {% translate "Translatable literal #7.1g"|add:2 context "context #7.1g" as var %}
{% trans "Translatable literal #7.1h" | add:"foo" | add:2 context "context #7.1h" as var %} {% translate "Translatable literal #7.1h" | add:"foo" | add:2 context "context #7.1h" as var %}
<!-- Source file inside a msgid, should be left as-is. --> <!-- Source file inside a msgid, should be left as-is. -->
{% trans "#: templates/test.html.py" %} {% translate "#: templates/test.html.py" %}
<!-- Deliberate duplicated string. --> <!-- Deliberate duplicated string. -->
{% trans "This literal should be included." %} {% translate "This literal should be included." %}
{% blocktrans context "Special blocktrans context #1" %}Translatable literal #8a{% endblocktrans %} {% blocktranslate context "Special blocktranslate context #1" %}Translatable literal #8a{% endblocktranslate %}
{% blocktrans count 2 context "Special blocktrans context #2" %}Translatable literal #8b-singular{% plural %}Translatable literal #8b-plural{% endblocktrans %} {% blocktranslate count 2 context "Special blocktranslate context #2" %}Translatable literal #8b-singular{% plural %}Translatable literal #8b-plural{% endblocktranslate %}
{% blocktrans context "Special blocktrans context #3" count 2 %}Translatable literal #8c-singular{% plural %}Translatable literal #8c-plural{% endblocktrans %} {% blocktranslate context "Special blocktranslate context #3" count 2 %}Translatable literal #8c-singular{% plural %}Translatable literal #8c-plural{% endblocktranslate %}
{% blocktrans with a=1 context "Special blocktrans context #4" %}Translatable literal #8d {{ a }}{% endblocktrans %} {% blocktranslate with a=1 context "Special blocktranslate context #4" %}Translatable literal #8d {{ a }}{% endblocktranslate %}
{% trans "Translatable literal with context wrapped in single quotes" context 'Context wrapped in single quotes' as var %} {% translate "Translatable literal with context wrapped in single quotes" context 'Context wrapped in single quotes' as var %}
{% trans "Translatable literal with context wrapped in double quotes" context "Context wrapped in double quotes" as var %} {% translate "Translatable literal with context wrapped in double quotes" context "Context wrapped in double quotes" as var %}
{% blocktrans context 'Special blocktrans context wrapped in single quotes' %}Translatable literal with context wrapped in single quotes{% endblocktrans %} {% blocktranslate context 'Special blocktranslate context wrapped in single quotes' %}Translatable literal with context wrapped in single quotes{% endblocktranslate %}
{% blocktrans context "Special blocktrans context wrapped in double quotes" %}Translatable literal with context wrapped in double quotes{% endblocktrans %} {% blocktranslate context "Special blocktranslate context wrapped in double quotes" %}Translatable literal with context wrapped in double quotes{% endblocktranslate %}
{% blocktranslate %}blocktranslate text{% endblocktranslate %} {# Backwards compatability tests #}
{% translate "translate text" %} {% blocktrans %}blocktrans text{% endblocktrans %}
{% trans "trans text" %}
{# BasicExtractorTests.test_blocktranslate_trimmed #} {# BasicExtractorTests.test_blocktranslate_trimmed #}
{% blocktranslate %} {% blocktranslate %}
Text with a few Text with a few
line breaks. line breaks.
{% endblocktrans %} {% endblocktranslate %}
{% blocktrans trimmed %} {% blocktranslate trimmed %}
Again some text with a few Again some text with a few
line breaks, this time line breaks, this time
should be trimmed. should be trimmed.
{% endblocktrans %} {% endblocktranslate %}
{% trans "Get my line number" %} {% translate "Get my line number" %}
{% blocktranslate trimmed count counter=mylist|length %} {% blocktranslate trimmed count counter=mylist|length %}
First `translate`, then `blocktranslate` with a plural First `translate`, then `blocktranslate` with a plural
@ -106,4 +107,4 @@ First `translate`, then `blocktranslate` with a plural
Plural for a `translate` and `blocktranslate` collision case Plural for a `translate` and `blocktranslate` collision case
{% endblocktranslate %} {% endblocktranslate %}
{% trans "Non-breaking space :" %} {% translate "Non-breaking space :" %}

View File

@ -1,2 +1,2 @@
{% load i18n %} {% load i18n %}
{% trans "This should be ignored too." %} {% translate "This should be ignored too." %}

View File

@ -1,12 +1,12 @@
{% load i18n %} {% load i18n %}
{% trans "Literal with a percent symbol at the end %" %} {% translate "Literal with a percent symbol at the end %" %}
{% trans "Literal with a percent % symbol in the middle" %} {% translate "Literal with a percent % symbol in the middle" %}
{% trans "It is 100%" %} {% translate "It is 100%" %}
{% trans "It is 100%" context "female" %} {% translate "It is 100%" context "female" %}
{% trans "Looks like a str fmt spec %s but should not be interpreted as such" %} {% translate "Looks like a str fmt spec %s but should not be interpreted as such" %}
{% trans "Looks like a str fmt spec % o but should not be interpreted as such" %} {% translate "Looks like a str fmt spec % o but should not be interpreted as such" %}
{% trans "1 percent sign %, 2 percent signs %%, 3 percent signs %%%" %} {% translate "1 percent sign %, 2 percent signs %%, 3 percent signs %%%" %}
{% blocktrans with name="Simon" %}{{name}} says: 1 percent sign %, 2 percent signs %%{% endblocktrans %} {% blocktranslate with name="Simon" %}{{name}} says: 1 percent sign %, 2 percent signs %%{% endblocktranslate %}

View File

@ -13,8 +13,7 @@ blocktranslate. This issue is difficult to debug, it could be a problem with
extraction, interpolation, or both. extraction, interpolation, or both.
How this script helps: How this script helps:
* Add {% translate "Two %% Three %%%" %} and blocktranslate equivalent to * Add {% translate "Two %% Three %%%" %} and blocktranslate equivalent to templates.
templates.
* Run this script. * Run this script.
* Test extraction - verify the new msgid in sampleproject's django.po. * Test extraction - verify the new msgid in sampleproject's django.po.
* Add a translation to sampleproject's django.po. * Add a translation to sampleproject's django.po.

View File

@ -197,7 +197,7 @@ class BasicExtractorTests(ExtractorTests):
def test_extraction_error(self): def test_extraction_error(self):
msg = ( msg = (
'Translation blocks must not include other block tags: blocktrans ' 'Translation blocks must not include other block tags: blocktranslate '
'(file %s, line 3)' % os.path.join('templates', 'template_with_error.tpl') '(file %s, line 3)' % os.path.join('templates', 'template_with_error.tpl')
) )
with self.assertRaisesMessage(SyntaxError, msg): with self.assertRaisesMessage(SyntaxError, msg):
@ -224,14 +224,14 @@ class BasicExtractorTests(ExtractorTests):
def test_template_message_context_extractor(self): def test_template_message_context_extractor(self):
""" """
Message contexts are correctly extracted for the {% trans %} and Message contexts are correctly extracted for the {% translate %} and
{% blocktrans %} template tags (#14806). {% blocktranslate %} template tags (#14806).
""" """
management.call_command('makemessages', locale=[LOCALE], verbosity=0) management.call_command('makemessages', locale=[LOCALE], verbosity=0)
self.assertTrue(os.path.exists(self.PO_FILE)) self.assertTrue(os.path.exists(self.PO_FILE))
with open(self.PO_FILE) as fp: with open(self.PO_FILE) as fp:
po_contents = fp.read() po_contents = fp.read()
# {% trans %} # {% translate %}
self.assertIn('msgctxt "Special trans context #1"', po_contents) self.assertIn('msgctxt "Special trans context #1"', po_contents)
self.assertMsgId("Translatable literal #7a", po_contents) self.assertMsgId("Translatable literal #7a", po_contents)
self.assertIn('msgctxt "Special trans context #2"', po_contents) self.assertIn('msgctxt "Special trans context #2"', po_contents)
@ -239,39 +239,39 @@ class BasicExtractorTests(ExtractorTests):
self.assertIn('msgctxt "Special trans context #3"', po_contents) self.assertIn('msgctxt "Special trans context #3"', po_contents)
self.assertMsgId("Translatable literal #7c", po_contents) self.assertMsgId("Translatable literal #7c", po_contents)
# {% trans %} with a filter # {% translate %} with a filter
for minor_part in 'abcdefgh': # Iterate from #7.1a to #7.1h template markers for minor_part in 'abcdefgh': # Iterate from #7.1a to #7.1h template markers
self.assertIn('msgctxt "context #7.1{}"'.format(minor_part), po_contents) self.assertIn('msgctxt "context #7.1{}"'.format(minor_part), po_contents)
self.assertMsgId('Translatable literal #7.1{}'.format(minor_part), po_contents) self.assertMsgId('Translatable literal #7.1{}'.format(minor_part), po_contents)
# {% blocktrans %} # {% blocktranslate %}
self.assertIn('msgctxt "Special blocktrans context #1"', po_contents) self.assertIn('msgctxt "Special blocktranslate context #1"', po_contents)
self.assertMsgId("Translatable literal #8a", po_contents) self.assertMsgId("Translatable literal #8a", po_contents)
self.assertIn('msgctxt "Special blocktrans context #2"', po_contents) self.assertIn('msgctxt "Special blocktranslate context #2"', po_contents)
self.assertMsgId("Translatable literal #8b-singular", po_contents) self.assertMsgId("Translatable literal #8b-singular", po_contents)
self.assertIn("Translatable literal #8b-plural", po_contents) self.assertIn("Translatable literal #8b-plural", po_contents)
self.assertIn('msgctxt "Special blocktrans context #3"', po_contents) self.assertIn('msgctxt "Special blocktranslate context #3"', po_contents)
self.assertMsgId("Translatable literal #8c-singular", po_contents) self.assertMsgId("Translatable literal #8c-singular", po_contents)
self.assertIn("Translatable literal #8c-plural", po_contents) self.assertIn("Translatable literal #8c-plural", po_contents)
self.assertIn('msgctxt "Special blocktrans context #4"', po_contents) self.assertIn('msgctxt "Special blocktranslate context #4"', po_contents)
self.assertMsgId("Translatable literal #8d %(a)s", po_contents) self.assertMsgId("Translatable literal #8d %(a)s", po_contents)
# {% translate %} and {% blocktranslate %} # {% trans %} and {% blocktrans %}
self.assertMsgId('translate text', po_contents) self.assertMsgId('trans text', po_contents)
self.assertMsgId('blocktranslate text', po_contents) self.assertMsgId('blocktrans text', po_contents)
def test_context_in_single_quotes(self): def test_context_in_single_quotes(self):
management.call_command('makemessages', locale=[LOCALE], verbosity=0) management.call_command('makemessages', locale=[LOCALE], verbosity=0)
self.assertTrue(os.path.exists(self.PO_FILE)) self.assertTrue(os.path.exists(self.PO_FILE))
with open(self.PO_FILE) as fp: with open(self.PO_FILE) as fp:
po_contents = fp.read() po_contents = fp.read()
# {% trans %} # {% translate %}
self.assertIn('msgctxt "Context wrapped in double quotes"', po_contents) self.assertIn('msgctxt "Context wrapped in double quotes"', po_contents)
self.assertIn('msgctxt "Context wrapped in single quotes"', po_contents) self.assertIn('msgctxt "Context wrapped in single quotes"', po_contents)
# {% blocktrans %} # {% blocktranslate %}
self.assertIn('msgctxt "Special blocktrans context wrapped in double quotes"', po_contents) self.assertIn('msgctxt "Special blocktranslate context wrapped in double quotes"', po_contents)
self.assertIn('msgctxt "Special blocktrans context wrapped in single quotes"', po_contents) self.assertIn('msgctxt "Special blocktranslate context wrapped in single quotes"', po_contents)
def test_template_comments(self): def test_template_comments(self):
"""Template comment tags on the same line of other constructs (#19552)""" """Template comment tags on the same line of other constructs (#19552)"""
@ -535,8 +535,8 @@ class CopyPluralFormsExtractorTests(ExtractorTests):
def test_translate_and_plural_blocktranslate_collision(self): def test_translate_and_plural_blocktranslate_collision(self):
""" """
Ensures a correct workaround for the gettext bug when handling a literal Ensures a correct workaround for the gettext bug when handling a literal
found inside a {% trans %} tag and also in another file inside a found inside a {% translate %} tag and also in another file inside a
{% blocktrans %} with a plural (#17375). {% blocktranslate %} with a plural (#17375).
""" """
management.call_command('makemessages', locale=[LOCALE], extensions=['html', 'djtpl'], verbosity=0) management.call_command('makemessages', locale=[LOCALE], extensions=['html', 'djtpl'], verbosity=0)
self.assertTrue(os.path.exists(self.PO_FILE)) self.assertTrue(os.path.exists(self.PO_FILE))

View File

@ -61,7 +61,7 @@ class RenderingTemplatesWithPercentSigns(FrenchTestCase):
""" """
Test rendering of templates that use percent signs. Test rendering of templates that use percent signs.
Ensures both trans and blocktrans tags behave consistently. Ensures both translate and blocktranslate tags behave consistently.
Refs #11240, #11966, #24257 Refs #11240, #11966, #24257
""" """
@ -69,62 +69,62 @@ class RenderingTemplatesWithPercentSigns(FrenchTestCase):
def test_translates_with_a_percent_symbol_at_the_end(self): def test_translates_with_a_percent_symbol_at_the_end(self):
expected = 'Littérale avec un symbole de pour cent à la fin %' expected = 'Littérale avec un symbole de pour cent à la fin %'
trans_tpl = Template('{% load i18n %}{% trans "Literal with a percent symbol at the end %" %}') trans_tpl = Template('{% load i18n %}{% translate "Literal with a percent symbol at the end %" %}')
self.assertEqual(trans_tpl.render(Context({})), expected) self.assertEqual(trans_tpl.render(Context({})), expected)
block_tpl = Template( block_tpl = Template(
'{% load i18n %}{% blocktrans %}Literal with a percent symbol at ' '{% load i18n %}{% blocktranslate %}Literal with a percent symbol at '
'the end %{% endblocktrans %}' 'the end %{% endblocktranslate %}'
) )
self.assertEqual(block_tpl.render(Context({})), expected) self.assertEqual(block_tpl.render(Context({})), expected)
def test_translates_with_percent_symbol_in_the_middle(self): def test_translates_with_percent_symbol_in_the_middle(self):
expected = 'Pour cent littérale % avec un symbole au milieu' expected = 'Pour cent littérale % avec un symbole au milieu'
trans_tpl = Template('{% load i18n %}{% trans "Literal with a percent % symbol in the middle" %}') trans_tpl = Template('{% load i18n %}{% translate "Literal with a percent % symbol in the middle" %}')
self.assertEqual(trans_tpl.render(Context({})), expected) self.assertEqual(trans_tpl.render(Context({})), expected)
block_tpl = Template( block_tpl = Template(
'{% load i18n %}{% blocktrans %}Literal with a percent % symbol ' '{% load i18n %}{% blocktranslate %}Literal with a percent % symbol '
'in the middle{% endblocktrans %}' 'in the middle{% endblocktranslate %}'
) )
self.assertEqual(block_tpl.render(Context({})), expected) self.assertEqual(block_tpl.render(Context({})), expected)
def test_translates_with_percent_symbol_using_context(self): def test_translates_with_percent_symbol_using_context(self):
trans_tpl = Template('{% load i18n %}{% trans "It is 100%" %}') trans_tpl = Template('{% load i18n %}{% translate "It is 100%" %}')
self.assertEqual(trans_tpl.render(Context({})), 'Il est de 100%') self.assertEqual(trans_tpl.render(Context({})), 'Il est de 100%')
trans_tpl = Template('{% load i18n %}{% trans "It is 100%" context "female" %}') trans_tpl = Template('{% load i18n %}{% translate "It is 100%" context "female" %}')
self.assertEqual(trans_tpl.render(Context({})), 'Elle est de 100%') self.assertEqual(trans_tpl.render(Context({})), 'Elle est de 100%')
block_tpl = Template('{% load i18n %}{% blocktrans %}It is 100%{% endblocktrans %}') block_tpl = Template('{% load i18n %}{% blocktranslate %}It is 100%{% endblocktranslate %}')
self.assertEqual(block_tpl.render(Context({})), 'Il est de 100%') self.assertEqual(block_tpl.render(Context({})), 'Il est de 100%')
block_tpl = Template('{% load i18n %}{% blocktrans context "female" %}It is 100%{% endblocktrans %}') block_tpl = Template('{% load i18n %}{% blocktranslate context "female" %}It is 100%{% endblocktranslate %}')
self.assertEqual(block_tpl.render(Context({})), 'Elle est de 100%') self.assertEqual(block_tpl.render(Context({})), 'Elle est de 100%')
def test_translates_with_string_that_look_like_fmt_spec_with_trans(self): def test_translates_with_string_that_look_like_fmt_spec_with_trans(self):
# tests "%s" # tests "%s"
expected = ('On dirait un spec str fmt %s mais ne devrait pas être interprété comme plus disponible') expected = ('On dirait un spec str fmt %s mais ne devrait pas être interprété comme plus disponible')
trans_tpl = Template( trans_tpl = Template(
'{% load i18n %}{% trans "Looks like a str fmt spec %s but ' '{% load i18n %}{% translate "Looks like a str fmt spec %s but '
'should not be interpreted as such" %}' 'should not be interpreted as such" %}'
) )
self.assertEqual(trans_tpl.render(Context({})), expected) self.assertEqual(trans_tpl.render(Context({})), expected)
block_tpl = Template( block_tpl = Template(
'{% load i18n %}{% blocktrans %}Looks like a str fmt spec %s but ' '{% load i18n %}{% blocktranslate %}Looks like a str fmt spec %s but '
'should not be interpreted as such{% endblocktrans %}' 'should not be interpreted as such{% endblocktranslate %}'
) )
self.assertEqual(block_tpl.render(Context({})), expected) self.assertEqual(block_tpl.render(Context({})), expected)
# tests "% o" # tests "% o"
expected = ('On dirait un spec str fmt % o mais ne devrait pas être interprété comme plus disponible') expected = ('On dirait un spec str fmt % o mais ne devrait pas être interprété comme plus disponible')
trans_tpl = Template( trans_tpl = Template(
'{% load i18n %}{% trans "Looks like a str fmt spec % o but should not be ' '{% load i18n %}{% translate "Looks like a str fmt spec % o but should not be '
'interpreted as such" %}' 'interpreted as such" %}'
) )
self.assertEqual(trans_tpl.render(Context({})), expected) self.assertEqual(trans_tpl.render(Context({})), expected)
block_tpl = Template( block_tpl = Template(
'{% load i18n %}{% blocktrans %}Looks like a str fmt spec % o but should not be ' '{% load i18n %}{% blocktranslate %}Looks like a str fmt spec % o but should not be '
'interpreted as such{% endblocktrans %}' 'interpreted as such{% endblocktranslate %}'
) )
self.assertEqual(block_tpl.render(Context({})), expected) self.assertEqual(block_tpl.render(Context({})), expected)
@ -132,19 +132,19 @@ class RenderingTemplatesWithPercentSigns(FrenchTestCase):
expected = ('1 % signe pour cent, signes %% 2 pour cent, trois signes de pourcentage %%%') expected = ('1 % signe pour cent, signes %% 2 pour cent, trois signes de pourcentage %%%')
trans_tpl = Template( trans_tpl = Template(
'{% load i18n %}{% trans "1 percent sign %, 2 percent signs %%, ' '{% load i18n %}{% translate "1 percent sign %, 2 percent signs %%, '
'3 percent signs %%%" %}' '3 percent signs %%%" %}'
) )
self.assertEqual(trans_tpl.render(Context({})), expected) self.assertEqual(trans_tpl.render(Context({})), expected)
block_tpl = Template( block_tpl = Template(
'{% load i18n %}{% blocktrans %}1 percent sign %, 2 percent signs ' '{% load i18n %}{% blocktranslate %}1 percent sign %, 2 percent signs '
'%%, 3 percent signs %%%{% endblocktrans %}' '%%, 3 percent signs %%%{% endblocktranslate %}'
) )
self.assertEqual(block_tpl.render(Context({})), expected) self.assertEqual(block_tpl.render(Context({})), expected)
block_tpl = Template( block_tpl = Template(
'{% load i18n %}{% blocktrans %}{{name}} says: 1 percent sign %, ' '{% load i18n %}{% blocktranslate %}{{name}} says: 1 percent sign %, '
'2 percent signs %%{% endblocktrans %}' '2 percent signs %%{% endblocktranslate %}'
) )
self.assertEqual( self.assertEqual(
block_tpl.render(Context({"name": "Django"})), block_tpl.render(Context({"name": "Django"})),

View File

@ -15,12 +15,12 @@ from .base import MultipleLocaleActivationTestCase, extended_locale_paths, here
def setup(templates, *args, **kwargs): def setup(templates, *args, **kwargs):
blocktrans_setup = base_setup(templates, *args, **kwargs) blocktranslate_setup = base_setup(templates, *args, **kwargs)
blocktranslate_setup = base_setup({ blocktrans_setup = base_setup({
name: template.replace( name: template.replace(
'{% blocktrans ', '{% blocktranslate ' '{% blocktranslate ', '{% blocktrans '
).replace( ).replace(
'{% endblocktrans %}', '{% endblocktranslate %}' '{% endblocktranslate %}', '{% endblocktrans %}'
) )
for name, template in templates.items() for name, template in templates.items()
}) })
@ -46,65 +46,65 @@ def setup(templates, *args, **kwargs):
class I18nBlockTransTagTests(SimpleTestCase): class I18nBlockTransTagTests(SimpleTestCase):
libraries = {'i18n': 'django.templatetags.i18n'} libraries = {'i18n': 'django.templatetags.i18n'}
@setup({'i18n03': '{% load i18n %}{% blocktrans %}{{ anton }}{% endblocktrans %}'}) @setup({'i18n03': '{% load i18n %}{% blocktranslate %}{{ anton }}{% endblocktranslate %}'})
def test_i18n03(self): def test_i18n03(self):
"""simple translation of a variable""" """simple translation of a variable"""
output = self.engine.render_to_string('i18n03', {'anton': 'Å'}) output = self.engine.render_to_string('i18n03', {'anton': 'Å'})
self.assertEqual(output, 'Å') self.assertEqual(output, 'Å')
@setup({'i18n04': '{% load i18n %}{% blocktrans with berta=anton|lower %}{{ berta }}{% endblocktrans %}'}) @setup({'i18n04': '{% load i18n %}{% blocktranslate with berta=anton|lower %}{{ berta }}{% endblocktranslate %}'})
def test_i18n04(self): def test_i18n04(self):
"""simple translation of a variable and filter""" """simple translation of a variable and filter"""
output = self.engine.render_to_string('i18n04', {'anton': 'Å'}) output = self.engine.render_to_string('i18n04', {'anton': 'Å'})
self.assertEqual(output, 'å') self.assertEqual(output, 'å')
@setup({'legacyi18n04': '{% load i18n %}' @setup({'legacyi18n04': '{% load i18n %}'
'{% blocktrans with anton|lower as berta %}{{ berta }}{% endblocktrans %}'}) '{% blocktranslate with anton|lower as berta %}{{ berta }}{% endblocktranslate %}'})
def test_legacyi18n04(self): def test_legacyi18n04(self):
"""simple translation of a variable and filter""" """simple translation of a variable and filter"""
output = self.engine.render_to_string('legacyi18n04', {'anton': 'Å'}) output = self.engine.render_to_string('legacyi18n04', {'anton': 'Å'})
self.assertEqual(output, 'å') self.assertEqual(output, 'å')
@setup({'i18n05': '{% load i18n %}{% blocktrans %}xxx{{ anton }}xxx{% endblocktrans %}'}) @setup({'i18n05': '{% load i18n %}{% blocktranslate %}xxx{{ anton }}xxx{% endblocktranslate %}'})
def test_i18n05(self): def test_i18n05(self):
"""simple translation of a string with interpolation""" """simple translation of a string with interpolation"""
output = self.engine.render_to_string('i18n05', {'anton': 'yyy'}) output = self.engine.render_to_string('i18n05', {'anton': 'yyy'})
self.assertEqual(output, 'xxxyyyxxx') self.assertEqual(output, 'xxxyyyxxx')
@setup({'i18n07': '{% load i18n %}' @setup({'i18n07': '{% load i18n %}'
'{% blocktrans count counter=number %}singular{% plural %}' '{% blocktranslate count counter=number %}singular{% plural %}'
'{{ counter }} plural{% endblocktrans %}'}) '{{ counter }} plural{% endblocktranslate %}'})
def test_i18n07(self): def test_i18n07(self):
"""translation of singular form""" """translation of singular form"""
output = self.engine.render_to_string('i18n07', {'number': 1}) output = self.engine.render_to_string('i18n07', {'number': 1})
self.assertEqual(output, 'singular') self.assertEqual(output, 'singular')
@setup({'legacyi18n07': '{% load i18n %}' @setup({'legacyi18n07': '{% load i18n %}'
'{% blocktrans count number as counter %}singular{% plural %}' '{% blocktranslate count number as counter %}singular{% plural %}'
'{{ counter }} plural{% endblocktrans %}'}) '{{ counter }} plural{% endblocktranslate %}'})
def test_legacyi18n07(self): def test_legacyi18n07(self):
"""translation of singular form""" """translation of singular form"""
output = self.engine.render_to_string('legacyi18n07', {'number': 1}) output = self.engine.render_to_string('legacyi18n07', {'number': 1})
self.assertEqual(output, 'singular') self.assertEqual(output, 'singular')
@setup({'i18n08': '{% load i18n %}' @setup({'i18n08': '{% load i18n %}'
'{% blocktrans count number as counter %}singular{% plural %}' '{% blocktranslate count number as counter %}singular{% plural %}'
'{{ counter }} plural{% endblocktrans %}'}) '{{ counter }} plural{% endblocktranslate %}'})
def test_i18n08(self): def test_i18n08(self):
"""translation of plural form""" """translation of plural form"""
output = self.engine.render_to_string('i18n08', {'number': 2}) output = self.engine.render_to_string('i18n08', {'number': 2})
self.assertEqual(output, '2 plural') self.assertEqual(output, '2 plural')
@setup({'legacyi18n08': '{% load i18n %}' @setup({'legacyi18n08': '{% load i18n %}'
'{% blocktrans count counter=number %}singular{% plural %}' '{% blocktranslate count counter=number %}singular{% plural %}'
'{{ counter }} plural{% endblocktrans %}'}) '{{ counter }} plural{% endblocktranslate %}'})
def test_legacyi18n08(self): def test_legacyi18n08(self):
"""translation of plural form""" """translation of plural form"""
output = self.engine.render_to_string('legacyi18n08', {'number': 2}) output = self.engine.render_to_string('legacyi18n08', {'number': 2})
self.assertEqual(output, '2 plural') self.assertEqual(output, '2 plural')
@setup({'i18n17': '{% load i18n %}' @setup({'i18n17': '{% load i18n %}'
'{% blocktrans with berta=anton|escape %}{{ berta }}{% endblocktrans %}'}) '{% blocktranslate with berta=anton|escape %}{{ berta }}{% endblocktranslate %}'})
def test_i18n17(self): def test_i18n17(self):
""" """
Escaping inside blocktranslate and translate works as if it was Escaping inside blocktranslate and translate works as if it was
@ -114,37 +114,37 @@ class I18nBlockTransTagTests(SimpleTestCase):
self.assertEqual(output, 'α &amp; β') self.assertEqual(output, 'α &amp; β')
@setup({'i18n18': '{% load i18n %}' @setup({'i18n18': '{% load i18n %}'
'{% blocktrans with berta=anton|force_escape %}{{ berta }}{% endblocktrans %}'}) '{% blocktranslate with berta=anton|force_escape %}{{ berta }}{% endblocktranslate %}'})
def test_i18n18(self): def test_i18n18(self):
output = self.engine.render_to_string('i18n18', {'anton': 'α & β'}) output = self.engine.render_to_string('i18n18', {'anton': 'α & β'})
self.assertEqual(output, 'α &amp; β') self.assertEqual(output, 'α &amp; β')
@setup({'i18n19': '{% load i18n %}{% blocktrans %}{{ andrew }}{% endblocktrans %}'}) @setup({'i18n19': '{% load i18n %}{% blocktranslate %}{{ andrew }}{% endblocktranslate %}'})
def test_i18n19(self): def test_i18n19(self):
output = self.engine.render_to_string('i18n19', {'andrew': 'a & b'}) output = self.engine.render_to_string('i18n19', {'andrew': 'a & b'})
self.assertEqual(output, 'a &amp; b') self.assertEqual(output, 'a &amp; b')
@setup({'i18n21': '{% load i18n %}{% blocktrans %}{{ andrew }}{% endblocktrans %}'}) @setup({'i18n21': '{% load i18n %}{% blocktranslate %}{{ andrew }}{% endblocktranslate %}'})
def test_i18n21(self): def test_i18n21(self):
output = self.engine.render_to_string('i18n21', {'andrew': mark_safe('a & b')}) output = self.engine.render_to_string('i18n21', {'andrew': mark_safe('a & b')})
self.assertEqual(output, 'a & b') self.assertEqual(output, 'a & b')
@setup({'legacyi18n17': '{% load i18n %}' @setup({'legacyi18n17': '{% load i18n %}'
'{% blocktrans with anton|escape as berta %}{{ berta }}{% endblocktrans %}'}) '{% blocktranslate with anton|escape as berta %}{{ berta }}{% endblocktranslate %}'})
def test_legacyi18n17(self): def test_legacyi18n17(self):
output = self.engine.render_to_string('legacyi18n17', {'anton': 'α & β'}) output = self.engine.render_to_string('legacyi18n17', {'anton': 'α & β'})
self.assertEqual(output, 'α &amp; β') self.assertEqual(output, 'α &amp; β')
@setup({'legacyi18n18': '{% load i18n %}' @setup({'legacyi18n18': '{% load i18n %}'
'{% blocktrans with anton|force_escape as berta %}' '{% blocktranslate with anton|force_escape as berta %}'
'{{ berta }}{% endblocktrans %}'}) '{{ berta }}{% endblocktranslate %}'})
def test_legacyi18n18(self): def test_legacyi18n18(self):
output = self.engine.render_to_string('legacyi18n18', {'anton': 'α & β'}) output = self.engine.render_to_string('legacyi18n18', {'anton': 'α & β'})
self.assertEqual(output, 'α &amp; β') self.assertEqual(output, 'α &amp; β')
@setup({'i18n26': '{% load i18n %}' @setup({'i18n26': '{% load i18n %}'
'{% blocktrans with extra_field=myextra_field count counter=number %}' '{% blocktranslate with extra_field=myextra_field count counter=number %}'
'singular {{ extra_field }}{% plural %}plural{% endblocktrans %}'}) 'singular {{ extra_field }}{% plural %}plural{% endblocktranslate %}'})
def test_i18n26(self): def test_i18n26(self):
""" """
translation of plural form with extra field in singular form (#13568) translation of plural form with extra field in singular form (#13568)
@ -153,15 +153,15 @@ class I18nBlockTransTagTests(SimpleTestCase):
self.assertEqual(output, 'singular test') self.assertEqual(output, 'singular test')
@setup({'legacyi18n26': '{% load i18n %}' @setup({'legacyi18n26': '{% load i18n %}'
'{% blocktrans with myextra_field as extra_field count number as counter %}' '{% blocktranslate with myextra_field as extra_field count number as counter %}'
'singular {{ extra_field }}{% plural %}plural{% endblocktrans %}'}) 'singular {{ extra_field }}{% plural %}plural{% endblocktranslate %}'})
def test_legacyi18n26(self): def test_legacyi18n26(self):
output = self.engine.render_to_string('legacyi18n26', {'myextra_field': 'test', 'number': 1}) output = self.engine.render_to_string('legacyi18n26', {'myextra_field': 'test', 'number': 1})
self.assertEqual(output, 'singular test') self.assertEqual(output, 'singular test')
@setup({'i18n27': '{% load i18n %}{% blocktrans count counter=number %}' @setup({'i18n27': '{% load i18n %}{% blocktranslate count counter=number %}'
'{{ counter }} result{% plural %}{{ counter }} results' '{{ counter }} result{% plural %}{{ counter }} results'
'{% endblocktrans %}'}) '{% endblocktranslate %}'})
def test_i18n27(self): def test_i18n27(self):
"""translation of singular form in Russian (#14126)""" """translation of singular form in Russian (#14126)"""
with translation.override('ru'): with translation.override('ru'):
@ -169,30 +169,30 @@ class I18nBlockTransTagTests(SimpleTestCase):
self.assertEqual(output, '1 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442') self.assertEqual(output, '1 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442')
@setup({'legacyi18n27': '{% load i18n %}' @setup({'legacyi18n27': '{% load i18n %}'
'{% blocktrans count number as counter %}{{ counter }} result' '{% blocktranslate count number as counter %}{{ counter }} result'
'{% plural %}{{ counter }} results{% endblocktrans %}'}) '{% plural %}{{ counter }} results{% endblocktranslate %}'})
def test_legacyi18n27(self): def test_legacyi18n27(self):
with translation.override('ru'): with translation.override('ru'):
output = self.engine.render_to_string('legacyi18n27', {'number': 1}) output = self.engine.render_to_string('legacyi18n27', {'number': 1})
self.assertEqual(output, '1 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442') self.assertEqual(output, '1 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442')
@setup({'i18n28': '{% load i18n %}' @setup({'i18n28': '{% load i18n %}'
'{% blocktrans with a=anton b=berta %}{{ a }} + {{ b }}{% endblocktrans %}'}) '{% blocktranslate with a=anton b=berta %}{{ a }} + {{ b }}{% endblocktranslate %}'})
def test_i18n28(self): def test_i18n28(self):
"""simple translation of multiple variables""" """simple translation of multiple variables"""
output = self.engine.render_to_string('i18n28', {'anton': 'α', 'berta': 'β'}) output = self.engine.render_to_string('i18n28', {'anton': 'α', 'berta': 'β'})
self.assertEqual(output, 'α + β') self.assertEqual(output, 'α + β')
@setup({'legacyi18n28': '{% load i18n %}' @setup({'legacyi18n28': '{% load i18n %}'
'{% blocktrans with anton as a and berta as b %}' '{% blocktranslate with anton as a and berta as b %}'
'{{ a }} + {{ b }}{% endblocktrans %}'}) '{{ a }} + {{ b }}{% endblocktranslate %}'})
def test_legacyi18n28(self): def test_legacyi18n28(self):
output = self.engine.render_to_string('legacyi18n28', {'anton': 'α', 'berta': 'β'}) output = self.engine.render_to_string('legacyi18n28', {'anton': 'α', 'berta': 'β'})
self.assertEqual(output, 'α + β') self.assertEqual(output, 'α + β')
# blocktrans handling of variables which are not in the context. # blocktranslate handling of variables which are not in the context.
# this should work as if blocktrans was not there (#19915) # this should work as if blocktranslate was not there (#19915)
@setup({'i18n34': '{% load i18n %}{% blocktrans %}{{ missing }}{% endblocktrans %}'}) @setup({'i18n34': '{% load i18n %}{% blocktranslate %}{{ missing }}{% endblocktranslate %}'})
def test_i18n34(self): def test_i18n34(self):
output = self.engine.render_to_string('i18n34') output = self.engine.render_to_string('i18n34')
if self.engine.string_if_invalid: if self.engine.string_if_invalid:
@ -200,7 +200,7 @@ class I18nBlockTransTagTests(SimpleTestCase):
else: else:
self.assertEqual(output, '') self.assertEqual(output, '')
@setup({'i18n34_2': '{% load i18n %}{% blocktrans with a=\'α\' %}{{ missing }}{% endblocktrans %}'}) @setup({'i18n34_2': '{% load i18n %}{% blocktranslate with a=\'α\' %}{{ missing }}{% endblocktranslate %}'})
def test_i18n34_2(self): def test_i18n34_2(self):
output = self.engine.render_to_string('i18n34_2') output = self.engine.render_to_string('i18n34_2')
if self.engine.string_if_invalid: if self.engine.string_if_invalid:
@ -208,7 +208,7 @@ class I18nBlockTransTagTests(SimpleTestCase):
else: else:
self.assertEqual(output, '') self.assertEqual(output, '')
@setup({'i18n34_3': '{% load i18n %}{% blocktrans with a=anton %}{{ missing }}{% endblocktrans %}'}) @setup({'i18n34_3': '{% load i18n %}{% blocktranslate with a=anton %}{{ missing }}{% endblocktranslate %}'})
def test_i18n34_3(self): def test_i18n34_3(self):
output = self.engine.render_to_string( output = self.engine.render_to_string(
'i18n34_3', {'anton': '\xce\xb1'}) 'i18n34_3', {'anton': '\xce\xb1'})
@ -218,16 +218,16 @@ class I18nBlockTransTagTests(SimpleTestCase):
self.assertEqual(output, '') self.assertEqual(output, '')
@setup({'i18n37': '{% load i18n %}' @setup({'i18n37': '{% load i18n %}'
'{% trans "Page not found" as page_not_found %}' '{% translate "Page not found" as page_not_found %}'
'{% blocktrans %}Error: {{ page_not_found }}{% endblocktrans %}'}) '{% blocktranslate %}Error: {{ page_not_found }}{% endblocktranslate %}'})
def test_i18n37(self): def test_i18n37(self):
with translation.override('de'): with translation.override('de'):
output = self.engine.render_to_string('i18n37') output = self.engine.render_to_string('i18n37')
self.assertEqual(output, 'Error: Seite nicht gefunden') self.assertEqual(output, 'Error: Seite nicht gefunden')
# blocktrans tag with asvar # blocktranslate tag with asvar
@setup({'i18n39': '{% load i18n %}' @setup({'i18n39': '{% load i18n %}'
'{% blocktrans asvar page_not_found %}Page not found{% endblocktrans %}' '{% blocktranslate asvar page_not_found %}Page not found{% endblocktranslate %}'
'>{{ page_not_found }}<'}) '>{{ page_not_found }}<'})
def test_i18n39(self): def test_i18n39(self):
with translation.override('de'): with translation.override('de'):
@ -235,69 +235,73 @@ class I18nBlockTransTagTests(SimpleTestCase):
self.assertEqual(output, '>Seite nicht gefunden<') self.assertEqual(output, '>Seite nicht gefunden<')
@setup({'i18n40': '{% load i18n %}' @setup({'i18n40': '{% load i18n %}'
'{% trans "Page not found" as pg_404 %}' '{% translate "Page not found" as pg_404 %}'
'{% blocktrans with page_not_found=pg_404 asvar output %}' '{% blocktranslate with page_not_found=pg_404 asvar output %}'
'Error: {{ page_not_found }}' 'Error: {{ page_not_found }}'
'{% endblocktrans %}'}) '{% endblocktranslate %}'})
def test_i18n40(self): def test_i18n40(self):
output = self.engine.render_to_string('i18n40') output = self.engine.render_to_string('i18n40')
self.assertEqual(output, '') self.assertEqual(output, '')
@setup({'i18n41': '{% load i18n %}' @setup({'i18n41': '{% load i18n %}'
'{% trans "Page not found" as pg_404 %}' '{% translate "Page not found" as pg_404 %}'
'{% blocktrans with page_not_found=pg_404 asvar output %}' '{% blocktranslate with page_not_found=pg_404 asvar output %}'
'Error: {{ page_not_found }}' 'Error: {{ page_not_found }}'
'{% endblocktrans %}' '{% endblocktranslate %}'
'>{{ output }}<'}) '>{{ output }}<'})
def test_i18n41(self): def test_i18n41(self):
with translation.override('de'): with translation.override('de'):
output = self.engine.render_to_string('i18n41') output = self.engine.render_to_string('i18n41')
self.assertEqual(output, '>Error: Seite nicht gefunden<') self.assertEqual(output, '>Error: Seite nicht gefunden<')
@setup({'template': '{% load i18n %}{% blocktrans asvar %}Yes{% endblocktrans %}'}) @setup({'template': '{% load i18n %}{% blocktranslate asvar %}Yes{% endblocktranslate %}'})
def test_blocktrans_syntax_error_missing_assignment(self, tag_name): def test_blocktrans_syntax_error_missing_assignment(self, tag_name):
msg = "No argument provided to the '{}' tag for the asvar option.".format(tag_name) msg = "No argument provided to the '{}' tag for the asvar option.".format(tag_name)
with self.assertRaisesMessage(TemplateSyntaxError, msg): with self.assertRaisesMessage(TemplateSyntaxError, msg):
self.engine.render_to_string('template') self.engine.render_to_string('template')
@setup({'template': '{% load i18n %}{% blocktrans %}%s{% endblocktrans %}'}) @setup({'template': '{% load i18n %}{% blocktranslate %}%s{% endblocktranslate %}'})
def test_blocktrans_tag_using_a_string_that_looks_like_str_fmt(self): def test_blocktrans_tag_using_a_string_that_looks_like_str_fmt(self):
output = self.engine.render_to_string('template') output = self.engine.render_to_string('template')
self.assertEqual(output, '%s') self.assertEqual(output, '%s')
@setup({'template': '{% load i18n %}{% blocktrans %}{% block b %} {% endblock %}{% endblocktrans %}'}) @setup({'template': '{% load i18n %}{% blocktranslate %}{% block b %} {% endblock %}{% endblocktranslate %}'})
def test_with_block(self, tag_name): def test_with_block(self, tag_name):
msg = "'{}' doesn't allow other block tags (seen 'block b') inside it".format(tag_name) msg = "'{}' doesn't allow other block tags (seen 'block b') inside it".format(tag_name)
with self.assertRaisesMessage(TemplateSyntaxError, msg): with self.assertRaisesMessage(TemplateSyntaxError, msg):
self.engine.render_to_string('template') self.engine.render_to_string('template')
@setup({'template': '{% load i18n %}{% blocktrans %}{% for b in [1, 2, 3] %} {% endfor %}{% endblocktrans %}'}) @setup({'template': (
'{% load i18n %}'
'{% blocktranslate %}{% for b in [1, 2, 3] %} {% endfor %}'
'{% endblocktranslate %}'
)})
def test_with_for(self, tag_name): def test_with_for(self, tag_name):
msg = "'{}' doesn't allow other block tags (seen 'for b in [1, 2, 3]') inside it".format(tag_name) msg = "'{}' doesn't allow other block tags (seen 'for b in [1, 2, 3]') inside it".format(tag_name)
with self.assertRaisesMessage(TemplateSyntaxError, msg): with self.assertRaisesMessage(TemplateSyntaxError, msg):
self.engine.render_to_string('template') self.engine.render_to_string('template')
@setup({'template': '{% load i18n %}{% blocktrans with foo=bar with %}{{ foo }}{% endblocktrans %}'}) @setup({'template': '{% load i18n %}{% blocktranslate with foo=bar with %}{{ foo }}{% endblocktranslate %}'})
def test_variable_twice(self): def test_variable_twice(self):
with self.assertRaisesMessage(TemplateSyntaxError, "The 'with' option was specified more than once"): with self.assertRaisesMessage(TemplateSyntaxError, "The 'with' option was specified more than once"):
self.engine.render_to_string('template', {'foo': 'bar'}) self.engine.render_to_string('template', {'foo': 'bar'})
@setup({'template': '{% load i18n %}{% blocktrans with %}{% endblocktrans %}'}) @setup({'template': '{% load i18n %}{% blocktranslate with %}{% endblocktranslate %}'})
def test_no_args_with(self, tag_name): def test_no_args_with(self, tag_name):
msg = '"with" in \'{}\' tag needs at least one keyword argument.'.format(tag_name) msg = '"with" in \'{}\' tag needs at least one keyword argument.'.format(tag_name)
with self.assertRaisesMessage(TemplateSyntaxError, msg): with self.assertRaisesMessage(TemplateSyntaxError, msg):
self.engine.render_to_string('template') self.engine.render_to_string('template')
@setup({'template': '{% load i18n %}{% blocktrans count a %}{% endblocktrans %}'}) @setup({'template': '{% load i18n %}{% blocktranslate count a %}{% endblocktranslate %}'})
def test_count(self, tag_name): def test_count(self, tag_name):
msg = '"count" in \'{}\' tag expected exactly one keyword argument.'.format(tag_name) msg = '"count" in \'{}\' tag expected exactly one keyword argument.'.format(tag_name)
with self.assertRaisesMessage(TemplateSyntaxError, msg): with self.assertRaisesMessage(TemplateSyntaxError, msg):
self.engine.render_to_string('template', {'a': [1, 2, 3]}) self.engine.render_to_string('template', {'a': [1, 2, 3]})
@setup({'template': ( @setup({'template': (
'{% load i18n %}{% blocktrans count count=var|length %}' '{% load i18n %}{% blocktranslate count count=var|length %}'
'There is {{ count }} object. {% block a %} {% endblock %}' 'There is {{ count }} object. {% block a %} {% endblock %}'
'{% endblocktrans %}' '{% endblocktranslate %}'
)}) )})
def test_plural_bad_syntax(self, tag_name): def test_plural_bad_syntax(self, tag_name):
msg = "'{}' doesn't allow other block tags inside it".format(tag_name) msg = "'{}' doesn't allow other block tags inside it".format(tag_name)
@ -305,133 +309,142 @@ class I18nBlockTransTagTests(SimpleTestCase):
self.engine.render_to_string('template', {'var': [1, 2, 3]}) self.engine.render_to_string('template', {'var': [1, 2, 3]})
class TranslationBlockTransTagTests(SimpleTestCase): class TranslationBlockTranslateTagTests(SimpleTestCase):
tag_name = 'blocktrans' tag_name = 'blocktranslate'
def get_template(self, template_string): def get_template(self, template_string):
return Template( return Template(
template_string.replace( template_string.replace(
'{{% blocktrans ', '{{% blocktranslate ',
'{{% {}'.format(self.tag_name) '{{% {}'.format(self.tag_name)
).replace( ).replace(
'{{% endblocktrans %}}', '{{% endblocktranslate %}}',
'{{% end{} %}}'.format(self.tag_name) '{{% end{} %}}'.format(self.tag_name)
) )
) )
@override_settings(LOCALE_PATHS=extended_locale_paths) @override_settings(LOCALE_PATHS=extended_locale_paths)
def test_template_tags_pgettext(self): def test_template_tags_pgettext(self):
"""{% blocktrans %} takes message contexts into account (#14806).""" """{% blocktranslate %} takes message contexts into account (#14806)."""
trans_real._active = Local() trans_real._active = Local()
trans_real._translations = {} trans_real._translations = {}
with translation.override('de'): with translation.override('de'):
# Nonexistent context # Nonexistent context
t = self.get_template('{% load i18n %}{% blocktrans context "nonexistent" %}May{% endblocktrans %}') t = self.get_template(
'{% load i18n %}{% blocktranslate context "nonexistent" %}May'
'{% endblocktranslate %}'
)
rendered = t.render(Context()) rendered = t.render(Context())
self.assertEqual(rendered, 'May') self.assertEqual(rendered, 'May')
# Existing context... using a literal # Existing context... using a literal
t = self.get_template('{% load i18n %}{% blocktrans context "month name" %}May{% endblocktrans %}') t = self.get_template('{% load i18n %}{% blocktranslate context "month name" %}May{% endblocktranslate %}')
rendered = t.render(Context()) rendered = t.render(Context())
self.assertEqual(rendered, 'Mai') self.assertEqual(rendered, 'Mai')
t = self.get_template('{% load i18n %}{% blocktrans context "verb" %}May{% endblocktrans %}') t = self.get_template('{% load i18n %}{% blocktranslate context "verb" %}May{% endblocktranslate %}')
rendered = t.render(Context()) rendered = t.render(Context())
self.assertEqual(rendered, 'Kann') self.assertEqual(rendered, 'Kann')
# Using a variable # Using a variable
t = self.get_template('{% load i18n %}{% blocktrans context message_context %}May{% endblocktrans %}') t = self.get_template(
'{% load i18n %}{% blocktranslate context message_context %}'
'May{% endblocktranslate %}'
)
rendered = t.render(Context({'message_context': 'month name'})) rendered = t.render(Context({'message_context': 'month name'}))
self.assertEqual(rendered, 'Mai') self.assertEqual(rendered, 'Mai')
t = self.get_template('{% load i18n %}{% blocktrans context message_context %}May{% endblocktrans %}') t = self.get_template(
'{% load i18n %}{% blocktranslate context message_context %}'
'May{% endblocktranslate %}'
)
rendered = t.render(Context({'message_context': 'verb'})) rendered = t.render(Context({'message_context': 'verb'}))
self.assertEqual(rendered, 'Kann') self.assertEqual(rendered, 'Kann')
# Using a filter # Using a filter
t = self.get_template( t = self.get_template(
'{% load i18n %}{% blocktrans context message_context|lower %}May{% endblocktrans %}' '{% load i18n %}{% blocktranslate context message_context|lower %}May{% endblocktranslate %}'
) )
rendered = t.render(Context({'message_context': 'MONTH NAME'})) rendered = t.render(Context({'message_context': 'MONTH NAME'}))
self.assertEqual(rendered, 'Mai') self.assertEqual(rendered, 'Mai')
t = self.get_template( t = self.get_template(
'{% load i18n %}{% blocktrans context message_context|lower %}May{% endblocktrans %}' '{% load i18n %}{% blocktranslate context message_context|lower %}May{% endblocktranslate %}'
) )
rendered = t.render(Context({'message_context': 'VERB'})) rendered = t.render(Context({'message_context': 'VERB'}))
self.assertEqual(rendered, 'Kann') self.assertEqual(rendered, 'Kann')
# Using 'count' # Using 'count'
t = self.get_template( t = self.get_template(
'{% load i18n %}{% blocktrans count number=1 context "super search" %}' '{% load i18n %}{% blocktranslate count number=1 context "super search" %}'
'{{ number }} super result{% plural %}{{ number }} super results{% endblocktrans %}' '{{ number }} super result{% plural %}{{ number }} super results{% endblocktranslate %}'
) )
rendered = t.render(Context()) rendered = t.render(Context())
self.assertEqual(rendered, '1 Super-Ergebnis') self.assertEqual(rendered, '1 Super-Ergebnis')
t = self.get_template( t = self.get_template(
'{% load i18n %}{% blocktrans count number=2 context "super search" %}{{ number }}' '{% load i18n %}{% blocktranslate count number=2 context "super search" %}{{ number }}'
' super result{% plural %}{{ number }} super results{% endblocktrans %}' ' super result{% plural %}{{ number }} super results{% endblocktranslate %}'
) )
rendered = t.render(Context()) rendered = t.render(Context())
self.assertEqual(rendered, '2 Super-Ergebnisse') self.assertEqual(rendered, '2 Super-Ergebnisse')
t = self.get_template( t = self.get_template(
'{% load i18n %}{% blocktrans context "other super search" count number=1 %}' '{% load i18n %}{% blocktranslate context "other super search" count number=1 %}'
'{{ number }} super result{% plural %}{{ number }} super results{% endblocktrans %}' '{{ number }} super result{% plural %}{{ number }} super results{% endblocktranslate %}'
) )
rendered = t.render(Context()) rendered = t.render(Context())
self.assertEqual(rendered, '1 anderen Super-Ergebnis') self.assertEqual(rendered, '1 anderen Super-Ergebnis')
t = self.get_template( t = self.get_template(
'{% load i18n %}{% blocktrans context "other super search" count number=2 %}' '{% load i18n %}{% blocktranslate context "other super search" count number=2 %}'
'{{ number }} super result{% plural %}{{ number }} super results{% endblocktrans %}' '{{ number }} super result{% plural %}{{ number }} super results{% endblocktranslate %}'
) )
rendered = t.render(Context()) rendered = t.render(Context())
self.assertEqual(rendered, '2 andere Super-Ergebnisse') self.assertEqual(rendered, '2 andere Super-Ergebnisse')
# Using 'with' # Using 'with'
t = self.get_template( t = self.get_template(
'{% load i18n %}{% blocktrans with num_comments=5 context "comment count" %}' '{% load i18n %}{% blocktranslate with num_comments=5 context "comment count" %}'
'There are {{ num_comments }} comments{% endblocktrans %}' 'There are {{ num_comments }} comments{% endblocktranslate %}'
) )
rendered = t.render(Context()) rendered = t.render(Context())
self.assertEqual(rendered, 'Es gibt 5 Kommentare') self.assertEqual(rendered, 'Es gibt 5 Kommentare')
t = self.get_template( t = self.get_template(
'{% load i18n %}{% blocktrans with num_comments=5 context "other comment count" %}' '{% load i18n %}{% blocktranslate with num_comments=5 context "other comment count" %}'
'There are {{ num_comments }} comments{% endblocktrans %}' 'There are {{ num_comments }} comments{% endblocktranslate %}'
) )
rendered = t.render(Context()) rendered = t.render(Context())
self.assertEqual(rendered, 'Andere: Es gibt 5 Kommentare') self.assertEqual(rendered, 'Andere: Es gibt 5 Kommentare')
# Using trimmed # Using trimmed
t = self.get_template( t = self.get_template(
'{% load i18n %}{% blocktrans trimmed %}\n\nThere\n\t are 5 ' '{% load i18n %}{% blocktranslate trimmed %}\n\nThere\n\t are 5 '
'\n\n comments\n{% endblocktrans %}' '\n\n comments\n{% endblocktranslate %}'
) )
rendered = t.render(Context()) rendered = t.render(Context())
self.assertEqual(rendered, 'There are 5 comments') self.assertEqual(rendered, 'There are 5 comments')
t = self.get_template( t = self.get_template(
'{% load i18n %}{% blocktrans with num_comments=5 context "comment count" trimmed %}\n\n' '{% load i18n %}{% blocktranslate with num_comments=5 context "comment count" trimmed %}\n\n'
'There are \t\n \t {{ num_comments }} comments\n\n{% endblocktrans %}' 'There are \t\n \t {{ num_comments }} comments\n\n{% endblocktranslate %}'
) )
rendered = t.render(Context()) rendered = t.render(Context())
self.assertEqual(rendered, 'Es gibt 5 Kommentare') self.assertEqual(rendered, 'Es gibt 5 Kommentare')
t = self.get_template( t = self.get_template(
'{% load i18n %}{% blocktrans context "other super search" count number=2 trimmed %}\n' '{% load i18n %}{% blocktranslate context "other super search" count number=2 trimmed %}\n'
'{{ number }} super \n result{% plural %}{{ number }} super results{% endblocktrans %}' '{{ number }} super \n result{% plural %}{{ number }} super results{% endblocktranslate %}'
) )
rendered = t.render(Context()) rendered = t.render(Context())
self.assertEqual(rendered, '2 andere Super-Ergebnisse') self.assertEqual(rendered, '2 andere Super-Ergebnisse')
# Misuses # Misuses
msg = "Unknown argument for 'blocktrans' tag: %r." msg = "Unknown argument for 'blocktranslate' tag: %r."
with self.assertRaisesMessage(TemplateSyntaxError, msg % 'month="May"'): with self.assertRaisesMessage(TemplateSyntaxError, msg % 'month="May"'):
self.get_template( self.get_template(
'{% load i18n %}{% blocktrans context with month="May" %}{{ month }}{% endblocktrans %}' '{% load i18n %}{% blocktranslate context with month="May" %}{{ month }}{% endblocktranslate %}'
) )
msg = '"context" in %r tag expected exactly one argument.' % 'blocktrans' msg = '"context" in %r tag expected exactly one argument.' % 'blocktranslate'
with self.assertRaisesMessage(TemplateSyntaxError, msg): with self.assertRaisesMessage(TemplateSyntaxError, msg):
self.get_template('{% load i18n %}{% blocktrans context %}{% endblocktrans %}') self.get_template('{% load i18n %}{% blocktranslate context %}{% endblocktranslate %}')
with self.assertRaisesMessage(TemplateSyntaxError, msg): with self.assertRaisesMessage(TemplateSyntaxError, msg):
self.get_template( self.get_template(
'{% load i18n %}{% blocktrans count number=2 context %}' '{% load i18n %}{% blocktranslate count number=2 context %}'
'{{ number }} super result{% plural %}{{ number }}' '{{ number }} super result{% plural %}{{ number }}'
' super results{% endblocktrans %}' ' super results{% endblocktranslate %}'
) )
@override_settings(LOCALE_PATHS=[os.path.join(here, 'other', 'locale')]) @override_settings(LOCALE_PATHS=[os.path.join(here, 'other', 'locale')])
@ -441,7 +454,7 @@ class TranslationBlockTransTagTests(SimpleTestCase):
(%(person)s is translated as %(personne)s in fr.po). (%(person)s is translated as %(personne)s in fr.po).
""" """
with translation.override('fr'): with translation.override('fr'):
t = Template('{% load i18n %}{% blocktrans %}My name is {{ person }}.{% endblocktrans %}') t = Template('{% load i18n %}{% blocktranslate %}My name is {{ person }}.{% endblocktranslate %}')
rendered = t.render(Context({'person': 'James'})) rendered = t.render(Context({'person': 'James'}))
self.assertEqual(rendered, 'My name is James.') self.assertEqual(rendered, 'My name is James.')
@ -453,25 +466,25 @@ class TranslationBlockTransTagTests(SimpleTestCase):
. .
""" """
with translation.override('fr'): with translation.override('fr'):
t = Template('{% load i18n %}{% blocktrans %}My other name is {{ person }}.{% endblocktrans %}') t = Template('{% load i18n %}{% blocktranslate %}My other name is {{ person }}.{% endblocktranslate %}')
rendered = t.render(Context({'person': 'James'})) rendered = t.render(Context({'person': 'James'}))
self.assertEqual(rendered, 'My other name is James.') self.assertEqual(rendered, 'My other name is James.')
class TranslationBlockTranslationTagTests(TranslationBlockTransTagTests): class TranslationBlockTransnTagTests(TranslationBlockTranslateTagTests):
tag_name = 'blocktranslation'
class MultipleLocaleActivationBlockTransTests(MultipleLocaleActivationTestCase):
tag_name = 'blocktrans' tag_name = 'blocktrans'
class MultipleLocaleActivationBlockTranslateTests(MultipleLocaleActivationTestCase):
tag_name = 'blocktranslate'
def get_template(self, template_string): def get_template(self, template_string):
return Template( return Template(
template_string.replace( template_string.replace(
'{{% blocktrans ', '{{% blocktranslate ',
'{{% {}'.format(self.tag_name) '{{% {}'.format(self.tag_name)
).replace( ).replace(
'{{% endblocktrans %}}', '{{% endblocktranslate %}}',
'{{% end{} %}}'.format(self.tag_name) '{{% end{} %}}'.format(self.tag_name)
) )
) )
@ -483,31 +496,31 @@ class MultipleLocaleActivationBlockTransTests(MultipleLocaleActivationTestCase):
""" """
with translation.override('fr'): with translation.override('fr'):
self.assertEqual( self.assertEqual(
self.get_template("{% load i18n %}{% blocktrans %}Yes{% endblocktrans %}").render(Context({})), self.get_template("{% load i18n %}{% blocktranslate %}Yes{% endblocktranslate %}").render(Context({})),
'Oui' 'Oui'
) )
def test_multiple_locale_btrans(self): def test_multiple_locale_btrans(self):
with translation.override('de'): with translation.override('de'):
t = self.get_template("{% load i18n %}{% blocktrans %}No{% endblocktrans %}") t = self.get_template("{% load i18n %}{% blocktranslate %}No{% endblocktranslate %}")
with translation.override(self._old_language), translation.override('nl'): with translation.override(self._old_language), translation.override('nl'):
self.assertEqual(t.render(Context({})), 'Nee') self.assertEqual(t.render(Context({})), 'Nee')
def test_multiple_locale_deactivate_btrans(self): def test_multiple_locale_deactivate_btrans(self):
with translation.override('de', deactivate=True): with translation.override('de', deactivate=True):
t = self.get_template("{% load i18n %}{% blocktrans %}No{% endblocktrans %}") t = self.get_template("{% load i18n %}{% blocktranslate %}No{% endblocktranslate %}")
with translation.override('nl'): with translation.override('nl'):
self.assertEqual(t.render(Context({})), 'Nee') self.assertEqual(t.render(Context({})), 'Nee')
def test_multiple_locale_direct_switch_btrans(self): def test_multiple_locale_direct_switch_btrans(self):
with translation.override('de'): with translation.override('de'):
t = self.get_template("{% load i18n %}{% blocktrans %}No{% endblocktrans %}") t = self.get_template("{% load i18n %}{% blocktranslate %}No{% endblocktranslate %}")
with translation.override('nl'): with translation.override('nl'):
self.assertEqual(t.render(Context({})), 'Nee') self.assertEqual(t.render(Context({})), 'Nee')
class MultipleLocaleActivationBlockTranslationTests(MultipleLocaleActivationBlockTransTests): class MultipleLocaleActivationBlockTransTests(MultipleLocaleActivationBlockTranslateTests):
tag_name = 'blocktranslation' tag_name = 'blocktrans'
class MiscTests(SimpleTestCase): class MiscTests(SimpleTestCase):
@ -516,21 +529,23 @@ class MiscTests(SimpleTestCase):
def get_template(self, template_string): def get_template(self, template_string):
return Template( return Template(
template_string.replace( template_string.replace(
'{{% blocktrans ', '{{% blocktranslate ',
'{{% {}'.format(self.tag_name) '{{% {}'.format(self.tag_name)
).replace( ).replace(
'{{% endblocktrans %}}', '{{% endblocktranslate %}}',
'{{% end{} %}}'.format(self.tag_name) '{{% end{} %}}'.format(self.tag_name)
) )
) )
@override_settings(LOCALE_PATHS=extended_locale_paths) @override_settings(LOCALE_PATHS=extended_locale_paths)
def test_percent_in_translatable_block(self): def test_percent_in_translatable_block(self):
t_sing = self.get_template("{% load i18n %}{% blocktrans %}The result was {{ percent }}%{% endblocktrans %}") t_sing = self.get_template(
"{% load i18n %}{% blocktranslate %}The result was {{ percent }}%{% endblocktranslate %}"
)
t_plur = self.get_template( t_plur = self.get_template(
"{% load i18n %}{% blocktrans count num as number %}" "{% load i18n %}{% blocktranslate count num as number %}"
"{{ percent }}% represents {{ num }} object{% plural %}" "{{ percent }}% represents {{ num }} object{% plural %}"
"{{ percent }}% represents {{ num }} objects{% endblocktrans %}" "{{ percent }}% represents {{ num }} objects{% endblocktranslate %}"
) )
with translation.override('de'): with translation.override('de'):
self.assertEqual(t_sing.render(Context({'percent': 42})), 'Das Ergebnis war 42%') self.assertEqual(t_sing.render(Context({'percent': 42})), 'Das Ergebnis war 42%')
@ -544,12 +559,12 @@ class MiscTests(SimpleTestCase):
or plural. or plural.
""" """
t_sing = self.get_template( t_sing = self.get_template(
"{% load i18n %}{% blocktrans %}There are %(num_comments)s comments{% endblocktrans %}" "{% load i18n %}{% blocktranslate %}There are %(num_comments)s comments{% endblocktranslate %}"
) )
t_plur = self.get_template( t_plur = self.get_template(
"{% load i18n %}{% blocktrans count num as number %}" "{% load i18n %}{% blocktranslate count num as number %}"
"%(percent)s% represents {{ num }} object{% plural %}" "%(percent)s% represents {{ num }} object{% plural %}"
"%(percent)s% represents {{ num }} objects{% endblocktrans %}" "%(percent)s% represents {{ num }} objects{% endblocktranslate %}"
) )
with translation.override('de'): with translation.override('de'):
# Strings won't get translated as they don't match after escaping % # Strings won't get translated as they don't match after escaping %

View File

@ -15,9 +15,9 @@ from .base import MultipleLocaleActivationTestCase, extended_locale_paths
def setup(templates, *args, **kwargs): def setup(templates, *args, **kwargs):
trans_setup = base_setup(templates, *args, **kwargs) translate_setup = base_setup(templates, *args, **kwargs)
translate_setup = base_setup({ trans_setup = base_setup({
name: template.replace('{% trans ', '{% translate ') name: template.replace('{% translate ', '{% trans ')
for name, template in templates.items() for name, template in templates.items()
}) })
@ -42,118 +42,118 @@ def setup(templates, *args, **kwargs):
class I18nTransTagTests(SimpleTestCase): class I18nTransTagTests(SimpleTestCase):
libraries = {'i18n': 'django.templatetags.i18n'} libraries = {'i18n': 'django.templatetags.i18n'}
@setup({'i18n01': '{% load i18n %}{% trans \'xxxyyyxxx\' %}'}) @setup({'i18n01': '{% load i18n %}{% translate \'xxxyyyxxx\' %}'})
def test_i18n01(self): def test_i18n01(self):
"""simple translation of a string delimited by '.""" """simple translation of a string delimited by '."""
output = self.engine.render_to_string('i18n01') output = self.engine.render_to_string('i18n01')
self.assertEqual(output, 'xxxyyyxxx') self.assertEqual(output, 'xxxyyyxxx')
@setup({'i18n02': '{% load i18n %}{% trans "xxxyyyxxx" %}'}) @setup({'i18n02': '{% load i18n %}{% translate "xxxyyyxxx" %}'})
def test_i18n02(self): def test_i18n02(self):
"""simple translation of a string delimited by ".""" """simple translation of a string delimited by "."""
output = self.engine.render_to_string('i18n02') output = self.engine.render_to_string('i18n02')
self.assertEqual(output, 'xxxyyyxxx') self.assertEqual(output, 'xxxyyyxxx')
@setup({'i18n06': '{% load i18n %}{% trans "Page not found" %}'}) @setup({'i18n06': '{% load i18n %}{% translate "Page not found" %}'})
def test_i18n06(self): def test_i18n06(self):
"""simple translation of a string to German""" """simple translation of a string to German"""
with translation.override('de'): with translation.override('de'):
output = self.engine.render_to_string('i18n06') output = self.engine.render_to_string('i18n06')
self.assertEqual(output, 'Seite nicht gefunden') self.assertEqual(output, 'Seite nicht gefunden')
@setup({'i18n09': '{% load i18n %}{% trans "Page not found" noop %}'}) @setup({'i18n09': '{% load i18n %}{% translate "Page not found" noop %}'})
def test_i18n09(self): def test_i18n09(self):
"""simple non-translation (only marking) of a string to German""" """simple non-translation (only marking) of a string to German"""
with translation.override('de'): with translation.override('de'):
output = self.engine.render_to_string('i18n09') output = self.engine.render_to_string('i18n09')
self.assertEqual(output, 'Page not found') self.assertEqual(output, 'Page not found')
@setup({'i18n20': '{% load i18n %}{% trans andrew %}'}) @setup({'i18n20': '{% load i18n %}{% translate andrew %}'})
def test_i18n20(self): def test_i18n20(self):
output = self.engine.render_to_string('i18n20', {'andrew': 'a & b'}) output = self.engine.render_to_string('i18n20', {'andrew': 'a & b'})
self.assertEqual(output, 'a &amp; b') self.assertEqual(output, 'a &amp; b')
@setup({'i18n22': '{% load i18n %}{% trans andrew %}'}) @setup({'i18n22': '{% load i18n %}{% translate andrew %}'})
def test_i18n22(self): def test_i18n22(self):
output = self.engine.render_to_string('i18n22', {'andrew': mark_safe('a & b')}) output = self.engine.render_to_string('i18n22', {'andrew': mark_safe('a & b')})
self.assertEqual(output, 'a & b') self.assertEqual(output, 'a & b')
@setup({'i18n23': '{% load i18n %}{% trans "Page not found"|capfirst|slice:"6:" %}'}) @setup({'i18n23': '{% load i18n %}{% translate "Page not found"|capfirst|slice:"6:" %}'})
def test_i18n23(self): def test_i18n23(self):
"""Using filters with the {% trans %} tag (#5972).""" """Using filters with the {% translate %} tag (#5972)."""
with translation.override('de'): with translation.override('de'):
output = self.engine.render_to_string('i18n23') output = self.engine.render_to_string('i18n23')
self.assertEqual(output, 'nicht gefunden') self.assertEqual(output, 'nicht gefunden')
@setup({'i18n24': '{% load i18n %}{% trans \'Page not found\'|upper %}'}) @setup({'i18n24': '{% load i18n %}{% translate \'Page not found\'|upper %}'})
def test_i18n24(self): def test_i18n24(self):
with translation.override('de'): with translation.override('de'):
output = self.engine.render_to_string('i18n24') output = self.engine.render_to_string('i18n24')
self.assertEqual(output, 'SEITE NICHT GEFUNDEN') self.assertEqual(output, 'SEITE NICHT GEFUNDEN')
@setup({'i18n25': '{% load i18n %}{% trans somevar|upper %}'}) @setup({'i18n25': '{% load i18n %}{% translate somevar|upper %}'})
def test_i18n25(self): def test_i18n25(self):
with translation.override('de'): with translation.override('de'):
output = self.engine.render_to_string('i18n25', {'somevar': 'Page not found'}) output = self.engine.render_to_string('i18n25', {'somevar': 'Page not found'})
self.assertEqual(output, 'SEITE NICHT GEFUNDEN') self.assertEqual(output, 'SEITE NICHT GEFUNDEN')
# trans tag with as var # trans tag with as var
@setup({'i18n35': '{% load i18n %}{% trans "Page not found" as page_not_found %}{{ page_not_found }}'}) @setup({'i18n35': '{% load i18n %}{% translate "Page not found" as page_not_found %}{{ page_not_found }}'})
def test_i18n35(self): def test_i18n35(self):
with translation.override('de'): with translation.override('de'):
output = self.engine.render_to_string('i18n35') output = self.engine.render_to_string('i18n35')
self.assertEqual(output, 'Seite nicht gefunden') self.assertEqual(output, 'Seite nicht gefunden')
@setup({'i18n36': '{% load i18n %}' @setup({'i18n36': '{% load i18n %}'
'{% trans "Page not found" noop as page_not_found %}{{ page_not_found }}'}) '{% translate "Page not found" noop as page_not_found %}{{ page_not_found }}'})
def test_i18n36(self): def test_i18n36(self):
with translation.override('de'): with translation.override('de'):
output = self.engine.render_to_string('i18n36') output = self.engine.render_to_string('i18n36')
self.assertEqual(output, 'Page not found') self.assertEqual(output, 'Page not found')
@setup({'template': '{% load i18n %}{% trans %}A}'}) @setup({'template': '{% load i18n %}{% translate %}A}'})
def test_syntax_error_no_arguments(self, tag_name): def test_syntax_error_no_arguments(self, tag_name):
msg = "'{}' takes at least one argument".format(tag_name) msg = "'{}' takes at least one argument".format(tag_name)
with self.assertRaisesMessage(TemplateSyntaxError, msg): with self.assertRaisesMessage(TemplateSyntaxError, msg):
self.engine.render_to_string('template') self.engine.render_to_string('template')
@setup({'template': '{% load i18n %}{% trans "Yes" badoption %}'}) @setup({'template': '{% load i18n %}{% translate "Yes" badoption %}'})
def test_syntax_error_bad_option(self, tag_name): def test_syntax_error_bad_option(self, tag_name):
msg = "Unknown argument for '{}' tag: 'badoption'".format(tag_name) msg = "Unknown argument for '{}' tag: 'badoption'".format(tag_name)
with self.assertRaisesMessage(TemplateSyntaxError, msg): with self.assertRaisesMessage(TemplateSyntaxError, msg):
self.engine.render_to_string('template') self.engine.render_to_string('template')
@setup({'template': '{% load i18n %}{% trans "Yes" as %}'}) @setup({'template': '{% load i18n %}{% translate "Yes" as %}'})
def test_syntax_error_missing_assignment(self, tag_name): def test_syntax_error_missing_assignment(self, tag_name):
msg = "No argument provided to the '{}' tag for the as option.".format(tag_name) msg = "No argument provided to the '{}' tag for the as option.".format(tag_name)
with self.assertRaisesMessage(TemplateSyntaxError, msg): with self.assertRaisesMessage(TemplateSyntaxError, msg):
self.engine.render_to_string('template') self.engine.render_to_string('template')
@setup({'template': '{% load i18n %}{% trans "Yes" as var context %}'}) @setup({'template': '{% load i18n %}{% translate "Yes" as var context %}'})
def test_syntax_error_missing_context(self, tag_name): def test_syntax_error_missing_context(self, tag_name):
msg = "No argument provided to the '{}' tag for the context option.".format(tag_name) msg = "No argument provided to the '{}' tag for the context option.".format(tag_name)
with self.assertRaisesMessage(TemplateSyntaxError, msg): with self.assertRaisesMessage(TemplateSyntaxError, msg):
self.engine.render_to_string('template') self.engine.render_to_string('template')
@setup({'template': '{% load i18n %}{% trans "Yes" context as var %}'}) @setup({'template': '{% load i18n %}{% translate "Yes" context as var %}'})
def test_syntax_error_context_as(self, tag_name): def test_syntax_error_context_as(self, tag_name):
msg = "Invalid argument 'as' provided to the '{}' tag for the context option".format(tag_name) msg = "Invalid argument 'as' provided to the '{}' tag for the context option".format(tag_name)
with self.assertRaisesMessage(TemplateSyntaxError, msg): with self.assertRaisesMessage(TemplateSyntaxError, msg):
self.engine.render_to_string('template') self.engine.render_to_string('template')
@setup({'template': '{% load i18n %}{% trans "Yes" context noop %}'}) @setup({'template': '{% load i18n %}{% translate "Yes" context noop %}'})
def test_syntax_error_context_noop(self, tag_name): def test_syntax_error_context_noop(self, tag_name):
msg = "Invalid argument 'noop' provided to the '{}' tag for the context option".format(tag_name) msg = "Invalid argument 'noop' provided to the '{}' tag for the context option".format(tag_name)
with self.assertRaisesMessage(TemplateSyntaxError, msg): with self.assertRaisesMessage(TemplateSyntaxError, msg):
self.engine.render_to_string('template') self.engine.render_to_string('template')
@setup({'template': '{% load i18n %}{% trans "Yes" noop noop %}'}) @setup({'template': '{% load i18n %}{% translate "Yes" noop noop %}'})
def test_syntax_error_duplicate_option(self): def test_syntax_error_duplicate_option(self):
msg = "The 'noop' option was specified more than once." msg = "The 'noop' option was specified more than once."
with self.assertRaisesMessage(TemplateSyntaxError, msg): with self.assertRaisesMessage(TemplateSyntaxError, msg):
self.engine.render_to_string('template') self.engine.render_to_string('template')
@setup({'template': '{% load i18n %}{% trans "%s" %}'}) @setup({'template': '{% load i18n %}{% translate "%s" %}'})
def test_trans_tag_using_a_string_that_looks_like_str_fmt(self): def test_trans_tag_using_a_string_that_looks_like_str_fmt(self):
output = self.engine.render_to_string('template') output = self.engine.render_to_string('template')
self.assertEqual(output, '%s') self.assertEqual(output, '%s')
@ -165,51 +165,51 @@ class TranslationTransTagTests(SimpleTestCase):
def get_template(self, template_string): def get_template(self, template_string):
return Template( return Template(
template_string.replace( template_string.replace(
'{{% trans ', '{{% translate ',
'{{% {}'.format(self.tag_name) '{{% {}'.format(self.tag_name)
) )
) )
@override_settings(LOCALE_PATHS=extended_locale_paths) @override_settings(LOCALE_PATHS=extended_locale_paths)
def test_template_tags_pgettext(self): def test_template_tags_pgettext(self):
"""{% trans %} takes message contexts into account (#14806).""" """{% translate %} takes message contexts into account (#14806)."""
trans_real._active = Local() trans_real._active = Local()
trans_real._translations = {} trans_real._translations = {}
with translation.override('de'): with translation.override('de'):
# Nonexistent context... # Nonexistent context...
t = self.get_template('{% load i18n %}{% trans "May" context "nonexistent" %}') t = self.get_template('{% load i18n %}{% translate "May" context "nonexistent" %}')
rendered = t.render(Context()) rendered = t.render(Context())
self.assertEqual(rendered, 'May') self.assertEqual(rendered, 'May')
# Existing context... using a literal # Existing context... using a literal
t = self.get_template('{% load i18n %}{% trans "May" context "month name" %}') t = self.get_template('{% load i18n %}{% translate "May" context "month name" %}')
rendered = t.render(Context()) rendered = t.render(Context())
self.assertEqual(rendered, 'Mai') self.assertEqual(rendered, 'Mai')
t = self.get_template('{% load i18n %}{% trans "May" context "verb" %}') t = self.get_template('{% load i18n %}{% translate "May" context "verb" %}')
rendered = t.render(Context()) rendered = t.render(Context())
self.assertEqual(rendered, 'Kann') self.assertEqual(rendered, 'Kann')
# Using a variable # Using a variable
t = self.get_template('{% load i18n %}{% trans "May" context message_context %}') t = self.get_template('{% load i18n %}{% translate "May" context message_context %}')
rendered = t.render(Context({'message_context': 'month name'})) rendered = t.render(Context({'message_context': 'month name'}))
self.assertEqual(rendered, 'Mai') self.assertEqual(rendered, 'Mai')
t = self.get_template('{% load i18n %}{% trans "May" context message_context %}') t = self.get_template('{% load i18n %}{% translate "May" context message_context %}')
rendered = t.render(Context({'message_context': 'verb'})) rendered = t.render(Context({'message_context': 'verb'}))
self.assertEqual(rendered, 'Kann') self.assertEqual(rendered, 'Kann')
# Using a filter # Using a filter
t = self.get_template('{% load i18n %}{% trans "May" context message_context|lower %}') t = self.get_template('{% load i18n %}{% translate "May" context message_context|lower %}')
rendered = t.render(Context({'message_context': 'MONTH NAME'})) rendered = t.render(Context({'message_context': 'MONTH NAME'}))
self.assertEqual(rendered, 'Mai') self.assertEqual(rendered, 'Mai')
t = self.get_template('{% load i18n %}{% trans "May" context message_context|lower %}') t = self.get_template('{% load i18n %}{% translate "May" context message_context|lower %}')
rendered = t.render(Context({'message_context': 'VERB'})) rendered = t.render(Context({'message_context': 'VERB'}))
self.assertEqual(rendered, 'Kann') self.assertEqual(rendered, 'Kann')
# Using 'as' # Using 'as'
t = self.get_template('{% load i18n %}{% trans "May" context "month name" as var %}Value: {{ var }}') t = self.get_template('{% load i18n %}{% translate "May" context "month name" as var %}Value: {{ var }}')
rendered = t.render(Context()) rendered = t.render(Context())
self.assertEqual(rendered, 'Value: Mai') self.assertEqual(rendered, 'Value: Mai')
t = self.get_template('{% load i18n %}{% trans "May" as var context "verb" %}Value: {{ var }}') t = self.get_template('{% load i18n %}{% translate "May" as var context "verb" %}Value: {{ var }}')
rendered = t.render(Context()) rendered = t.render(Context())
self.assertEqual(rendered, 'Value: Kann') self.assertEqual(rendered, 'Value: Kann')
@ -224,7 +224,7 @@ class MultipleLocaleActivationTransTagTests(MultipleLocaleActivationTestCase):
def get_template(self, template_string): def get_template(self, template_string):
return Template( return Template(
template_string.replace( template_string.replace(
'{{% trans ', '{{% translate ',
'{{% {}'.format(self.tag_name) '{{% {}'.format(self.tag_name)
) )
) )
@ -236,25 +236,25 @@ class MultipleLocaleActivationTransTagTests(MultipleLocaleActivationTestCase):
""" """
with translation.override('fr'): with translation.override('fr'):
self.assertEqual( self.assertEqual(
self.get_template("{% load i18n %}{% trans 'Yes' %}").render(Context({})), self.get_template("{% load i18n %}{% translate 'Yes' %}").render(Context({})),
'Oui' 'Oui'
) )
def test_multiple_locale_trans(self): def test_multiple_locale_trans(self):
with translation.override('de'): with translation.override('de'):
t = self.get_template("{% load i18n %}{% trans 'No' %}") t = self.get_template("{% load i18n %}{% translate 'No' %}")
with translation.override(self._old_language), translation.override('nl'): with translation.override(self._old_language), translation.override('nl'):
self.assertEqual(t.render(Context({})), 'Nee') self.assertEqual(t.render(Context({})), 'Nee')
def test_multiple_locale_deactivate_trans(self): def test_multiple_locale_deactivate_trans(self):
with translation.override('de', deactivate=True): with translation.override('de', deactivate=True):
t = self.get_template("{% load i18n %}{% trans 'No' %}") t = self.get_template("{% load i18n %}{% translate 'No' %}")
with translation.override('nl'): with translation.override('nl'):
self.assertEqual(t.render(Context({})), 'Nee') self.assertEqual(t.render(Context({})), 'Nee')
def test_multiple_locale_direct_switch_trans(self): def test_multiple_locale_direct_switch_trans(self):
with translation.override('de'): with translation.override('de'):
t = self.get_template("{% load i18n %}{% trans 'No' %}") t = self.get_template("{% load i18n %}{% translate 'No' %}")
with translation.override('nl'): with translation.override('nl'):
self.assertEqual(t.render(Context({})), 'Nee') self.assertEqual(t.render(Context({})), 'Nee')

View File

@ -53,7 +53,7 @@ class InvalidStringTests(SimpleTestCase):
else: else:
self.assertEqual(output, '') self.assertEqual(output, '')
@setup({'invalidstr07': '{% load i18n %}{% blocktrans %}{{ var }}{% endblocktrans %}'}) @setup({'invalidstr07': '{% load i18n %}{% blocktranslate %}{{ var }}{% endblocktranslate %}'})
def test_invalidstr07(self): def test_invalidstr07(self):
output = self.engine.render_to_string('invalidstr07') output = self.engine.render_to_string('invalidstr07')
if self.engine.string_if_invalid: if self.engine.string_if_invalid: