Перевод собственного кода
Отредактируйте файл settings.py проекта myshop, импортируйте функцию gettext_lazy() и измените параметры LANGUAGES следующим образом для преобразования имен языков:
from django.utils.translation import gettext_lazy as _
LANGUAGES = (
('en', _('English')),
('es', _('Spanish')),
)
Здесь мы используем функцию gettext_lazy() вместо gettext(), чтобы избежать циклического импорта, тем самым изменяя имена языков при доступе к ним.
Откройте терминал и выполните следующую команду из каталога проекта:
django-admin makemessages --all
Вы должны увидеть следующий вывод:
processing locale es
processing locale en
Взгляните на каталог locale/. Вы увидите следующую структуру файлов:
en/
LC_MESSAGES/
django.po
es/
LC_MESSAGES/
django.po
Для каждого языка создан файл сообщений. Откройте es/LC_MESSAGES/django.po. В конце файла вы увидите следующее:
#: settings.py:104
msgid "English"
msgstr ""
#: settings.py:105
msgid "Spanish"
msgstr ""
Каждой строке трансляции предшествует комментарий, отображающий подробные сведения о файле и строке, где он был найден. Каждый перевод включает две строки:
- msgid : Строка перевода, как она отображается в исходном коде.
- msgstr : Перевод языка, который по умолчанию пуст. Здесь необходимо ввести фактический перевод для данной строки.
Заполните msgstr переводы для данной строки msgid следующим образом:
#: settings.py:104
msgid "English"
msgstr "Inglés"
#: settings.py:105
msgid "Spanish"
msgstr "Español"
Сохраните измененный файл сообщения, откройте терминал и выполните следующую команду:
django-admin compilemessages
Если все пройдет хорошо, вы увидите следующий результат:
processing file django.po in myshop/locale/en/LC_MESSAGES
processing file django.po in myshop/locale/es/LC_MESSAGES
Выходные данные предоставляют сведения о компилируемых файлах сообщений. Снова взгляните на каталог locale/ проекта myshop. Вы найдете в нем следующие файлы:
en/
LC_MESSAGES/
django.mo
django.po
es/
LC_MESSAGES/
django.mo
django.po
Можно увидеть, что для каждого языка был создан скомпилированный файл сообщений .mo.
Мы перевели имена самих языков. Теперь давайте преобразуем имена полей модели, отображаемые на сайте. Измените файл models.py приложения orders и добавьте имена, помеченные для перевода для полей модели Order, как показано ниже:
from django.utils.translation import gettext_lazy as _
class Order(models.Model):
first_name = models.CharField(_('first name'), max_length=50)
last_name = models.CharField(_('last name'), max_length=50)
email = models.EmailField(_('e-mail'),)
address = models.CharField(_('address'), max_length=250)
postal_code = models.CharField(_('postal code'), max_length=20)
city = models.CharField(_('city'), max_length=100)
#...
Добавлены имена полей, отображаемых при размещении пользователем нового заказа. Это first_name, last_name, email, address, postal_code, и city. Помните, что для присвоения имен полям можно также использовать атрибут verbose_name.
Создайте следующую структуру в каталоге приложения orders:
locale/
en/
es/
При создании каталога locale/ строки перевода этого приложения будут храниться в файле сообщений в этом каталоге вместо основного файла сообщений. Таким образом можно создать отдельное файлы трансляции для каждого приложения.
Откройте терминал из каталога проекта и выполните следующую команду:
django-admin makemessages --all
Вы должны увидеть следующий вывод:
processing locale es
processing locale en
Откройте файл es/LC_MESSAGES/django.po. Строки перевода для модели заказа будут просматриваться. Заполните следующие msgstr переводы для заданной msgid строки:
#: orders/models.py:10
msgid "first name"
msgstr "nombre"
#: orders/models.py:12
msgid "last name"
msgstr "apellidos"
#: orders/models.py:14
msgid "e-mail"
msgstr "e-mail"
#: orders/models.py:15
msgid "address"
msgstr "dirección"
#: orders/models.py:17
msgid "postal code"
msgstr "código postal"
#: orders/models.py:19
msgid "city"
msgstr "ciudad"
После завершения добавления переводов сохраните файл.
Кроме текстового редактора, можно использовать Poedit для редактирования переводов. Poedit — это программное обеспечение для редактирования переводов, и gettext использует его. Он доступен для Linux, Windows и Mac OS x. Вы можете загрузить Poedit здесь http://poedit.net/ .
Давайте также переведем формы нашего проекта. OrderCreateForm приложения orders не требуется переводить, поскольку он является ModelForm и использует атрибут verbose_name полей модели Order для описания полей формы. Мы собираемся перевести формы cart и coupons на заявки.
Отредактируйте файл forms.py в каталоге приложения cart и добавьте атрибут label в поле quantity у CartAddProductForm, а затем пометьте это поле для перевода следующим образом:
from django import forms
from django.utils.translation import gettext_lazy as _
PRODUCT_QUANTITY_CHOICES = [(i, str(i)) for i in range(1, 21)]
class CartAddProductForm(forms.Form):
quantity = forms.TypedChoiceField(choices=PRODUCT_QUANTITY_CHOICES, coerce=int, label=_('Quantity'))
update = forms.BooleanField(required=False, initial=False, widget=forms.HiddenInput)
Измените файл forms.py приложения coupons и переведите форму CouponApplyForm следующим образом:
from django import forms
from django.utils.translation import gettext_lazy as _
class CouponApplyForm(forms.Form):
code = forms.CharField(label=_('Coupon'))
Мы добавили label в поле code и пометили его для перевода.