Funcionando con el agregado de x4B y la funcion de caracteres especiales para los enter

This commit is contained in:
Miguel 2024-10-11 14:11:29 +02:00
parent b38453248b
commit 8d1eadb49f
13 changed files with 46807 additions and 11352 deletions

View File

@ -5,31 +5,15 @@ idioma_var = Spanish
idioma_var2 = English_US idioma_var2 = English_US
[TextContent] [TextContent]
output_text = Ejecutando x1_importar_to_master.run() output_text = Ejecutando x4B_integrate_manual_translates_to_master.run()
Se han agregado 939 nuevas filas válidas al archivo maestro. Archivo leído y limpiado exitosamente: .\data\1_hmi_master_translates_allenbradley.xlsx
Ejecutando x2_master_export2translate.run() Archivo leído y limpiado exitosamente: .\data\2_master_export2translate_allenbradley.xlsxEjecutando x4B_integrate_manual_translates_to_master.run()
Archivo leído y limpiado exitosamente: .\data\1_hmi_master_translates_allenbradley.xlsx Archivo leído y limpiado exitosamente: .\data\1_hmi_master_translates_allenbradley.xlsx
Archivo exportado para traducción: .\data\2_master_export2translate_allenbradley.xlsx
Ejecutando x3_llm_auto_translate.run()
Archivo leído y limpiado exitosamente: .\data\2_master_export2translate_allenbradley.xlsx Archivo leído y limpiado exitosamente: .\data\2_master_export2translate_allenbradley.xlsx
Número total de textos a traducir: 0
Archivo guardado exitosamente. Archivo guardado exitosamente.
Archivo traducido guardado en: .\data\3_master_export2translate_translated_allenbradley.xlsx Se han formateado 0 celdas modificadas en negrita en el archivo maestro.
Ejecutando x4_integrate_translates_to_master.run() Se han marcado 3 celdas con errores en rojo en el archivo fuente.
Archivo leído y limpiado exitosamente: .\data\1_hmi_master_translates_allenbradley.xlsx Traducciones manuales importadas y archivo maestro actualizado: .\data\1_hmi_master_translates_allenbradley.xlsx.
Archivo leído y limpiado exitosamente: .\data\3_master_export2translate_translated_allenbradley.xlsx Se han actualizado 0 celdas en el maestro y se han encontrado 3 errores en el archivo fuente.
Archivo guardado exitosamente.
Traducciones importadas y archivo maestro actualizado: .\data\1_hmi_master_translates_allenbradley.xlsx.
Ejecutando x4_integrate_translates_to_master.run()
Archivo leído y limpiado exitosamente: .\data\1_hmi_master_translates_allenbradley.xlsx
Archivo leído y limpiado exitosamente: .\data\3_master_export2translate_translated_allenbradley.xlsx
Archivo guardado exitosamente.
Traducciones importadas y archivo maestro actualizado: .\data\1_hmi_master_translates_allenbradley.xlsx.
Ejecutando x6_update_from_master.run()
Archivo leído y limpiado exitosamente: .\data\1_hmi_master_translates_allenbradley.xlsx
Archivo leído y limpiado exitosamente: C:/Trabajo/VM/31 - 9.3953 - Omega - Mexico - (ABradley)/Reporte/Languages/HMI_93953_30.xlsx
Archivo guardado exitosamente.
Se han actualizado las filas en C:/Trabajo/VM/31 - 9.3953 - Omega - Mexico - (ABradley)/Reporte/Languages/HMI_93953_30.xlsx desde el archivo maestro.

File diff suppressed because it is too large Load Diff

View File

