From c27f385954a27fb572b90e298392a5cdc2b6b8e7 Mon Sep 17 00:00:00 2001 From: Pigbibi <20649888+Pigbibi@users.noreply.github.com> Date: Thu, 18 Jun 2026 15:49:43 +0800 Subject: [PATCH] Add localized strategy display names to status rows --- .../common/notification_localization.py | 2 +- src/quant_platform_kit/common/strategies.py | 13 +++++++++++++ tests/test_strategies.py | 5 +++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/quant_platform_kit/common/notification_localization.py b/src/quant_platform_kit/common/notification_localization.py index 5e24000..c227826 100644 --- a/src/quant_platform_kit/common/notification_localization.py +++ b/src/quant_platform_kit/common/notification_localization.py @@ -214,7 +214,7 @@ ("russell_1000_multi_factor_defensive", "罗素1000多因子"), ("tech_communication_pullback_enhancement", "科技通信回调增强"), ("qqq_tech_enhancement", "科技通信回调增强"), - ("mega_cap_leader_rotation_top50_balanced", "Mega Cap Top50 平衡龙头轮动"), + ("mega_cap_leader_rotation_top50_balanced", "美股超大盘50强平衡龙头轮动"), ("outside_monthly_execution_window", "当前不在月度执行窗口"), ("no_execution_window_after_snapshot", "快照后没有可用执行窗口"), ("no-op", "不执行"), diff --git a/src/quant_platform_kit/common/strategies.py b/src/quant_platform_kit/common/strategies.py index fa337d2..90b88e0 100644 --- a/src/quant_platform_kit/common/strategies.py +++ b/src/quant_platform_kit/common/strategies.py @@ -60,6 +60,7 @@ class StrategyMetadata: canonical_profile: str display_name: str description: str + localized_display_names: Mapping[str, str] = field(default_factory=dict) aliases: tuple[str, ...] = () cadence: str | None = None asset_scope: str | None = None @@ -275,11 +276,21 @@ def build_strategy_index_rows(strategy_catalog: StrategyCatalog) -> list[dict[st "compatible_capabilities": definition.compatible_capabilities, "target_mode": _resolve_target_mode(definition), "bundled_config_relpath": definition.bundled_config_relpath, + **_localized_display_name_fields(metadata), } ) return rows +def _localized_display_name_fields(metadata: StrategyMetadata | None) -> dict[str, object]: + if metadata is None: + return {} + zh_name = str(metadata.localized_display_names.get("zh") or "").strip() + if not zh_name: + return {} + return {"display_name_zh": zh_name} + + def get_catalog_target_mode( strategy_catalog: StrategyCatalog, profile: str, @@ -441,6 +452,7 @@ def build_platform_profile_matrix( "is_default": definition.profile == policy.default_profile, "is_rollback": definition.profile == policy.rollback_profile, "domain": definition.domain, + **_localized_display_name_fields(metadata), } ) return rows @@ -471,6 +483,7 @@ def build_platform_profile_status_matrix( "is_default": definition.profile == policy.default_profile, "is_rollback": definition.profile == policy.rollback_profile, "domain": definition.domain, + **_localized_display_name_fields(metadata), } ) return rows diff --git a/tests/test_strategies.py b/tests/test_strategies.py index 52edd31..9a6bca9 100644 --- a/tests/test_strategies.py +++ b/tests/test_strategies.py @@ -146,6 +146,7 @@ def test_catalog_helpers_resolve_alias_and_metadata(self) -> None: canonical_profile="global_etf_rotation", display_name="Global ETF Rotation Defense", description="rotation", + localized_display_names={"zh": "全球 ETF 防守轮动"}, aliases=("global_macro_etf_rotation",), cadence="quarterly", benchmark="VOO", @@ -175,6 +176,7 @@ def test_catalog_helpers_resolve_alias_and_metadata(self) -> None: rows = build_strategy_index_rows(catalog) by_profile = {row["canonical_profile"]: row for row in rows} self.assertEqual(by_profile["global_etf_rotation"]["display_name"], "Global ETF Rotation Defense") + self.assertEqual(by_profile["global_etf_rotation"]["display_name_zh"], "全球 ETF 防守轮动") self.assertEqual(by_profile["global_etf_rotation"]["target_mode"], "weight") def test_platform_policy_helpers_build_matrix_and_resolve_enabled_profile(self) -> None: @@ -185,6 +187,7 @@ def test_platform_policy_helpers_build_matrix_and_resolve_enabled_profile(self) canonical_profile="global_etf_rotation", display_name="Global ETF Rotation Defense", description="rotation", + localized_display_names={"zh": "全球 ETF 防守轮动"}, aliases=("global_macro_etf_rotation",), ), }, @@ -204,6 +207,7 @@ def test_platform_policy_helpers_build_matrix_and_resolve_enabled_profile(self) ) matrix = build_platform_profile_matrix(catalog, policy=policy) self.assertEqual(matrix[0]["display_name"], "Global ETF Rotation Defense") + self.assertEqual(matrix[0]["display_name_zh"], "全球 ETF 防守轮动") definition = resolve_platform_strategy_definition( "global_macro_etf_rotation", platform_id="ibkr", @@ -216,6 +220,7 @@ def test_platform_policy_helpers_build_matrix_and_resolve_enabled_profile(self) policy=policy, eligible_profiles=frozenset({"global_etf_rotation"}), ) + self.assertEqual(status_matrix[0]["display_name_zh"], "全球 ETF 防守轮动") self.assertEqual(status_matrix[0]["eligible"], True) self.assertEqual(status_matrix[0]["enabled"], True)