From 555388ec1af1b894eba21fa39b4cb9208b810434 Mon Sep 17 00:00:00 2001 From: "[JaviLendi]" Date: Fri, 31 Oct 2025 16:41:47 +0100 Subject: [PATCH 1/4] Add auto-translate widget and update landing page to English Introduces a floating auto-translate widget using Google Translate for supported languages. Updates the landing page (welcome.html) content and labels from Spanish to English, modifies CSS for config description styling, and updates the main app entry point to use Flask's app.run. Also adds new airfoil config and state files, and updates cached plane variables. --- src/vlm/__pycache__/webui.cpython-313.pyc | Bin 0 -> 14279 bytes src/vlm/app.py | 4 +- src/vlm/data/cache_plane_variables.txt | 2 +- src/vlm/data/saved_configs/airfoil_hgj.json | 21 +++ .../e693177c-a807-452d-a0e6-887c54b30fa7.pkl | Bin 0 -> 633 bytes .../config_manager.cpython-313.pyc | Bin 0 -> 15801 bytes .../lib/__pycache__/geometry.cpython-313.pyc | Bin 0 -> 43249 bytes src/vlm/lib/__pycache__/naca.cpython-313.pyc | Bin 0 -> 7830 bytes src/vlm/lib/__pycache__/vlm.cpython-313.pyc | Bin 0 -> 47649 bytes src/vlm/static/css/style.css | 4 + src/vlm/static/js/auto-translate.js | 155 ++++++++++++++++++ src/vlm/templates/base.html | 1 + src/vlm/templates/welcome.html | 56 +++---- 13 files changed, 212 insertions(+), 31 deletions(-) create mode 100644 src/vlm/__pycache__/webui.cpython-313.pyc create mode 100644 src/vlm/data/saved_configs/airfoil_hgj.json create mode 100644 src/vlm/data/saved_states/e693177c-a807-452d-a0e6-887c54b30fa7.pkl create mode 100644 src/vlm/lib/__pycache__/config_manager.cpython-313.pyc create mode 100644 src/vlm/lib/__pycache__/geometry.cpython-313.pyc create mode 100644 src/vlm/lib/__pycache__/naca.cpython-313.pyc create mode 100644 src/vlm/lib/__pycache__/vlm.cpython-313.pyc create mode 100644 src/vlm/static/js/auto-translate.js diff --git a/src/vlm/__pycache__/webui.cpython-313.pyc b/src/vlm/__pycache__/webui.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7c9e84f33e439bf4c5ef22d970b29b5f95a2184 GIT binary patch literal 14279 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 literal 0 HcmV?d00001 diff --git a/src/vlm/app.py b/src/vlm/app.py index 27a7547..6581665 100644 --- a/src/vlm/app.py +++ b/src/vlm/app.py @@ -1028,7 +1028,7 @@ def validate_airfoil_config(): if __name__ == "__main__": optimize_resources() try: - #app.run(host='0.0.0.0', port=5001, debug=True, threaded=True) - ui.run() + app.run(host='0.0.0.0', port=5001, debug=True, threaded=True) + #ui.run() finally: thread_pool.shutdown(wait=True) \ No newline at end of file diff --git a/src/vlm/data/cache_plane_variables.txt b/src/vlm/data/cache_plane_variables.txt index 913bea1..f4c5cc9 100644 --- a/src/vlm/data/cache_plane_variables.txt +++ b/src/vlm/data/cache_plane_variables.txt @@ -1 +1 @@ -wing_sections: [{'chord_root': 1.0, 'chord_tip': 0.8, 'span_fraction': 8.0, 'sweep': np.float64(0.5235987755982988), 'alpha': np.float64(0.05235987755982989), 'dihedral': np.float64(0.06981317007977318), 'NACA_root': '3215', 'NACA_tip': '1310', 'flap_start': 0.6, 'flap_end': 0.9, 'flap_hinge_chord': 0.5, 'deflection_angle': np.float64(0.05235987755982989), 'deflection_type': 'symmetrical'}] +wing_sections: [{'chord_root': 1.0, 'chord_tip': 0.8, 'span_fraction': 8.0, 'sweep': np.float64(0.5235987755982988), 'alpha': np.float64(0.05235987755982989), 'dihedral': np.float64(0.06981317007977318), 'NACA_root': '3215', 'NACA_tip': '1310'}] diff --git a/src/vlm/data/saved_configs/airfoil_hgj.json b/src/vlm/data/saved_configs/airfoil_hgj.json new file mode 100644 index 0000000..d181956 --- /dev/null +++ b/src/vlm/data/saved_configs/airfoil_hgj.json @@ -0,0 +1,21 @@ +{ + "type": "airfoil", + "naca": "3215", + "u": 50.0, + "alpha": 0.0, + "chord": 1.0, + "n": 1000, + "description": "", + "parameters": { + "velocity": 50.0, + "angle_of_attack": 0.0, + "chord_length": 1.0, + "points": 1000 + }, + "metadata": { + "version": "1.0", + "created_at": "2025-10-29T19:04:44.990080", + "modified_at": "2025-10-29T19:04:44.990085", + "checksum": "976fe7c09f7be9d8eab53b8c37780c0e" + } +} \ No newline at end of file diff --git a/src/vlm/data/saved_states/e693177c-a807-452d-a0e6-887c54b30fa7.pkl b/src/vlm/data/saved_states/e693177c-a807-452d-a0e6-887c54b30fa7.pkl new file mode 100644 index 0000000000000000000000000000000000000000..89788498cfa130a1997abe5cab190421f9632fbe GIT binary patch literal 633 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 literal 0 HcmV?d00001 diff --git a/src/vlm/lib/__pycache__/naca.cpython-313.pyc b/src/vlm/lib/__pycache__/naca.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c196db368717399bc0bf659380ffa363668cf014 GIT binary patch literal 7830 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 literal 0 HcmV?d00001 diff --git a/src/vlm/lib/__pycache__/vlm.cpython-313.pyc b/src/vlm/lib/__pycache__/vlm.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..840fd6cab7c9e9ac155c4f761535cf836567563d GIT binary patch literal 47649 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 H);#|o{TV{! literal 0 HcmV?d00001 diff --git a/src/vlm/static/css/style.css b/src/vlm/static/css/style.css index ce67e82..b5d746f 100644 --- a/src/vlm/static/css/style.css +++ b/src/vlm/static/css/style.css @@ -232,6 +232,10 @@ html, body { padding: 0; } +.config-description { + background-color: var(--secondary-bg); +} + /* Responsive Navbar with Hamburger */ @media (max-width: 768px) { .navbar { diff --git a/src/vlm/static/js/auto-translate.js b/src/vlm/static/js/auto-translate.js new file mode 100644 index 0000000..d6647b1 --- /dev/null +++ b/src/vlm/static/js/auto-translate.js @@ -0,0 +1,155 @@ +// static/js/auto-translate.js +(function(){ + if (window._vlmpy_translate_loaded) return; + window._vlmpy_translate_loaded = true; + + // Opciones: idiomas que quieres ofrecer + const SUPPORTED_LANGS = ['es','fr','de','it','pt']; // añade/elimina códigos ISO + const PAGE_LANG = (document.documentElement.lang || 'en').split('-')[0]; + + // Helper: set cookie for Google Translate (used by widget) + function setGoogTransCookie(from, to) { + // No domain => cookie para el host actual + document.cookie = 'googtrans=/' + from + '/' + to + ';path=/'; + document.cookie = 'googtrans=/' + from + '/' + to + ';path=/;domain=' + location.hostname; + } + + // Create container for the Google widget (it will render the select if present) + const container = document.createElement('div'); + container.id = 'google_translate_element'; + // minimal hidden container: we will use our custom UI, but widget needs an element + container.style.display = 'none'; + document.body.appendChild(container); + + // Build a small floating UI (bottom-right) + const floatWrap = document.createElement('div'); + floatWrap.setAttribute('aria-hidden','false'); + floatWrap.style.position = 'fixed'; + floatWrap.style.right = '1rem'; + floatWrap.style.bottom = '1rem'; + floatWrap.style.zIndex = 999999; + floatWrap.style.fontFamily = 'Inter, Arial, sans-serif'; + floatWrap.style.userSelect = 'none'; + floatWrap.style.boxShadow = '0 6px 18px rgba(0,0,0,0.12)'; + floatWrap.style.borderRadius = '10px'; + floatWrap.style.overflow = 'hidden'; + floatWrap.style.background = 'var(--card-bg, #fff)'; + floatWrap.style.backdropFilter = 'blur(4px)'; + floatWrap.style.minWidth = '48px'; + + // Toggle button + const toggleBtn = document.createElement('button'); + toggleBtn.type = 'button'; + toggleBtn.title = 'Idioma / Language'; + toggleBtn.style.border = 'none'; + toggleBtn.style.background = 'transparent'; + toggleBtn.style.padding = '0.6rem'; + toggleBtn.style.cursor = 'pointer'; + toggleBtn.style.display = 'flex'; + toggleBtn.style.alignItems = 'center'; + toggleBtn.style.gap = '0.5rem'; + toggleBtn.style.fontSize = '0.9rem'; + + const globe = document.createElement('span'); + globe.textContent = '🌐'; + toggleBtn.appendChild(globe); + const label = document.createElement('span'); + label.textContent = (navigator.language && navigator.language.startsWith('es')) ? 'ES' : 'Lang'; + label.style.fontWeight = '600'; + toggleBtn.appendChild(label); + floatWrap.appendChild(toggleBtn); + + // Panel with language buttons (hidden by default) + const panel = document.createElement('div'); + panel.style.display = 'none'; + panel.style.padding = '0.4rem'; + panel.style.borderTop = '1px solid rgba(0,0,0,0.06)'; + panel.style.background = 'transparent'; + panel.style.display = 'grid'; + panel.style.gridTemplateColumns = 'repeat(2, auto)'; + panel.style.gap = '0.25rem'; + + // Add language buttons + SUPPORTED_LANGS.forEach(code => { + const b = document.createElement('button'); + b.type = 'button'; + b.textContent = code.toUpperCase(); + b.dataset.lang = code; + b.style.border = 'none'; + b.style.padding = '0.4rem 0.6rem'; + b.style.borderRadius = '6px'; + b.style.cursor = 'pointer'; + b.style.fontWeight = '600'; + b.style.background = 'rgba(0,0,0,0.04)'; + b.addEventListener('click', () => { + // Set cookie then reload to apply translation via Google widget + setGoogTransCookie(PAGE_LANG, code); + // give a tiny delay for cookie to be set + setTimeout(() => location.reload(), 300); + }); + panel.appendChild(b); + }); + + // Button to reset to original language + const reset = document.createElement('button'); + reset.type = 'button'; + reset.textContent = 'ORIG'; + reset.style.border = 'none'; + reset.style.padding = '0.4rem 0.6rem'; + reset.style.borderRadius = '6px'; + reset.style.cursor = 'pointer'; + reset.style.gridColumn = '1 / -1'; + reset.style.fontWeight = '600'; + reset.style.background = 'rgba(0,0,0,0.04)'; + reset.addEventListener('click', () => { + setGoogTransCookie(PAGE_LANG, PAGE_LANG); + setTimeout(() => location.reload(), 300); + }); + panel.appendChild(reset); + + floatWrap.appendChild(panel); + document.body.appendChild(floatWrap); + + // Toggle panel open/close + let open = false; + toggleBtn.addEventListener('click', (e) => { + e.stopPropagation(); + open = !open; + panel.style.display = open ? 'grid' : 'none'; + }); + document.addEventListener('click', (e) => { + if (!floatWrap.contains(e.target)) { + open = false; + panel.style.display = 'none'; + } + }); + + // Define callback expected by Google's script + window.googleTranslateElementInit = function() { + try { + new google.translate.TranslateElement({ + pageLanguage: PAGE_LANG, + layout: google.translate.TranslateElement.InlineLayout.SIMPLE + }, 'google_translate_element'); + } catch (e) { + // ignore + // console.warn('Google translate init failed', e); + } + }; + + // If the browser language is one of supported, auto-set cookie to translate automatically + const userLang = (navigator.language || navigator.userLanguage || 'en').split('-')[0]; + if (SUPPORTED_LANGS.includes(userLang) && userLang !== PAGE_LANG) { + // set cookie to auto-translate from PAGE_LANG -> userLang (applied after script loads) + setGoogTransCookie(PAGE_LANG, userLang); + label.textContent = userLang.toUpperCase(); + } + + // Load Google Translate script + const s = document.createElement('script'); + s.src = '//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit'; + s.async = true; + s.defer = true; + document.head.appendChild(s); + +})(); diff --git a/src/vlm/templates/base.html b/src/vlm/templates/base.html index e9f9b56..947ae16 100644 --- a/src/vlm/templates/base.html +++ b/src/vlm/templates/base.html @@ -9,6 +9,7 @@ + diff --git a/src/vlm/templates/welcome.html b/src/vlm/templates/welcome.html index 94e6b9f..f8ca92b 100644 --- a/src/vlm/templates/welcome.html +++ b/src/vlm/templates/welcome.html @@ -4,25 +4,25 @@

- Optimizado para investigación y docencia -

Simula, visualiza y aprende aerodinámica
con resultados inmediatos.

-

Interfaz moderna, exportación en SVG y herramientas para comparar VLM con datos experimentales — todo pensado para estudiantes y desarrolladores.

+ Optimized for research and teaching +

Simulate, visualize, and learn aerodynamics
with instant results.

+

Modern interface, SVG export, and tools to compare VLM with experimental data — all designed for students and developers.

Open Source
-
Compatibilidad: Python · Flask · Plotly
+
Compatibility: Python · Windows 11 APP
+
+ + +
- - -
-
-