Browse Source

feat(i18n): add session origin chain translation keys

Add originDecisionTitle/Desc/Loading/Unavailable/Expand keys to
logs.details.logicTrace in all 5 language dashboard.json files.
Add originHint key to summary in all 5 language provider-chain.json files.
ding113 1 week ago
parent
commit
26c8e2cb5f

+ 14 - 9
messages/en/dashboard.json

@@ -340,7 +340,12 @@
         "sessionAge": "Session Age",
         "reusedProvider": "Reused Provider",
         "executeRequest": "Execute Request",
-        "cacheOptimizationHint": "Session reuse optimizes performance by maintaining provider affinity within the same conversation, reducing selection overhead and improving cache hit rates."
+        "cacheOptimizationHint": "Session reuse optimizes performance by maintaining provider affinity within the same conversation, reducing selection overhead and improving cache hit rates.",
+        "originDecisionTitle": "Original Selection Decision",
+        "originDecisionDesc": "How this provider was initially chosen for this session",
+        "originDecisionLoading": "Loading original decision...",
+        "originDecisionUnavailable": "Original decision record unavailable",
+        "originDecisionExpand": "View original selection"
       }
     },
     "providerChain": {
@@ -1870,14 +1875,14 @@
           "descriptionEnabled": "When enabled, this key will access an independent personal usage page upon login. However, it cannot modify its own key's provider group.",
           "descriptionDisabled": "When disabled, the user cannot access the personal usage page UI. Instead, they will use the restricted Web UI."
         },
