Skip to content
Merged
19 changes: 18 additions & 1 deletion messages/en/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -748,6 +748,15 @@
"chunksCount": "Received {count} chunks ({format})",
"truncatedPreview": "Showing first {length} characters, copy to see full content",
"truncatedBrief": "Showing first {length} characters, click \"View Details\" for more",
"timeout": {
"label": "Timeout (seconds)",
"desc": "Max wait time for test request (5-120 sec)",
"geminiHint": ", Gemini Thinking models recommend 60+ sec"
},
"geminiAuthFallback": {
"warning": "Header auth failed, using URL parameter auth",
"desc": "Actual proxy forwarding only uses header auth, may cause request failures"
},
"copyFormat": {
"testResult": "Test result",
"message": "Message",
Expand Down Expand Up @@ -1225,6 +1234,15 @@
"desc": "Group tag. Only users whose providerGroup matches can use this provider. Example: set to \"premium\" to serve users with providerGroup=\"premium\" only"
}
},
"cacheTtl": {
"label": "Cache TTL Override",
"options": {
"inherit": "No override (follow client)",
"5m": "5 minutes",
"1h": "1 hour"
},
"desc": "Force prompt cache TTL; only affects requests with cache_control."
},
"context1m": {
"label": "1M Context Window",
"options": {
Expand Down Expand Up @@ -1598,7 +1616,6 @@
"leaderboard": "Leaderboard",
"title": "Provider Management"
},
"addProvider": "Add server",
"filter": {
"status": {
"all": "Any status",
Expand Down
19 changes: 18 additions & 1 deletion messages/ja/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -680,6 +680,15 @@
"chunksCount": "{count} チャンク受信 ({format})",
"truncatedPreview": "先頭 {length} 文字を表示、全文はコピーして確認",
"truncatedBrief": "先頭 {length} 文字を表示、全文は「詳細を見る」をクリック",
"timeout": {
"label": "タイムアウト(秒)",
"desc": "テストリクエストの最大待機時間(5〜120秒)",
"geminiHint": "、Gemini Thinkingモデルは60秒以上を推奨"
},
"geminiAuthFallback": {
"warning": "ヘッダー認証に失敗し、URLパラメータ認証を使用しました",
"desc": "実際のプロキシ転送はヘッダー認証のみを使用するため、リクエストが失敗する可能性があります"
},
"copyFormat": {
"testResult": "テスト結果",
"message": "メッセージ",
Expand Down Expand Up @@ -1120,6 +1129,15 @@
"desc": "グループタグ。ユーザーの providerGroup が一致する場合のみ利用可能。例: \"premium\" に設定すると providerGroup=\"premium\" のユーザーのみ対象"
}
},
"cacheTtl": {
"label": "キャッシュTTLオーバーライド",
"options": {
"inherit": "オーバーライドしない(クライアントに従う)",
"5m": "5分",
"1h": "1時間"
},
"desc": "プロンプトキャッシュのTTLを強制設定。cache_controlを含むリクエストにのみ適用されます。"
},
"context1m": {
"label": "1M コンテキストウィンドウ",
"options": {
Expand Down Expand Up @@ -1468,7 +1486,6 @@
"leaderboard": "プロバイダーランキング",
"title": "服务商管理"
},
"addProvider": "プロバイダーを追加",
"filter": {
"status": {
"all": "すべてのステータス",
Expand Down
19 changes: 18 additions & 1 deletion messages/ru/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -680,6 +680,15 @@
"chunksCount": "Получено {count} чанков ({format})",
"truncatedPreview": "Показаны первые {length} символов, скопируйте для просмотра полного текста",
"truncatedBrief": "Показаны первые {length} символов, нажмите «Подробнее» для полного просмотра",
"timeout": {
"label": "Таймаут (секунды)",
"desc": "Максимальное время ожидания тестового запроса (5-120 сек)",
"geminiHint": ", для моделей Gemini Thinking рекомендуется 60+ сек"
},
"geminiAuthFallback": {
"warning": "Ошибка аутентификации через заголовок, использована URL-аутентификация",
"desc": "Реальный прокси использует только аутентификацию через заголовок, что может вызвать ошибки"
},
"copyFormat": {
"testResult": "Результат теста",
"message": "Сообщение",
Expand Down Expand Up @@ -1120,6 +1129,15 @@
"desc": "Метка группы. Пользователь может использовать провайдера только если его providerGroup совпадает. Пример: значение \"premium\" — только для пользователей с providerGroup=\"premium\""
}
},
"cacheTtl": {
"label": "Переопределение Cache TTL",
"options": {
"inherit": "Не переопределять (следовать клиенту)",
"5m": "5 минут",
"1h": "1 час"
},
"desc": "Принудительно задать TTL кэша промптов; влияет только на запросы с cache_control."
},
"context1m": {
"label": "Контекстное окно 1M",
"options": {
Expand Down Expand Up @@ -1468,7 +1486,6 @@
"leaderboard": "Рейтинг",
"title": "Поставщики"
},
"addProvider": "Добавить",
"filter": {
"status": {
"all": "Все статусы",
Expand Down
18 changes: 18 additions & 0 deletions messages/zh-CN/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,15 @@
"chunksCount": "接收 {count} 个数据块 ({format})",
"truncatedPreview": "显示前 {length} 字符,完整内容请复制查看",
"truncatedBrief": "显示前 {length} 字符,完整内容请点击「查看详情」",
"timeout": {
"label": "超时时间(秒)",
"desc": "测试请求的最大等待时间(5-120 秒)",
"geminiHint": ",Gemini Thinking 模型建议 60 秒以上"
},
"geminiAuthFallback": {
"warning": "Header 认证失败,使用了 URL 参数认证",
"desc": "实际代理转发仅使用 Header 认证,可能导致请求失败"
},
"copyFormat": {
"testResult": "测试结果",
"message": "消息",
Expand Down Expand Up @@ -734,6 +743,15 @@
"desc": "供应商分组标签(支持多个,逗号分隔)。只有用户的 providerGroup 与此值匹配时,该用户才能使用此供应商。留空=对所有用户开放"
}
},
"cacheTtl": {
"label": "Cache TTL 覆写",
"options": {
"inherit": "不覆写(跟随客户端)",
"5m": "5 分钟",
"1h": "1 小时"
},
"desc": "强制设置 prompt cache TTL;仅影响包含 cache_control 的请求。"
},
"context1m": {
"label": "1M 上下文窗口",
"options": {
Expand Down
19 changes: 18 additions & 1 deletion messages/zh-TW/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -718,6 +718,15 @@
"chunksCount": "已接收 {count} 個區塊({format})",
"truncatedPreview": "顯示前 {length} 個字元,複製可查看完整內容",
"truncatedBrief": "顯示前 {length} 個字元,點擊「查看詳情」以查看更多",
"timeout": {
"label": "逾時時間(秒)",
"desc": "測試請求的最大等待時間(5-120 秒)",
"geminiHint": ",Gemini Thinking 模型建議 60 秒以上"
},
"geminiAuthFallback": {
"warning": "Header 認證失敗,使用了 URL 參數認證",
"desc": "實際代理轉發僅使用 Header 認證,可能導致請求失敗"
},
"copyFormat": {
"testResult": "測試結果",
"message": "訊息",
Expand Down Expand Up @@ -1120,6 +1129,15 @@
"desc": "分組標籤。僅供 providerGroup 與此值相符的用戶使用。例:設為「premium」表示僅供 providerGroup=\"premium\" 的用戶使用"
}
},
"cacheTtl": {
"label": "Cache TTL 覆寫",
"options": {
"inherit": "不覆寫(跟隨客戶端)",
"5m": "5 分鐘",
"1h": "1 小時"
},
"desc": "強制設定 prompt cache TTL;僅影響包含 cache_control 的請求。"
},
"context1m": {
"label": "1M 上下文視窗",
"options": {
Expand Down Expand Up @@ -1474,7 +1492,6 @@
"leaderboard": "供應商排行榜",
"title": "服务商管理"
},
"addProvider": "新增服務商",
"filter": {
"status": {
"all": "所有狀態",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,11 @@ export function UserManagementTable({
useEffect(() => {
if (!scrollResetKey) return;
parentRef.current?.scrollTo({ top: 0 });
rowVirtualizer.measure();
// Defer measurement to next frame to ensure DOM has updated
const rafId = requestAnimationFrame(() => {
rowVirtualizer.measure();
});
return () => cancelAnimationFrame(rafId);
}, [scrollResetKey, rowVirtualizer]);

const quickRenewTranslations = useMemo(() => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,14 +132,14 @@ export function AddRuleDialog() {
{t("errorRules.add")}
</Button>
</DialogTrigger>
<DialogContent className="max-w-2xl">
<form onSubmit={handleSubmit}>
<DialogHeader>
<DialogContent className="max-w-2xl max-h-[80vh] flex flex-col">
<form onSubmit={handleSubmit} className="flex flex-col flex-1 min-h-0">
<DialogHeader className="flex-shrink-0">
<DialogTitle>{t("errorRules.dialog.addTitle")}</DialogTitle>
<DialogDescription>{t("errorRules.dialog.addDescription")}</DialogDescription>
</DialogHeader>

<div className="grid gap-4 py-4">
<div className="grid gap-4 py-4 overflow-y-auto pr-2 flex-1">
<div className="grid gap-2">
<Label htmlFor="pattern">{t("errorRules.dialog.patternLabel")}</Label>
<Input
Expand Down Expand Up @@ -212,7 +212,7 @@ export function AddRuleDialog() {
)}
</div>

<DialogFooter>
<DialogFooter className="flex-shrink-0 pt-4">
<Button
type="button"
variant="outline"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,14 +140,14 @@ export function EditRuleDialog({ rule, open, onOpenChange }: EditRuleDialogProps

return (
<Dialog open={open} onOpenChange={onOpenChange}>
<DialogContent className="max-w-2xl">
<form onSubmit={handleSubmit}>
<DialogHeader>
<DialogContent className="max-w-2xl max-h-[80vh] flex flex-col">
<form onSubmit={handleSubmit} className="flex flex-col flex-1 min-h-0">
<DialogHeader className="flex-shrink-0">
<DialogTitle>{t("errorRules.dialog.editTitle")}</DialogTitle>
<DialogDescription>{t("errorRules.dialog.editDescription")}</DialogDescription>
</DialogHeader>

<div className="grid gap-4 py-4">
<div className="grid gap-4 py-4 overflow-y-auto pr-2 flex-1">
<div className="grid gap-2">
<Label htmlFor="edit-pattern">{t("errorRules.dialog.patternLabel")}</Label>
<Input
Expand Down Expand Up @@ -230,7 +230,7 @@ export function EditRuleDialog({ rule, open, onOpenChange }: EditRuleDialogProps
)}
</div>

<DialogFooter>
<DialogFooter className="flex-shrink-0 pt-4">
<Button
type="button"
variant="outline"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ export function AddProviderDialog({ enableMultiProviderTypes }: AddProviderDialo
<ServerCog className="h-4 w-4" /> {t("addProvider")}
</Button>
</DialogTrigger>
<DialogContent className="max-w-full sm:max-w-5xl lg:max-w-6xl max-h-[90vh] overflow-y-auto">
<DialogContent className="max-w-full sm:max-w-5xl lg:max-w-6xl max-h-[90vh] flex flex-col">
<FormErrorBoundary>
<ProviderForm
mode="create"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -313,8 +313,8 @@ export function ApiTestButton({

// 如果使用了 fallback 认证方式,显示警告
if (isSuccess && usedFallback) {
toast.warning("Header 认证失败,使用了 URL 参数认证", {
description: "实际代理转发仅使用 Header 认证,可能导致请求失败",
toast.warning(t("geminiAuthFallback.warning"), {
description: t("geminiAuthFallback.desc"),
duration: 6000,
});
}
Expand Down Expand Up @@ -473,7 +473,7 @@ export function ApiTestButton({
</div>

<div className="space-y-2">
<Label htmlFor="test-timeout">超时时间(秒)</Label>
<Label htmlFor="test-timeout">{t("timeout.label")}</Label>
<Input
id="test-timeout"
type="number"
Expand All @@ -490,8 +490,8 @@ export function ApiTestButton({
className="w-24"
/>
<div className="text-xs text-muted-foreground">
测试请求的最大等待时间(5-120 秒)
{apiFormat === "gemini" && ",Gemini Thinking 模型建议 60 秒以上"}
{t("timeout.desc")}
{apiFormat === "gemini" && t("timeout.geminiHint")}
</div>
</div>

Expand Down
Loading
Loading