Funcionando con el agregado de x4B y la funcion de caracteres especiales para los enter
This commit is contained in:
parent
b38453248b
commit
8d1eadb49f
Binary file not shown.
Binary file not shown.
Binary file not shown.
30
config.ini
30
config.ini
|
@ -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.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
57483
logs/translate_log.log
57483
logs/translate_log.log
File diff suppressed because it is too large
Load Diff
|
@ -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)
|
||||||
|
|
|
@ -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)
|
|
@ -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,11 +37,38 @@ 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 run(tipo_PLC, codigo_columna_maestra, seleccion_idioma , nivel_afinidad_minimo):
|
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):
|
||||||
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"
|
||||||
|
|
||||||
|
@ -53,13 +76,12 @@ def run(tipo_PLC, codigo_columna_maestra, seleccion_idioma , nivel_afinidad_mini
|
||||||
print("Selección inválida.")
|
print("Selección inválida.")
|
||||||
else:
|
else:
|
||||||
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()
|
||||||
|
|
|
@ -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,20 +62,61 @@ 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 run(tipo_PLC, codigo_columna_maestra, seleccion_idioma) :
|
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):
|
||||||
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")
|
||||||
if archivo_to_update:
|
if archivo_to_update:
|
||||||
|
@ -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)
|
Loading…
Reference in New Issue