from odoo import api, SUPERUSER_ID def migrate(cr, version): env = api.Environment(cr, SUPERUSER_ID, {}) # Load translations for affected modules modules_translations = { 'account': {'en_US': 'Invoicing', 'es_ES': 'Invoicing'}, 'account_accountant': {'en_US': 'Invoicing', 'es_ES': 'Facturación / Contabilidad'}, 'accountant': {'en_US': 'Accounting', 'es_ES': 'Accounting'}, 'ai': {'en_US': 'AI', 'es_ES': 'AI'}, 'ai_app': {'en_US': 'AI', 'es_ES': 'AI'}, 'analytic': {'en_US': 'Analytic Accounting', 'es_ES': 'Contabilidad analítica'}, 'analytic_enterprise': {'en_US': 'Analytic Accounting Enterprise', 'es_ES': 'Contabilidad analítica empresarial'}, 'appointment': {'en_US': 'Appointments', 'es_ES': 'Citas'}, 'approvals': {'en_US': 'Approvals', 'es_ES': 'Aprobaciones'}, 'barcodes': {'en_US': 'Barcode', 'es_ES': 'Barcode'}, 'base': {'en_US': 'Base', 'es_ES': 'Base'}, 'board': {'en_US': 'Dashboards', 'es_ES': 'Tableros'}, 'bus': {'en_US': 'IM Bus', 'es_ES': 'Bus IM'}, 'calendar': {'en_US': 'Calendar', 'es_ES': 'Calendario'}, 'certificate': {'en_US': 'Certificate', 'es_ES': 'Certificado'}, 'cloud_storage': {'en_US': 'Cloud Storage', 'es_ES': 'Almacenamiento en la nube'}, 'contacts': {'en_US': 'Contacts', 'es_ES': 'Contacts'}, 'crm': {'en_US': 'CRM', 'es_ES': 'CRM'}, 'databases': {'en_US': 'Databases', 'es_ES': 'Databases'}, 'delivery': {'en_US': 'Delivery Costs', 'es_ES': 'Gastos de envío'}, 'digest': {'en_US': 'KPI Digests', 'es_ES': 'Resúmenes de KPI'}, 'documents': {'en_US': 'Documents', 'es_ES': 'Documentos'}, 'equity': {'en_US': 'Equity', 'es_ES': 'Equity'}, 'esg': {'en_US': 'ESG', 'es_ES': 'ESG'}, 'event': {'en_US': 'Events Organization', 'es_ES': 'Organización de eventos'}, 'fleet': {'en_US': 'Fleet', 'es_ES': 'Flota'}, 'frontdesk': {'en_US': 'Frontdesk', 'es_ES': 'Recepción'}, 'gamification': {'en_US': 'Gamification', 'es_ES': 'Ludificación'}, 'helpdesk': {'en_US': 'Helpdesk', 'es_ES': 'Servicio de asistencia'}, 'hr': {'en_US': 'Employees', 'es_ES': 'Employees'}, 'hr_attendance': {'en_US': 'Attendances', 'es_ES': 'Asistencias'}, 'hr_contract': {'en_US': 'Employee Contracts', 'es_ES': 'Contratos de los empleados'}, 'hr_expense': {'en_US': 'Expenses', 'es_ES': 'Gastos'}, 'hr_holidays': {'en_US': 'Time Off', 'es_ES': 'Ausencias'}, 'hr_payroll': {'en_US': 'Payroll', 'es_ES': 'Nómina'}, 'hr_recruitment': {'en_US': 'Recruitment', 'es_ES': 'Reclutamiento'}, 'hr_timesheet': {'en_US': 'Task Logs', 'es_ES': 'Registros de tareas'}, 'im_livechat': {'en_US': 'Live Chat', 'es_ES': 'Chat en directo'}, 'industry_fsm': {'en_US': 'Field Service', 'es_ES': 'Servicio de campo'}, 'iot': {'en_US': 'Internet of Things', 'es_ES': 'Internet de las cosas'}, 'knowledge': {'en_US': 'Knowledge', 'es_ES': 'Información'}, 'link_tracker': {'en_US': 'Link Tracker', 'es_ES': 'Link Tracker'}, 'loyalty': {'en_US': 'Coupons & Loyalty', 'es_ES': 'Cupones y fidelidad'}, 'lunch': {'en_US': 'Lunch', 'es_ES': 'Comida'}, 'mail': {'en_US': 'Discuss', 'es_ES': 'Conversaciones'}, 'maintenance': {'en_US': 'Maintenance', 'es_ES': 'Mantenimiento'}, 'marketing_automation': {'en_US': 'Marketing Automation', 'es_ES': 'Automatización de marketing'}, 'mass_mailing': {'en_US': 'Email Marketing', 'es_ES': 'Marketing por correo electrónico'}, 'membership': {'en_US': 'Members', 'es_ES': 'Miembros'}, 'mrp': {'en_US': 'Manufacturing', 'es_ES': 'Manufacturing'}, 'onboarding': {'en_US': 'Onboarding Toolbox', 'es_ES': 'Caja de herramientas para la incorporación'}, 'partnership': {'en_US': 'Partnership / Membership', 'es_ES': 'Partnership / Membership'}, 'payment': {'en_US': 'Payment Engine', 'es_ES': 'Motor de pago'}, 'phone_validation': {'en_US': 'Phone Numbers Validation', 'es_ES': 'Validación de números de teléfono'}, 'planning': {'en_US': 'Planning', 'es_ES': 'Planificación'}, 'point_of_sale': {'en_US': 'Point of Sale', 'es_ES': 'Punto de venta'}, 'portal': {'en_US': 'Customer Portal', 'es_ES': 'Customer Portal'}, 'preventa': {'en_US': 'Preventa', 'es_ES': 'Preventa'}, 'privacy_lookup': {'en_US': 'Privacy', 'es_ES': 'Privacidad'}, 'product': {'en_US': 'Products & Pricelists', 'es_ES': 'Productos y listas de precios'}, 'project': {'en_US': 'Project', 'es_ES': 'Proyecto'}, 'purchase': {'en_US': 'Purchase', 'es_ES': 'Purchase'}, 'quality': {'en_US': 'Quality Base', 'es_ES': 'Base de calidad '}, 'quality_control': {'en_US': 'Quality', 'es_ES': 'Calidad'}, 'rating': {'en_US': 'Customer Rating', 'es_ES': 'Valoración del cliente'}, 'repair': {'en_US': 'Repairs', 'es_ES': 'Reparaciones'}, 'resource': {'en_US': 'Resource', 'es_ES': 'Recurso'}, 'room': {'en_US': 'Meeting Rooms', 'es_ES': 'Sala de reuniones'}, 'rpc': {'en_US': 'RPC endpoints', 'es_ES': 'RPC endpoints'}, 'sale': {'en_US': 'Sales', 'es_ES': 'Sales'}, 'sale_management': {'en_US': 'Sales', 'es_ES': 'Sales'}, 'sales_team': {'en_US': 'Sales Teams', 'es_ES': 'Sales Teams'}, 'sign': {'en_US': 'Sign', 'es_ES': 'Firma electrónica'}, 'sms': {'en_US': 'SMS gateway', 'es_ES': 'Puerta de enlace SMS'}, 'snailmail': {'en_US': 'Snail Mail', 'es_ES': 'Correo postal'}, 'social': {'en_US': 'Social Marketing', 'es_ES': 'Marketing social'}, 'spreadsheet': {'en_US': 'Spreadsheet', 'es_ES': 'Spreadsheet'}, 'stock': {'en_US': 'Inventory', 'es_ES': 'Inventory'}, 'stock_account': {'en_US': 'WMS Accounting', 'es_ES': 'Contabilidad del SGA'}, 'survey': {'en_US': 'Surveys', 'es_ES': 'Surveys'}, 'timer': {'en_US': 'Timer', 'es_ES': 'Temporizador'}, 'timesheet_grid': {'en_US': 'Timesheets', 'es_ES': 'Partes de horas'}, 'transifex': {'en_US': 'Transifex integration', 'es_ES': 'Integración en Transifex'}, 'uom': {'en_US': 'Units of measure', 'es_ES': 'Unidades de medida'}, 'utm': {'en_US': 'UTM Trackers', 'es_ES': 'Rastreadores UTM'}, 'voip': {'en_US': 'VoIP', 'es_ES': 'VoIP'}, 'web': {'en_US': 'Web', 'es_ES': 'Web'}, 'web_cohort': {'en_US': 'Cohort View', 'es_ES': 'Vista de cohorte'}, 'web_editor': {'en_US': 'Web Editor', 'es_ES': 'Editor web'}, 'web_enterprise': {'en_US': 'Web Enterprise', 'es_ES': 'Web de Enterprise'}, 'web_gantt': {'en_US': 'Web Gantt', 'es_ES': 'Diagrama Gantt web'}, 'web_grid': {'en_US': 'Grid View', 'es_ES': 'Vista de cuadrícula'}, 'web_hierarchy': {'en_US': 'Web Hierarchy', 'es_ES': 'Jerarquía web'}, 'web_map': {'en_US': 'Map View', 'es_ES': 'Vista del mapa'}, 'web_mobile': {'en_US': 'Mobile', 'es_ES': 'Mobile'}, 'web_studio': {'en_US': 'Studio', 'es_ES': 'Studio'}, 'web_tour': {'en_US': 'Tours', 'es_ES': 'Recorridos'}, 'web_unsplash': {'en_US': 'Unsplash Image Library', 'es_ES': 'Biblioteca de imágenes de Unsplash'}, 'website': {'en_US': 'Website', 'es_ES': 'Website'}, 'whatsapp': {'en_US': 'WhatsApp Messaging', 'es_ES': 'Mensajes de WhatsApp'}, 'worksheet': {'en_US': 'Worksheet', 'es_ES': 'Hoja de trabajo'}, } # Ensure Spanish language is installed es_lang = env['res.lang'].search([('code', '=', 'es_ES')], limit=1) if not es_lang: env['res.lang']._activate_lang('es_ES') # Get all affected modules affected_modules = env['helpdesk.affected.module'].search([]) for module in affected_modules: if module.code in modules_translations: translations = modules_translations[module.code] # Set English name first (base language) - this ensures en_US is set module.with_context(lang='en_US').write({'name': translations['en_US']}) # Update Spanish translation using write with context if 'es_ES' in translations and translations['es_ES']: # Use write with context to set translation module.with_context(lang='es_ES').write({'name': translations['es_ES']})