HMI_Translate_Helper_wMaste.../x2_master_export2translate.py

137 lines
4.5 KiB
Python

import pandas as pd
import os
import PyLibrary.funciones_comunes as fc
from translation_config import TranslationConfig
import langid
from openpyxl import load_workbook
from openpyxl.styles import PatternFill, Alignment, Font
from collections import defaultdict
# Definir el logger a nivel de módulo
logger = None
def configurar_detector_idiomas():
codigos_idioma = [code.split("-")[0] for _, code in fc.IDIOMAS.values()]
langid.set_languages(codigos_idioma)
def detectar_idioma(texto, tipo_PLC):
texto_limpio = fc.limpiar_texto(tipo_PLC, texto)
if len(texto_limpio.strip()) < 3: # No detectar idioma en textos muy cortos
return "unknown"
try:
idioma, _ = langid.classify(texto_limpio)
return idioma
except:
return "unknown"
def obtener_nombre_idioma(codigo_corto):
for nombre, codigo in fc.IDIOMAS.values():
if codigo.startswith(codigo_corto):
return nombre
return "Desconocido"
def exportar_para_traduccion(config: TranslationConfig):
master_path = config.get_master_path()
if not os.path.exists(master_path):
print("El archivo maestro no existe.")
return
configurar_detector_idiomas()
df_maestro = fc.read_dataframe_with_cleanup_retries(master_path)
df_export = pd.DataFrame()
primera_columna = df_maestro.columns[0]
df_export[primera_columna] = df_maestro[primera_columna]
df_export[config.codigo_idioma_seleccionado] = df_maestro[
config.codigo_idioma_seleccionado
]
df_export["Idioma_Detectado"] = ""
ruta_export = config.get_translate_path()
with pd.ExcelWriter(ruta_export, engine="openpyxl") as writer:
df_export.to_excel(writer, index=False, sheet_name="Sheet1")
workbook = writer.book
worksheet = writer.sheets["Sheet1"]
wrap_alignment = Alignment(wrap_text=True, vertical="top")
for col in ["A", "B"]:
for cell in worksheet[col]:
cell.alignment = wrap_alignment
worksheet.column_dimensions[col].width = 50
idioma_esperado = fc.idiomas_shortcodefromcode(
config.codigo_idioma_seleccionado
)
fill = PatternFill(start_color="ADD8E6", end_color="ADD8E6", fill_type="solid")
bold_font = Font(bold=True)
total_rows = worksheet.max_row - 1 # Excluimos la fila de encabezado
progress_bar = fc.ProgressBar(
total_rows, prefix="Procesando filas:", suffix="Completado"
)
print("Iniciando procesamiento de filas...")
texto_a_filas = defaultdict(list)
for row in range(2, worksheet.max_row + 1):
texto = worksheet.cell(row=row, column=2).value
if texto:
texto_limpio = fc.limpiar_texto(config.codigo_tipo_PLC, texto)
# Solo considerar para duplicados si el texto limpio es igual al original
if texto == texto_limpio:
texto_a_filas[texto].append(row)
# Detectar idioma y marcar si es incorrecto
idioma_detectado = detectar_idioma(texto, config.codigo_tipo_PLC)
if (
idioma_detectado != "unknown"
and idioma_detectado != idioma_esperado
):
worksheet.cell(row=row, column=2).fill = fill
nombre_idioma = obtener_nombre_idioma(idioma_detectado)
worksheet.cell(row=row, column=3).value = nombre_idioma
progress_bar.increment()
# Marcar celdas duplicadas en negrita
celdas_duplicadas = 0
for filas in texto_a_filas.values():
if len(filas) > 1:
for row in filas:
cell = worksheet.cell(row=row, column=2)
cell.font = bold_font
celdas_duplicadas += len(filas)
progress_bar.finish()
print(f"\nArchivo exportado para traducción: {ruta_export}")
print("Las celdas con idioma incorrecto han sido marcadas en azul.")
print(
"Se ha añadido el nombre del idioma detectado cuando es diferente del esperado."
)
print(
f"Se han marcado {celdas_duplicadas} celdas en negrita por tener texto duplicado en la columna del idioma seleccionado."
)
def run(config: TranslationConfig):
global logger
logger = fc.configurar_logger(config.work_dir)
script_name = os.path.basename(__file__)
print(f"\rIniciando: {script_name}\r")
exportar_para_traduccion(config)
if __name__ == "__main__":
import menu_pasos_traduccion
menu_pasos_traduccion.main()