Compare commits
3 Commits
f90140d78e
...
db0d5026b0
Author | SHA1 | Date |
---|---|---|
Miguel | db0d5026b0 | |
Miguel | c037c001fc | |
Miguel | 7fe8de819d |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,101 @@
|
||||||
|
[Seleccion]
|
||||||
|
tipo_plc = AllenBradley
|
||||||
|
codigo_columna_maestra = English_US
|
||||||
|
idioma_var = Spanish
|
||||||
|
idioma_var2 = English_US
|
||||||
|
|
||||||
|
[TextContent]
|
||||||
|
output_text = Ejecutando x1_importar_to_master.run()
|
||||||
|
Se han agregado 929 nuevas filas al archivo maestro.
|
||||||
|
Ejecutando x2_master_export2translate.run()
|
||||||
|
Archivo guardado exitosamente.
|
||||||
|
Archivo exportado para traducción: .\data\2_master_export2translate_allenbradley.xlsx
|
||||||
|
Ejecutando x3_llm_auto_translate.run()
|
||||||
|
Número total de textos a traducir: 621
|
||||||
|
Traduciendo : celdas desde: 0 a :20.
|
||||||
|
Traduciendo : celdas desde: 20 a :40.
|
||||||
|
Traduciendo : celdas desde: 40 a :60.
|
||||||
|
Traduciendo : celdas desde: 60 a :80.
|
||||||
|
Traduciendo : celdas desde: 80 a :100.
|
||||||
|
Traduciendo : celdas desde: 100 a :120.
|
||||||
|
Traduciendo : celdas desde: 120 a :140.
|
||||||
|
Traduciendo : celdas desde: 140 a :160.
|
||||||
|
Traduciendo : celdas desde: 160 a :180.
|
||||||
|
Traduciendo : celdas desde: 180 a :200.
|
||||||
|
Traduciendo : celdas desde: 200 a :220.
|
||||||
|
Traduciendo : celdas desde: 220 a :240.
|
||||||
|
Traduciendo : celdas desde: 240 a :260.
|
||||||
|
Error en el intento 1 de traducción de celdas desde 240 a 260: La cantidad de traducciones recibidas no coincide con la cantidad de textos enviados.. Reintentando...
|
||||||
|
Traduciendo : celdas desde: 260 a :280.
|
||||||
|
Traduciendo : celdas desde: 280 a :300.
|
||||||
|
Traduciendo : celdas desde: 300 a :320.
|
||||||
|
Traduciendo : celdas desde: 320 a :340.
|
||||||
|
Traduciendo : celdas desde: 340 a :360.
|
||||||
|
Traduciendo : celdas desde: 360 a :380.
|
||||||
|
Traduciendo : celdas desde: 380 a :400.
|
||||||
|
Traduciendo : celdas desde: 400 a :420.
|
||||||
|
Traduciendo : celdas desde: 420 a :440.
|
||||||
|
Traduciendo : celdas desde: 440 a :460.
|
||||||
|
Traduciendo : celdas desde: 460 a :480.
|
||||||
|
Traduciendo : celdas desde: 480 a :500.
|
||||||
|
Traduciendo : celdas desde: 500 a :520.
|
||||||
|
Traduciendo : celdas desde: 520 a :540.
|
||||||
|
Traduciendo : celdas desde: 540 a :560.
|
||||||
|
Traduciendo : celdas desde: 560 a :580.
|
||||||
|
Traduciendo : celdas desde: 580 a :600.
|
||||||
|
Traduciendo : celdas desde: 600 a :620.
|
||||||
|
Traduciendo : celdas desde: 620 a :621.
|
||||||
|
Afinidad: celdas desde: 0 a :20.
|
||||||
|
Error en el intento 1 de Afinidad de celdas desde 0 a 20: La cantidad de afinidades recibidas no coincide con la cantidad de textos enviados.. Reintentando...
|
||||||
|
Error en todos los intentos de Afinidad de celdas desde 0 a 20: La cantidad de afinidades recibidas no coincide con la cantidad de textos enviados.
|
||||||
|
Afinidad: celdas desde: 20 a :40.
|
||||||
|
Afinidad: celdas desde: 40 a :60.
|
||||||
|
Afinidad: celdas desde: 60 a :80.
|
||||||
|
Afinidad: celdas desde: 80 a :100.
|
||||||
|
Error en el intento 1 de Afinidad de celdas desde 80 a 100: La cantidad de afinidades recibidas no coincide con la cantidad de textos enviados.. Reintentando...
|
||||||
|
Error en todos los intentos de Afinidad de celdas desde 80 a 100: La cantidad de afinidades recibidas no coincide con la cantidad de textos enviados.
|
||||||
|
Afinidad: celdas desde: 100 a :120.
|
||||||
|
Afinidad: celdas desde: 120 a :140.
|
||||||
|
Error en el intento 1 de Afinidad de celdas desde 120 a 140: La cantidad de afinidades recibidas no coincide con la cantidad de textos enviados.. Reintentando...
|
||||||
|
Error en todos los intentos de Afinidad de celdas desde 120 a 140: La cantidad de afinidades recibidas no coincide con la cantidad de textos enviados.
|
||||||
|
Afinidad: celdas desde: 140 a :160.
|
||||||
|
Afinidad: celdas desde: 160 a :180.
|
||||||
|
Afinidad: celdas desde: 180 a :200.
|
||||||
|
Afinidad: celdas desde: 200 a :220.
|
||||||
|
Afinidad: celdas desde: 220 a :240.
|
||||||
|
Afinidad: celdas desde: 240 a :260.
|
||||||
|
Afinidad: celdas desde: 260 a :280.
|
||||||
|
Afinidad: celdas desde: 280 a :300.
|
||||||
|
Afinidad: celdas desde: 300 a :320.
|
||||||
|
Afinidad: celdas desde: 320 a :340.
|
||||||
|
Afinidad: celdas desde: 340 a :360.
|
||||||
|
Afinidad: celdas desde: 360 a :380.
|
||||||
|
Error en el intento 1 de Afinidad de celdas desde 360 a 380: La cantidad de afinidades recibidas no coincide con la cantidad de textos enviados.. Reintentando...
|
||||||
|
Error en todos los intentos de Afinidad de celdas desde 360 a 380: La cantidad de afinidades recibidas no coincide con la cantidad de textos enviados.
|
||||||
|
Afinidad: celdas desde: 380 a :400.
|
||||||
|
Afinidad: celdas desde: 400 a :420.
|
||||||
|
Afinidad: celdas desde: 420 a :440.
|
||||||
|
Afinidad: celdas desde: 440 a :460.
|
||||||
|
Afinidad: celdas desde: 460 a :480.
|
||||||
|
Afinidad: celdas desde: 480 a :500.
|
||||||
|
Afinidad: celdas desde: 500 a :520.
|
||||||
|
Afinidad: celdas desde: 520 a :540.
|
||||||
|
Afinidad: celdas desde: 540 a :560.
|
||||||
|
Afinidad: celdas desde: 560 a :580.
|
||||||
|
Afinidad: celdas desde: 580 a :600.
|
||||||
|
Afinidad: celdas desde: 600 a :620.
|
||||||
|
Afinidad: celdas desde: 620 a :621.
|
||||||
|
Archivo guardado exitosamente.
|
||||||
|
Archivo traducido guardado en: .\data\3_master_export2translate_translated_allenbradley.xlsx
|
||||||
|
Ejecutando x4_integrate_translates_to_master.run()
|
||||||
|
Archivo guardado exitosamente.
|
||||||
|
Traducciones importadas y archivo maestro actualizado: .\data\1_hmi_master_translates_allenbradley.xlsx.
|
||||||
|
Ejecutando x5_complete_empty_cells_master.run()
|
||||||
|
Archivo guardado exitosamente.
|
||||||
|
Traducciones importadas y archivo maestro actualizado: .\data\1_hmi_master_translates_allenbradley.xlsx.
|
||||||
|
Ejecutando x6_update_from_master.run()
|
||||||
|
Archivo guardado exitosamente.
|
||||||
|
Se han actualizado las filas en C:/Trabajo/VM/31 - 9.3953 - Omega - Mexico - (ABradley)/Reporte/HMI/HMI_93953_25.xlsx desde el archivo maestro.
|
||||||
|
|
||||||
|
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -14,9 +14,67 @@ IDIOMAS = {
|
||||||
4: ("Russian", "ru-RU"),
|
4: ("Russian", "ru-RU"),
|
||||||
5: ("French", "fr-FR"),
|
5: ("French", "fr-FR"),
|
||||||
6: ("German", "de-DE"),
|
6: ("German", "de-DE"),
|
||||||
|
7: ("English_US", "en-US"),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Función para obtener el shortcode a partir del código completo
|
||||||
|
def idiomas_shortcodefromcode(code):
|
||||||
|
if code:
|
||||||
|
return code.split('-')[0]
|
||||||
|
return None # O puedes lanzar una excepción si prefieres
|
||||||
|
|
||||||
|
# Función para obtener el idioma a partir del código
|
||||||
|
def idiomas_idiomafromcode(code):
|
||||||
|
for idx, (idioma, codigo) in IDIOMAS.items():
|
||||||
|
if codigo == code:
|
||||||
|
return idioma
|
||||||
|
return None # O puedes lanzar una excepción si prefieres
|
||||||
|
|
||||||
|
# Función para obtener el código a partir del idioma
|
||||||
|
def idiomas_codefromidioma(idioma):
|
||||||
|
for idx, (nombre_idioma, codigo) in IDIOMAS.items():
|
||||||
|
if nombre_idioma == idioma:
|
||||||
|
return codigo
|
||||||
|
return None # O lanzar una excepción
|
||||||
|
|
||||||
|
# Función para verificar si un código existe
|
||||||
|
def idiomas_existecode(code):
|
||||||
|
return any(codigo == code for idx, (idioma, codigo) in IDIOMAS.items())
|
||||||
|
|
||||||
|
# Función para verificar si un idioma existe
|
||||||
|
def idiomas_existeidioma(idioma):
|
||||||
|
return any(nombre_idioma == idioma for idx, (nombre_idioma, codigo) in IDIOMAS.items())
|
||||||
|
|
||||||
|
# Función para obtener el idioma a partir del índice
|
||||||
|
def idiomas_idiomafromindex(index):
|
||||||
|
if index in IDIOMAS:
|
||||||
|
return IDIOMAS[index][0]
|
||||||
|
else:
|
||||||
|
return None # O lanzar una excepción
|
||||||
|
|
||||||
|
# Función para obtener el código a partir del índice
|
||||||
|
def idiomas_codefromindex(index):
|
||||||
|
if index in IDIOMAS:
|
||||||
|
return IDIOMAS[index][1]
|
||||||
|
else:
|
||||||
|
return None # O lanzar una excepción
|
||||||
|
|
||||||
|
# Función para obtener el índice a partir del código
|
||||||
|
def idiomas_indexfromcode(code):
|
||||||
|
for idx, (idioma, codigo) in IDIOMAS.items():
|
||||||
|
if codigo == code:
|
||||||
|
return idx
|
||||||
|
return None # O lanzar una excepción
|
||||||
|
|
||||||
|
# Función para obtener el índice a partir del idioma
|
||||||
|
def idiomas_indexfromidioma(idioma):
|
||||||
|
for idx, (nombre_idioma, codigo) in IDIOMAS.items():
|
||||||
|
if nombre_idioma == idioma:
|
||||||
|
return idx
|
||||||
|
return None # O lanzar una excepción
|
||||||
|
|
||||||
|
|
||||||
def mostrar_idiomas():
|
def mostrar_idiomas():
|
||||||
print("Selecciona el idioma de destino:")
|
print("Selecciona el idioma de destino:")
|
||||||
for numero, (nombre, _) in IDIOMAS.items():
|
for numero, (nombre, _) in IDIOMAS.items():
|
||||||
|
@ -86,18 +144,11 @@ def es_columna_tipo_xxYY(columna):
|
||||||
return bool(re.match(r"^[a-z]{2}-[A-Z]{2}$", columna))
|
return bool(re.match(r"^[a-z]{2}-[A-Z]{2}$", columna))
|
||||||
|
|
||||||
|
|
||||||
def compactar_celda_clave_siemens(celda_original):
|
def compactar_celda_clave(tipo_PLC, celda_original):
|
||||||
if pd.isnull(celda_original):
|
if tipo_PLC == "siemens" :
|
||||||
return celda_original
|
return compactar_celda_clave_siemens(celda_original)
|
||||||
|
else :
|
||||||
def reemplazar(match):
|
return compactar_celda_clave_ab(celda_original)
|
||||||
if match.group(1): # Si hay contenido dentro de <>
|
|
||||||
return f"<{match.group(1)}>"
|
|
||||||
return "[[digits]]"
|
|
||||||
|
|
||||||
# Reemplaza dígitos fuera de <> con [[digits]], y preserva el contenido dentro de <>
|
|
||||||
return re.sub(r"<(.*?)>|\d+", reemplazar, str(celda_original))
|
|
||||||
|
|
||||||
|
|
||||||
def compactar_celda_traducida(tipo_PLC, celda_traducida):
|
def compactar_celda_traducida(tipo_PLC, celda_traducida):
|
||||||
if tipo_PLC == "siemens" :
|
if tipo_PLC == "siemens" :
|
||||||
|
@ -113,15 +164,28 @@ def obtener_digitos_celda_original(tipo_PLC, celda_original):
|
||||||
|
|
||||||
def decompactar_celda_traducida(tipo_PLC, celda_original, celda_traducida):
|
def decompactar_celda_traducida(tipo_PLC, celda_original, celda_traducida):
|
||||||
if tipo_PLC == "siemens" :
|
if tipo_PLC == "siemens" :
|
||||||
decompactar_celda_traducida_siemens(celda_original, celda_traducida)
|
return decompactar_celda_traducida_siemens(celda_original, celda_traducida)
|
||||||
else :
|
else :
|
||||||
decompactar_celda_traducida_ab(celda_original, celda_traducida)
|
return decompactar_celda_traducida_ab(celda_original, celda_traducida)
|
||||||
|
|
||||||
def verificar_celda_traducida(tipo_PLC, celda_clave, celda_traducida):
|
def verificar_celda_traducida(tipo_PLC, celda_clave, celda_traducida):
|
||||||
if tipo_PLC == "siemens" :
|
if tipo_PLC == "siemens" :
|
||||||
verificar_celda_traducida_siemens(celda_clave, celda_traducida)
|
return verificar_celda_traducida_siemens(celda_clave, celda_traducida)
|
||||||
else :
|
else :
|
||||||
verificar_celda_traducida_ab(celda_clave, celda_traducida)
|
return verificar_celda_traducida_ab(celda_clave, celda_traducida)
|
||||||
|
|
||||||
|
def texto_requiere_traduccion(tipo_PLC, texto, logger):
|
||||||
|
if tipo_PLC == "siemens" :
|
||||||
|
return texto_requiere_traduccion_siemens(texto, logger)
|
||||||
|
else :
|
||||||
|
return texto_requiere_traduccion_ab(texto, logger)
|
||||||
|
|
||||||
|
def texto_con_campos_especiales(tipo_PLC, texto):
|
||||||
|
if tipo_PLC == "siemens" :
|
||||||
|
return texto_con_campos_especiales_siemens(texto)
|
||||||
|
else :
|
||||||
|
return texto_con_campos_especiales_ab(texto)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# SIEMENS
|
# SIEMENS
|
||||||
|
@ -143,6 +207,25 @@ def compactar_celda_clave_siemens(celda_original):
|
||||||
return re.sub(r"<(.*?)>|\d+", reemplazar, str(celda_original))
|
return re.sub(r"<(.*?)>|\d+", reemplazar, str(celda_original))
|
||||||
|
|
||||||
|
|
||||||
|
# SIEMENS
|
||||||
|
def texto_requiere_traduccion_siemens(texto, logger):
|
||||||
|
palabras = re.findall(r"\b\w{4,}\b", texto)
|
||||||
|
campos_especiales = re.findall(r"<.*?>", texto)
|
||||||
|
requiere_traduccion = len(palabras) > 0 or len(campos_especiales) != len(
|
||||||
|
re.findall(r"<#>", texto)
|
||||||
|
)
|
||||||
|
logger.debug(
|
||||||
|
f"Decisión de traducción para texto '{texto}': {'Sí' if requiere_traduccion else 'No'} (palabras > 3 letras: {len(palabras) > 0}, solo campos especiales: {len(campos_especiales) == len(re.findall(r'<#>', texto))})"
|
||||||
|
)
|
||||||
|
return requiere_traduccion
|
||||||
|
|
||||||
|
# SIEMENS
|
||||||
|
def texto_con_campos_especiales_siemens(texto):
|
||||||
|
campos_especiales = len(re.findall(r"<#>", texto) )
|
||||||
|
return campos_especiales > 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# SIEMENS
|
# SIEMENS
|
||||||
#
|
#
|
||||||
# Transforma: "A[[digits]]/[[digits]]/[[digits]] Air - M<field ref="[[digits]]" /> - Necessaria Manutenzione Filtro" ->
|
# Transforma: "A[[digits]]/[[digits]]/[[digits]] Air - M<field ref="[[digits]]" /> - Necessaria Manutenzione Filtro" ->
|
||||||
|
@ -152,7 +235,7 @@ def compactar_celda_clave_siemens(celda_original):
|
||||||
def compactar_celda_traducida_siemens(celda_traducida):
|
def compactar_celda_traducida_siemens(celda_traducida):
|
||||||
if pd.isnull(celda_traducida):
|
if pd.isnull(celda_traducida):
|
||||||
return celda_traducida
|
return celda_traducida
|
||||||
celda_traducida = compactar_celda_clave(celda_traducida)
|
celda_traducida = compactar_celda_clave_siemens(celda_traducida)
|
||||||
|
|
||||||
def reemplazar(match):
|
def reemplazar(match):
|
||||||
if match.group(1): # Si hay contenido dentro de <>
|
if match.group(1): # Si hay contenido dentro de <>
|
||||||
|
@ -184,7 +267,7 @@ def obtener_digitos_celda_original_siemens(celda_original):
|
||||||
#
|
#
|
||||||
# Este procesamiento se aplica a las celdas traducidas para regresar al valor original
|
# Este procesamiento se aplica a las celdas traducidas para regresar al valor original
|
||||||
def decompactar_celda_traducida_siemens(celda_original, celda_traducida):
|
def decompactar_celda_traducida_siemens(celda_original, celda_traducida):
|
||||||
digitos = obtener_digitos_celda_original(celda_original)
|
digitos = obtener_digitos_celda_original_siemens(celda_original)
|
||||||
celda_destino = celda_traducida
|
celda_destino = celda_traducida
|
||||||
|
|
||||||
# Replace <> with digits
|
# Replace <> with digits
|
||||||
|
@ -222,6 +305,26 @@ def verificar_celda_traducida_siemens(celda_clave, celda_traducida):
|
||||||
text_error += f" - Tags en clave: {tags_clave}, Tags en traducida: {tags_traducida}"
|
text_error += f" - Tags en clave: {tags_clave}, Tags en traducida: {tags_traducida}"
|
||||||
return False, text_error
|
return False, text_error
|
||||||
|
|
||||||
|
|
||||||
|
# ALLEN BRADLEY
|
||||||
|
def texto_requiere_traduccion_ab(texto, logger):
|
||||||
|
palabras = re.findall(r"\b\w{4,}\b", texto)
|
||||||
|
campos_especiales = re.findall(r"/\*.*?\*/", texto)
|
||||||
|
total_palabras_largas = len(palabras) > 0
|
||||||
|
total_campos_especiales = len(campos_especiales)
|
||||||
|
total_campos_marcados = len(re.findall(r"/\*#\*/", texto))
|
||||||
|
solo_campos_especiales = total_campos_especiales == total_campos_marcados
|
||||||
|
requiere_traduccion = total_palabras_largas or not solo_campos_especiales
|
||||||
|
|
||||||
|
logger.debug(
|
||||||
|
f"Decisión de traducción para texto '{texto}': {'Sí' if requiere_traduccion else 'No'} "
|
||||||
|
f"(palabras > 3 letras: {total_palabras_largas}, "
|
||||||
|
f"solo campos especiales: {solo_campos_especiales})"
|
||||||
|
)
|
||||||
|
return requiere_traduccion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# ALLEN BRADLEY
|
# ALLEN BRADLEY
|
||||||
# Transforma: "A271/47/6 Air - M/*field ref="0" */ - Necessaria Manutenzione Filtro" ->
|
# Transforma: "A271/47/6 Air - M/*field ref="0" */ - Necessaria Manutenzione Filtro" ->
|
||||||
# "A[[digits]]/[[digits]]/[[digits]] Air - M/*field ref="[[digits]]" */ - Necessaria Manutenzione Filtro"
|
# "A[[digits]]/[[digits]]/[[digits]] Air - M/*field ref="[[digits]]" */ - Necessaria Manutenzione Filtro"
|
||||||
|
@ -317,37 +420,47 @@ def verificar_celda_traducida_ab(celda_clave, celda_traducida):
|
||||||
return False, text_error
|
return False, text_error
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# ALLEN BRADLEY
|
||||||
|
#
|
||||||
|
def texto_con_campos_especiales_ab(texto):
|
||||||
|
campos_especiales = len(re.findall(r"/\*#\*/", texto))
|
||||||
|
return campos_especiales > 0
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
# SIEMENS
|
# SIEMENS
|
||||||
|
print("****************** SIEMENS ***************************")
|
||||||
celda_original = 'A271/47/6 Air - M<field ref="0" /> - Necessaria Manutenzione Filtro'
|
celda_original = 'A271/47/6 Air - M<field ref="0" /> - Necessaria Manutenzione Filtro'
|
||||||
celda_original = 'DB<field ref="0" />/DB<field ref="1" />/DB<field ref="2" />'
|
celda_original = 'DB<field ref="0" />/DB<field ref="1" />/DB<field ref="2" />'
|
||||||
celda_original = 'Text<field ref="0" />'
|
celda_original = 'Text<field ref="0" />'
|
||||||
|
|
||||||
celda_clave = compactar_celda_clave(celda_original)
|
celda_clave = compactar_celda_clave_siemens(celda_original)
|
||||||
celda_tradc = compactar_celda_traducida(celda_original) + " TEXTO "
|
celda_tradc = compactar_celda_traducida_siemens(celda_original) + " TEXTO "
|
||||||
|
|
||||||
print()
|
print()
|
||||||
print("Celda Original : " +celda_original)
|
print("Celda Original : " +celda_original)
|
||||||
print("Celda Clave : " + celda_clave)
|
print("Celda Clave : " + celda_clave)
|
||||||
print("Celda Traducida: " + celda_tradc)
|
print("Celda Traducida: " + celda_tradc)
|
||||||
print("Digitos : " + ','.join(obtener_digitos_celda_original(celda_original)))
|
print("Digitos : " + ','.join(obtener_digitos_celda_original_siemens(celda_original)))
|
||||||
print("Celda : " + decompactar_celda_traducida(celda_original, celda_tradc))
|
print("Celda : " + decompactar_celda_traducida_siemens(celda_original, celda_tradc))
|
||||||
print("Celda Original : " + celda_original)
|
print("Celda Original : " + celda_original)
|
||||||
|
|
||||||
print(verificar_celda_traducida(celda_clave=celda_clave, celda_traducida= celda_tradc))
|
print(verificar_celda_traducida_siemens(celda_clave=celda_clave, celda_traducida= celda_tradc))
|
||||||
|
|
||||||
# ALLEN BRADLEY
|
# ALLEN BRADLEY
|
||||||
celda_original = 'Z2-A5-128: Drive Unload Channel Overload /*N:3 {[PLC_Connection]Buttons[#1].Program_Nr} NOFILL DP:0*/ - /*S:0 {[PLC_Connection]Buttons[#1].Program_Description}*/'
|
print("****************** ALLEN BRADLEY ***************************")
|
||||||
# Simulando una celda traducida después del procesamiento
|
celda_original = 'A271/47/6 /*N:4 {#1.#4.VFix[1]} NOFILL DP:1*/ m/min SPEED'
|
||||||
celda_traducida = 'Z[[digits]]-A[[digits]]-[[digits]]: Drive Unload Channel Overload /*#*/ - /*#*/'
|
|
||||||
|
|
||||||
celda_clave = compactar_celda_clave_ab(celda_original)
|
celda_clave = compactar_celda_clave_ab(celda_original)
|
||||||
celda_tradc = compactar_celda_traducida_ab(celda_traducida)
|
celda_tradc = compactar_celda_traducida_ab(celda_original) + " TEXTO "
|
||||||
|
|
||||||
print()
|
print()
|
||||||
print("Celda Original : " + celda_original)
|
print("Celda Original : " +celda_original)
|
||||||
print("Celda Clave : " + celda_clave)
|
print("Celda Clave : " + celda_clave)
|
||||||
print("Celda Traducida Compactada : " + celda_tradc)
|
print("Celda Traducida: " + celda_tradc)
|
||||||
print("Dígitos : " + ','.join(obtener_digitos_celda_original_ab(celda_original)))
|
print("Digitos : " + ','.join(obtener_digitos_celda_original_ab(celda_original)))
|
||||||
print("Celda Reconstituida : " + decompactar_celda_traducida_ab(celda_original, celda_tradc))
|
print("Celda : " + decompactar_celda_traducida_ab(celda_original, celda_tradc))
|
||||||
print("Verificación : ", verificar_celda_traducida_ab(celda_clave=celda_clave, celda_traducida=celda_tradc))
|
print("Celda Original : " + celda_original)
|
||||||
|
|
||||||
|
print(verificar_celda_traducida_ab(celda_clave=celda_clave, celda_traducida= celda_tradc))
|
||||||
|
|
40834
logs/translate_log.log
40834
logs/translate_log.log
File diff suppressed because it is too large
Load Diff
|
@ -8,148 +8,262 @@ import x3_llm_auto_translate
|
||||||
import x4_integrate_translates_to_master
|
import x4_integrate_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 threading
|
||||||
|
import configparser # Para manejar el archivo de configuración
|
||||||
|
import os # Para verificar si el archivo existe
|
||||||
|
|
||||||
# Crear la ventana principal
|
# Crear la ventana principal
|
||||||
ventana = tk.Tk()
|
ventana = tk.Tk()
|
||||||
ventana.title("Ayuda para traducir textos de TIA Portal y Allen Bradley")
|
ventana.title("Ayuda para traducir textos de TIA Portal y Allen Bradley")
|
||||||
ventana.geometry("600x550") # Aumentamos el tamaño para acomodar los nuevos widgets
|
ventana.geometry("800x600") # Ajustamos el tamaño de la ventana
|
||||||
|
|
||||||
# Opciones para tipo_PLC
|
# Diccionario para tipo_PLC
|
||||||
opciones_tipo_PLC = ['siemens', 'allenbradley']
|
tipo_PLC_dict = {'Siemens': 'siemens', 'AllenBradley': 'allenbradley'}
|
||||||
|
|
||||||
# Variables para almacenar las selecciones del usuario
|
# Variables para almacenar las selecciones del usuario
|
||||||
tipo_PLC_var = tk.StringVar()
|
tipo_PLC_var = tk.StringVar()
|
||||||
idioma_maestra_var = tk.StringVar()
|
codigo_columna_maestra_var = tk.StringVar()
|
||||||
idioma_var = tk.StringVar()
|
idioma_var = tk.StringVar()
|
||||||
idioma_var2 = tk.StringVar()
|
idioma_var2 = tk.StringVar()
|
||||||
|
|
||||||
# Crear listas de idiomas con sus códigos
|
# Crear listas de idiomas con sus códigos
|
||||||
idiomas_lista = sorted([(nombre, codigo) for _, (nombre, codigo) in fc.IDIOMAS.items()])
|
idiomas_lista = [(nombre, codigo) for _, (nombre, codigo) in fc.IDIOMAS.items()]
|
||||||
|
|
||||||
# Crear un combobox para seleccionar el tipo de PLC
|
# Ruta del archivo de configuración
|
||||||
label_tipo_PLC = tk.Label(ventana, text="Selecciona el tipo de PLC:")
|
config_file = 'config.ini'
|
||||||
combo_tipo_PLC = ttk.Combobox(ventana, textvariable=tipo_PLC_var, state="readonly")
|
|
||||||
combo_tipo_PLC["values"] = opciones_tipo_PLC
|
|
||||||
combo_tipo_PLC.current(0) # Selecciona 'siemens' por defecto
|
|
||||||
|
|
||||||
# Crear combobox para seleccionar el Idioma Columna Maestra
|
# Función para cargar las opciones guardadas
|
||||||
label_maestra = tk.Label(ventana, text="Idioma Columna Maestra:")
|
def cargar_configuracion():
|
||||||
combo_maestra = ttk.Combobox(ventana, textvariable=idioma_maestra_var, state="readonly")
|
config = configparser.ConfigParser()
|
||||||
combo_maestra["values"] = [nombre for nombre, _ in idiomas_lista]
|
if os.path.exists(config_file):
|
||||||
combo_maestra.current(0) # Selecciona el primer idioma por defecto
|
config.read(config_file)
|
||||||
|
# Cargar tipo_PLC
|
||||||
|
tipo_PLC_var.set(config.get('Seleccion', 'tipo_PLC', fallback='Siemens'))
|
||||||
|
# Cargar codigo_columna_maestra
|
||||||
|
codigo_columna_maestra_var.set(config.get('Seleccion', 'codigo_columna_maestra', fallback=idiomas_lista[0][0]))
|
||||||
|
# Cargar idioma_var
|
||||||
|
idioma_var.set(config.get('Seleccion', 'idioma_var', fallback=idiomas_lista[4][0]))
|
||||||
|
# Cargar idioma_var2
|
||||||
|
idioma_var2.set(config.get('Seleccion', 'idioma_var2', fallback=idiomas_lista[1][0]))
|
||||||
|
else:
|
||||||
|
# Valores por defecto si no existe el archivo
|
||||||
|
tipo_PLC_var.set('Siemens')
|
||||||
|
codigo_columna_maestra_var.set(idiomas_lista[0][0])
|
||||||
|
idioma_var.set(idiomas_lista[4][0])
|
||||||
|
idioma_var2.set(idiomas_lista[1][0])
|
||||||
|
|
||||||
# Crear comboboxes para seleccionar los idiomas
|
# Función para guardar las opciones seleccionadas
|
||||||
label_idioma1 = tk.Label(ventana, text="Selecciona el idioma principal:")
|
def guardar_configuracion():
|
||||||
combo = ttk.Combobox(ventana, textvariable=idioma_var, state="readonly")
|
config = configparser.ConfigParser()
|
||||||
|
config['Seleccion'] = {
|
||||||
|
'tipo_PLC': tipo_PLC_var.get(),
|
||||||
|
'codigo_columna_maestra': codigo_columna_maestra_var.get(),
|
||||||
|
'idioma_var': idioma_var.get(),
|
||||||
|
'idioma_var2': idioma_var2.get()
|
||||||
|
}
|
||||||
|
# Guardar el contenido del cuadro de texto
|
||||||
|
config['TextContent'] = {
|
||||||
|
'output_text': output_text.get("1.0", tk.END)
|
||||||
|
}
|
||||||
|
with open(config_file, 'w') as configfile:
|
||||||
|
config.write(configfile)
|
||||||
|
|
||||||
|
# Crear un Frame para la grilla de comboboxes
|
||||||
|
frame_combos = tk.Frame(ventana)
|
||||||
|
frame_combos.pack(pady=10)
|
||||||
|
|
||||||
|
# Crear los labels y comboboxes
|
||||||
|
label_tipo_PLC = tk.Label(frame_combos, text="Selecciona el tipo de PLC:")
|
||||||
|
combo_tipo_PLC = ttk.Combobox(frame_combos, textvariable=tipo_PLC_var, state="readonly")
|
||||||
|
combo_tipo_PLC["values"] = list(tipo_PLC_dict.keys())
|
||||||
|
|
||||||
|
label_codigo_maestra = tk.Label(frame_combos, text="Idioma Columna Maestra:")
|
||||||
|
combo_codigo_maestra = ttk.Combobox(frame_combos, textvariable=codigo_columna_maestra_var, state="readonly")
|
||||||
|
combo_codigo_maestra["values"] = [nombre for nombre, _ in idiomas_lista]
|
||||||
|
|
||||||
|
label1 = tk.Label(frame_combos, text="Idioma de Traducción:")
|
||||||
|
combo = ttk.Combobox(frame_combos, textvariable=idioma_var, state="readonly")
|
||||||
combo["values"] = [nombre for nombre, _ in idiomas_lista]
|
combo["values"] = [nombre for nombre, _ in idiomas_lista]
|
||||||
combo.current(1) # Selecciona el segundo idioma por defecto
|
|
||||||
|
|
||||||
label_idioma2 = tk.Label(ventana, text="Selecciona el segundo idioma:")
|
label2 = tk.Label(frame_combos, text="Selecciona segundo idioma:")
|
||||||
combo2 = ttk.Combobox(ventana, textvariable=idioma_var2, state="readonly")
|
combo2 = ttk.Combobox(frame_combos, textvariable=idioma_var2, state="readonly")
|
||||||
combo2["values"] = [nombre for nombre, _ in idiomas_lista]
|
combo2["values"] = [nombre for nombre, _ in idiomas_lista]
|
||||||
combo2.current(2) # Selecciona el tercer idioma por defecto
|
|
||||||
|
|
||||||
# Ubicar los widgets en la ventana
|
# Organizar los labels y comboboxes en una grilla 2x2
|
||||||
label_tipo_PLC.pack(pady=5)
|
label_tipo_PLC.grid(row=0, column=0, padx=5, pady=5, sticky='e')
|
||||||
combo_tipo_PLC.pack(pady=5)
|
combo_tipo_PLC.grid(row=0, column=1, padx=5, pady=5, sticky='w')
|
||||||
label_maestra.pack(pady=5)
|
|
||||||
combo_maestra.pack(pady=5)
|
|
||||||
label_idioma1.pack(pady=5)
|
|
||||||
combo.pack(pady=5)
|
|
||||||
label_idioma2.pack(pady=5)
|
|
||||||
combo2.pack(pady=5)
|
|
||||||
|
|
||||||
# Función para obtener el código del idioma seleccionado a partir del índice
|
label_codigo_maestra.grid(row=1, column=0, padx=5, pady=5, sticky='e')
|
||||||
def obtener_codigo_idioma(indice):
|
combo_codigo_maestra.grid(row=1, column=1, padx=5, pady=5, sticky='w')
|
||||||
return idiomas_lista[indice][1]
|
|
||||||
|
|
||||||
# Funciones que se llamarán cuando se presionen los botones
|
label1.grid(row=0, column=2, padx=5, pady=5, sticky='e')
|
||||||
def accion_boton1():
|
combo.grid(row=0, column=3, padx=5, pady=5, sticky='w')
|
||||||
tipo_PLC = tipo_PLC_var.get()
|
|
||||||
indice_maestra = combo_maestra.current()
|
|
||||||
codigo_columna_maestra = obtener_codigo_idioma(indice_maestra)
|
|
||||||
print("Ejecutando x1_importar_to_master.py")
|
|
||||||
x1_importar_to_master.run(tipo_PLC, codigo_columna_maestra)
|
|
||||||
|
|
||||||
def accion_boton2():
|
label2.grid(row=1, column=2, padx=5, pady=5, sticky='e')
|
||||||
tipo_PLC = tipo_PLC_var.get()
|
combo2.grid(row=1, column=3, padx=5, pady=5, sticky='w')
|
||||||
indice_maestra = combo_maestra.current()
|
|
||||||
codigo_columna_maestra = obtener_codigo_idioma(indice_maestra)
|
|
||||||
print("Ejecutando x2_master_export2translate.py")
|
|
||||||
x2_master_export2translate.run(tipo_PLC, codigo_columna_maestra)
|
|
||||||
|
|
||||||
def accion_boton3():
|
# Función para actualizar combo_codigo_maestra según la selección en combo_tipo_PLC
|
||||||
tipo_PLC = tipo_PLC_var.get()
|
def actualizar_codigo_maestra(event):
|
||||||
indice_maestra = combo_maestra.current()
|
plc_seleccionado = tipo_PLC_var.get()
|
||||||
codigo_columna_maestra = obtener_codigo_idioma(indice_maestra)
|
if plc_seleccionado == 'Siemens':
|
||||||
|
# Buscar el índice de 'Italian' en idiomas_lista
|
||||||
|
indice_italiano = next((i for i, (nombre, _) in enumerate(idiomas_lista) if nombre == 'Italian'), None)
|
||||||
|
if indice_italiano is not None:
|
||||||
|
combo_codigo_maestra.current(indice_italiano)
|
||||||
|
elif plc_seleccionado == 'AllenBradley':
|
||||||
|
# Buscar el índice de 'English_US' en idiomas_lista
|
||||||
|
indice_ingles = next((i for i, (nombre, _) in enumerate(idiomas_lista) if nombre == 'English_US'), None)
|
||||||
|
if indice_ingles is not None:
|
||||||
|
combo_codigo_maestra.current(indice_ingles)
|
||||||
|
guardar_configuracion() # Guardar la configuración cuando se cambia el tipo de PLC
|
||||||
|
|
||||||
|
# Vincular la función al evento de cambio de selección en combo_tipo_PLC
|
||||||
|
combo_tipo_PLC.bind('<<ComboboxSelected>>', actualizar_codigo_maestra)
|
||||||
|
|
||||||
|
# Vincular eventos de cambio en los comboboxes para guardar la configuración
|
||||||
|
def on_combobox_changed(event):
|
||||||
|
guardar_configuracion()
|
||||||
|
|
||||||
|
combo_codigo_maestra.bind('<<ComboboxSelected>>', on_combobox_changed)
|
||||||
|
combo.bind('<<ComboboxSelected>>', on_combobox_changed)
|
||||||
|
combo2.bind('<<ComboboxSelected>>', on_combobox_changed)
|
||||||
|
|
||||||
|
# Clase para redirigir la salida estándar a la caja de texto
|
||||||
|
class RedirectText(object):
|
||||||
|
def __init__(self, text_widget):
|
||||||
|
self.output = text_widget
|
||||||
|
|
||||||
|
def write(self, string):
|
||||||
|
self.output.insert(tk.END, string)
|
||||||
|
self.output.see(tk.END) # Desplaza hacia el final
|
||||||
|
|
||||||
|
def flush(self):
|
||||||
|
pass # No se requiere implementación para flush
|
||||||
|
|
||||||
|
# Función para obtener el código del idioma seleccionado a partir del nombre
|
||||||
|
def obtener_codigo_idioma_por_nombre(nombre_idioma):
|
||||||
|
for nombre, codigo in idiomas_lista:
|
||||||
|
if nombre == nombre_idioma:
|
||||||
|
return codigo
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Función para ejecutar las funciones run() y redirigir la salida
|
||||||
|
def ejecutar_run(funcion_run):
|
||||||
|
# Obtener los parámetros necesarios
|
||||||
|
tipo_PLC = tipo_PLC_dict[tipo_PLC_var.get()]
|
||||||
|
codigo_columna_maestra = obtener_codigo_idioma_por_nombre(codigo_columna_maestra_var.get())
|
||||||
|
codigo_idioma = obtener_codigo_idioma_por_nombre(idioma_var.get())
|
||||||
|
codigo_idioma2 = obtener_codigo_idioma_por_nombre(idioma_var2.get())
|
||||||
|
|
||||||
|
# Obtener los índices de los idiomas
|
||||||
|
indice_seleccionado = idiomas_lista.index((idioma_var.get(), codigo_idioma))
|
||||||
|
indice_seleccionado2 = idiomas_lista.index((idioma_var2.get(), codigo_idioma2))
|
||||||
|
|
||||||
|
# Redirigir stdout
|
||||||
|
original_stdout = sys.stdout
|
||||||
|
sys.stdout = RedirectText(output_text)
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Ejecutar la función correspondiente
|
||||||
|
if funcion_run == x1_importar_to_master.run:
|
||||||
|
print("Ejecutando x1_importar_to_master.run()")
|
||||||
|
funcion_run(tipo_PLC, codigo_columna_maestra)
|
||||||
|
elif funcion_run == x2_master_export2translate.run:
|
||||||
|
print("Ejecutando x2_master_export2translate.run()")
|
||||||
|
funcion_run(tipo_PLC, codigo_columna_maestra, indice_seleccionado)
|
||||||
|
elif funcion_run == x3_llm_auto_translate.run:
|
||||||
traducir_todo = messagebox.askyesno("Traducir todo", "¿Desea traducir todas las celdas?")
|
traducir_todo = messagebox.askyesno("Traducir todo", "¿Desea traducir todas las celdas?")
|
||||||
print("Ejecutando x3_llm_auto_translate.py")
|
print("Ejecutando x3_llm_auto_translate.run()")
|
||||||
x3_llm_auto_translate.run(tipo_PLC, codigo_columna_maestra, traducir_todo)
|
funcion_run(tipo_PLC, codigo_columna_maestra, indice_seleccionado, traducir_todo)
|
||||||
|
elif funcion_run == x4_integrate_translates_to_master.run:
|
||||||
def accion_boton4():
|
print("Ejecutando x4_integrate_translates_to_master.run()")
|
||||||
tipo_PLC = tipo_PLC_var.get()
|
funcion_run(tipo_PLC, codigo_columna_maestra, indice_seleccionado, 0.5)
|
||||||
indice_maestra = combo_maestra.current()
|
elif funcion_run == x5_complete_empty_cells_master.run:
|
||||||
codigo_columna_maestra = obtener_codigo_idioma(indice_maestra)
|
print("Ejecutando x5_complete_empty_cells_master.run()")
|
||||||
print("Ejecutando x4_integrate_translates_to_master.py")
|
funcion_run(tipo_PLC, codigo_columna_maestra, indice_seleccionado, indice_seleccionado2)
|
||||||
x4_integrate_translates_to_master.run(tipo_PLC, codigo_columna_maestra)
|
elif funcion_run == x6_update_from_master.run:
|
||||||
|
print("Ejecutando x6_update_from_master.run()")
|
||||||
def accion_boton5():
|
funcion_run(tipo_PLC, codigo_columna_maestra, indice_seleccionado)
|
||||||
tipo_PLC = tipo_PLC_var.get()
|
finally:
|
||||||
indice_maestra = combo_maestra.current()
|
# Restaurar stdout
|
||||||
codigo_columna_maestra = obtener_codigo_idioma(indice_maestra)
|
sys.stdout = original_stdout
|
||||||
indice_idioma1 = combo.current()
|
guardar_configuracion() # Guardar el contenido del cuadro de texto
|
||||||
codigo_columna_secundaria = obtener_codigo_idioma(indice_idioma1)
|
|
||||||
print("Ejecutando x5_complete_empty_cells_master.py")
|
|
||||||
x5_complete_empty_cells_master.run(tipo_PLC, codigo_columna_maestra, codigo_columna_secundaria)
|
|
||||||
|
|
||||||
def accion_boton6():
|
|
||||||
tipo_PLC = tipo_PLC_var.get()
|
|
||||||
indice_maestra = combo_maestra.current()
|
|
||||||
codigo_columna_maestra = obtener_codigo_idioma(indice_maestra)
|
|
||||||
print("Ejecutando x6_update_from_master.py")
|
|
||||||
x6_update_from_master.run(tipo_PLC, codigo_columna_maestra)
|
|
||||||
|
|
||||||
# Crear los botones con el mismo ancho
|
# Crear los botones con el mismo ancho
|
||||||
button_width = 70
|
button_width = 70
|
||||||
paso1 = tk.Button(ventana, text="1 - Importar al Master", command=accion_boton1, width=button_width)
|
paso1 = tk.Button(ventana, text="1 - Importar al Master", command=lambda: threading.Thread(target=ejecutar_run, args=(x1_importar_to_master.run,)).start(), width=button_width)
|
||||||
paso2 = tk.Button(
|
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)
|
||||||
ventana,
|
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)
|
||||||
text="2 - Exportar idioma a '2_master_export2translate.xlsx'",
|
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)
|
||||||
command=accion_boton2,
|
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)
|
||||||
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)
|
||||||
)
|
|
||||||
paso3 = tk.Button(
|
|
||||||
ventana,
|
|
||||||
text="3 - Traducir y generar '3_master_export2translate_translated.xlsx'",
|
|
||||||
command=accion_boton3,
|
|
||||||
width=button_width
|
|
||||||
)
|
|
||||||
paso4 = tk.Button(
|
|
||||||
ventana,
|
|
||||||
text="4 - Integrar las traducciones al '1_hmi_master_translates'",
|
|
||||||
command=accion_boton4,
|
|
||||||
width=button_width
|
|
||||||
)
|
|
||||||
paso5 = tk.Button(
|
|
||||||
ventana,
|
|
||||||
text="5 - Completar celdas vacías usando el segundo idioma",
|
|
||||||
command=accion_boton5,
|
|
||||||
width=button_width
|
|
||||||
)
|
|
||||||
paso6 = tk.Button(
|
|
||||||
ventana,
|
|
||||||
text="6 - Exportar desde '1_hmi_master_translates' al PLC",
|
|
||||||
command=accion_boton6,
|
|
||||||
width=button_width
|
|
||||||
)
|
|
||||||
|
|
||||||
# Ubicar los botones en la ventana
|
# Ubicar los botones en la ventana
|
||||||
paso1.pack(pady=5)
|
paso1.pack(pady=(10,2))
|
||||||
paso2.pack(pady=5)
|
paso2.pack(pady=2)
|
||||||
paso3.pack(pady=5)
|
paso3.pack(pady=2)
|
||||||
paso4.pack(pady=5)
|
paso4.pack(pady=2)
|
||||||
paso5.pack(pady=5)
|
paso5.pack(pady=2)
|
||||||
paso6.pack(pady=5)
|
paso6.pack(pady=2)
|
||||||
|
|
||||||
|
# Crear un Frame para el cuadro de texto, los scrollbars y el botón
|
||||||
|
frame_texto = tk.Frame(ventana)
|
||||||
|
frame_texto.pack(fill='both', expand=True, pady=10)
|
||||||
|
|
||||||
|
# Crear los scrollbars
|
||||||
|
scrollbar_vertical = tk.Scrollbar(frame_texto, orient='vertical')
|
||||||
|
scrollbar_horizontal = tk.Scrollbar(frame_texto, orient='horizontal')
|
||||||
|
|
||||||
|
# Crear la caja de texto para mostrar la salida
|
||||||
|
output_text = tk.Text(
|
||||||
|
frame_texto,
|
||||||
|
wrap='none',
|
||||||
|
yscrollcommand=scrollbar_vertical.set,
|
||||||
|
xscrollcommand=scrollbar_horizontal.set
|
||||||
|
)
|
||||||
|
|
||||||
|
# Configurar los scrollbars
|
||||||
|
scrollbar_vertical.config(command=output_text.yview)
|
||||||
|
scrollbar_horizontal.config(command=output_text.xview)
|
||||||
|
|
||||||
|
# Crear el botón para borrar el contenido
|
||||||
|
boton_limpiar = tk.Button(frame_texto, text="Borrar contenido", command=lambda: limpiar_texto())
|
||||||
|
|
||||||
|
# Ubicar los widgets en frame_texto usando grid
|
||||||
|
output_text.grid(row=0, column=0, sticky='nsew')
|
||||||
|
scrollbar_vertical.grid(row=0, column=1, sticky='ns')
|
||||||
|
scrollbar_horizontal.grid(row=1, column=0, sticky='ew')
|
||||||
|
boton_limpiar.grid(row=1, column=1, padx=5, pady=5)
|
||||||
|
|
||||||
|
# Configurar la expansión de filas y columnas
|
||||||
|
frame_texto.grid_rowconfigure(0, weight=1)
|
||||||
|
frame_texto.grid_columnconfigure(0, weight=1)
|
||||||
|
|
||||||
|
# Función para borrar el contenido del cuadro de texto
|
||||||
|
def limpiar_texto():
|
||||||
|
output_text.delete('1.0', tk.END)
|
||||||
|
guardar_configuracion()
|
||||||
|
|
||||||
|
# Cargar las opciones guardadas al iniciar
|
||||||
|
cargar_configuracion()
|
||||||
|
|
||||||
|
# Cargar el contenido del cuadro de texto desde la configuración
|
||||||
|
def cargar_texto():
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
if os.path.exists(config_file):
|
||||||
|
config.read(config_file)
|
||||||
|
texto = config.get('TextContent', 'output_text', fallback='')
|
||||||
|
output_text.insert('1.0', texto)
|
||||||
|
|
||||||
|
cargar_texto()
|
||||||
|
|
||||||
|
# Guardar la configuración al cerrar la ventana
|
||||||
|
def on_closing():
|
||||||
|
guardar_configuracion()
|
||||||
|
ventana.destroy()
|
||||||
|
|
||||||
|
ventana.protocol("WM_DELETE_WINDOW", on_closing)
|
||||||
|
|
||||||
# Iniciar el bucle principal de la interfaz
|
# Iniciar el bucle principal de la interfaz
|
||||||
ventana.mainloop()
|
ventana.mainloop()
|
||||||
|
|
|
@ -23,7 +23,7 @@ def exportar_para_traduccion(tipo_PLC, archivo_maestro, target_lang_code):
|
||||||
|
|
||||||
print(f"Archivo exportado para traducción: {ruta_export}")
|
print(f"Archivo exportado para traducción: {ruta_export}")
|
||||||
|
|
||||||
def run(tipo_PLC, 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"
|
||||||
if seleccion_idioma not in fc.IDIOMAS:
|
if seleccion_idioma not in fc.IDIOMAS:
|
||||||
print("Selección inválida.")
|
print("Selección inválida.")
|
||||||
|
|
|
@ -66,18 +66,6 @@ def translate_batch_ollama(texts, source_lang, target_lang):
|
||||||
return translations
|
return translations
|
||||||
|
|
||||||
|
|
||||||
def texto_requiere_traduccion(texto):
|
|
||||||
palabras = re.findall(r"\b\w{4,}\b", texto)
|
|
||||||
campos_especiales = re.findall(r"<.*?>", texto)
|
|
||||||
requiere_traduccion = len(palabras) > 0 or len(campos_especiales) != len(
|
|
||||||
re.findall(r"<#>", texto)
|
|
||||||
)
|
|
||||||
logger.debug(
|
|
||||||
f"Decisión de traducción para texto '{texto}': {'Sí' if requiere_traduccion else 'No'} (palabras > 3 letras: {len(palabras) > 0}, solo campos especiales: {len(campos_especiales) == len(re.findall(r'<#>', texto))})"
|
|
||||||
)
|
|
||||||
return requiere_traduccion
|
|
||||||
|
|
||||||
|
|
||||||
def translate_batch_openai(texts_dict, source_lang, target_lang):
|
def translate_batch_openai(texts_dict, source_lang, target_lang):
|
||||||
system_prompt = read_system_prompt()
|
system_prompt = read_system_prompt()
|
||||||
texts_list = list(texts_dict.values())
|
texts_list = list(texts_dict.values())
|
||||||
|
@ -110,13 +98,13 @@ def translate_batch_openai(texts_dict, source_lang, target_lang):
|
||||||
return dict(zip(texts_dict.keys(), translations))
|
return dict(zip(texts_dict.keys(), translations))
|
||||||
|
|
||||||
|
|
||||||
def affinity_batch_openai(texts_dict):
|
def affinity_batch_openai(tipo_PLC, texts_dict):
|
||||||
system_prompt = (
|
system_prompt = (
|
||||||
"Evaluate the semantic similarity between the following table of pairs of texts in json format on a scale from 0 to 1. "
|
"Evaluate the semantic similarity between the following table of pairs of texts in json format on a scale from 0 to 1. "
|
||||||
"Return the similarity scores for every row in JSON format as a list of numbers, without any additional text or formatting."
|
"Return the similarity scores for every row in JSON format as a list of numbers, without any additional text or formatting."
|
||||||
)
|
)
|
||||||
original_list = [
|
original_list = [
|
||||||
fc.compactar_celda_traducida(key) for key in texts_dict.keys()
|
fc.compactar_celda_traducida(tipo_PLC, key) for key in texts_dict.keys()
|
||||||
]
|
]
|
||||||
re_translated_list = list(texts_dict.values())
|
re_translated_list = list(texts_dict.values())
|
||||||
|
|
||||||
|
@ -167,13 +155,13 @@ def affinity_batch_openai(texts_dict):
|
||||||
|
|
||||||
|
|
||||||
# Función que calcula la afinidad entre dos textos
|
# Función que calcula la afinidad entre dos textos
|
||||||
def calcular_afinidad(texto1, texto2):
|
def calcular_afinidad(tipo_PLC, texto1, texto2):
|
||||||
system_prompt = (
|
system_prompt = (
|
||||||
"Evaluate the semantic similarity between the following pair of texts on a scale from 0 to 1. "
|
"Evaluate the semantic similarity between the following pair of texts on a scale from 0 to 1. "
|
||||||
"Return the similarity score as a single number."
|
"Return the similarity score as a single number."
|
||||||
)
|
)
|
||||||
|
|
||||||
original_text = fc.compactar_celda_traducida(texto1)
|
original_text = fc.compactar_celda_traducida(tipo_PLC, texto1)
|
||||||
compared_text = texto2
|
compared_text = texto2
|
||||||
|
|
||||||
request_payload = json.dumps({"original": original_text, "compared": compared_text})
|
request_payload = json.dumps({"original": original_text, "compared": compared_text})
|
||||||
|
@ -222,25 +210,25 @@ def main(tipo_PLC, codigo_columna_maestra, file_path, target_lang_code, target_l
|
||||||
|
|
||||||
texts_to_translate = {}
|
texts_to_translate = {}
|
||||||
|
|
||||||
for _, row in df.iterrows():
|
for index, row in df.iterrows():
|
||||||
celda_clave = str(row[source_col])
|
celda_clave = str(row[source_col])
|
||||||
source_translated_text = (
|
source_translated_text = (
|
||||||
str(row[source_translated_col])
|
str(row[source_translated_col])
|
||||||
if source_translated_col in df.columns
|
if source_translated_col in df.columns
|
||||||
else ""
|
else ""
|
||||||
)
|
)
|
||||||
celda_clave_compactada = fc.compactar_celda_traducida(celda_clave)
|
celda_clave_compactada = fc.compactar_celda_traducida(tipo_PLC, celda_clave)
|
||||||
|
|
||||||
if traducir_todo:
|
if traducir_todo:
|
||||||
if texto_requiere_traduccion(celda_clave_compactada):
|
if fc.texto_requiere_traduccion(tipo_PLC, celda_clave_compactada, logger):
|
||||||
df[row,source_translated_col] = '' # Necesita ser traducida. En esta iteracion o en la siguiente.
|
df.at[index, source_translated_col] = '' # Necesita ser traducida.
|
||||||
texts_to_translate[celda_clave] = celda_clave_compactada
|
texts_to_translate[celda_clave] = celda_clave_compactada
|
||||||
else:
|
else:
|
||||||
if (
|
if (
|
||||||
pd.isna(row[source_translated_col])
|
pd.isna(row[source_translated_col])
|
||||||
or source_translated_text.strip() == ""
|
or source_translated_text.strip() == ""
|
||||||
):
|
):
|
||||||
if texto_requiere_traduccion(celda_clave_compactada):
|
if fc.texto_requiere_traduccion(tipo_PLC, celda_clave_compactada, logger) or fc.texto_con_campos_especiales(tipo_PLC, celda_clave_compactada):
|
||||||
texts_to_translate[celda_clave] = celda_clave_compactada
|
texts_to_translate[celda_clave] = celda_clave_compactada
|
||||||
|
|
||||||
num_texts = len(texts_to_translate)
|
num_texts = len(texts_to_translate)
|
||||||
|
@ -262,7 +250,7 @@ def main(tipo_PLC, codigo_columna_maestra, file_path, target_lang_code, target_l
|
||||||
for attempt in range(retries):
|
for attempt in range(retries):
|
||||||
try:
|
try:
|
||||||
batch_translations = translate_batch_openai(
|
batch_translations = translate_batch_openai(
|
||||||
batch_texts, "Italian", target_lang
|
batch_texts, fc.idiomas_idiomafromcode(codigo_columna_maestra) , target_lang
|
||||||
)
|
)
|
||||||
translations.update(batch_translations)
|
translations.update(batch_translations)
|
||||||
break # Si la traducción es exitosa, salimos del bucle de reintentos
|
break # Si la traducción es exitosa, salimos del bucle de reintentos
|
||||||
|
@ -295,7 +283,7 @@ def main(tipo_PLC, codigo_columna_maestra, file_path, target_lang_code, target_l
|
||||||
df.at[index, target_col] = translations[celda_clave]
|
df.at[index, target_col] = translations[celda_clave]
|
||||||
# Realizar la traducción de verificación con Google Translate
|
# Realizar la traducción de verificación con Google Translate
|
||||||
try:
|
try:
|
||||||
google_translation = google_translate(translations[celda_clave], "it")
|
google_translation = google_translate(translations[celda_clave], fc.idiomas_shortcodefromcode(codigo_columna_maestra))
|
||||||
df.at[index, check_translate_col] = google_translation
|
df.at[index, check_translate_col] = google_translation
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(
|
logger.error(
|
||||||
|
@ -316,7 +304,7 @@ def main(tipo_PLC, codigo_columna_maestra, file_path, target_lang_code, target_l
|
||||||
retries = 2 # Número de intentos totales (1 inicial + 1 reintento)
|
retries = 2 # Número de intentos totales (1 inicial + 1 reintento)
|
||||||
for attempt in range(retries):
|
for attempt in range(retries):
|
||||||
try:
|
try:
|
||||||
batch_affinities = affinity_batch_openai(batch_texts)
|
batch_affinities = affinity_batch_openai(tipo_PLC, batch_texts)
|
||||||
affinities.update(batch_affinities)
|
affinities.update(batch_affinities)
|
||||||
break # Si la llamada es exitosa, salimos del bucle de reintentos
|
break # Si la llamada es exitosa, salimos del bucle de reintentos
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
@ -338,7 +326,7 @@ def main(tipo_PLC, codigo_columna_maestra, file_path, target_lang_code, target_l
|
||||||
# Intentar individualmente si falla en batch
|
# Intentar individualmente si falla en batch
|
||||||
for key, value in batch_texts.items():
|
for key, value in batch_texts.items():
|
||||||
try:
|
try:
|
||||||
score = calcular_afinidad(key, value)
|
score = calcular_afinidad(tipo_PLC, key, value)
|
||||||
affinities[key] = score
|
affinities[key] = score
|
||||||
except Exception as ind_e:
|
except Exception as ind_e:
|
||||||
affinities[key] = "0"
|
affinities[key] = "0"
|
||||||
|
|
|
@ -6,7 +6,7 @@ import logging
|
||||||
from manejoArchivos import select_file
|
from manejoArchivos import select_file
|
||||||
|
|
||||||
|
|
||||||
def complete_emptys(archivo_maestro, target_lang_code, second_lang_code):
|
def complete_emptys(tipo_PLC, archivo_maestro, target_lang_code, second_lang_code):
|
||||||
if not os.path.exists(archivo_maestro):
|
if not os.path.exists(archivo_maestro):
|
||||||
print("El archivo maestro no existe.")
|
print("El archivo maestro no existe.")
|
||||||
return
|
return
|
||||||
|
@ -33,7 +33,7 @@ def complete_emptys(archivo_maestro, target_lang_code, second_lang_code):
|
||||||
else:
|
else:
|
||||||
df_maestro.loc[
|
df_maestro.loc[
|
||||||
df_maestro[df_maestro.columns[0]] == clave, master_col
|
df_maestro[df_maestro.columns[0]] == clave, master_col
|
||||||
] = fc.compactar_celda_traducida(fila[df_maestro.columns[0]])
|
] = fc.compactar_celda_traducida(tipo_PLC, fila[df_maestro.columns[0]])
|
||||||
logger.info(
|
logger.info(
|
||||||
f'Fila {index}, Columna {master_col}: " actualizado a "{fila[df_maestro.columns[0]]}"'
|
f'Fila {index}, Columna {master_col}: " actualizado a "{fila[df_maestro.columns[0]]}"'
|
||||||
)
|
)
|
||||||
|
|
|
@ -6,7 +6,7 @@ import funciones_comunes as fc
|
||||||
from manejoArchivos import select_file
|
from manejoArchivos import select_file
|
||||||
|
|
||||||
|
|
||||||
def update_from_master(archivo_maestro, archivo_to_update, target_lang_code):
|
def update_from_master(tipo_PLC, archivo_maestro, archivo_to_update, target_lang_code):
|
||||||
if not os.path.exists(archivo_maestro):
|
if not os.path.exists(archivo_maestro):
|
||||||
print("El archivo maestro no existe.")
|
print("El archivo maestro no existe.")
|
||||||
return
|
return
|
||||||
|
@ -34,7 +34,7 @@ def update_from_master(archivo_maestro, archivo_to_update, target_lang_code):
|
||||||
df_maestro[col_clave] == clave, target_lang_code
|
df_maestro[col_clave] == clave, target_lang_code
|
||||||
].values[0]
|
].values[0]
|
||||||
# Descompactamos
|
# Descompactamos
|
||||||
valor_traducido = fc.decompactar_celda_traducida(
|
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
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ def update_from_master(archivo_maestro, archivo_to_update, target_lang_code):
|
||||||
and fila[target_lang_code] != valor_traducido
|
and fila[target_lang_code] != valor_traducido
|
||||||
):
|
):
|
||||||
# Salvamos en el file to Update
|
# Salvamos en el file to Update
|
||||||
okToSave, Error = fc.verificar_celda_traducida(
|
okToSave, Error = fc.verificar_celda_traducida(tipo_PLC,
|
||||||
valor_original, valor_traducido_compacto
|
valor_original, valor_traducido_compacto
|
||||||
)
|
)
|
||||||
if okToSave:
|
if okToSave:
|
||||||
|
@ -76,7 +76,7 @@ def run(tipo_PLC, codigo_columna_maestra, seleccion_idioma) :
|
||||||
print("Selección inválida.")
|
print("Selección inválida.")
|
||||||
else:
|
else:
|
||||||
_, target_lang_code = fc.IDIOMAS[seleccion_idioma]
|
_, target_lang_code = fc.IDIOMAS[seleccion_idioma]
|
||||||
update_from_master(archivo_maestro, archivo_to_update, target_lang_code)
|
update_from_master(tipo_PLC, archivo_maestro, archivo_to_update, target_lang_code)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
tipo_PLC = "siemens"
|
tipo_PLC = "siemens"
|
||||||
|
|
Loading…
Reference in New Issue