Перевод Модулей - Odoo 11.0

Экспорт переводимых терминов

Ряд терминов в ваших модулях «переводится неявно», даже если вы не выполнили какую-либо конкретную работу по переводу, то после экспорта терминов вашего модуля вы, скорее всего, найдете контент над которым надо еще поработать.

Экспорт переводов осуществляется через интерфейс администратора(нужно войти в режим отладки) и открытия Settings ‣ Translations ‣ Import / Export ‣ Export Translations

  • Оставьте язык по умолчанию (новый язык/пустой шаблон)
  • Выберите формат 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 Settings ‣ Translations ‣ Load a Translation)

Экспорт неявных терминов

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 вместо [UNKNOWN NODE problematic]_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'),
};