-      "providerGroup": {
-        "label": "Provider Group",
-        "placeholder": "Default: default",
-        "selectHint": "Select the provider group(s) this key can use (default: default).",
-        "editHint": "Provider group cannot be changed for existing keys.",
-        "allGroups": "Use all groups",
-        "noGroupHint": "default includes providers without groupTag."
-      },
+        "providerGroup": {
+          "label": "Provider Group",
+          "placeholder": "Default: default",
+          "selectHint": "Select the provider group(s) this key can use (default: default).",
+          "editHint": "Provider group cannot be changed for existing keys.",
+          "allGroups": "Use all groups",
+          "noGroupHint": "default includes providers without groupTag."
+        },
         "cacheTtl": {
           "label": "Cache TTL Override",
           "description": "Force Anthropic prompt cache TTL for requests containing cache_control.",

+ 2 - 1
messages/en/provider-chain.json

@@ -19,7 +19,8 @@
   },
   "summary": {
     "singleSuccess": "{total} providers, {healthy} healthy → {provider} ✓",
-    "sessionReuse": "Session reuse → {provider} ✓"
+    "sessionReuse": "Session reuse → {provider} ✓",
+    "originHint": "Session reuse - originally selected via {method}"
   },
   "description": {
     "noDecisionRecord": "No decision record",

+ 40 - 100
messages/ja/dashboard.json

@@ -340,7 +340,12 @@
         "sessionAge": "セッション経過時間",
         "reusedProvider": "再利用プロバイダー",
         "executeRequest": "リクエスト実行",
-        "cacheOptimizationHint": "セッション再利用は、同じ会話内でプロバイダーの親和性を維持することでパフォーマンスを最適化し、選択オーバーヘッドを削減してキャッシュヒット率を向上させます。"
+        "cacheOptimizationHint": "セッション再利用は、同じ会話内でプロバイダーの親和性を維持することでパフォーマンスを最適化し、選択オーバーヘッドを削減してキャッシュヒット率を向上させます。",
+        "originDecisionTitle": "元の選択決定",
+        "originDecisionDesc": "このセッションでプロバイダーが最初に選択された理由",
+        "originDecisionLoading": "元の決定を読み込み中...",
+        "originDecisionUnavailable": "元の決定記録は利用できません",
+        "originDecisionExpand": "元の選択を表示"
       }
     },
     "providerChain": {
@@ -1051,45 +1056,56 @@
       "load": "負荷"
     },
     "timeRange": {
+      "label": "時間範囲",
       "15min": "15分",
       "1h": "1時間",
       "6h": "6時間",
       "24h": "24時間",
-      "7d": "7日"
+      "7d": "7日間",
+      "last15min": "過去15分",
+      "last1h": "過去1時間",
+      "last6h": "過去6時間",
+      "last24h": "過去24時間",
+      "last7d": "過去7日間",
+      "custom": "カスタム"
     },
     "laneChart": {
       "title": "プロバイダー可用性タイムライン",
-      "noData": "データがありません",
+      "noData": "データなし",
       "requests": "{count} リクエスト",
-      "availability": "{value}% 可用",
-      "noRequests": "リクエストなし"
+      "availability": "可用性 {value}%",
+      "noRequests": "リクエストなし",
+      "denseData": "高密度",
+      "sparseData": "低密度",
+      "latency": "レイテンシ"
     },
     "latencyChart": {
-      "title": "遅延分布",
+      "title": "レイテンシ分布",
       "p50": "P50",
       "p95": "P95",
       "p99": "P99",
-      "noData": "遅延データがありません"
+      "noData": "レイテンシデータなし"
     },
     "latencyCurve": {
-      "title": "遅延トレンド",
-      "noData": "遅延データがありません",
+      "title": "レイテンシトレンド",
+      "noData": "レイテンシデータなし",
       "avg": "平均",
       "min": "最小",
       "max": "最大",
-      "latency": "遅延"
+      "latency": "レイテンシ"
     },
     "terminal": {
       "title": "プローブログ",
-      "live": "LIVE",
+      "live": "ライブ",
       "download": "ログをダウンロード",
-      "noLogs": "プローブログがありません",
+      "noLogs": "プローブログなし",
       "manual": "手動",
       "auto": "自動",
       "filterPlaceholder": "ログをフィルター..."
     },
     "probeGrid": {
-      "noEndpoints": "エンドポイントが設定されていません",
+      "title": "エンドポイントステータス",
+      "noEndpoints": "エンドポイント未設定",
       "lastProbe": "最終プローブ",
       "status": {
         "unknown": "不明",
@@ -1105,13 +1121,21 @@
       "low": "低",
       "medium": "中",
       "high": "高",
-      "lowTooltip": "{count} 件未満のリクエスト。データが代表的でない可能性があります。",
-      "mediumTooltip": "中程度のリクエスト量。データは比較的信頼できます。",
-      "highTooltip": "高いリクエスト量。データは信頼できます。"
+      "lowTooltip": "リクエスト数が {count} 未満です。データが代表的でない可能性があります。",
+      "mediumTooltip": "リクエスト量は適度です。データは比較的信頼できます。",
+      "highTooltip": "リクエスト量が十分です。データは信頼できます。"
     },
     "actions": {
+      "refresh": "更新",
+      "refreshing": "更新中...",
+      "autoRefresh": "自動更新",
+      "stopAutoRefresh": "自動更新を停止",
+      "viewDetails": "詳細を表示",
+      "testProvider": "プロバイダーをテスト",
+      "retry": "再試行",
       "probeNow": "今すぐプローブ",
       "probing": "プローブ中...",
+      "probeAll": "すべてプローブ",
       "probeSuccess": "プローブ成功",
       "probeFailed": "プローブ失敗"
     },
@@ -1136,20 +1160,6 @@
       "lastRequest": "最終リクエスト",
       "requestCount": "リクエスト数"
     },
-    "timeRange": {
-      "label": "時間範囲",
-      "15min": "15分",
-      "1h": "1時間",
-      "6h": "6時間",
-      "24h": "24時間",
-      "7d": "7日間",
-      "last15min": "過去15分",
-      "last1h": "過去1時間",
-      "last6h": "過去6時間",
-      "last24h": "過去24時間",
-      "last7d": "過去7日間",
-      "custom": "カスタム"
-    },
     "filters": {
       "provider": "プロバイダー",
       "allProviders": "すべてのプロバイダー",
@@ -1187,20 +1197,6 @@
       "greenCount": "成功リクエスト",
       "redCount": "失敗リクエスト"
     },
