Во многих проектах Odoo одна компания обслуживает пользователей и клиентов на нескольких языках: отдел продаж во Франции, склад в Германии, портал для Испании. Чтобы все работало без лишних дублей данных, системе нужно хранить одно и то же текстовое значение в нескольких языковых вариантах — для этого и служат переводимые поля.
Переводимое поле хранит отдельное текстовое значение для каждого активного языка. Французский пользователь увидит название товара по‑французски, немецкий — по‑немецки. Фактически у вас одна запись в базе, но разные представления текста в зависимости от языка пользователя.
В этой статье разобрано, как переводимые поля реализованы в ORM Odoo, как их включать и поддерживать, и в каких ситуациях это экономит время и избавляет от ошибок в мультилингвальных установках.
Что такое переводимое поле в Odoo
Переводимое поле — это текстовое поле модели Odoo, которое может содержать «отдельное значение для каждого активного языка» в системе. Для пользователя процесс прозрачный: он всегда видит текст на своём языке, ничего дополнительно делать не нужно.
Какие типы полей поддерживают перевод
- Char: короткие однострочные значения — названия товаров, метки категорий, должности.
- Text: более длинные многострочные описания, служебные заметки.
- Html: форматированный текст с HTML — контент сайта, тело шаблонов писем.
Числовые поля, даты, Many2one и булевы поля не переводятся — перевод применим только к полям с читаемым человеком текстом.
Внешний вид в интерфейсе
В режиме редактирования рядом с переводимым полем появляется маленький значок с флажком языка. По клику открывается окно, где можно увидеть и отредактировать значения для всех установленных языков в одном месте.
В режиме чтения пользователь просто видит значение на своём языке. Если перевода для этого языка нет, Odoo подставит значение базового языка (обычно английский), а не пустое поле.
Принцип работы переводимых полей
Понимание внутренней логики помогает принять правильное решение — включать ли перевод для конкретного поля и как масштабно им управлять.
Параметр translate=True
В ORM Odoo перевод включается через параметр translate=True в описании поля. Это самый простой и рекомендуемый способ пометить поле как переводимое.
Пример на кастомном Char‑поле:
Добавление только этого параметра сообщает Odoo, что значение поля должно храниться и извлекаться с учётом языкового контекста — удобная и элегантная особенность фреймворка.
Где хранятся переводы
Механизм хранения менялся по версиям Odoo.
- Odoo 15 и ранее: переводы лежали отдельно в таблице ir.translation — каждая строка соответствовала переводу конкретного поля записи и языка.
- Odoo 16 и новее: переводы хранятся прямо в таблице модели в виде JSONB‑колонки. Например, поле name с translate=True представляется как JSON {"en_US":"Laptop Stand","fr_FR":"Support pour ordinateur portable","de_DE":"Laptopständer"}.
Переход на JSONB заметно ускорил операции: исчезли дорогие JOIN‑ы с таблицей переводов, и чтение/поиск по моделям с большим числом записей стало быстрее.
Как работает языковой контекст
При чтении перевода Odoo ориентируется на «активный язык в контексте». Если вы зашли под французским пользователем, ORM отдаст французский текст. При вызовах через API язык можно задать в контексте.
Пример передачи языка при вызове API:
Это важно для интеграций и экспортов: всегда указывайте нужный язык в контексте, чтобы получить требуемую локализованную строку.
translate как callable
Параметр translate может принимать callable — часто встречается translate=_ для пометки статических строк (меток, опций селектов) к экспорту перевода модулей. Это отличается от переводов на уровне записей и используется в разработке модулей.
Поведение при отсутствии перевода
Если для активного языка перевод не задан, Odoo возвращает значение базового языка. Такой плавный фоллбек гарантирует, что пользователи всегда увидят осмысленный текст даже при частичной локализации.
Практические сценарии для бизнеса
Переводимые поля полезны не только в техническом смысле — они решают конкретные бизнес‑задачи в международных компаниях. Ниже — типичные сценарии применения.
1) Интернет‑торговля: мультиязычные названия и описания товаров
Для интернет‑магазина важно, чтобы покупатели видели каталог на своём языке. Поля name и description в product.template обычно переводимы по умолчанию, что позволяет вести единый каталог и показывать локализованные названия, маркетинговые тексты и технические характеристики без дублирования записей.
При заходе на сайт на французском посетитель увидит французские названия и описания, при этом остатки на складе, цены и правила продаж останутся общими — меняется только отображаемый текст.
2) Шаблоны писем в мультиязычной компании
Тела шаблонов писем в Odoo обычно хранятся в Html‑полях с translate=True. При отправке подтверждения заказа немецкому клиенту система автоматически подставит немецкую версию шаблона, если она задана.
Это позволяет использовать один шаблон на все рынки без условных конструкций или множества языковых копий шаблонов.
3) Страницы сайта и блог‑публикации
Контент страниц сайта в Odoo тоже хранится в переводимых Html‑полях. При включённых нескольких языках редакторы поддерживают отдельные тексты для каждой версии страницы — это стандартный подход без сторонних плагинов.
С точки зрения SEO у каждой языковой версии может быть свой meta‑title и meta‑description, что помогает ранжироваться локально на разных рынках.
4) Метки в Selection‑полях для международных команд
Опции в Selection можно пометить для перевода через функцию _. Тогда выпадающий список, который англоговорящему покажет «In Progress», «On Hold», «Completed», будет отображать эквиваленты на языке пользователя.
Это важно для HR, управления проектами и любых процессов, где международные команды работают с одними и теми же записями на разных языках.
5) Кастомные поля в мультиъязычных отчётах
Если вы добавили пользовательские поля для внутренней категоризации и сделали их переводимыми, отчёты и дашборды будут корректно показывать метки на языке каждого пользователя.
Иначе французский пользователь может увидеть английские метки в отчёте, что вводит в заблуждение и снижает принятие системы командой.
Создание и настройка переводимых полей
Как создать или включить перевод для поля — несколько вариантов, в зависимости от того, работаете ли вы с кодом или без него.
Через Python (рекомендуется для разработчиков)
Самый корректный способ — объявить поле в Python‑модели с translate=True. Это стандарт в руководствах и технических примерах Odoo.
Пример добавления полей в модель:
Одного translate=True достаточно: дальше Odoo берет на себя отображение флажка в UI, хранение переводов и логику фоллбека.
Через Odoo Studio
В Odoo Studio опция translate по умолчанию не видна в панели настройки поля. Поля, созданные в Studio, изначально не переводимы.
Тем не менее, после создания поля перевод можно включить через XML‑RPC: найти запись в ir.model.fields и обновить её свойство translate.
Пример скрипта через XML‑RPC для включения перевода в Studio‑поле:
Этот способ удобен для команд, которые делают кастомизации через скрипты или notebook и не имеют доступа к исходникам модулей.
Управление переводами: экспорт и импорт
После включения переводимых полей общий рабочий процесс перевода в Odoo довольно простой.
- Через Settings → Translations → Export Translation можно скачать .po или .csv с незаполненными строками для выбранного языка.
- Заполните переводы в файле (или передайте переводчику).
- Через Settings → Translations → Import Translation загрузите готовый файл обратно в систему.
Для локальных правок (например, пар десятков названий) удобнее править прямо в UI через флажок языка у поля.
Переводы через API
При записи переводимого поля через XML‑RPC обязательно указывайте язык в контексте.
Пример записи французского перевода имени продукта:
Запись с указанием языка обновит только тот языковой вариант, остальные останутся неизменными — это корректный способ заливать переводы из внешних систем.
Рекомендации по применению
Ниже приведены практические правила, соблюдение которых сэкономит вам время и нервы.
Всегда сначала заполните значение базового языка
Перед добавлением переводов на другие языки убедитесь, что базовое значение корректно. Остальные переводы зависят от него: при изменении источника локали они не обновляются автоматически и могут выйти из синхронизации.
Переводите только то, что действительно нужно
Не все текстовые поля следует делать переводимыми. Внутренние коды, технические идентификаторы или поля, используемые лишь бэк‑офисом на одном языке, не требуют translate=True. Излишняя маркировка создаёт лишнюю работу по поддержке переводов.
Для больших объёмов используйте экспорт/импорт
При больших каталогах (сотни, тысячи товаров) редактировать переводы вручную в интерфейсе неудобно. Экспорт в файл, пакетный перевод и импорт обратно — быстрее и надёжнее.
Передавайте язык в контексте при всех вызовах API
При чтении/записи через API всегда включайте 'lang': 'xx_XX' в контексте. Без этого Odoo использует язык пользователя по умолчанию, что часто вызывает ошибки и сохранение данных под неверной локалью.
Следите за переводами при изменении источника
Если вы обновили базовый текст, другие языки не обновятся автоматически. Нужен процесс оповещения переводчиков и регулярный пересмотр переводов при изменении исходного контента.
Типичные ошибки и ловушки
Даже опытные консультанты Odoo иногда наступают на те же грабли. Знание распространённых ошибок избавит от долгого поиска причин.
Забыть передать языковой контекст при записи через API
Частая ошибка при интеграциях: запись названия через API без context['lang'] приводит к тому, что Odoo перезапишет значение в языке пользователя по умолчанию. Если пользователь настроен на английский, а вы хотели записать французский вариант — вы перезаписали английский. Всегда явно указывайте язык.
Ожидать переводы в результатах поиска без наличия перевода
Поиск по переводимым полям выполняется в активном языке. Товар с именем «Laptop Stand» в английском не появится в результатах у французского пользователя, если французский перевод не указан. Проверьте наличие переводов, если рассчитываете на поиск по разным языкам.
Смешивание переводимых и не переводимых полей в отчётах
Если в отчёте объединены поля с переводами и без, итог будет непоследовательным: часть меток на языке пользователя, часть — на базовом. Проверьте заранее, какие поля должны быть переводимыми, и приведите отчёты к единому стандарту.
Не учитывать накладные расходы переводов в вычисляемых полях
Если вычисляемое поле собирает строку из нескольких переводимых полей, алгоритм выполняется в текущем языке и результат обычно не сохраняется отдельно на каждый язык. Для многоязычной конкатенации нужно реализовать логику вычисления по‑язычно.
Удаление языка без очистки переводов
При отключении языка переводы для него могут остаться в базе в зависимости от версии Odoo. Это не всегда критично, но создаёт мусор. После удаления языка проверьте данные переводов в продакшене.
Итоги
Переводимые поля — одно из самых практичных средств в Odoo для межъязычных компаний. Один параметр translate=True открывает возможность вести локализованный контент для каталога, шаблонов писем, страниц сайта и пользовательских полей без дублей записей и отдельных систем.
Главное — осознанно подходить к выбору полей для перевода. Включайте перевод там, где он действительно нужен пользователям; для больших объёмов пользуйтесь экспортом/импортом; и всегда явно задавайте языковой контекст при работе через API.
При настройке мультиязычного магазина, внедрении Odoo для международной команды или разработке модуля — понимание переводимых полей помогает создавать более понятные и дружелюбные решения.
Работаете над мультилингвальным проектом Odoo и нужно сопровождение по конфигурации полей или процессу перевода? Свяжитесь с командой Dasolo и мы поможем настроить всё правильно.