import pandas as pd import os import PyLibrary.funciones_comunes as fc from translation_config import TranslationConfig from openpyxl import load_workbook from openpyxl.styles import Font from openpyxl.comments import Comment # Definir el logger a nivel de módulo logger = None def update_from_master(config: TranslationConfig, archivo_to_update): archivo_maestro = config.get_master_path() if not os.path.exists(archivo_maestro): print("El archivo maestro no existe.") return logger.info(" .... ") logger.info( f"Iniciando actualización en {archivo_to_update} desde el archivo maestro. Para {config.codigo_idioma_seleccionado}" ) df_maestro = fc.read_dataframe_with_cleanup_retries(archivo_maestro) df_to_update = fc.read_dataframe_with_cleanup_retries(archivo_to_update) col_clave = config.codigo_columna_maestra celdas_con_errores = {} for index, fila in df_to_update.iterrows(): valor_original = fila[col_clave] clave = fc.compactar_celda_clave(config.codigo_tipo_PLC, valor_original) logger.info(f"Fila {index} : Clave: {clave}") if not pd.isnull(clave) and clave in df_maestro[col_clave].values: indice_maestro = df_maestro.index[df_maestro[col_clave] == clave].tolist()[ 0 ] valor_traducido_compacto = df_maestro.loc[ indice_maestro, config.codigo_idioma_seleccionado ] valor_traducido = fc.decompactar_celda_traducida( config.codigo_tipo_PLC, celda_original=valor_original, celda_traducida=valor_traducido_compacto, ) if ( not pd.isnull(valor_traducido) and fila[config.codigo_idioma_seleccionado] != valor_traducido ): okToSave, Error = fc.verificar_celda_traducida( config.codigo_tipo_PLC, clave, valor_traducido_compacto ) if okToSave: logger.info("Actualizado.") df_to_update.at[index, config.codigo_idioma_seleccionado] = ( valor_traducido ) else: df_to_update.at[index, config.codigo_idioma_seleccionado] = ( valor_original ) logger.error(f"No actualizado porque: {Error}") celdas_con_errores[indice_maestro] = Error nombre, extension = os.path.splitext(archivo_to_update) nuevo_nombre = f"{nombre}_import{extension}" fc.save_dataframe_with_retries(df_to_update, output_path=nuevo_nombre) marcar_celdas_con_errores( archivo_maestro, celdas_con_errores, config.codigo_idioma_seleccionado ) print( f"Se han actualizado las filas en {archivo_to_update} desde el archivo maestro. " f"Se han marcado {len(celdas_con_errores)} celdas con errores en el archivo maestro." ) logger.info( f"Se han actualizado las filas en {archivo_to_update} desde el archivo maestro. " f"Se han marcado {len(celdas_con_errores)} celdas con errores en el archivo maestro." ) logger.info(" .... ") def marcar_celdas_con_errores(archivo_maestro, celdas_con_errores, target_lang_code): workbook = load_workbook(archivo_maestro) sheet = workbook.active for col in range(1, sheet.max_column + 1): if sheet.cell(row=1, column=col).value == target_lang_code: target_col = col break else: print(f"No se encontró la columna para el idioma {target_lang_code}") return for indice_maestro, mensaje_error in celdas_con_errores.items(): row = indice_maestro + 2 cell = sheet.cell(row=row, column=target_col) cell.font = Font(color="FF0000") comment = Comment(mensaje_error, "Sistema de Traducción") cell.comment = comment workbook.save(archivo_maestro) print( f"Se han marcado {len(celdas_con_errores)} celdas con errores en rojo en el archivo maestro {archivo_maestro}" ) def run(config: TranslationConfig, archivo_to_update): global logger logger = fc.configurar_logger(config.work_dir) if archivo_to_update: script_name = os.path.basename(__file__) print(f"\rIniciando: {script_name}\r") update_from_master(config, archivo_to_update) if __name__ == "__main__": import menu_pasos_traduccion menu_pasos_traduccion.main()