-    "actions": {
-      "refresh": "更新",
-      "refreshing": "更新中...",
-      "autoRefresh": "自動更新",
-      "stopAutoRefresh": "自動更新を停止",
-      "viewDetails": "詳細を表示",
-      "testProvider": "プロバイダーをテスト",
-      "retry": "再試行",
-      "probeNow": "今すぐプローブ",
-      "probing": "プローブ中...",
-      "probeAll": "すべてプローブ",
-      "probeSuccess": "プローブ成功",
-      "probeFailed": "プローブ失敗"
-    },
     "states": {
       "loading": "読み込み中...",
       "error": "読み込み失敗",
@@ -1251,62 +1247,6 @@
       "probeSuccess": "プローブ成功",
       "probeFailed": "プローブ失敗"
     },
-    "laneChart": {
-      "title": "プロバイダー可用性タイムライン",
-      "noData": "データなし",
-      "requests": "{count} リクエスト",
-      "availability": "可用性 {value}%",
-      "noRequests": "リクエストなし",
-      "denseData": "高密度",
-      "sparseData": "低密度",
-      "latency": "レイテンシ"
-    },
-    "latencyChart": {
-      "title": "レイテンシ分布",
-      "p50": "P50",
-      "p95": "P95",
-      "p99": "P99",
-      "noData": "レイテンシデータなし"
-    },
-    "latencyCurve": {
-      "title": "レイテンシトレンド",
-      "noData": "レイテンシデータなし",
-      "avg": "平均",
-      "min": "最小",
-      "max": "最大",
-      "latency": "レイテンシ"
-    },
-    "terminal": {
-      "title": "プローブログ",
-      "live": "ライブ",
-      "download": "ログをダウンロード",
-      "noLogs": "プローブログなし",
-      "manual": "手動",
-      "auto": "自動",
-      "filterPlaceholder": "ログをフィルター..."
-    },
-    "probeGrid": {
-      "title": "エンドポイントステータス",
-      "noEndpoints": "エンドポイント未設定",
-      "lastProbe": "最終プローブ",
-      "status": {
-        "unknown": "不明",
-        "healthy": "正常",
-        "unhealthy": "異常"
-      }
-    },
-    "endpoint": {
-      "selectVendor": "ベンダーを選択",
-      "selectType": "タイプを選択"
-    },
-    "confidence": {
-      "low": "低",
-      "medium": "中",
-      "high": "高",
-      "lowTooltip": "リクエスト数が {count} 未満です。データが代表的でない可能性があります。",
-      "mediumTooltip": "リクエスト量は適度です。データは比較的信頼できます。",
-      "highTooltip": "リクエスト量が十分です。データは信頼できます。"
-    },
     "toast": {
       "refreshSuccess": "可用性データを更新しました",
       "refreshFailed": "更新に失敗しました。再試行してください"

+ 2 - 1
messages/ja/provider-chain.json

@@ -19,7 +19,8 @@
   },
   "summary": {
     "singleSuccess": "{total}個のプロバイダー、{healthy}個正常 → {provider} ✓",
-    "sessionReuse": "セッション再利用 → {provider} ✓"
+    "sessionReuse": "セッション再利用 → {provider} ✓",
+    "originHint": "セッション再利用 - 元は {method} で選択"
   },
   "description": {
     "noDecisionRecord": "決定記録なし",

+ 20 - 23
messages/ru/dashboard.json

@@ -340,7 +340,12 @@
         "sessionAge": "Возраст сессии",
         "reusedProvider": "Повторно используемый провайдер",
         "executeRequest": "Выполнить запрос",
-        "cacheOptimizationHint": "Повторное использование сессии оптимизирует производительность, поддерживая привязку к провайдеру в рамках одного разговора, снижая накладные расходы на выбор и повышая частоту попаданий в кэш."
+        "cacheOptimizationHint": "Повторное использование сессии оптимизирует производительность, поддерживая привязку к провайдеру в рамках одного разговора, снижая накладные расходы на выбор и повышая частоту попаданий в кэш.",
+        "originDecisionTitle": "Исходное решение выбора",
+        "originDecisionDesc": "Как провайдер был изначально выбран для этой сессии",
+        "originDecisionLoading": "Загрузка исходного решения...",
+        "originDecisionUnavailable": "Запись исходного решения недоступна",
+        "originDecisionExpand": "Просмотр исходного выбора"
       }
     },
     "providerChain": {
@@ -1123,12 +1128,12 @@
       "highTooltip": "Высокий объём запросов. Данные надёжны."
     },
     "actions": {
-      "retry": "Повторить",
-      "probeNow": "Проверить сейчас",
-      "probing": "Проверка...",
-      "probeAll": "Проверить все",
-      "probeSuccess": "Проверка успешна",
-      "probeFailed": "Проверка не удалась"
+      "refresh": "Обновить",
+      "refreshing": "Обновление...",
+      "autoRefresh": "Автообновление",
+      "stopAutoRefresh": "Остановить автообновление",
+      "viewDetails": "Подробнее",
+      "testProvider": "Тестировать провайдера"
     },
     "status": {
       "green": "Здоров",
@@ -1188,14 +1193,6 @@
       "greenCount": "Успешные запросы",
       "redCount": "Неудачные запросы"
     },
