diff --git a/contact/ui/control_ui.py b/contact/ui/control_ui.py index cc1968f..262652d 100644 --- a/contact/ui/control_ui.py +++ b/contact/ui/control_ui.py @@ -8,7 +8,9 @@ from typing import List from contact.utilities.save_to_radio import save_changes import contact.ui.default_config as config from contact.utilities.config_io import config_export, config_import -from contact.utilities.control_utils import parse_ini_file, transform_menu_path +from contact.utilities.control_utils import transform_menu_path +from contact.utilities.i18n import t +from contact.utilities.ini_utils import parse_ini_file from contact.utilities.input_handlers import ( get_repeated_input, get_text_input, @@ -16,7 +18,6 @@ from contact.utilities.input_handlers import ( get_list_input, get_admin_key_input, ) -from contact.utilities.i18n import t from contact.ui.colors import get_color from contact.ui.dialog import dialog from contact.ui.menus import generate_menu_from_protobuf diff --git a/contact/ui/user_config.py b/contact/ui/user_config.py index 0c2a004..0d37690 100644 --- a/contact/ui/user_config.py +++ b/contact/ui/user_config.py @@ -6,7 +6,7 @@ from typing import Any, List, Dict, Optional from contact.ui.colors import get_color, setup_colors, COLOR_MAP import contact.ui.default_config as config from contact.ui.nav_utils import move_highlight, draw_arrows, update_help_window -from contact.utilities.control_utils import parse_ini_file +from contact.utilities.ini_utils import parse_ini_file from contact.utilities.input_handlers import get_list_input from contact.utilities.i18n import t from contact.utilities.singleton import menu_state diff --git a/contact/utilities/control_utils.py b/contact/utilities/control_utils.py index 1543b1f..f438752 100644 --- a/contact/utilities/control_utils.py +++ b/contact/utilities/control_utils.py @@ -1,55 +1,7 @@ -from typing import Optional, Tuple, Dict, List +from typing import List import re -def parse_ini_file(ini_file_path: str) -> Tuple[Dict[str, str], Dict[str, str]]: - """Parses an INI file and returns a mapping of keys to human-readable names and help text.""" - - field_mapping: Dict[str, str] = {} - help_text: Dict[str, str] = {} - current_section: Optional[str] = None - - with open(ini_file_path, "r", encoding="utf-8") as f: - for line in f: - line = line.strip() - - # Skip empty lines and comments - if not line or line.startswith(";") or line.startswith("#"): - continue - - # Handle sections like [config.device] - if line.startswith("[") and line.endswith("]"): - current_section = line[1:-1] - continue - - # Parse lines like: key, "Human-readable name", "helptext" - parts = [p.strip().strip('"') for p in line.split(",", 2)] - if len(parts) >= 2: - key = parts[0] - - # If key is 'title', map directly to the section - if key == "title": - full_key = current_section - else: - full_key = f"{current_section}.{key}" if current_section else key - - # Use the provided human-readable name or fallback to key - human_readable_name = parts[1] if parts[1] else key - field_mapping[full_key] = human_readable_name - - # Handle help text or default - help = parts[2] if len(parts) == 3 and parts[2] else "No help available." - help_text[full_key] = help - - else: - # Handle cases with only the key present - full_key = f"{current_section}.{key}" if current_section else key - field_mapping[full_key] = key - help_text[full_key] = "No help available." - - return field_mapping, help_text - - def transform_menu_path(menu_path: List[str]) -> List[str]: """Applies path replacements and normalizes entries in the menu path.""" path_replacements = {"Radio Settings": "config", "Module Settings": "module"} diff --git a/contact/utilities/i18n.py b/contact/utilities/i18n.py index b5c0d8a..9f56daf 100644 --- a/contact/utilities/i18n.py +++ b/contact/utilities/i18n.py @@ -1,7 +1,7 @@ from typing import Optional import contact.ui.default_config as config -from contact.utilities.control_utils import parse_ini_file +from contact.utilities.ini_utils import parse_ini_file _translations = {} _language = None diff --git a/contact/utilities/ini_utils.py b/contact/utilities/ini_utils.py new file mode 100644 index 0000000..915afed --- /dev/null +++ b/contact/utilities/ini_utils.py @@ -0,0 +1,54 @@ +from typing import Optional, Tuple, Dict +from contact.utilities import i18n + + +def parse_ini_file(ini_file_path: str) -> Tuple[Dict[str, str], Dict[str, str]]: + """Parses an INI file and returns a mapping of keys to human-readable names and help text.""" + try: + default_help = i18n.t("ui.help.no_help", default="No help available.") + except Exception: + default_help = "No help available." + + field_mapping: Dict[str, str] = {} + help_text: Dict[str, str] = {} + current_section: Optional[str] = None + + with open(ini_file_path, "r", encoding="utf-8") as f: + for line in f: + line = line.strip() + + # Skip empty lines and comments + if not line or line.startswith(";") or line.startswith("#"): + continue + + # Handle sections like [config.device] + if line.startswith("[") and line.endswith("]"): + current_section = line[1:-1] + continue + + # Parse lines like: key, "Human-readable name", "helptext" + parts = [p.strip().strip('"') for p in line.split(",", 2)] + if len(parts) >= 2: + key = parts[0] + + # If key is 'title', map directly to the section + if key == "title": + full_key = current_section + else: + full_key = f"{current_section}.{key}" if current_section else key + + # Use the provided human-readable name or fallback to key + human_readable_name = parts[1] if parts[1] else key + field_mapping[full_key] = human_readable_name + + # Handle help text or default + help = parts[2] if len(parts) == 3 and parts[2] else default_help + help_text[full_key] = help + + else: + # Handle cases with only the key present + full_key = f"{current_section}.{key}" if current_section else key + field_mapping[full_key] = key + help_text[full_key] = default_help + + return field_mapping, help_text