В этом разделе объясняется, как предоставить возможности для перевода вашему модулю.
Примечание
Если вы хотите внести свой вклад в перевод самой платформы Odoo, обратитесь к странице Odoo Wiki page.
Экспорт переводимых терминов
Ряд терминов в ваших модулях «переводится неявно», даже если вы не выполнили какую-либо конкретную работу по переводу, то после экспорта терминов вашего модуля вы, скорее всего, найдете контент над которым надо еще поработать.
Экспорт переводов осуществляется через интерфейс администратора(нужно войти в режим отладки) и открытия
- Оставьте язык по умолчанию (новый язык/пустой шаблон)
- Выберите формат PO File
- выберите свой модуль
- нажмите Export и загрузите файл
This gives you a file called yourmodule.pot
which should be moved to
the yourmodule/i18n/
directory. The file is a PO Template which
simply lists translatable strings and from which actual translations (PO files)
can be created. PO files can be created using msginit, with a dedicated
translation tool like POEdit or by simply copying the template to a new file
called language.po
. Translation files should be put in
yourmodule/i18n/
, next to yourmodule.pot
, and will be
automatically loaded by Odoo when the corresponding language is installed (via
)
Примечание
переводы для всех загруженных языков также устанавливаются или обновляются при установке или обновлении модуля
Экспорт неявных терминов
Odoo автоматически экспортирует переводимые строки из содержимого типа «data»:
- В представлениях, отличных от QWeb, экспортируются все текстовые узлы, а также атрибуты
string
,help
,sum
,confirm
иplaceholder
- Шаблоны QWeb (как на стороне сервера, так и на стороне клиента), все текстовые узлы экспортируются, кроме блоков
t-translation = "off"
, также экспортируются содержимое атрибутовtitle
,alt
,label
иplaceholder
для
Field
, если их модель не отмечена_translate = False
:- экспортируются атрибуты
string
иhelp
- если
selection
присутствует и его список (или кортеж) экспортируется - если их атрибут
translate
установлен вTrue
, все их существующие значения (во всех записях) экспортируются
- экспортируются атрибуты
- сообщения о помощи и об ошибках
_constraints
и_sql_constraints
экспортируются
Экспорт очевидных терминов
Когда дело доходит до более «императивных» ситуаций в коде Python или коде Javascript, Odoo не может автоматически экспортировать термины для перевода, поэтому для экспорта они должны быть отмечены явно. Это делается путем обертки литеральной строки в вызов функции.
В Python функция враппер - odoo._()
:
title = _("Bank Accounts")
В JavaScript функция враппер обычно odoo.web._t()
:
title = _t("Bank Accounts");
Предупреждение
Для экспорта могут быть отмечены только строки, а не выражения или переменные. В ситуациях, когда строки форматируются, это означает, что помечать необходимо только строку, которую форматируете, а не результат форматирования
Переменные
Неправильно* извлечение переменно может работать, а вот корректность перевода не гарантируется:
_("Scheduled meeting with %s" % invitee.name)
Правильно установить переменную за областью видимости функции перевода:
_("Scheduled meeting with %s") % invitee.name
Блоки
Неправильно разделять ваш перевод на несколько блоков или несколько строк:
# bad, trailing spaces, blocks out of context
_("You have ") + len(invoices) + _(" invoices waiting")
_t("You have ") + invoices.length + _t(" invoices waiting");
# bad, multiple small translations
_("Reference of the document that generated ") + \
_("this sales order request.")
Правильно держать в одном блоке, предоставляя полный контекст для переводчиков:
# good, allow to change position of the number in the translation
_("You have %s invoices wainting") % len(invoices)
_.str.sprintf(_t("You have %s invoices wainting"), invoices.length);
# good, full sentence is understandable
_("Reference of the document that generated " + \
"this sales order request.")
Множественное число
Нправильно использовать множественное число по-английски:
msg = _("You have %s invoice") % invoice_count
if invoice_count > 1:
msg += _("s")
Правильно держать в голове, что каждый язык имеет различные формы множественного числа:
if invoice_count > 1:
msg = _("You have %s invoices") % invoice_count
else:
msg = _("You have %s invoice") % invoice_count
Read vs Run Time
Неправильно вызвать поиск перевода при запуске сервера:
ERROR_MESSAGE = {
# bad, evaluated at server launch with no user language
access_error: _('Access Error'),
missing_error: _('Missing Record'),
}
class Record(models.Model):
def _raise_error(self, code):
raise UserError(ERROR_MESSAGE[code])
Неправильно вызывать поиск перевода при чтении файла JavaScript:
# bad, js _t is evaluated too early
var core = require('web.core');
var _t = core._t;
var map_title = {
access_error: _t('Access Error'),
missing_error: _t('Missing Record'),
};
Do evaluate dynamically the translatable content:
# good, evaluated at run time
def _get_error_message():
return {
access_error: _('Access Error'),
missing_error: _('Missing Record'),
}
Правильно когда поиск перевода выполняется, в момент чтения файл JS , используйте _lt
вместо ``_t``чтобы перевести термин в момент использования:
# good, js _lt is evaluated lazily
var core = require('web.core');
var _lt = core._lt;
var map_title = {
access_error: _lt('Access Error'),
missing_error: _lt('Missing Record'),
};