diff --git a/__pycache__/manejoArchivos.cpython-310.pyc b/__pycache__/manejoArchivos.cpython-310.pyc index cbe1d3e..04b55a9 100644 Binary files a/__pycache__/manejoArchivos.cpython-310.pyc and b/__pycache__/manejoArchivos.cpython-310.pyc differ diff --git a/data/1_hmi_master_translates.xlsx b/data/1_hmi_master_translates.xlsx deleted file mode 100644 index 0d34e9a..0000000 Binary files a/data/1_hmi_master_translates.xlsx and /dev/null differ diff --git a/data/2_master_export2translate.xlsx b/data/2_master_export2translate.xlsx deleted file mode 100644 index 588cb2d..0000000 Binary files a/data/2_master_export2translate.xlsx and /dev/null differ diff --git a/funciones_comunes/__pycache__/funciones_base.cpython-310.pyc b/funciones_comunes/__pycache__/funciones_base.cpython-310.pyc index 1c23d3b..f01d508 100644 Binary files a/funciones_comunes/__pycache__/funciones_base.cpython-310.pyc and b/funciones_comunes/__pycache__/funciones_base.cpython-310.pyc differ diff --git a/funciones_comunes/funciones_base.py b/funciones_comunes/funciones_base.py index 0880c9d..d5cc6fa 100644 --- a/funciones_comunes/funciones_base.py +++ b/funciones_comunes/funciones_base.py @@ -1,6 +1,9 @@ import re import time import pandas as pd +from openpyxl import load_workbook +import logging +import os # Diccionario de idiomas IDIOMAS = { @@ -13,25 +16,31 @@ IDIOMAS = { 6: ("German", "de-DE"), } + def mostrar_idiomas(): print("Selecciona el idioma de destino:") for numero, (nombre, _) in IDIOMAS.items(): print(f"{numero}: {nombre}") -def transformar_texto(texto): - if pd.isnull(texto): - return texto - # Sustituir [[digits]] por <> - texto_transformado = re.sub(r'\[\[digits\]\]', '<>', texto) - # Sustituir cualquier <...> por <#> - texto_transformado = re.sub(r'<.*?>', '<#>', texto_transformado) - return texto_transformado +def configurar_logger(): + logger = logging.getLogger("translate_logger") + logger.setLevel(logging.DEBUG) + os.makedirs(".\\logs", exist_ok=True) + fh = logging.FileHandler(".\\logs\\translate_log.log", encoding="utf-8") + fh.setLevel(logging.DEBUG) + formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s : ") + fh.setFormatter(formatter) + logger.addHandler(fh) + return logger +# +# Salvar archivo Excel controlando que no este abierto. Sino espera. +# def save_dataframe_with_retries(df, output_path, max_retries=5, retry_delay=5): """ Guarda un DataFrame en un archivo Excel, reintentando si el archivo está en uso. - + :param df: El DataFrame a guardar. :param output_path: La ruta del archivo donde se guardará el DataFrame. :param max_retries: El número máximo de reintentos en caso de error. @@ -40,12 +49,150 @@ def save_dataframe_with_retries(df, output_path, max_retries=5, retry_delay=5): retries = 0 while retries < max_retries: try: - df.to_excel(output_path, index=False) + df.to_excel(output_path, sheet_name="User Texts", index=False) print("Archivo guardado exitosamente.") return except PermissionError as e: - print(f"Error de permiso: {e}. Por favor cierre el archivo. Reintentando en {retry_delay} segundos...") + print( + f"Error de permiso: {e}. Por favor cierre el archivo. Reintentando en {retry_delay} segundos..." + ) retries += 1 time.sleep(retry_delay) + + print(f"No se pudo guardar el archivo después de {max_retries} intentos.") + + +def cambiar_nombre_hoja(archivo_excel, nombre_hoja_actual, nombre_hoja_nuevo): + # Cargar el archivo Excel existente + libro = load_workbook(archivo_excel) + + # Verificar si la hoja existe en el archivo + if nombre_hoja_actual in libro.sheetnames: + # Obtener la hoja actual + hoja = libro[nombre_hoja_actual] + # Cambiar el nombre de la hoja + hoja.title = nombre_hoja_nuevo + # Guardar los cambios en el archivo Excel + libro.save(archivo_excel) + print( + f"El nombre de la hoja ha sido cambiado de '{nombre_hoja_actual}' a '{nombre_hoja_nuevo}'." + ) + else: + print(f"La hoja '{nombre_hoja_actual}' no existe en el archivo.") + +# Verificar si la columna es del tipo "xx-YY" usando una expresión regular +def es_columna_tipo_xxYY(columna): + # Verificar si la columna es del tipo "xx-YY" usando una expresión regular + return bool(re.match(r"^[a-z]{2}-[A-Z]{2}$", columna)) + + +# +# Transforma: "A271/47/6 Air - M - Necessaria Manutenzione Filtro" -> +# "A[[digits]]/[[digits]]/[[digits]] Air - M - Necessaria Manutenzione Filtro" +# +# Este procesamiento se aplica a las celdas clave +def compactar_celda_clave(celda_original): + if pd.isnull(celda_original): + return celda_original - print(f"No se pudo guardar el archivo después de {max_retries} intentos.") \ No newline at end of file + def reemplazar(match): + 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)) + + +# +# Transforma: "A[[digits]]/[[digits]]/[[digits]] Air - M - Necessaria Manutenzione Filtro" -> +# "A<>/<>/<> Air - M<#>" /> - Necessaria Manutenzione Filtro" +# +# Este procesamiento se aplica a las celdas traducidas +def compactar_celda_traducida(celda_traducida): + if pd.isnull(celda_traducida): + return celda_traducida + celda_traducida = compactar_celda_clave(celda_traducida) + + def reemplazar(match): + if match.group(1): # Si hay contenido dentro de <> + return "<#>" + return "<>" + + # Reemplaza <...> con <#> y [[digits]] con <> + return re.sub(r"<(.*?)>|\[\[digits\]\]", reemplazar, str(celda_traducida)) + + +# de "A271/47/6 Air - M - Necessaria Manutenzione Filtro" -> [271,47,6] +# Obtener la secuencias de dígitos por [[digits]] +def obtener_digitos_celda_original(celda_original): + if pd.isnull(celda_original): + return [] + + # Primero, reemplazamos temporalmente el contenido de los tags con un marcador + texto_sin_tags = re.sub(r'<[^>]*>', '<>', str(celda_original)) + + # Ahora buscamos los dígitos + digitos = re.findall(r'\d+', texto_sin_tags) + + return digitos + + +# Original Traducida +# Transforma: "A271/47/6 Air - M - Necessaria Manutenzione Filtro" , "A<>/<>/<> Air - M<#> - Filter Maintenance Required" -> +# "A271/47/6 Air - M - Necessaria Manutenzione Filtro" +# +# Este procesamiento se aplica a las celdas traducidas para regresar al valor original +def decompactar_celda_traducida(celda_original, celda_traducida): + digitos = obtener_digitos_celda_original(celda_original) + celda_destino = celda_traducida + + # Replace <> with digits + for d in digitos: + celda_destino = celda_destino.replace("<>", d, 1) + + # Replace <#> with original content within <> + original_tags = re.findall(r"<.*?>", celda_original) + translated_tags = re.findall(r"<#>", celda_destino) + + for orig, trans in zip(original_tags, translated_tags): + celda_destino = celda_destino.replace(trans, orig, 1) + + return celda_destino + + +def verificar_celda_traducida(celda_clave, celda_traducida): + # Contar los placeholders de dígitos + digitos_clave = celda_clave.count("[[digits]]") + digitos_traducida = celda_traducida.count("<>") + + # Contar los placeholders de tags + tags_clave = sum(1 for tag in re.findall(r"<.*?>", celda_clave) if tag != "[[digits]]") + tags_traducida = celda_traducida.count("<#>") + + # Verificar si las cantidades coinciden + if digitos_clave == digitos_traducida and tags_clave == tags_traducida: + return True , "" + else: + text_error = f"Error de verificación:" + f" - Celda clave: {celda_clave}" + f" - Celda traducida: {celda_traducida}" + text_error += f" - Dígitos en clave: {digitos_clave}, Dígitos en traducida: {digitos_traducida}" + text_error += f" - Tags en clave: {tags_clave}, Tags en traducida: {tags_traducida}" + return False, text_error + +if __name__ == "__main__": + celda_original = 'A271/47/6 Air - M - Necessaria Manutenzione Filtro' + celda_original = 'DB/DB/DB' + celda_original = 'Text' + + celda_clave = compactar_celda_clave(celda_original) + celda_tradc = compactar_celda_traducida(celda_original) + " TEXTO " + + print() + print("Celda Original : " +celda_original) + print("Celda Clave : " + celda_clave) + print("Celda Traducida: " + celda_tradc) + print("Digitos : " + ','.join(obtener_digitos_celda_original(celda_original))) + print("Celda : " + decompactar_celda_traducida(celda_original, celda_tradc)) + print("Celda Original : " + celda_original) + + print(verificar_celda_traducida(celda_clave=celda_clave, celda_traducida= celda_tradc)) \ No newline at end of file diff --git a/logs/translate_log.log b/logs/translate_log.log new file mode 100644 index 0000000..ab15f59 --- /dev/null +++ b/logs/translate_log.log @@ -0,0 +1,416 @@ +2024-08-01 13:30:13,249 - INFO - .... : +2024-08-01 13:30:13,249 - INFO - Iniciando actualizacion en C:/Trabajo/VM/22 - 93841 - Sidel - Tilting/Reporte/Translate/TIAProjectTexts.xlsx desde el archivo maestro. Para ru-RU : +2024-08-01 13:30:13,801 - INFO - Fila 304, Columna ru-RU: "### ОШИБКА ###" actualizado a "### ОШИБКА ###" : +2024-08-01 13:30:13,801 - INFO - Fila 305, Columna ru-RU: "### ОШИБКА ###" actualizado a "### ОШИБКА ###" : +2024-08-01 13:30:13,801 - INFO - Fila 306, Columna ru-RU: "### ОШИБКА ###" actualizado a "### ОШИБКА ###" : +2024-08-01 13:30:13,802 - INFO - Fila 307, Columna ru-RU: "### ОШИБКА ###" actualizado a "### ОШИБКА ###" : +2024-08-01 13:30:13,802 - INFO - Fila 308, Columna ru-RU: "### ОШИБКА ###" actualizado a "### ОШИБКА ###" : +2024-08-01 13:30:13,803 - ERROR - Fila 327, Columna ru-RU: "текст 1" valor:"текст <>" no actualizado porque Error de verificación: - Celda clave: ### Output Scorta IN - ERRORE TESTO ### - Celda traducida: текст <> - Dígitos en clave: 0, Dígitos en traducida: 1 - Tags en clave: 0, Tags en traducida: 0 : +2024-08-01 13:30:13,803 - ERROR - Fila 328, Columna ru-RU: "текст 1" valor:"текст <>" no actualizado porque Error de verificación: - Celda clave: ### Output Scorta OUT - ERRORE TESTO ### - Celda traducida: текст <> - Dígitos en clave: 0, Dígitos en traducida: 1 - Tags en clave: 0, Tags en traducida: 0 : +2024-08-01 13:30:13,805 - INFO - Fila 351, Columna ru-RU: "#### ОШИБКА ####" actualizado a "#### ОШИБКА ####" : +2024-08-01 13:30:13,805 - INFO - Fila 352, Columna ru-RU: "#### ОШИБКА ####" actualizado a "#### ОШИБКА ####" : +2024-08-01 13:30:13,806 - INFO - Fila 353, Columna ru-RU: "#### ОШИБКА ####" actualizado a "#### ОШИБКА ####" : +2024-08-01 13:30:13,866 - ERROR - Fila 1899, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:30:13,866 - ERROR - Fila 1900, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:30:13,867 - ERROR - Fila 1901, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:30:13,868 - ERROR - Fila 1902, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:30:13,868 - ERROR - Fila 1904, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:30:13,868 - ERROR - Fila 1905, Columna ru-RU: "этикетировочные" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:30:13,869 - ERROR - Fila 1906, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:30:13,869 - ERROR - Fila 1907, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:30:13,869 - ERROR - Fila 1908, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:30:13,870 - ERROR - Fila 1909, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:30:13,870 - ERROR - Fila 1910, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:30:13,870 - ERROR - Fila 1911, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:30:13,870 - ERROR - Fila 1912, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:30:13,871 - ERROR - Fila 1914, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:30:14,067 - ERROR - Fila 5263, Columna ru-RU: "реле давления S1M03 - OK" valor:"реле давления S<>M<> - OK" no actualizado porque Error de verificación: - Celda clave: Abilitazione - Celda traducida: реле давления S<>M<> - OK - Dígitos en clave: 0, Dígitos en traducida: 2 - Tags en clave: 0, Tags en traducida: 0 : +2024-08-01 13:30:14,076 - INFO - Fila 5306, Columna ru-RU: "Накопление Вход DOS" actualizado a "Накопление Вход DOS" : +2024-08-01 13:30:14,081 - INFO - Fila 5335, Columna ru-RU: "Текст" actualizado a "Текст" : +2024-08-01 13:30:14,083 - INFO - Fila 5342, Columna ru-RU: "Сигнализация Watchdog Modbus" actualizado a "Сигнализация Watchdog Modbus" : +2024-08-01 13:30:14,083 - INFO - Fila 5343, Columna ru-RU: "Сигнализация тайм-аута процедуры автотюнинга электрических параметров" actualizado a "Сигнализация тайм-аута процедуры автотюнинга электрических параметров" : +2024-08-01 13:30:14,083 - INFO - Fila 5344, Columna ru-RU: "Сигнализация Encoder SPI многооборотной части, многооборотная позиция больше не надежна" actualizado a "Сигнализация Encoder SPI многооборотной части, многооборотная позиция больше не надежна" : +2024-08-01 13:30:14,083 - INFO - Fila 5345, Columna ru-RU: "Сигнализация Encoder SPI однородной части, однородная позиция больше не надежна" actualizado a "Сигнализация Encoder SPI однородной части, однородная позиция больше не надежна" : +2024-08-01 13:30:14,084 - INFO - Fila 5346, Columna ru-RU: "Сигнализация неисправности флеш-памяти" actualizado a "Сигнализация неисправности флеш-памяти" : +2024-08-01 13:30:14,084 - INFO - Fila 5347, Columna ru-RU: "Сигнализация чтения энкодера SPI" actualizado a "Сигнализация чтения энкодера SPI" : +2024-08-01 13:30:14,084 - INFO - Fila 5348, Columna ru-RU: "Сигнализация недоступной или поврежденной памяти параметров" actualizado a "Сигнализация недоступной или поврежденной памяти параметров" : +2024-08-01 13:30:14,085 - INFO - Fila 5349, Columna ru-RU: "Сигнализация Не Присутствует" actualizado a "Сигнализация Не Присутствует" : +2024-08-01 13:30:14,085 - INFO - Fila 5350, Columna ru-RU: "Сигнализация аппаратного перенапряжения" actualizado a "Сигнализация аппаратного перенапряжения" : +2024-08-01 13:30:14,085 - INFO - Fila 5351, Columna ru-RU: "Сигнализация программного перенапряжения" actualizado a "Сигнализация программного перенапряжения" : +2024-08-01 13:30:14,085 - INFO - Fila 5352, Columna ru-RU: "Сигнализация перегрева двигателя" actualizado a "Сигнализация перегрева двигателя" : +2024-08-01 13:30:14,086 - INFO - Fila 5353, Columna ru-RU: "Сигнал тревоги о перегреве платы" actualizado a "Сигнал тревоги о перегреве платы" : +2024-08-01 13:30:14,086 - INFO - Fila 5354, Columna ru-RU: "Сигнал тревоги о перенапряжении" actualizado a "Сигнал тревоги о перенапряжении" : +2024-08-01 13:30:14,086 - INFO - Fila 5355, Columna ru-RU: "Сигнал тревоги о неправильном значении параметра" actualizado a "Сигнал тревоги о неправильном значении параметра" : +2024-08-01 13:30:14,086 - INFO - Fila 5356, Columna ru-RU: "Сигнал тревоги о неудачном восстановлении параметров по умолчанию" actualizado a "Сигнал тревоги о неудачном восстановлении параметров по умолчанию" : +2024-08-01 13:30:14,087 - INFO - Fila 5357, Columna ru-RU: "Сигнал тревоги о неудачном восстановлении параметров двигателя по умолчанию" actualizado a "Сигнал тревоги о неудачном восстановлении параметров двигателя по умолчанию" : +2024-08-01 13:30:14,087 - INFO - Fila 5358, Columna ru-RU: "Сигнал тревоги о пониженном напряжении" actualizado a "Сигнал тревоги о пониженном напряжении" : +2024-08-01 13:30:14,087 - INFO - Fila 5359, Columna ru-RU: "Сигнал тревоги пользователя" actualizado a "Сигнал тревоги пользователя" : +2024-08-01 13:30:14,087 - INFO - Fila 5360, Columna ru-RU: "Сигнал тревоги пользователя от цифрового входа" actualizado a "Сигнал тревоги пользователя от цифрового входа" : +2024-08-01 13:30:14,092 - INFO - Fila 5375, Columna ru-RU: "ALLARM: DX Channel Valve Sensors Gate A" actualizado a "ALLARM: DX Channel Valve Sensors Gate A" : +2024-08-01 13:30:14,092 - ERROR - Fila 5380, Columna ru-RU: "аварийные сигналы - делителя [DB1071]" valor:"аварийные сигналы - делителя [DB<>]" no actualizado porque Error de verificación: - Celda clave: Allarmi - SKID - Celda traducida: аварийные сигналы - делителя [DB<>] - Dígitos en clave: 0, Dígitos en traducida: 1 - Tags en clave: 0, Tags en traducida: 0 : +2024-08-01 13:30:14,092 - ERROR - Fila 5381, Columna ru-RU: "аварийные сигналы - Geosync [DB10171]" valor:"аварийные сигналы - Geosync [DB<>]" no actualizado porque Error de verificación: - Celda clave: Allarmi - Tilter - Celda traducida: аварийные сигналы - Geosync [DB<>] - Dígitos en clave: 0, Dígitos en traducida: 1 - Tags en clave: 0, Tags en traducida: 0 : +2024-08-01 13:30:14,108 - INFO - Fila 5535, Columna ru-RU: "Подъемный механизм" actualizado a "Подъемный механизм" : +2024-08-01 13:30:14,108 - INFO - Fila 5539, Columna ru-RU: "Низкий [Подъемный механизм]" actualizado a "Низкий [Подъемный механизм]" : +2024-08-01 13:30:14,108 - INFO - Fila 5540, Columna ru-RU: "Низкий [Платформа]" actualizado a "Низкий [Платформа]" : +2024-08-01 13:30:14,111 - INFO - Fila 5553, Columna ru-RU: "Обход" actualizado a "Обход" : +2024-08-01 13:30:14,112 - INFO - Fila 5558, Columna ru-RU: "Канал A" actualizado a "Канал A" : +2024-08-01 13:30:14,112 - INFO - Fila 5559, Columna ru-RU: "Канал B" actualizado a "Канал B" : +2024-08-01 13:30:14,117 - INFO - Fila 5589, Columna ru-RU: "Вызов пакетов" actualizado a "Вызов пакетов" : +2024-08-01 13:30:14,117 - INFO - Fila 5590, Columna ru-RU: "Вызов пакетов" actualizado a "Вызов пакетов" : +2024-08-01 13:30:14,118 - INFO - Fila 5591, Columna ru-RU: "Вызванные пакеты канала справа (B)" actualizado a "Вызванные пакеты канала справа (B)" : +2024-08-01 13:30:14,118 - INFO - Fila 5592, Columna ru-RU: "Packs Request on Left Channel (A)" actualizado a "Packs Request on Left Channel (A)" : +2024-08-01 13:30:14,130 - INFO - Fila 5672, Columna ru-RU: "Manual Divider Infeed Wrappers" actualizado a "Manual Divider Infeed Wrappers" : +2024-08-01 13:30:14,132 - INFO - Fila 5682, Columna ru-RU: "Pack Divider" actualizado a "Pack Divider" : +2024-08-01 13:30:14,138 - INFO - Fila 5759, Columna ru-RU: "Encoder not aligned yet" actualizado a "Encoder not aligned yet" : +2024-08-01 13:30:14,138 - INFO - Fila 5760, Columna ru-RU: "Encoder does not detect movement" actualizado a "Encoder does not detect movement" : +2024-08-01 13:30:14,138 - INFO - Fila 5761, Columna ru-RU: "Encoder detects wrong side movement" actualizado a "Encoder detects wrong side movement" : +2024-08-01 13:30:14,139 - INFO - Fila 5767, Columna ru-RU: "Hmi Error" actualizado a "Hmi Error" : +2024-08-01 13:30:14,140 - INFO - Fila 5768, Columna ru-RU: "Hmi Error" actualizado a "Hmi Error" : +2024-08-01 13:30:14,140 - INFO - Fila 5769, Columna ru-RU: "Hmi Error" actualizado a "Hmi Error" : +2024-08-01 13:30:14,140 - INFO - Fila 5770, Columna ru-RU: "Hmi Error" actualizado a "Hmi Error" : +2024-08-01 13:30:14,141 - INFO - Fila 5771, Columna ru-RU: "Hmi Error" actualizado a "Hmi Error" : +2024-08-01 13:30:14,141 - INFO - Fila 5772, Columna ru-RU: "CSP mode position reference error" actualizado a "CSP mode position reference error" : +2024-08-01 13:30:14,141 - INFO - Fila 5773, Columna ru-RU: "Error in CSP synchronization" actualizado a "Error in CSP synchronization" : +2024-08-01 13:30:14,142 - INFO - Fila 5781, Columna ru-RU: "стоп Carico Preforme" actualizado a "стоп Carico Preforme" : +2024-08-01 13:30:14,144 - INFO - Fila 5782, Columna ru-RU: "стоп Carico Preforme" actualizado a "стоп Carico Preforme" : +2024-08-01 13:30:14,144 - INFO - Fila 5783, Columna ru-RU: "стоп Carico Preforme" actualizado a "стоп Carico Preforme" : +2024-08-01 13:30:14,144 - INFO - Fila 5784, Columna ru-RU: "стоп Carico Preforme" actualizado a "стоп Carico Preforme" : +2024-08-01 13:30:14,152 - INFO - Fila 5869, Columna ru-RU: "Out Of Position" actualizado a "Out Of Position" : +2024-08-01 13:30:14,153 - INFO - Fila 5870, Columna ru-RU: "Out Of Position" actualizado a "Out Of Position" : +2024-08-01 13:30:14,153 - INFO - Fila 5871, Columna ru-RU: "Out Of Position" actualizado a "Out Of Position" : +2024-08-01 13:30:14,155 - INFO - Fila 5879, Columna ru-RU: "Geosync DOS" actualizado a "Geosync DOS" : +2024-08-01 13:30:14,157 - INFO - Fila 5899, Columna ru-RU: "Hardware DRS" actualizado a "Hardware DRS" : +2024-08-01 13:30:14,159 - INFO - Fila 5919, Columna ru-RU: "Normal Work" actualizado a "Normal Work" : +2024-08-01 13:30:14,159 - INFO - Fila 5920, Columna ru-RU: "Normal Work" actualizado a "Normal Work" : +2024-08-01 13:30:14,160 - INFO - Fila 5921, Columna ru-RU: "Normal Work" actualizado a "Normal Work" : +2024-08-01 13:30:14,166 - INFO - Fila 5951, Columna ru-RU: "Higher Infeed Platform Belt" actualizado a "Higher Infeed Platform Belt" : +2024-08-01 13:30:14,166 - INFO - Fila 5952, Columna ru-RU: "Hinge Conveyor Infeed" actualizado a "Hinge Conveyor Infeed" : +2024-08-01 13:30:14,166 - INFO - Fila 5953, Columna ru-RU: "Lower Infeed Platform Accumulation" actualizado a "Lower Infeed Platform Accumulation" : +2024-08-01 13:30:14,167 - INFO - Fila 5954, Columna ru-RU: "Lower Infeed Platform Belt" actualizado a "Lower Infeed Platform Belt" : +2024-08-01 13:30:14,167 - INFO - Fila 5956, Columna ru-RU: "Pack Divider Infeed" actualizado a "Pack Divider Infeed" : +2024-08-01 13:30:14,169 - INFO - Fila 5970, Columna ru-RU: "Pal Infeed Channel A (Left)" actualizado a "Pal Infeed Channel A (Left)" : +2024-08-01 13:30:14,169 - INFO - Fila 5971, Columna ru-RU: "Pal Infeed Channel B (Right)" actualizado a "Pal Infeed Channel B (Right)" : +2024-08-01 13:30:14,170 - INFO - Fila 5972, Columna ru-RU: "Initialization" actualizado a "Initialization" : +2024-08-01 13:30:14,171 - INFO - Fila 5988, Columna ru-RU: "Positioning interruption" actualizado a "Positioning interruption" : +2024-08-01 13:30:14,172 - INFO - Fila 5989, Columna ru-RU: "Oil aging overtemperature" actualizado a "Oil aging overtemperature" : +2024-08-01 13:30:14,172 - INFO - Fila 5992, Columna ru-RU: "Ion_Alm" actualizado a "Ion_Alm" : +2024-08-01 13:30:14,173 - INFO - Fila 5993, Columna ru-RU: "Ion_Level" actualizado a "Ion_Level" : +2024-08-01 13:30:14,173 - INFO - Fila 5994, Columna ru-RU: "Ion_Sts_Alm" actualizado a "Ion_Sts_Alm" : +2024-08-01 13:30:14,173 - INFO - Fila 5995, Columna ru-RU: "IPOS-ILLOP" actualizado a "IPOS-ILLOP" : +2024-08-01 13:30:14,175 - INFO - Fila 6007, Columna ru-RU: "KRONES" actualizado a "KRONES" : +2024-08-01 13:30:14,176 - INFO - Fila 6010, Columna ru-RU: "Labeller Selected" actualizado a "Labeller Selected" : +2024-08-01 13:30:14,178 - INFO - Fila 6027, Columna ru-RU: "EcoLab Lubrification" actualizado a "EcoLab Lubrification" : +2024-08-01 13:30:14,196 - INFO - Fila 6386, Columna ru-RU: "стоп Carico Preforme" actualizado a "стоп Carico Preforme" : +2024-08-01 13:30:14,196 - INFO - Fila 6387, Columna ru-RU: "стоп Carico Preforme" actualizado a "стоп Carico Preforme" : +2024-08-01 13:30:14,197 - INFO - Fila 6388, Columna ru-RU: "стоп Carico Preforme" actualizado a "стоп Carico Preforme" : +2024-08-01 13:30:14,197 - INFO - Fila 6389, Columna ru-RU: "стоп Carico Preforme" actualizado a "стоп Carico Preforme" : +2024-08-01 13:30:14,217 - INFO - Fila 6516, Columna ru-RU: "Fieldbus mode incompatible with hardware present" actualizado a "Fieldbus mode incompatible with hardware present" : +2024-08-01 13:30:14,221 - INFO - Fila 6539, Columna ru-RU: "No Request" actualizado a "No Request" : +2024-08-01 13:30:14,221 - INFO - Fila 6540, Columna ru-RU: "No Request" actualizado a "No Request" : +2024-08-01 13:30:14,222 - INFO - Fila 6541, Columna ru-RU: "No Request" actualizado a "No Request" : +2024-08-01 13:30:14,222 - INFO - Fila 6542, Columna ru-RU: "No Request" actualizado a "No Request" : +2024-08-01 13:30:14,222 - INFO - Fila 6543, Columna ru-RU: "No Request" actualizado a "No Request" : +2024-08-01 13:30:14,223 - INFO - Fila 6544, Columna ru-RU: "No Allarm: In Production" actualizado a "No Allarm: In Production" : +2024-08-01 13:30:14,223 - INFO - Fila 6545, Columna ru-RU: "No Allarm: In Production" actualizado a "No Allarm: In Production" : +2024-08-01 13:30:14,223 - INFO - Fila 6546, Columna ru-RU: "No Allarm: In Production" actualizado a "No Allarm: In Production" : +2024-08-01 13:30:14,223 - INFO - Fila 6547, Columna ru-RU: "No Allarm: In Production" actualizado a "No Allarm: In Production" : +2024-08-01 13:30:14,224 - INFO - Fila 6548, Columna ru-RU: "No Allarm: In Production" actualizado a "No Allarm: In Production" : +2024-08-01 13:30:14,224 - INFO - Fila 6549, Columna ru-RU: "No Allarm: In Production" actualizado a "No Allarm: In Production" : +2024-08-01 13:30:14,224 - INFO - Fila 6550, Columna ru-RU: "Nessuna Selezione" actualizado a "Nessuna Selezione" : +2024-08-01 13:30:14,224 - INFO - Fila 6551, Columna ru-RU: "Nessuna Selezione" actualizado a "Nessuna Selezione" : +2024-08-01 13:30:14,237 - INFO - Fila 6690, Columna ru-RU: "Palletizer" actualizado a "Palletizer" : +2024-08-01 13:30:14,268 - ERROR - Fila 6931, Columna ru-RU: "Recipe_element_14" valor:"Recipe_element_<>" no actualizado porque Error de verificación: - Celda clave: RCP\CONSENSI\DISCHARGE\SYNCHROBLOC - Celda traducida: Recipe_element_<> - Dígitos en clave: 0, Dígitos en traducida: 1 - Tags en clave: 0, Tags en traducida: 0 : +2024-08-01 13:30:14,268 - ERROR - Fila 6932, Columna ru-RU: "Recipe_element_13" valor:"Recipe_element_<>" no actualizado porque Error de verificación: - Celda clave: RCP\CONSENSI\INFEED\SYNCHROBLOC - Celda traducida: Recipe_element_<> - Dígitos en clave: 0, Dígitos en traducida: 1 - Tags en clave: 0, Tags en traducida: 0 : +2024-08-01 13:30:14,274 - INFO - Fila 6966, Columna ru-RU: "Filler" actualizado a "Filler" : +2024-08-01 13:30:14,274 - INFO - Fila 6967, Columna ru-RU: "Filler" actualizado a "Filler" : +2024-08-01 13:30:14,274 - INFO - Fila 6968, Columna ru-RU: "Filler" actualizado a "Filler" : +2024-08-01 13:30:14,275 - INFO - Fila 6969, Columna ru-RU: "Filler" actualizado a "Filler" : +2024-08-01 13:30:14,275 - INFO - Fila 6970, Columna ru-RU: "Filler" actualizado a "Filler" : +2024-08-01 13:30:14,275 - INFO - Fila 6971, Columna ru-RU: "Filler" actualizado a "Filler" : +2024-08-01 13:30:14,275 - INFO - Fila 6972, Columna ru-RU: "Filler" actualizado a "Filler" : +2024-08-01 13:30:14,276 - INFO - Fila 6973, Columna ru-RU: "Labeller Reference" actualizado a "Labeller Reference" : +2024-08-01 13:30:14,276 - INFO - Fila 6974, Columna ru-RU: "Labeller Reference" actualizado a "Labeller Reference" : +2024-08-01 13:30:14,276 - INFO - Fila 6983, Columna ru-RU: "Pal Reference" actualizado a "Pal Reference" : +2024-08-01 13:30:14,277 - INFO - Fila 6984, Columna ru-RU: "Pal Reference" actualizado a "Pal Reference" : +2024-08-01 13:30:14,277 - INFO - Fila 6985, Columna ru-RU: "Filler Reference" actualizado a "Filler Reference" : +2024-08-01 13:30:14,278 - INFO - Fila 6986, Columna ru-RU: "Filler Reference" actualizado a "Filler Reference" : +2024-08-01 13:30:14,278 - INFO - Fila 6987, Columna ru-RU: "Filler Reference" actualizado a "Filler Reference" : +2024-08-01 13:30:14,278 - INFO - Fila 6988, Columna ru-RU: "VDOS Reference" actualizado a "VDOS Reference" : +2024-08-01 13:30:14,279 - INFO - Fila 6989, Columna ru-RU: "VREC Reference" actualizado a "VREC Reference" : +2024-08-01 13:30:14,279 - INFO - Fila 6990, Columna ru-RU: "VREC Reference" actualizado a "VREC Reference" : +2024-08-01 13:30:14,279 - INFO - Fila 6991, Columna ru-RU: "VREC Reference" actualizado a "VREC Reference" : +2024-08-01 13:30:14,279 - INFO - Fila 6992, Columna ru-RU: "VREC Reference" actualizado a "VREC Reference" : +2024-08-01 13:30:14,280 - INFO - Fila 6993, Columna ru-RU: "VSFI Reference" actualizado a "VSFI Reference" : +2024-08-01 13:30:14,280 - INFO - Fila 6994, Columna ru-RU: "VSFI Reference" actualizado a "VSFI Reference" : +2024-08-01 13:30:14,280 - INFO - Fila 6995, Columna ru-RU: "Labeller Early Restart" actualizado a "Labeller Early Restart" : +2024-08-01 13:30:14,280 - INFO - Fila 6996, Columna ru-RU: "Sinchrobloc Early Restart" actualizado a "Sinchrobloc Early Restart" : +2024-08-01 13:30:14,281 - INFO - Fila 6997, Columna ru-RU: "Filler Early Restart" actualizado a "Filler Early Restart" : +2024-08-01 13:30:14,295 - INFO - Fila 7190, Columna ru-RU: "Fieldbus card not consistent with the selected one" actualizado a "Fieldbus card not consistent with the selected one" : +2024-08-01 13:30:14,295 - INFO - Fila 7191, Columna ru-RU: "Fieldbus card not initialised correctly" actualizado a "Fieldbus card not initialised correctly" : +2024-08-01 13:30:14,295 - INFO - Fila 7192, Columna ru-RU: "Wireless card not working" actualizado a "Wireless card not working" : +2024-08-01 13:30:14,296 - INFO - Fila 7193, Columna ru-RU: "Wireless card not working" actualizado a "Wireless card not working" : +2024-08-01 13:30:14,323 - INFO - Fila 7339, Columna ru-RU: "стоп Carico Preforme" actualizado a "стоп Carico Preforme" : +2024-08-01 13:30:14,324 - INFO - Fila 7340, Columna ru-RU: "стоп Carico Preforme" actualizado a "стоп Carico Preforme" : +2024-08-01 13:30:14,324 - INFO - Fila 7341, Columna ru-RU: "стоп Carico Preforme" actualizado a "стоп Carico Preforme" : +2024-08-01 13:30:14,325 - INFO - Fila 7342, Columna ru-RU: "стоп Carico Preforme" actualizado a "стоп Carico Preforme" : +2024-08-01 13:30:14,325 - INFO - Fila 7343, Columna ru-RU: "стоп Carico Preforme" actualizado a "стоп Carico Preforme" : +2024-08-01 13:30:14,325 - INFO - Fila 7344, Columna ru-RU: "стоп Carico Preforme" actualizado a "стоп Carico Preforme" : +2024-08-01 13:30:14,325 - INFO - Fila 7345, Columna ru-RU: "стоп Carico Preforme" actualizado a "стоп Carico Preforme" : +2024-08-01 13:30:14,326 - INFO - Fila 7346, Columna ru-RU: "стоп Carico Preforme" actualizado a "стоп Carico Preforme" : +2024-08-01 13:30:14,326 - INFO - Fila 7347, Columna ru-RU: "стоп Carico Preforme" actualizado a "стоп Carico Preforme" : +2024-08-01 13:30:14,326 - INFO - Fila 7348, Columna ru-RU: "стоп Carico Preforme" actualizado a "стоп Carico Preforme" : +2024-08-01 13:30:14,326 - INFO - Fila 7349, Columna ru-RU: "стоп Carico Preforme" actualizado a "стоп Carico Preforme" : +2024-08-01 13:30:14,327 - INFO - Fila 7350, Columna ru-RU: "стоп Carico Preforme" actualizado a "стоп Carico Preforme" : +2024-08-01 13:30:14,327 - INFO - Fila 7351, Columna ru-RU: "стоп Carico Preforme" actualizado a "стоп Carico Preforme" : +2024-08-01 13:30:14,327 - INFO - Fila 7352, Columna ru-RU: "стоп Carico Preforme" actualizado a "стоп Carico Preforme" : +2024-08-01 13:30:14,338 - INFO - Fila 7418, Columna ru-RU: "Security memory fieldbus card not working" actualizado a "Security memory fieldbus card not working" : +2024-08-01 13:30:14,345 - ERROR - Fila 7467, Columna ru-RU: "Настройка смазки — зона 1 [Mxx-Myy]" valor:"Настройка смазки — зона <> [Mxx-Myy]" no actualizado porque Error de verificación: - Celda clave: Setup Lubrificazione a Secco - Celda traducida: Настройка смазки — зона <> [Mxx-Myy] - Dígitos en clave: 0, Dígitos en traducida: 1 - Tags en clave: 0, Tags en traducida: 0 : +2024-08-01 13:30:14,351 - INFO - Fila 7507, Columna ru-RU: "Sleever" actualizado a "Sleever" : +2024-08-01 13:30:14,351 - INFO - Fila 7509, Columna ru-RU: "Blower" actualizado a "Blower" : +2024-08-01 13:30:14,353 - INFO - Fila 7531, Columna ru-RU: "фактическая скор. Hz" actualizado a "фактическая скор. Hz" : +2024-08-01 13:30:14,354 - INFO - Fila 7532, Columna ru-RU: "фактическая скор. Hz" actualizado a "фактическая скор. Hz" : +2024-08-01 13:30:14,354 - INFO - Fila 7535, Columna ru-RU: "требуемая ско. Hz" actualizado a "требуемая ско. Hz" : +2024-08-01 13:30:14,355 - INFO - Fila 7536, Columna ru-RU: "требуемая ско. Hz" actualizado a "требуемая ско. Hz" : +2024-08-01 13:30:14,359 - INFO - Fila 7570, Columna ru-RU: "история тревоги" actualizado a "история тревоги" : +2024-08-01 13:30:14,361 - INFO - Fila 7592, Columna ru-RU: "Homing switches not configured correctly" actualizado a "Homing switches not configured correctly" : +2024-08-01 13:30:14,384 - ERROR - Fila 8015, Columna ru-RU: "Recipe_element_2" valor:"Recipe_element_<>" no actualizado porque Error de verificación: - Celda clave: TILTER/PID_RCP - Celda traducida: Recipe_element_<> - Dígitos en clave: 0, Dígitos en traducida: 1 - Tags en clave: 0, Tags en traducida: 0 : +2024-08-01 13:30:14,384 - ERROR - Fila 8016, Columna ru-RU: "Recipe_element_1" valor:"Recipe_element_<>" no actualizado porque Error de verificación: - Celda clave: TILTER/RCP - Celda traducida: Recipe_element_<> - Dígitos en clave: 0, Dígitos en traducida: 1 - Tags en clave: 0, Tags en traducida: 0 : +2024-08-01 13:30:14,386 - INFO - Fila 8028, Columna ru-RU: "Timeout during Homing procedure" actualizado a "Timeout during Homing procedure" : +2024-08-01 13:30:14,389 - INFO - Fila 8056, Columna ru-RU: "Engine Type Not Selected" actualizado a "Engine Type Not Selected" : +2024-08-01 13:30:14,394 - INFO - Fila 8090, Columna ru-RU: "Infeed Pack Conveyors Running" actualizado a "Infeed Pack Conveyors Running" : +2024-08-01 13:30:14,395 - INFO - Fila 8095, Columna ru-RU: "Left (A) Infeed Conveyors Running" actualizado a "Left (A) Infeed Conveyors Running" : +2024-08-01 13:30:14,395 - INFO - Fila 8096, Columna ru-RU: "Left (A) Infeed Conveyors Running" actualizado a "Left (A) Infeed Conveyors Running" : +2024-08-01 13:30:14,397 - INFO - Fila 8105, Columna ru-RU: "Higher Conveyor Platform" actualizado a "Higher Conveyor Platform" : +2024-08-01 13:30:14,397 - INFO - Fila 8106, Columna ru-RU: "Lower Conveyor Platform" actualizado a "Lower Conveyor Platform" : +2024-08-01 13:30:14,400 - INFO - Fila 8151, Columna ru-RU: "Higher Discharge Hinge Conveyor" actualizado a "Higher Discharge Hinge Conveyor" : +2024-08-01 13:30:14,401 - INFO - Fila 8154, Columna ru-RU: "Lower Discharge Hinge Conveyor" actualizado a "Lower Discharge Hinge Conveyor" : +2024-08-01 13:30:14,401 - INFO - Fila 8155, Columna ru-RU: "Pack Divider Discharge" actualizado a "Pack Divider Discharge" : +2024-08-01 13:30:14,401 - INFO - Fila 8156, Columna ru-RU: "Pack Divider Discharge Right" actualizado a "Pack Divider Discharge Right" : +2024-08-01 13:30:14,401 - INFO - Fila 8157, Columna ru-RU: "Pack Divider Discharge Left" actualizado a "Pack Divider Discharge Left" : +2024-08-01 13:30:14,402 - INFO - Fila 8158, Columna ru-RU: "Labeller Discharge" actualizado a "Labeller Discharge" : +2024-08-01 13:30:14,403 - INFO - Fila 8162, Columna ru-RU: "Labeller Discharge (Slowing Conveyor)" actualizado a "Labeller Discharge (Slowing Conveyor)" : +2024-08-01 13:30:14,403 - INFO - Fila 8172, Columna ru-RU: "Handler Discharge (Accumulation, Right)" actualizado a "Handler Discharge (Accumulation, Right)" : +2024-08-01 13:30:14,404 - INFO - Fila 8173, Columna ru-RU: "Handler Discharge (Accumulation, Left)" actualizado a "Handler Discharge (Accumulation, Left)" : +2024-08-01 13:30:14,404 - INFO - Fila 8174, Columna ru-RU: "Platform Discharge" actualizado a "Platform Discharge" : +2024-08-01 13:30:14,404 - INFO - Fila 8175, Columna ru-RU: "Platform Discharge Accumulation" actualizado a "Platform Discharge Accumulation" : +2024-08-01 13:30:14,404 - INFO - Fila 8176, Columna ru-RU: "Sinchrobloc Discharge" actualizado a "Sinchrobloc Discharge" : +2024-08-01 13:30:14,405 - INFO - Fila 8177, Columna ru-RU: "Sinchrobloc Discharge (Reject Table)" actualizado a "Sinchrobloc Discharge (Reject Table)" : +2024-08-01 13:30:14,405 - INFO - Fila 8179, Columna ru-RU: "Sinchrobloc Discharge (Slowing Conveyor)" actualizado a "Sinchrobloc Discharge (Slowing Conveyor)" : +2024-08-01 13:30:14,410 - INFO - Fila 8245, Columna ru-RU: "максимальная скорость" actualizado a "максимальная скорость" : +2024-08-01 13:30:14,417 - INFO - Fila 8282, Columna ru-RU: "Check With Format" actualizado a "Check With Format" : +2024-08-01 13:30:14,419 - INFO - Fila 8283, Columna ru-RU: "Check With Format" actualizado a "Check With Format" : +2024-08-01 13:30:14,419 - INFO - Fila 8284, Columna ru-RU: "Check With Format" actualizado a "Check With Format" : +2024-08-01 13:30:14,419 - INFO - Fila 8285, Columna ru-RU: "Check With Format" actualizado a "Check With Format" : +2024-08-01 13:30:14,420 - INFO - Fila 8286, Columna ru-RU: "Check With Format" actualizado a "Check With Format" : +2024-08-01 13:30:20,906 - INFO - Se han actualizado las filas en C:/Trabajo/VM/22 - 93841 - Sidel - Tilting/Reporte/Translate/TIAProjectTexts.xlsx desde el archivo maestro. : +2024-08-01 13:30:20,906 - INFO - .... : +2024-08-01 13:38:37,368 - INFO - .... : +2024-08-01 13:38:37,369 - INFO - Iniciando actualizacion en C:/Trabajo/VM/22 - 93841 - Sidel - Tilting/Reporte/Translate/TIAProjectTexts.xlsx desde el archivo maestro. Para ru-RU : +2024-08-01 13:39:20,406 - INFO - .... : +2024-08-01 13:39:20,407 - INFO - Iniciando actualizacion en C:/Trabajo/VM/22 - 93841 - Sidel - Tilting/Reporte/Translate/TIAProjectTexts.xlsx desde el archivo maestro. Para ru-RU : +2024-08-01 13:49:34,956 - INFO - .... : +2024-08-01 13:49:34,956 - INFO - Iniciando actualizacion en C:/Trabajo/VM/22 - 93841 - Sidel - Tilting/Reporte/Translate/TIAProjectTexts.xlsx desde el archivo maestro. Para ru-RU : +2024-08-01 13:49:35,517 - INFO - Fila 304 : Clave: ### ERRORE ###, Columna ru-RU: "nan" actualizado a "### ОШИБКА ###" : +2024-08-01 13:49:35,518 - INFO - Fila 305 : Clave: ### ERRORE ###, Columna ru-RU: "текст 1" actualizado a "### ОШИБКА ###" : +2024-08-01 13:49:35,518 - INFO - Fila 306 : Clave: ### ERRORE ###, Columna ru-RU: "текст 1" actualizado a "### ОШИБКА ###" : +2024-08-01 13:49:35,518 - INFO - Fila 307 : Clave: ### ERRORE ###, Columna ru-RU: "nan" actualizado a "### ОШИБКА ###" : +2024-08-01 13:49:35,519 - INFO - Fila 308 : Clave: ### ERRORE ###, Columna ru-RU: "nan" actualizado a "### ОШИБКА ###" : +2024-08-01 13:49:35,520 - ERROR - Fila 327, Columna ru-RU: "текст 1" valor:"текст <>" no actualizado porque Error de verificación: - Celda clave: ### Output Scorta IN - ERRORE TESTO ### - Celda traducida: текст <> - Dígitos en clave: 0, Dígitos en traducida: 1 - Tags en clave: 0, Tags en traducida: 0 : +2024-08-01 13:49:35,520 - ERROR - Fila 328, Columna ru-RU: "текст 1" valor:"текст <>" no actualizado porque Error de verificación: - Celda clave: ### Output Scorta OUT - ERRORE TESTO ### - Celda traducida: текст <> - Dígitos en clave: 0, Dígitos en traducida: 1 - Tags en clave: 0, Tags en traducida: 0 : +2024-08-01 13:49:35,522 - INFO - Fila 351 : Clave: #### ERRORE ####, Columna ru-RU: "nan" actualizado a "#### ОШИБКА ####" : +2024-08-01 13:49:35,522 - INFO - Fila 352 : Clave: #### ERRORE ####, Columna ru-RU: "nan" actualizado a "#### ОШИБКА ####" : +2024-08-01 13:49:35,523 - INFO - Fila 353 : Clave: #### ERRORE ####, Columna ru-RU: "текст 1" actualizado a "#### ОШИБКА ####" : +2024-08-01 13:49:35,583 - ERROR - Fila 1899, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:49:35,584 - ERROR - Fila 1900, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:49:35,584 - ERROR - Fila 1901, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:49:35,584 - ERROR - Fila 1902, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:49:35,585 - ERROR - Fila 1904, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:49:35,585 - ERROR - Fila 1905, Columna ru-RU: "этикетировочные" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:49:35,585 - ERROR - Fila 1906, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:49:35,586 - ERROR - Fila 1907, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:49:35,586 - ERROR - Fila 1908, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:49:35,586 - ERROR - Fila 1909, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:49:35,586 - ERROR - Fila 1910, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:49:35,587 - ERROR - Fila 1911, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:49:35,587 - ERROR - Fila 1912, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:49:35,587 - ERROR - Fila 1914, Columna ru-RU: "" valor:"Text" no actualizado porque Error de verificación: - Celda clave: - Celda traducida: Text - Dígitos en clave: 0, Dígitos en traducida: 0 - Tags en clave: 1, Tags en traducida: 0 : +2024-08-01 13:49:35,783 - ERROR - Fila 5263, Columna ru-RU: "реле давления S1M03 - OK" valor:"реле давления S<>M<> - OK" no actualizado porque Error de verificación: - Celda clave: Abilitazione - Celda traducida: реле давления S<>M<> - OK - Dígitos en clave: 0, Dígitos en traducida: 2 - Tags en clave: 0, Tags en traducida: 0 : +2024-08-01 13:49:35,792 - INFO - Fila 5306 : Clave: Accumulo Ingresso DOS, Columna ru-RU: "nan" actualizado a "Накопление Вход DOS" : +2024-08-01 13:49:35,797 - INFO - Fila 5335 : Clave: Allarme, Columna ru-RU: "реле давления S1M03 - OK" actualizado a "Текст" : +2024-08-01 13:49:35,799 - INFO - Fila 5342 : Clave: Allarme del Watchdog Modbus, Columna ru-RU: "nan" actualizado a "Сигнализация Watchdog Modbus" : +2024-08-01 13:49:35,799 - INFO - Fila 5343 : Clave: Allarme di time-out procedura di autotuning parametri elettrici, Columna ru-RU: "nan" actualizado a "Сигнализация тайм-аута процедуры автотюнинга электрических параметров" : +2024-08-01 13:49:35,799 - INFO - Fila 5344 : Clave: Allarme Encoder SPI della parte Multi Turn, la posizione multigiro non è più affidabile, Columna ru-RU: "nan" actualizado a "Сигнализация Encoder SPI многооборотной части, многооборотная позиция больше не надежна" : +2024-08-01 13:49:35,800 - INFO - Fila 5345 : Clave: Allarme Encoder SPI della parte Single Turn, la posizione singolo giro non è più affidabile, Columna ru-RU: "nan" actualizado a "Сигнализация Encoder SPI однородной части, однородная позиция больше не надежна" : +2024-08-01 13:49:35,800 - INFO - Fila 5346 : Clave: Allarme flash dati non funzionante, Columna ru-RU: "nan" actualizado a "Сигнализация неисправности флеш-памяти" : +2024-08-01 13:49:35,800 - INFO - Fila 5347 : Clave: Allarme lettura encoder SPI , Columna ru-RU: "nan" actualizado a "Сигнализация чтения энкодера SPI" : +2024-08-01 13:49:35,801 - INFO - Fila 5348 : Clave: Allarme memoria parametri non accessibile o corrotta, Columna ru-RU: "nan" actualizado a "Сигнализация недоступной или поврежденной памяти параметров" : +2024-08-01 13:49:35,801 - INFO - Fila 5349 : Clave: Allarme Non Presente, Columna ru-RU: "nan" actualizado a "Сигнализация Не Присутствует" : +2024-08-01 13:49:35,801 - INFO - Fila 5350 : Clave: Allarme overcurrent hardware, Columna ru-RU: "nan" actualizado a "Сигнализация аппаратного перенапряжения" : +2024-08-01 13:49:35,802 - INFO - Fila 5351 : Clave: Allarme overcurrent software, Columna ru-RU: "nan" actualizado a "Сигнализация программного перенапряжения" : +2024-08-01 13:49:35,802 - INFO - Fila 5352 : Clave: Allarme overtemperature motore, Columna ru-RU: "nan" actualizado a "Сигнализация перегрева двигателя" : +2024-08-01 13:49:35,803 - INFO - Fila 5353 : Clave: Allarme overtemperature scheda, Columna ru-RU: "nan" actualizado a "Сигнал тревоги о перегреве платы" : +2024-08-01 13:49:35,804 - INFO - Fila 5354 : Clave: Allarme overvoltage , Columna ru-RU: "nan" actualizado a "Сигнал тревоги о перенапряжении" : +2024-08-01 13:49:35,804 - INFO - Fila 5355 : Clave: Allarme parametro con valore sbagliato, Columna ru-RU: "nan" actualizado a "Сигнал тревоги о неправильном значении параметра" : +2024-08-01 13:49:35,804 - INFO - Fila 5356 : Clave: Allarme restore parametri default fallita, Columna ru-RU: "nan" actualizado a "Сигнал тревоги о неудачном восстановлении параметров по умолчанию" : +2024-08-01 13:49:35,805 - INFO - Fila 5357 : Clave: Allarme restore parametri motore default fallita, Columna ru-RU: "nan" actualizado a "Сигнал тревоги о неудачном восстановлении параметров двигателя по умолчанию" : +2024-08-01 13:49:35,805 - INFO - Fila 5358 : Clave: Allarme undervoltage, Columna ru-RU: "nan" actualizado a "Сигнал тревоги о пониженном напряжении" : +2024-08-01 13:49:35,806 - INFO - Fila 5359 : Clave: Allarme Utente, Columna ru-RU: "nan" actualizado a "Сигнал тревоги пользователя" : +2024-08-01 13:49:35,806 - INFO - Fila 5360 : Clave: Allarme utente da ingresso digitale, Columna ru-RU: "nan" actualizado a "Сигнал тревоги пользователя от цифрового входа" : +2024-08-01 13:49:35,809 - INFO - Fila 5375 : Clave: ALLARME: Sicurezza non attivata, Columna ru-RU: "JAM OUTFEED CONE" actualizado a "ALLARM: DX Channel Valve Sensors Gate A" : +2024-08-01 13:49:35,810 - ERROR - Fila 5380, Columna ru-RU: "аварийные сигналы - делителя [DB1071]" valor:"аварийные сигналы - делителя [DB<>]" no actualizado porque Error de verificación: - Celda clave: Allarmi - SKID - Celda traducida: аварийные сигналы - делителя [DB<>] - Dígitos en clave: 0, Dígitos en traducida: 1 - Tags en clave: 0, Tags en traducida: 0 : +2024-08-01 13:49:35,810 - ERROR - Fila 5381, Columna ru-RU: "аварийные сигналы - Geosync [DB10171]" valor:"аварийные сигналы - Geosync [DB<>]" no actualizado porque Error de verificación: - Celda clave: Allarmi - Tilter - Celda traducida: аварийные сигналы - Geosync [DB<>] - Dígitos en clave: 0, Dígitos en traducida: 1 - Tags en clave: 0, Tags en traducida: 0 : +2024-08-01 13:49:35,825 - INFO - Fila 5535 : Clave: Basculante, Columna ru-RU: "nan" actualizado a "Подъемный механизм" : +2024-08-01 13:49:35,825 - INFO - Fila 5539 : Clave: Basso [Basculante], Columna ru-RU: "nan" actualizado a "Низкий [Подъемный механизм]" : +2024-08-01 13:49:35,826 - INFO - Fila 5540 : Clave: Basso [Piattaforma], Columna ru-RU: "nan" actualizado a "Низкий [Платформа]" : +2024-08-01 13:49:35,828 - INFO - Fila 5553 : Clave: Bypass, Columna ru-RU: "nan" actualizado a "Обход" : +2024-08-01 13:49:35,829 - INFO - Fila 5558 : Clave: Canale A, Columna ru-RU: "nan" actualizado a "Канал A" : +2024-08-01 13:49:35,829 - INFO - Fila 5559 : Clave: Canale B, Columna ru-RU: "nan" actualizado a "Канал B" : +2024-08-01 13:49:35,836 - INFO - Fila 5589 : Clave: Chiamata Fardelli, Columna ru-RU: "nan" actualizado a "Вызов пакетов" : +2024-08-01 13:49:35,836 - INFO - Fila 5590 : Clave: Chiamata Fardelli, Columna ru-RU: "стоп Carico Preforme" actualizado a "Вызов пакетов" : +2024-08-01 13:49:35,836 - INFO - Fila 5591 : Clave: Chiamati Pacchi Canale Destro (B), Columna ru-RU: "nan" actualizado a "Вызванные пакеты канала справа (B)" : +2024-08-01 13:49:35,837 - INFO - Fila 5592 : Clave: Chiamati Pacchi Canale Sinistro (A), Columna ru-RU: "nan" actualizado a "Packs Request on Left Channel (A)" : +2024-08-01 13:49:35,849 - INFO - Fila 5672 : Clave: Devio Ingresso Fardellatrici, Columna ru-RU: "nan" actualizado a "Manual Divider Infeed Wrappers" : +2024-08-01 13:49:35,851 - INFO - Fila 5682 : Clave: Divisore Pacchi, Columna ru-RU: "nan" actualizado a "Pack Divider" : +2024-08-01 13:49:35,858 - INFO - Fila 5759 : Clave: Encoder non ancora allineato, Columna ru-RU: "nan" actualizado a "Encoder not aligned yet" : +2024-08-01 13:49:35,858 - INFO - Fila 5760 : Clave: Encoder non rileva movimento, Columna ru-RU: "nan" actualizado a "Encoder does not detect movement" : +2024-08-01 13:49:35,858 - INFO - Fila 5761 : Clave: Encoder rileva movimento lato sbagliato, Columna ru-RU: "nan" actualizado a "Encoder detects wrong side movement" : +2024-08-01 13:49:35,859 - INFO - Fila 5767 : Clave: Errore Hmi, Columna ru-RU: "nan" actualizado a "Hmi Error" : +2024-08-01 13:49:35,860 - INFO - Fila 5768 : Clave: Errore Hmi, Columna ru-RU: "nan" actualizado a "Hmi Error" : +2024-08-01 13:49:35,860 - INFO - Fila 5769 : Clave: Errore Hmi, Columna ru-RU: "nan" actualizado a "Hmi Error" : +2024-08-01 13:49:35,861 - INFO - Fila 5770 : Clave: Errore Hmi, Columna ru-RU: "nan" actualizado a "Hmi Error" : +2024-08-01 13:49:35,861 - INFO - Fila 5771 : Clave: Errore Hmi, Columna ru-RU: "nan" actualizado a "Hmi Error" : +2024-08-01 13:49:35,862 - INFO - Fila 5772 : Clave: Errore nel riferimento di posizione del modo CSP, Columna ru-RU: "nan" actualizado a "CSP mode position reference error" : +2024-08-01 13:49:35,862 - INFO - Fila 5773 : Clave: Errore nella sincronizzazione CSP, Columna ru-RU: "nan" actualizado a "Error in CSP synchronization" : +2024-08-01 13:49:35,864 - INFO - Fila 5781 : Clave: Etichettatrice, Columna ru-RU: "nan" actualizado a "стоп Carico Preforme" : +2024-08-01 13:49:35,864 - INFO - Fila 5782 : Clave: Etichettatrice, Columna ru-RU: "nan" actualizado a "стоп Carico Preforme" : +2024-08-01 13:49:35,864 - INFO - Fila 5783 : Clave: Etichettatrice, Columna ru-RU: "этикетировочные" actualizado a "стоп Carico Preforme" : +2024-08-01 13:49:35,865 - INFO - Fila 5784 : Clave: Etichettatrice, Columna ru-RU: "этикетировочные" actualizado a "стоп Carico Preforme" : +2024-08-01 13:49:35,873 - INFO - Fila 5869 : Clave: Fuori Posizione, Columna ru-RU: "nan" actualizado a "Out Of Position" : +2024-08-01 13:49:35,873 - INFO - Fila 5870 : Clave: Fuori Posizione, Columna ru-RU: "nan" actualizado a "Out Of Position" : +2024-08-01 13:49:35,873 - INFO - Fila 5871 : Clave: Fuori Posizione, Columna ru-RU: "nan" actualizado a "Out Of Position" : +2024-08-01 13:49:35,875 - INFO - Fila 5879 : Clave: Geosync DOS, Columna ru-RU: "nan" actualizado a "Geosync DOS" : +2024-08-01 13:49:35,877 - INFO - Fila 5899 : Clave: Hardware DRS, Columna ru-RU: "nan" actualizado a "Hardware DRS" : +2024-08-01 13:49:35,879 - INFO - Fila 5919 : Clave: In Funzione, Columna ru-RU: "nan" actualizado a "Normal Work" : +2024-08-01 13:49:35,879 - INFO - Fila 5920 : Clave: In Funzione, Columna ru-RU: "Готовый" actualizado a "Normal Work" : +2024-08-01 13:49:35,880 - INFO - Fila 5921 : Clave: In Funzione, Columna ru-RU: "nan" actualizado a "Normal Work" : +2024-08-01 13:49:35,886 - INFO - Fila 5951 : Clave: Ingresso Alto Piattaforma Tappeto, Columna ru-RU: "nan" actualizado a "Higher Infeed Platform Belt" : +2024-08-01 13:49:35,886 - INFO - Fila 5952 : Clave: Ingresso Basculante, Columna ru-RU: "nan" actualizado a "Hinge Conveyor Infeed" : +2024-08-01 13:49:35,887 - INFO - Fila 5953 : Clave: Ingresso Basso Piattaforma Accumulo, Columna ru-RU: "nan" actualizado a "Lower Infeed Platform Accumulation" : +2024-08-01 13:49:35,887 - INFO - Fila 5954 : Clave: Ingresso Basso Piattaforma Tappeto, Columna ru-RU: "nan" actualizado a "Lower Infeed Platform Belt" : +2024-08-01 13:49:35,888 - INFO - Fila 5956 : Clave: Ingresso Divisore Pacchi, Columna ru-RU: "nan" actualizado a "Pack Divider Infeed" : +2024-08-01 13:49:35,889 - INFO - Fila 5970 : Clave: Ingresso Pal Canale A (Sinistra), Columna ru-RU: "nan" actualizado a "Pal Infeed Channel A (Left)" : +2024-08-01 13:49:35,889 - INFO - Fila 5971 : Clave: Ingresso Pal Canale B (Destra), Columna ru-RU: "nan" actualizado a "Pal Infeed Channel B (Right)" : +2024-08-01 13:49:35,889 - INFO - Fila 5972 : Clave: Inizializzazione, Columna ru-RU: "nan" actualizado a "Initialization" : +2024-08-01 13:49:35,891 - INFO - Fila 5988 : Clave: Interruzione posizionamento, Columna ru-RU: "nan" actualizado a "Positioning interruption" : +2024-08-01 13:49:35,891 - INFO - Fila 5989 : Clave: Invecchiamento/sovratemperatura olio, Columna ru-RU: "nan" actualizado a "Oil aging overtemperature" : +2024-08-01 13:49:35,892 - INFO - Fila 5992 : Clave: Ion_Alm, Columna ru-RU: "nan" actualizado a "Ion_Alm" : +2024-08-01 13:49:35,892 - INFO - Fila 5993 : Clave: Ion_Level, Columna ru-RU: "nan" actualizado a "Ion_Level" : +2024-08-01 13:49:35,893 - INFO - Fila 5994 : Clave: Ion_Sts_Alm, Columna ru-RU: "nan" actualizado a "Ion_Sts_Alm" : +2024-08-01 13:49:35,893 - INFO - Fila 5995 : Clave: IPOS-ILLOP, Columna ru-RU: "nan" actualizado a "IPOS-ILLOP" : +2024-08-01 13:49:35,895 - INFO - Fila 6007 : Clave: KRONES, Columna ru-RU: "nan" actualizado a "KRONES" : +2024-08-01 13:49:35,895 - INFO - Fila 6010 : Clave: Labeller Selected, Columna ru-RU: "nan" actualizado a "Labeller Selected" : +2024-08-01 13:49:35,899 - INFO - Fila 6027 : Clave: Lubrificazione EcoLab, Columna ru-RU: "nan" actualizado a "EcoLab Lubrification" : +2024-08-01 13:49:35,916 - INFO - Fila 6386 : Clave: Macchina Vuota, Columna ru-RU: "пустая машина" actualizado a "стоп Carico Preforme" : +2024-08-01 13:49:35,916 - INFO - Fila 6387 : Clave: Macchina Vuota, Columna ru-RU: "пустая машина" actualizado a "стоп Carico Preforme" : +2024-08-01 13:49:35,917 - INFO - Fila 6388 : Clave: Macchina Vuota, Columna ru-RU: "пустая машина" actualizado a "стоп Carico Preforme" : +2024-08-01 13:49:35,917 - INFO - Fila 6389 : Clave: Macchina Vuota, Columna ru-RU: "пустая машина" actualizado a "стоп Carico Preforme" : +2024-08-01 13:49:35,937 - INFO - Fila 6516 : Clave: Modalità fieldbus incompatibile con hardware presente, Columna ru-RU: "nan" actualizado a "Fieldbus mode incompatible with hardware present" : +2024-08-01 13:49:35,941 - INFO - Fila 6539 : Clave: Nessuna Richiesta, Columna ru-RU: "nan" actualizado a "No Request" : +2024-08-01 13:49:35,941 - INFO - Fila 6540 : Clave: Nessuna Richiesta, Columna ru-RU: "nan" actualizado a "No Request" : +2024-08-01 13:49:35,942 - INFO - Fila 6541 : Clave: Nessuna Richiesta, Columna ru-RU: "nan" actualizado a "No Request" : +2024-08-01 13:49:35,942 - INFO - Fila 6542 : Clave: Nessuna Richiesta, Columna ru-RU: "nan" actualizado a "No Request" : +2024-08-01 13:49:35,942 - INFO - Fila 6543 : Clave: Nessuna Richiesta, Columna ru-RU: "nan" actualizado a "No Request" : +2024-08-01 13:49:35,943 - INFO - Fila 6544 : Clave: Nessuna Segnalazione, Columna ru-RU: "nan" actualizado a "No Allarm: In Production" : +2024-08-01 13:49:35,943 - INFO - Fila 6545 : Clave: Nessuna Segnalazione: In Produzione, Columna ru-RU: "nan" actualizado a "No Allarm: In Production" : +2024-08-01 13:49:35,943 - INFO - Fila 6546 : Clave: Nessuna Segnalazione: In Produzione, Columna ru-RU: "nan" actualizado a "No Allarm: In Production" : +2024-08-01 13:49:35,943 - INFO - Fila 6547 : Clave: Nessuna Segnalazione: In Produzione, Columna ru-RU: "nan" actualizado a "No Allarm: In Production" : +2024-08-01 13:49:35,944 - INFO - Fila 6548 : Clave: Nessuna Segnalazione: In Produzione, Columna ru-RU: "nan" actualizado a "No Allarm: In Production" : +2024-08-01 13:49:35,944 - INFO - Fila 6549 : Clave: Nessuna Segnalazione: In Produzione, Columna ru-RU: "nan" actualizado a "No Allarm: In Production" : +2024-08-01 13:49:35,944 - INFO - Fila 6550 : Clave: Nessuna Selezione, Columna ru-RU: "nan" actualizado a "Nessuna Selezione" : +2024-08-01 13:49:35,945 - INFO - Fila 6551 : Clave: Nessuna Selezione, Columna ru-RU: "nan" actualizado a "Nessuna Selezione" : +2024-08-01 13:49:35,959 - INFO - Fila 6690 : Clave: Paletizzatore, Columna ru-RU: "nan" actualizado a "Palletizer" : +2024-08-01 13:49:35,992 - ERROR - Fila 6931, Columna ru-RU: "Recipe_element_14" valor:"Recipe_element_<>" no actualizado porque Error de verificación: - Celda clave: RCP\CONSENSI\DISCHARGE\SYNCHROBLOC - Celda traducida: Recipe_element_<> - Dígitos en clave: 0, Dígitos en traducida: 1 - Tags en clave: 0, Tags en traducida: 0 : +2024-08-01 13:49:35,992 - ERROR - Fila 6932, Columna ru-RU: "Recipe_element_13" valor:"Recipe_element_<>" no actualizado porque Error de verificación: - Celda clave: RCP\CONSENSI\INFEED\SYNCHROBLOC - Celda traducida: Recipe_element_<> - Dígitos en clave: 0, Dígitos en traducida: 1 - Tags en clave: 0, Tags en traducida: 0 : +2024-08-01 13:49:35,998 - INFO - Fila 6966 : Clave: Riempitrice, Columna ru-RU: "nan" actualizado a "Filler" : +2024-08-01 13:49:35,998 - INFO - Fila 6967 : Clave: Riempitrice, Columna ru-RU: "наполнитель" actualizado a "Filler" : +2024-08-01 13:49:35,998 - INFO - Fila 6968 : Clave: Riempitrice, Columna ru-RU: "наполнитель" actualizado a "Filler" : +2024-08-01 13:49:35,999 - INFO - Fila 6969 : Clave: Riempitrice, Columna ru-RU: "наполнитель" actualizado a "Filler" : +2024-08-01 13:49:35,999 - INFO - Fila 6970 : Clave: Riempitrice, Columna ru-RU: "наполнитель" actualizado a "Filler" : +2024-08-01 13:49:35,999 - INFO - Fila 6971 : Clave: Riempitrice, Columna ru-RU: "наполнитель" actualizado a "Filler" : +2024-08-01 13:49:36,000 - INFO - Fila 6972 : Clave: Riempitrice, Columna ru-RU: "наполнитель" actualizado a "Filler" : +2024-08-01 13:49:36,000 - INFO - Fila 6973 : Clave: Riferimento Etichettatrice, Columna ru-RU: "nan" actualizado a "Labeller Reference" : +2024-08-01 13:49:36,000 - INFO - Fila 6974 : Clave: Riferimento Etichettatrice, Columna ru-RU: "nan" actualizado a "Labeller Reference" : +2024-08-01 13:49:36,001 - INFO - Fila 6983 : Clave: Riferimento Pal, Columna ru-RU: "nan" actualizado a "Pal Reference" : +2024-08-01 13:49:36,001 - INFO - Fila 6984 : Clave: Riferimento Pal, Columna ru-RU: "nan" actualizado a "Pal Reference" : +2024-08-01 13:49:36,001 - INFO - Fila 6985 : Clave: Riferimento Riempitrice, Columna ru-RU: "nan" actualizado a "Filler Reference" : +2024-08-01 13:49:36,002 - INFO - Fila 6986 : Clave: Riferimento Riempitrice, Columna ru-RU: "nan" actualizado a "Filler Reference" : +2024-08-01 13:49:36,002 - INFO - Fila 6987 : Clave: Riferimento Riempitrice, Columna ru-RU: "nan" actualizado a "Filler Reference" : +2024-08-01 13:49:36,002 - INFO - Fila 6988 : Clave: Riferimento VDOS, Columna ru-RU: "nan" actualizado a "VDOS Reference" : +2024-08-01 13:49:36,003 - INFO - Fila 6989 : Clave: Riferimento VREC, Columna ru-RU: "nan" actualizado a "VREC Reference" : +2024-08-01 13:49:36,003 - INFO - Fila 6990 : Clave: Riferimento VREC, Columna ru-RU: "nan" actualizado a "VREC Reference" : +2024-08-01 13:49:36,003 - INFO - Fila 6991 : Clave: Riferimento VREC, Columna ru-RU: "nan" actualizado a "VREC Reference" : +2024-08-01 13:49:36,003 - INFO - Fila 6992 : Clave: Riferimento VREC, Columna ru-RU: "nan" actualizado a "VREC Reference" : +2024-08-01 13:49:36,004 - INFO - Fila 6993 : Clave: Riferimento VSFI, Columna ru-RU: "nan" actualizado a "VSFI Reference" : +2024-08-01 13:49:36,004 - INFO - Fila 6994 : Clave: Riferimento VSFI, Columna ru-RU: "nan" actualizado a "VSFI Reference" : +2024-08-01 13:49:36,004 - INFO - Fila 6995 : Clave: Ripartenza Anticipata Etichettatrice, Columna ru-RU: "nan" actualizado a "Labeller Early Restart" : +2024-08-01 13:49:36,005 - INFO - Fila 6996 : Clave: Ripartenza Anticipata Monoblocco, Columna ru-RU: "nan" actualizado a "Sinchrobloc Early Restart" : +2024-08-01 13:49:36,005 - INFO - Fila 6997 : Clave: Ripartenza Anticipata Riempitrice, Columna ru-RU: "nan" actualizado a "Filler Early Restart" : +2024-08-01 13:49:36,019 - INFO - Fila 7190 : Clave: Scheda fieldbus non coerente con quella selezionata, Columna ru-RU: "nan" actualizado a "Fieldbus card not consistent with the selected one" : +2024-08-01 13:49:36,019 - INFO - Fila 7191 : Clave: Scheda fieldbus non inizializzata correttamente, Columna ru-RU: "nan" actualizado a "Fieldbus card not initialised correctly" : +2024-08-01 13:49:36,019 - INFO - Fila 7192 : Clave: Scheda wireless non funzionante, Columna ru-RU: "nan" actualizado a "Wireless card not working" : +2024-08-01 13:49:36,020 - INFO - Fila 7193 : Clave: Scheda wireless non funzionante, Columna ru-RU: "nan" actualizado a "Wireless card not working" : +2024-08-01 13:49:36,048 - INFO - Fila 7339 : Clave: Scorta, Columna ru-RU: "запасной" actualizado a "стоп Carico Preforme" : +2024-08-01 13:49:36,048 - INFO - Fila 7340 : Clave: Scorta, Columna ru-RU: "запасной" actualizado a "стоп Carico Preforme" : +2024-08-01 13:49:36,049 - INFO - Fila 7341 : Clave: Scorta, Columna ru-RU: "запасной" actualizado a "стоп Carico Preforme" : +2024-08-01 13:49:36,049 - INFO - Fila 7342 : Clave: Scorta, Columna ru-RU: "запасной" actualizado a "стоп Carico Preforme" : +2024-08-01 13:49:36,049 - INFO - Fila 7343 : Clave: Scorta, Columna ru-RU: "запасной" actualizado a "стоп Carico Preforme" : +2024-08-01 13:49:36,050 - INFO - Fila 7344 : Clave: Scorta, Columna ru-RU: "запасной" actualizado a "стоп Carico Preforme" : +2024-08-01 13:49:36,050 - INFO - Fila 7345 : Clave: Scorta, Columna ru-RU: "запасной" actualizado a "стоп Carico Preforme" : +2024-08-01 13:49:36,050 - INFO - Fila 7346 : Clave: Scorta, Columna ru-RU: "запасной" actualizado a "стоп Carico Preforme" : +2024-08-01 13:49:36,051 - INFO - Fila 7347 : Clave: Scorta, Columna ru-RU: "запасной" actualizado a "стоп Carico Preforme" : +2024-08-01 13:49:36,051 - INFO - Fila 7348 : Clave: Scorta, Columna ru-RU: "запасной" actualizado a "стоп Carico Preforme" : +2024-08-01 13:49:36,051 - INFO - Fila 7349 : Clave: Scorta, Columna ru-RU: "запасной" actualizado a "стоп Carico Preforme" : +2024-08-01 13:49:36,052 - INFO - Fila 7350 : Clave: Scorta, Columna ru-RU: "запасной" actualizado a "стоп Carico Preforme" : +2024-08-01 13:49:36,052 - INFO - Fila 7351 : Clave: Scorta, Columna ru-RU: "запасной" actualizado a "стоп Carico Preforme" : +2024-08-01 13:49:36,052 - INFO - Fila 7352 : Clave: Scorta, Columna ru-RU: "запасной" actualizado a "стоп Carico Preforme" : +2024-08-01 13:49:36,064 - INFO - Fila 7418 : Clave: Secury memory scheda fieldbus non funzionante, Columna ru-RU: "nan" actualizado a "Security memory fieldbus card not working" : +2024-08-01 13:49:36,070 - ERROR - Fila 7467, Columna ru-RU: "Настройка смазки — зона 1 [Mxx-Myy]" valor:"Настройка смазки — зона <> [Mxx-Myy]" no actualizado porque Error de verificación: - Celda clave: Setup Lubrificazione a Secco - Celda traducida: Настройка смазки — зона <> [Mxx-Myy] - Dígitos en clave: 0, Dígitos en traducida: 1 - Tags en clave: 0, Tags en traducida: 0 : +2024-08-01 13:49:36,076 - INFO - Fila 7507 : Clave: Sleever, Columna ru-RU: "nan" actualizado a "Sleever" : +2024-08-01 13:49:36,076 - INFO - Fila 7509 : Clave: Soffiatrice, Columna ru-RU: "nan" actualizado a "Blower" : +2024-08-01 13:49:36,079 - INFO - Fila 7531 : Clave: SPEED - Actual Hz, Columna ru-RU: "скорость - актual Hz" actualizado a "фактическая скор. Hz" : +2024-08-01 13:49:36,079 - INFO - Fila 7532 : Clave: SPEED - Actual Hz, Columna ru-RU: "фактическая скор Hz" actualizado a "фактическая скор. Hz" : +2024-08-01 13:49:36,080 - INFO - Fila 7535 : Clave: SPEED - Req Hz, Columna ru-RU: "скорость - обязательный Hz" actualizado a "требуемая ско. Hz" : +2024-08-01 13:49:36,080 - INFO - Fila 7536 : Clave: SPEED - Req Hz, Columna ru-RU: "требуемая ско Hz" actualizado a "требуемая ско. Hz" : +2024-08-01 13:49:36,084 - INFO - Fila 7570 : Clave: Storico Allarmi, Columna ru-RU: "история аварий" actualizado a "история тревоги" : +2024-08-01 13:49:36,086 - INFO - Fila 7592 : Clave: Switch di homing non configurati correttamente, Columna ru-RU: "nan" actualizado a "Homing switches not configured correctly" : +2024-08-01 13:49:36,111 - ERROR - Fila 8015, Columna ru-RU: "Recipe_element_2" valor:"Recipe_element_<>" no actualizado porque Error de verificación: - Celda clave: TILTER/PID_RCP - Celda traducida: Recipe_element_<> - Dígitos en clave: 0, Dígitos en traducida: 1 - Tags en clave: 0, Tags en traducida: 0 : +2024-08-01 13:49:36,111 - ERROR - Fila 8016, Columna ru-RU: "Recipe_element_1" valor:"Recipe_element_<>" no actualizado porque Error de verificación: - Celda clave: TILTER/RCP - Celda traducida: Recipe_element_<> - Dígitos en clave: 0, Dígitos en traducida: 1 - Tags en clave: 0, Tags en traducida: 0 : +2024-08-01 13:49:36,114 - INFO - Fila 8028 : Clave: Timeout durante procedura Homing, Columna ru-RU: "nan" actualizado a "Timeout during Homing procedure" : +2024-08-01 13:49:36,115 - INFO - Fila 8056 : Clave: Tipo di Motore non Selezionato, Columna ru-RU: "nan" actualizado a "Engine Type Not Selected" : +2024-08-01 13:49:36,121 - INFO - Fila 8090 : Clave: Trasportatori Pacchi In Ingresso In Marcia, Columna ru-RU: "nan" actualizado a "Infeed Pack Conveyors Running" : +2024-08-01 13:49:36,122 - INFO - Fila 8095 : Clave: Trasporti In Igresso Canale Sinistro (A) In Marcia, Columna ru-RU: "nan" actualizado a "Left (A) Infeed Conveyors Running" : +2024-08-01 13:49:36,123 - INFO - Fila 8096 : Clave: Trasporti In Igresso Canale Sinistro (A) In Marcia, Columna ru-RU: "nan" actualizado a "Left (A) Infeed Conveyors Running" : +2024-08-01 13:49:36,125 - INFO - Fila 8105 : Clave: Trasporto Alto Piattaforma, Columna ru-RU: "nan" actualizado a "Higher Conveyor Platform" : +2024-08-01 13:49:36,126 - INFO - Fila 8106 : Clave: Trasporto Basso Piattaforma, Columna ru-RU: "nan" actualizado a "Lower Conveyor Platform" : +2024-08-01 13:49:36,129 - INFO - Fila 8151 : Clave: Uscita Alta Basculante, Columna ru-RU: "nan" actualizado a "Higher Discharge Hinge Conveyor" : +2024-08-01 13:49:36,129 - INFO - Fila 8154 : Clave: Uscita Bassa Basculante, Columna ru-RU: "nan" actualizado a "Lower Discharge Hinge Conveyor" : +2024-08-01 13:49:36,130 - INFO - Fila 8155 : Clave: Uscita Divisore Pacchi, Columna ru-RU: "nan" actualizado a "Pack Divider Discharge" : +2024-08-01 13:49:36,130 - INFO - Fila 8156 : Clave: Uscita Divisore Pacchi Destra, Columna ru-RU: "nan" actualizado a "Pack Divider Discharge Right" : +2024-08-01 13:49:36,130 - INFO - Fila 8157 : Clave: Uscita Divisore Pacchi Sinistra, Columna ru-RU: "nan" actualizado a "Pack Divider Discharge Left" : +2024-08-01 13:49:36,130 - INFO - Fila 8158 : Clave: Uscita Etichettatrice, Columna ru-RU: "nan" actualizado a "Labeller Discharge" : +2024-08-01 13:49:36,131 - INFO - Fila 8162 : Clave: Uscita Etichettatrice (Rallentatore), Columna ru-RU: "nan" actualizado a "Labeller Discharge (Slowing Conveyor)" : +2024-08-01 13:49:36,132 - INFO - Fila 8172 : Clave: Uscita Manigliatrice (Accumulo, Destro), Columna ru-RU: "nan" actualizado a "Handler Discharge (Accumulation, Right)" : +2024-08-01 13:49:36,132 - INFO - Fila 8173 : Clave: Uscita Manigliatrice (Accumulo, Sinistro), Columna ru-RU: "nan" actualizado a "Handler Discharge (Accumulation, Left)" : +2024-08-01 13:49:36,132 - INFO - Fila 8174 : Clave: Uscita Piattaforma, Columna ru-RU: "nan" actualizado a "Platform Discharge" : +2024-08-01 13:49:36,132 - INFO - Fila 8175 : Clave: Uscita Piattaforma Accumulo, Columna ru-RU: "nan" actualizado a "Platform Discharge Accumulation" : +2024-08-01 13:49:36,133 - INFO - Fila 8176 : Clave: Uscita Sinchrobloc, Columna ru-RU: "nan" actualizado a "Sinchrobloc Discharge" : +2024-08-01 13:49:36,133 - INFO - Fila 8177 : Clave: Uscita Sinchrobloc (Bancale di Scarto), Columna ru-RU: "nan" actualizado a "Sinchrobloc Discharge (Reject Table)" : +2024-08-01 13:49:36,133 - INFO - Fila 8179 : Clave: Uscita Sinchrobloc (Rallentatore), Columna ru-RU: "nan" actualizado a "Sinchrobloc Discharge (Slowing Conveyor)" : +2024-08-01 13:49:36,140 - INFO - Fila 8245 : Clave: Velocità Attuale, Columna ru-RU: "диаметр бутылок " actualizado a "максимальная скорость" : +2024-08-01 13:49:36,147 - INFO - Fila 8282 : Clave: Verificare Con Formato, Columna ru-RU: "nan" actualizado a "Check With Format" : +2024-08-01 13:49:36,147 - INFO - Fila 8283 : Clave: Verificare Con Formato, Columna ru-RU: "nan" actualizado a "Check With Format" : +2024-08-01 13:49:36,147 - INFO - Fila 8284 : Clave: Verificare Con Formato, Columna ru-RU: "nan" actualizado a "Check With Format" : +2024-08-01 13:49:36,147 - INFO - Fila 8285 : Clave: Verificare Con Formato, Columna ru-RU: "nan" actualizado a "Check With Format" : +2024-08-01 13:49:36,148 - INFO - Fila 8286 : Clave: Verificare Con Formato, Columna ru-RU: "nan" actualizado a "Check With Format" : +2024-08-01 13:49:42,755 - INFO - Se han actualizado las filas en C:/Trabajo/VM/22 - 93841 - Sidel - Tilting/Reporte/Translate/TIAProjectTexts.xlsx desde el archivo maestro. : +2024-08-01 13:49:42,755 - INFO - .... : diff --git a/manejoArchivos.py b/manejoArchivos.py index f99cc52..bc9fcca 100644 --- a/manejoArchivos.py +++ b/manejoArchivos.py @@ -13,8 +13,8 @@ def select_file(extension = "txt"): # Open file dialog and return the selected file path file_path = filedialog.askopenfilename( - title="Select a .db file", - filetypes=(("DB files", f"*.{extension}"), ("All files", "*.*")) + title=f"Select a .{extension} file", + filetypes=((f"{extension} files", f"*.{extension}"), ("All files", "*.*")) ) return file_path diff --git a/x1_importar_to_master.py b/x1_importar_to_master.py index 00c30e1..c14da20 100644 --- a/x1_importar_to_master.py +++ b/x1_importar_to_master.py @@ -2,34 +2,27 @@ import pandas as pd import os import re from manejoArchivos import select_file -import funciones_comunes - -def es_columna_tipo_xxYY(columna): - # Verificar si la columna es del tipo "xx-YY" usando una expresión regular - return bool(re.match(r'^[a-z]{2}-[A-Z]{2}$', columna)) - -def sustituir_digitos(celda): - # Convertir a cadena y sustituir secuencias de dígitos por [[digits]] - if pd.isnull(celda): - return celda - return re.sub(r'\d+', '[[digits]]', str(celda)) +import funciones_comunes as fc def preprocesar_importacion(df_importacion): # Iterar sobre las filas del DataFrame de importación for index, fila in df_importacion.iterrows(): - clave_original = str(fila['it-IT']) - clave_sustituida = sustituir_digitos(clave_original) - + clave_original = str(fila["it-IT"]) + clave_sustituida = fc.compactar_celda_clave(clave_original) + # Sustituir en las demás columnas del tipo "xx-YY" for columna in df_importacion.columns: - if columna != 'it-IT' and es_columna_tipo_xxYY(columna): - df_importacion.at[index, columna] = funciones_comunes.transformar_texto(sustituir_digitos(fila[columna])) - + if columna != "it-IT" and fc.es_columna_tipo_xxYY(columna): + df_importacion.at[index, columna] = ( + fc.compactar_celda_traducida(fila[columna]) + ) + # Guardar la clave sustituida - df_importacion.at[index, 'it-IT'] = clave_sustituida + df_importacion.at[index, "it-IT"] = clave_sustituida return df_importacion + def importar(archivo_maestro, archivo_importacion): if not os.path.exists(archivo_maestro): # Crear un DataFrame maestro vacío con la columna "it-IT" @@ -59,7 +52,10 @@ def importar(archivo_maestro, archivo_importacion): # Agregar columnas del tipo "xx-YY" que no existen en el archivo maestro for columna in nuevas_filas.columns: - if es_columna_tipo_xxYY(columna) and columna not in df_maestro.columns: + if ( + fc.es_columna_tipo_xxYY(columna) + and columna not in df_maestro.columns + ): df_maestro[columna] = None # Crear una lista de diccionarios para las filas que se van a agregar @@ -71,7 +67,11 @@ def importar(archivo_maestro, archivo_importacion): if clave not in claves_maestro: claves_maestro.add(clave) # Solo agregar las columnas del tipo "xx-YY" y "it-IT" - fila_filtrada = {col: fila[col] for col in fila.index if col == "it-IT" or es_columna_tipo_xxYY(col)} + fila_filtrada = { + col: fila[col] + for col in fila.index + if col == "it-IT" or fc.es_columna_tipo_xxYY(col) + } filas_a_agregar.append(fila_filtrada) # Concatenar las nuevas filas al DataFrame maestro @@ -83,6 +83,7 @@ def importar(archivo_maestro, archivo_importacion): df_maestro.to_excel(archivo_maestro, index=False) print(f"Se han agregado {len(filas_a_agregar)} nuevas filas al archivo maestro.") + if __name__ == "__main__": # Cargar el archivo maestro y el archivo de importación archivo_maestro = ".\\data\\1_hmi_master_translates.xlsx" diff --git a/x2_master_export2translate.py b/x2_master_export2translate.py index 8d11e8b..97f2f7d 100644 --- a/x2_master_export2translate.py +++ b/x2_master_export2translate.py @@ -1,9 +1,9 @@ import pandas as pd import os from manejoArchivos import select_file -import funciones_comunes +import funciones_comunes as fc -def exportar_para_traduccion(archivo_maestro): +def exportar_para_traduccion(archivo_maestro, target_lang_code): if not os.path.exists(archivo_maestro): print("El archivo maestro no existe.") return @@ -15,16 +15,20 @@ def exportar_para_traduccion(archivo_maestro): # Copiar la primera columna tal cual df_export[df_maestro.columns[0]] = df_maestro[df_maestro.columns[0]] - - # Transformar las demás columnas - for columna in df_maestro.columns[1:]: - df_export[columna] = df_maestro[columna].apply(lambda x: funciones_comunes.transformar_texto(str(x)) if pd.notnull(x) else x) + df_export[target_lang_code] = df_maestro[target_lang_code] # Guardar el archivo exportado ruta_export = os.path.join(os.path.dirname(archivo_maestro), '2_master_export2translate.xlsx') - df_export.to_excel(ruta_export, index=False) + fc.save_dataframe_with_retries(df_export,output_path=ruta_export) + print(f"Archivo exportado para traducción: {ruta_export}") if __name__ == "__main__": archivo_maestro = ".\\data\\1_hmi_master_translates.xlsx" - exportar_para_traduccion(archivo_maestro) + fc.mostrar_idiomas() + seleccion_idioma = int(input("Introduce el número del idioma de destino: ")) + if seleccion_idioma not in fc.IDIOMAS: + print("Selección inválida.") + else: + _, target_lang_code = fc.IDIOMAS[seleccion_idioma] + exportar_para_traduccion(archivo_maestro, target_lang_code) diff --git a/x3_llm_translate_text.py b/x3_llm_translate_text.py index 76f6f27..ef3fcb8 100644 --- a/x3_llm_translate_text.py +++ b/x3_llm_translate_text.py @@ -2,7 +2,6 @@ import pandas as pd from openai import OpenAI import os import re -import logging from openai_api_key import openai_api_key from google_api_key import google_api_key import ollama @@ -11,22 +10,11 @@ from google.cloud import translate_v2 as translate from google.oauth2 import service_account import html from tqdm import tqdm -import funciones_comunes +import funciones_comunes as fc openai_client = OpenAI(api_key=openai_api_key()) GOOGLE_APPLICATION_CREDENTIALS = "translate-431108-020c17463fbb.json" - - -def configurar_logger(): - logger = logging.getLogger("translate_logger") - logger.setLevel(logging.DEBUG) - os.makedirs(".\\data", exist_ok=True) - fh = logging.FileHandler(".\\data\\translate_log.log", encoding="utf-8") - fh.setLevel(logging.DEBUG) - formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") - fh.setFormatter(formatter) - logger.addHandler(fh) - return logger +logger = fc.configurar_logger() def init_google_translate_client(): @@ -41,19 +29,14 @@ def init_google_translate_client(): "No se han proporcionado credenciales válidas para Google Translate" ) - google_translate_client = init_google_translate_client() - def google_translate(text, target_language): result = google_translate_client.translate(text, target_language=target_language) translated_text = result["translatedText"] return html.unescape(translated_text) -logger = configurar_logger() - - def read_system_prompt(): try: with open(".\\data\\system_prompt.txt", "r", encoding="utf-8") as file: @@ -130,7 +113,9 @@ def affinity_batch_openai(texts_dict): "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." ) - original_list = [funciones_comunes.transformar_texto(key) for key in texts_dict.keys()] + original_list = [ + fc.compactar_celda_traducida(key) for key in texts_dict.keys() + ] re_translated_list = list(texts_dict.values()) request_payload = json.dumps( @@ -162,8 +147,8 @@ def affinity_batch_openai(texts_dict): raise ValueError("La respuesta no se pudo decodificar como JSON.") # Manejar diferentes formatos de respuesta - if isinstance(response_payload, dict) and 'similarity_scores' in response_payload: - scores = response_payload['similarity_scores'] + if isinstance(response_payload, dict) and "similarity_scores" in response_payload: + scores = response_payload["similarity_scores"] elif isinstance(response_payload, list): scores = response_payload else: @@ -198,26 +183,28 @@ def main(file_path, target_lang_code, target_lang, traducir_todo, batch_size=10) texts_to_translate = {} for _, row in df.iterrows(): - source_text = str(row[source_col]) + celda_clave = str(row[source_col]) source_translated_text = ( str(row[source_translated_col]) if source_translated_col in df.columns else "" ) - processed_text = funciones_comunes.transformar_texto(source_text) + celda_clave_compactada = fc.compactar_celda_traducida(celda_clave) if traducir_todo: - if texto_requiere_traduccion(processed_text): - texts_to_translate[source_text] = processed_text + if texto_requiere_traduccion(celda_clave_compactada): + texts_to_translate[celda_clave] = celda_clave_compactada else: if ( pd.isna(row[source_translated_col]) or source_translated_text.strip() == "" ): - if texto_requiere_traduccion(processed_text): - texts_to_translate[source_text] = processed_text + if texto_requiere_traduccion(celda_clave_compactada): + texts_to_translate[celda_clave] = celda_clave_compactada num_texts = len(texts_to_translate) + num_texts = 40 + logger.info(f"Número total de textos a traducir: {num_texts}") print(f"Número total de textos a traducir: {num_texts}") @@ -258,17 +245,19 @@ def main(file_path, target_lang_code, target_lang, traducir_todo, batch_size=10) # Traduccion inversa # Actualizar el DataFrame con las traducciones y hacemos la Traduccion inversa - for index, row in tqdm(df.iterrows(), total=df.shape[0], desc="Procesando traducciones"): - source_text = str(row[source_col]) - if source_text in translations: - df.at[index, target_col] = translations[source_text] + for index, row in tqdm( + df.iterrows(), total=df.shape[0], desc="Procesando traducciones" + ): + celda_clave = str(row[source_col]) + if celda_clave in translations: + df.at[index, target_col] = translations[celda_clave] # Realizar la traducción de verificación con Google Translate try: - google_translation = google_translate(translations[source_text], "it") + google_translation = google_translate(translations[celda_clave], "it") df.at[index, check_translate_col] = google_translation except Exception as e: logger.error( - f"Error en la traducción de Google para el texto '{source_text}': {e}" + f"Error en la traducción de Google para el texto '{celda_clave}': {e}" ) df.at[index, check_translate_col] = "Error en la traducción" df.at[index, affinity_col] = 0.0 @@ -276,8 +265,7 @@ def main(file_path, target_lang_code, target_lang, traducir_todo, batch_size=10) # Afinidades # Se calculan las Afinidades affinities = {} - batch_size = 10 - for start_idx in range(0, num_texts, batch_size): + for start_idx in range(0, num_texts, batch_size): # num_text end_idx = min(start_idx + batch_size, num_texts) batch_texts = dict(list(texts_to_translate.items())[start_idx:end_idx]) logger.info(f"Afinidad: celdas desde {start_idx} a {end_idx}.") @@ -307,14 +295,14 @@ def main(file_path, target_lang_code, target_lang, traducir_todo, batch_size=10) # Actualizar el DataFrame con las Afinidades for index, row in df.iterrows(): - source_text = str(row[source_col]) - if source_text in affinities: - df.at[index, affinity_col] = affinities[source_text] + celda_clave = str(row[source_col]) + if celda_clave in affinities: + df.at[index, affinity_col] = affinities[celda_clave] output_path = os.path.join( os.path.dirname(file_path), "3_master_export2translate_translated.xlsx" ) - funciones_comunes.save_dataframe_with_retries(df,output_path=output_path) + fc.save_dataframe_with_retries(df, output_path=output_path) logger.info(f"Archivo traducido guardado en: {output_path}") print(f"Archivo traducido guardado en: {output_path}") @@ -323,12 +311,12 @@ if __name__ == "__main__": batch_size = 20 translate_file = ".\\data\\2_master_export2translate.xlsx" - funciones_comunes.mostrar_idiomas() + fc.mostrar_idiomas() seleccion_idioma = int(input("Introduce el número del idioma de destino: ")) - if seleccion_idioma not in funciones_comunes.IDIOMAS: + if seleccion_idioma not in fc.IDIOMAS: print("Selección inválida.") else: - target_lang, target_lang_code = funciones_comunes.IDIOMAS[seleccion_idioma] + target_lang, target_lang_code = fc.IDIOMAS[seleccion_idioma] traducir_todo = ( input("¿Desea traducir todas las celdas (s/n)? ").strip().lower() == "s" ) diff --git a/x4_import_translate2master.py b/x4_import_translate2master.py deleted file mode 100644 index 4c402c0..0000000 --- a/x4_import_translate2master.py +++ /dev/null @@ -1,69 +0,0 @@ -import pandas as pd -import os -import re -import logging -from manejoArchivos import select_file - -def configurar_logger(ruta_log): - os.makedirs(".\\data", exist_ok=True) - logger = logging.getLogger('.\\data\\importacion_logger') - logger.setLevel(logging.INFO) - fh = logging.FileHandler(ruta_log, encoding='utf-8') - fh.setLevel(logging.INFO) - formatter = logging.Formatter('%(asctime)s - %(message)s') - fh.setFormatter(formatter) - logger.addHandler(fh) - return logger - -def revertir_transformaciones(texto, digitos, secciones): - # 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(archivo_maestro, archivo_traduccion): - if not os.path.exists(archivo_maestro): - print("El archivo maestro no existe.") - return - - df_maestro = pd.read_excel(archivo_maestro) - df_traduccion = pd.read_excel(archivo_traduccion) - - # Configurar el logger - directorio = os.path.dirname(archivo_maestro) - nombre_log = os.path.join(directorio, 'importacion_traduccion.log') - logger = configurar_logger(nombre_log) - - # Iterar sobre las filas del archivo de traducción para revertir transformaciones y 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: - # Obtener los dígitos y secciones originales de la clave - digitos = re.findall(r'\d+', str(clave)) - secciones = re.findall(r'<(.*?)>', str(clave)) - - # Actualizar solo las columnas que existen en df_maestro y df_traduccion - for columna in df_traduccion.columns[1:]: - if columna in df_maestro.columns: - valor_traducido = fila[columna] - if pd.isnull(valor_traducido): - continue # Omitir celdas vacías - valor_original = df_maestro.loc[df_maestro[df_maestro.columns[0]] == clave, columna].values[0] - valor_revertido = revertir_transformaciones(valor_traducido, digitos, secciones) - - if pd.notnull(valor_original) and str(valor_original) != valor_revertido: - df_maestro.loc[df_maestro[df_maestro.columns[0]] == clave, columna] = valor_revertido - logger.info(f'Fila {index}, Columna {columna}: "{valor_original}" actualizado a "{valor_revertido}"') - - # Guardar el archivo maestro actualizado - df_maestro.to_excel(archivo_maestro, index=False) - print(f"Traducciones importadas y archivo maestro actualizado: {archivo_maestro}. Detalles de los cambios en {nombre_log}") - - -if __name__ == "__main__": - archivo_maestro = ".\\data\\1_hmi_master_translates.xlsx" - archivo_traduccion = ".\\data\\2_master_export2translate.xlsx" - importar_traduccion(archivo_maestro, archivo_traduccion) diff --git a/x3.5_integrate_translates.py b/x4_integrate_translates.py similarity index 72% rename from x3.5_integrate_translates.py rename to x4_integrate_translates.py index d3fd8c5..4625b6f 100644 --- a/x3.5_integrate_translates.py +++ b/x4_integrate_translates.py @@ -1,22 +1,10 @@ -import funciones_comunes - +import funciones_comunes as fc import pandas as pd import os import re import logging from manejoArchivos import select_file -def configurar_logger(ruta_log): - os.makedirs(".\\data", exist_ok=True) - logger = logging.getLogger('.\\data\\importacion_logger') - logger.setLevel(logging.INFO) - fh = logging.FileHandler(ruta_log, encoding='utf-8') - fh.setLevel(logging.INFO) - formatter = logging.Formatter('%(asctime)s - %(message)s') - fh.setFormatter(formatter) - logger.addHandler(fh) - return logger - def revertir_transformaciones(texto, digitos, secciones): # Revertir <> a [[digits]] for digito in digitos: @@ -38,10 +26,8 @@ def importar_traduccion(archivo_maestro, archivo_traduccion, target_lang_code, n df_maestro = pd.read_excel(archivo_maestro) df_traduccion = pd.read_excel(archivo_traduccion) - # Configurar el logger - directorio = os.path.dirname(archivo_maestro) - nombre_log = os.path.join(directorio, 'importacion_traduccion.log') - logger = configurar_logger(nombre_log) + # Configurar el logger + logger = fc.configurar_logger() # Iterar sobre las filas del archivo de traducción para actualizar el maestro for index, fila in df_traduccion.iterrows(): @@ -57,8 +43,8 @@ def importar_traduccion(archivo_maestro, archivo_traduccion, target_lang_code, n logger.info(f'Fila {index}, Columna {translated_col}: "{valor_original}" actualizado a "{valor_traducido}"') # Guardar el archivo maestro actualizado - funciones_comunes.save_dataframe_with_retries(df_maestro,output_path=archivo_maestro) - print(f"Traducciones importadas y archivo maestro actualizado: {archivo_maestro}. Detalles de los cambios en {nombre_log}") + fc.save_dataframe_with_retries(df_maestro,output_path=archivo_maestro) + print(f"Traducciones importadas y archivo maestro actualizado: {archivo_maestro}.") if __name__ == "__main__": @@ -67,11 +53,11 @@ if __name__ == "__main__": 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 = float(nivel_afinidad_minimo) if nivel_afinidad_minimo else 0.5 - - funciones_comunes.mostrar_idiomas() + + fc.mostrar_idiomas() seleccion_idioma = int(input("Introduce el número del idioma de destino: ")) - if seleccion_idioma not in funciones_comunes.IDIOMAS: + if seleccion_idioma not in fc.IDIOMAS: print("Selección inválida.") else: - target_lang, target_lang_code = funciones_comunes.IDIOMAS[seleccion_idioma] + target_lang, target_lang_code = fc.IDIOMAS[seleccion_idioma] importar_traduccion(archivo_maestro, archivo_traduccion, target_lang_code, nivel_afinidad_minimo ) diff --git a/x4.5_complete_empty_cells_master.py b/x5_complete_empty_cells_master.py similarity index 60% rename from x4.5_complete_empty_cells_master.py rename to x5_complete_empty_cells_master.py index 043714f..1e0a733 100644 --- a/x4.5_complete_empty_cells_master.py +++ b/x5_complete_empty_cells_master.py @@ -1,5 +1,4 @@ -import funciones_comunes - +import funciones_comunes as fc import pandas as pd import os import re @@ -7,28 +6,6 @@ import logging from manejoArchivos import select_file -def configurar_logger(ruta_log): - os.makedirs(".\\data", exist_ok=True) - logger = logging.getLogger(".\\data\\importacion_logger") - logger.setLevel(logging.INFO) - fh = logging.FileHandler(ruta_log, encoding="utf-8") - fh.setLevel(logging.INFO) - formatter = logging.Formatter("%(asctime)s - %(message)s") - fh.setFormatter(formatter) - logger.addHandler(fh) - return logger - - -def revertir_transformaciones(texto, digitos, secciones): - # 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 complete_emptys(archivo_maestro, target_lang_code, second_lang_code): if not os.path.exists(archivo_maestro): print("El archivo maestro no existe.") @@ -40,9 +17,7 @@ def complete_emptys(archivo_maestro, target_lang_code, second_lang_code): df_maestro = pd.read_excel(archivo_maestro) # Configurar el logger - directorio = os.path.dirname(archivo_maestro) - nombre_log = os.path.join(directorio, "importacion_traduccion.log") - logger = configurar_logger(nombre_log) + logger = fc.configurar_logger() # Iterar sobre las filas del archivo de traducción para actualizar el maestro for index, fila in df_maestro.iterrows(): @@ -64,20 +39,20 @@ def complete_emptys(archivo_maestro, target_lang_code, second_lang_code): ) # Guardar el archivo maestro actualizado - funciones_comunes.save_dataframe_with_retries( + fc.save_dataframe_with_retries( df_maestro, output_path=archivo_maestro ) print( - f"Traducciones importadas y archivo maestro actualizado: {archivo_maestro}. Detalles de los cambios en {nombre_log}" + f"Traducciones importadas y archivo maestro actualizado: {archivo_maestro}." ) if __name__ == "__main__": archivo_maestro = ".\\data\\1_hmi_master_translates.xlsx" - funciones_comunes.mostrar_idiomas() + fc.mostrar_idiomas() seleccion_idioma = int(input("Introduce el número del idioma de destino: ")) - if seleccion_idioma not in funciones_comunes.IDIOMAS: + if seleccion_idioma not in fc.IDIOMAS: print("Selección inválida.") exit seleccion_idioma_secundario = int( @@ -85,10 +60,10 @@ if __name__ == "__main__": "Introduce el número del idioma de secundario para copiar desde en caso de vacios: " ) ) - if seleccion_idioma_secundario not in funciones_comunes.IDIOMAS: + if seleccion_idioma_secundario not in fc.IDIOMAS: print("Selección inválida.") exit - _, target_lang_code = funciones_comunes.IDIOMAS[seleccion_idioma] - _, second_lang_code = funciones_comunes.IDIOMAS[seleccion_idioma_secundario] + _, target_lang_code = fc.IDIOMAS[seleccion_idioma] + _, second_lang_code = fc.IDIOMAS[seleccion_idioma_secundario] complete_emptys(archivo_maestro, target_lang_code, second_lang_code) diff --git a/x5_update_from_master.py b/x5_update_from_master.py deleted file mode 100644 index 316797c..0000000 --- a/x5_update_from_master.py +++ /dev/null @@ -1,102 +0,0 @@ -import pandas as pd -import os -import re -import logging -from manejoArchivos import select_file - -def es_columna_tipo_xxYY(columna): - # Verificar si la columna es del tipo "xx-YY" usando una expresión regular - return bool(re.match(r'^[a-z]{2}-[A-Z]{2}$', columna)) - -def sustituir_digitos(celda): - # Convertir a cadena y sustituir secuencias de dígitos por [[digits]] - if pd.isnull(celda): - return celda, [] - digitos = re.findall(r'\d+', str(celda)) - celda_sustituida = re.sub(r'\d+', '[[digits]]', str(celda)) - return celda_sustituida, digitos - -def preprocesar_update(df_update): - # Diccionario para almacenar los dígitos reemplazados por fila - digitos_reemplazados = {} - - # Iterar sobre las filas del DataFrame de actualización - for index, fila in df_update.iterrows(): - clave_original = str(fila['it-IT']) - clave_sustituida, digitos = sustituir_digitos(clave_original) - digitos_reemplazados[index] = digitos - df_update.at[index, 'it-IT_preprocessed'] = clave_sustituida # Agregar una columna preprocesada - - return df_update, digitos_reemplazados - -def configurar_logger(ruta_log): - logger = logging.getLogger('actualizacion_logger') - logger.setLevel(logging.INFO) - fh = logging.FileHandler(ruta_log, encoding='utf-8') - fh.setLevel(logging.INFO) - formatter = logging.Formatter('%(asctime)s - %(message)s') - fh.setFormatter(formatter) - logger.addHandler(fh) - return logger - -def update_from_master(archivo_maestro, archivo_to_update): - if not os.path.exists(archivo_maestro): - print("El archivo maestro no existe.") - return - - df_maestro = pd.read_excel(archivo_maestro) - df_to_update = pd.read_excel(archivo_to_update) - - # Configurar el logger - directorio = os.path.dirname(archivo_to_update) - nombre_log = os.path.join(directorio, 'actualizacion.log') - logger = configurar_logger(nombre_log) - - # Preprocesar el archivo de actualización - df_to_update, digitos_reemplazados = preprocesar_update(df_to_update) - - # Obtener las claves del archivo maestro - claves_maestro = set(df_maestro["it-IT"].dropna().astype(str)) - - # Iterar sobre las filas del archivo de actualización para actualizarlas - for index, fila in df_to_update.iterrows(): - clave_preprocesada = str(fila['it-IT_preprocessed']) - if clave_preprocesada in claves_maestro: - # Obtener los dígitos originales para esta fila - digitos = digitos_reemplazados.get(index, []) - df_maestro_fila = df_maestro[df_maestro['it-IT'] == clave_preprocesada].iloc[0] - - # Verificar que la cantidad de dígitos coincida con la cantidad de [[digits]] en la clave - cantidad_digits = clave_preprocesada.count('[[digits]]') - if len(digitos) != cantidad_digits: - logger.info(f'Fila {index}: no se actualiza porque la cantidad de dígitos no coincide.') - continue - - # Actualizar solo las columnas que existen en df_to_update y que no sean 'it-IT' - for columna in df_to_update.columns: - if columna != 'it-IT' and columna != 'it-IT_preprocessed' and columna in df_maestro.columns: - valor = df_maestro_fila[columna] - # Convertir a cadena si no lo es y reemplazar [[digits]] con los dígitos originales - if not pd.isnull(valor): - valor_original = str(valor) - valor_actualizado = valor_original - for d in digitos: - valor_actualizado = valor_actualizado.replace('[[digits]]', d, 1) - # Solo actualizar si el valor ha cambiado - if str(fila[columna]) != valor_actualizado: - df_to_update.at[index, columna] = valor_actualizado - # Registrar el cambio - logger.info(f'Fila {index}, Columna {columna}: "{fila[columna]}" actualizado a "{valor_actualizado}"') - - # Eliminar la columna preprocesada - df_to_update.drop(columns=['it-IT_preprocessed'], inplace=True) - - # Guardar el archivo actualizado - df_to_update.to_excel(archivo_to_update, index=False) - print(f"Se han actualizado las filas en {archivo_to_update} desde el archivo maestro. Detalles de los cambios en {nombre_log}") - -if __name__ == "__main__": - archivo_maestro = ".\\data\\1_hmi_master_translates.xlsx" - archivo_to_update = select_file("xlsx") - if archivo_to_update: - update_from_master(archivo_maestro, archivo_to_update) diff --git a/x6_update_from_master.py b/x6_update_from_master.py new file mode 100644 index 0000000..9ac6435 --- /dev/null +++ b/x6_update_from_master.py @@ -0,0 +1,80 @@ +import pandas as pd +import os +import re +import logging +import funciones_comunes as fc +from manejoArchivos import select_file + + +def update_from_master(archivo_maestro, archivo_to_update, target_lang_code): + if not os.path.exists(archivo_maestro): + print("El archivo maestro no existe.") + return + + # Configurar el logger + logger = fc.configurar_logger() + + logger.info(" .... ") + logger.info( + f"Iniciando actualizacion en {archivo_to_update} desde el archivo maestro. Para {target_lang_code} " + ) + + df_maestro = pd.read_excel(archivo_maestro) + df_to_update = pd.read_excel(archivo_to_update) + + col_clave = df_maestro.columns[0] + + # Iterar sobre las filas del archivo de actualización para actualizarlas + for index, fila in df_to_update.iterrows(): + clave = fila[col_clave] + if not pd.isnull(clave) and clave in df_maestro[col_clave].values: + # Obtenemos los valores + valor_original = fila[col_clave] + valor_traducido_compacto = df_maestro.loc[ + df_maestro[col_clave] == clave, target_lang_code + ].values[0] + # Descompactamos + valor_traducido = fc.decompactar_celda_traducida( + celda_original=valor_original, celda_traducida=valor_traducido_compacto + ) + + if ( + not pd.isnull(valor_traducido) + and fila[target_lang_code] != valor_traducido + ): + # Salvamos en el file to Update + okToSave, Error = fc.verificar_celda_traducida( + valor_original, valor_traducido + ) + if okToSave: + logger.info( + f'Fila {index} : Clave: {clave}, Columna {target_lang_code}: "{df_to_update.at[index, target_lang_code]}" actualizado a "{valor_traducido}"' + ) + df_to_update.at[index, target_lang_code] = valor_traducido + else: + logger.error( + f'Fila {index}, Columna {target_lang_code}: "{df_to_update.at[index, target_lang_code]}" valor:"{valor_traducido}" no actualizado porque {Error}' + ) + + # Guardar el archivo actualizado + fc.save_dataframe_with_retries(df_to_update, output_path=archivo_to_update) + print( + f"Se han actualizado las filas en {archivo_to_update} desde el archivo maestro. " + ) + logger.info( + f"Se han actualizado las filas en {archivo_to_update} desde el archivo maestro. " + ) + logger.info(" .... ") + + +if __name__ == "__main__": + archivo_maestro = ".\\data\\1_hmi_master_translates.xlsx" + archivo_to_update = select_file("xlsx") + if archivo_to_update: + fc.mostrar_idiomas() + seleccion_idioma = int(input("Introduce el número del idioma de destino: ")) + if seleccion_idioma not in fc.IDIOMAS: + print("Selección inválida.") + else: + target_lang, target_lang_code = fc.IDIOMAS[seleccion_idioma] + update_from_master(archivo_maestro, archivo_to_update, target_lang_code)