Перевод шаблонов магазина
Отредактируйте шаблон shop/base.html приложения shop. Убедитесь, что в верхней части шаблона загружен тег i18n и пометьте строки для перевода следующим образом:
{% load i18n %}
{% load static %}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>
{% block title %}{% trans "My shop" %}{% endblock %}
</title>
<link href="{% static "css/base.css" %}" rel="stylesheet">
</head>
<body>
<div id="header">
<a href="/" class="logo">{% trans "My shop" %}</a>
</div>
<div id="subheader">
<div class="cart">
{% with total_items=cart|length %}
{% if cart|length > 0 %}
{% trans "Your cart" %}:
<a href="{% url "cart:cart_detail" %}">
{% blocktrans with total_items_plural=total_items|pluralize total_price=cart.get_total_price %}
{{ total_items }} item{{ total_items_plural }},
${{ total_price }}
{% endblocktrans %}
</a>
{% else %}
{% trans "Your cart is empty." %}
{% endif %}
{% endwith %}
</div>
</div>
<div id="content">
{% block content %}
{% endblock %}
</div>
</body>
</html>
Обратите внимание на тег {% blocktrans %}
для отображения общей суммы корзины. Ранее он отображалась следующим образом:
{{ total_items }} item{{ total_items|pluralize }},
${{ cart.get_total_price }}
Мы использовали {% blocktrans with ... %}
чтобы использовать placeholders для total_items|pluralize (тег шаблона, примененный здесь) и cart.get_total_price (метод объекта, доступ к которому был получен), в результате чего:
{% blocktrans with total_items_plural=total_items|pluralize
total_price=cart.get_total_price %}
{{ total_items }} item{{ total_items_plural }},
${{ total_price }}
{% endblocktrans %}
Теперь отредактируйте шаблон shop/product/detail.html приложения shop и загрузите теги i18n, но после тега {% extends %}
, который всегда должен быть первым тегом в шаблоне:
{% load i18n %}
Затем найдите следующую строку:
<input type="submit" value="Add to cart">
И замените ее на следующий код:
<input type="submit" value="{% trans "Add to cart" %}">
Теперь давайте переведем шаблоны приложения orders. Измените шаблон orders/order/create.html приложения orders:
{% extends "shop/base.html" %}
{% load i18n %}
{% block title %}
{% trans "Checkout" %}
{% endblock %}
{% block content %}
<h1>{% trans "Checkout" %}</h1>
<div class="order-info">
<h3>{% trans "Your order" %}</h3>
<ul>
{% for item in cart %}
<li>{{ item.quantity }}x {{ item.product.name }} <span>${{ item.total_price }}</span></li>
{% endfor %}
{% if cart.coupon %}
<li>
{% blocktrans with code=cart.coupon.code discount=cart.coupon.discount %}
"{{ code }}" ({{ discount }}% off)
{% endblocktrans %}
<span>- ${{ cart.get_discount|floatformat:"2" }}</span>
</li>
{% endif %}
</ul>
<p>{% trans "Total" %}: ${{ cart.get_total_price_after_discount|floatformat:"2" }}</p>
</div>
<form action="." method="post" class="order-form">
{{ form.as_p }}
<p><input type="submit" value="{% trans "Place order" %}"></p>
{% csrf_token %}
</form>
{% endblock %}
Посмотрите на следующие файлы, которые предоставляются вместе с этой главой, чтобы увидеть, как строки помечаются для перевода:
- Приложение shop, шаблон shop/product/list.html
- Приложение orders, шаблон orders/order/created.html
- Приложение cart, шаблон cart/detail.html
Давайте обновим файлы сообщений, чтобы включить новые строки перевода. Откройте терминал и выполните следующую команду:
django-admin makemessages --all
Загляните в файлы .po в каталоге locale проекта myshop, и вы увидите, что приложение orders теперь содержит все строки, которые были помечены для перевода.
Отредактируйте файлы перевода .po проекта и приложения orders и включите перевод на Испанский язык. В исходном коде, поставляемом вместе с данной главой, можно ссылаться на переведенные файлы .po.
Откройте терминал из каталога проекта и выполните следующие команды:
cd orders/
django-admin compilemessages
cd ../
Мы скомпилировали файлы перевода для приложения order.
Выполните следующую команду, чтобы переводы для приложений, не содержащих каталога locale, включились в файл сообщений проекта:
django-admin compilemessages