diff --git a/assets/locales/en.json b/assets/locales/en.json index d39dbfc..251359c 100644 --- a/assets/locales/en.json +++ b/assets/locales/en.json @@ -1,332 +1,332 @@ { - "app": { - "title": "Fabnum – Chain Analysis", - "description": "Ecosystem exploration and vulnerability identification.", - "dev_mode": "You are in the development environment." + "app": { + "title": "Fabnum – Chain Analysis", + "description": "Ecosystem exploration and vulnerability identification.", + "dev_mode": "You are in the development environment." + }, + "header": { + "title": "FabNum - Digital Manufacturing Chain", + "subtitle": "Ecosystem exploration and vulnerability identification.\n -> This site is still under development <-" + }, + "footer": { + "copyright": "FabNum@Polycrisis Observatory © 2025", + "contact": "Contact", + "license": "License", + "license_text": "CC BY-NC-ND", + "eco_note": "🌱 CO₂ calculations via", + "eco_provider": "The Green Web Foundation", + "powered_by": "🚀 Powered by", + "powered_by_name": "Streamlit" + }, + "sidebar": { + "menu": "Main Menu", + "navigation": "Main Navigation", + "theme": "Theme", + "theme_light": "Light", + "theme_dark": "Dark", + "theme_instructions_only": "Theme changes can only be made from the Instructions tab.", + "impact": "Environmental Impact", + "loading": "Loading..." + }, + "auth": { + "title": "Authentication", + "username": "Username_token", + "token": "Gitea Personal Access Token", + "login": "Login", + "logout": "Logout", + "logged_as": "Logged in as", + "error": "❌ Access denied.", + "gitea_error": "❌ Unable to verify user with Gitea.", + "success": "Successfully logged out." + }, + "navigation": { + "instructions": "Instructions", + "personnalisation": "Customization", + "analyse": "Analysis", + "ia_nalyse": "AI'nalysis", + "plan_d_action": "Actions plan", + "visualisations": "Visualizations", + "fiches": "Cards" + }, + "pages": { + "instructions": { + "title": "Instructions" }, - "header": { - "title": "FabNum - Digital Manufacturing Chain", - "subtitle": "Ecosystem exploration and vulnerability identification." + "personnalisation": { + "title": "Final Product Customization", + "help": "How to use this tab?", + "help_content": [ + "1. Click on \"Add a final product\" to create a new product", + "2. Give your product a name", + "3. Select an appropriate assembly operation (if relevant)", + "4. Choose the components that make up your product from the list provided", + "5. Save your configuration for future reuse", + "6. You will be able to modify or delete your custom products later" + ], + "add_new_product": "Add a new final product", + "new_product_name": "New product name (unique)", + "assembly_operation": "Assembly operation (optional)", + "product_exists": "This product already exists", + "none": "-- None --", + "components_to_link": "Components to link", + "create_product": "Create product", + "added": "added", + "modify_product": "Modify an added final product", + "products_to_modify": "Products to modify", + "delete": "Delete", + "linked_assembly_operation": "Linked assembly operation", + "components_linked_to": "Components linked to", + "update": "Update", + "updated": "updated", + "deleted": "deleted", + "save_restore_config": "Save or restore configuration", + "export_config": "Export configuration", + "download_json": "Download (JSON)", + "import_config": "Import a JSON configuration (max 100 KB)", + "file_too_large": "File too large (max 100 KB).", + "no_products_found": "No products found in the file.", + "select_products_to_restore": "Select products to restore", + "products_to_restore": "Products to restore", + "restore_selected": "Restore selected items", + "config_restored": "Partial configuration successfully restored.", + "import_error": "Import error:" }, - "footer": { - "copyright": "Fabnum © 2025", - "contact": "Contact", - "license": "License", - "license_text": "CC BY-NC-ND", - "eco_note": "🌱 CO₂ calculations via", - "eco_provider": "The Green Web Foundation", - "powered_by": "🚀 Powered by", - "powered_by_name": "Streamlit" + "analyse": { + "title": "Graph Analysis", + "help": "How to use this tab?", + "help_content": [ + "1. Select the starting level (final product, component, or mineral)", + "2. Choose the desired destination level", + "3. Refine your selection by specifying either one or more specific minerals to target or specific items at each level (optional)", + "4. Define the analysis criteria by selecting the relevant vulnerability indices", + "5. Choose the index combination mode (AND/OR) according to your analysis needs", + "6. Explore the generated graph using zoom and panning controls; you can switch to full screen mode for the graph" + ], + "selection_nodes": "Selection of start and end nodes", + "select_level": "-- Select a level --", + "start_level": "Start level", + "end_level": "End level", + "select_minerals": "Select one or more minerals", + "filter_by_minerals": "Filter by minerals (optional)", + "fine_selection": "Fine selection of items", + "filter_start_nodes": "Filter by start nodes (optional)", + "filter_end_nodes": "Filter by end nodes (optional)", + "vulnerability_filters": "Selection of filters to identify vulnerabilities", + "filter_ics": "Filter paths containing at least one critical mineral for a component (ICS > 66%)", + "filter_ivc": "Filter paths containing at least one critical mineral in relation to sectoral competition (IVC > 30)", + "filter_ihh": "Filter paths containing at least one critical operation in relation to geographical or industrial concentration (IHH countries or actors > 25)", + "apply_ihh_filter": "Apply IHH filter on:", + "countries": "Countries", + "actors": "Actors", + "filter_isg": "Filter paths containing an unstable country (ISG ≥ 60)", + "filter_logic": "Filter logic", + "or": "OR", + "and": "AND", + "run_analysis": "Run analysis", + "sankey": { + "no_paths": "No paths found for the specified criteria.", + "no_matching_paths": "No paths match the criteria.", + "filtered_hierarchy": "Hierarchy filtered by levels and nodes", + "download_dot": "Download filtered DOT file", + "relation": "Relation" + } }, - "sidebar": { - "menu": "Main Menu", - "navigation": "Main Navigation", - "theme": "Theme", - "theme_light": "Light", - "theme_dark": "Dark", - "theme_instructions_only": "Theme changes can only be made from the Instructions tab.", - "impact": "Environmental Impact", - "loading": "Loading..." + "ia_nalyse": { + "title": "Graph Analysis by AI", + "help": "How to use this tab?", + "help_content": [ + "The graph covers all levels, from end products to geographic countries.\n", + "1. You can select minerals through which the paths go.", + "2. You can choose end products to perform an analysis tailored to your context.\n", + "These two selections are optional, but strongly recommended for a more relevant analysis.", + "The analysis is carried out using a private AI on a minimalist server. The result is therefore not immediate (approximately 30 minutes) and you will be notified of the progress." + ], + "select_minerals": "Select one or more minerals", + "filter_by_minerals": "Filter by minerals (optional, but highly recommended)", + "fine_selection": "End product selection", + "filter_start_nodes": "Filter by start nodes (optional, but recommended)", + "run_analysis": "Run analysis", + "confirm_download": "Confirm download", + "submit_request": "Submit your request", + "empty_graph": "The graph is empty. Please make another selection." }, - "auth": { - "title": "Authentication", - "username": "Username_token", - "token": "Gitea Personal Access Token", - "login": "Login", - "logout": "Logout", - "logged_as": "Logged in as", - "error": "❌ Access denied.", - "gitea_error": "❌ Unable to verify user with Gitea.", - "success": "Successfully logged out." + "plan_d_action": { + "title": "Graph analysis for action", + "help": "How to use this tab?", + "help_content": [ + "The graph covers all levels, from end products to geographic countries.\n", + "1. You can select minerals through which the paths go.", + "2. You can choose end products to perform an analysis tailored to your context.\n", + "These two selections are optional, but strongly recommended for a more relevant analysis.", + "The recommendations for actions and indicator monitoring are generic. They must therefore be adapted to the context.", + "The proposed actions or indicators depend on the type of organization concerned and can be applied directly or required of digital providers." + ], + "select_minerals": "Select one or more minerals", + "filter_by_minerals": "Filter by minerals (optional, but highly recommended)", + "fine_selection": "End product selection", + "filter_start_nodes": "Filter by start nodes", + "run_analysis": "Run analysis", + "confirm_download": "Confirm download", + "submit_request": "Submit your request", + "empty_graph": "The graph is empty. Please make another selection." }, - "navigation": { - "instructions": "Instructions", - "personnalisation": "Customization", - "analyse": "Analysis", - "ia_nalyse": "AI'nalysis", - "plan_d_action": "Actions plan", - "visualisations": "Visualizations", - "fiches": "Cards" + "visualisations": { + "title": "Visualizations", + "help": "How to use this tab?", + "help_content": [ + "1. Explore the graphs presenting the Herfindahl-Hirschmann Index (IHH)", + "2. Analyze its relationship with the average criticality of minerals or their Competitive Vulnerability Index (IVC)", + "3. Zoom in on the graphs to better discover the information", + "", + "It is important to remember that the IHH has two thresholds:", + "* below 15, concentration is considered to be low", + "* above 25, it is considered to be high", + "", + "Thus, the higher a point is positioned in the top right of the graphs, the higher the risks.", + "The graphs present 2 horizontal and vertical lines to mark these thresholds." + ], + "ihh_criticality": "Herfindahl-Hirschmann Index - IHH vs Criticality", + "ihh_criticality_desc": "The size of the points indicates the substitutability criticality of the mineral.", + "ihh_ivc": "Herfindahl-Hirschmann Index - IHH vs IVC", + "ihh_ivc_desc": "The size of the points indicates the competitive criticality of the mineral.", + "launch": "Launch", + "no_data": "No data to display.", + "categories": { + "assembly": "Assembly", + "manufacturing": "Manufacturing", + "processing": "Processing", + "extraction": "Extraction" + }, + "axis_titles": { + "ihh_countries": "IHH Countries (%)", + "ihh_actors": "IHH Actors (%)", + "ihh_extraction": "IHH Extraction (%)", + "ihh_reserves": "IHH Reserves (%)" + }, + "chart_titles": { + "concentration_criticality": "Concentration and Criticality – {0}", + "concentration_resources": "Concentration of Critical Resources vs IVC Vulnerability" + } }, - "pages": { - "instructions": { - "title": "Instructions" - }, - "personnalisation": { - "title": "Final Product Customization", - "help": "How to use this tab?", - "help_content": [ - "1. Click on \"Add a final product\" to create a new product", - "2. Give your product a name", - "3. Select an appropriate assembly operation (if relevant)", - "4. Choose the components that make up your product from the list provided", - "5. Save your configuration for future reuse", - "6. You will be able to modify or delete your custom products later" - ], - "add_new_product": "Add a new final product", - "new_product_name": "New product name (unique)", - "assembly_operation": "Assembly operation (optional)", - "product_exists": "This product already exists", - "none": "-- None --", - "components_to_link": "Components to link", - "create_product": "Create product", - "added": "added", - "modify_product": "Modify an added final product", - "products_to_modify": "Products to modify", - "delete": "Delete", - "linked_assembly_operation": "Linked assembly operation", - "components_linked_to": "Components linked to", - "update": "Update", - "updated": "updated", - "deleted": "deleted", - "save_restore_config": "Save or restore configuration", - "export_config": "Export configuration", - "download_json": "Download (JSON)", - "import_config": "Import a JSON configuration (max 100 KB)", - "file_too_large": "File too large (max 100 KB).", - "no_products_found": "No products found in the file.", - "select_products_to_restore": "Select products to restore", - "products_to_restore": "Products to restore", - "restore_selected": "Restore selected items", - "config_restored": "Partial configuration successfully restored.", - "import_error": "Import error:" - }, - "analyse": { - "title": "Graph Analysis", - "help": "How to use this tab?", - "help_content": [ - "1. Select the starting level (final product, component, or mineral)", - "2. Choose the desired destination level", - "3. Refine your selection by specifying either one or more specific minerals to target or specific items at each level (optional)", - "4. Define the analysis criteria by selecting the relevant vulnerability indices", - "5. Choose the index combination mode (AND/OR) according to your analysis needs", - "6. Explore the generated graph using zoom and panning controls; you can switch to full screen mode for the graph" - ], - "selection_nodes": "Selection of start and end nodes", - "select_level": "-- Select a level --", - "start_level": "Start level", - "end_level": "End level", - "select_minerals": "Select one or more minerals", - "filter_by_minerals": "Filter by minerals (optional)", - "fine_selection": "Fine selection of items", - "filter_start_nodes": "Filter by start nodes (optional)", - "filter_end_nodes": "Filter by end nodes (optional)", - "vulnerability_filters": "Selection of filters to identify vulnerabilities", - "filter_ics": "Filter paths containing at least one critical mineral for a component (ICS > 66%)", - "filter_ivc": "Filter paths containing at least one critical mineral in relation to sectoral competition (IVC > 30)", - "filter_ihh": "Filter paths containing at least one critical operation in relation to geographical or industrial concentration (IHH countries or actors > 25)", - "apply_ihh_filter": "Apply IHH filter on:", - "countries": "Countries", - "actors": "Actors", - "filter_isg": "Filter paths containing an unstable country (ISG ≥ 60)", - "filter_logic": "Filter logic", - "or": "OR", - "and": "AND", - "run_analysis": "Run analysis", - "sankey": { - "no_paths": "No paths found for the specified criteria.", - "no_matching_paths": "No paths match the criteria.", - "filtered_hierarchy": "Hierarchy filtered by levels and nodes", - "download_dot": "Download filtered DOT file", - "relation": "Relation" - } - }, - "ia_nalyse": { - "title": "Graph Analysis by AI", - "help": "How to use this tab?", - "help_content": [ - "The graph covers all levels, from end products to geographic countries.\n", - "1. You can select minerals through which the paths go.", - "2. You can choose end products to perform an analysis tailored to your context.\n", - "These two selections are optional, but strongly recommended for a more relevant analysis.", - "The analysis is carried out using a private AI on a minimalist server. The result is therefore not immediate (approximately 30 minutes) and you will be notified of the progress." - ], - "select_minerals": "Select one or more minerals", - "filter_by_minerals": "Filter by minerals (optional, but highly recommended)", - "fine_selection": "End product selection", - "filter_start_nodes": "Filter by start nodes (optional, but recommended)", - "run_analysis": "Run analysis", - "confirm_download": "Confirm download", - "submit_request": "Submit your request", - "empty_graph": "The graph is empty. Please make another selection." - }, - "plan_d_action": { - "title": "Graph analysis for action", - "help": "How to use this tab?", - "help_content": [ - "The graph covers all levels, from end products to geographic countries.\n", - "1. You can select minerals through which the paths go.", - "2. You can choose end products to perform an analysis tailored to your context.\n", - "These two selections are optional, but strongly recommended for a more relevant analysis.", - "The recommendations for actions and indicator monitoring are generic. They must therefore be adapted to the context.", - "The proposed actions or indicators depend on the type of organization concerned and can be applied directly or required of digital providers." - ], - "select_minerals": "Select one or more minerals", - "filter_by_minerals": "Filter by minerals (optional, but highly recommended)", - "fine_selection": "End product selection", - "filter_start_nodes": "Filter by start nodes", - "run_analysis": "Run analysis", - "confirm_download": "Confirm download", - "submit_request": "Submit your request", - "empty_graph": "The graph is empty. Please make another selection." - }, - "visualisations": { - "title": "Visualizations", - "help": "How to use this tab?", - "help_content": [ - "1. Explore the graphs presenting the Herfindahl-Hirschmann Index (IHH)", - "2. Analyze its relationship with the average criticality of minerals or their Competitive Vulnerability Index (IVC)", - "3. Zoom in on the graphs to better discover the information", - "", - "It is important to remember that the IHH has two thresholds:", - "* below 15, concentration is considered to be low", - "* above 25, it is considered to be high", - "", - "Thus, the higher a point is positioned in the top right of the graphs, the higher the risks.", - "The graphs present 2 horizontal and vertical lines to mark these thresholds." - ], - "ihh_criticality": "Herfindahl-Hirschmann Index - IHH vs Criticality", - "ihh_criticality_desc": "The size of the points indicates the substitutability criticality of the mineral.", - "ihh_ivc": "Herfindahl-Hirschmann Index - IHH vs IVC", - "ihh_ivc_desc": "The size of the points indicates the competitive criticality of the mineral.", - "launch": "Launch", - "no_data": "No data to display.", - "categories": { - "assembly": "Assembly", - "manufacturing": "Manufacturing", - "processing": "Processing", - "extraction": "Extraction" - }, - "axis_titles": { - "ihh_countries": "IHH Countries (%)", - "ihh_actors": "IHH Actors (%)", - "ihh_extraction": "IHH Extraction (%)", - "ihh_reserves": "IHH Reserves (%)" - }, - "chart_titles": { - "concentration_criticality": "Concentration and Criticality – {0}", - "concentration_resources": "Concentration of Critical Resources vs IVC Vulnerability" - } - }, - "fiches": { - "title": "Card Discovery", - "help": "How to use this tab?", - "help_content": [ - "1. Browse the list of available cards by category", - "2. Select a card to display its full content", - "3. Consult detailed data, graphs, and additional analyses", - "4. Use this information to deepen your understanding of the identified vulnerabilities", - "", - "The categories are as follows:", - "* Assembly: operation of assembling final products from components", - "* Related: various operations necessary to manufacture digital technology, but not directly entering its composition", - "* Criticalities: indices used to identify and evaluate vulnerabilities", - "* Manufacturing: operation of manufacturing components from minerals", - "* Mineral: description and operations of extraction and processing of minerals" - ], - "no_files": "No cards available at the moment.", - "choose_category": "Choose a card category", - "select_folder": "-- Select a folder --", - "choose_file": "Choose a card", - "select_file": "-- Select a card --", - "loading_error": "Error loading the card:", - "download_pdf": "Download this card as PDF", - "pdf_unavailable": "The PDF file for this card is not available.", - "ticket_management": "Ticket management for this card", - "tickets": { - "create_new": "Create a new ticket linked to this card", - "model_load_error": "Unable to load the ticket template.", - "contribution_type": "Contribution type", - "specify": "Specify", - "other": "Other", - "concerned_card": "Concerned card", - "subject": "Subject of the proposal", - "preview": "Preview ticket", - "cancel": "Cancel", - "preview_title": "Ticket preview", - "summary": "Summary", - "title": "Title", - "labels": "Labels", - "confirm": "Confirm ticket creation", - "created": "Ticket created and form cleared.", - "model_error": "Template loading error:", - "no_linked_tickets": "No tickets linked to this card.", - "associated_tickets": "Tickets associated with this card", - "moderation_notice": "ticket(s) awaiting moderation are not displayed.", - "status": { - "awaiting": "Awaiting processing", - "in_progress": "In progress", - "completed": "Completed", - "rejected": "Rejected", - "others": "Others" - }, - "no_title": "No title", - "unknown": "unknown", - "subject_label": "Subject", - "no_labels": "none", - "comments": "Comment(s):", - "no_comments": "No comments.", - "comment_error": "Error retrieving comments:", - "opened_by": "Opened by", - "on_date": "on", - "updated": "UPDATED", - "continue": "Continuer", - "created_success": "Ticket created and placed in moderation", - "created_error": "Ticket creation failed. Please try later", - "see_ticket": "See ticket" - } - } - }, - "node_levels": { - "0": "Final product", - "1": "Component", - "2": "Mineral", - "10": "Operation", - "11": "Operation country", - "12": "Operation actor", - "99": "Geographic country" - }, - "errors": { - "log_read_error": "Log reading error:", - "graph_preview_error": "Graph preview error:", - "graph_creation_error": "Error creating the graph:", - "ihh_criticality_error": "Error in IHH vs Criticality visualization:", - "ihh_ivc_error": "Error in IHH vs IVC visualization:", - "comment_fetch_error": "Error retrieving comments:", - "template_load_error": "Template loading error:", - "import_error": "Import error:" - }, - "buttons": { - "download": "Download", - "run": "Run", - "save": "Save", + "fiches": { + "title": "Card Discovery", + "help": "How to use this tab?", + "help_content": [ + "1. Browse the list of available cards by category", + "2. Select a card to display its full content", + "3. Consult detailed data, graphs, and additional analyses", + "4. Use this information to deepen your understanding of the identified vulnerabilities", + "", + "The categories are as follows:", + "* Assembly: operation of assembling final products from components", + "* Related: various operations necessary to manufacture digital technology, but not directly entering its composition", + "* Criticalities: indices used to identify and evaluate vulnerabilities", + "* Manufacturing: operation of manufacturing components from minerals", + "* Mineral: description and operations of extraction and processing of minerals" + ], + "no_files": "No cards available at the moment.", + "choose_category": "Choose a card category", + "select_folder": "-- Select a folder --", + "choose_file": "Choose a card", + "select_file": "-- Select a card --", + "loading_error": "Error loading the card:", + "download_pdf": "Download this card as PDF", + "pdf_unavailable": "The PDF file for this card is not available.", + "ticket_management": "Ticket management for this card", + "tickets": { + "create_new": "Create a new ticket linked to this card", + "model_load_error": "Unable to load the ticket template.", + "contribution_type": "Contribution type", + "specify": "Specify", + "other": "Other", + "concerned_card": "Concerned card", + "subject": "Subject of the proposal", + "preview": "Preview ticket", "cancel": "Cancel", - "confirm": "Confirm", - "filter": "Filter", - "search": "Search", - "create": "Create", - "update": "Update", - "delete": "Delete", - "preview": "Preview", - "export": "Export", - "import": "Import", - "restore": "Restore", - "refresh": "Refresh", - "browse_files": "Browse files" - }, - "ui": { - "file_uploader": { - "drag_drop_here": "Drag and drop file here", - "size_limit": "100 KB limit per file • JSON" - } - }, - "batch": { - "in_queue": "In queue", - "in_progress": "Analysis in progress", - "failure": "Error", - "unknwon_error": "unknown error", - "no_task": "No task wainting or in progress", - "complete": "Analysis complete. Download the result in zip format, which contains the detailed report and analysis.", - "step": "Step" + "preview_title": "Ticket preview", + "summary": "Summary", + "title": "Title", + "labels": "Labels", + "confirm": "Confirm ticket creation", + "created": "Ticket created and form cleared.", + "model_error": "Template loading error:", + "no_linked_tickets": "No tickets linked to this card.", + "associated_tickets": "Tickets associated with this card", + "moderation_notice": "ticket(s) awaiting moderation are not displayed.", + "status": { + "awaiting": "Awaiting processing", + "in_progress": "In progress", + "completed": "Completed", + "rejected": "Rejected", + "others": "Others" + }, + "no_title": "No title", + "unknown": "unknown", + "subject_label": "Subject", + "no_labels": "none", + "comments": "Comment(s):", + "no_comments": "No comments.", + "comment_error": "Error retrieving comments:", + "opened_by": "Opened by", + "on_date": "on", + "updated": "UPDATED", + "continue": "Continuer", + "created_success": "Ticket created and placed in moderation", + "created_error": "Ticket creation failed. Please try later", + "see_ticket": "See ticket" + } } + }, + "node_levels": { + "0": "Final product", + "1": "Component", + "2": "Mineral", + "10": "Operation", + "11": "Operation country", + "12": "Operation actor", + "99": "Geographic country" + }, + "errors": { + "log_read_error": "Log reading error:", + "graph_preview_error": "Graph preview error:", + "graph_creation_error": "Error creating the graph:", + "ihh_criticality_error": "Error in IHH vs Criticality visualization:", + "ihh_ivc_error": "Error in IHH vs IVC visualization:", + "comment_fetch_error": "Error retrieving comments:", + "template_load_error": "Template loading error:", + "import_error": "Import error:" + }, + "buttons": { + "download": "Download", + "run": "Run", + "save": "Save", + "cancel": "Cancel", + "confirm": "Confirm", + "filter": "Filter", + "search": "Search", + "create": "Create", + "update": "Update", + "delete": "Delete", + "preview": "Preview", + "export": "Export", + "import": "Import", + "restore": "Restore", + "refresh": "Refresh", + "browse_files": "Browse files" + }, + "ui": { + "file_uploader": { + "drag_drop_here": "Drag and drop file here", + "size_limit": "100 KB limit per file • JSON" + } + }, + "batch": { + "in_queue": "In queue", + "in_progress": "Analysis in progress", + "failure": "Error", + "unknwon_error": "unknown error", + "no_task": "No task wainting or in progress", + "complete": "Analysis complete. Download the result in zip format, which contains the detailed report and analysis.", + "step": "Step" + } } diff --git a/assets/locales/fr.json b/assets/locales/fr.json index 1b872e5..eecbbc2 100644 --- a/assets/locales/fr.json +++ b/assets/locales/fr.json @@ -1,332 +1,332 @@ { - "app": { - "title": "Fabnum – Analyse de chaîne", - "description": "Parcours de l'écosystème et identification des vulnérabilités.", - "dev_mode": "Vous êtes dans l'environnement de développement." + "app": { + "title": "Fabnum – Analyse de chaîne", + "description": "Parcours de l'écosystème et identification des vulnérabilités.", + "dev_mode": "Vous êtes dans l'environnement de développement." + }, + "header": { + "title": "FabNum - Chaîne de fabrication du numérique", + "subtitle": "Parcours de l'écosystème et identification des vulnérabilités.\n-> Ce site est encore en cours de développement <-" + }, + "footer": { + "copyright": "FabNum@Polycrisis Observatory © 2025", + "contact": "Contact", + "license": "Licence", + "license_text": "CC BY-NC-ND", + "eco_note": "🌱 Calculs CO₂ via", + "eco_provider": "The Green Web Foundation", + "powered_by": "🚀 Propulsé par", + "powered_by_name": "Streamlit" + }, + "sidebar": { + "menu": "Menu principal", + "navigation": "Navigation principale", + "theme": "Thème", + "theme_light": "Clair", + "theme_dark": "Sombre", + "theme_instructions_only": "Le changement de thème ne peut se faire que depuis l'onglet Instructions.", + "impact": "Impact environnemental", + "loading": "Chargement en cours…" + }, + "auth": { + "title": "Authentification", + "username": "Identifiant_token", + "token": "Token d'accès personnel Gitea", + "login": "Se connecter", + "logout": "Se déconnecter", + "logged_as": "Connecté en tant que", + "error": "❌ Accès refusé.", + "gitea_error": "❌ Impossible de vérifier l'utilisateur auprès de Gitea.", + "success": "Déconnecté avec succès." + }, + "navigation": { + "instructions": "Instructions", + "personnalisation": "Personnalisation", + "analyse": "Analyse", + "ia_nalyse": "IA'nalyse", + "plan_d_action": "Plan d'action", + "visualisations": "Visualisations", + "fiches": "Fiches" + }, + "pages": { + "instructions": { + "title": "Instructions" }, - "header": { - "title": "FabNum - Chaîne de fabrication du numérique", - "subtitle": "Parcours de l'écosystème et identification des vulnérabilités." + "personnalisation": { + "title": "Personnalisation des produits finaux", + "help": "Comment utiliser cet onglet ?", + "help_content": [ + "1. Cliquez sur « Ajouter un produit final » pour créer un nouveau produit", + "2. Donnez un nom à votre produit", + "3. Sélectionnez une opération d'assemblage appropriée (si pertinent)", + "4. Choisissez les composants qui constituent votre produit dans la liste proposée", + "5. Sauvegardez votre configuration pour une réutilisation future", + "6. Vous pourrez par la suite modifier ou supprimer vos produits personnalisés" + ], + "add_new_product": "Ajouter un nouveau produit final", + "new_product_name": "Nom du nouveau produit (unique)", + "assembly_operation": "Opération d'assemblage (optionnelle)", + "product_exists": "Ce produit existe déjà.", + "none": "-- Aucune --", + "components_to_link": "Composants à lier", + "create_product": "Créer le produit", + "added": "ajouté", + "modify_product": "Modifier un produit final ajouté", + "products_to_modify": "Produits à modifier", + "delete": "Supprimer", + "linked_assembly_operation": "Opération d'assemblage liée", + "components_linked_to": "Composants liés à", + "update": "Mettre à jour", + "updated": "mis à jour", + "deleted": "supprimé", + "save_restore_config": "Sauvegarder ou restaurer la configuration", + "export_config": "Exporter configuration", + "download_json": "Télécharger (JSON)", + "import_config": "Importer une configuration JSON (max 100 Ko)", + "file_too_large": "Fichier trop volumineux (max 100 Ko).", + "no_products_found": "Aucun produit trouvé dans le fichier.", + "select_products_to_restore": "Sélection des produits à restaurer", + "products_to_restore": "Produits à restaurer", + "restore_selected": "Restaurer les éléments sélectionnés", + "config_restored": "Configuration partielle restaurée avec succès.", + "import_error": "Erreur d'import :" }, - "footer": { - "copyright": "Fabnum © 2025", - "contact": "Contact", - "license": "Licence", - "license_text": "CC BY-NC-ND", - "eco_note": "🌱 Calculs CO₂ via", - "eco_provider": "The Green Web Foundation", - "powered_by": "🚀 Propulsé par", - "powered_by_name": "Streamlit" + "analyse": { + "title": "Analyse du graphe", + "help": "Comment utiliser cet onglet ?", + "help_content": [ + "1. Sélectionnez le niveau de départ (produit final, composant ou minerai)", + "2. Choisissez le niveau d'arrivée souhaité", + "3. Affinez votre sélection en spécifiant soit un ou des minerais à cibler spécifiquement ou des items précis à chaque niveau (optionnel)", + "4. Définissez les critères d'analyse en sélectionnant les indices de vulnérabilité pertinents", + "5. Choisissez le mode de combinaison des indices (ET/OU) selon votre besoin d'analyse", + "6. Explorez le graphique généré en utilisant les contrôles de zoom et de déplacement ; vous pouvez basculer en mode plein écran pour le graphe" + ], + "selection_nodes": "Sélection des nœuds de départ et d'arrivée", + "select_level": "-- Sélectionner un niveau --", + "start_level": "Niveau de départ", + "end_level": "Niveau d'arrivée", + "select_minerals": "Sélectionner un ou plusieurs minerais", + "filter_by_minerals": "Filtrer par minerais (optionnel)", + "fine_selection": "Sélection fine des items", + "filter_start_nodes": "Filtrer par noeuds de départ (optionnel)", + "filter_end_nodes": "Filtrer par noeuds d'arrivée (optionnel)", + "vulnerability_filters": "Sélection des filtres pour identifier les vulnérabilités", + "filter_ics": "Filtrer les chemins contenant au moins minerai critique pour un composant (ICS > 66 %)", + "filter_ivc": "Filtrer les chemins contenant au moins un minerai critique par rapport à la concurrence sectorielle (IVC > 30)", + "filter_ihh": "Filtrer les chemins contenant au moins une opération critique par rapport à la concentration géographique ou industrielle (IHH pays ou acteurs > 25)", + "apply_ihh_filter": "Appliquer le filtre IHH sur :", + "countries": "Pays", + "actors": "Acteurs", + "filter_isg": "Filtrer les chemins contenant un pays instable (ISG ≥ 60)", + "filter_logic": "Logique de filtrage", + "or": "OU", + "and": "ET", + "run_analysis": "Lancer l'analyse", + "sankey": { + "no_paths": "Aucun chemin trouvé pour les critères spécifiés.", + "no_matching_paths": "Aucun chemin ne correspond aux critères.", + "filtered_hierarchy": "Hiérarchie filtrée par niveaux et noeuds", + "download_dot": "Télécharger le fichier DOT filtré", + "relation": "Relation" + } }, - "sidebar": { - "menu": "Menu principal", - "navigation": "Navigation principale", - "theme": "Thème", - "theme_light": "Clair", - "theme_dark": "Sombre", - "theme_instructions_only": "Le changement de thème ne peut se faire que depuis l'onglet Instructions.", - "impact": "Impact environnemental", - "loading": "Chargement en cours…" + "ia_nalyse": { + "title": "Analyse du graphe par IA", + "help": "Comment utiliser cet onglet ?", + "help_content": [ + "Le graphe intègre l'ensemble des niveaux, des produits finaux aux pays géographiques.\n", + "1. Vous pouvez sélectionner des minerais par lesquels passent les chemins.", + "2. Vous pouvez choisir des produits finaux pour faire une analyse adaptée à votre contexte.\n", + " Ces deux sélections sont optionnelles, mais fortement recommandées pour avoir une meilleure pertinence de l'analyse.", + "L'analyse se réalise à l'aide d'une IA privée, sur un serveur minimaliste. Le résultat n'est donc pas immédiat (ordre de grandeur : 30 minutes) et vous serez informé de l'avancement." + ], + "select_minerals": "Sélectionner un ou plusieurs minerais", + "filter_by_minerals": "Filtrer par minerais (optionnel, mais recommandé)", + "fine_selection": "Sélection des produits finaux", + "filter_start_nodes": "Filtrer par noeuds de départ (optionnel, mais recommandé)", + "run_analysis": "Lancer l'analyse", + "confirm_download": "Confirmer le téléchargement", + "submit_request": "Soumettre votre demande", + "empty_graph": "Le graphe est vide. Veuillez faire une autre sélection." }, - "auth": { - "title": "Authentification", - "username": "Identifiant_token", - "token": "Token d'accès personnel Gitea", - "login": "Se connecter", - "logout": "Se déconnecter", - "logged_as": "Connecté en tant que", - "error": "❌ Accès refusé.", - "gitea_error": "❌ Impossible de vérifier l'utilisateur auprès de Gitea.", - "success": "Déconnecté avec succès." + "plan_d_action": { + "title": "Analyse du graphe pour action", + "help": "Comment utiliser cet onglet ?", + "help_content": [ + "Le graphe intègre l'ensemble des niveaux, des produits finaux aux pays géographiques.\n", + "1. Vous pouvez sélectionner des minerais par lesquels passent les chemins.", + "2. Vous pouvez choisir des produits finaux pour faire une analyse adaptée à votre contexte.\n", + " Ces deux sélections sont optionnelles, mais fortement recommandées pour avoir une meilleure pertinence de l'analyse.", + "Les préconisations d'actions et de suivi d'indicateurs sont génériques. Elles doivent donc être adaptées au contexte.", + "Les actions ou les indicateurs proposés dépendent du type d'organisation concernée et peuvent être appliquées directement ou exigées des fournisseurs de numérique." + ], + "select_minerals": "Sélectionner un ou plusieurs minerais", + "filter_by_minerals": "Filtrer par minerais (optionnel, mais recommandé)", + "fine_selection": "Sélection des produits finaux", + "filter_start_nodes": "Filtrer par noeuds de départ", + "run_analysis": "Lancer l'analyse", + "confirm_download": "Confirmer le téléchargement", + "submit_request": "Soumettre votre demande", + "empty_graph": "Le graphe est vide. Veuillez faire une autre sélection." }, - "navigation": { - "instructions": "Instructions", - "personnalisation": "Personnalisation", - "analyse": "Analyse", - "ia_nalyse": "IA'nalyse", - "plan_d_action": "Plan d'action", - "visualisations": "Visualisations", - "fiches": "Fiches" + "visualisations": { + "title": "Visualisations", + "help": "Comment utiliser cet onglet ?", + "help_content": [ + "1. Explorez les graphiques présentant l'Indice de Herfindahl-Hirschmann (IHH)", + "2. Analysez sa relation avec la criticité moyenne des minerais ou leur Indice de Vulnérabilité Concurrentielle (IVC)", + "3. Zoomer dans les graphes pour mieux découvrir les informations", + "", + "Il est important de se rappeler que l'IHH a deux seuils :", + "* en-dessous de 15, la concentration est considérée comme étant faible", + "* au-dessus de 25, elle est considérée comme étant forte", + "", + "Ainsi plus le positionnement d'un point est en haut à droite des graphiques, plus les risques sont élevés.", + "Les graphiques présentent 2 droites horizontales et vetrticales pour matérialiser ces seuils." + ], + "ihh_criticality": "Indice de Herfindahl-Hirschmann - IHH vs Criticité", + "ihh_criticality_desc": "La taille des points donne l'indication de la criticité de substituabilité du minerai.", + "ihh_ivc": "Indice de Herfindahl-Hirschmann - IHH vs IVC", + "ihh_ivc_desc": "La taille des points donne l'indication de la criticité concurrentielle du minerai.", + "launch": "Lancer", + "no_data": "Aucune donnée à visualiser.", + "categories": { + "assembly": "Assemblage", + "manufacturing": "Fabrication", + "processing": "Traitement", + "extraction": "Extraction" + }, + "axis_titles": { + "ihh_countries": "IHH Pays (%)", + "ihh_actors": "IHH Acteurs (%)", + "ihh_extraction": "IHH Extraction (%)", + "ihh_reserves": "IHH Réserves (%)" + }, + "chart_titles": { + "concentration_criticality": "Concentration et criticité – {0}", + "concentration_resources": "Concentration des ressources critiques vs vulnérabilité IVC" + } }, - "pages": { - "instructions": { - "title": "Instructions" - }, - "personnalisation": { - "title": "Personnalisation des produits finaux", - "help": "Comment utiliser cet onglet ?", - "help_content": [ - "1. Cliquez sur « Ajouter un produit final » pour créer un nouveau produit", - "2. Donnez un nom à votre produit", - "3. Sélectionnez une opération d'assemblage appropriée (si pertinent)", - "4. Choisissez les composants qui constituent votre produit dans la liste proposée", - "5. Sauvegardez votre configuration pour une réutilisation future", - "6. Vous pourrez par la suite modifier ou supprimer vos produits personnalisés" - ], - "add_new_product": "Ajouter un nouveau produit final", - "new_product_name": "Nom du nouveau produit (unique)", - "assembly_operation": "Opération d'assemblage (optionnelle)", - "product_exists": "Ce produit existe déjà.", - "none": "-- Aucune --", - "components_to_link": "Composants à lier", - "create_product": "Créer le produit", - "added": "ajouté", - "modify_product": "Modifier un produit final ajouté", - "products_to_modify": "Produits à modifier", - "delete": "Supprimer", - "linked_assembly_operation": "Opération d'assemblage liée", - "components_linked_to": "Composants liés à", - "update": "Mettre à jour", - "updated": "mis à jour", - "deleted": "supprimé", - "save_restore_config": "Sauvegarder ou restaurer la configuration", - "export_config": "Exporter configuration", - "download_json": "Télécharger (JSON)", - "import_config": "Importer une configuration JSON (max 100 Ko)", - "file_too_large": "Fichier trop volumineux (max 100 Ko).", - "no_products_found": "Aucun produit trouvé dans le fichier.", - "select_products_to_restore": "Sélection des produits à restaurer", - "products_to_restore": "Produits à restaurer", - "restore_selected": "Restaurer les éléments sélectionnés", - "config_restored": "Configuration partielle restaurée avec succès.", - "import_error": "Erreur d'import :" - }, - "analyse": { - "title": "Analyse du graphe", - "help": "Comment utiliser cet onglet ?", - "help_content": [ - "1. Sélectionnez le niveau de départ (produit final, composant ou minerai)", - "2. Choisissez le niveau d'arrivée souhaité", - "3. Affinez votre sélection en spécifiant soit un ou des minerais à cibler spécifiquement ou des items précis à chaque niveau (optionnel)", - "4. Définissez les critères d'analyse en sélectionnant les indices de vulnérabilité pertinents", - "5. Choisissez le mode de combinaison des indices (ET/OU) selon votre besoin d'analyse", - "6. Explorez le graphique généré en utilisant les contrôles de zoom et de déplacement ; vous pouvez basculer en mode plein écran pour le graphe" - ], - "selection_nodes": "Sélection des nœuds de départ et d'arrivée", - "select_level": "-- Sélectionner un niveau --", - "start_level": "Niveau de départ", - "end_level": "Niveau d'arrivée", - "select_minerals": "Sélectionner un ou plusieurs minerais", - "filter_by_minerals": "Filtrer par minerais (optionnel)", - "fine_selection": "Sélection fine des items", - "filter_start_nodes": "Filtrer par noeuds de départ (optionnel)", - "filter_end_nodes": "Filtrer par noeuds d'arrivée (optionnel)", - "vulnerability_filters": "Sélection des filtres pour identifier les vulnérabilités", - "filter_ics": "Filtrer les chemins contenant au moins minerai critique pour un composant (ICS > 66 %)", - "filter_ivc": "Filtrer les chemins contenant au moins un minerai critique par rapport à la concurrence sectorielle (IVC > 30)", - "filter_ihh": "Filtrer les chemins contenant au moins une opération critique par rapport à la concentration géographique ou industrielle (IHH pays ou acteurs > 25)", - "apply_ihh_filter": "Appliquer le filtre IHH sur :", - "countries": "Pays", - "actors": "Acteurs", - "filter_isg": "Filtrer les chemins contenant un pays instable (ISG ≥ 60)", - "filter_logic": "Logique de filtrage", - "or": "OU", - "and": "ET", - "run_analysis": "Lancer l'analyse", - "sankey": { - "no_paths": "Aucun chemin trouvé pour les critères spécifiés.", - "no_matching_paths": "Aucun chemin ne correspond aux critères.", - "filtered_hierarchy": "Hiérarchie filtrée par niveaux et noeuds", - "download_dot": "Télécharger le fichier DOT filtré", - "relation": "Relation" - } - }, - "ia_nalyse": { - "title": "Analyse du graphe par IA", - "help": "Comment utiliser cet onglet ?", - "help_content": [ - "Le graphe intègre l'ensemble des niveaux, des produits finaux aux pays géographiques.\n", - "1. Vous pouvez sélectionner des minerais par lesquels passent les chemins.", - "2. Vous pouvez choisir des produits finaux pour faire une analyse adaptée à votre contexte.\n", - " Ces deux sélections sont optionnelles, mais fortement recommandées pour avoir une meilleure pertinence de l'analyse.", - "L'analyse se réalise à l'aide d'une IA privée, sur un serveur minimaliste. Le résultat n'est donc pas immédiat (ordre de grandeur : 30 minutes) et vous serez informé de l'avancement." - ], - "select_minerals": "Sélectionner un ou plusieurs minerais", - "filter_by_minerals": "Filtrer par minerais (optionnel, mais recommandé)", - "fine_selection": "Sélection des produits finaux", - "filter_start_nodes": "Filtrer par noeuds de départ (optionnel, mais recommandé)", - "run_analysis": "Lancer l'analyse", - "confirm_download": "Confirmer le téléchargement", - "submit_request": "Soumettre votre demande", - "empty_graph": "Le graphe est vide. Veuillez faire une autre sélection." - }, - "plan_d_action": { - "title": "Analyse du graphe pour action", - "help": "Comment utiliser cet onglet ?", - "help_content": [ - "Le graphe intègre l'ensemble des niveaux, des produits finaux aux pays géographiques.\n", - "1. Vous pouvez sélectionner des minerais par lesquels passent les chemins.", - "2. Vous pouvez choisir des produits finaux pour faire une analyse adaptée à votre contexte.\n", - " Ces deux sélections sont optionnelles, mais fortement recommandées pour avoir une meilleure pertinence de l'analyse.", - "Les préconisations d'actions et de suivi d'indicateurs sont génériques. Elles doivent donc être adaptées au contexte.", - "Les actions ou les indicateurs proposés dépendent du type d'organisation concernée et peuvent être appliquées directement ou exigées des fournisseurs de numérique." - ], - "select_minerals": "Sélectionner un ou plusieurs minerais", - "filter_by_minerals": "Filtrer par minerais (optionnel, mais recommandé)", - "fine_selection": "Sélection des produits finaux", - "filter_start_nodes": "Filtrer par noeuds de départ", - "run_analysis": "Lancer l'analyse", - "confirm_download": "Confirmer le téléchargement", - "submit_request": "Soumettre votre demande", - "empty_graph": "Le graphe est vide. Veuillez faire une autre sélection." - }, - "visualisations": { - "title": "Visualisations", - "help": "Comment utiliser cet onglet ?", - "help_content": [ - "1. Explorez les graphiques présentant l'Indice de Herfindahl-Hirschmann (IHH)", - "2. Analysez sa relation avec la criticité moyenne des minerais ou leur Indice de Vulnérabilité Concurrentielle (IVC)", - "3. Zoomer dans les graphes pour mieux découvrir les informations", - "", - "Il est important de se rappeler que l'IHH a deux seuils :", - "* en-dessous de 15, la concentration est considérée comme étant faible", - "* au-dessus de 25, elle est considérée comme étant forte", - "", - "Ainsi plus le positionnement d'un point est en haut à droite des graphiques, plus les risques sont élevés.", - "Les graphiques présentent 2 droites horizontales et vetrticales pour matérialiser ces seuils." - ], - "ihh_criticality": "Indice de Herfindahl-Hirschmann - IHH vs Criticité", - "ihh_criticality_desc": "La taille des points donne l'indication de la criticité de substituabilité du minerai.", - "ihh_ivc": "Indice de Herfindahl-Hirschmann - IHH vs IVC", - "ihh_ivc_desc": "La taille des points donne l'indication de la criticité concurrentielle du minerai.", - "launch": "Lancer", - "no_data": "Aucune donnée à visualiser.", - "categories": { - "assembly": "Assemblage", - "manufacturing": "Fabrication", - "processing": "Traitement", - "extraction": "Extraction" - }, - "axis_titles": { - "ihh_countries": "IHH Pays (%)", - "ihh_actors": "IHH Acteurs (%)", - "ihh_extraction": "IHH Extraction (%)", - "ihh_reserves": "IHH Réserves (%)" - }, - "chart_titles": { - "concentration_criticality": "Concentration et criticité – {0}", - "concentration_resources": "Concentration des ressources critiques vs vulnérabilité IVC" - } - }, - "fiches": { - "title": "Découverte des fiches", - "help": "Comment utiliser cet onglet ?", - "help_content": [ - "1. Parcourez la liste des fiches disponibles par catégorie", - "2. Sélectionnez une fiche pour afficher son contenu complet", - "3. Consultez les données détaillées, graphiques et analyses supplémentaires", - "4. Utilisez ces informations pour approfondir votre compréhension des vulnérabilités identifiées", - "", - "Les catégories sont les suivantes :", - "* Assemblage : opération d'assemblage des produits finaux à partir des composants", - "* Connexe : opérations diverses nécessaires pour fabriquer le numérique, mais n'entrant pas directement dans sa composition", - "* Criticités : indices utilisés pour identifier et évaluer les vulnérabilités", - "* Fabrication : opération de fabrication des composants à partir de minerais", - "* Minerai : description et opérations d'extraction et de traitement des minerais" - ], - "no_files": "Aucune fiche disponible pour le moment.", - "choose_category": "Choisissez une catégorie de fiches", - "select_folder": "-- Sélectionner un dossier --", - "choose_file": "Choisissez une fiche", - "select_file": "-- Sélectionner une fiche --", - "loading_error": "Erreur lors du chargement de la fiche :", - "download_pdf": "Télécharger cette fiche en PDF", - "pdf_unavailable": "Le fichier PDF de cette fiche n'est pas disponible.", - "ticket_management": "Gestion des tickets pour cette fiche", - "tickets": { - "create_new": "Créer un nouveau ticket lié à cette fiche", - "model_load_error": "Impossible de charger le modèle de ticket.", - "contribution_type": "Type de contribution", - "specify": "Précisez", - "other": "Autre", - "concerned_card": "Fiche concernée", - "subject": "Sujet de la proposition", - "preview": "Prévisualiser le ticket", - "cancel": "Annuler", - "preview_title": "Prévisualisation du ticket", - "summary": "Résumé", - "title": "Titre", - "labels": "Labels", - "confirm": "Confirmer la création du ticket", - "created": "Ticket créé et formulaire vidé.", - "model_error": "Erreur chargement modèle :", - "no_linked_tickets": "Aucun ticket lié à cette fiche.", - "associated_tickets": "Tickets associés à cette fiche", - "moderation_notice": "ticket(s) en attente de modération ne sont pas affichés.", - "status": { - "awaiting": "En attente de traitement", - "in_progress": "En cours", - "completed": "Terminés", - "rejected": "Non retenus", - "others": "Autres" - }, - "no_title": "Sans titre", - "unknown": "inconnu", - "subject_label": "Sujet", - "no_labels": "aucun", - "comments": "Commentaire(s) :", - "no_comments": "Aucun commentaire.", - "comment_error": "Erreur lors de la récupération des commentaires :", - "opened_by": "Ouvert par", - "on_date": "le", - "updated": "MAJ", - "continue": "Continuer", - "created_success": "Ticket créé et placé en modération", - "created_error": "Échec de la création du ticket. Veuillez réessayer plus tard", - "see_ticket": "Voir le ticket" - } - } - }, - "node_levels": { - "0": "Produit final", - "1": "Composant", - "2": "Minerai", - "10": "Opération", - "11": "Pays d'opération", - "12": "Acteur d'opération", - "99": "Pays géographique" - }, - "errors": { - "log_read_error": "Erreur lecture log:", - "graph_preview_error": "Erreur de prévisualisation du graphe :", - "graph_creation_error": "Erreur lors de la création du graphique :", - "ihh_criticality_error": "Erreur dans la visualisation IHH vs Criticité :", - "ihh_ivc_error": "Erreur dans la visualisation IHH vs IVC :", - "comment_fetch_error": "Erreur lors de la récupération des commentaires :", - "template_load_error": "Erreur chargement modèle :", - "import_error": "Erreur d'import :" - }, - "buttons": { - "download": "Télécharger", - "run": "Lancer", - "save": "Enregistrer", + "fiches": { + "title": "Découverte des fiches", + "help": "Comment utiliser cet onglet ?", + "help_content": [ + "1. Parcourez la liste des fiches disponibles par catégorie", + "2. Sélectionnez une fiche pour afficher son contenu complet", + "3. Consultez les données détaillées, graphiques et analyses supplémentaires", + "4. Utilisez ces informations pour approfondir votre compréhension des vulnérabilités identifiées", + "", + "Les catégories sont les suivantes :", + "* Assemblage : opération d'assemblage des produits finaux à partir des composants", + "* Connexe : opérations diverses nécessaires pour fabriquer le numérique, mais n'entrant pas directement dans sa composition", + "* Criticités : indices utilisés pour identifier et évaluer les vulnérabilités", + "* Fabrication : opération de fabrication des composants à partir de minerais", + "* Minerai : description et opérations d'extraction et de traitement des minerais" + ], + "no_files": "Aucune fiche disponible pour le moment.", + "choose_category": "Choisissez une catégorie de fiches", + "select_folder": "-- Sélectionner un dossier --", + "choose_file": "Choisissez une fiche", + "select_file": "-- Sélectionner une fiche --", + "loading_error": "Erreur lors du chargement de la fiche :", + "download_pdf": "Télécharger cette fiche en PDF", + "pdf_unavailable": "Le fichier PDF de cette fiche n'est pas disponible.", + "ticket_management": "Gestion des tickets pour cette fiche", + "tickets": { + "create_new": "Créer un nouveau ticket lié à cette fiche", + "model_load_error": "Impossible de charger le modèle de ticket.", + "contribution_type": "Type de contribution", + "specify": "Précisez", + "other": "Autre", + "concerned_card": "Fiche concernée", + "subject": "Sujet de la proposition", + "preview": "Prévisualiser le ticket", "cancel": "Annuler", - "confirm": "Confirmer", - "filter": "Filtrer", - "search": "Rechercher", - "create": "Créer", - "update": "Mettre à jour", - "delete": "Supprimer", - "preview": "Prévisualiser", - "export": "Exporter", - "import": "Importer", - "restore": "Restaurer", - "refresh": "Rafraîchir", - "browse_files": "Parcourir les fichiers" - }, - "ui": { - "file_uploader": { - "drag_drop_here": "Glissez-déposez votre fichier ici", - "size_limit": "Limite 100 Ko par fichier • JSON" - } - }, - "batch": { - "in_queue": "En attente", - "in_progress": "Analyse en cours", - "failure": "Échec", - "unknwon_error": "erreur inconnue", - "no_task": "Aucune tâche en attente ou en cours", - "complete": "Analyse terminée. Télécharger le résultat au format zip, qui contient le rapport détaillé et l'analyse.", - "step": "Étape" + "preview_title": "Prévisualisation du ticket", + "summary": "Résumé", + "title": "Titre", + "labels": "Labels", + "confirm": "Confirmer la création du ticket", + "created": "Ticket créé et formulaire vidé.", + "model_error": "Erreur chargement modèle :", + "no_linked_tickets": "Aucun ticket lié à cette fiche.", + "associated_tickets": "Tickets associés à cette fiche", + "moderation_notice": "ticket(s) en attente de modération ne sont pas affichés.", + "status": { + "awaiting": "En attente de traitement", + "in_progress": "En cours", + "completed": "Terminés", + "rejected": "Non retenus", + "others": "Autres" + }, + "no_title": "Sans titre", + "unknown": "inconnu", + "subject_label": "Sujet", + "no_labels": "aucun", + "comments": "Commentaire(s) :", + "no_comments": "Aucun commentaire.", + "comment_error": "Erreur lors de la récupération des commentaires :", + "opened_by": "Ouvert par", + "on_date": "le", + "updated": "MAJ", + "continue": "Continuer", + "created_success": "Ticket créé et placé en modération", + "created_error": "Échec de la création du ticket. Veuillez réessayer plus tard", + "see_ticket": "Voir le ticket" + } } + }, + "node_levels": { + "0": "Produit final", + "1": "Composant", + "2": "Minerai", + "10": "Opération", + "11": "Pays d'opération", + "12": "Acteur d'opération", + "99": "Pays géographique" + }, + "errors": { + "log_read_error": "Erreur lecture log:", + "graph_preview_error": "Erreur de prévisualisation du graphe :", + "graph_creation_error": "Erreur lors de la création du graphique :", + "ihh_criticality_error": "Erreur dans la visualisation IHH vs Criticité :", + "ihh_ivc_error": "Erreur dans la visualisation IHH vs IVC :", + "comment_fetch_error": "Erreur lors de la récupération des commentaires :", + "template_load_error": "Erreur chargement modèle :", + "import_error": "Erreur d'import :" + }, + "buttons": { + "download": "Télécharger", + "run": "Lancer", + "save": "Enregistrer", + "cancel": "Annuler", + "confirm": "Confirmer", + "filter": "Filtrer", + "search": "Rechercher", + "create": "Créer", + "update": "Mettre à jour", + "delete": "Supprimer", + "preview": "Prévisualiser", + "export": "Exporter", + "import": "Importer", + "restore": "Restaurer", + "refresh": "Rafraîchir", + "browse_files": "Parcourir les fichiers" + }, + "ui": { + "file_uploader": { + "drag_drop_here": "Glissez-déposez votre fichier ici", + "size_limit": "Limite 100 Ko par fichier • JSON" + } + }, + "batch": { + "in_queue": "En attente", + "in_progress": "Analyse en cours", + "failure": "Échec", + "unknwon_error": "erreur inconnue", + "no_task": "Aucune tâche en attente ou en cours", + "complete": "Analyse terminée. Télécharger le résultat au format zip, qui contient le rapport détaillé et l'analyse.", + "step": "Étape" + } } diff --git a/assets/styles/base.css b/assets/styles/base.css index 8267201..9eef331 100644 --- a/assets/styles/base.css +++ b/assets/styles/base.css @@ -4,33 +4,33 @@ 1. Reset et base ========================================== */ .stAppHeader { - visibility: hidden; + visibility: hidden; } body, html { - font-family: - -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, - sans-serif; + font-family: + -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, + sans-serif; } body, .stApp, .block-container { - background-color: var(--bg-color) !important; - color: var(--text-color) !important; + background-color: var(--bg-color) !important; + color: var(--text-color) !important; } /* ========================================== 2. Layout et containers ========================================== */ .block-container { - max-width: 1024px !important; - padding: 0 1rem 10rem; + max-width: 1024px !important; + padding: 0 1rem 10rem; } .stVerticalBlock { - gap: 0.5rem !important; + gap: 0.5rem !important; } /* ========================================== @@ -42,97 +42,97 @@ body, .stDownloadButton > button, .stFormSubmitButton > button, .stSlider > div > div { - background-color: darkgreen !important; - color: white !important; - border: 1px solid grey; + background-color: #072c6e !important; + color: white !important; + border: 1px solid grey; } .st-key-FormSubmitter-auth_form-Se-connecter { - margin-left: auto; - margin-right: auto; + margin-left: auto; + margin-right: auto; } section:not([data-testid="stSidebar"]) - button[data-testid="stBaseButton-primary"], + button[data-testid="stBaseButton-primary"], section:not([data-testid="stSidebar"]) - button[data-testid="stBaseButton-secondary"] { - color: white !important; - background: darkgreen !important; + button[data-testid="stBaseButton-secondary"] { + color: white !important; + background: #072c6e !important; } section:not([data-testid="stSidebar"]) - button[data-testid="stBaseButton-primary"] - p, + button[data-testid="stBaseButton-primary"] + p, section:not([data-testid="stSidebar"]) - button[data-testid="stBaseButton-secondary"] - p { - color: white !important; + button[data-testid="stBaseButton-secondary"] + p { + color: white !important; } .bouton-fictif { - display: inline-flex; - -moz-box-align: center; - align-items: center; - -moz-box-pack: center; - justify-content: center; - padding: 0.25rem 0.75rem; - border-radius: 0.5rem; - min-height: 2.5rem; - margin-bottom: 20px; - line-height: 1; - text-transform: none; - font-size: x-large; - font-family: inherit; - user-select: none; - border: 1px solid rgba(49, 51, 63, 0.2); - background-color: darkgrey !important; - color: darkgreen !important; - font-weight: bold !important; - width: 100%; - letter-spacing: 0.2em; + display: inline-flex; + -moz-box-align: center; + align-items: center; + -moz-box-pack: center; + justify-content: center; + padding: 0.25rem 0.75rem; + border-radius: 0.5rem; + min-height: 2.5rem; + margin-bottom: 20px; + line-height: 1; + text-transform: none; + font-size: x-large; + font-family: inherit; + user-select: none; + border: 1px solid rgba(49, 51, 63, 0.2); + background-color: darkgrey !important; + color: #072c6e !important; + font-weight: bold !important; + width: 100%; + letter-spacing: 0.2em; } button[data-testid="stBaseButton-headerNoPadding"] svg { - fill: var(--text-color) !important; + fill: var(--text-color) !important; } /* --- 3.2 Onglets et radiogroup --- */ div[role="radiogroup"] > label { - padding: 0.5em 1em; - border-radius: 0.4em; - margin-right: 0.5em; - cursor: pointer; - border: 1px solid #fff; + padding: 0.5em 1em; + border-radius: 0.4em; + margin-right: 0.5em; + cursor: pointer; + border: 1px solid #fff; } div[role="radiogroup"] > label[data-selected="true"] { - font-weight: bold; - border: 2px solid #145a1a; + font-weight: bold; + border: 2px solid #145a1a; } section:not([data-testid="stSidebar"]) div[role="radiogroup"] > label p { - background-color: var(--radio-bg) !important; - color: var(--radio-text) !important; + background-color: var(--radio-bg) !important; + color: var(--radio-text) !important; } section:not([data-testid="stSidebar"]) - div[role="radiogroup"] - > label[data-selected="true"] { - background-color: var(--radio-selected-bg) !important; - color: var(--radio-selected-text) !important; + div[role="radiogroup"] + > label[data-selected="true"] { + background-color: var(--radio-selected-bg) !important; + color: var(--radio-selected-text) !important; } /* --- 3.3 Champs de formulaire --- */ div[data-baseweb="select"], section:not([data-testid="stSidebar"]) div[data-baseweb="base-input"], section[data-testid="stFileUploaderDropzone"] { - border: 1px solid var(--input-border) !important; - border-radius: 5px; - padding: 4px; + border: 1px solid var(--input-border) !important; + border-radius: 5px; + padding: 4px; } small { - display: none; + display: none; } section:not([data-testid="stSidebar"]) div[data-testid="stSelectbox"] p, @@ -142,7 +142,7 @@ section:not([data-testid="stSidebar"]) div[data-testid="stCheckbox"] p, section:not([data-testid="stSidebar"]) div[data-testid="stTextInput"] p, section:not([data-testid="stSidebar"]) div[data-testid="stTextArea"] p, section:not([data-testid="stSidebar"]) div[data-testid="stAlertContentInfo"] p { - color: var(--text-color) !important; + color: var(--text-color) !important; } /* ========================================== @@ -151,98 +151,98 @@ section:not([data-testid="stSidebar"]) div[data-testid="stAlertContentInfo"] p { /* --- 4.1 Header --- */ .wide-header { - width: 100vw; - margin-left: calc(-50vw + 50%); - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); - border-bottom: 1px solid #ddd; - text-align: center; - padding-top: 1rem; - margin-top: -1.25em; - background-color: var(--header-bg); + width: 100vw; + margin-left: calc(-50vw + 50%); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + border-bottom: 1px solid #ddd; + text-align: center; + padding-top: 1rem; + margin-top: -1.25em; + background-color: var(--header-bg); } .titre-header { - font-size: 2rem !important; - font-weight: bolder !important; - color: var(--header-title); + font-size: 2rem !important; + font-weight: bolder !important; + color: var(--header-title); } /* --- 4.2 Footer --- */ .wide-footer { - width: 100vw; - margin-left: calc(-50vw + 50%); - margin-top: 3rem; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); - border-top: 1px solid #ddd; - text-align: center; - padding-top: 1rem; - background-color: var(--footer-bg); + width: 100vw; + margin-left: calc(-50vw + 50%); + margin-top: 3rem; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + border-top: 1px solid #ddd; + text-align: center; + padding-top: 1rem; + background-color: var(--footer-bg); } .info-footer { - font-size: 1rem !important; - font-weight: 800; - color: var(--footer-text); + font-size: 1rem !important; + font-weight: 800; + color: var(--footer-text); } /* ========================================== 5. Sidebar ========================================== */ section[data-testid="stSidebar"] { - background-color: #ccc !important; - color: #111 !important; + background-color: #ccc !important; + color: #111 !important; } section[data-testid="stSidebar"] .stButton > button { - background-color: darkgreen !important; - color: white !important; - font-weight: bold !important; - border: 1px solid #ccc !important; - width: 100%; + background-color: #072c6e !important; + color: white !important; + font-weight: bold !important; + border: 1px solid #ccc !important; + width: 100%; } section[data-testid="stSidebar"] .decorative-heading { - font-size: 1.25rem; - font-weight: bold; - margin-bottom: 0.5rem; - text-align: center; - color: #145a1a; + font-size: 1.25rem; + font-weight: bold; + margin-bottom: 0.5rem; + text-align: center; + color: #072c6e; } section[data-testid="stSidebar"] div[role="radiogroup"] { - justify-content: center !important; - display: flex !important; - gap: 1rem; + justify-content: center !important; + display: flex !important; + gap: 1rem; } /* ========================================== 6. Tables ========================================== */ table { - border: 1px solid var(--table-border) !important; - border-collapse: collapse; - width: 100%; - margin-bottom: 1.5em; + border: 1px solid var(--table-border) !important; + border-collapse: collapse; + width: 100%; + margin-bottom: 1.5em; } th, td { - border: 1px solid var(--table-border) !important; - padding: 8px; - text-align: left; + border: 1px solid var(--table-border) !important; + padding: 8px; + text-align: left; } caption { - caption-side: top; - font-weight: bold; - padding: 0.5em; - text-align: left; - caption-side: bottom; - text-align: center; + caption-side: top; + font-weight: bold; + padding: 0.5em; + text-align: left; + caption-side: bottom; + text-align: center; } table[role="table"] th[scope="col"] { - background-color: var(--background-color); + background-color: var(--background-color); } /* ========================================== @@ -254,99 +254,99 @@ table[role="table"] th[scope="col"] { /* --- 7.2 Graphiques --- */ .stPlotlyChart text { - fill: var(--plot-text) !important; + fill: var(--plot-text) !important; } .stPlotlyChart text { - fill: black !important; - text-shadow: none !important; - font-weight: bold !important; - font-size: 14px !important; - font-family: Verdana, sans-serif !important; + fill: black !important; + text-shadow: none !important; + font-weight: bold !important; + font-size: 14px !important; + font-family: Verdana, sans-serif !important; } /* Cache complètement la section d'actions Vega */ .vega-actions { - display: none !important; + display: none !important; } /* Et aussi le
parent, s'il faut tout masquer */ details[title="Click to view actions"] { - display: none !important; + display: none !important; } /* --- 7.3 Détails et paragraphes --- */ details { - border: 1px solid #ccc; - border-radius: 6px; - padding: 0.5em; - margin-bottom: 0.5em; - background-color: var(--background-color); - border-color: var(--details-border) !important; + border: 1px solid #ccc; + border-radius: 6px; + padding: 0.5em; + margin-bottom: 0.5em; + background-color: var(--background-color); + border-color: var(--details-border) !important; } section:not([data-testid="stSidebar"]) - div:not[data-testid="stElementContainer"] - p:not(#Authentification):not(#Theme) { - color: var(--paragraph-color) !important; + div:not[data-testid="stElementContainer"] + p:not(#Authentification):not(#Theme) { + color: var(--paragraph-color) !important; } section:not([data-testid="stSidebar"]) hr { - background-color: var(--hr-color) !important; + background-color: var(--hr-color) !important; } /* --- 7.4 Conteneurs de commentaires et tickets --- */ .conteneur_commentaire, .conteneur_ticket { - background: var(--background-color); - padding: 1em; - border-radius: 8px; - margin-bottom: 1em; - border: 1px solid #ccc; + background: var(--background-color); + padding: 1em; + border-radius: 8px; + margin-bottom: 1em; + border: 1px solid #ccc; } .commentaire_auteur, .ticket_auteur { - color: var(--text-color) !important; - margin: 0; + color: var(--text-color) !important; + margin: 0; } .commentaire_contenu, .ticket_contenu { - color: var(--text-color) !important; - margin: 0.5rem 0 0; + color: var(--text-color) !important; + margin: 0.5rem 0 0; } /* --- 7.5 Blocs mathématiques --- */ .math-block { - display: block; - text-align: center; - margin: 1em 0; - border: 1px solid var(--math-block-border); - border-radius: 10px; - background: var(--math-block-bg); - font-size: x-large; - color: var(--text-color); + display: block; + text-align: center; + margin: 1em 0; + border: 1px solid var(--math-block-border); + border-radius: 10px; + background: var(--math-block-bg); + font-size: x-large; + color: var(--text-color); } .math-block math { - display: inline-block; + display: inline-block; } /* ========================================== 8. Éléments spécifiques ========================================== */ div.stElementContainer.element-container.st-key-nom_utilisateur { - display: none !important; + display: none !important; } .st-key-telecharger_fiche_pdf { - margin-left: auto; - margin-right: auto; - margin-top: 1rem; + margin-left: auto; + margin-right: auto; + margin-top: 1rem; } .details_introduction { - margin-top: 0.5rem; - margin-bottom: 0.5rem; + margin-top: 0.5rem; + margin-bottom: 0.5rem; } diff --git a/components/footer.py b/components/footer.py index 3e9f4a1..2b4b9b2 100644 --- a/components/footer.py +++ b/components/footer.py @@ -11,7 +11,9 @@ def afficher_pied_de_page():