# Sistema de Traducciones - Guía Completa ## Estado Actual ✅ **El sistema de traducciones está funcionando correctamente** Todos los addons custom incluyen traducciones para: - **Español (es)** - Obligatorio - **Euskera (eu)** - Obligatorio - Catalán (ca), Gallego (gl), Portugués (pt), Francés (fr), Italiano (it) - Opcional ## Estructura de Archivos Cada addon debe tener la siguiente estructura: ``` addon_name/ ├── i18n/ │ ├── es.po # Español (obligatorio) │ ├── eu.po # Euskera (obligatorio) │ ├── ca.po # Catalán (opcional) │ ├── gl.po # Gallego (opcional) │ ├── pt.po # Portugués (opcional) │ ├── fr.po # Francés (opcional) │ ├── it.po # Italiano (opcional) │ └── addon_name.pot # Template (generado automáticamente) ``` ## Reglas Importantes ### ❌ NO Hacer **NUNCA usar `_()` en definiciones de campos a nivel de módulo:** ```python # ❌ INCORRECTO - Causa warnings from odoo import _ class MyModel(models.Model): _name = 'my.model' name = fields.Char(string=_("Name")) # ❌ MAL description = fields.Text(string=_("Description")) # ❌ MAL ``` **Por qué está mal**: `_()` se ejecuta en tiempo de importación del módulo, antes de que el sistema de traducciones esté inicializado, causando warnings. ### ✅ Hacer **Usar strings literales en definiciones de campos:** ```python # ✅ CORRECTO from odoo import models, fields class MyModel(models.Model): _name = 'my.model' name = fields.Char(string="Name") # ✅ BIEN description = fields.Text(string="Description") # ✅ BIEN ``` **Usar `_()` solo en métodos y código ejecutable:** ```python # ✅ CORRECTO from odoo import _, models class MyModel(models.Model): _name = 'my.model' def action_confirm(self): message = _("Order confirmed successfully") # ✅ BIEN return { 'type': 'ir.actions.client', 'tag': 'display_notification', 'params': { 'title': _('Success'), # ✅ BIEN 'message': message, 'type': 'success', } } def _compute_display_name(self): for record in self: record.display_name = _("Order %s") % record.name # ✅ BIEN ``` ## Cómo Generar/Actualizar Traducciones ### 1. Exportar Términos Traducibles NO HACER: ```bash # Exportar términos del addon docker-compose exec odoo odoo \ --addons-path=/mnt/extra-addons \ --i18n-export=/tmp/addon_name.pot \ --modules=addon_name \ --db=odoo \ --stop-after-init De alguna forma, exporta todas las cadenas de Odoo. PEDIR AL USUARIO QUE GENERE EL POT DESDE LA UI DE ODOO # Copiar el archivo generado docker-compose cp odoo:/tmp/addon_name.pot ./addon_name/i18n/ ``` ### 2. Actualizar Archivos .po Existentes no usar msmerge, corrompe el po. Usa polib. ### 3. Traducir Términos Nuevos Editar los archivos `.po` y completar las traducciones: ```po #: models/my_model.py:25 msgid "Order confirmed successfully" msgstr "Pedido confirmado correctamente" # Español #: models/my_model.py:30 msgid "Success" msgstr "Éxito" ``` ### 4. Cargar Traducciones en Odoo ```bash # Actualizar addon con nuevas traducciones docker-compose exec odoo odoo -d odoo -u addon_name --stop-after-init # O reiniciar Odoo para que cargue los cambios docker-compose restart odoo ``` ## Formato de Archivos .po ### Cabecera Requerida ```po # Translation of Odoo Server. # This file contains the translation of the following modules: # * addon_name # msgid "" msgstr "" "Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-02-12 10:00+0000\n" "PO-Revision-Date: 2026-02-12 10:00+0000\n" "Last-Translator: Your Name \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" ``` ### Campos Traducibles Odoo automáticamente detecta y exporta: 1. **String en definiciones de campos**: `fields.Char(string="Name")` 2. **Help text**: `fields.Char(help="Enter the product name")` 3. **Selection options**: `fields.Selection([('draft', 'Draft'), ('done', 'Done')])` 4. **Texto en vistas XML**: `