@ -6,6 +6,7 @@ import x1_importar_to_master
import x2_master_export2translate import x2_master_export2translate
import x3_llm_auto_translate import x3_llm_auto_translate
import x4_integrate_translates_to_master import x4_integrate_translates_to_master
import x4B_integrate_manual_translates_to_master
import x5_complete_empty_cells_master import x5_complete_empty_cells_master
import x6_update_from_master import x6_update_from_master
import sys import sys
@ -33,6 +34,19 @@ idiomas_lista = [(nombre, codigo) for _, (nombre, codigo) in fc.IDIOMAS.items()]
# Ruta del archivo de configuración # Ruta del archivo de configuración
config_file = 'config.ini' config_file = 'config.ini'
def open_master_directory():
tipo_PLC = tipo_PLC_dict[tipo_PLC_var.get()]
archivo_maestro = f".\\data\\1_hmi_master_translates_{tipo_PLC}.xlsx"
master_directory = os.path.dirname(os.path.abspath(archivo_maestro))
fc.open_file_explorer(master_directory)
def open_log_file():
log_file_path = ".\\logs\\translate_log.log"
if os.path.exists(log_file_path):
fc.open_file_explorer(log_file_path)
else:
messagebox.showinfo("Archivo de registro", "El archivo de registro aún no existe.")
# Función para cargar las opciones guardadas # Función para cargar las opciones guardadas
def cargar_configuracion(): def cargar_configuracion():
config = configparser.ConfigParser() config = configparser.ConfigParser()
@ -179,6 +193,9 @@ def ejecutar_run(funcion_run):
elif funcion_run == x4_integrate_translates_to_master.run: elif funcion_run == x4_integrate_translates_to_master.run:
print("Ejecutando x4_integrate_translates_to_master.run()") print("Ejecutando x4_integrate_translates_to_master.run()")
funcion_run(tipo_PLC, codigo_columna_maestra, indice_seleccionado, 0.5) funcion_run(tipo_PLC, codigo_columna_maestra, indice_seleccionado, 0.5)
elif funcion_run == x4B_integrate_manual_translates_to_master.run:
print("Ejecutando x4B_integrate_manual_translates_to_master.run()")
funcion_run(tipo_PLC, codigo_columna_maestra, indice_seleccionado)
elif funcion_run == x5_complete_empty_cells_master.run: elif funcion_run == x5_complete_empty_cells_master.run:
print("Ejecutando x5_complete_empty_cells_master.run()") print("Ejecutando x5_complete_empty_cells_master.run()")
funcion_run(tipo_PLC, codigo_columna_maestra, indice_seleccionado, indice_seleccionado2) funcion_run(tipo_PLC, codigo_columna_maestra, indice_seleccionado, indice_seleccionado2)
@ -196,17 +213,26 @@ paso1 = tk.Button(ventana, text="1 - Importar al Master", command=lambda: thread
paso2 = tk.Button(ventana, text="2 - Exportar Idioma a 2_master_export2translate.xlsx.", command=lambda: threading.Thread(target=ejecutar_run, args=(x2_master_export2translate.run,)).start(), width=button_width) paso2 = tk.Button(ventana, text="2 - Exportar Idioma a 2_master_export2translate.xlsx.", command=lambda: threading.Thread(target=ejecutar_run, args=(x2_master_export2translate.run,)).start(), width=button_width)
paso3 = tk.Button(ventana, text="3 - Traducir y generar 3_master_export2translate_translated.xlsx.", command=lambda: threading.Thread(target=ejecutar_run, args=(x3_llm_auto_translate.run,)).start(), width=button_width) paso3 = tk.Button(ventana, text="3 - Traducir y generar 3_master_export2translate_translated.xlsx.", command=lambda: threading.Thread(target=ejecutar_run, args=(x3_llm_auto_translate.run,)).start(), width=button_width)
paso4 = tk.Button(ventana, text="4 - Integrar las traducciones al 1_hmi_master_translates.", command=lambda: threading.Thread(target=ejecutar_run, args=(x4_integrate_translates_to_master.run,)).start(), width=button_width) paso4 = tk.Button(ventana, text="4 - Integrar las traducciones al 1_hmi_master_translates.", command=lambda: threading.Thread(target=ejecutar_run, args=(x4_integrate_translates_to_master.run,)).start(), width=button_width)
paso4B = tk.Button(ventana, text="4B - Integrar traducciones manuales al 1_hmi_master_translates.", command=lambda: threading.Thread(target=ejecutar_run, args=(x4B_integrate_manual_translates_to_master.run,)).start(), width=button_width)
paso5 = tk.Button(ventana, text="5 - Completar en 1_hmi_master_translates el idioma seleccionado usando el segundo idioma.", command=lambda: threading.Thread(target=ejecutar_run, args=(x5_complete_empty_cells_master.run,)).start(), width=button_width) paso5 = tk.Button(ventana, text="5 - Completar en 1_hmi_master_translates el idioma seleccionado usando el segundo idioma.", command=lambda: threading.Thread(target=ejecutar_run, args=(x5_complete_empty_cells_master.run,)).start(), width=button_width)
paso6 = tk.Button(ventana, text="6 - Exportar usando un archivo exportado desde TIA Portal usando 1_hmi_master_translates.", command=lambda: threading.Thread(target=ejecutar_run, args=(x6_update_from_master.run,)).start(), width=button_width) paso6 = tk.Button(ventana, text="6 - Exportar usando un archivo exportado desde TIA Portal usando 1_hmi_master_translates.", command=lambda: threading.Thread(target=ejecutar_run, args=(x6_update_from_master.run,)).start(), width=button_width)
boton_abrir_directorio = tk.Button(ventana, text="Abrir directorio del archivo maestro", command=open_master_directory, width=button_width)
boton_abrir_log = tk.Button(ventana, text="Abrir archivo de log", command=open_log_file, width=button_width)
# Ubicar los botones en la ventana # Ubicar los botones en la ventana
paso1.pack(pady=(10,2)) paso1.pack(pady=(10,2))
paso2.pack(pady=2) paso2.pack(pady=2)
paso3.pack(pady=2) paso3.pack(pady=2)
paso4.pack(pady=2) paso4.pack(pady=2)
paso4B.pack(pady=2) # Nuevo botón para el paso 4B
paso5.pack(pady=2) paso5.pack(pady=2)
paso6.pack(pady=2) paso6.pack(pady=2)
# Place the new buttons in the window
boton_abrir_directorio.pack(pady=2)
boton_abrir_log.pack(pady=2)
# Crear un Frame para el cuadro de texto, los scrollbars y el botón # Crear un Frame para el cuadro de texto, los scrollbars y el botón
frame_texto = tk.Frame(ventana) frame_texto = tk.Frame(ventana)
frame_texto.pack(fill='both', expand=True, pady=10) frame_texto.pack(fill='both', expand=True, pady=10)

View File

@ -0,0 +1,116 @@
import PyLibrary.funciones_comunes as fc
import pandas as pd
import os
import logging
from openpyxl import load_workbook
from openpyxl.styles import Font
from openpyxl.comments import Comment
def importar_traduccion_manual(tipo_PLC, archivo_maestro, archivo_traduccion, target_lang_code):
if not os.path.exists(archivo_maestro):
print("El archivo maestro no existe.")
return
master_col = target_lang_code
df_maestro = fc.read_dataframe_with_cleanup_retries(archivo_maestro)
df_traduccion = fc.read_dataframe_with_cleanup_retries(archivo_traduccion)
# Configurar el logger
logger = fc.configurar_logger()
# Crear un diccionario para almacenar las celdas modificadas en el maestro
celdas_modificadas = {}
# Crear un diccionario para almacenar las celdas con errores en el archivo fuente
celdas_con_errores = {}
# Iterar sobre las filas del archivo de traducción para actualizar el maestro
for index, fila in df_traduccion.iterrows():
clave = fila[df_maestro.columns[0]]
if clave in df_maestro[df_maestro.columns[0]].values:
valor_traducido = fila[target_lang_code]
valor_original = df_maestro.loc[df_maestro[df_maestro.columns[0]] == clave, master_col].values[0]
if pd.notnull(valor_traducido) and valor_traducido != "" and str(valor_original) != str(valor_traducido):
# Verificar si la traducción es válida
okToSave, Error = fc.verificar_celda_traducida(tipo_PLC, clave, valor_traducido)
if okToSave:
df_maestro.loc[df_maestro[df_maestro.columns[0]] == clave, master_col] = valor_traducido
logger.info(f'Fila {index}, Columna {master_col}: "{valor_original}" actualizado a "{valor_traducido}"')
# Almacenar la posición de la celda modificada en el maestro
fila_excel = df_maestro.index[df_maestro[df_maestro.columns[0]] == clave].tolist()[0] + 2 # +2 porque Excel empieza en 1 y tiene encabezados
columna_excel = df_maestro.columns.get_loc(master_col) + 1 # +1 porque Excel empieza en 1
celdas_modificadas[(fila_excel, columna_excel)] = valor_traducido
else:
logger.error(f'Fila {index}, Columna {master_col}: No actualizado porque: {Error}')
# Almacenar la posición de la celda con error en el archivo fuente
fila_excel = index + 2 # +2 porque Excel empieza en 1 y tiene encabezados
columna_excel = df_traduccion.columns.get_loc(target_lang_code) + 1 # +1 porque Excel empieza en 1
celdas_con_errores[(fila_excel, columna_excel)] = Error
# Guardar el archivo maestro actualizado
fc.save_dataframe_with_retries(df_maestro, output_path=archivo_maestro)
# Aplicar formato de negrita a las celdas modificadas en el maestro
aplicar_formato_celdas_maestro(archivo_maestro, celdas_modificadas)
# Marcar errores en rojo en el archivo fuente
marcar_errores_archivo_fuente(archivo_traduccion, celdas_con_errores)
print(f"Traducciones manuales importadas y archivo maestro actualizado: {archivo_maestro}.")
print(f"Se han actualizado {len(celdas_modificadas)} celdas en el maestro y se han encontrado {len(celdas_con_errores)} errores en el archivo fuente.")
def aplicar_formato_celdas_maestro(archivo, celdas_modificadas):
"""
Aplica formato de negrita a las celdas modificadas en el archivo maestro.
:param archivo: Ruta del archivo Excel maestro.
:param celdas_modificadas: Diccionario con las celdas modificadas {(fila, columna): valor}.
"""
workbook = load_workbook(archivo)
sheet = workbook.active
for (fila, columna), valor in celdas_modificadas.items():
celda = sheet.cell(row=fila, column=columna)
celda.font = Font(bold=True)
celda.value = valor
workbook.save(archivo)
print(f"Se han formateado {len(celdas_modificadas)} celdas modificadas en negrita en el archivo maestro.")
def marcar_errores_archivo_fuente(archivo, celdas_con_errores):
"""
Marca en rojo las celdas con errores en el archivo fuente y añade comentarios.
:param archivo: Ruta del archivo Excel fuente.
:param celdas_con_errores: Diccionario con las celdas con errores {(fila, columna): mensaje_error}.
"""
workbook = load_workbook(archivo)
sheet = workbook.active
for (fila, columna), mensaje_error in celdas_con_errores.items():
celda = sheet.cell(row=fila, column=columna)
celda.font = Font(color="FF0000") # Texto en rojo
comment = Comment(mensaje_error, "Sistema de Traducción")
celda.comment = comment
workbook.save(archivo)
print(f"Se han marcado {len(celdas_con_errores)} celdas con errores en rojo en el archivo fuente.")
def run(tipo_PLC, codigo_columna_maestra, seleccion_idioma):
archivo_maestro = f".\\data\\1_hmi_master_translates_{tipo_PLC}.xlsx"
archivo_traduccion = f".\\data\\2_master_export2translate_{tipo_PLC}.xlsx"
if seleccion_idioma not in fc.IDIOMAS:
print("Selección inválida.")
else:
_, target_lang_code = fc.IDIOMAS[seleccion_idioma]
importar_traduccion_manual(tipo_PLC, archivo_maestro, archivo_traduccion, target_lang_code)
if __name__ == "__main__":
tipo_PLC = "siemens"
codigo_columna_maestra = "it-IT"
fc.mostrar_idiomas()
seleccion_idioma = int(input("Introduce el número del idioma de destino: "))
run(tipo_PLC, codigo_columna_maestra, seleccion_idioma)

View File

@ -3,15 +3,8 @@ import pandas as pd
import os import os
import re import re
import logging import logging
from openpyxl import load_workbook
def revertir_transformaciones(texto, digitos, secciones): from openpyxl.styles import Font
# Revertir <> a [[digits]]
for digito in digitos:
texto = texto.replace('<>', digito, 1)
# Revertir <#> a <...> usando las secciones originales
for seccion in secciones:
texto = texto.replace('<#>', f'<{seccion}>', 1)
return texto
def importar_traduccion(tipo_PLC, archivo_maestro, archivo_traduccion, target_lang_code, nivel_afinidad_minimo): def importar_traduccion(tipo_PLC, archivo_maestro, archivo_traduccion, target_lang_code, nivel_afinidad_minimo):
if not os.path.exists(archivo_maestro): if not os.path.exists(archivo_maestro):
@ -28,6 +21,9 @@ def importar_traduccion(tipo_PLC, archivo_maestro, archivo_traduccion, target_la
# Configurar el logger # Configurar el logger
logger = fc.configurar_logger() logger = fc.configurar_logger()
# Crear un diccionario para almacenar las celdas modificadas
celdas_modificadas = {}
# Iterar sobre las filas del archivo de traducción para actualizar el maestro # Iterar sobre las filas del archivo de traducción para actualizar el maestro
for index, fila in df_traduccion.iterrows(): for index, fila in df_traduccion.iterrows():
clave = fila[df_maestro.columns[0]] clave = fila[df_maestro.columns[0]]
@ -41,10 +37,37 @@ def importar_traduccion(tipo_PLC, archivo_maestro, archivo_traduccion, target_la
df_maestro.loc[df_maestro[df_maestro.columns[0]] == clave, master_col] = valor_traducido df_maestro.loc[df_maestro[df_maestro.columns[0]] == clave, master_col] = valor_traducido
logger.info(f'Fila {index}, Columna {translated_col}: "{valor_original}" actualizado a "{valor_traducido}"') logger.info(f'Fila {index}, Columna {translated_col}: "{valor_original}" actualizado a "{valor_traducido}"')
# Almacenar la posición de la celda modificada
fila_excel = df_maestro.index[df_maestro[df_maestro.columns[0]] == clave].tolist()[0] + 2 # +2 porque Excel empieza en 1 y tiene encabezados
columna_excel = df_maestro.columns.get_loc(master_col) + 1 # +1 porque Excel empieza en 1
celdas_modificadas[(fila_excel, columna_excel)] = valor_traducido
# Guardar el archivo maestro actualizado # Guardar el archivo maestro actualizado
fc.save_dataframe_with_retries(df_maestro, output_path=archivo_maestro) fc.save_dataframe_with_retries(df_maestro, output_path=archivo_maestro)
# Aplicar formato de negrita a las celdas modificadas
aplicar_negrita_celdas_modificadas(archivo_maestro, celdas_modificadas)
print(f"Traducciones importadas y archivo maestro actualizado: {archivo_maestro}.") print(f"Traducciones importadas y archivo maestro actualizado: {archivo_maestro}.")
def aplicar_negrita_celdas_modificadas(archivo, celdas_modificadas):
"""
Aplica formato de negrita a las celdas especificadas en un archivo Excel.
:param archivo: Ruta del archivo Excel.
:param celdas_modificadas: Diccionario con las celdas a modificar {(fila, columna): valor}.
"""
workbook = load_workbook(archivo)
sheet = workbook.active
for (fila, columna), valor in celdas_modificadas.items():
celda = sheet.cell(row=fila, column=columna)
celda.font = Font(bold=True)
celda.value = valor # Asegurarse de que el valor es el correcto
workbook.save(archivo)
print(f"Se han marcado en negrita {len(celdas_modificadas)} celdas modificadas en {archivo}.")
def run(tipo_PLC, codigo_columna_maestra, seleccion_idioma, nivel_afinidad_minimo): def run(tipo_PLC, codigo_columna_maestra, seleccion_idioma, nivel_afinidad_minimo):
archivo_maestro = f".\\data\\1_hmi_master_translates_{tipo_PLC}.xlsx" archivo_maestro = f".\\data\\1_hmi_master_translates_{tipo_PLC}.xlsx"
archivo_traduccion = f".\\data\\3_master_export2translate_translated_{tipo_PLC}.xlsx" archivo_traduccion = f".\\data\\3_master_export2translate_translated_{tipo_PLC}.xlsx"
@ -55,11 +78,10 @@ def run(tipo_PLC, codigo_columna_maestra, seleccion_idioma , nivel_afinidad_mini
target_lang, target_lang_code = fc.IDIOMAS[seleccion_idioma] target_lang, target_lang_code = fc.IDIOMAS[seleccion_idioma]
importar_traduccion(tipo_PLC, archivo_maestro, archivo_traduccion, target_lang_code, nivel_afinidad_minimo) importar_traduccion(tipo_PLC, archivo_maestro, archivo_traduccion, target_lang_code, nivel_afinidad_minimo)
if __name__ == "__main__": if __name__ == "__main__":
tipo_PLC = "siemens" tipo_PLC = "siemens"
codigo_columna_maestra = "it-IT" codigo_columna_maestra = "it-IT"
nivel_afinidad_minimo = input("Introduce el nivel minimo de afinidad para importar (presiona Enter para usar el valor por defecto 0.5): ") nivel_afinidad_minimo = input("Introduce el nivel mínimo de afinidad para importar (presiona Enter para usar el valor por defecto 0.5): ")
nivel_afinidad_minimo = float(nivel_afinidad_minimo) if nivel_afinidad_minimo else 0.5 nivel_afinidad_minimo = float(nivel_afinidad_minimo) if nivel_afinidad_minimo else 0.5
fc.mostrar_idiomas() fc.mostrar_idiomas()

View File

@ -4,6 +4,9 @@ import re
import logging import logging
import PyLibrary.funciones_comunes as fc import PyLibrary.funciones_comunes as fc
from openpyxl.utils.escape import unescape from openpyxl.utils.escape import unescape
from openpyxl import load_workbook
from openpyxl.styles import Font
from openpyxl.comments import Comment
def update_from_master(tipo_PLC, codigo_columna_maestra, archivo_maestro, archivo_to_update, target_lang_code): def update_from_master(tipo_PLC, codigo_columna_maestra, archivo_maestro, archivo_to_update, target_lang_code):
if not os.path.exists(archivo_maestro): if not os.path.exists(archivo_maestro):
@ -15,7 +18,7 @@ def update_from_master(tipo_PLC, codigo_columna_maestra, archivo_maestro, archiv
logger.info(" .... ") logger.info(" .... ")
logger.info( logger.info(
f"Iniciando actualizacion en {archivo_to_update} desde el archivo maestro. Para {target_lang_code} " f"Iniciando actualización en {archivo_to_update} desde el archivo maestro. Para {target_lang_code} "
) )
df_maestro = fc.read_dataframe_with_cleanup_retries(archivo_maestro) df_maestro = fc.read_dataframe_with_cleanup_retries(archivo_maestro)
@ -23,6 +26,9 @@ def update_from_master(tipo_PLC, codigo_columna_maestra, archivo_maestro, archiv
col_clave = codigo_columna_maestra col_clave = codigo_columna_maestra
# Diccionario para almacenar las celdas con errores en el archivo maestro
celdas_con_errores = {}
# Iterar sobre las filas del archivo de actualización para actualizarlas # Iterar sobre las filas del archivo de actualización para actualizarlas
for index, fila in df_to_update.iterrows(): for index, fila in df_to_update.iterrows():
valor_original = fila[col_clave] valor_original = fila[col_clave]
@ -33,10 +39,9 @@ def update_from_master(tipo_PLC, codigo_columna_maestra, archivo_maestro, archiv
if not pd.isnull(clave) and clave in df_maestro[col_clave].values: if not pd.isnull(clave) and clave in df_maestro[col_clave].values:
# Obtenemos los valores # Obtenemos los valores
indice_maestro = df_maestro.index[df_maestro[col_clave] == clave].tolist()[0]
valor_traducido_compacto = df_maestro.loc[indice_maestro, target_lang_code]
valor_traducido_compacto = df_maestro.loc[
df_maestro[col_clave] == clave, target_lang_code
].values[0]
# Descompactamos # Descompactamos
valor_traducido = fc.decompactar_celda_traducida(tipo_PLC, valor_traducido = fc.decompactar_celda_traducida(tipo_PLC,
celda_original=valor_original, celda_traducida=valor_traducido_compacto celda_original=valor_original, celda_traducida=valor_traducido_compacto
@ -45,7 +50,7 @@ def update_from_master(tipo_PLC, codigo_columna_maestra, archivo_maestro, archiv
not pd.isnull(valor_traducido) not pd.isnull(valor_traducido)
and fila[target_lang_code] != valor_traducido and fila[target_lang_code] != valor_traducido
): ):
# Salvamos en el file to Update # Verificamos si la traducción es válida
okToSave, Error = fc.verificar_celda_traducida(tipo_PLC, okToSave, Error = fc.verificar_celda_traducida(tipo_PLC,
clave, valor_traducido_compacto clave, valor_traducido_compacto
) )
@ -57,19 +62,60 @@ def update_from_master(tipo_PLC, codigo_columna_maestra, archivo_maestro, archiv
logger.error( logger.error(
f'No actualizado porque: {Error}' f'No actualizado porque: {Error}'
) )
# Almacenar la celda con error para marcarla en rojo más tarde en el archivo maestro
celdas_con_errores[indice_maestro] = Error
# Guardar el archivo actualizado # Guardar el archivo actualizado
nombre, extension = os.path.splitext(archivo_to_update) nombre, extension = os.path.splitext(archivo_to_update)
nuevo_nombre = f"{nombre}_import{extension}" nuevo_nombre = f"{nombre}_import{extension}"
fc.save_dataframe_with_retries(df_to_update, output_path=nuevo_nombre) fc.save_dataframe_with_retries(df_to_update, output_path=nuevo_nombre)
# Marcar celdas con errores en rojo en el archivo maestro
marcar_celdas_con_errores(archivo_maestro, celdas_con_errores, target_lang_code)
print( print(
f"Se han actualizado las filas en {archivo_to_update} desde el archivo maestro. " 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( logger.info(
f"Se han actualizado las filas en {archivo_to_update} desde el archivo maestro. " 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(" .... ") logger.info(" .... ")
def marcar_celdas_con_errores(archivo_maestro, celdas_con_errores, target_lang_code):
"""
Marca las celdas con errores en rojo en el archivo maestro Excel.
:param archivo_maestro: Ruta del archivo maestro Excel.
:param celdas_con_errores: Diccionario con las celdas a marcar {indice_maestro: mensaje_error}.
:param target_lang_code: Código del idioma objetivo.
"""
workbook = load_workbook(archivo_maestro)
sheet = workbook.active
# Encontrar la columna del idioma objetivo
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
# Marcar celdas con errores
for indice_maestro, mensaje_error in celdas_con_errores.items():
row = indice_maestro + 2 # +2 porque Excel empieza en 1 y tiene encabezados
cell = sheet.cell(row=row, column=target_col)
cell.font = Font(color="FF0000") # Texto en rojo
# Añadir un comentario con el mensaje de error
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(tipo_PLC, codigo_columna_maestra, seleccion_idioma): def run(tipo_PLC, codigo_columna_maestra, seleccion_idioma):
archivo_maestro = f".\\data\\1_hmi_master_translates_{tipo_PLC}.xlsx" archivo_maestro = f".\\data\\1_hmi_master_translates_{tipo_PLC}.xlsx"
archivo_to_update = fc.select_file("xlsx") archivo_to_update = fc.select_file("xlsx")
@ -85,4 +131,4 @@ if __name__ == "__main__":
codigo_columna_maestra = "it-IT" codigo_columna_maestra = "it-IT"
fc.mostrar_idiomas() fc.mostrar_idiomas()
seleccion_idioma = int(input("Introduce el número del idioma de destino: ")) seleccion_idioma = int(input("Introduce el número del idioma de destino: "))
run(tipo_PLC, codigo_columna_maestra) run(tipo_PLC, codigo_columna_maestra, seleccion_idioma)