diff --git a/src-tauri/src/services/subscription.rs b/src-tauri/src/services/subscription.rs index 5528455e6..5d6cbf58d 100644 --- a/src-tauri/src/services/subscription.rs +++ b/src-tauri/src/services/subscription.rs @@ -1340,3 +1340,21 @@ fn now_millis() -> i64 { .unwrap_or_default() .as_millis() as i64 } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn window_seconds_map_to_expected_tier_names() { + // 官方特例窗口 + assert_eq!(window_seconds_to_tier_name(18000), "five_hour"); + assert_eq!(window_seconds_to_tier_name(604800), "seven_day"); + // Codex 免费方案的次要窗口是 30 天(30 * 24 * 3600 = 2_592_000 秒)。 + // 前端 TIER_I18N_KEYS 需要有对应的 "30_day" 才能展示,见 #3651。 + assert_eq!(window_seconds_to_tier_name(2_592_000), "30_day"); + // 其他窗口按小时/天回退命名 + assert_eq!(window_seconds_to_tier_name(3600), "1_hour"); + assert_eq!(window_seconds_to_tier_name(86400), "1_day"); + } +} diff --git a/src/components/SubscriptionQuotaFooter.tsx b/src/components/SubscriptionQuotaFooter.tsx index 7d46bc376..e5ce8ecaf 100644 --- a/src/components/SubscriptionQuotaFooter.tsx +++ b/src/components/SubscriptionQuotaFooter.tsx @@ -27,6 +27,8 @@ export const TIER_I18N_KEYS: Record = { seven_day: "subscription.sevenDay", seven_day_opus: "subscription.sevenDayOpus", seven_day_sonnet: "subscription.sevenDaySonnet", + // Codex 免费方案的次要窗口是 30 天(付费方案为 7 天) + "30_day": "subscription.thirtyDay", // Gemini 模型分类 gemini_pro: "subscription.geminiPro", gemini_flash: "subscription.geminiFlash", diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index fcad23b3f..1bb0c7314 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -2903,6 +2903,7 @@ "sevenDay": "7-Day", "sevenDayOpus": "7-Day (Opus)", "sevenDaySonnet": "7-Day (Sonnet)", + "thirtyDay": "30-Day", "geminiPro": "Pro", "geminiFlash": "Flash", "geminiFlashLite": "Flash Lite", diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json index 46c3b51fc..1638fde00 100644 --- a/src/i18n/locales/ja.json +++ b/src/i18n/locales/ja.json @@ -2903,6 +2903,7 @@ "sevenDay": "7日間", "sevenDayOpus": "7日間(Opus)", "sevenDaySonnet": "7日間(Sonnet)", + "thirtyDay": "30日間", "geminiPro": "Pro", "geminiFlash": "Flash", "geminiFlashLite": "Flash Lite", diff --git a/src/i18n/locales/zh-TW.json b/src/i18n/locales/zh-TW.json index feaddbbb0..ee07ad703 100644 --- a/src/i18n/locales/zh-TW.json +++ b/src/i18n/locales/zh-TW.json @@ -2875,6 +2875,7 @@ "sevenDay": "7 天", "sevenDayOpus": "7 天 (Opus)", "sevenDaySonnet": "7 天 (Sonnet)", + "thirtyDay": "30 天", "geminiPro": "Pro", "geminiFlash": "Flash", "geminiFlashLite": "Flash Lite", diff --git a/src/i18n/locales/zh.json b/src/i18n/locales/zh.json index c58366488..c31ccd930 100644 --- a/src/i18n/locales/zh.json +++ b/src/i18n/locales/zh.json @@ -2903,6 +2903,7 @@ "sevenDay": "7天", "sevenDayOpus": "7天(Opus)", "sevenDaySonnet": "7天(Sonnet)", + "thirtyDay": "30天", "geminiPro": "Pro", "geminiFlash": "Flash", "geminiFlashLite": "Flash Lite",