-    "actions": {
-      "refresh": "Обновить",
-      "refreshing": "Обновление...",
-      "autoRefresh": "Автообновление",
-      "stopAutoRefresh": "Остановить автообновление",
-      "viewDetails": "Подробнее",
-      "testProvider": "Тестировать провайдера"
-    },
     "states": {
       "loading": "Загрузка...",
       "error": "Ошибка загрузки",
@@ -1862,14 +1859,14 @@
           "descriptionEnabled": "При включении этот ключ будет использовать независимую страницу личного использования при входе. Однако он не может изменять группу провайдеров собственного ключа.",
           "descriptionDisabled": "При отключении пользователь не сможет получить доступ к странице личного использования. Вместо этого будет использоваться ограниченный Web UI."
         },
-      "providerGroup": {
-        "label": "Группа провайдеров",
-        "placeholder": "По умолчанию: default",
-        "selectHint": "Выберите группы провайдеров, доступные для этого ключа",
-        "editHint": "Группа провайдеров существующего ключа не может быть изменена",
-        "allGroups": "Использовать все группы",
-        "noGroupHint": "default включает провайдеров без groupTag."
-      },
+        "providerGroup": {
+          "label": "Группа провайдеров",
+          "placeholder": "По умолчанию: default",
+          "selectHint": "Выберите группы провайдеров, доступные для этого ключа",
+          "editHint": "Группа провайдеров существующего ключа не может быть изменена",
+          "allGroups": "Использовать все группы",
+          "noGroupHint": "default включает провайдеров без groupTag."
+        },
         "cacheTtl": {
           "label": "Переопределение Cache TTL",
           "description": "Принудительно установить Anthropic prompt cache TTL для запросов с cache_control.",

+ 2 - 1
messages/ru/provider-chain.json

@@ -19,7 +19,8 @@
   },
   "summary": {
     "singleSuccess": "{total} провайдеров, {healthy} работоспособных → {provider} ✓",
-    "sessionReuse": "Повторное использование сессии → {provider} ✓"
+    "sessionReuse": "Повторное использование сессии → {provider} ✓",
+    "originHint": "Повторное использование сессии - изначально выбрано через {method}"
   },
   "description": {
     "noDecisionRecord": "Нет записей решений",

+ 37 - 32
messages/zh-CN/dashboard.json

@@ -340,7 +340,12 @@
         "sessionAge": "会话年龄",
         "reusedProvider": "复用的供应商",
         "executeRequest": "执行请求",
-        "cacheOptimizationHint": "会话复用通过在同一对话中保持供应商亲和性来优化性能,减少选择开销并提高缓存命中率。"
+        "cacheOptimizationHint": "会话复用通过在同一对话中保持供应商亲和性来优化性能,减少选择开销并提高缓存命中率。",
+        "originDecisionTitle": "原始选择决策",
+        "originDecisionDesc": "此会话中供应商最初被选择的原因",
+        "originDecisionLoading": "正在加载原始决策...",
+        "originDecisionUnavailable": "原始决策记录不可用",
+        "originDecisionExpand": "查看原始选择"
       }
     },
     "providerChain": {
@@ -388,13 +393,13 @@
       "users": "用户排行",
       "keys": "密钥排行",
       "userRanking": "用户排行",
-    "providerRanking": "供应商排行",
-    "providerCacheHitRateRanking": "供应商缓存命中率排行",
-    "modelRanking": "模型排行",
-    "dailyRanking": "今日",
-    "weeklyRanking": "本周",
-    "monthlyRanking": "本月",
-    "allTimeRanking": "全部"
+      "providerRanking": "供应商排行",
+      "providerCacheHitRateRanking": "供应商缓存命中率排行",
+      "modelRanking": "模型排行",
+      "dailyRanking": "今日",
+      "weeklyRanking": "本周",
+      "monthlyRanking": "本月",
+      "allTimeRanking": "全部"
     },
     "dateRange": {
       "to": "至",
@@ -413,22 +418,22 @@
       "requests": "请求数",
       "tokens": "Token 数",
       "consumedAmount": "消耗金额",
-    "provider": "供应商",
-    "model": "模型",
-    "cost": "成本",
-    "cacheHitRequests": "缓存触发请求数",
-    "cacheHitRate": "缓存命中率",
-    "cacheReadTokens": "缓存读取 Token 数",
-    "totalTokens": "总 Token 数",
-    "cacheCreationConsumedAmount": "缓存创建消耗金额",
-    "totalConsumedAmount": "总消耗金额",
-    "successRate": "成功率",
-    "avgResponseTime": "平均响应时间",
-    "avgTtfbMs": "平均 TTFB",
-    "avgTokensPerSecond": "平均输出速率",
-    "avgCostPerRequest": "平均单次请求成本",
-    "avgCostPerMillionTokens": "平均百万 Token 成本"
-  },
+      "provider": "供应商",
+      "model": "模型",
+      "cost": "成本",
+      "cacheHitRequests": "缓存触发请求数",
+      "cacheHitRate": "缓存命中率",
+      "cacheReadTokens": "缓存读取 Token 数",
+      "totalTokens": "总 Token 数",
+      "cacheCreationConsumedAmount": "缓存创建消耗金额",
+      "totalConsumedAmount": "总消耗金额",
+      "successRate": "成功率",
+      "avgResponseTime": "平均响应时间",
+      "avgTtfbMs": "平均 TTFB",
+      "avgTokensPerSecond": "平均输出速率",
+      "avgCostPerRequest": "平均单次请求成本",
+      "avgCostPerMillionTokens": "平均百万 Token 成本"
+    },
     "expandModelStats": "展开模型详情",
     "collapseModelStats": "收起模型详情",
     "states": {
@@ -1829,14 +1834,14 @@
           "descriptionEnabled": "启用后,此密钥在登录时将进入独立的个人用量页面。但不可修改自己密钥的供应商分组。",
           "descriptionDisabled": "关闭后,用户将无法进入个人独立用量页面 UI,而是进入受限的 Web UI。"
         },
