Public release from ruodoo-project: 19.0 - 2026-05-31 21:19:12 UTC
This commit is contained in:
87
translation_helper/models/base.py
Normal file
87
translation_helper/models/base.py
Normal file
@ -0,0 +1,87 @@
|
||||
import logging
|
||||
|
||||
from odoo import models
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class Model(models.AbstractModel):
|
||||
_inherit = "base"
|
||||
|
||||
def _get_record_modules(self):
|
||||
"""Возвращает список модулей, в которых определены текущие записи."""
|
||||
xml_items = (
|
||||
self.env["ir.model.data"]
|
||||
.sudo()
|
||||
.search(
|
||||
[
|
||||
("res_id", "in", self.ids),
|
||||
("model", "=", self._name),
|
||||
]
|
||||
)
|
||||
)
|
||||
return list({item.module for item in xml_items if item.module})
|
||||
|
||||
def update_field_translations(self, field_name, translations):
|
||||
"""OVERRIDE
|
||||
Update the values of a translated field.
|
||||
|
||||
:param str field_name: field name
|
||||
:param dict translations: if the field has ``translate=True``, it should be a dictionary
|
||||
like ``{lang: new_value}``; if ``translate`` is a callable, it should be like
|
||||
``{lang: {old_term: new_term}}``
|
||||
|
||||
Odoo 19: calls super().update_field_translations() to preserve original behaviour,
|
||||
which internally dispatches to _update_field_translations.
|
||||
"""
|
||||
modules = self._get_record_modules()
|
||||
if not modules:
|
||||
_logger.warning(
|
||||
"Не удалось определить модуль для модели %s (ids: %s)",
|
||||
self._name,
|
||||
self.ids,
|
||||
)
|
||||
return super().update_field_translations(field_name, translations)
|
||||
|
||||
original_value = self.with_context(lang=None)[field_name]
|
||||
if not original_value:
|
||||
_logger.warning(
|
||||
"Оригинальное значение поля '%s' пустое для модели %s (ids: %s)",
|
||||
field_name,
|
||||
self._name,
|
||||
self.ids,
|
||||
)
|
||||
return super().update_field_translations(field_name, translations)
|
||||
|
||||
# Обновляем перевод для каждой локали
|
||||
for lang, translated_value in translations.items():
|
||||
if not translated_value:
|
||||
_logger.info("Пропущен пустой перевод для языка: %s", lang)
|
||||
continue
|
||||
|
||||
lang_record = (
|
||||
self.env["res.lang"].sudo().search([("code", "=", lang)], limit=1)
|
||||
)
|
||||
iso_code = lang_record.iso_code or lang.split("_")[0]
|
||||
source_value = original_value
|
||||
translated_value_string = translated_value
|
||||
if isinstance(translated_value, dict):
|
||||
source_value = translated_value.get("source", original_value)
|
||||
translated_value_string = list(translated_value.values())[0]
|
||||
|
||||
self.env[
|
||||
"translation.helper.wizard"
|
||||
].sudo().update_term_translation_in_module(
|
||||
modules[0], source_value, translated_value_string, iso_code
|
||||
)
|
||||
_logger.info(
|
||||
"Обновлен перевод для '%s' (%s -> %s) [lang: %s]",
|
||||
field_name,
|
||||
original_value,
|
||||
translated_value,
|
||||
lang,
|
||||
)
|
||||
|
||||
# Odoo 19: use super() instead of calling _update_field_translations directly,
|
||||
# as the internal method signature may have changed between versions.
|
||||
return super().update_field_translations(field_name, translations)
|
||||
Reference in New Issue
Block a user