From b76a5b7b8854472476ea520f4e3b217b81edc86e Mon Sep 17 00:00:00 2001 From: criss717 Date: Mon, 10 Aug 2026 20:58:39 +0200 Subject: [PATCH] fix(i18n): resolve config format and argparse language pre-scan - Fix config file reading to use canonical format {env: {STRIX_LANGUAGE: es}} - Pre-scan sys.argv for --language/-l before argparse runs - This allows --help to display translated text when language is set - Addresses review feedback from greptile-apps[bot] --- strix/i18n.py | 11 +++++++---- strix/interface/cli_args.py | 27 ++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/strix/i18n.py b/strix/i18n.py index dc63a032..74a2881a 100644 --- a/strix/i18n.py +++ b/strix/i18n.py @@ -41,14 +41,17 @@ def _detect_language() -> str: if env_lang: return _normalize_lang(env_lang) - # 3. Config file + # 3. Config file (canonical format: {"env": {"STRIX_LANGUAGE": "es"}}) try: config_path = Path.home() / ".strix" / "cli-config.json" if config_path.exists(): data = json.loads(config_path.read_text(encoding="utf-8")) - config_lang = data.get("language", "").strip().lower() - if config_lang: - return _normalize_lang(config_lang) + if isinstance(data, dict): + env_block = data.get("env", {}) + if isinstance(env_block, dict): + config_lang = env_block.get("STRIX_LANGUAGE", "").strip().lower() + if config_lang: + return _normalize_lang(config_lang) except (json.JSONDecodeError, OSError): pass diff --git a/strix/interface/cli_args.py b/strix/interface/cli_args.py index fc990b64..aa990deb 100644 --- a/strix/interface/cli_args.py +++ b/strix/interface/cli_args.py @@ -18,6 +18,25 @@ from strix.interface.utils import ( ) +def _pre_resolve_language() -> None: + """Set language from --language/-l before argparse runs. + + Argparse evaluates help text at parse time, so we must set the language + BEFORE parse_args() is called. This pre-scans sys.argv for the flag. + """ + argv = sys.argv[1:] + for i, arg in enumerate(argv): + if arg in ("-l", "--language") and i + 1 < len(argv): + from strix.i18n import set_language + set_language(argv[i + 1]) + return + # Handle --language=es form + if arg.startswith("--language="): + from strix.i18n import set_language + set_language(arg.split("=", 1)[1]) + return + + def get_version() -> str: try: from importlib.metadata import version @@ -50,6 +69,9 @@ def _positive_int(value: str) -> int: def parse_arguments() -> argparse.Namespace: + # Pre-scan for --language before argparse runs so help text can be translated + _pre_resolve_language() + parser = argparse.ArgumentParser( description="Strix Multi-Agent Cybersecurity Penetration Testing Tool", formatter_class=argparse.RawDescriptionHelpFormatter, @@ -256,11 +278,6 @@ Examples: args.diff_scope = {"active": False} args.run_name = None - # Set language from CLI flag (highest priority in resolution chain) - if args.language: - from strix.i18n import set_language - set_language(args.language) - if args.config: apply_config_override(validate_config_file(args.config))