-      "providerGroup": {
-        "label": "供应商分组",
-        "placeholder": "默认:default",
-        "selectHint": "选择此 Key 可使用的供应商分组",
-        "editHint": "已有密钥的分组不可修改",
-        "allGroups": "使用全部分组",
-        "noGroupHint": "default 分组包含所有未设置 groupTag 的供应商"
-      },
+        "providerGroup": {
+          "label": "供应商分组",
+          "placeholder": "默认:default",
+          "selectHint": "选择此 Key 可使用的供应商分组",
+          "editHint": "已有密钥的分组不可修改",
+          "allGroups": "使用全部分组",
+          "noGroupHint": "default 分组包含所有未设置 groupTag 的供应商"
+        },
         "cacheTtl": {
           "label": "Cache TTL 覆写",
           "description": "强制为包含 cache_control 的请求设置 Anthropic prompt cache TTL。",

+ 2 - 1
messages/zh-CN/provider-chain.json

@@ -19,7 +19,8 @@
   },
   "summary": {
     "singleSuccess": "{total} 个供应商,{healthy} 个健康 → {provider} ✓",
-    "sessionReuse": "会话复用 → {provider} ✓"
+    "sessionReuse": "会话复用 → {provider} ✓",
+    "originHint": "会话复用 - 最初通过 {method} 选择"
   },
   "description": {
     "noDecisionRecord": "无决策记录",

+ 14 - 15
messages/zh-TW/dashboard.json

@@ -340,7 +340,12 @@
         "sessionAge": "會話年齡",
         "reusedProvider": "複用的供應商",
         "executeRequest": "執行請求",
-        "cacheOptimizationHint": "會話複用通過在同一對話中保持供應商親和性來優化效能,減少選擇開銷並提高快取命中率。"
+        "cacheOptimizationHint": "會話複用通過在同一對話中保持供應商親和性來優化效能,減少選擇開銷並提高快取命中率。",
+        "originDecisionTitle": "原始選擇決策",
+        "originDecisionDesc": "此會話中供應商最初被選擇的原因",
+        "originDecisionLoading": "正在載入原始決策...",
+        "originDecisionUnavailable": "原始決策記錄不可用",
+        "originDecisionExpand": "查看原始選擇"
       }
     },
     "providerChain": {
@@ -1120,8 +1125,16 @@
       "highTooltip": "請求量充足,資料可靠。"
     },
     "actions": {
+      "refresh": "重新整理",
+      "refreshing": "重新整理中...",
+      "autoRefresh": "自動重新整理",
+      "stopAutoRefresh": "停止自動重新整理",
+      "viewDetails": "檢視詳情",
+      "testProvider": "測試供應商",
+      "retry": "重試",
       "probeNow": "立即探測",
       "probing": "探測中...",
+      "probeAll": "探測全部",
       "probeSuccess": "探測成功",
       "probeFailed": "探測失敗"
     },
@@ -1183,20 +1196,6 @@
       "greenCount": "成功請求",
       "redCount": "失敗請求"
     },
-    "actions": {
-      "refresh": "重新整理",
-      "refreshing": "重新整理中...",
-      "autoRefresh": "自動重新整理",
-      "stopAutoRefresh": "停止自動重新整理",
-      "viewDetails": "檢視詳情",
-      "testProvider": "測試供應商",
-      "retry": "重試",
-      "probeNow": "立即探測",
-      "probing": "探測中...",
-      "probeAll": "探測全部",
-      "probeSuccess": "探測成功",
-      "probeFailed": "探測失敗"
-    },
     "states": {
       "loading": "載入中...",
       "error": "載入失敗",

+ 2 - 1
messages/zh-TW/provider-chain.json

@@ -19,7 +19,8 @@
   },
   "summary": {
     "singleSuccess": "{total} 個供應商,{healthy} 個健康 → {provider} ✓",
-    "sessionReuse": "會話複用 → {provider} ✓"
+    "sessionReuse": "會話複用 → {provider} ✓",
+    "originHint": "會話複用 - 最初通過 {method} 選擇"
   },
   "description": {
     "noDecisionRecord": "無決策記錄",