diff --git a/web/i18next.config.js b/web/i18next.config.js index 40808629bc..fc4767ee6b 100644 --- a/web/i18next.config.js +++ b/web/i18next.config.js @@ -21,7 +21,7 @@ import { defineConfig } from 'i18next-cli'; /** @type {import('i18next-cli').I18nextToolkitConfig} */ export default defineConfig({ - locales: ['zh', 'en', 'fr', 'ru', 'ja', 'vi'], + locales: ['zh-CN', 'zh-TW', 'en', 'fr', 'ru', 'ja', 'vi'], extract: { input: ['src/**/*.{js,jsx,ts,tsx}'], ignore: ['src/i18n/**/*'], diff --git a/web/src/components/auth/LoginForm.jsx b/web/src/components/auth/LoginForm.jsx index 7e8c0ce017..db62f28a05 100644 --- a/web/src/components/auth/LoginForm.jsx +++ b/web/src/components/auth/LoginForm.jsx @@ -71,9 +71,9 @@ const LoginForm = () => { let navigate = useNavigate(); const { t } = useTranslation(); const githubButtonTextKeyByState = { - idle: '使用 GitHub 继续', - redirecting: '正在跳转 GitHub...', - timeout: '请求超时,请刷新页面后重新发起 GitHub 登录', + idle: t('使用 GitHub 继续'), + redirecting: t('正在跳转 GitHub...'), + timeout: t('请求超时,请刷新页面后重新发起 GitHub 登录'), }; const [inputs, setInputs] = useState({ username: '', @@ -110,7 +110,7 @@ const LoginForm = () => { const [githubButtonState, setGithubButtonState] = useState('idle'); const [githubButtonDisabled, setGithubButtonDisabled] = useState(false); const githubTimeoutRef = useRef(null); - const githubButtonText = t(githubButtonTextKeyByState[githubButtonState]); + const githubButtonText = githubButtonTextKeyByState[githubButtonState]; const [customOAuthLoading, setCustomOAuthLoading] = useState({}); const logo = getLogo(); @@ -184,7 +184,7 @@ const LoginForm = () => { const onSubmitWeChatVerificationCode = async () => { if (turnstileEnabled && turnstileToken === '') { - showInfo('请稍后几秒重试,Turnstile 正在检查用户环境!'); + showInfo(t('请稍后几秒重试,Turnstile 正在检查用户环境!')); return; } setWechatCodeSubmitLoading(true); @@ -199,13 +199,13 @@ const LoginForm = () => { setUserData(data); updateAPI(); navigate('/'); - showSuccess('登录成功!'); + showSuccess(t('登录成功!')); setShowWeChatLoginModal(false); } else { showError(message); } } catch (error) { - showError('登录失败,请重试'); + showError(t('登录失败,请重试')); } finally { setWechatCodeSubmitLoading(false); } @@ -221,7 +221,7 @@ const LoginForm = () => { return; } if (turnstileEnabled && turnstileToken === '') { - showInfo('请稍后几秒重试,Turnstile 正在检查用户环境!'); + showInfo(t('请稍后几秒重试,Turnstile 正在检查用户环境!')); return; } setSubmitted(true); @@ -247,11 +247,11 @@ const LoginForm = () => { userDispatch({ type: 'login', payload: data }); setUserData(data); updateAPI(); - showSuccess('登录成功!'); + showSuccess(t('登录成功!')); if (username === 'root' && password === '123456') { Modal.error({ - title: '您正在使用默认密码!', - content: '请立刻修改默认密码!', + title: t('您正在使用默认密码!'), + content: t('请立刻修改默认密码!'), centered: true, }); } @@ -260,10 +260,10 @@ const LoginForm = () => { showError(message); } } else { - showError('请输入用户名和密码!'); + showError(t('请输入用户名和密码!')); } } catch (error) { - showError('登录失败,请重试'); + showError(t('登录失败,请重试')); } finally { setLoginLoading(false); } @@ -297,7 +297,7 @@ const LoginForm = () => { if (success) { userDispatch({ type: 'login', payload: data }); localStorage.setItem('user', JSON.stringify(data)); - showSuccess('登录成功!'); + showSuccess(t('登录成功!')); setUserData(data); updateAPI(); navigate('/'); @@ -305,7 +305,7 @@ const LoginForm = () => { showError(message); } } catch (error) { - showError('登录失败,请重试'); + showError(t('登录失败,请重试')); } }; @@ -417,11 +417,11 @@ const LoginForm = () => { return; } if (!passkeySupported) { - showInfo('当前环境无法使用 Passkey 登录'); + showInfo(t('当前环境无法使用 Passkey 登录')); return; } if (!window.PublicKeyCredential) { - showInfo('当前浏览器不支持 Passkey'); + showInfo(t('当前浏览器不支持 Passkey')); return; } @@ -430,7 +430,7 @@ const LoginForm = () => { const beginRes = await API.post('/api/user/passkey/login/begin'); const { success, message, data } = beginRes.data; if (!success) { - showError(message || '无法发起 Passkey 登录'); + showError(message || t('无法发起 Passkey 登录')); return; } @@ -442,7 +442,7 @@ const LoginForm = () => { }); const payload = buildAssertionResult(assertion); if (!payload) { - showError('Passkey 验证失败,请重试'); + showError(t('Passkey 验证失败,请重试')); return; } @@ -455,16 +455,16 @@ const LoginForm = () => { userDispatch({ type: 'login', payload: finish.data }); setUserData(finish.data); updateAPI(); - showSuccess('登录成功!'); + showSuccess(t('登录成功!')); navigate('/console'); } else { - showError(finish.message || 'Passkey 登录失败,请重试'); + showError(finish.message || t('Passkey 登录失败,请重试')); } } catch (error) { if (error?.name === 'AbortError') { - showInfo('已取消 Passkey 登录'); + showInfo(t('已取消 Passkey 登录')); } else { - showError('Passkey 登录失败,请重试'); + showError(t('Passkey 登录失败,请重试')); } } finally { setPasskeyLoading(false); @@ -490,7 +490,7 @@ const LoginForm = () => { userDispatch({ type: 'login', payload: data }); setUserData(data); updateAPI(); - showSuccess('登录成功!'); + showSuccess(t('登录成功!')); navigate('/console'); }; @@ -885,7 +885,11 @@ const LoginForm = () => { }} >
- 微信二维码 + {t('微信二维码')}
@@ -928,7 +932,7 @@ const LoginForm = () => { />
- 两步验证 + {t('两步验证')} } visible={showTwoFA} @@ -958,8 +962,7 @@ const LoginForm = () => { style={{ top: '50%', left: '-120px' }} />
- {showEmailLogin || - !hasOAuthLoginOptions + {showEmailLogin || !hasOAuthLoginOptions ? renderEmailLoginForm() : renderOAuthOptions()} {renderWeChatLoginModal()} diff --git a/web/src/components/auth/OAuth2Callback.jsx b/web/src/components/auth/OAuth2Callback.jsx index c0c6418a13..9bbe52ff47 100644 --- a/web/src/components/auth/OAuth2Callback.jsx +++ b/web/src/components/auth/OAuth2Callback.jsx @@ -35,7 +35,7 @@ const OAuth2Callback = (props) => { const [searchParams] = useSearchParams(); const [, userDispatch] = useContext(UserContext); const navigate = useNavigate(); - + // 防止 React 18 Strict Mode 下重复执行 const hasExecuted = useRef(false); diff --git a/web/src/components/auth/RegisterForm.jsx b/web/src/components/auth/RegisterForm.jsx index 0a755b1944..5a3bb08f05 100644 --- a/web/src/components/auth/RegisterForm.jsx +++ b/web/src/components/auth/RegisterForm.jsx @@ -69,9 +69,9 @@ const RegisterForm = () => { let navigate = useNavigate(); const { t } = useTranslation(); const githubButtonTextKeyByState = { - idle: '使用 GitHub 继续', - redirecting: '正在跳转 GitHub...', - timeout: '请求超时,请刷新页面后重新发起 GitHub 登录', + idle: t('使用 GitHub 继续'), + redirecting: t('正在跳转 GitHub...'), + timeout: t('请求超时,请刷新页面后重新发起 GitHub 登录'), }; const [inputs, setInputs] = useState({ username: '', @@ -109,7 +109,7 @@ const RegisterForm = () => { const [githubButtonState, setGithubButtonState] = useState('idle'); const [githubButtonDisabled, setGithubButtonDisabled] = useState(false); const githubTimeoutRef = useRef(null); - const githubButtonText = t(githubButtonTextKeyByState[githubButtonState]); + const githubButtonText = githubButtonTextKeyByState[githubButtonState]; const logo = getLogo(); const systemName = getSystemName(); @@ -184,7 +184,7 @@ const RegisterForm = () => { const onSubmitWeChatVerificationCode = async () => { if (turnstileEnabled && turnstileToken === '') { - showInfo('请稍后几秒重试,Turnstile 正在检查用户环境!'); + showInfo(t('请稍后几秒重试,Turnstile 正在检查用户环境!')); return; } setWechatCodeSubmitLoading(true); @@ -199,13 +199,13 @@ const RegisterForm = () => { setUserData(data); updateAPI(); navigate('/'); - showSuccess('登录成功!'); + showSuccess(t('登录成功!')); setShowWeChatLoginModal(false); } else { showError(message); } } catch (error) { - showError('登录失败,请重试'); + showError(t('登录失败,请重试')); } finally { setWechatCodeSubmitLoading(false); } @@ -217,16 +217,16 @@ const RegisterForm = () => { async function handleSubmit(e) { if (password.length < 8) { - showInfo('密码长度不得小于 8 位!'); + showInfo(t('密码长度不得小于 8 位!')); return; } if (password !== password2) { - showInfo('两次输入的密码不一致'); + showInfo(t('两次输入的密码不一致')); return; } if (username && password) { if (turnstileEnabled && turnstileToken === '') { - showInfo('请稍后几秒重试,Turnstile 正在检查用户环境!'); + showInfo(t('请稍后几秒重试,Turnstile 正在检查用户环境!')); return; } setRegisterLoading(true); @@ -242,12 +242,12 @@ const RegisterForm = () => { const { success, message } = res.data; if (success) { navigate('/login'); - showSuccess('注册成功!'); + showSuccess(t('注册成功!')); } else { showError(message); } } catch (error) { - showError('注册失败,请重试'); + showError(t('注册失败,请重试')); } finally { setRegisterLoading(false); } @@ -257,7 +257,7 @@ const RegisterForm = () => { const sendVerificationCode = async () => { if (inputs.email === '') return; if (turnstileEnabled && turnstileToken === '') { - showInfo('请稍后几秒重试,Turnstile 正在检查用户环境!'); + showInfo(t('请稍后几秒重试,Turnstile 正在检查用户环境!')); return; } setVerificationCodeLoading(true); @@ -267,13 +267,13 @@ const RegisterForm = () => { ); const { success, message } = res.data; if (success) { - showSuccess('验证码发送成功,请检查你的邮箱!'); + showSuccess(t('验证码发送成功,请检查你的邮箱!')); setDisableButton(true); // 发送成功后禁用按钮,开始倒计时 } else { showError(message); } } catch (error) { - showError('发送验证码失败,请重试'); + showError(t('发送验证码失败,请重试')); } finally { setVerificationCodeLoading(false); } @@ -379,7 +379,7 @@ const RegisterForm = () => { if (success) { userDispatch({ type: 'login', payload: data }); localStorage.setItem('user', JSON.stringify(data)); - showSuccess('登录成功!'); + showSuccess(t('登录成功!')); setUserData(data); updateAPI(); navigate('/'); @@ -387,7 +387,7 @@ const RegisterForm = () => { showError(message); } } catch (error) { - showError('登录失败,请重试'); + showError(t('登录失败,请重试')); } }; @@ -745,7 +745,11 @@ const RegisterForm = () => { }} >
- 微信二维码 + {t('微信二维码')}
@@ -781,8 +785,7 @@ const RegisterForm = () => { style={{ top: '50%', left: '-120px' }} />
- {showEmailRegister || - !hasOAuthRegisterOptions + {showEmailRegister || !hasOAuthRegisterOptions ? renderEmailRegisterForm() : renderOAuthOptions()} {renderWeChatLoginModal()} diff --git a/web/src/components/auth/TwoFAVerification.jsx b/web/src/components/auth/TwoFAVerification.jsx index 626de74363..44f437ab5c 100644 --- a/web/src/components/auth/TwoFAVerification.jsx +++ b/web/src/components/auth/TwoFAVerification.jsx @@ -17,6 +17,7 @@ along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ import { API, showError, showSuccess } from '../../helpers'; +import { useTranslation } from 'react-i18next'; import { Button, Card, @@ -30,21 +31,22 @@ import React, { useState } from 'react'; const { Title, Text, Paragraph } = Typography; const TwoFAVerification = ({ onSuccess, onBack, isModal = false }) => { + const { t } = useTranslation(); const [loading, setLoading] = useState(false); const [useBackupCode, setUseBackupCode] = useState(false); const [verificationCode, setVerificationCode] = useState(''); const handleSubmit = async () => { if (!verificationCode) { - showError('请输入验证码'); + showError(t('请输入验证码')); return; } // Validate code format if (useBackupCode && verificationCode.length !== 8) { - showError('备用码必须是8位'); + showError(t('备用码必须是8位')); return; } else if (!useBackupCode && !/^\d{6}$/.test(verificationCode)) { - showError('验证码必须是6位数字'); + showError(t('验证码必须是6位数字')); return; } @@ -55,7 +57,7 @@ const TwoFAVerification = ({ onSuccess, onBack, isModal = false }) => { }); if (res.data.success) { - showSuccess('登录成功'); + showSuccess(t('登录成功')); // 保存用户信息到本地存储 localStorage.setItem('user', JSON.stringify(res.data.data)); if (onSuccess) { @@ -65,7 +67,7 @@ const TwoFAVerification = ({ onSuccess, onBack, isModal = false }) => { showError(res.data.message); } } catch (error) { - showError('验证失败,请重试'); + showError(t('验证失败,请重试')); } finally { setLoading(false); } @@ -81,14 +83,16 @@ const TwoFAVerification = ({ onSuccess, onBack, isModal = false }) => { return (
- 请输入认证器应用显示的验证码完成登录 + {t('请输入认证器应用显示的验证码完成登录')}
{ size='large' style={{ marginBottom: 16 }} > - 验证并登录 + {t('验证并登录')} @@ -121,7 +125,7 @@ const TwoFAVerification = ({ onSuccess, onBack, isModal = false }) => { }} style={{ marginRight: 16, color: '#1890ff', padding: 0 }} > - {useBackupCode ? '使用认证器验证码' : '使用备用码'} + {useBackupCode ? t('使用认证器验证码') : t('使用备用码')} {onBack && ( @@ -131,19 +135,20 @@ const TwoFAVerification = ({ onSuccess, onBack, isModal = false }) => { onClick={onBack} style={{ color: '#1890ff', padding: 0 }} > - 返回登录 + {t('返回登录')} )}
- 提示: + {t('提示:')}
- • 验证码每30秒更新一次 + {t('• 验证码每30秒更新一次')}
- • 如果无法获取验证码,请使用备用码 -
• 每个备用码只能使用一次 + {t('• 如果无法获取验证码,请使用备用码')} +
+ {t('• 每个备用码只能使用一次')}
@@ -161,17 +166,19 @@ const TwoFAVerification = ({ onSuccess, onBack, isModal = false }) => { >
- 两步验证 + {t('两步验证')} - 请输入认证器应用显示的验证码完成登录 + {t('请输入认证器应用显示的验证码完成登录')}
{ size='large' style={{ marginBottom: 16 }} > - 验证并登录 + {t('验证并登录')} @@ -204,7 +211,7 @@ const TwoFAVerification = ({ onSuccess, onBack, isModal = false }) => { }} style={{ marginRight: 16, color: '#1890ff', padding: 0 }} > - {useBackupCode ? '使用认证器验证码' : '使用备用码'} + {useBackupCode ? t('使用认证器验证码') : t('使用备用码')} {onBack && ( @@ -214,7 +221,7 @@ const TwoFAVerification = ({ onSuccess, onBack, isModal = false }) => { onClick={onBack} style={{ color: '#1890ff', padding: 0 }} > - 返回登录 + {t('返回登录')} )}
@@ -228,12 +235,13 @@ const TwoFAVerification = ({ onSuccess, onBack, isModal = false }) => { }} > - 提示: + {t('提示:')} +
+ {t('• 验证码每30秒更新一次')}
- • 验证码每30秒更新一次 + {t('• 如果无法获取验证码,请使用备用码')}
- • 如果无法获取验证码,请使用备用码 -
• 每个备用码只能使用一次 + {t('• 每个备用码只能使用一次')}
diff --git a/web/src/components/common/modals/RiskAcknowledgementModal.jsx b/web/src/components/common/modals/RiskAcknowledgementModal.jsx index 54aa62eaac..e7ab8e940a 100644 --- a/web/src/components/common/modals/RiskAcknowledgementModal.jsx +++ b/web/src/components/common/modals/RiskAcknowledgementModal.jsx @@ -81,7 +81,9 @@ const RiskAcknowledgementModal = React.memo(function RiskAcknowledgementModal({ const allChecked = useMemo(() => { if (checklist.length === 0) return true; - return checkedItems.length === checklist.length && checkedItems.every(Boolean); + return ( + checkedItems.length === checklist.length && checkedItems.every(Boolean) + ); }, [checkedItems, checklist.length]); const typedMatched = useMemo(() => { @@ -134,7 +136,6 @@ const RiskAcknowledgementModal = React.memo(function RiskAcknowledgementModal({ } >
- {detailItems.length > 0 ? ( diff --git a/web/src/components/common/ui/CardPro.jsx b/web/src/components/common/ui/CardPro.jsx index 2c95f97c75..720bb47b20 100644 --- a/web/src/components/common/ui/CardPro.jsx +++ b/web/src/components/common/ui/CardPro.jsx @@ -22,6 +22,7 @@ import { Card, Divider, Typography, Button } from '@douyinfe/semi-ui'; import PropTypes from 'prop-types'; import { useIsMobile } from '../../../hooks/common/useIsMobile'; import { IconEyeOpened, IconEyeClosed } from '@douyinfe/semi-icons'; +import { useTranslation } from 'react-i18next'; const { Text } = Typography; @@ -65,6 +66,7 @@ const CardPro = ({ const [showMobileActions, setShowMobileActions] = useState(false); const toggleMobileActions = () => { + const { t } = useTranslation(); setShowMobileActions(!showMobileActions); }; diff --git a/web/src/components/common/ui/ChannelKeyDisplay.jsx b/web/src/components/common/ui/ChannelKeyDisplay.jsx index 79aa3eec70..7a7328a57d 100644 --- a/web/src/components/common/ui/ChannelKeyDisplay.jsx +++ b/web/src/components/common/ui/ChannelKeyDisplay.jsx @@ -19,16 +19,16 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { useTranslation } from 'react-i18next'; +import { t as i18nT } from '../../../helpers/i18n'; import { Card, Button, Typography, Tag } from '@douyinfe/semi-ui'; import { copy, showSuccess } from '../../../helpers'; /** * 解析密钥数据,支持多种格式 * @param {string} keyData - 密钥数据 - * @param {Function} t - 翻译函数 * @returns {Array} 解析后的密钥数组 */ -const parseChannelKeys = (keyData, t) => { +const parseChannelKeys = (keyData) => { if (!keyData) return []; const trimmed = keyData.trim(); @@ -43,7 +43,7 @@ const parseChannelKeys = (keyData, t) => { content: typeof item === 'string' ? item : JSON.stringify(item, null, 2), type: typeof item === 'string' ? 'text' : 'json', - label: `${t('密钥')} ${index + 1}`, + label: `${i18nT('密钥')} ${index + 1}`, })); } } catch (e) { @@ -59,7 +59,7 @@ const parseChannelKeys = (keyData, t) => { id: index, content: line.trim(), type: 'text', - label: `${t('密钥')} ${index + 1}`, + label: `${i18nT('密钥')} ${index + 1}`, })); } @@ -69,7 +69,7 @@ const parseChannelKeys = (keyData, t) => { id: 0, content: trimmed, type: trimmed.startsWith('{') ? 'json' : 'text', - label: t('密钥'), + label: i18nT('密钥'), }, ]; }; @@ -92,7 +92,7 @@ const ChannelKeyDisplay = ({ }) => { const { t } = useTranslation(); - const parsedKeys = parseChannelKeys(keyData, t); + const parsedKeys = parseChannelKeys(keyData); const isMultipleKeys = parsedKeys.length > 1; const handleCopyAll = () => { diff --git a/web/src/components/common/ui/CompactModeToggle.jsx b/web/src/components/common/ui/CompactModeToggle.jsx index 40da0abc00..b9cb3ea749 100644 --- a/web/src/components/common/ui/CompactModeToggle.jsx +++ b/web/src/components/common/ui/CompactModeToggle.jsx @@ -21,6 +21,7 @@ import React from 'react'; import { Button } from '@douyinfe/semi-ui'; import PropTypes from 'prop-types'; import { useIsMobile } from '../../../hooks/common/useIsMobile'; +import { useTranslation } from 'react-i18next'; /** * 紧凑模式切换按钮组件 @@ -30,12 +31,12 @@ import { useIsMobile } from '../../../hooks/common/useIsMobile'; const CompactModeToggle = ({ compactMode, setCompactMode, - t, size = 'small', type = 'tertiary', className = '', ...props }) => { + const { t } = useTranslation(); const isMobile = useIsMobile(); // 在移动端隐藏紧凑列表切换按钮 diff --git a/web/src/components/common/ui/SelectableButtonGroup.jsx b/web/src/components/common/ui/SelectableButtonGroup.jsx index 3fe249084e..186e90f87a 100644 --- a/web/src/components/common/ui/SelectableButtonGroup.jsx +++ b/web/src/components/common/ui/SelectableButtonGroup.jsx @@ -32,6 +32,7 @@ import { Tooltip, } from '@douyinfe/semi-ui'; import { IconChevronDown, IconChevronUp } from '@douyinfe/semi-icons'; +import { useTranslation } from 'react-i18next'; /** * 通用可选择按钮组组件 @@ -64,6 +65,7 @@ const SelectableButtonGroup = ({ const [containerRef, containerWidth] = useContainerWidth(); const ConditionalTooltipText = ({ text }) => { + const { t } = useTranslation(); const textRef = useRef(null); const [isOverflowing, setIsOverflowing] = useState(false); diff --git a/web/src/components/dashboard/AnnouncementsPanel.jsx b/web/src/components/dashboard/AnnouncementsPanel.jsx index c62850b3b8..af3fa083f5 100644 --- a/web/src/components/dashboard/AnnouncementsPanel.jsx +++ b/web/src/components/dashboard/AnnouncementsPanel.jsx @@ -26,14 +26,15 @@ import { IllustrationConstructionDark, } from '@douyinfe/semi-illustrations'; import ScrollableContainer from '../common/ui/ScrollableContainer'; +import { useTranslation } from 'react-i18next'; const AnnouncementsPanel = ({ announcementData, announcementLegendData, CARD_PROPS, ILLUSTRATION_SIZE, - t, }) => { + const { t } = useTranslation(); return ( { + const { t } = useTranslation(); return ( { + const { t } = useTranslation(); return ( { + const { t } = useTranslation(); return ( { + const { t } = useTranslation(); return ( { // ========== Context ========== + const { t } = useTranslation(); const [userState, userDispatch] = useContext(UserContext); const [statusState, statusDispatch] = useContext(StatusContext); @@ -70,7 +72,7 @@ const Dashboard = () => { dashboardData.setPieData, dashboardData.setLineData, dashboardData.setModelColors, - dashboardData.t, + t, ); // ========== 统计数据 ========== @@ -78,11 +80,11 @@ const Dashboard = () => { userState, dashboardData.consumeQuota, dashboardData.consumeTokens, - dashboardData.times, - dashboardData.trendData, + times, + trendData, dashboardData.performanceMetrics, dashboardData.navigate, - dashboardData.t, + t, ); // ========== 数据处理 ========== @@ -129,7 +131,7 @@ const Dashboard = () => { ([status, info]) => ({ status: Number(status), color: info.color, - label: dashboardData.t(info.label), + label: t(info.label), }), ); @@ -146,7 +148,7 @@ const Dashboard = () => { showSearchModal={dashboardData.showSearchModal} refresh={handleRefresh} loading={dashboardData.loading} - t={dashboardData.t} + t={t} /> { isAdminUser={dashboardData.isAdminUser} inputs={dashboardData.inputs} dataExportDefaultTime={dashboardData.dataExportDefaultTime} - timeOptions={dashboardData.timeOptions} + timeOptions={timeOptions} handleInputChange={dashboardData.handleInputChange} - t={dashboardData.t} + t={t} /> { CHART_CONFIG={CHART_CONFIG} FLEX_CENTER_GAP2={FLEX_CENTER_GAP2} hasApiInfoPanel={dashboardData.hasApiInfoPanel} - t={dashboardData.t} + t={t} /> {dashboardData.hasApiInfoPanel && ( handleCopyUrl(url, dashboardData.t)} + handleCopyUrl={(url) => handleCopyUrl(url)} handleSpeedTest={handleSpeedTest} CARD_PROPS={CARD_PROPS} FLEX_CENTER_GAP2={FLEX_CENTER_GAP2} ILLUSTRATION_SIZE={ILLUSTRATION_SIZE} - t={dashboardData.t} + t={t} /> )}
@@ -214,12 +216,12 @@ const Dashboard = () => { announcementLegendData={ANNOUNCEMENT_LEGEND_DATA.map( (item) => ({ ...item, - label: dashboardData.t(item.label), + label: t(item.label), }), )} CARD_PROPS={CARD_PROPS} ILLUSTRATION_SIZE={ILLUSTRATION_SIZE} - t={dashboardData.t} + t={t} /> )} @@ -230,7 +232,7 @@ const Dashboard = () => { CARD_PROPS={CARD_PROPS} FLEX_CENTER_GAP2={FLEX_CENTER_GAP2} ILLUSTRATION_SIZE={ILLUSTRATION_SIZE} - t={dashboardData.t} + t={t} /> )} @@ -247,18 +249,12 @@ const Dashboard = () => { renderMonitorList( monitors, (status) => getUptimeStatusColor(status, UPTIME_STATUS_MAP), - (status) => - getUptimeStatusText( - status, - UPTIME_STATUS_MAP, - dashboardData.t, - ), - dashboardData.t, + (status) => getUptimeStatusText(status, UPTIME_STATUS_MAP), ) } CARD_PROPS={CARD_PROPS} ILLUSTRATION_SIZE={ILLUSTRATION_SIZE} - t={dashboardData.t} + t={t} /> )} diff --git a/web/src/components/dashboard/modals/SearchModal.jsx b/web/src/components/dashboard/modals/SearchModal.jsx index f619831dcc..3c74d66f83 100644 --- a/web/src/components/dashboard/modals/SearchModal.jsx +++ b/web/src/components/dashboard/modals/SearchModal.jsx @@ -19,6 +19,7 @@ For commercial licensing, please contact support@quantumnous.com import React, { useRef } from 'react'; import { Modal, Form } from '@douyinfe/semi-ui'; +import { useTranslation } from 'react-i18next'; const SearchModal = ({ searchModalVisible, @@ -30,8 +31,8 @@ const SearchModal = ({ dataExportDefaultTime, timeOptions, handleInputChange, - t, }) => { + const { t } = useTranslation(); const formRef = useRef(); const FORM_FIELD_PROPS = { diff --git a/web/src/components/layout/SiderBar.jsx b/web/src/components/layout/SiderBar.jsx index 34971c3974..41757d46f9 100644 --- a/web/src/components/layout/SiderBar.jsx +++ b/web/src/components/layout/SiderBar.jsx @@ -266,7 +266,7 @@ const SiderBar = ({ onNavigate = () => {} }) => { updateRouterMapWithChats(chats); } } catch (e) { - showError('聊天数据解析失败'); + showError(t('聊天数据解析失败')); } } }, []); diff --git a/web/src/components/layout/headerbar/HeaderLogo.jsx b/web/src/components/layout/headerbar/HeaderLogo.jsx index 73be0516b2..6a77372aaf 100644 --- a/web/src/components/layout/headerbar/HeaderLogo.jsx +++ b/web/src/components/layout/headerbar/HeaderLogo.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; +import { useTranslation } from 'react-i18next'; import { Link } from 'react-router-dom'; import { Typography, Tag } from '@douyinfe/semi-ui'; import SkeletonWrapper from '../components/SkeletonWrapper'; @@ -31,8 +32,8 @@ const HeaderLogo = ({ systemName, isSelfUseMode, isDemoSiteMode, - t, }) => { + const { t } = useTranslation(); if (isMobile && isConsoleRoute) { return null; } diff --git a/web/src/components/layout/headerbar/LanguageSelector.jsx b/web/src/components/layout/headerbar/LanguageSelector.jsx index ede8b5a4aa..206ad1bbc9 100644 --- a/web/src/components/layout/headerbar/LanguageSelector.jsx +++ b/web/src/components/layout/headerbar/LanguageSelector.jsx @@ -18,10 +18,12 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; +import { useTranslation } from 'react-i18next'; import { Button, Dropdown } from '@douyinfe/semi-ui'; import { Languages } from 'lucide-react'; -const LanguageSelector = ({ currentLang, onLanguageChange, t }) => { +const LanguageSelector = ({ currentLang, onLanguageChange }) => { + const { t } = useTranslation(); return ( { onClick={() => onLanguageChange('zh-TW')} className={`!px-3 !py-1.5 !text-sm !text-semi-color-text-0 dark:!text-gray-200 ${currentLang === 'zh-TW' ? '!bg-semi-color-primary-light-default dark:!bg-blue-600 !font-semibold' : 'hover:!bg-semi-color-fill-1 dark:hover:!bg-gray-600'}`} > - 繁體中文 - {' '} + onLanguageChange('en')} className={`!px-3 !py-1.5 !text-sm !text-semi-color-text-0 dark:!text-gray-200 ${currentLang === 'en' ? '!bg-semi-color-primary-light-default dark:!bg-blue-600 !font-semibold' : 'hover:!bg-semi-color-fill-1 dark:hover:!bg-gray-600'}`} > diff --git a/web/src/components/layout/headerbar/MobileMenuButton.jsx b/web/src/components/layout/headerbar/MobileMenuButton.jsx index 7cf7e4aa98..13b7995470 100644 --- a/web/src/components/layout/headerbar/MobileMenuButton.jsx +++ b/web/src/components/layout/headerbar/MobileMenuButton.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; +import { useTranslation } from 'react-i18next'; import { Button } from '@douyinfe/semi-ui'; import { IconClose, IconMenu } from '@douyinfe/semi-icons'; @@ -27,8 +28,8 @@ const MobileMenuButton = ({ drawerOpen, collapsed, onToggle, - t, }) => { + const { t } = useTranslation(); if (!isConsoleRoute || !isMobile) { return null; } diff --git a/web/src/components/layout/headerbar/NotificationButton.jsx b/web/src/components/layout/headerbar/NotificationButton.jsx index 54ab9dd94d..c75ddd4b10 100644 --- a/web/src/components/layout/headerbar/NotificationButton.jsx +++ b/web/src/components/layout/headerbar/NotificationButton.jsx @@ -18,10 +18,12 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; +import { useTranslation } from 'react-i18next'; import { Button, Badge } from '@douyinfe/semi-ui'; import { Bell } from 'lucide-react'; -const NotificationButton = ({ unreadCount, onNoticeOpen, t }) => { +const NotificationButton = ({ unreadCount, onNoticeOpen }) => { + const { t } = useTranslation(); const buttonProps = { icon: , 'aria-label': t('系统公告'), diff --git a/web/src/components/layout/headerbar/ThemeToggle.jsx b/web/src/components/layout/headerbar/ThemeToggle.jsx index 45e7918d4b..890644563c 100644 --- a/web/src/components/layout/headerbar/ThemeToggle.jsx +++ b/web/src/components/layout/headerbar/ThemeToggle.jsx @@ -18,11 +18,13 @@ For commercial licensing, please contact support@quantumnous.com */ import React, { useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; import { Button, Dropdown } from '@douyinfe/semi-ui'; import { Sun, Moon, Monitor } from 'lucide-react'; import { useActualTheme } from '../../../context/Theme'; -const ThemeToggle = ({ theme, onThemeToggle, t }) => { +const ThemeToggle = ({ theme, onThemeToggle }) => { + const { t } = useTranslation(); const actualTheme = useActualTheme(); const themeOptions = useMemo( diff --git a/web/src/components/layout/headerbar/UserArea.jsx b/web/src/components/layout/headerbar/UserArea.jsx index 9fc011da18..72e5d003b5 100644 --- a/web/src/components/layout/headerbar/UserArea.jsx +++ b/web/src/components/layout/headerbar/UserArea.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React, { useRef } from 'react'; +import { useTranslation } from 'react-i18next'; import { Link } from 'react-router-dom'; import { Avatar, Button, Dropdown, Typography } from '@douyinfe/semi-ui'; import { ChevronDown } from 'lucide-react'; @@ -37,8 +38,8 @@ const UserArea = ({ isSelfUseMode, logout, navigate, - t, }) => { + const { t } = useTranslation(); const dropdownRef = useRef(null); if (isLoading) { return ( diff --git a/web/src/components/layout/headerbar/index.jsx b/web/src/components/layout/headerbar/index.jsx index 81b51d7fe4..031fb5ebec 100644 --- a/web/src/components/layout/headerbar/index.jsx +++ b/web/src/components/layout/headerbar/index.jsx @@ -26,8 +26,10 @@ import MobileMenuButton from './MobileMenuButton'; import HeaderLogo from './HeaderLogo'; import Navigation from './Navigation'; import ActionButtons from './ActionButtons'; +import { useTranslation } from 'react-i18next'; const HeaderBar = ({ onMobileMenuToggle, drawerOpen }) => { + const { t } = useTranslation(); const { userState, statusState, @@ -51,7 +53,6 @@ const HeaderBar = ({ onMobileMenuToggle, drawerOpen }) => { handleThemeToggle, handleMobileMenuToggle, navigate, - t, } = useHeaderBar({ onMobileMenuToggle, drawerOpen }); const { @@ -62,7 +63,7 @@ const HeaderBar = ({ onMobileMenuToggle, drawerOpen }) => { getUnreadKeys, } = useNotifications(statusState); - const { mainNavLinks } = useNavigation(t, docsLink, headerNavModules); + const { mainNavLinks } = useNavigation(docsLink, headerNavModules); return (
diff --git a/web/src/components/settings/ChannelSelectorModal.jsx b/web/src/components/settings/ChannelSelectorModal.jsx index 7864262d5a..fc70c93186 100644 --- a/web/src/components/settings/ChannelSelectorModal.jsx +++ b/web/src/components/settings/ChannelSelectorModal.jsx @@ -23,6 +23,7 @@ import React, { forwardRef, useImperativeHandle, } from 'react'; +import { useTranslation } from 'react-i18next'; import { useIsMobile } from '../../hooks/common/useIsMobile'; import { Modal, @@ -53,10 +54,10 @@ const ChannelSelectorModal = forwardRef( setSelectedChannelIds, channelEndpoints, updateChannelEndpoint, - t, }, ref, ) => { + const { t } = useTranslation(); const [searchText, setSearchText] = useState(''); const [currentPage, setCurrentPage] = useState(1); const [pageSize, setPageSize] = useState(10); diff --git a/web/src/components/settings/ChatsSetting.jsx b/web/src/components/settings/ChatsSetting.jsx index 9ead13525c..9b6f93e9ca 100644 --- a/web/src/components/settings/ChatsSetting.jsx +++ b/web/src/components/settings/ChatsSetting.jsx @@ -21,8 +21,10 @@ import React, { useEffect, useState } from 'react'; import { Card, Spin } from '@douyinfe/semi-ui'; import SettingsChats from '../../pages/Setting/Chat/SettingsChats'; import { API, showError, toBoolean } from '../../helpers'; +import { useTranslation } from 'react-i18next'; const ChatsSetting = () => { + const { t } = useTranslation(); let [inputs, setInputs] = useState({ /* 聊天设置 */ Chats: '[]', @@ -57,7 +59,7 @@ const ChatsSetting = () => { setLoading(true); await getOptions(); } catch (error) { - showError('刷新失败'); + showError(t('刷新失败')); } finally { setLoading(false); } diff --git a/web/src/components/settings/CustomOAuthSetting.jsx b/web/src/components/settings/CustomOAuthSetting.jsx index 0912160bee..9fe2cce5fc 100644 --- a/web/src/components/settings/CustomOAuthSetting.jsx +++ b/web/src/components/settings/CustomOAuthSetting.jsx @@ -40,7 +40,12 @@ import { IconDelete, IconRefresh, } from '@douyinfe/semi-icons'; -import { API, showError, showSuccess, getOAuthProviderIcon } from '../../helpers'; +import { + API, + showError, + showSuccess, + getOAuthProviderIcon, +} from '../../helpers'; import { useTranslation } from 'react-i18next'; const { Text } = Typography; @@ -185,8 +190,10 @@ const ACCESS_POLICY_TEMPLATES = { }; const ACCESS_DENIED_TEMPLATES = { - level_hint: '需要等级 {{required}},你当前等级 {{current}}(字段:{{field}})', - org_hint: '仅限指定组织或角色访问。组织={{current.org}},角色={{current.roles}}', + level_hint: + '需要等级 {{required}},你当前等级 {{current}}(字段:{{field}})', + org_hint: + '仅限指定组织或角色访问。组织={{current.org}},角色={{current.roles}}', }; const CustomOAuthSetting = ({ serverAddress }) => { @@ -219,7 +226,8 @@ const CustomOAuthSetting = ({ serverAddress }) => { const normalizeBaseUrl = (url) => (url || '').trim().replace(/\/+$/, ''); const inferBaseUrlFromProvider = (provider) => { - const endpoint = provider?.authorization_endpoint || provider?.token_endpoint; + const endpoint = + provider?.authorization_endpoint || provider?.token_endpoint; if (!endpoint) return ''; try { const url = new URL(endpoint); @@ -315,7 +323,7 @@ const CustomOAuthSetting = ({ serverAddress }) => { 'token_endpoint', 'user_info_endpoint', ]; - + if (!editingProvider) { requiredFields.push('client_secret'); } @@ -328,15 +336,25 @@ const CustomOAuthSetting = ({ serverAddress }) => { } // Validate endpoint URLs must be full URLs - const endpointFields = ['authorization_endpoint', 'token_endpoint', 'user_info_endpoint']; + const endpointFields = [ + 'authorization_endpoint', + 'token_endpoint', + 'user_info_endpoint', + ]; for (const field of endpointFields) { const value = currentValues[field]; - if (value && !value.startsWith('http://') && !value.startsWith('https://')) { + if ( + value && + !value.startsWith('http://') && + !value.startsWith('https://') + ) { // Check if user selected a preset but forgot to fill issuer URL if (selectedPreset && !baseUrl) { showError(t('请先填写 Issuer URL,以自动生成完整的端点 URL')); } else { - showError(t('端点 URL 必须是完整地址(以 http:// 或 https:// 开头)')); + showError( + t('端点 URL 必须是完整地址(以 http:// 或 https:// 开头)'), + ); } return; } @@ -351,7 +369,7 @@ const CustomOAuthSetting = ({ serverAddress }) => { if (editingProvider) { res = await API.put( `/api/custom-oauth-provider/${editingProvider.id}`, - payload + payload, ); } else { res = await API.post('/api/custom-oauth-provider/', payload); @@ -573,7 +591,7 @@ const CustomOAuthSetting = ({ serverAddress }) => { @@ -599,11 +617,11 @@ const CustomOAuthSetting = ({ serverAddress }) => { {t( - '配置自定义 OAuth 提供商,支持 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 协议的身份提供商' + '配置自定义 OAuth 提供商,支持 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 协议的身份提供商', )}
{t('回调 URL 格式')}: {serverAddress || t('网站地址')}/oauth/ @@ -615,7 +633,7 @@ const CustomOAuthSetting = ({ serverAddress }) => { -
@@ -1025,17 +1089,31 @@ const CustomOAuthSetting = ({ serverAddress }) => { mergeFormValues({ access_denied_message: value })} + onChange={(value) => + mergeFormValues({ access_denied_message: value }) + } label={t('拒绝提示模板(可选)')} - placeholder={t('例如:需要等级 {{required}},你当前等级 {{current}}')} - extraText={t('可用变量:{{provider}} {{field}} {{op}} {{required}} {{current}} 以及 {{current.path}}')} + placeholder={t( + '例如:需要等级 {{required}},你当前等级 {{current}}', + )} + extraText={t( + '可用变量:{{provider}} {{field}} {{op}} {{required}} {{current}} 以及 {{current.path}}', + )} showClear /> - - diff --git a/web/src/components/settings/DashboardSetting.jsx b/web/src/components/settings/DashboardSetting.jsx index 7bf4249437..e654fbab62 100644 --- a/web/src/components/settings/DashboardSetting.jsx +++ b/web/src/components/settings/DashboardSetting.jsx @@ -20,6 +20,7 @@ For commercial licensing, please contact support@quantumnous.com import React, { useEffect, useState, useMemo } from 'react'; import { Card, Spin, Button, Modal } from '@douyinfe/semi-ui'; import { API, showError, showSuccess, toBoolean } from '../../helpers'; +import { useTranslation } from 'react-i18next'; import SettingsAPIInfo from '../../pages/Setting/Dashboard/SettingsAPIInfo'; import SettingsAnnouncements from '../../pages/Setting/Dashboard/SettingsAnnouncements'; import SettingsFAQ from '../../pages/Setting/Dashboard/SettingsFAQ'; @@ -27,6 +28,7 @@ import SettingsUptimeKuma from '../../pages/Setting/Dashboard/SettingsUptimeKuma import SettingsDataDashboard from '../../pages/Setting/Dashboard/SettingsDataDashboard'; const DashboardSetting = () => { + const { t } = useTranslation(); let [inputs, setInputs] = useState({ 'console_setting.api_info': '', 'console_setting.announcements': '', @@ -77,7 +79,7 @@ const DashboardSetting = () => { setLoading(true); await getOptions(); } catch (error) { - showError('刷新失败'); + showError(t('刷新失败')); console.error(error); } finally { setLoading(false); @@ -110,12 +112,12 @@ const DashboardSetting = () => { try { setLoading(true); await API.post('/api/option/migrate_console_setting'); - showSuccess('旧配置迁移完成'); + showSuccess(t('旧配置迁移完成')); await onRefresh(); setShowMigrateModal(false); } catch (err) { console.error(err); - showError('迁移失败: ' + (err.message || '未知错误')); + showError(t('迁移失败: ') + (err.message || t('未知错误'))); } finally { setLoading(false); } @@ -126,18 +128,20 @@ const DashboardSetting = () => { {/* 用于迁移检测的旧键模态框,下个版本会删除 */} setShowMigrateModal(false)} confirmLoading={loading} - okText='确认迁移' - cancelText='取消' + okText={t('确认迁移')} + cancelText={t('取消')} > -

检测到旧版本的配置数据,是否要迁移到新的配置格式?

+

{t('检测到旧版本的配置数据,是否要迁移到新的配置格式?')}

- 注意: - 迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。 + {t('注意:')} + {t( + '迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。', + )}

diff --git a/web/src/components/settings/DrawingSetting.jsx b/web/src/components/settings/DrawingSetting.jsx index a714b6908d..e80dfbc916 100644 --- a/web/src/components/settings/DrawingSetting.jsx +++ b/web/src/components/settings/DrawingSetting.jsx @@ -21,8 +21,10 @@ import React, { useEffect, useState } from 'react'; import { Card, Spin } from '@douyinfe/semi-ui'; import SettingsDrawing from '../../pages/Setting/Drawing/SettingsDrawing'; import { API, showError, toBoolean } from '../../helpers'; +import { useTranslation } from 'react-i18next'; const DrawingSetting = () => { + const { t } = useTranslation(); let [inputs, setInputs] = useState({ /* 绘图设置 */ DrawingEnabled: false, @@ -59,7 +61,7 @@ const DrawingSetting = () => { setLoading(true); await getOptions(); } catch (error) { - showError('刷新失败'); + showError(t('刷新失败')); } finally { setLoading(false); } diff --git a/web/src/components/settings/ModelDeploymentSetting.jsx b/web/src/components/settings/ModelDeploymentSetting.jsx index c872f631d0..22feff0a7c 100644 --- a/web/src/components/settings/ModelDeploymentSetting.jsx +++ b/web/src/components/settings/ModelDeploymentSetting.jsx @@ -60,7 +60,7 @@ const ModelDeploymentSetting = () => { setLoading(true); await getOptions(); } catch (error) { - showError('刷新失败'); + showError(t('刷新失败')); console.error(error); } finally { setLoading(false); diff --git a/web/src/components/settings/ModelSetting.jsx b/web/src/components/settings/ModelSetting.jsx index fb0b844a03..7084b66688 100644 --- a/web/src/components/settings/ModelSetting.jsx +++ b/web/src/components/settings/ModelSetting.jsx @@ -95,7 +95,7 @@ const ModelSetting = () => { await getOptions(); // showSuccess('刷新成功'); } catch (error) { - showError('刷新失败'); + showError(t('刷新失败')); console.error(error); } finally { setLoading(false); diff --git a/web/src/components/settings/OperationSetting.jsx b/web/src/components/settings/OperationSetting.jsx index 8585a3e902..66a3ab8f70 100644 --- a/web/src/components/settings/OperationSetting.jsx +++ b/web/src/components/settings/OperationSetting.jsx @@ -28,8 +28,10 @@ import SettingsMonitoring from '../../pages/Setting/Operation/SettingsMonitoring import SettingsCreditLimit from '../../pages/Setting/Operation/SettingsCreditLimit'; import SettingsCheckin from '../../pages/Setting/Operation/SettingsCheckin'; import { API, showError, toBoolean } from '../../helpers'; +import { useTranslation } from 'react-i18next'; const OperationSetting = () => { + const { t } = useTranslation(); let [inputs, setInputs] = useState({ /* 额度相关 */ QuotaForNewUser: 0, @@ -109,7 +111,7 @@ const OperationSetting = () => { await getOptions(); // showSuccess('刷新成功'); } catch (error) { - showError('刷新失败'); + showError(t('刷新失败')); } finally { setLoading(false); } diff --git a/web/src/components/settings/OtherSetting.jsx b/web/src/components/settings/OtherSetting.jsx index f8e0b53756..891dca61ff 100644 --- a/web/src/components/settings/OtherSetting.jsx +++ b/web/src/components/settings/OtherSetting.jsx @@ -174,10 +174,10 @@ const OtherSetting = () => { try { setLoadingInput((loadingInput) => ({ ...loadingInput, Logo: true })); await updateOption('Logo', inputs.Logo); - showSuccess('Logo 已更新'); + showSuccess(t('Logo 已更新')); } catch (error) { console.error('Logo 更新失败', error); - showError('Logo 更新失败'); + showError(t('Logo 更新失败')); } finally { setLoadingInput((loadingInput) => ({ ...loadingInput, Logo: false })); } @@ -190,10 +190,10 @@ const OtherSetting = () => { HomePageContent: true, })); await updateOption(key, inputs[key]); - showSuccess('首页内容已更新'); + showSuccess(t('首页内容已更新')); } catch (error) { console.error('首页内容更新失败', error); - showError('首页内容更新失败'); + showError(t('首页内容更新失败')); } finally { setLoadingInput((loadingInput) => ({ ...loadingInput, @@ -206,10 +206,10 @@ const OtherSetting = () => { try { setLoadingInput((loadingInput) => ({ ...loadingInput, About: true })); await updateOption('About', inputs.About); - showSuccess('关于内容已更新'); + showSuccess(t('关于内容已更新')); } catch (error) { console.error('关于内容更新失败', error); - showError('关于内容更新失败'); + showError(t('关于内容更新失败')); } finally { setLoadingInput((loadingInput) => ({ ...loadingInput, About: false })); } @@ -219,10 +219,10 @@ const OtherSetting = () => { try { setLoadingInput((loadingInput) => ({ ...loadingInput, Footer: true })); await updateOption('Footer', inputs.Footer); - showSuccess('页脚内容已更新'); + showSuccess(t('页脚内容已更新')); } catch (error) { console.error('页脚内容更新失败', error); - showError('页脚内容更新失败'); + showError(t('页脚内容更新失败')); } finally { setLoadingInput((loadingInput) => ({ ...loadingInput, Footer: false })); } @@ -270,7 +270,7 @@ const OtherSetting = () => { } } catch (error) { console.error('Failed to check for updates:', error); - showError('检查更新失败,请稍后再试'); + showError(t('检查更新失败,请稍后再试')); } finally { setLoadingInput((loadingInput) => ({ ...loadingInput, diff --git a/web/src/components/settings/PerformanceSetting.jsx b/web/src/components/settings/PerformanceSetting.jsx index 6f1a547acc..279126c135 100644 --- a/web/src/components/settings/PerformanceSetting.jsx +++ b/web/src/components/settings/PerformanceSetting.jsx @@ -21,8 +21,10 @@ import React, { useEffect, useState } from 'react'; import { Card, Spin } from '@douyinfe/semi-ui'; import SettingsPerformance from '../../pages/Setting/Performance/SettingsPerformance'; import { API, showError, toBoolean } from '../../helpers'; +import { useTranslation } from 'react-i18next'; const PerformanceSetting = () => { + const { t } = useTranslation(); let [inputs, setInputs] = useState({ 'performance_setting.disk_cache_enabled': false, 'performance_setting.disk_cache_threshold_mb': 10, @@ -55,7 +57,7 @@ const PerformanceSetting = () => { setLoading(true); await getOptions(); } catch (error) { - showError('刷新失败'); + showError(t('刷新失败')); } finally { setLoading(false); } diff --git a/web/src/components/settings/PersonalSetting.jsx b/web/src/components/settings/PersonalSetting.jsx index 8ee6415ac5..c6881b6963 100644 --- a/web/src/components/settings/PersonalSetting.jsx +++ b/web/src/components/settings/PersonalSetting.jsx @@ -447,13 +447,12 @@ const PersonalSetting = () => {
{/* 顶部用户信息区域 */} - + {/* 签到日历 - 仅在启用时显示 */} {status?.checkin_enabled && (
{ await getOptions(); // showSuccess('刷新成功'); } catch (error) { - showError('刷新失败'); + showError(t('刷新失败')); } finally { setLoading(false); } diff --git a/web/src/components/settings/RatioSetting.jsx b/web/src/components/settings/RatioSetting.jsx index 170413058c..47f1ff0a03 100644 --- a/web/src/components/settings/RatioSetting.jsx +++ b/web/src/components/settings/RatioSetting.jsx @@ -82,7 +82,7 @@ const RatioSetting = () => { setLoading(true); await getOptions(); } catch (error) { - showError('刷新失败'); + showError(t('刷新失败')); } finally { setLoading(false); } diff --git a/web/src/components/settings/SystemSetting.jsx b/web/src/components/settings/SystemSetting.jsx index 8334c01db0..dc12abd42e 100644 --- a/web/src/components/settings/SystemSetting.jsx +++ b/web/src/components/settings/SystemSetting.jsx @@ -760,14 +760,16 @@ const SystemSetting = () => { @@ -1322,7 +1324,7 @@ const SystemSetting = () => { field='SMTPToken' label={t('SMTP 访问凭证')} type='password' - placeholder='敏感信息不会发送到前端显示' + placeholder={t('敏感信息不会发送到前端显示')} /> @@ -1525,7 +1527,7 @@ const SystemSetting = () => { diff --git a/web/src/components/settings/personal/cards/AccountManagement.jsx b/web/src/components/settings/personal/cards/AccountManagement.jsx index 29249caa16..71a75878c1 100644 --- a/web/src/components/settings/personal/cards/AccountManagement.jsx +++ b/web/src/components/settings/personal/cards/AccountManagement.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; +import { useTranslation } from 'react-i18next'; import { Button, Card, @@ -55,7 +56,6 @@ import { import TwoFASetting from '../components/TwoFASetting'; const AccountManagement = ({ - t, userState, status, systemToken, @@ -72,6 +72,7 @@ const AccountManagement = ({ onPasskeyRegister, onPasskeyDelete, }) => { + const { t } = useTranslation(); const renderAccountInfo = (accountId, label) => { if (!accountId || accountId === '') { return {t('未绑定')}; @@ -112,7 +113,9 @@ const AccountManagement = ({ showError(res.data.message || t('获取绑定信息失败')); } } catch (error) { - showError(error.response?.data?.message || error.message || t('获取绑定信息失败')); + showError( + error.response?.data?.message || error.message || t('获取绑定信息失败'), + ); } }; @@ -126,7 +129,9 @@ const AccountManagement = ({ onOk: async () => { setCustomOAuthLoading((prev) => ({ ...prev, [providerId]: true })); try { - const res = await API.delete(`/api/user/oauth/bindings/${providerId}`); + const res = await API.delete( + `/api/user/oauth/bindings/${providerId}`, + ); if (res.data.success) { showSuccess(t('解绑成功')); await loadCustomOAuthBindings(); @@ -134,7 +139,9 @@ const AccountManagement = ({ showError(res.data.message); } } catch (error) { - showError(error.response?.data?.message || error.message || t('操作失败')); + showError( + error.response?.data?.message || error.message || t('操作失败'), + ); } finally { setCustomOAuthLoading((prev) => ({ ...prev, [providerId]: false })); } @@ -150,13 +157,17 @@ const AccountManagement = ({ // Check if custom OAuth provider is bound const isCustomOAuthBound = (providerId) => { const normalizedId = Number(providerId); - return customOAuthBindings.some((b) => Number(b.provider_id) === normalizedId); + return customOAuthBindings.some( + (b) => Number(b.provider_id) === normalizedId, + ); }; // Get binding info for a provider const getCustomOAuthBinding = (providerId) => { const normalizedId = Number(providerId); - return customOAuthBindings.find((b) => Number(b.provider_id) === normalizedId); + return customOAuthBindings.find( + (b) => Number(b.provider_id) === normalizedId, + ); }; React.useEffect(() => { @@ -554,7 +565,10 @@ const AccountManagement = ({ size='small' loading={customOAuthLoading[provider.id]} onClick={() => - handleUnbindCustomOAuth(provider.id, provider.name) + handleUnbindCustomOAuth( + provider.id, + provider.name, + ) } > {t('解绑')} diff --git a/web/src/components/settings/personal/cards/CheckinCalendar.jsx b/web/src/components/settings/personal/cards/CheckinCalendar.jsx index 2298ae94d9..8da4c802ff 100644 --- a/web/src/components/settings/personal/cards/CheckinCalendar.jsx +++ b/web/src/components/settings/personal/cards/CheckinCalendar.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React, { useState, useEffect, useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; import { Card, Calendar, @@ -39,7 +40,8 @@ import { import Turnstile from 'react-turnstile'; import { API, showError, showSuccess, renderQuota } from '../../../../helpers'; -const CheckinCalendar = ({ t, status, turnstileEnabled, turnstileSiteKey }) => { +const CheckinCalendar = ({ status, turnstileEnabled, turnstileSiteKey }) => { + const { t } = useTranslation(); const [loading, setLoading] = useState(false); const [checkinLoading, setCheckinLoading] = useState(false); const [turnstileModalVisible, setTurnstileModalVisible] = useState(false); diff --git a/web/src/components/settings/personal/cards/NotificationSettings.jsx b/web/src/components/settings/personal/cards/NotificationSettings.jsx index e57e39d63d..6cebeee2d8 100644 --- a/web/src/components/settings/personal/cards/NotificationSettings.jsx +++ b/web/src/components/settings/personal/cards/NotificationSettings.jsx @@ -48,13 +48,13 @@ import { mergeAdminConfig, useSidebar, } from '../../../../hooks/common/useSidebar'; +import { useTranslation } from 'react-i18next'; -const NotificationSettings = ({ - t, - notificationSettings, +const NotificationSettings = ({ notificationSettings, handleNotificationSettingChange, saveNotificationSettings, }) => { + const { t } = useTranslation(); const formApiRef = useRef(null); const [statusState] = useContext(StatusContext); const [userState] = useContext(UserContext); diff --git a/web/src/components/settings/personal/cards/PreferencesSettings.jsx b/web/src/components/settings/personal/cards/PreferencesSettings.jsx index 3aa3331625..2a0f3cdb6b 100644 --- a/web/src/components/settings/personal/cards/PreferencesSettings.jsx +++ b/web/src/components/settings/personal/cards/PreferencesSettings.jsx @@ -17,160 +17,160 @@ along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ -import React, { useState, useEffect, useContext } from "react"; -import { Card, Select, Typography, Avatar } from "@douyinfe/semi-ui"; -import { Languages } from "lucide-react"; -import { useTranslation } from "react-i18next"; -import { API, showSuccess, showError } from "../../../../helpers"; -import { UserContext } from "../../../../context/User"; +import React, { useState, useEffect, useContext } from 'react'; +import { Card, Select, Typography, Avatar } from '@douyinfe/semi-ui'; +import { Languages } from 'lucide-react'; +import { useTranslation } from 'react-i18next'; +import { API, showSuccess, showError } from '../../../../helpers'; +import { UserContext } from '../../../../context/User'; // Language options with native names const languageOptions = [ - { value: "zh-CN", label: "简体中文" }, - { value: "zh-TW", label: "繁體中文" }, - { value: "en", label: "English" }, - { value: 'fr', label: 'Français'}, - { value: 'ru', label: 'Русский'}, - { value: 'ja', label: '日本語'}, - { value: "vi", label: "Tiếng Việt" }, + { value: 'zh-CN', label: '简体中文' }, + { value: 'zh-TW', label: '繁體中文' }, + { value: 'en', label: 'English' }, + { value: 'fr', label: 'Français' }, + { value: 'ru', label: 'Русский' }, + { value: 'ja', label: '日本語' }, + { value: 'vi', label: 'Tiếng Việt' }, ]; const PreferencesSettings = ({ t }) => { - const { i18n } = useTranslation(); - const [userState, userDispatch] = useContext(UserContext); - const [currentLanguage, setCurrentLanguage] = useState( - i18n.language || "zh-CN", - ); - const [loading, setLoading] = useState(false); - - // Load saved language preference from user settings - useEffect(() => { - if (userState?.user?.setting) { - try { - const settings = JSON.parse(userState.user.setting); - if (settings.language) { - // Normalize legacy "zh" to "zh-CN" for backward compatibility - const lang = settings.language === "zh" ? "zh-CN" : settings.language; - setCurrentLanguage(lang); - // Sync i18n with saved preference - if (i18n.language !== lang) { - i18n.changeLanguage(lang); - } - } - } catch (e) { - // Ignore parse errors - } - } - }, [userState?.user?.setting, i18n]); - - const handleLanguagePreferenceChange = async (lang) => { - if (lang === currentLanguage) return; - - setLoading(true); - const previousLang = currentLanguage; - - try { - // Update language immediately for responsive UX - setCurrentLanguage(lang); - i18n.changeLanguage(lang); - - // Save to backend - const res = await API.put("/api/user/self", { - language: lang, - }); - - if (res.data.success) { - showSuccess(t("语言偏好已保存")); - // Update user context with new setting - if (userState?.user?.setting) { - try { - const settings = JSON.parse(userState.user.setting); - settings.language = lang; - userDispatch({ - type: "login", - payload: { - ...userState.user, - setting: JSON.stringify(settings), - }, - }); - } catch (e) { - // Ignore - } - } - } else { - showError(res.data.message || t("保存失败")); - // Revert on error - setCurrentLanguage(previousLang); - i18n.changeLanguage(previousLang); - } - } catch (error) { - showError(t("保存失败,请重试")); - // Revert on error - setCurrentLanguage(previousLang); - i18n.changeLanguage(previousLang); - } finally { - setLoading(false); - } - }; - - return ( - - {/* Card Header */} -
- - - -
- - {t("偏好设置")} - -
- {t("界面语言和其他个人偏好")} -
-
-
- {/* Language Setting Card */} - -
-
-
- -
-
- - {t("语言偏好")} - - - {t("选择您的首选界面语言,设置将自动保存并同步到所有设备")} - -
-
- ({ + value: opt.value, + label: opt.label, + }))} + /> +
+
+ + {/* Additional info */} +
+ + {t( + '提示:语言偏好会同步到您登录的所有设备,并影响API返回的错误消息语言。', + )} + +
+
+ ); }; export default PreferencesSettings; diff --git a/web/src/components/settings/personal/components/TwoFASetting.jsx b/web/src/components/settings/personal/components/TwoFASetting.jsx index 10ee2373f2..eac3d70e82 100644 --- a/web/src/components/settings/personal/components/TwoFASetting.jsx +++ b/web/src/components/settings/personal/components/TwoFASetting.jsx @@ -38,12 +38,14 @@ import { IconCopy, } from '@douyinfe/semi-icons'; import React, { useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { QRCodeSVG } from 'qrcode.react'; const { Text, Paragraph } = Typography; -const TwoFASetting = ({ t }) => { +const TwoFASetting = () => { + const { t } = useTranslation(); const [loading, setLoading] = useState(false); const [status, setStatus] = useState({ enabled: false, diff --git a/web/src/components/settings/personal/components/UserInfoHeader.jsx b/web/src/components/settings/personal/components/UserInfoHeader.jsx index 3209a17ee8..39548da844 100644 --- a/web/src/components/settings/personal/components/UserInfoHeader.jsx +++ b/web/src/components/settings/personal/components/UserInfoHeader.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; +import { useTranslation } from 'react-i18next'; import { Avatar, Card, @@ -34,7 +35,8 @@ import { } from '../../../../helpers'; import { Coins, BarChart2, Users } from 'lucide-react'; -const UserInfoHeader = ({ t, userState }) => { +const UserInfoHeader = ({ userState }) => { + const { t } = useTranslation(); const getUsername = () => { if (userState.user) { return userState.user.username; diff --git a/web/src/components/settings/personal/modals/AccountDeleteModal.jsx b/web/src/components/settings/personal/modals/AccountDeleteModal.jsx index b2bc40f693..6d33b1f027 100644 --- a/web/src/components/settings/personal/modals/AccountDeleteModal.jsx +++ b/web/src/components/settings/personal/modals/AccountDeleteModal.jsx @@ -21,10 +21,9 @@ import React from 'react'; import { Banner, Input, Modal, Typography } from '@douyinfe/semi-ui'; import { IconDelete, IconUser } from '@douyinfe/semi-icons'; import Turnstile from 'react-turnstile'; +import { useTranslation } from 'react-i18next'; -const AccountDeleteModal = ({ - t, - showAccountDeleteModal, +const AccountDeleteModal = ({ showAccountDeleteModal, setShowAccountDeleteModal, inputs, handleInputChange, @@ -34,6 +33,7 @@ const AccountDeleteModal = ({ turnstileSiteKey, setTurnstileToken, }) => { + const { t } = useTranslation(); return ( { + const { t } = useTranslation(); return ( { + const { t } = useTranslation(); return ( { + const { t } = useTranslation(); return ( { + const { t } = useTranslation(); return (
{/* 上一步按钮 */} diff --git a/web/src/components/setup/components/steps/AdminStep.jsx b/web/src/components/setup/components/steps/AdminStep.jsx index 662196cfed..a305528745 100644 --- a/web/src/components/setup/components/steps/AdminStep.jsx +++ b/web/src/components/setup/components/steps/AdminStep.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; +import { useTranslation } from 'react-i18next'; import { Banner, Form } from '@douyinfe/semi-ui'; import { IconUser, IconLock } from '@douyinfe/semi-icons'; @@ -31,8 +32,8 @@ const AdminStep = ({ setFormData, formRef, renderNavigationButtons, - t, }) => { + const { t } = useTranslation(); return ( <> {setupStatus.root_init ? ( diff --git a/web/src/components/setup/components/steps/CompleteStep.jsx b/web/src/components/setup/components/steps/CompleteStep.jsx index 5f3265ac86..2175d1df1c 100644 --- a/web/src/components/setup/components/steps/CompleteStep.jsx +++ b/web/src/components/setup/components/steps/CompleteStep.jsx @@ -20,6 +20,7 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { Avatar, Typography, Descriptions } from '@douyinfe/semi-ui'; import { CheckCircle } from 'lucide-react'; +import { useTranslation } from 'react-i18next'; const { Text, Title } = Typography; @@ -31,8 +32,8 @@ const CompleteStep = ({ setupStatus, formData, renderNavigationButtons, - t, }) => { + const { t } = useTranslation(); return (
diff --git a/web/src/components/setup/components/steps/DatabaseStep.jsx b/web/src/components/setup/components/steps/DatabaseStep.jsx index d8d1d4f9f5..0c1db28829 100644 --- a/web/src/components/setup/components/steps/DatabaseStep.jsx +++ b/web/src/components/setup/components/steps/DatabaseStep.jsx @@ -19,12 +19,14 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { Banner } from '@douyinfe/semi-ui'; +import { useTranslation } from 'react-i18next'; /** * 数据库检查步骤组件 * 显示当前数据库类型和相关警告信息 */ -const DatabaseStep = ({ setupStatus, renderNavigationButtons, t }) => { +const DatabaseStep = ({ setupStatus, renderNavigationButtons }) => { + const { t } = useTranslation(); // 检测是否在 Electron 环境中运行 const isElectron = typeof window !== 'undefined' && window.electron?.isElectron; diff --git a/web/src/components/setup/components/steps/UsageModeStep.jsx b/web/src/components/setup/components/steps/UsageModeStep.jsx index 19364430f9..b8e35ce3ef 100644 --- a/web/src/components/setup/components/steps/UsageModeStep.jsx +++ b/web/src/components/setup/components/steps/UsageModeStep.jsx @@ -19,6 +19,7 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { RadioGroup, Radio } from '@douyinfe/semi-ui'; +import { useTranslation } from 'react-i18next'; /** * 使用模式选择步骤组件 @@ -28,8 +29,8 @@ const UsageModeStep = ({ formData, handleUsageModeChange, renderNavigationButtons, - t, }) => { + const { t } = useTranslation(); return ( <> { + const { t } = useTranslation(); return (
{/* 第一行:批量操作按钮 + 设置开关 */} diff --git a/web/src/components/table/channels/ChannelsColumnDefs.jsx b/web/src/components/table/channels/ChannelsColumnDefs.jsx index b98c3a5d59..3d751c5243 100644 --- a/web/src/components/table/channels/ChannelsColumnDefs.jsx +++ b/web/src/components/table/channels/ChannelsColumnDefs.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; +import { t } from '../../../helpers/i18n'; import { Button, Dropdown, @@ -47,7 +48,7 @@ import { import { FaRandom } from 'react-icons/fa'; // Render functions -const renderType = (type, record = {}, t) => { +const renderType = (type, record = {}) => { const channelInfo = record?.channel_info; let type2label = new Map(); for (let i = 0; i < CHANNEL_OPTIONS.length; i++) { @@ -135,7 +136,7 @@ const renderType = (type, record = {}, t) => { ); }; -const renderTagType = (t) => { +const renderTagType = () => { return ( {t('标签聚合')} @@ -143,7 +144,7 @@ const renderTagType = (t) => { ); }; -const renderStatus = (status, channelInfo = undefined, t) => { +const renderStatus = (status, channelInfo = undefined) => { if (channelInfo) { if (channelInfo.is_multi_key) { let keySize = channelInfo.multi_key_size; @@ -152,7 +153,7 @@ const renderStatus = (status, channelInfo = undefined, t) => { enabledKeySize = keySize - Object.keys(channelInfo.multi_key_status_list).length; } - return renderMultiKeyStatus(status, keySize, enabledKeySize, t); + return renderMultiKeyStatus(status, keySize, enabledKeySize); } } switch (status) { @@ -183,7 +184,7 @@ const renderStatus = (status, channelInfo = undefined, t) => { } }; -const renderMultiKeyStatus = (status, keySize, enabledKeySize, t) => { +const renderMultiKeyStatus = (status, keySize, enabledKeySize) => { switch (status) { case 1: return ( @@ -212,7 +213,7 @@ const renderMultiKeyStatus = (status, keySize, enabledKeySize, t) => { } }; -const renderResponseTime = (responseTime, t) => { +const renderResponseTime = (responseTime) => { let time = responseTime / 1000; time = time.toFixed(2) + t(' 秒'); if (responseTime === 0) { @@ -271,7 +272,6 @@ const isRequestPassThroughEnabled = (record) => { }; export const getChannelsColumns = ({ - t, COLUMN_KEYS, updateChannelBalance, manageChannel, @@ -388,9 +388,9 @@ export const getChannelsColumns = ({ dataIndex: 'type', render: (text, record, index) => { if (record.children === undefined) { - return <>{renderType(text, record, t)}; + return <>{renderType(text, record)}; } else { - return <>{renderTagType(t)}; + return <>{renderTagType()}; } }, }, @@ -413,12 +413,12 @@ export const getChannelsColumns = ({ t('原因:') + reason + t(',时间:') + timestamp2string(time) } > - {renderStatus(text, record.channel_info, t)} + {renderStatus(text, record.channel_info)}
); } else { - return renderStatus(text, record.channel_info, t); + return renderStatus(text, record.channel_info); } }, }, @@ -426,7 +426,7 @@ export const getChannelsColumns = ({ key: COLUMN_KEYS.RESPONSE_TIME, title: t('响应时间'), dataIndex: 'response_time', - render: (text, record, index) =>
{renderResponseTime(text, t)}
, + render: (text, record, index) =>
{renderResponseTime(text)}
, }, { key: COLUMN_KEYS.BALANCE, diff --git a/web/src/components/table/channels/ChannelsFilters.jsx b/web/src/components/table/channels/ChannelsFilters.jsx index e97a1e3e37..7b7295d9a4 100644 --- a/web/src/components/table/channels/ChannelsFilters.jsx +++ b/web/src/components/table/channels/ChannelsFilters.jsx @@ -20,6 +20,7 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { Button, Form } from '@douyinfe/semi-ui'; import { IconSearch } from '@douyinfe/semi-icons'; +import { useTranslation } from 'react-i18next'; const ChannelsFilters = ({ setEditingChannel, @@ -34,8 +35,8 @@ const ChannelsFilters = ({ groupOptions, loading, searching, - t, }) => { + const { t } = useTranslation(); return (
diff --git a/web/src/components/table/channels/ChannelsTable.jsx b/web/src/components/table/channels/ChannelsTable.jsx index abad235eb2..1252882c3f 100644 --- a/web/src/components/table/channels/ChannelsTable.jsx +++ b/web/src/components/table/channels/ChannelsTable.jsx @@ -25,8 +25,10 @@ import { IllustrationNoResultDark, } from '@douyinfe/semi-illustrations'; import { getChannelsColumns } from './ChannelsColumnDefs'; +import { useTranslation } from 'react-i18next'; const ChannelsTable = (channelsData) => { + const { t } = useTranslation(); const { channels, loading, @@ -41,7 +43,6 @@ const ChannelsTable = (channelsData) => { handlePageChange, handlePageSizeChange, handleRow, - t, COLUMN_KEYS, // Column functions and data updateChannelBalance, @@ -66,7 +67,6 @@ const ChannelsTable = (channelsData) => { // Get all columns const allColumns = useMemo(() => { return getChannelsColumns({ - t, COLUMN_KEYS, updateChannelBalance, manageChannel, @@ -88,7 +88,6 @@ const ChannelsTable = (channelsData) => { setCurrentMultiKeyChannel, }); }, [ - t, COLUMN_KEYS, updateChannelBalance, manageChannel, diff --git a/web/src/components/table/channels/ChannelsTabs.jsx b/web/src/components/table/channels/ChannelsTabs.jsx index f95d138a46..74b38ef4b7 100644 --- a/web/src/components/table/channels/ChannelsTabs.jsx +++ b/web/src/components/table/channels/ChannelsTabs.jsx @@ -21,6 +21,7 @@ import React from 'react'; import { Tabs, TabPane, Tag } from '@douyinfe/semi-ui'; import { CHANNEL_OPTIONS } from '../../../constants'; import { getChannelIcon } from '../../../helpers'; +import { useTranslation } from 'react-i18next'; const ChannelsTabs = ({ enableTagMode, @@ -33,8 +34,8 @@ const ChannelsTabs = ({ pageSize, idSort, setActivePage, - t, }) => { + const { t } = useTranslation(); if (enableTagMode) return null; const handleTabChange = (key) => { diff --git a/web/src/components/table/channels/index.jsx b/web/src/components/table/channels/index.jsx index fa7850959f..cbb9bb74cd 100644 --- a/web/src/components/table/channels/index.jsx +++ b/web/src/components/table/channels/index.jsx @@ -34,8 +34,10 @@ import EditChannelModal from './modals/EditChannelModal'; import EditTagModal from './modals/EditTagModal'; import MultiKeyManageModal from './modals/MultiKeyManageModal'; import { createCardProPagination } from '../../../helpers/utils'; +import { useTranslation } from 'react-i18next'; const ChannelsPage = () => { + const { t } = useTranslation(); const channelsData = useChannelsData(); const isMobile = useIsMobile(); @@ -75,7 +77,7 @@ const ChannelsPage = () => { style={{ color: 'var(--semi-color-warning)' }} /> } - description={channelsData.t( + description={t( '已开启全局请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。', )} style={{ marginBottom: 12 }} @@ -93,9 +95,9 @@ const ChannelsPage = () => { onPageChange: channelsData.handlePageChange, onPageSizeChange: channelsData.handlePageSizeChange, isMobile: isMobile, - t: channelsData.t, + t: t, })} - t={channelsData.t} + t={t} > diff --git a/web/src/components/table/channels/modals/BatchTagModal.jsx b/web/src/components/table/channels/modals/BatchTagModal.jsx index 16bb64b085..6d690d376a 100644 --- a/web/src/components/table/channels/modals/BatchTagModal.jsx +++ b/web/src/components/table/channels/modals/BatchTagModal.jsx @@ -19,6 +19,7 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { Modal, Input, Typography } from '@douyinfe/semi-ui'; +import { useTranslation } from 'react-i18next'; const BatchTagModal = ({ showBatchSetTag, @@ -27,8 +28,8 @@ const BatchTagModal = ({ batchSetTagValue, setBatchSetTagValue, selectedChannels, - t, }) => { + const { t } = useTranslation(); return ( { return '#3b82f6'; }; -const formatDurationSeconds = (seconds, t) => { - const tt = typeof t === 'function' ? t : (v) => v; +const formatDurationSeconds = (seconds) => { const s = Number(seconds); if (!Number.isFinite(s) || s <= 0) return '-'; const total = Math.floor(s); const hours = Math.floor(total / 3600); const minutes = Math.floor((total % 3600) / 60); const secs = total % 60; - if (hours > 0) return `${hours}${tt('小时')} ${minutes}${tt('分钟')}`; - if (minutes > 0) return `${minutes}${tt('分钟')} ${secs}${tt('秒')}`; - return `${secs}${tt('秒')}`; + if (hours > 0) return `${hours}${t('小时')} ${minutes}${t('分钟')}`; + if (minutes > 0) return `${minutes}${t('分钟')} ${secs}${t('秒')}`; + return `${secs}${t('秒')}`; }; const formatUnixSeconds = (unixSeconds) => { @@ -66,8 +66,7 @@ const formatUnixSeconds = (unixSeconds) => { } }; -const RateLimitWindowCard = ({ t, title, windowData }) => { - const tt = typeof t === 'function' ? t : (v) => v; +const RateLimitWindowCard = ({ title, windowData }) => { const percent = clampPercent(windowData?.used_percent ?? 0); const resetAt = windowData?.reset_at; const resetAfterSeconds = windowData?.reset_after_seconds; @@ -78,7 +77,7 @@ const RateLimitWindowCard = ({ t, title, windowData }) => {
{title}
- {tt('重置时间:')} + {t('重置时间:')} {formatUnixSeconds(resetAt)}
@@ -93,24 +92,23 @@ const RateLimitWindowCard = ({ t, title, windowData }) => {
- {tt('已使用:')} + {t('已使用:')} {percent}%
- {tt('距离重置:')} - {formatDurationSeconds(resetAfterSeconds, tt)} + {t('距离重置:')} + {formatDurationSeconds(resetAfterSeconds)}
- {tt('窗口:')} - {formatDurationSeconds(limitWindowSeconds, tt)} + {t('窗口:')} + {formatDurationSeconds(limitWindowSeconds)}
); }; -const CodexUsageView = ({ t, record, payload, onCopy, onRefresh }) => { - const tt = typeof t === 'function' ? t : (v) => v; +const CodexUsageView = ({ record, payload, onCopy, onRefresh }) => { const data = payload?.data ?? null; const rateLimit = data?.rate_limit ?? {}; @@ -123,9 +121,9 @@ const CodexUsageView = ({ t, record, payload, onCopy, onRefresh }) => { const statusTag = allowed && !limitReached ? ( - {tt('可用')} + {t('可用')} ) : ( - {tt('受限')} + {t('受限')} ); const rawText = @@ -135,8 +133,8 @@ const CodexUsageView = ({ t, record, payload, onCopy, onRefresh }) => {
- {tt('渠道:')} - {record?.name || '-'} ({tt('编号:')} + {t('渠道:')} + {record?.name || '-'} ({t('编号:')} {record?.id || '-'})
@@ -147,34 +145,26 @@ const CodexUsageView = ({ t, record, payload, onCopy, onRefresh }) => { theme='borderless' onClick={onRefresh} > - {tt('刷新')} + {t('刷新')}
- {tt('上游状态码:')} + {t('上游状态码:')} {upstreamStatus ?? '-'}
- - + +
-
{tt('原始 JSON')}
+
{t('原始 JSON')}
@@ -193,8 +183,7 @@ const CodexUsageView = ({ t, record, payload, onCopy, onRefresh }) => {
   );
 };
 
-const CodexUsageLoader = ({ t, record, initialPayload, onCopy }) => {
-  const tt = typeof t === 'function' ? t : (v) => v;
+const CodexUsageLoader = ({ record, initialPayload, onCopy }) => {
   const [loading, setLoading] = useState(!initialPayload);
   const [payload, setPayload] = useState(initialPayload ?? null);
   const hasShownErrorRef = useRef(false);
@@ -216,19 +205,19 @@ const CodexUsageLoader = ({ t, record, initialPayload, onCopy }) => {
       setPayload(res?.data ?? null);
       if (!res?.data?.success && !hasShownErrorRef.current) {
         hasShownErrorRef.current = true;
-        showError(tt('获取用量失败'));
+        showError(t('获取用量失败'));
       }
     } catch (error) {
       if (!mountedRef.current) return;
       if (!hasShownErrorRef.current) {
         hasShownErrorRef.current = true;
-        showError(tt('获取用量失败'));
+        showError(t('获取用量失败'));
       }
       setPayload({ success: false, message: String(error) });
     } finally {
       if (mountedRef.current) setLoading(false);
     }
-  }, [recordId, tt]);
+  }, [recordId]);
 
   useEffect(() => {
     mountedRef.current = true;
@@ -245,7 +234,7 @@ const CodexUsageLoader = ({ t, record, initialPayload, onCopy }) => {
   if (loading) {
     return (
       
- +
); } @@ -253,7 +242,7 @@ const CodexUsageLoader = ({ t, record, initialPayload, onCopy }) => { if (!payload) { return (
- {tt('获取用量失败')} + {t('获取用量失败')}
@@ -270,7 +259,6 @@ const CodexUsageLoader = ({ t, record, initialPayload, onCopy }) => { return ( { ); }; -export const openCodexUsageModal = ({ t, record, payload, onCopy }) => { - const tt = typeof t === 'function' ? t : (v) => v; - +export const openCodexUsageModal = ({ record, payload, onCopy }) => { Modal.info({ - title: tt('Codex 用量'), + title: t('Codex 用量'), centered: true, width: 900, style: { maxWidth: '95vw' }, content: ( { footer: (
), diff --git a/web/src/components/table/channels/modals/ColumnSelectorModal.jsx b/web/src/components/table/channels/modals/ColumnSelectorModal.jsx index b46379ac54..b3e7165a2c 100644 --- a/web/src/components/table/channels/modals/ColumnSelectorModal.jsx +++ b/web/src/components/table/channels/modals/ColumnSelectorModal.jsx @@ -20,6 +20,7 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { Modal, Button, Checkbox } from '@douyinfe/semi-ui'; import { getChannelsColumns } from '../ChannelsColumnDefs'; +import { useTranslation } from 'react-i18next'; const ColumnSelectorModal = ({ showColumnSelector, @@ -29,7 +30,6 @@ const ColumnSelectorModal = ({ handleSelectAll, initDefaultColumns, COLUMN_KEYS, - t, // Props needed for getChannelsColumns updateChannelBalance, manageChannel, @@ -47,9 +47,9 @@ const ColumnSelectorModal = ({ activePage, channels, }) => { + const { t } = useTranslation(); // Get all columns for display in selector const allColumns = getChannelsColumns({ - t, COLUMN_KEYS, updateChannelBalance, manageChannel, diff --git a/web/src/components/table/channels/modals/EditChannelModal.jsx b/web/src/components/table/channels/modals/EditChannelModal.jsx index 3d3afcc38e..2f753e0f1a 100644 --- a/web/src/components/table/channels/modals/EditChannelModal.jsx +++ b/web/src/components/table/channels/modals/EditChannelModal.jsx @@ -487,9 +487,10 @@ const EditChannelModal = (props) => { if (name === 'base_url' && value.endsWith('/v1')) { Modal.confirm({ - title: '警告', - content: + title: t('警告'), + content: t( '不需要在末尾加/v1,New API会自动处理,添加后可能导致请求失败,是否继续?', + ), onOk: () => { setInputs((inputs) => ({ ...inputs, [name]: value })); }, @@ -994,7 +995,7 @@ const EditChannelModal = (props) => { } }); - const categories = getModelCategories(t); + const categories = getModelCategories(); const optionsWithIcon = Array.from(modelMap.values()).map((opt) => { const modelName = opt.value; let icon = null; @@ -2530,7 +2531,7 @@ const EditChannelModal = (props) => { handleInputChange('other', value)} showClear /> @@ -2540,9 +2541,9 @@ const EditChannelModal = (props) => { handleInputChange('other', value)} showClear /> @@ -2552,7 +2553,7 @@ const EditChannelModal = (props) => { handleInputChange('other', value)} showClear /> diff --git a/web/src/components/table/channels/modals/EditTagModal.jsx b/web/src/components/table/channels/modals/EditTagModal.jsx index fbb00be583..55537be0f7 100644 --- a/web/src/components/table/channels/modals/EditTagModal.jsx +++ b/web/src/components/table/channels/modals/EditTagModal.jsx @@ -201,7 +201,7 @@ const EditTagModal = (props) => { let data = { tag }; if (formVals.model_mapping) { if (!verifyJSON(formVals.model_mapping)) { - showInfo('模型映射必须是合法的 JSON 格式!'); + showInfo(t('模型映射必须是合法的 JSON 格式!')); setLoading(false); return; } @@ -218,13 +218,13 @@ const EditTagModal = (props) => { formVals.param_override !== null ) { if (typeof formVals.param_override !== 'string') { - showInfo('参数覆盖必须是合法的 JSON 格式!'); + showInfo(t('参数覆盖必须是合法的 JSON 格式!')); setLoading(false); return; } const trimmedParamOverride = formVals.param_override.trim(); if (trimmedParamOverride !== '' && !verifyJSON(trimmedParamOverride)) { - showInfo('参数覆盖必须是合法的 JSON 格式!'); + showInfo(t('参数覆盖必须是合法的 JSON 格式!')); setLoading(false); return; } @@ -235,13 +235,13 @@ const EditTagModal = (props) => { formVals.header_override !== null ) { if (typeof formVals.header_override !== 'string') { - showInfo('请求头覆盖必须是合法的 JSON 格式!'); + showInfo(t('请求头覆盖必须是合法的 JSON 格式!')); setLoading(false); return; } const trimmedHeaderOverride = formVals.header_override.trim(); if (trimmedHeaderOverride !== '' && !verifyJSON(trimmedHeaderOverride)) { - showInfo('请求头覆盖必须是合法的 JSON 格式!'); + showInfo(t('请求头覆盖必须是合法的 JSON 格式!')); setLoading(false); return; } @@ -256,7 +256,7 @@ const EditTagModal = (props) => { data.param_override === undefined && data.header_override === undefined ) { - showWarning('没有任何修改!'); + showWarning(t('没有任何修改!')); setLoading(false); return; } @@ -268,7 +268,7 @@ const EditTagModal = (props) => { try { const res = await API.put('/api/channel/tag', data); if (res?.data?.success) { - showSuccess('标签更新成功!'); + showSuccess(t('标签更新成功!')); refresh(); handleClose(); } diff --git a/web/src/components/table/channels/modals/ModelSelectModal.jsx b/web/src/components/table/channels/modals/ModelSelectModal.jsx index b38580b66f..f14c546ab7 100644 --- a/web/src/components/table/channels/modals/ModelSelectModal.jsx +++ b/web/src/components/table/channels/modals/ModelSelectModal.jsx @@ -139,7 +139,7 @@ const ModelSelectModal = ({ // 按厂商分类模型 const categorizeModels = (models) => { - const categories = getModelCategories(t); + const categories = getModelCategories(); const categorizedModels = {}; const uncategorizedModels = []; diff --git a/web/src/components/table/channels/modals/ModelTestModal.jsx b/web/src/components/table/channels/modals/ModelTestModal.jsx index 490cf54be1..a1ec1e2b24 100644 --- a/web/src/components/table/channels/modals/ModelTestModal.jsx +++ b/web/src/components/table/channels/modals/ModelTestModal.jsx @@ -32,6 +32,7 @@ import { import { IconSearch, IconInfoCircle } from '@douyinfe/semi-icons'; import { copy, showError, showInfo, showSuccess } from '../../../../helpers'; import { MODEL_TABLE_PAGE_SIZE } from '../../../../constants'; +import { useTranslation } from 'react-i18next'; const ModelTestModal = ({ showModelTestModal, @@ -54,8 +55,8 @@ const ModelTestModal = ({ setIsStreamTest, allSelectingRef, isMobile, - t, }) => { + const { t } = useTranslation(); const hasChannel = Boolean(currentTestChannel); const streamToggleDisabled = [ 'embeddings', diff --git a/web/src/components/table/channels/modals/SingleModelSelectModal.jsx b/web/src/components/table/channels/modals/SingleModelSelectModal.jsx index fdeb29152c..1094133fb5 100644 --- a/web/src/components/table/channels/modals/SingleModelSelectModal.jsx +++ b/web/src/components/table/channels/modals/SingleModelSelectModal.jsx @@ -68,7 +68,7 @@ const SingleModelSelectModal = ({ }, [normalizedModels, keyword]); const modelsByCategory = useMemo(() => { - const categories = getModelCategories(t); + const categories = getModelCategories(); const categorized = {}; const uncategorized = []; diff --git a/web/src/components/table/channels/modals/StatusCodeRiskGuardModal.jsx b/web/src/components/table/channels/modals/StatusCodeRiskGuardModal.jsx index ba3f46f59d..62717fd15f 100644 --- a/web/src/components/table/channels/modals/StatusCodeRiskGuardModal.jsx +++ b/web/src/components/table/channels/modals/StatusCodeRiskGuardModal.jsx @@ -14,24 +14,24 @@ const StatusCodeRiskGuardModal = React.memo(function StatusCodeRiskGuardModal({ }) { const { t, i18n } = useTranslation(); const checklist = useMemo( - () => STATUS_CODE_RISK_CHECKLIST_KEYS.map((item) => t(item)), - [t, i18n.language], + () => STATUS_CODE_RISK_CHECKLIST_KEYS.map((item) => item), + [i18n.language], ); return ( diff --git a/web/src/components/table/channels/modals/statusCodeRiskGuard.js b/web/src/components/table/channels/modals/statusCodeRiskGuard.js index 169736baa8..642095f890 100644 --- a/web/src/components/table/channels/modals/statusCodeRiskGuard.js +++ b/web/src/components/table/channels/modals/statusCodeRiskGuard.js @@ -1,21 +1,23 @@ +import i18next from 'i18next'; + const NON_REDIRECTABLE_STATUS_CODES = new Set([504, 524]); export const STATUS_CODE_RISK_I18N_KEYS = { - title: '高危操作确认', - detailTitle: '检测到以下高危状态码重定向规则', - inputPrompt: '操作确认', - confirmButton: '我确认开启高危重试', - markdown: '高危状态码重试风险告知与免责声明Markdown', - confirmText: '高危状态码重试风险确认输入文本', - inputPlaceholder: '高危状态码重试风险输入框占位文案', - mismatchText: '高危状态码重试风险输入不匹配提示', + title: i18next.t('高危操作确认'), + detailTitle: i18next.t('检测到以下高危状态码重定向规则'), + inputPrompt: i18next.t('操作确认'), + confirmButton: i18next.t('我确认开启高危重试'), + markdown: i18next.t('高危状态码重试风险告知与免责声明Markdown'), + confirmText: i18next.t('高危状态码重试风险确认输入文本'), + inputPlaceholder: i18next.t('高危状态码重试风险输入框占位文案'), + mismatchText: i18next.t('高危状态码重试风险输入不匹配提示'), }; export const STATUS_CODE_RISK_CHECKLIST_KEYS = [ - '高危状态码重试风险确认项1', - '高危状态码重试风险确认项2', - '高危状态码重试风险确认项3', - '高危状态码重试风险确认项4', + i18next.t('高危状态码重试风险确认项1'), + i18next.t('高危状态码重试风险确认项2'), + i18next.t('高危状态码重试风险确认项3'), + i18next.t('高危状态码重试风险确认项4'), ]; function parseStatusCodeKey(rawKey) { diff --git a/web/src/components/table/mj-logs/MjLogsActions.jsx b/web/src/components/table/mj-logs/MjLogsActions.jsx index c668831f34..1be020efd5 100644 --- a/web/src/components/table/mj-logs/MjLogsActions.jsx +++ b/web/src/components/table/mj-logs/MjLogsActions.jsx @@ -22,6 +22,7 @@ import { Skeleton, Typography } from '@douyinfe/semi-ui'; import { useMinimumLoadingTime } from '../../../hooks/common/useMinimumLoadingTime'; import { IconEyeOpened } from '@douyinfe/semi-icons'; import CompactModeToggle from '../../common/ui/CompactModeToggle'; +import { useTranslation } from 'react-i18next'; const { Text } = Typography; @@ -31,8 +32,8 @@ const MjLogsActions = ({ isAdminUser, compactMode, setCompactMode, - t, }) => { + const { t } = useTranslation(); const showSkeleton = useMinimumLoadingTime(loading); const placeholder = ( diff --git a/web/src/components/table/mj-logs/MjLogsColumnDefs.jsx b/web/src/components/table/mj-logs/MjLogsColumnDefs.jsx index 9fa26efe0b..6d9c56b20a 100644 --- a/web/src/components/table/mj-logs/MjLogsColumnDefs.jsx +++ b/web/src/components/table/mj-logs/MjLogsColumnDefs.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; +import { t } from '../../../helpers/i18n'; import { Button, Progress, Tag, Typography } from '@douyinfe/semi-ui'; import { Palette, @@ -66,7 +67,7 @@ const colors = [ ]; // Render functions -function renderType(type, t) { +function renderType(type) { switch (type) { case 'IMAGINE': return ( @@ -193,7 +194,7 @@ function renderType(type, t) { } } -function renderCode(code, t) { +function renderCode(code) { switch (code) { case 1: return ( @@ -232,7 +233,7 @@ function renderCode(code, t) { } } -function renderStatus(type, t) { +function renderStatus(type) { switch (type) { case 'SUCCESS': return ( @@ -299,7 +300,7 @@ const renderTimestamp = (timestampInSeconds) => { return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; }; -function renderDuration(submit_time, finishTime, t) { +function renderDuration(submit_time, finishTime) { if (!submit_time || !finishTime) return 'N/A'; const start = new Date(submit_time); @@ -316,7 +317,6 @@ function renderDuration(submit_time, finishTime, t) { } export const getMjLogsColumns = ({ - t, COLUMN_KEYS, copyText, openContentModal, @@ -337,7 +337,7 @@ export const getMjLogsColumns = ({ title: t('花费时间'), dataIndex: 'finish_time', render: (finish, record) => { - return renderDuration(record.submit_time, finish, t); + return renderDuration(record.submit_time, finish); }, }, { @@ -369,7 +369,7 @@ export const getMjLogsColumns = ({ title: t('类型'), dataIndex: 'action', render: (text, record, index) => { - return
{renderType(text, t)}
; + return
{renderType(text)}
; }, }, { @@ -385,7 +385,7 @@ export const getMjLogsColumns = ({ title: t('提交结果'), dataIndex: 'code', render: (text, record, index) => { - return isAdminUser ?
{renderCode(text, t)}
: <>; + return isAdminUser ?
{renderCode(text)}
: <>; }, }, { @@ -393,7 +393,7 @@ export const getMjLogsColumns = ({ title: t('任务状态'), dataIndex: 'status', render: (text, record, index) => { - return
{renderStatus(text, t)}
; + return
{renderStatus(text)}
; }, }, { diff --git a/web/src/components/table/mj-logs/MjLogsFilters.jsx b/web/src/components/table/mj-logs/MjLogsFilters.jsx index 7c61454e0d..0747bac520 100644 --- a/web/src/components/table/mj-logs/MjLogsFilters.jsx +++ b/web/src/components/table/mj-logs/MjLogsFilters.jsx @@ -22,6 +22,7 @@ import { Button, Form } from '@douyinfe/semi-ui'; import { IconSearch } from '@douyinfe/semi-icons'; import { DATE_RANGE_PRESETS } from '../../../constants/console.constants'; +import { useTranslation } from 'react-i18next'; const MjLogsFilters = ({ formInitValues, @@ -31,8 +32,8 @@ const MjLogsFilters = ({ formApi, loading, isAdminUser, - t, }) => { + const { t } = useTranslation(); return (
{ + const { t } = useTranslation(); const { logs, loading, @@ -41,21 +43,19 @@ const MjLogsTable = (mjLogsData) => { openContentModal, openImageModal, isAdminUser, - t, COLUMN_KEYS, } = mjLogsData; // Get all columns const allColumns = useMemo(() => { return getMjLogsColumns({ - t, COLUMN_KEYS, copyText, openContentModal, openImageModal, isAdminUser, }); - }, [t, COLUMN_KEYS, copyText, openContentModal, openImageModal, isAdminUser]); + }, [COLUMN_KEYS, copyText, openContentModal, openImageModal, isAdminUser]); // Filter columns based on visibility settings const getVisibleColumns = () => { diff --git a/web/src/components/table/mj-logs/index.jsx b/web/src/components/table/mj-logs/index.jsx index 7160a5363e..765e79d0f9 100644 --- a/web/src/components/table/mj-logs/index.jsx +++ b/web/src/components/table/mj-logs/index.jsx @@ -28,8 +28,10 @@ import ContentModal from './modals/ContentModal'; import { useMjLogsData } from '../../../hooks/mj-logs/useMjLogsData'; import { useIsMobile } from '../../../hooks/common/useIsMobile'; import { createCardProPagination } from '../../../helpers/utils'; +import { useTranslation } from 'react-i18next'; const MjLogsPage = () => { + const { t } = useTranslation(); const mjLogsData = useMjLogsData(); const isMobile = useIsMobile(); @@ -51,9 +53,9 @@ const MjLogsPage = () => { onPageChange: mjLogsData.handlePageChange, onPageSizeChange: mjLogsData.handlePageSizeChange, isMobile: isMobile, - t: mjLogsData.t, + t: t, })} - t={mjLogsData.t} + t={t} > diff --git a/web/src/components/table/mj-logs/modals/ColumnSelectorModal.jsx b/web/src/components/table/mj-logs/modals/ColumnSelectorModal.jsx index d514555f12..76c550d16a 100644 --- a/web/src/components/table/mj-logs/modals/ColumnSelectorModal.jsx +++ b/web/src/components/table/mj-logs/modals/ColumnSelectorModal.jsx @@ -20,6 +20,7 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { Modal, Button, Checkbox } from '@douyinfe/semi-ui'; import { getMjLogsColumns } from '../MjLogsColumnDefs'; +import { useTranslation } from 'react-i18next'; const ColumnSelectorModal = ({ showColumnSelector, @@ -33,11 +34,10 @@ const ColumnSelectorModal = ({ copyText, openContentModal, openImageModal, - t, }) => { + const { t } = useTranslation(); // Get all columns for display in selector const allColumns = getMjLogsColumns({ - t, COLUMN_KEYS, copyText, openContentModal, diff --git a/web/src/components/table/model-deployments/DeploymentsActions.jsx b/web/src/components/table/model-deployments/DeploymentsActions.jsx index 86b3b3bf0a..f73e0f7e60 100644 --- a/web/src/components/table/model-deployments/DeploymentsActions.jsx +++ b/web/src/components/table/model-deployments/DeploymentsActions.jsx @@ -20,6 +20,7 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { Button, Popconfirm } from '@douyinfe/semi-ui'; import CompactModeToggle from '../../common/ui/CompactModeToggle'; +import { useTranslation } from 'react-i18next'; const DeploymentsActions = ({ selectedKeys, @@ -32,8 +33,8 @@ const DeploymentsActions = ({ setCompactMode, showCreateModal, setShowCreateModal, - t, }) => { + const { t } = useTranslation(); const hasSelected = batchOperationsEnabled && selectedKeys.length > 0; const handleAddDeployment = () => { diff --git a/web/src/components/table/model-deployments/DeploymentsColumnDefs.jsx b/web/src/components/table/model-deployments/DeploymentsColumnDefs.jsx index 7a13f7de1f..65a857e0fa 100644 --- a/web/src/components/table/model-deployments/DeploymentsColumnDefs.jsx +++ b/web/src/components/table/model-deployments/DeploymentsColumnDefs.jsx @@ -18,6 +18,8 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; +import { t } from '../../../helpers/i18n'; +import { useTranslation } from 'react-i18next'; import { Button, Dropdown, Tag, Typography } from '@douyinfe/semi-ui'; import { timestamp2string, showSuccess, showError } from '../../../helpers'; import { IconMore } from '@douyinfe/semi-icons'; @@ -121,7 +123,7 @@ const clampPercent = (value) => { return Math.min(100, Math.max(0, Math.round(value))); }; -const formatRemainingMinutes = (minutes, t) => { +const formatRemainingMinutes = (minutes) => { if (minutes === null || minutes === undefined) return null; const numeric = Number(minutes); if (!Number.isFinite(numeric)) return null; @@ -176,7 +178,7 @@ const getRemainingTheme = (percentRemaining) => { }; }; -const renderStatus = (status, t) => { +const renderStatus = (status) => { const normalizedStatus = normalizeStatus(status); const config = STATUS_TAG_CONFIG[normalizedStatus] || DEFAULT_STATUS_CONFIG; const statusText = typeof status === 'string' ? status : ''; @@ -197,7 +199,8 @@ const renderStatus = (status, t) => { }; // Container Name Cell Component - to properly handle React hooks -const ContainerNameCell = ({ text, record, t }) => { +const ContainerNameCell = ({ text, record }) => { + const { t } = useTranslation(); const handleCopyId = async () => { try { await navigator.clipboard.writeText(record.id); @@ -226,7 +229,7 @@ const ContainerNameCell = ({ text, record, t }) => { }; // Render resource configuration -const renderResourceConfig = (resource, t) => { +const renderResourceConfig = (resource) => { if (!resource) return '-'; const { cpu, memory, gpu } = resource; @@ -256,7 +259,7 @@ const renderResourceConfig = (resource, t) => { }; // Render instance count with status indicator -const renderInstanceCount = (count, record, t) => { +const renderInstanceCount = (count, record) => { const normalizedStatus = normalizeStatus(record?.status); const statusConfig = STATUS_TAG_CONFIG[normalizedStatus]; const countColor = statusConfig?.color ?? 'grey'; @@ -270,7 +273,6 @@ const renderInstanceCount = (count, record, t) => { // Main function to get all deployment columns export const getDeploymentsColumns = ({ - t, COLUMN_KEYS, startDeployment, restartDeployment, @@ -295,7 +297,7 @@ export const getDeploymentsColumns = ({ width: 300, ellipsis: true, render: (text, record) => ( - + ), }, { @@ -304,7 +306,7 @@ export const getDeploymentsColumns = ({ key: COLUMN_KEYS.status, width: 140, render: (status) => ( -
{renderStatus(status, t)}
+
{renderStatus(status)}
), }, { @@ -364,7 +366,6 @@ export const getDeploymentsColumns = ({ const timeDisplay = baseTimeDisplay; const humanReadable = formatRemainingMinutes( record.compute_minutes_remaining, - t, ); const showProgress = !statusOverride && normalizedStatus === 'running'; const showExtraInfo = Boolean(humanReadable || percentUsed !== null); diff --git a/web/src/components/table/model-deployments/DeploymentsFilters.jsx b/web/src/components/table/model-deployments/DeploymentsFilters.jsx index b268f6832a..bdda742d3c 100644 --- a/web/src/components/table/model-deployments/DeploymentsFilters.jsx +++ b/web/src/components/table/model-deployments/DeploymentsFilters.jsx @@ -20,6 +20,7 @@ For commercial licensing, please contact support@quantumnous.com import React, { useRef } from 'react'; import { Form, Button } from '@douyinfe/semi-ui'; import { IconSearch, IconRefresh } from '@douyinfe/semi-icons'; +import { useTranslation } from 'react-i18next'; const DeploymentsFilters = ({ formInitValues, @@ -28,8 +29,8 @@ const DeploymentsFilters = ({ loading, searching, setShowColumnSelector, - t, }) => { + const { t } = useTranslation(); const formApiRef = useRef(null); const handleSubmit = (values) => { diff --git a/web/src/components/table/model-deployments/DeploymentsTable.jsx b/web/src/components/table/model-deployments/DeploymentsTable.jsx index 7a7eb981e1..f2e166274a 100644 --- a/web/src/components/table/model-deployments/DeploymentsTable.jsx +++ b/web/src/components/table/model-deployments/DeploymentsTable.jsx @@ -32,8 +32,10 @@ import ExtendDurationModal from './modals/ExtendDurationModal'; import ViewDetailsModal from './modals/ViewDetailsModal'; import UpdateConfigModal from './modals/UpdateConfigModal'; import ConfirmationDialog from './modals/ConfirmationDialog'; +import { useTranslation } from 'react-i18next'; const DeploymentsTable = (deploymentsData) => { + const { t } = useTranslation(); const { deployments, loading, @@ -48,7 +50,6 @@ const DeploymentsTable = (deploymentsData) => { handlePageChange, handlePageSizeChange, handleRow, - t, COLUMN_KEYS, // Column functions and data startDeployment, @@ -114,7 +115,6 @@ const DeploymentsTable = (deploymentsData) => { // Get all columns const allColumns = useMemo(() => { return getDeploymentsColumns({ - t, COLUMN_KEYS, startDeployment, restartDeployment, @@ -132,7 +132,6 @@ const DeploymentsTable = (deploymentsData) => { onSyncToChannel: syncDeploymentToChannel, }); }, [ - t, COLUMN_KEYS, startDeployment, restartDeployment, diff --git a/web/src/components/table/model-deployments/index.jsx b/web/src/components/table/model-deployments/index.jsx index 05a7c7c148..1c35053e62 100644 --- a/web/src/components/table/model-deployments/index.jsx +++ b/web/src/components/table/model-deployments/index.jsx @@ -28,8 +28,10 @@ import ColumnSelectorModal from './modals/ColumnSelectorModal'; import { useDeploymentsData } from '../../../hooks/model-deployments/useDeploymentsData'; import { useIsMobile } from '../../../hooks/common/useIsMobile'; import { createCardProPagination } from '../../../helpers/utils'; +import { useTranslation } from 'react-i18next'; const DeploymentsPage = () => { + const { t } = useTranslation(); const deploymentsData = useDeploymentsData(); const isMobile = useIsMobile(); @@ -68,9 +70,6 @@ const DeploymentsPage = () => { // Description state compactMode, setCompactMode, - - // Translation - t, } = deploymentsData; return ( @@ -136,9 +135,9 @@ const DeploymentsPage = () => { onPageChange: deploymentsData.handlePageChange, onPageSizeChange: deploymentsData.handlePageSizeChange, isMobile: isMobile, - t: deploymentsData.t, + t: t, })} - t={deploymentsData.t} + t={t} > { + const { t } = useTranslation(); const columnOptions = useMemo( () => [ { key: columnKeys.container_name, label: t('容器名称'), required: true }, diff --git a/web/src/components/table/model-deployments/modals/ConfirmationDialog.jsx b/web/src/components/table/model-deployments/modals/ConfirmationDialog.jsx index 5e90b153bb..f4c6cdc70f 100644 --- a/web/src/components/table/model-deployments/modals/ConfirmationDialog.jsx +++ b/web/src/components/table/model-deployments/modals/ConfirmationDialog.jsx @@ -19,6 +19,7 @@ For commercial licensing, please contact support@quantumnous.com import React, { useState, useEffect } from 'react'; import { Modal, Typography, Input } from '@douyinfe/semi-ui'; +import { useTranslation } from 'react-i18next'; const { Text } = Typography; @@ -29,9 +30,9 @@ const ConfirmationDialog = ({ title, type = 'danger', deployment, - t, loading = false, }) => { + const { t } = useTranslation(); const [confirmText, setConfirmText] = useState(''); useEffect(() => { diff --git a/web/src/components/table/model-deployments/modals/CreateDeploymentModal.jsx b/web/src/components/table/model-deployments/modals/CreateDeploymentModal.jsx index 35887b15b8..8dfa3b16c1 100644 --- a/web/src/components/table/model-deployments/modals/CreateDeploymentModal.jsx +++ b/web/src/components/table/model-deployments/modals/CreateDeploymentModal.jsx @@ -46,6 +46,7 @@ import { } from '@douyinfe/semi-icons'; import { API } from '../../../../helpers'; import { showError, showSuccess, copy } from '../../../../helpers'; +import { useTranslation } from 'react-i18next'; const { Text, Title } = Typography; const { Option } = Select; @@ -55,6 +56,7 @@ const BUILTIN_IMAGE = 'ollama/ollama:latest'; const DEFAULT_TRAFFIC_PORT = 11434; const generateRandomKey = () => { + const { t } = useTranslation(); try { if (typeof crypto !== 'undefined' && crypto.randomUUID) { return `ionet-${crypto.randomUUID().replace(/-/g, '')}`; @@ -67,7 +69,7 @@ const generateRandomKey = () => { .slice(2)}`; }; -const CreateDeploymentModal = ({ visible, onCancel, onSuccess, t }) => { +const CreateDeploymentModal = ({ visible, onCancel, onSuccess }) => { const [formApi, setFormApi] = useState(null); const [loading, setLoading] = useState(false); const [submitting, setSubmitting] = useState(false); diff --git a/web/src/components/table/model-deployments/modals/ExtendDurationModal.jsx b/web/src/components/table/model-deployments/modals/ExtendDurationModal.jsx index e4e9b7bb90..a0caeb7ee6 100644 --- a/web/src/components/table/model-deployments/modals/ExtendDurationModal.jsx +++ b/web/src/components/table/model-deployments/modals/ExtendDurationModal.jsx @@ -38,6 +38,7 @@ import { FaExclamationTriangle, } from 'react-icons/fa'; import { API, showError, showSuccess } from '../../../../helpers'; +import { useTranslation } from 'react-i18next'; const { Text } = Typography; @@ -46,8 +47,8 @@ const ExtendDurationModal = ({ onCancel, deployment, onSuccess, - t, }) => { + const { t } = useTranslation(); const formRef = useRef(null); const [loading, setLoading] = useState(false); const [durationHours, setDurationHours] = useState(1); diff --git a/web/src/components/table/model-deployments/modals/UpdateConfigModal.jsx b/web/src/components/table/model-deployments/modals/UpdateConfigModal.jsx index 8d30415dbe..3a47cfc445 100644 --- a/web/src/components/table/model-deployments/modals/UpdateConfigModal.jsx +++ b/web/src/components/table/model-deployments/modals/UpdateConfigModal.jsx @@ -45,10 +45,12 @@ import { FaMinus, } from 'react-icons/fa'; import { API, showError, showSuccess } from '../../../../helpers'; +import { useTranslation } from 'react-i18next'; const { Text, Title } = Typography; -const UpdateConfigModal = ({ visible, onCancel, deployment, onSuccess, t }) => { +const UpdateConfigModal = ({ visible, onCancel, deployment, onSuccess }) => { + const { t } = useTranslation(); const formRef = useRef(null); const [loading, setLoading] = useState(false); const [envVars, setEnvVars] = useState([]); diff --git a/web/src/components/table/model-deployments/modals/ViewDetailsModal.jsx b/web/src/components/table/model-deployments/modals/ViewDetailsModal.jsx index f004fe54e1..10b4a027a0 100644 --- a/web/src/components/table/model-deployments/modals/ViewDetailsModal.jsx +++ b/web/src/components/table/model-deployments/modals/ViewDetailsModal.jsx @@ -49,10 +49,12 @@ import { showSuccess, timestamp2string, } from '../../../../helpers'; +import { useTranslation } from 'react-i18next'; const { Text, Title } = Typography; -const ViewDetailsModal = ({ visible, onCancel, deployment, t }) => { +const ViewDetailsModal = ({ visible, onCancel, deployment }) => { + const { t } = useTranslation(); const [details, setDetails] = useState(null); const [loading, setLoading] = useState(false); const [containers, setContainers] = useState([]); diff --git a/web/src/components/table/model-deployments/modals/ViewLogsModal.jsx b/web/src/components/table/model-deployments/modals/ViewLogsModal.jsx index 3d0446aeab..b8b9487686 100644 --- a/web/src/components/table/model-deployments/modals/ViewLogsModal.jsx +++ b/web/src/components/table/model-deployments/modals/ViewLogsModal.jsx @@ -51,12 +51,14 @@ import { copy, timestamp2string, } from '../../../../helpers'; +import { useTranslation } from 'react-i18next'; const { Text } = Typography; const ALL_CONTAINERS = '__all__'; -const ViewLogsModal = ({ visible, onCancel, deployment, t }) => { +const ViewLogsModal = ({ visible, onCancel, deployment }) => { + const { t } = useTranslation(); const [logLines, setLogLines] = useState([]); const [loading, setLoading] = useState(false); const [autoRefresh, setAutoRefresh] = useState(false); @@ -241,20 +243,20 @@ const ViewLogsModal = ({ visible, onCancel, deployment, t }) => { const normalized = typeof status === 'string' ? status.trim().toLowerCase() : ''; const statusMap = { - running: { color: 'green', label: '运行中' }, - pending: { color: 'orange', label: '准备中' }, - deployed: { color: 'blue', label: '已部署' }, - failed: { color: 'red', label: '失败' }, - destroyed: { color: 'red', label: '已销毁' }, - stopping: { color: 'orange', label: '停止中' }, - terminated: { color: 'grey', label: '已终止' }, + running: { color: 'green', label: t('运行中') }, + pending: { color: 'orange', label: t('准备中') }, + deployed: { color: 'blue', label: t('已部署') }, + failed: { color: 'red', label: t('失败') }, + destroyed: { color: 'red', label: t('已销毁') }, + stopping: { color: 'orange', label: t('停止中') }, + terminated: { color: 'grey', label: t('已终止') }, }; const config = statusMap[normalized] || { color: 'grey', label: status }; return ( - {t(config.label)} + {config.label} ); }; diff --git a/web/src/components/table/model-pricing/filter/PricingDisplaySettings.jsx b/web/src/components/table/model-pricing/filter/PricingDisplaySettings.jsx index 71dbd20005..90102afb52 100644 --- a/web/src/components/table/model-pricing/filter/PricingDisplaySettings.jsx +++ b/web/src/components/table/model-pricing/filter/PricingDisplaySettings.jsx @@ -19,6 +19,7 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import SelectableButtonGroup from '../../../common/ui/SelectableButtonGroup'; +import { useTranslation } from 'react-i18next'; const PricingDisplaySettings = ({ showWithRecharge, @@ -32,8 +33,8 @@ const PricingDisplaySettings = ({ tokenUnit, setTokenUnit, loading = false, - t, }) => { + const { t } = useTranslation(); const items = [ { value: 'recharge', diff --git a/web/src/components/table/model-pricing/filter/PricingEndpointTypes.jsx b/web/src/components/table/model-pricing/filter/PricingEndpointTypes.jsx index 0450f576a4..35e5e85bca 100644 --- a/web/src/components/table/model-pricing/filter/PricingEndpointTypes.jsx +++ b/web/src/components/table/model-pricing/filter/PricingEndpointTypes.jsx @@ -19,6 +19,7 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import SelectableButtonGroup from '../../../common/ui/SelectableButtonGroup'; +import { useTranslation } from 'react-i18next'; /** * 端点类型筛选组件 @@ -34,8 +35,8 @@ const PricingEndpointTypes = ({ models = [], allModels = [], loading = false, - t, }) => { + const { t } = useTranslation(); // 获取系统中所有端点类型(基于 allModels,如果未提供则退化为 models) const getAllEndpointTypes = () => { const endpointTypes = new Set(); diff --git a/web/src/components/table/model-pricing/filter/PricingGroups.jsx b/web/src/components/table/model-pricing/filter/PricingGroups.jsx index ee32e9b490..a8f7d4d116 100644 --- a/web/src/components/table/model-pricing/filter/PricingGroups.jsx +++ b/web/src/components/table/model-pricing/filter/PricingGroups.jsx @@ -19,6 +19,7 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import SelectableButtonGroup from '../../../common/ui/SelectableButtonGroup'; +import { useTranslation } from 'react-i18next'; /** * 分组筛选组件 @@ -37,8 +38,8 @@ const PricingGroups = ({ groupRatio = {}, models = [], loading = false, - t, }) => { + const { t } = useTranslation(); const groups = [ 'all', ...Object.keys(usableGroup).filter((key) => key !== ''), diff --git a/web/src/components/table/model-pricing/filter/PricingQuotaTypes.jsx b/web/src/components/table/model-pricing/filter/PricingQuotaTypes.jsx index 814d1260dd..e83f9281c0 100644 --- a/web/src/components/table/model-pricing/filter/PricingQuotaTypes.jsx +++ b/web/src/components/table/model-pricing/filter/PricingQuotaTypes.jsx @@ -19,6 +19,7 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import SelectableButtonGroup from '../../../common/ui/SelectableButtonGroup'; +import { useTranslation } from 'react-i18next'; /** * 计费类型筛选组件 @@ -33,8 +34,8 @@ const PricingQuotaTypes = ({ setFilterQuotaType, models = [], loading = false, - t, }) => { + const { t } = useTranslation(); const qtyCount = (type) => models.filter((m) => (type === 'all' ? true : m.quota_type === type)) .length; diff --git a/web/src/components/table/model-pricing/filter/PricingTags.jsx b/web/src/components/table/model-pricing/filter/PricingTags.jsx index 2d61aa90ef..87fc66525c 100644 --- a/web/src/components/table/model-pricing/filter/PricingTags.jsx +++ b/web/src/components/table/model-pricing/filter/PricingTags.jsx @@ -19,6 +19,7 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import SelectableButtonGroup from '../../../common/ui/SelectableButtonGroup'; +import { useTranslation } from 'react-i18next'; /** * 模型标签筛选组件 @@ -35,8 +36,8 @@ const PricingTags = ({ models = [], allModels = [], loading = false, - t, }) => { + const { t } = useTranslation(); // 提取系统所有标签 const getAllTags = React.useMemo(() => { const tagSet = new Set(); diff --git a/web/src/components/table/model-pricing/filter/PricingVendors.jsx b/web/src/components/table/model-pricing/filter/PricingVendors.jsx index 192d1662e0..643cd08b22 100644 --- a/web/src/components/table/model-pricing/filter/PricingVendors.jsx +++ b/web/src/components/table/model-pricing/filter/PricingVendors.jsx @@ -20,6 +20,7 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import SelectableButtonGroup from '../../../common/ui/SelectableButtonGroup'; import { getLobeHubIcon } from '../../../../helpers'; +import { useTranslation } from 'react-i18next'; /** * 供应商筛选组件 @@ -36,8 +37,8 @@ const PricingVendors = ({ models = [], allModels = [], loading = false, - t, }) => { + const { t } = useTranslation(); // 获取系统中所有供应商(基于 allModels,如果未提供则退化为 models) const getAllVendors = React.useMemo(() => { const vendors = new Set(); diff --git a/web/src/components/table/model-pricing/layout/PricingPage.jsx b/web/src/components/table/model-pricing/layout/PricingPage.jsx index 615df089f5..c5286b4b3f 100644 --- a/web/src/components/table/model-pricing/layout/PricingPage.jsx +++ b/web/src/components/table/model-pricing/layout/PricingPage.jsx @@ -24,8 +24,10 @@ import PricingContent from './content/PricingContent'; import ModelDetailSideSheet from '../modal/ModelDetailSideSheet'; import { useModelPricingData } from '../../../../hooks/model-pricing/useModelPricingData'; import { useIsMobile } from '../../../../hooks/common/useIsMobile'; +import { useTranslation } from 'react-i18next'; const PricingPage = () => { + const { t } = useTranslation(); const pricingData = useModelPricingData(); const { Sider, Content } = Layout; const isMobile = useIsMobile(); @@ -76,7 +78,7 @@ const PricingPage = () => { vendorsMap={pricingData.vendorsMap} endpointMap={pricingData.endpointMap} autoGroups={pricingData.autoGroups} - t={pricingData.t} + t={t} />
); diff --git a/web/src/components/table/model-pricing/layout/PricingSidebar.jsx b/web/src/components/table/model-pricing/layout/PricingSidebar.jsx index f466816ffd..41df34a872 100644 --- a/web/src/components/table/model-pricing/layout/PricingSidebar.jsx +++ b/web/src/components/table/model-pricing/layout/PricingSidebar.jsx @@ -27,6 +27,7 @@ import PricingTags from '../filter/PricingTags'; import { resetPricingFilters } from '../../../../helpers/utils'; import { usePricingFilterCounts } from '../../../../hooks/model-pricing/usePricingFilterCounts'; +import { useTranslation } from 'react-i18next'; const PricingSidebar = ({ showWithRecharge, @@ -55,9 +56,9 @@ const PricingSidebar = ({ tokenUnit, setTokenUnit, loading, - t, ...categoryProps }) => { + const { t } = useTranslation(); const { quotaTypeModels, endpointTypeModels, diff --git a/web/src/components/table/model-pricing/layout/header/PricingVendorIntro.jsx b/web/src/components/table/model-pricing/layout/header/PricingVendorIntro.jsx index 6022626447..9ea1c63043 100644 --- a/web/src/components/table/model-pricing/layout/header/PricingVendorIntro.jsx +++ b/web/src/components/table/model-pricing/layout/header/PricingVendorIntro.jsx @@ -26,6 +26,8 @@ import { Tooltip, Modal, } from '@douyinfe/semi-ui'; +import { t } from '../../../../../helpers/i18n'; +import { useTranslation } from 'react-i18next'; import { getLobeHubIcon } from '../../../../../helpers'; import SearchActions from './SearchActions'; @@ -78,7 +80,7 @@ const CONTENT_TEXTS = { }, }; -const getVendorDisplayName = (vendorName, t) => { +const getVendorDisplayName = (vendorName) => { return vendorName === CONFIG.UNKNOWN_VENDOR ? CONTENT_TEXTS.unknown.displayName(t) : vendorName; @@ -117,12 +119,12 @@ const createAvatarContent = (vendor, isAllVendors) => { ); }; -const renderVendorAvatar = (vendor, t, isAllVendors = false) => { +const renderVendorAvatar = (vendor, isAllVendors = false) => { if (!vendor) { return createDefaultAvatar(); } - const displayName = getVendorDisplayName(vendor.name, t); + const displayName = getVendorDisplayName(vendor.name); const avatarContent = createAvatarContent(vendor, isAllVendors); return ( @@ -137,7 +139,6 @@ const PricingVendorIntro = memo( filterVendor, models = [], allModels = [], - t, selectedRowKeys = [], copyText, handleChange, @@ -186,7 +187,7 @@ const PricingVendorIntro = memo(
{descModalContent}
), - [descModalVisible, descModalContent, handleCloseDescModal, isMobile, t], + [descModalVisible, descModalContent, handleCloseDescModal, isMobile], ); const vendorInfo = useMemo(() => { @@ -228,7 +229,7 @@ const PricingVendorIntro = memo( } return vendorList; - }, [allModels, models, t]); + }, [allModels, models]); const currentModelCount = models.length; @@ -256,7 +257,7 @@ const PricingVendorIntro = memo( const vendor = vendorInfo.find((v) => v.name === vendorKey); return vendor?.description || CONTENT_TEXTS.fallback.description(t); }, - [vendorInfo, t], + [vendorInfo], ); const createCoverStyle = useCallback( @@ -313,7 +314,6 @@ const PricingVendorIntro = memo( setViewMode, tokenUnit, setTokenUnit, - t, ], ); @@ -362,7 +362,7 @@ const PricingVendorIntro = memo( {renderSearchActions()} ), - [renderSearchActions, createCoverStyle, handleOpenDescModal, t], + [renderSearchActions, createCoverStyle, handleOpenDescModal], ); const renderAllVendorsAvatar = useCallback(() => { @@ -370,8 +370,8 @@ const PricingVendorIntro = memo( vendorInfo.length > 0 ? vendorInfo[currentOffset % vendorInfo.length] : null; - return renderVendorAvatar(currentVendor, t, true); - }, [vendorInfo, currentOffset, t]); + return renderVendorAvatar(currentVendor, true); + }, [vendorInfo, currentOffset]); if (filterVendor === 'all') { const headerCard = renderHeaderCard({ @@ -394,14 +394,14 @@ const PricingVendorIntro = memo( return null; } - const vendorDisplayName = getVendorDisplayName(currentVendor.name, t); + const vendorDisplayName = getVendorDisplayName(currentVendor.name); const headerCard = renderHeaderCard({ title: vendorDisplayName, count: currentModelCount, description: currentVendor.description || getVendorDescription(currentVendor.name), - rightContent: renderVendorAvatar(currentVendor, t, false), + rightContent: renderVendorAvatar(currentVendor, false), primaryDarkerChannel: THEME_COLORS.specific.primary, }); diff --git a/web/src/components/table/model-pricing/layout/header/SearchActions.jsx b/web/src/components/table/model-pricing/layout/header/SearchActions.jsx index c961b8dc1e..33353f2557 100644 --- a/web/src/components/table/model-pricing/layout/header/SearchActions.jsx +++ b/web/src/components/table/model-pricing/layout/header/SearchActions.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React, { memo, useCallback } from 'react'; +import { useTranslation } from 'react-i18next'; import { Input, Button, Switch, Select, Divider } from '@douyinfe/semi-ui'; import { IconSearch, IconCopy, IconFilter } from '@douyinfe/semi-icons'; @@ -41,8 +42,8 @@ const SearchActions = memo( setViewMode, tokenUnit, setTokenUnit, - t, }) => { + const { t } = useTranslation(); const handleCopyClick = useCallback(() => { if (copyText && selectedRowKeys.length > 0) { copyText(selectedRowKeys); diff --git a/web/src/components/table/model-pricing/modal/ModelDetailSideSheet.jsx b/web/src/components/table/model-pricing/modal/ModelDetailSideSheet.jsx index 6542137707..ce045ee5c7 100644 --- a/web/src/components/table/model-pricing/modal/ModelDetailSideSheet.jsx +++ b/web/src/components/table/model-pricing/modal/ModelDetailSideSheet.jsx @@ -26,6 +26,7 @@ import ModelHeader from './components/ModelHeader'; import ModelBasicInfo from './components/ModelBasicInfo'; import ModelEndpoints from './components/ModelEndpoints'; import ModelPricingTable from './components/ModelPricingTable'; +import { useTranslation } from 'react-i18next'; const { Text } = Typography; @@ -42,8 +43,8 @@ const ModelDetailSideSheet = ({ vendorsMap, endpointMap, autoGroups, - t, }) => { + const { t } = useTranslation(); const isMobile = useIsMobile(); return ( diff --git a/web/src/components/table/model-pricing/modal/PricingFilterModal.jsx b/web/src/components/table/model-pricing/modal/PricingFilterModal.jsx index 8875f8b1c5..5fbcfeb01d 100644 --- a/web/src/components/table/model-pricing/modal/PricingFilterModal.jsx +++ b/web/src/components/table/model-pricing/modal/PricingFilterModal.jsx @@ -22,8 +22,10 @@ import { Modal } from '@douyinfe/semi-ui'; import { resetPricingFilters } from '../../../../helpers/utils'; import FilterModalContent from './components/FilterModalContent'; import FilterModalFooter from './components/FilterModalFooter'; +import { useTranslation } from 'react-i18next'; -const PricingFilterModal = ({ visible, onClose, sidebarProps, t }) => { +const PricingFilterModal = ({ visible, onClose, sidebarProps }) => { + const { t } = useTranslation(); const handleResetFilters = () => resetPricingFilters({ handleChange: sidebarProps.handleChange, diff --git a/web/src/components/table/model-pricing/modal/components/FilterModalFooter.jsx b/web/src/components/table/model-pricing/modal/components/FilterModalFooter.jsx index d99d62fec4..1d2ca1f8b4 100644 --- a/web/src/components/table/model-pricing/modal/components/FilterModalFooter.jsx +++ b/web/src/components/table/model-pricing/modal/components/FilterModalFooter.jsx @@ -19,8 +19,10 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { Button } from '@douyinfe/semi-ui'; +import { useTranslation } from 'react-i18next'; -const FilterModalFooter = ({ onReset, onConfirm, t }) => { +const FilterModalFooter = ({ onReset, onConfirm }) => { + const { t } = useTranslation(); return (
diff --git a/web/src/components/table/model-pricing/view/table/PricingTable.jsx b/web/src/components/table/model-pricing/view/table/PricingTable.jsx index a93bd5260d..6c39a036d7 100644 --- a/web/src/components/table/model-pricing/view/table/PricingTable.jsx +++ b/web/src/components/table/model-pricing/view/table/PricingTable.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React, { useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; import { Card, Table, Empty } from '@douyinfe/semi-ui'; import { IllustrationNoResult, @@ -43,11 +44,10 @@ const PricingTable = ({ showRatio, compactMode = false, openModelDetail, - t, }) => { + const { t } = useTranslation(); const columns = useMemo(() => { return getPricingTableColumns({ - t, selectedGroup, groupRatio, copyText, @@ -59,7 +59,6 @@ const PricingTable = ({ showRatio, }); }, [ - t, selectedGroup, groupRatio, copyText, @@ -133,7 +132,6 @@ const PricingTable = ({ pageSize, setPageSize, openModelDetail, - t, compactMode, ], ); diff --git a/web/src/components/table/model-pricing/view/table/PricingTableColumns.jsx b/web/src/components/table/model-pricing/view/table/PricingTableColumns.jsx index 5ab8af9f4c..356fb81daf 100644 --- a/web/src/components/table/model-pricing/view/table/PricingTableColumns.jsx +++ b/web/src/components/table/model-pricing/view/table/PricingTableColumns.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; +import { t } from '../../../../../helpers/i18n'; import { Tag, Space, Tooltip } from '@douyinfe/semi-ui'; import { IconHelpCircle } from '@douyinfe/semi-icons'; import { @@ -32,7 +33,7 @@ import { } from '../../../../common/ui/RenderUtils'; import { useIsMobile } from '../../../../../hooks/common/useIsMobile'; -function renderQuotaType(type, t) { +function renderQuotaType(type) { switch (type) { case 1: return ( @@ -52,7 +53,7 @@ function renderQuotaType(type, t) { } // Render vendor name -const renderVendor = (vendorName, vendorIcon, t) => { +const renderVendor = (vendorName, vendorIcon) => { if (!vendorName) return '-'; return ( { - return renderQuotaType(parseInt(text), t); + return renderQuotaType(parseInt(text)); }, sorter: (a, b) => a.quota_type - b.quota_type, }; @@ -177,7 +177,7 @@ export const getPricingTableColumns = ({ const vendorColumn = { title: t('供应商'), dataIndex: 'vendor_name', - render: (text, record) => renderVendor(text, record.vendor_icon, t), + render: (text, record) => renderVendor(text, record.vendor_icon), }; const baseColumns = [ diff --git a/web/src/components/table/models/ModelsActions.jsx b/web/src/components/table/models/ModelsActions.jsx index 7e8f163bf8..16b6a2827a 100644 --- a/web/src/components/table/models/ModelsActions.jsx +++ b/web/src/components/table/models/ModelsActions.jsx @@ -27,6 +27,7 @@ import CompactModeToggle from '../../common/ui/CompactModeToggle'; import SelectionNotification from './components/SelectionNotification'; import UpstreamConflictModal from './modals/UpstreamConflictModal'; import SyncWizardModal from './modals/SyncWizardModal'; +import { useTranslation } from 'react-i18next'; const ModelsActions = ({ selectedKeys, @@ -41,8 +42,8 @@ const ModelsActions = ({ applyUpstreamOverwrite, compactMode, setCompactMode, - t, }) => { + const { t } = useTranslation(); // Modal states const [showDeleteModal, setShowDeleteModal] = useState(false); const [showMissingModal, setShowMissingModal] = useState(false); diff --git a/web/src/components/table/models/ModelsColumnDefs.jsx b/web/src/components/table/models/ModelsColumnDefs.jsx index 4520a1b4df..57436c59b2 100644 --- a/web/src/components/table/models/ModelsColumnDefs.jsx +++ b/web/src/components/table/models/ModelsColumnDefs.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; +import { t } from '../../../helpers/i18n'; import { Button, Space, @@ -55,7 +56,7 @@ const renderModelIconCol = (record, vendorMap) => { }; // Render vendor column with icon -const renderVendorTag = (vendorId, vendorMap, t) => { +const renderVendorTag = (vendorId, vendorMap) => { if (!vendorId || !vendorMap[vendorId]) return '-'; const v = vendorMap[vendorId]; return ( @@ -132,7 +133,7 @@ const renderEndpoints = (value) => { }; // Render quota types (array) using common limited items renderer -const renderQuotaTypes = (arr, t) => { +const renderQuotaTypes = (arr) => { if (!Array.isArray(arr) || arr.length === 0) return '-'; return renderLimitedItems({ items: arr, @@ -182,7 +183,6 @@ const renderOperations = ( setShowEdit, manageModel, refresh, - t, ) => { return ( @@ -237,7 +237,7 @@ const renderOperations = ( }; // 名称匹配类型渲染(带匹配数量 Tooltip) -const renderNameRule = (rule, record, t) => { +const renderNameRule = (rule, record) => { const map = { 0: { color: 'green', label: t('精确') }, 1: { color: 'blue', label: t('前缀') }, @@ -274,7 +274,6 @@ const renderNameRule = (rule, record, t) => { }; export const getModelsColumns = ({ - t, manageModel, setEditingModel, setShowEdit, @@ -301,7 +300,7 @@ export const getModelsColumns = ({ { title: t('匹配类型'), dataIndex: 'name_rule', - render: (val, record) => renderNameRule(val, record, t), + render: (val, record) => renderNameRule(val, record), }, { title: t('参与官方同步'), @@ -320,7 +319,7 @@ export const getModelsColumns = ({ { title: t('供应商'), dataIndex: 'vendor_id', - render: (vendorId, record) => renderVendorTag(vendorId, vendorMap, t), + render: (vendorId, record) => renderVendorTag(vendorId, vendorMap), }, { title: t('标签'), @@ -345,7 +344,7 @@ export const getModelsColumns = ({ { title: t('计费类型'), dataIndex: 'quota_types', - render: (qts) => renderQuotaTypes(qts, t), + render: (qts) => renderQuotaTypes(qts), }, { title: t('创建时间'), @@ -373,7 +372,6 @@ export const getModelsColumns = ({ setShowEdit, manageModel, refresh, - t, ), }, ]; diff --git a/web/src/components/table/models/ModelsFilters.jsx b/web/src/components/table/models/ModelsFilters.jsx index 8a88676297..f4b1fb8ae6 100644 --- a/web/src/components/table/models/ModelsFilters.jsx +++ b/web/src/components/table/models/ModelsFilters.jsx @@ -20,6 +20,7 @@ For commercial licensing, please contact support@quantumnous.com import React, { useRef } from 'react'; import { Form, Button } from '@douyinfe/semi-ui'; import { IconSearch } from '@douyinfe/semi-icons'; +import { useTranslation } from 'react-i18next'; const ModelsFilters = ({ formInitValues, @@ -27,8 +28,8 @@ const ModelsFilters = ({ searchModels, loading, searching, - t, }) => { + const { t } = useTranslation(); // Handle form reset and immediate search const formApiRef = useRef(null); diff --git a/web/src/components/table/models/ModelsTable.jsx b/web/src/components/table/models/ModelsTable.jsx index 643bff66d1..f8000703fd 100644 --- a/web/src/components/table/models/ModelsTable.jsx +++ b/web/src/components/table/models/ModelsTable.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React, { useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; import { Empty } from '@douyinfe/semi-ui'; import CardTable from '../../common/ui/CardTable'; import { @@ -27,6 +28,7 @@ import { import { getModelsColumns } from './ModelsColumnDefs'; const ModelsTable = (modelsData) => { + const { t } = useTranslation(); const { models, loading, @@ -43,20 +45,18 @@ const ModelsTable = (modelsData) => { setShowEdit, refresh, vendorMap, - t, } = modelsData; // Get all columns const columns = useMemo(() => { return getModelsColumns({ - t, manageModel, setEditingModel, setShowEdit, refresh, vendorMap, }); - }, [t, manageModel, setEditingModel, setShowEdit, refresh, vendorMap]); + }, [manageModel, setEditingModel, setShowEdit, refresh, vendorMap]); // Handle compact mode by removing fixed positioning const tableColumns = useMemo(() => { diff --git a/web/src/components/table/models/ModelsTabs.jsx b/web/src/components/table/models/ModelsTabs.jsx index 820d7076f5..e38215ae25 100644 --- a/web/src/components/table/models/ModelsTabs.jsx +++ b/web/src/components/table/models/ModelsTabs.jsx @@ -22,6 +22,7 @@ import { Tabs, TabPane, Tag, Button, Dropdown, Modal } from '@douyinfe/semi-ui'; import { IconEdit, IconDelete } from '@douyinfe/semi-icons'; import { getLobeHubIcon, showError, showSuccess } from '../../../helpers'; import { API } from '../../../helpers'; +import { useTranslation } from 'react-i18next'; const ModelsTabs = ({ activeVendorKey, @@ -36,8 +37,8 @@ const ModelsTabs = ({ setShowEditVendor, setEditingVendor, loadVendors, - t, }) => { + const { t } = useTranslation(); const handleTabChange = (key) => { setActiveVendorKey(key); setActivePage(1); diff --git a/web/src/components/table/models/components/SelectionNotification.jsx b/web/src/components/table/models/components/SelectionNotification.jsx index f2fc8d2efa..4a6ad38f5e 100644 --- a/web/src/components/table/models/components/SelectionNotification.jsx +++ b/web/src/components/table/models/components/SelectionNotification.jsx @@ -19,6 +19,7 @@ For commercial licensing, please contact support@quantumnous.com import React, { useEffect } from 'react'; import { Notification, Button, Space, Typography } from '@douyinfe/semi-ui'; +import { useTranslation } from 'react-i18next'; // 固定通知 ID,保持同一个实例即可避免闪烁 const NOTICE_ID = 'models-batch-actions'; @@ -30,12 +31,12 @@ const NOTICE_ID = 'models-batch-actions'; */ const SelectionNotification = ({ selectedKeys = [], - t, onDelete, onAddPrefill, onClear, onCopy, }) => { + const { t } = useTranslation(); // 根据选中数量决定显示/隐藏或更新通知 useEffect(() => { const selectedCount = selectedKeys.length; diff --git a/web/src/components/table/models/index.jsx b/web/src/components/table/models/index.jsx index 65ec7131a0..e098fdef84 100644 --- a/web/src/components/table/models/index.jsx +++ b/web/src/components/table/models/index.jsx @@ -30,11 +30,13 @@ import EditVendorModal from './modals/EditVendorModal'; import { useModelsData } from '../../../hooks/models/useModelsData'; import { useIsMobile } from '../../../hooks/common/useIsMobile'; import { createCardProPagination } from '../../../helpers/utils'; +import { useTranslation } from 'react-i18next'; const MARKETPLACE_DISPLAY_NOTICE_STORAGE_KEY = 'models_marketplace_display_notice_dismissed'; const ModelsPage = () => { + const { t } = useTranslation(); const modelsData = useModelsData(); const isMobile = useIsMobile(); @@ -71,9 +73,6 @@ const ModelsPage = () => { editingVendor, setEditingVendor, loadVendors, - - // Translation - t, } = modelsData; const [showMarketplaceDisplayNotice, setShowMarketplaceDisplayNotice] = @@ -197,9 +196,9 @@ const ModelsPage = () => { onPageChange: modelsData.handlePageChange, onPageSizeChange: modelsData.handlePageSizeChange, isMobile: isMobile, - t: modelsData.t, + t: t, })} - t={modelsData.t} + t={t} > diff --git a/web/src/components/table/models/modals/EditModelModal.jsx b/web/src/components/table/models/modals/EditModelModal.jsx index 12ca48ec1a..de3a4ae323 100644 --- a/web/src/components/table/models/modals/EditModelModal.jsx +++ b/web/src/components/table/models/modals/EditModelModal.jsx @@ -37,6 +37,7 @@ import { Save, X, FileText } from 'lucide-react'; import { IconAlertTriangle, IconLink } from '@douyinfe/semi-icons'; import { API, showError, showSuccess } from '../../../../helpers'; import { useTranslation } from 'react-i18next'; +import i18next from 'i18next'; import { useIsMobile } from '../../../../hooks/common/useIsMobile'; const { Text, Title } = Typography; @@ -53,10 +54,10 @@ const ENDPOINT_TEMPLATE = { }; const nameRuleOptions = [ - { label: '精确名称匹配', value: 0 }, - { label: '前缀名称匹配', value: 1 }, - { label: '包含名称匹配', value: 2 }, - { label: '后缀名称匹配', value: 3 }, + { label: i18next.t('精确名称匹配'), value: 0 }, + { label: i18next.t('前缀名称匹配'), value: 1 }, + { label: i18next.t('包含名称匹配'), value: 2 }, + { label: i18next.t('后缀名称匹配'), value: 3 }, ]; const EditModelModal = (props) => { diff --git a/web/src/components/table/models/modals/MissingModelsModal.jsx b/web/src/components/table/models/modals/MissingModelsModal.jsx index f8fa78fdd6..3250b2533a 100644 --- a/web/src/components/table/models/modals/MissingModelsModal.jsx +++ b/web/src/components/table/models/modals/MissingModelsModal.jsx @@ -35,8 +35,10 @@ import { IconSearch } from '@douyinfe/semi-icons'; import { API, showError } from '../../../../helpers'; import { MODEL_TABLE_PAGE_SIZE } from '../../../../constants'; import { useIsMobile } from '../../../../hooks/common/useIsMobile'; +import { useTranslation } from 'react-i18next'; -const MissingModelsModal = ({ visible, onClose, onConfigureModel, t }) => { +const MissingModelsModal = ({ visible, onClose, onConfigureModel }) => { + const { t } = useTranslation(); const [loading, setLoading] = useState(false); const [missingModels, setMissingModels] = useState([]); const [searchKeyword, setSearchKeyword] = useState(''); diff --git a/web/src/components/table/models/modals/SyncWizardModal.jsx b/web/src/components/table/models/modals/SyncWizardModal.jsx index 5b80952c99..6d51a113cc 100644 --- a/web/src/components/table/models/modals/SyncWizardModal.jsx +++ b/web/src/components/table/models/modals/SyncWizardModal.jsx @@ -20,8 +20,10 @@ For commercial licensing, please contact support@quantumnous.com import React, { useEffect, useState } from 'react'; import { Modal, RadioGroup, Radio, Steps, Button } from '@douyinfe/semi-ui'; import { useIsMobile } from '../../../../hooks/common/useIsMobile'; +import { useTranslation } from 'react-i18next'; -const SyncWizardModal = ({ visible, onClose, onConfirm, loading, t }) => { +const SyncWizardModal = ({ visible, onClose, onConfirm, loading }) => { + const { t } = useTranslation(); const [step, setStep] = useState(0); const [option, setOption] = useState('official'); const [locale, setLocale] = useState('zh-CN'); diff --git a/web/src/components/table/models/modals/UpstreamConflictModal.jsx b/web/src/components/table/models/modals/UpstreamConflictModal.jsx index 3993f6dc7a..6441944637 100644 --- a/web/src/components/table/models/modals/UpstreamConflictModal.jsx +++ b/web/src/components/table/models/modals/UpstreamConflictModal.jsx @@ -32,16 +32,18 @@ import { MousePointerClick } from 'lucide-react'; import { useIsMobile } from '../../../../hooks/common/useIsMobile'; import { MODEL_TABLE_PAGE_SIZE } from '../../../../constants'; import { IconSearch } from '@douyinfe/semi-icons'; +import i18next from 'i18next'; +import { useTranslation } from 'react-i18next'; const { Text } = Typography; const FIELD_LABELS = { - description: '描述', - icon: '图标', - tags: '标签', - vendor: '供应商', - name_rule: '命名规则', - status: '状态', + description: i18next.t('描述'), + icon: i18next.t('图标'), + tags: i18next.t('标签'), + vendor: i18next.t('供应商'), + name_rule: i18next.t('命名规则'), + status: i18next.t('状态'), }; const FIELD_KEYS = Object.keys(FIELD_LABELS); @@ -50,9 +52,9 @@ const UpstreamConflictModal = ({ onClose, conflicts = [], onSubmit, - t, loading = false, }) => { + const { t } = useTranslation(); const [selections, setSelections] = useState({}); const isMobile = useIsMobile(); const [currentPage, setCurrentPage] = useState(1); @@ -164,8 +166,7 @@ const UpstreamConflictModal = ({ ]; const cols = FIELD_KEYS.map((fieldKey) => { - const rawLabel = FIELD_LABELS[fieldKey] || fieldKey; - const label = t(rawLabel); + const label = FIELD_LABELS[fieldKey] || fieldKey; const { headerChecked, headerIndeterminate, hasAny } = getHeaderState(fieldKey); @@ -236,7 +237,6 @@ const UpstreamConflictModal = ({ return [...base, ...cols.filter(Boolean)]; }, [ - t, selections, filteredDataSource, getHeaderState, diff --git a/web/src/components/table/redemptions/RedemptionsActions.jsx b/web/src/components/table/redemptions/RedemptionsActions.jsx index f8133b0d52..dcd595ad5a 100644 --- a/web/src/components/table/redemptions/RedemptionsActions.jsx +++ b/web/src/components/table/redemptions/RedemptionsActions.jsx @@ -19,6 +19,7 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { Button } from '@douyinfe/semi-ui'; +import { useTranslation } from 'react-i18next'; const RedemptionsActions = ({ selectedKeys, @@ -26,8 +27,8 @@ const RedemptionsActions = ({ setShowEdit, batchCopyRedemptions, batchDeleteRedemptions, - t, }) => { + const { t } = useTranslation(); // Add new redemption code const handleAddRedemption = () => { setEditingRedemption({ diff --git a/web/src/components/table/redemptions/RedemptionsColumnDefs.jsx b/web/src/components/table/redemptions/RedemptionsColumnDefs.jsx index efe1114c52..44b428a0e1 100644 --- a/web/src/components/table/redemptions/RedemptionsColumnDefs.jsx +++ b/web/src/components/table/redemptions/RedemptionsColumnDefs.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; +import { t } from '../../../helpers/i18n'; import { Tag, Button, Space, Popover, Dropdown } from '@douyinfe/semi-ui'; import { IconMore } from '@douyinfe/semi-icons'; import { renderQuota, timestamp2string } from '../../../helpers'; @@ -48,7 +49,7 @@ const renderTimestamp = (timestamp) => { /** * Render redemption code status */ -const renderStatus = (status, record, t) => { +const renderStatus = (status, record) => { if (isExpired(record)) { return ( @@ -77,7 +78,6 @@ const renderStatus = (status, record, t) => { * Get redemption code table column definitions */ export const getRedemptionsColumns = ({ - t, manageRedemption, copyText, setEditingRedemption, @@ -101,7 +101,7 @@ export const getRedemptionsColumns = ({ dataIndex: 'status', key: 'status', render: (text, record) => { - return
{renderStatus(text, record, t)}
; + return
{renderStatus(text, record)}
; }, }, { diff --git a/web/src/components/table/redemptions/RedemptionsDescription.jsx b/web/src/components/table/redemptions/RedemptionsDescription.jsx index bf5af70708..5d2324b984 100644 --- a/web/src/components/table/redemptions/RedemptionsDescription.jsx +++ b/web/src/components/table/redemptions/RedemptionsDescription.jsx @@ -21,10 +21,12 @@ import React from 'react'; import { Typography } from '@douyinfe/semi-ui'; import { Ticket } from 'lucide-react'; import CompactModeToggle from '../../common/ui/CompactModeToggle'; +import { useTranslation } from 'react-i18next'; const { Text } = Typography; -const RedemptionsDescription = ({ compactMode, setCompactMode, t }) => { +const RedemptionsDescription = ({ compactMode, setCompactMode }) => { + const { t } = useTranslation(); return (
diff --git a/web/src/components/table/redemptions/RedemptionsFilters.jsx b/web/src/components/table/redemptions/RedemptionsFilters.jsx index 80e5512696..c72cc9e663 100644 --- a/web/src/components/table/redemptions/RedemptionsFilters.jsx +++ b/web/src/components/table/redemptions/RedemptionsFilters.jsx @@ -20,6 +20,7 @@ For commercial licensing, please contact support@quantumnous.com import React, { useRef } from 'react'; import { Form, Button } from '@douyinfe/semi-ui'; import { IconSearch } from '@douyinfe/semi-icons'; +import { useTranslation } from 'react-i18next'; const RedemptionsFilters = ({ formInitValues, @@ -27,8 +28,8 @@ const RedemptionsFilters = ({ searchRedemptions, loading, searching, - t, }) => { + const { t } = useTranslation(); // Handle form reset and immediate search const formApiRef = useRef(null); diff --git a/web/src/components/table/redemptions/RedemptionsTable.jsx b/web/src/components/table/redemptions/RedemptionsTable.jsx index f106b1fcd3..3bc2e8847f 100644 --- a/web/src/components/table/redemptions/RedemptionsTable.jsx +++ b/web/src/components/table/redemptions/RedemptionsTable.jsx @@ -26,8 +26,10 @@ import { } from '@douyinfe/semi-illustrations'; import { getRedemptionsColumns, isExpired } from './RedemptionsColumnDefs'; import DeleteRedemptionModal from './modals/DeleteRedemptionModal'; +import { useTranslation } from 'react-i18next'; const RedemptionsTable = (redemptionsData) => { + const { t } = useTranslation(); const { redemptions, loading, @@ -43,7 +45,6 @@ const RedemptionsTable = (redemptionsData) => { setEditingRedemption, setShowEdit, refresh, - t, } = redemptionsData; // Modal states @@ -59,7 +60,6 @@ const RedemptionsTable = (redemptionsData) => { // Get all columns const columns = useMemo(() => { return getRedemptionsColumns({ - t, manageRedemption, copyText, setEditingRedemption, @@ -70,7 +70,6 @@ const RedemptionsTable = (redemptionsData) => { showDeleteRedemptionModal, }); }, [ - t, manageRedemption, copyText, setEditingRedemption, diff --git a/web/src/components/table/redemptions/index.jsx b/web/src/components/table/redemptions/index.jsx index aa2ce52ebf..7d03bca20e 100644 --- a/web/src/components/table/redemptions/index.jsx +++ b/web/src/components/table/redemptions/index.jsx @@ -27,8 +27,10 @@ import EditRedemptionModal from './modals/EditRedemptionModal'; import { useRedemptionsData } from '../../../hooks/redemptions/useRedemptionsData'; import { useIsMobile } from '../../../hooks/common/useIsMobile'; import { createCardProPagination } from '../../../helpers/utils'; +import { useTranslation } from 'react-i18next'; const RedemptionsPage = () => { + const { t } = useTranslation(); const redemptionsData = useRedemptionsData(); const isMobile = useIsMobile(); @@ -56,9 +58,6 @@ const RedemptionsPage = () => { // UI state compactMode, setCompactMode, - - // Translation - t, } = redemptionsData; return ( @@ -109,9 +108,9 @@ const RedemptionsPage = () => { onPageChange: redemptionsData.handlePageChange, onPageSizeChange: redemptionsData.handlePageSizeChange, isMobile: isMobile, - t: redemptionsData.t, + t: t, })} - t={redemptionsData.t} + t={t} > diff --git a/web/src/components/table/subscriptions/SubscriptionsActions.jsx b/web/src/components/table/subscriptions/SubscriptionsActions.jsx index 3d3296250e..5afe9acc05 100644 --- a/web/src/components/table/subscriptions/SubscriptionsActions.jsx +++ b/web/src/components/table/subscriptions/SubscriptionsActions.jsx @@ -19,8 +19,10 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { Button } from '@douyinfe/semi-ui'; +import { useTranslation } from 'react-i18next'; -const SubscriptionsActions = ({ openCreate, t }) => { +const SubscriptionsActions = ({ openCreate }) => { + const { t } = useTranslation(); return (
); @@ -133,7 +134,7 @@ const renderPrice = (text) => { ); }; -const renderPurchaseLimit = (text, record, t) => { +const renderPurchaseLimit = (text, record) => { const limit = Number(record?.plan?.max_purchase_per_user || 0); return ( 0 ? 'secondary' : 'tertiary'}> @@ -142,11 +143,11 @@ const renderPurchaseLimit = (text, record, t) => { ); }; -const renderDuration = (text, record, t) => { - return {formatDuration(record?.plan, t)}; +const renderDuration = (text, record) => { + return {formatDuration(record?.plan)}; }; -const renderEnabled = (text, record, t) => { +const renderEnabled = (text, record) => { return text ? ( { ); }; -const renderTotalAmount = (text, record, t) => { +const renderTotalAmount = (text, record) => { const total = Number(record?.plan?.total_amount || 0); return ( 0 ? 'secondary' : 'tertiary'}> @@ -183,7 +184,7 @@ const renderTotalAmount = (text, record, t) => { ); }; -const renderUpgradeGroup = (text, record, t) => { +const renderUpgradeGroup = (text, record) => { const group = record?.plan?.upgrade_group || ''; return ( @@ -192,17 +193,17 @@ const renderUpgradeGroup = (text, record, t) => { ); }; -const renderResetPeriod = (text, record, t) => { +const renderResetPeriod = (text, record) => { const period = record?.plan?.quota_reset_period || 'never'; const isNever = period === 'never'; return ( - {formatResetPeriod(record?.plan, t)} + {formatResetPeriod(record?.plan)} ); }; -const renderPaymentConfig = (text, record, t, enableEpay) => { +const renderPaymentConfig = (text, record, enableEpay) => { const hasStripe = !!record?.plan?.stripe_price_id; const hasCreem = !!record?.plan?.creem_product_id; const hasEpay = !!enableEpay; @@ -228,7 +229,7 @@ const renderPaymentConfig = (text, record, t, enableEpay) => { ); }; -const renderOperations = (text, record, { openEdit, setPlanEnabled, t }) => { +const renderOperations = (text, record, { openEdit, setPlanEnabled }) => { const isEnabled = record?.plan?.enabled; const handleToggle = () => { @@ -278,7 +279,6 @@ const renderOperations = (text, record, { openEdit, setPlanEnabled, t }) => { }; export const getSubscriptionsColumns = ({ - t, openEdit, setPlanEnabled, enableEpay, @@ -294,7 +294,7 @@ export const getSubscriptionsColumns = ({ title: t('套餐'), dataIndex: ['plan', 'title'], width: 200, - render: (text, record) => renderPlanTitle(text, record, t), + render: (text, record) => renderPlanTitle(text, record), }, { title: t('价格'), @@ -305,7 +305,7 @@ export const getSubscriptionsColumns = ({ { title: t('购买上限'), width: 90, - render: (text, record) => renderPurchaseLimit(text, record, t), + render: (text, record) => renderPurchaseLimit(text, record), }, { title: t('优先级'), @@ -316,34 +316,33 @@ export const getSubscriptionsColumns = ({ { title: t('有效期'), width: 100, - render: (text, record) => renderDuration(text, record, t), + render: (text, record) => renderDuration(text, record), }, { title: t('重置'), width: 80, - render: (text, record) => renderResetPeriod(text, record, t), + render: (text, record) => renderResetPeriod(text, record), }, { title: t('状态'), dataIndex: ['plan', 'enabled'], width: 80, - render: (text, record) => renderEnabled(text, record, t), + render: (text, record) => renderEnabled(text, record), }, { title: t('支付渠道'), width: 180, - render: (text, record) => - renderPaymentConfig(text, record, t, enableEpay), + render: (text, record) => renderPaymentConfig(text, record, enableEpay), }, { title: t('总额度'), width: 100, - render: (text, record) => renderTotalAmount(text, record, t), + render: (text, record) => renderTotalAmount(text, record), }, { title: t('升级分组'), width: 100, - render: (text, record) => renderUpgradeGroup(text, record, t), + render: (text, record) => renderUpgradeGroup(text, record), }, { title: t('操作'), @@ -351,7 +350,7 @@ export const getSubscriptionsColumns = ({ fixed: 'right', width: 160, render: (text, record) => - renderOperations(text, record, { openEdit, setPlanEnabled, t }), + renderOperations(text, record, { openEdit, setPlanEnabled }), }, ]; }; diff --git a/web/src/components/table/subscriptions/SubscriptionsDescription.jsx b/web/src/components/table/subscriptions/SubscriptionsDescription.jsx index a2d2c73b85..2190d9e740 100644 --- a/web/src/components/table/subscriptions/SubscriptionsDescription.jsx +++ b/web/src/components/table/subscriptions/SubscriptionsDescription.jsx @@ -21,10 +21,12 @@ import React from 'react'; import { Typography } from '@douyinfe/semi-ui'; import { CalendarClock } from 'lucide-react'; import CompactModeToggle from '../../common/ui/CompactModeToggle'; +import { useTranslation } from 'react-i18next'; const { Text } = Typography; -const SubscriptionsDescription = ({ compactMode, setCompactMode, t }) => { +const SubscriptionsDescription = ({ compactMode, setCompactMode }) => { + const { t } = useTranslation(); return (
diff --git a/web/src/components/table/subscriptions/SubscriptionsTable.jsx b/web/src/components/table/subscriptions/SubscriptionsTable.jsx index 4892f66caa..de0f7174d1 100644 --- a/web/src/components/table/subscriptions/SubscriptionsTable.jsx +++ b/web/src/components/table/subscriptions/SubscriptionsTable.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React, { useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; import { Empty } from '@douyinfe/semi-ui'; import CardTable from '../../common/ui/CardTable'; import { @@ -27,24 +28,17 @@ import { import { getSubscriptionsColumns } from './SubscriptionsColumnDefs'; const SubscriptionsTable = (subscriptionsData) => { - const { - plans, - loading, - compactMode, - openEdit, - setPlanEnabled, - t, - enableEpay, - } = subscriptionsData; + const { t } = useTranslation(); + const { plans, loading, compactMode, openEdit, setPlanEnabled, enableEpay } = + subscriptionsData; const columns = useMemo(() => { return getSubscriptionsColumns({ - t, openEdit, setPlanEnabled, enableEpay, }); - }, [t, openEdit, setPlanEnabled, enableEpay]); + }, [openEdit, setPlanEnabled, enableEpay]); const tableColumns = useMemo(() => { return compactMode diff --git a/web/src/components/table/subscriptions/index.jsx b/web/src/components/table/subscriptions/index.jsx index 865044826f..b2d6d57f45 100644 --- a/web/src/components/table/subscriptions/index.jsx +++ b/web/src/components/table/subscriptions/index.jsx @@ -28,8 +28,10 @@ import { useSubscriptionsData } from '../../../hooks/subscriptions/useSubscripti import { useIsMobile } from '../../../hooks/common/useIsMobile'; import { createCardProPagination } from '../../../helpers/utils'; import { StatusContext } from '../../../context/Status'; +import { useTranslation } from 'react-i18next'; const SubscriptionsPage = () => { + const { t } = useTranslation(); const subscriptionsData = useSubscriptionsData(); const isMobile = useIsMobile(); const [statusState] = useContext(StatusContext); @@ -44,7 +46,6 @@ const SubscriptionsPage = () => { openCreate, compactMode, setCompactMode, - t, } = subscriptionsData; return ( @@ -90,7 +91,7 @@ const SubscriptionsPage = () => { onPageChange: subscriptionsData.handlePageChange, onPageSizeChange: subscriptionsData.handlePageSizeChange, isMobile, - t: subscriptionsData.t, + t: t, })} t={t} > diff --git a/web/src/components/table/subscriptions/modals/AddEditSubscriptionModal.jsx b/web/src/components/table/subscriptions/modals/AddEditSubscriptionModal.jsx index 73aef7317a..04c2ef4d5b 100644 --- a/web/src/components/table/subscriptions/modals/AddEditSubscriptionModal.jsx +++ b/web/src/components/table/subscriptions/modals/AddEditSubscriptionModal.jsx @@ -18,6 +18,8 @@ For commercial licensing, please contact support@quantumnous.com */ import React, { useEffect, useState, useRef } from 'react'; +import { useTranslation } from 'react-i18next'; +import { t as i18nT } from '../../../../helpers/i18n'; import { Avatar, Button, @@ -48,20 +50,20 @@ import { useIsMobile } from '../../../../hooks/common/useIsMobile'; const { Text, Title } = Typography; -const durationUnitOptions = [ - { value: 'year', label: '年' }, - { value: 'month', label: '月' }, - { value: 'day', label: '日' }, - { value: 'hour', label: '小时' }, - { value: 'custom', label: '自定义(秒)' }, +const getDurationUnitOptions = () => [ + { value: 'year', label: i18nT('年') }, + { value: 'month', label: i18nT('月') }, + { value: 'day', label: i18nT('日') }, + { value: 'hour', label: i18nT('小时') }, + { value: 'custom', label: i18nT('自定义(秒)') }, ]; -const resetPeriodOptions = [ - { value: 'never', label: '不重置' }, - { value: 'daily', label: '每天' }, - { value: 'weekly', label: '每周' }, - { value: 'monthly', label: '每月' }, - { value: 'custom', label: '自定义(秒)' }, +const getResetPeriodOptions = () => [ + { value: 'never', label: i18nT('不重置') }, + { value: 'daily', label: i18nT('每天') }, + { value: 'weekly', label: i18nT('每周') }, + { value: 'monthly', label: i18nT('每月') }, + { value: 'custom', label: i18nT('自定义(秒)') }, ]; const AddEditSubscriptionModal = ({ @@ -70,8 +72,8 @@ const AddEditSubscriptionModal = ({ editingPlan, placement = 'left', refresh, - t, }) => { + const { t } = useTranslation(); const [loading, setLoading] = useState(false); const [groupOptions, setGroupOptions] = useState([]); const [groupLoading, setGroupLoading] = useState(false); @@ -409,7 +411,7 @@ const AddEditSubscriptionModal = ({ required rules={[{ required: true }]} > - {durationUnitOptions.map((o) => ( + {getDurationUnitOptions().map((o) => ( {o.label} @@ -469,7 +471,7 @@ const AddEditSubscriptionModal = ({ field='quota_reset_period' label={t('重置周期')} > - {resetPeriodOptions.map((o) => ( + {getResetPeriodOptions().map((o) => ( {o.label} diff --git a/web/src/components/table/task-logs/TaskLogsActions.jsx b/web/src/components/table/task-logs/TaskLogsActions.jsx index fd1d2b3ff0..ee5a2607f0 100644 --- a/web/src/components/table/task-logs/TaskLogsActions.jsx +++ b/web/src/components/table/task-logs/TaskLogsActions.jsx @@ -21,10 +21,12 @@ import React from 'react'; import { Typography } from '@douyinfe/semi-ui'; import { IconEyeOpened } from '@douyinfe/semi-icons'; import CompactModeToggle from '../../common/ui/CompactModeToggle'; +import { useTranslation } from 'react-i18next'; const { Text } = Typography; -const TaskLogsActions = ({ compactMode, setCompactMode, t }) => { +const TaskLogsActions = ({ compactMode, setCompactMode }) => { + const { t } = useTranslation(); return (
diff --git a/web/src/components/table/task-logs/TaskLogsColumnDefs.jsx b/web/src/components/table/task-logs/TaskLogsColumnDefs.jsx index 4097545e5e..5260d6e2a5 100644 --- a/web/src/components/table/task-logs/TaskLogsColumnDefs.jsx +++ b/web/src/components/table/task-logs/TaskLogsColumnDefs.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; +import { t } from '../../../helpers/i18n'; import { Progress, Tag, Tooltip, Typography } from '@douyinfe/semi-ui'; import { Music, @@ -90,7 +91,7 @@ function renderDuration(submit_time, finishTime) { ); } -const renderType = (type, t) => { +const renderType = (type) => { switch (type) { case 'MUSIC': return ( @@ -143,7 +144,7 @@ const renderType = (type, t) => { } }; -const renderPlatform = (platform, t) => { +const renderPlatform = (platform) => { let option = CHANNEL_OPTIONS.find( (opt) => String(opt.value) === String(platform), ); @@ -170,7 +171,7 @@ const renderPlatform = (platform, t) => { } }; -const renderStatus = (type, t) => { +const renderStatus = (type) => { switch (type) { case 'SUCCESS': return ( @@ -234,7 +235,6 @@ const renderStatus = (type, t) => { }; export const getTaskLogsColumns = ({ - t, COLUMN_KEYS, copyText, openContentModal, @@ -301,15 +301,10 @@ export const getTaskLogsColumns = ({ const displayText = String(record.username || userId || '?'); return ( - + {displayText.slice(0, 1)} - - {displayText} - + {displayText} ); }, @@ -319,7 +314,7 @@ export const getTaskLogsColumns = ({ title: t('平台'), dataIndex: 'platform', render: (text, record, index) => { - return
{renderPlatform(text, t)}
; + return
{renderPlatform(text)}
; }, }, { @@ -327,7 +322,7 @@ export const getTaskLogsColumns = ({ title: t('类型'), dataIndex: 'action', render: (text, record, index) => { - return
{renderType(text, t)}
; + return
{renderType(text)}
; }, }, { @@ -352,7 +347,7 @@ export const getTaskLogsColumns = ({ title: t('任务状态'), dataIndex: 'status', render: (text, record, index) => { - return
{renderStatus(text, t)}
; + return
{renderStatus(text)}
; }, }, { @@ -416,7 +411,8 @@ export const getTaskLogsColumns = ({ record.action === TASK_ACTION_REMIX_GENERATE; const isSuccess = record.status === 'SUCCESS'; const resultUrl = record.result_url; - const hasResultUrl = typeof resultUrl === 'string' && /^https?:\/\//.test(resultUrl); + const hasResultUrl = + typeof resultUrl === 'string' && /^https?:\/\//.test(resultUrl); if (isSuccess && isVideoTask && hasResultUrl) { return ( { + const { t } = useTranslation(); return ( { + const { t } = useTranslation(); const { logs, loading, @@ -43,14 +45,12 @@ const TaskLogsTable = (taskLogsData) => { openAudioModal, showUserInfoFunc, isAdminUser, - t, COLUMN_KEYS, } = taskLogsData; // Get all columns const allColumns = useMemo(() => { return getTaskLogsColumns({ - t, COLUMN_KEYS, copyText, openContentModal, @@ -59,7 +59,15 @@ const TaskLogsTable = (taskLogsData) => { showUserInfoFunc, isAdminUser, }); - }, [t, COLUMN_KEYS, copyText, openContentModal, openVideoModal, openAudioModal, showUserInfoFunc, isAdminUser]); + }, [ + COLUMN_KEYS, + copyText, + openContentModal, + openVideoModal, + openAudioModal, + showUserInfoFunc, + isAdminUser, + ]); // Filter columns based on visibility settings const getVisibleColumns = () => { diff --git a/web/src/components/table/task-logs/index.jsx b/web/src/components/table/task-logs/index.jsx index 07c387123a..bd3aed99ef 100644 --- a/web/src/components/table/task-logs/index.jsx +++ b/web/src/components/table/task-logs/index.jsx @@ -29,8 +29,10 @@ import AudioPreviewModal from './modals/AudioPreviewModal'; import { useTaskLogsData } from '../../../hooks/task-logs/useTaskLogsData'; import { useIsMobile } from '../../../hooks/common/useIsMobile'; import { createCardProPagination } from '../../../helpers/utils'; +import { useTranslation } from 'react-i18next'; const TaskLogsPage = () => { + const { t } = useTranslation(); const taskLogsData = useTaskLogsData(); const isMobile = useIsMobile(); @@ -64,9 +66,9 @@ const TaskLogsPage = () => { onPageChange: taskLogsData.handlePageChange, onPageSizeChange: taskLogsData.handlePageSizeChange, isMobile: isMobile, - t: taskLogsData.t, + t: t, })} - t={taskLogsData.t} + t={t} > diff --git a/web/src/components/table/task-logs/modals/AudioPreviewModal.jsx b/web/src/components/table/task-logs/modals/AudioPreviewModal.jsx index 0b2cada198..18e8532e6b 100644 --- a/web/src/components/table/task-logs/modals/AudioPreviewModal.jsx +++ b/web/src/components/table/task-logs/modals/AudioPreviewModal.jsx @@ -82,7 +82,11 @@ const AudioClipCard = ({ clip }) => { marginBottom: '4px', }} > - + {title} {duration > 0 && ( diff --git a/web/src/components/table/task-logs/modals/ColumnSelectorModal.jsx b/web/src/components/table/task-logs/modals/ColumnSelectorModal.jsx index 4f2af11004..a1d3e95d6b 100644 --- a/web/src/components/table/task-logs/modals/ColumnSelectorModal.jsx +++ b/web/src/components/table/task-logs/modals/ColumnSelectorModal.jsx @@ -20,6 +20,7 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { Modal, Button, Checkbox } from '@douyinfe/semi-ui'; import { getTaskLogsColumns } from '../TaskLogsColumnDefs'; +import { useTranslation } from 'react-i18next'; const ColumnSelectorModal = ({ showColumnSelector, @@ -32,11 +33,10 @@ const ColumnSelectorModal = ({ isAdminUser, copyText, openContentModal, - t, }) => { + const { t } = useTranslation(); // Get all columns for display in selector const allColumns = getTaskLogsColumns({ - t, COLUMN_KEYS, copyText, openContentModal, diff --git a/web/src/components/table/tokens/TokensActions.jsx b/web/src/components/table/tokens/TokensActions.jsx index 2fbb2fce29..88ee2f78c7 100644 --- a/web/src/components/table/tokens/TokensActions.jsx +++ b/web/src/components/table/tokens/TokensActions.jsx @@ -22,6 +22,7 @@ import { Button, Space } from '@douyinfe/semi-ui'; import { showError } from '../../../helpers'; import CopyTokensModal from './modals/CopyTokensModal'; import DeleteTokensModal from './modals/DeleteTokensModal'; +import { useTranslation } from 'react-i18next'; const TokensActions = ({ selectedKeys, @@ -30,8 +31,8 @@ const TokensActions = ({ batchCopyTokens, batchDeleteTokens, copyText, - t, }) => { + const { t } = useTranslation(); // Modal states const [showCopyModal, setShowCopyModal] = useState(false); const [showDeleteModal, setShowDeleteModal] = useState(false); diff --git a/web/src/components/table/tokens/TokensColumnDefs.jsx b/web/src/components/table/tokens/TokensColumnDefs.jsx index ce8eab807e..1dbadc372a 100644 --- a/web/src/components/table/tokens/TokensColumnDefs.jsx +++ b/web/src/components/table/tokens/TokensColumnDefs.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; +import { t } from '../../../helpers/i18n'; import { Button, Dropdown, @@ -61,7 +62,7 @@ function renderTimestamp(timestamp) { } // Render status column only (no usage) -const renderStatus = (text, record, t) => { +const renderStatus = (text, record) => { const enabled = text === 1; let tagColor = 'black'; @@ -88,7 +89,7 @@ const renderStatus = (text, record, t) => { }; // Render group column -const renderGroupColumn = (text, record, t) => { +const renderGroupColumn = (text, record) => { if (text === 'auto') { return ( { }; // Render model limits column -const renderModelLimits = (text, record, t) => { +const renderModelLimits = (text, record) => { if (record.model_limits_enabled && text) { const models = text.split(',').filter(Boolean); - const categories = getModelCategories(t); + const categories = getModelCategories(); const vendorAvatars = []; const matchedModels = new Set(); @@ -213,7 +214,7 @@ const renderModelLimits = (text, record, t) => { }; // Render IP restrictions column -const renderAllowIps = (text, t) => { +const renderAllowIps = (text) => { if (!text || text.trim() === '') { return ( @@ -253,7 +254,7 @@ const renderAllowIps = (text, t) => { }; // Render separate quota usage column -const renderQuotaUsage = (text, record, t) => { +const renderQuotaUsage = (text, record) => { const { Paragraph } = Typography; const used = parseInt(record.used_quota) || 0; const remain = parseInt(record.remain_quota) || 0; @@ -315,7 +316,6 @@ const renderOperations = ( setShowEdit, manageToken, refresh, - t, ) => { let chatsArray = []; try { @@ -425,7 +425,6 @@ const renderOperations = ( }; export const getTokensColumns = ({ - t, showKeys, setShowKeys, copyText, @@ -444,18 +443,18 @@ export const getTokensColumns = ({ title: t('状态'), dataIndex: 'status', key: 'status', - render: (text, record) => renderStatus(text, record, t), + render: (text, record) => renderStatus(text, record), }, { title: t('剩余额度/总额度'), key: 'quota_usage', - render: (text, record) => renderQuotaUsage(text, record, t), + render: (text, record) => renderQuotaUsage(text, record), }, { title: t('分组'), dataIndex: 'group', key: 'group', - render: (text, record) => renderGroupColumn(text, record, t), + render: (text, record) => renderGroupColumn(text, record), }, { title: t('密钥'), @@ -466,12 +465,12 @@ export const getTokensColumns = ({ { title: t('可用模型'), dataIndex: 'model_limits', - render: (text, record) => renderModelLimits(text, record, t), + render: (text, record) => renderModelLimits(text, record), }, { title: t('IP限制'), dataIndex: 'allow_ips', - render: (text) => renderAllowIps(text, t), + render: (text) => renderAllowIps(text), }, { title: t('创建时间'), @@ -504,7 +503,6 @@ export const getTokensColumns = ({ setShowEdit, manageToken, refresh, - t, ), }, ]; diff --git a/web/src/components/table/tokens/TokensDescription.jsx b/web/src/components/table/tokens/TokensDescription.jsx index 14baaa8082..daae26246f 100644 --- a/web/src/components/table/tokens/TokensDescription.jsx +++ b/web/src/components/table/tokens/TokensDescription.jsx @@ -21,10 +21,12 @@ import React from 'react'; import { Typography } from '@douyinfe/semi-ui'; import { Key } from 'lucide-react'; import CompactModeToggle from '../../common/ui/CompactModeToggle'; +import { useTranslation } from 'react-i18next'; const { Text } = Typography; -const TokensDescription = ({ compactMode, setCompactMode, t }) => { +const TokensDescription = ({ compactMode, setCompactMode }) => { + const { t } = useTranslation(); return (
diff --git a/web/src/components/table/tokens/TokensFilters.jsx b/web/src/components/table/tokens/TokensFilters.jsx index c6841554b4..b53bbe0863 100644 --- a/web/src/components/table/tokens/TokensFilters.jsx +++ b/web/src/components/table/tokens/TokensFilters.jsx @@ -20,6 +20,7 @@ For commercial licensing, please contact support@quantumnous.com import React, { useRef } from 'react'; import { Form, Button } from '@douyinfe/semi-ui'; import { IconSearch } from '@douyinfe/semi-icons'; +import { useTranslation } from 'react-i18next'; const TokensFilters = ({ formInitValues, @@ -27,8 +28,8 @@ const TokensFilters = ({ searchTokens, loading, searching, - t, }) => { + const { t } = useTranslation(); // Handle form reset and immediate search const formApiRef = useRef(null); diff --git a/web/src/components/table/tokens/TokensTable.jsx b/web/src/components/table/tokens/TokensTable.jsx index eab5707cda..5fc6fa8d49 100644 --- a/web/src/components/table/tokens/TokensTable.jsx +++ b/web/src/components/table/tokens/TokensTable.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React, { useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; import { Empty } from '@douyinfe/semi-ui'; import CardTable from '../../common/ui/CardTable'; import { @@ -27,6 +28,7 @@ import { import { getTokensColumns } from './TokensColumnDefs'; const TokensTable = (tokensData) => { + const { t } = useTranslation(); const { tokens, loading, @@ -46,13 +48,11 @@ const TokensTable = (tokensData) => { setEditingToken, setShowEdit, refresh, - t, } = tokensData; // Get all columns const columns = useMemo(() => { return getTokensColumns({ - t, showKeys, setShowKeys, copyText, @@ -63,7 +63,6 @@ const TokensTable = (tokensData) => { refresh, }); }, [ - t, showKeys, setShowKeys, copyText, diff --git a/web/src/components/table/tokens/index.jsx b/web/src/components/table/tokens/index.jsx index f6194a35a3..4204e2e5a6 100644 --- a/web/src/components/table/tokens/index.jsx +++ b/web/src/components/table/tokens/index.jsx @@ -41,8 +41,10 @@ import EditTokenModal from './modals/EditTokenModal'; import { useTokensData } from '../../../hooks/tokens/useTokensData'; import { useIsMobile } from '../../../hooks/common/useIsMobile'; import { createCardProPagination } from '../../../helpers/utils'; +import { useTranslation } from 'react-i18next'; function TokensPage() { + const { t } = useTranslation(); // Define the function first, then pass it into the hook to avoid TDZ errors const openFluentNotificationRef = useRef(null); const tokensData = useTokensData((key) => @@ -66,14 +68,14 @@ function TokensPage() { latestRef.current = { tokens: tokensData.tokens, selectedKeys: tokensData.selectedKeys, - t: tokensData.t, + t: t, selectedModel, prefillKey, }; }, [ tokensData.tokens, tokensData.selectedKeys, - tokensData.t, + t, selectedModel, prefillKey, ]); @@ -83,7 +85,7 @@ function TokensPage() { const res = await API.get('/api/user/models'); const { success, message, data } = res.data || {}; if (success) { - const categories = getModelCategories(tokensData.t); + const categories = getModelCategories(); const options = (data || []).map((model) => { let icon = null; for (const [key, category] of Object.entries(categories)) { @@ -104,7 +106,7 @@ function TokensPage() { }); setModelOptions(options); } else { - showError(tokensData.t(message)); + showError(t(message)); } } catch (e) { showError(e.message || 'Failed to load models'); @@ -268,7 +270,7 @@ function TokensPage() { openFluentNotification(); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [modelOptions, selectedModel, tokensData.t, fluentNoticeOpen]); + }, [modelOptions, selectedModel, t, fluentNoticeOpen]); useEffect(() => { const selector = '#fluent-new-api-container'; @@ -349,9 +351,6 @@ function TokensPage() { // Description state compactMode, setCompactMode, - - // Translation - t, } = tokensData; return ( @@ -403,9 +402,9 @@ function TokensPage() { onPageChange: tokensData.handlePageChange, onPageSizeChange: tokensData.handlePageSizeChange, isMobile: isMobile, - t: tokensData.t, + t: t, })} - t={tokensData.t} + t={t} > diff --git a/web/src/components/table/tokens/modals/CopyTokensModal.jsx b/web/src/components/table/tokens/modals/CopyTokensModal.jsx index 09f37efea2..df5b642398 100644 --- a/web/src/components/table/tokens/modals/CopyTokensModal.jsx +++ b/web/src/components/table/tokens/modals/CopyTokensModal.jsx @@ -19,8 +19,10 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { Modal, Button, Space } from '@douyinfe/semi-ui'; +import { useTranslation } from 'react-i18next'; -const CopyTokensModal = ({ visible, onCancel, selectedKeys, copyText, t }) => { +const CopyTokensModal = ({ visible, onCancel, selectedKeys, copyText }) => { + const { t } = useTranslation(); // Handle copy with name and key format const handleCopyWithName = async () => { let content = ''; diff --git a/web/src/components/table/tokens/modals/DeleteTokensModal.jsx b/web/src/components/table/tokens/modals/DeleteTokensModal.jsx index 21b04223f4..40dca62e0d 100644 --- a/web/src/components/table/tokens/modals/DeleteTokensModal.jsx +++ b/web/src/components/table/tokens/modals/DeleteTokensModal.jsx @@ -19,14 +19,15 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { Modal } from '@douyinfe/semi-ui'; +import { useTranslation } from 'react-i18next'; const DeleteTokensModal = ({ visible, onCancel, onConfirm, selectedKeys, - t, }) => { + const { t } = useTranslation(); return ( { let res = await API.get(`/api/user/models`); const { success, message, data } = res.data; if (success) { - const categories = getModelCategories(t); + const categories = getModelCategories(); let localModelOptions = data.map((model) => { let icon = null; for (const [key, category] of Object.entries(categories)) { diff --git a/web/src/components/table/usage-logs/UsageLogsActions.jsx b/web/src/components/table/usage-logs/UsageLogsActions.jsx index d921483ed2..318ca580c0 100644 --- a/web/src/components/table/usage-logs/UsageLogsActions.jsx +++ b/web/src/components/table/usage-logs/UsageLogsActions.jsx @@ -22,6 +22,7 @@ import { Tag, Space, Skeleton } from '@douyinfe/semi-ui'; import { renderQuota } from '../../../helpers'; import CompactModeToggle from '../../common/ui/CompactModeToggle'; import { useMinimumLoadingTime } from '../../../hooks/common/useMinimumLoadingTime'; +import { useTranslation } from 'react-i18next'; const LogsActions = ({ stat, @@ -29,8 +30,8 @@ const LogsActions = ({ showStat, compactMode, setCompactMode, - t, }) => { + const { t } = useTranslation(); const showSkeleton = useMinimumLoadingTime(loadingStat); const needSkeleton = !showStat || showSkeleton; diff --git a/web/src/components/table/usage-logs/UsageLogsColumnDefs.jsx b/web/src/components/table/usage-logs/UsageLogsColumnDefs.jsx index b1538877a5..f4c7e5878c 100644 --- a/web/src/components/table/usage-logs/UsageLogsColumnDefs.jsx +++ b/web/src/components/table/usage-logs/UsageLogsColumnDefs.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; +import { t } from '../../../helpers/i18n'; import { Avatar, Space, @@ -25,7 +26,7 @@ import { Tooltip, Popover, Typography, - Button + Button, } from '@douyinfe/semi-ui'; import { timestamp2string, @@ -72,7 +73,7 @@ function formatRatio(ratio) { return String(ratio); } -function buildChannelAffinityTooltip(affinity, t) { +function buildChannelAffinityTooltip(affinity) { if (!affinity) { return null; } @@ -101,7 +102,7 @@ function buildChannelAffinityTooltip(affinity, t) { } // Render functions -function renderType(type, t) { +function renderType(type) { switch (type) { case 1: return ( @@ -148,7 +149,7 @@ function renderType(type, t) { } } -function renderIsStream(bool, t) { +function renderIsStream(bool) { if (bool) { return ( @@ -164,7 +165,7 @@ function renderIsStream(bool, t) { } } -function renderUseTime(type, t) { +function renderUseTime(type) { const time = parseInt(type); if (time < 101) { return ( @@ -190,7 +191,7 @@ function renderUseTime(type, t) { } } -function renderFirstUseTime(type, t) { +function renderFirstUseTime(type) { let time = parseFloat(type) / 1000.0; time = time.toFixed(1); if (time < 3) { @@ -217,7 +218,7 @@ function renderFirstUseTime(type, t) { } } -function renderBillingTag(record, t) { +function renderBillingTag(record) { const other = getLogOther(record.other); if (other?.billing_source === 'subscription') { return ( @@ -229,7 +230,7 @@ function renderBillingTag(record, t) { return null; } -function renderModelName(record, copyText, t) { +function renderModelName(record, copyText) { let other = getLogOther(record.other); let modelMapped = other?.is_model_mapped && @@ -331,7 +332,6 @@ function getPromptCacheSummary(other) { } export const getLogsColumns = ({ - t, COLUMN_KEYS, copyText, showUserInfoFunc, @@ -374,7 +374,10 @@ export const getLogsColumns = ({ } return isAdminUser && - (record.type === 0 || record.type === 2 || record.type === 5 || record.type === 6) ? ( + (record.type === 0 || + record.type === 2 || + record.type === 5 || + record.type === 6) ? ( @@ -394,7 +397,7 @@ export const getLogsColumns = ({
{content}
{affinity ? (
- {buildChannelAffinityTooltip(affinity, t)} + {buildChannelAffinityTooltip(affinity)}
) : null}
@@ -465,7 +468,10 @@ export const getLogsColumns = ({ title: t('令牌'), dataIndex: 'token_name', render: (text, record, index) => { - return record.type === 0 || record.type === 2 || record.type === 5 || record.type === 6 ? ( + return record.type === 0 || + record.type === 2 || + record.type === 5 || + record.type === 6 ? (
{ - if (record.type === 0 || record.type === 2 || record.type === 5 || record.type === 6) { + if ( + record.type === 0 || + record.type === 2 || + record.type === 5 || + record.type === 6 + ) { if (record.group) { return <>{renderGroup(record.group)}; } else { @@ -520,7 +531,7 @@ export const getLogsColumns = ({ title: t('类型'), dataIndex: 'type', render: (text, record, index) => { - return <>{renderType(text, t)}; + return <>{renderType(text)}; }, }, { @@ -528,8 +539,11 @@ export const getLogsColumns = ({ title: t('模型'), dataIndex: 'model_name', render: (text, record, index) => { - return record.type === 0 || record.type === 2 || record.type === 5 || record.type === 6 ? ( - <>{renderModelName(record, copyText, t)} + return record.type === 0 || + record.type === 2 || + record.type === 5 || + record.type === 6 ? ( + <>{renderModelName(record, copyText)} ) : ( <> ); @@ -548,9 +562,9 @@ export const getLogsColumns = ({ return ( <> - {renderUseTime(text, t)} - {renderFirstUseTime(other?.frt, t)} - {renderIsStream(record.is_stream, t)} + {renderUseTime(text)} + {renderFirstUseTime(other?.frt)} + {renderIsStream(record.is_stream)} ); @@ -558,8 +572,8 @@ export const getLogsColumns = ({ return ( <> - {renderUseTime(text, t)} - {renderIsStream(record.is_stream, t)} + {renderUseTime(text)} + {renderIsStream(record.is_stream)} ); @@ -595,7 +609,10 @@ export const getLogsColumns = ({ cacheText = `${t('缓存写')} ${formatTokenCount(cacheSummary.cacheWriteTokens)}`; } - return record.type === 0 || record.type === 2 || record.type === 5 || record.type === 6 ? ( + return record.type === 0 || + record.type === 2 || + record.type === 5 || + record.type === 6 ? (
{ return parseInt(text) > 0 && - (record.type === 0 || record.type === 2 || record.type === 5 || record.type === 6) ? ( + (record.type === 0 || + record.type === 2 || + record.type === 5 || + record.type === 6) ? ( <>{ {text} } ) : ( <> @@ -641,7 +661,14 @@ export const getLogsColumns = ({ title: t('花费'), dataIndex: 'quota', render: (text, record, index) => { - if (!(record.type === 0 || record.type === 2 || record.type === 5 || record.type === 6)) { + if ( + !( + record.type === 0 || + record.type === 2 || + record.type === 5 || + record.type === 6 + ) + ) { return <>; } const other = getLogOther(record.other); @@ -650,7 +677,7 @@ export const getLogsColumns = ({ // Subscription billed: show only tag (no $0), but keep tooltip for equivalent cost. return ( - {renderBillingTag(record, t)} + {renderBillingTag(record)} ); } @@ -708,9 +735,9 @@ export const getLogsColumns = ({ } if (other.admin_info !== undefined) { if ( - other.admin_info.use_channel !== null && - other.admin_info.use_channel !== undefined && - other.admin_info.use_channel !== '' + other.admin_info.use_channel !== null && + other.admin_info.use_channel !== undefined && + other.admin_info.use_channel !== '' ) { let useChannel = other.admin_info.use_channel; let useChannelStr = useChannel.join('->'); @@ -828,14 +855,14 @@ export const getLogsColumns = ({ 'openai', ); return ( - - {content} - + + {content} + ); }, }, diff --git a/web/src/components/table/usage-logs/UsageLogsFilters.jsx b/web/src/components/table/usage-logs/UsageLogsFilters.jsx index 8d0d837ca5..cb171772e6 100644 --- a/web/src/components/table/usage-logs/UsageLogsFilters.jsx +++ b/web/src/components/table/usage-logs/UsageLogsFilters.jsx @@ -22,6 +22,7 @@ import { Button, Form } from '@douyinfe/semi-ui'; import { IconSearch } from '@douyinfe/semi-icons'; import { DATE_RANGE_PRESETS } from '../../../constants/console.constants'; +import { useTranslation } from 'react-i18next'; const LogsFilters = ({ formInitValues, @@ -32,8 +33,8 @@ const LogsFilters = ({ setLogType, loading, isAdminUser, - t, }) => { + const { t } = useTranslation(); return ( { + const { t } = useTranslation(); const { logs, expandData, @@ -43,14 +45,12 @@ const LogsTable = (logsData) => { openChannelAffinityUsageCacheModal, hasExpandableRows, isAdminUser, - t, COLUMN_KEYS, } = logsData; // Get all columns const allColumns = useMemo(() => { return getLogsColumns({ - t, COLUMN_KEYS, copyText, showUserInfoFunc, @@ -58,7 +58,6 @@ const LogsTable = (logsData) => { isAdminUser, }); }, [ - t, COLUMN_KEYS, copyText, showUserInfoFunc, diff --git a/web/src/components/table/usage-logs/index.jsx b/web/src/components/table/usage-logs/index.jsx index 7d2d47c377..db07864dbf 100644 --- a/web/src/components/table/usage-logs/index.jsx +++ b/web/src/components/table/usage-logs/index.jsx @@ -28,8 +28,10 @@ import ChannelAffinityUsageCacheModal from './modals/ChannelAffinityUsageCacheMo import { useLogsData } from '../../../hooks/usage-logs/useUsageLogsData'; import { useIsMobile } from '../../../hooks/common/useIsMobile'; import { createCardProPagination } from '../../../helpers/utils'; +import { useTranslation } from 'react-i18next'; const LogsPage = () => { + const { t } = useTranslation(); const logsData = useLogsData(); const isMobile = useIsMobile(); @@ -52,9 +54,9 @@ const LogsPage = () => { onPageChange: logsData.handlePageChange, onPageSizeChange: logsData.handlePageSizeChange, isMobile: isMobile, - t: logsData.t, + t: t, })} - t={logsData.t} + t={t} > diff --git a/web/src/components/table/usage-logs/modals/ChannelAffinityUsageCacheModal.jsx b/web/src/components/table/usage-logs/modals/ChannelAffinityUsageCacheModal.jsx index 383ebabc1c..f8740fe059 100644 --- a/web/src/components/table/usage-logs/modals/ChannelAffinityUsageCacheModal.jsx +++ b/web/src/components/table/usage-logs/modals/ChannelAffinityUsageCacheModal.jsx @@ -20,10 +20,12 @@ For commercial licensing, please contact support@quantumnous.com import React, { useEffect, useMemo, useRef, useState } from 'react'; import { Modal, Descriptions, Spin, Typography } from '@douyinfe/semi-ui'; import { API, showError, timestamp2string } from '../../../../helpers'; +import { useTranslation } from 'react-i18next'; const { Text } = Typography; function formatRate(hit, total) { + const { t } = useTranslation(); if (!total || total <= 0) return '-'; const r = (Number(hit || 0) / Number(total || 0)) * 100; if (!Number.isFinite(r)) return '-'; @@ -54,9 +56,7 @@ function hasTextValue(value) { return typeof value === 'string' && value.trim() !== ''; } -const ChannelAffinityUsageCacheModal = ({ - t, - showChannelAffinityUsageCacheModal, +const ChannelAffinityUsageCacheModal = ({ showChannelAffinityUsageCacheModal, setShowChannelAffinityUsageCacheModal, channelAffinityUsageCacheTarget, }) => { @@ -119,7 +119,6 @@ const ChannelAffinityUsageCacheModal = ({ params.using_group, params.key_hint, params.key_fp, - t, ]); const { rows, supportsTokenStats } = useMemo(() => { @@ -161,7 +160,10 @@ const ChannelAffinityUsageCacheModal = ({ data.push({ key: t('TTL(秒)'), value: windowSeconds }); } if (total > 0) { - data.push({ key: t('命中率'), value: `${hit}/${total} (${formatRate(hit, total)})` }); + data.push({ + key: t('命中率'), + value: `${hit}/${total} (${formatRate(hit, total)})`, + }); } if (lastSeenAt > 0) { data.push({ key: t('最近一次'), value: timestamp2string(lastSeenAt) }); @@ -178,7 +180,10 @@ const ChannelAffinityUsageCacheModal = ({ }); } if (promptCacheHitTokens > 0) { - data.push({ key: t('Prompt cache hit tokens'), value: promptCacheHitTokens }); + data.push({ + key: t('Prompt cache hit tokens'), + value: promptCacheHitTokens, + }); } if (completionTokens > 0) { data.push({ key: t('Completion tokens'), value: completionTokens }); @@ -207,18 +212,15 @@ const ChannelAffinityUsageCacheModal = ({ {t( '命中判定:usage 中存在 cached tokens(例如 cached_tokens/prompt_cache_hit_tokens)即视为命中。', - )} - {' '} + )}{' '} {t( 'Cached tokens 占比口径由后端返回:Claude 语义按 cached/(prompt+cached),其余按 cached/prompt。', + )}{' '} + {t( + '当前仅 OpenAI / Claude 语义支持缓存 token 统计,其他通道将隐藏 token 相关字段。', )} - {' '} - {t('当前仅 OpenAI / Claude 语义支持缓存 token 统计,其他通道将隐藏 token 相关字段。')} {stats && !supportsTokenStats ? ( - <> - {' '} - {t('该记录不包含可用的 token 统计口径。')} - + <> {t('该记录不包含可用的 token 统计口径。')} ) : null}
diff --git a/web/src/components/table/usage-logs/modals/ColumnSelectorModal.jsx b/web/src/components/table/usage-logs/modals/ColumnSelectorModal.jsx index ab56df8ef1..0c1d454fd1 100644 --- a/web/src/components/table/usage-logs/modals/ColumnSelectorModal.jsx +++ b/web/src/components/table/usage-logs/modals/ColumnSelectorModal.jsx @@ -20,6 +20,7 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { Modal, Button, Checkbox } from '@douyinfe/semi-ui'; import { getLogsColumns } from '../UsageLogsColumnDefs'; +import { useTranslation } from 'react-i18next'; const ColumnSelectorModal = ({ showColumnSelector, @@ -32,11 +33,10 @@ const ColumnSelectorModal = ({ isAdminUser, copyText, showUserInfoFunc, - t, }) => { + const { t } = useTranslation(); // Get all columns for display in selector const allColumns = getLogsColumns({ - t, COLUMN_KEYS, copyText, showUserInfoFunc, diff --git a/web/src/components/table/usage-logs/modals/UserInfoModal.jsx b/web/src/components/table/usage-logs/modals/UserInfoModal.jsx index ad189e599e..043319adcc 100644 --- a/web/src/components/table/usage-logs/modals/UserInfoModal.jsx +++ b/web/src/components/table/usage-logs/modals/UserInfoModal.jsx @@ -20,13 +20,14 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { Modal, Badge } from '@douyinfe/semi-ui'; import { renderQuota, renderNumber } from '../../../../helpers'; +import { useTranslation } from 'react-i18next'; const UserInfoModal = ({ showUserInfo, setShowUserInfoModal, userInfoData, - t, }) => { + const { t } = useTranslation(); const infoItemStyle = { marginBottom: '16px', }; diff --git a/web/src/components/table/users/UsersActions.jsx b/web/src/components/table/users/UsersActions.jsx index c3f2602a25..dcd7c5169c 100644 --- a/web/src/components/table/users/UsersActions.jsx +++ b/web/src/components/table/users/UsersActions.jsx @@ -19,8 +19,10 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { Button } from '@douyinfe/semi-ui'; +import { useTranslation } from 'react-i18next'; -const UsersActions = ({ setShowAddUser, t }) => { +const UsersActions = ({ setShowAddUser }) => { + const { t } = useTranslation(); // Add new user const handleAddUser = () => { setShowAddUser(true); diff --git a/web/src/components/table/users/UsersColumnDefs.jsx b/web/src/components/table/users/UsersColumnDefs.jsx index dc3e6f3413..e47ae95e2f 100644 --- a/web/src/components/table/users/UsersColumnDefs.jsx +++ b/web/src/components/table/users/UsersColumnDefs.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; +import { t } from '../../../helpers/i18n'; import { Button, Space, @@ -34,7 +35,7 @@ import { renderGroup, renderNumber, renderQuota } from '../../../helpers'; /** * Render user role */ -const renderRole = (role, t) => { +const renderRole = (role) => { switch (role) { case 1: return ( @@ -95,7 +96,7 @@ const renderUsername = (text, record) => { /** * Render user statistics */ -const renderStatistics = (text, record, showEnableDisableModal, t) => { +const renderStatistics = (text, record, showEnableDisableModal) => { const isDeleted = record.DeletedAt !== null; // Determine tag text & color like original status column @@ -134,7 +135,7 @@ const renderStatistics = (text, record, showEnableDisableModal, t) => { }; // Render separate quota usage column -const renderQuotaUsage = (text, record, t) => { +const renderQuotaUsage = (text, record) => { const { Paragraph } = Typography; const used = parseInt(record.used_quota) || 0; const remain = parseInt(record.quota) || 0; @@ -173,7 +174,7 @@ const renderQuotaUsage = (text, record, t) => { /** * Render invite information */ -const renderInviteInfo = (text, record, t) => { +const renderInviteInfo = (text, record) => { return (
@@ -209,7 +210,6 @@ const renderOperations = ( showResetPasskeyModal, showResetTwoFAModal, showUserSubscriptionsModal, - t, }, ) => { if (record.DeletedAt !== null) { @@ -299,7 +299,6 @@ const renderOperations = ( * Get users table column definitions */ export const getUsersColumns = ({ - t, setEditingUser, setShowEditUser, showPromoteModal, @@ -324,12 +323,12 @@ export const getUsersColumns = ({ title: t('状态'), dataIndex: 'info', render: (text, record, index) => - renderStatistics(text, record, showEnableDisableModal, t), + renderStatistics(text, record, showEnableDisableModal), }, { title: t('剩余额度/总额度'), key: 'quota_usage', - render: (text, record) => renderQuotaUsage(text, record, t), + render: (text, record) => renderQuotaUsage(text, record), }, { title: t('分组'), @@ -342,13 +341,13 @@ export const getUsersColumns = ({ title: t('角色'), dataIndex: 'role', render: (text, record, index) => { - return
{renderRole(text, t)}
; + return
{renderRole(text)}
; }, }, { title: t('邀请信息'), dataIndex: 'invite', - render: (text, record, index) => renderInviteInfo(text, record, t), + render: (text, record, index) => renderInviteInfo(text, record), }, { title: '', @@ -366,7 +365,6 @@ export const getUsersColumns = ({ showResetPasskeyModal, showResetTwoFAModal, showUserSubscriptionsModal, - t, }), }, ]; diff --git a/web/src/components/table/users/UsersDescription.jsx b/web/src/components/table/users/UsersDescription.jsx index 646801875b..49428a3674 100644 --- a/web/src/components/table/users/UsersDescription.jsx +++ b/web/src/components/table/users/UsersDescription.jsx @@ -21,10 +21,12 @@ import React from 'react'; import { Typography } from '@douyinfe/semi-ui'; import { IconUserAdd } from '@douyinfe/semi-icons'; import CompactModeToggle from '../../common/ui/CompactModeToggle'; +import { useTranslation } from 'react-i18next'; const { Text } = Typography; -const UsersDescription = ({ compactMode, setCompactMode, t }) => { +const UsersDescription = ({ compactMode, setCompactMode }) => { + const { t } = useTranslation(); return (
diff --git a/web/src/components/table/users/UsersFilters.jsx b/web/src/components/table/users/UsersFilters.jsx index 7c4c7486b2..dc321625ca 100644 --- a/web/src/components/table/users/UsersFilters.jsx +++ b/web/src/components/table/users/UsersFilters.jsx @@ -20,6 +20,7 @@ For commercial licensing, please contact support@quantumnous.com import React, { useRef } from 'react'; import { Form, Button } from '@douyinfe/semi-ui'; import { IconSearch } from '@douyinfe/semi-icons'; +import { useTranslation } from 'react-i18next'; const UsersFilters = ({ formInitValues, @@ -31,8 +32,8 @@ const UsersFilters = ({ groupOptions, loading, searching, - t, }) => { + const { t } = useTranslation(); const formApiRef = useRef(null); const handleReset = () => { diff --git a/web/src/components/table/users/UsersTable.jsx b/web/src/components/table/users/UsersTable.jsx index e0f8a9cec3..d91f750413 100644 --- a/web/src/components/table/users/UsersTable.jsx +++ b/web/src/components/table/users/UsersTable.jsx @@ -32,8 +32,10 @@ import DeleteUserModal from './modals/DeleteUserModal'; import ResetPasskeyModal from './modals/ResetPasskeyModal'; import ResetTwoFAModal from './modals/ResetTwoFAModal'; import UserSubscriptionsModal from './modals/UserSubscriptionsModal'; +import { useTranslation } from 'react-i18next'; const UsersTable = (usersData) => { + const { t } = useTranslation(); const { users, loading, @@ -50,7 +52,6 @@ const UsersTable = (usersData) => { refresh, resetUserPasskey, resetUserTwoFA, - t, } = usersData; // Modal states @@ -131,7 +132,6 @@ const UsersTable = (usersData) => { // Get all columns const columns = useMemo(() => { return getUsersColumns({ - t, setEditingUser, setShowEditUser, showPromoteModal: showPromoteUserModal, @@ -143,7 +143,6 @@ const UsersTable = (usersData) => { showUserSubscriptionsModal: showUserSubscriptionsUserModal, }); }, [ - t, setEditingUser, setShowEditUser, showPromoteUserModal, @@ -257,7 +256,6 @@ const UsersTable = (usersData) => { visible={showUserSubscriptionsModal} onCancel={() => setShowUserSubscriptionsModal(false)} user={modalUser} - t={t} onSuccess={() => refresh?.()} /> diff --git a/web/src/components/table/users/index.jsx b/web/src/components/table/users/index.jsx index 59e12a4e5f..a4f769b134 100644 --- a/web/src/components/table/users/index.jsx +++ b/web/src/components/table/users/index.jsx @@ -28,8 +28,10 @@ import EditUserModal from './modals/EditUserModal'; import { useUsersData } from '../../../hooks/users/useUsersData'; import { useIsMobile } from '../../../hooks/common/useIsMobile'; import { createCardProPagination } from '../../../helpers/utils'; +import { useTranslation } from 'react-i18next'; const UsersPage = () => { + const { t } = useTranslation(); const usersData = useUsersData(); const isMobile = useIsMobile(); @@ -57,9 +59,6 @@ const UsersPage = () => { // Description state compactMode, setCompactMode, - - // Translation - t, } = usersData; return ( @@ -111,9 +110,9 @@ const UsersPage = () => { onPageChange: usersData.handlePageChange, onPageSizeChange: usersData.handlePageSizeChange, isMobile: isMobile, - t: usersData.t, + t: t, })} - t={usersData.t} + t={t} > diff --git a/web/src/components/table/users/modals/DeleteUserModal.jsx b/web/src/components/table/users/modals/DeleteUserModal.jsx index 6e7a909945..1884823fc2 100644 --- a/web/src/components/table/users/modals/DeleteUserModal.jsx +++ b/web/src/components/table/users/modals/DeleteUserModal.jsx @@ -19,6 +19,7 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { Modal } from '@douyinfe/semi-ui'; +import { useTranslation } from 'react-i18next'; const DeleteUserModal = ({ visible, @@ -29,8 +30,8 @@ const DeleteUserModal = ({ activePage, refresh, manageUser, - t, }) => { + const { t } = useTranslation(); const handleConfirm = async () => { await manageUser(user.id, 'delete', user); await refresh(); diff --git a/web/src/components/table/users/modals/DemoteUserModal.jsx b/web/src/components/table/users/modals/DemoteUserModal.jsx index 4168ca7c8b..98bcd1bd95 100644 --- a/web/src/components/table/users/modals/DemoteUserModal.jsx +++ b/web/src/components/table/users/modals/DemoteUserModal.jsx @@ -19,8 +19,10 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { Modal } from '@douyinfe/semi-ui'; +import { useTranslation } from 'react-i18next'; -const DemoteUserModal = ({ visible, onCancel, onConfirm, user, t }) => { +const DemoteUserModal = ({ visible, onCancel, onConfirm, user }) => { + const { t } = useTranslation(); return ( { + const { t } = useTranslation(); const isDisable = action === 'disable'; return ( diff --git a/web/src/components/table/users/modals/PromoteUserModal.jsx b/web/src/components/table/users/modals/PromoteUserModal.jsx index 1490982b65..2472f5b4a2 100644 --- a/web/src/components/table/users/modals/PromoteUserModal.jsx +++ b/web/src/components/table/users/modals/PromoteUserModal.jsx @@ -19,8 +19,10 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { Modal } from '@douyinfe/semi-ui'; +import { useTranslation } from 'react-i18next'; -const PromoteUserModal = ({ visible, onCancel, onConfirm, user, t }) => { +const PromoteUserModal = ({ visible, onCancel, onConfirm, user }) => { + const { t } = useTranslation(); return ( { +const ResetPasskeyModal = ({ visible, onCancel, onConfirm, user }) => { + const { t } = useTranslation(); return ( { +const ResetTwoFAModal = ({ visible, onCancel, onConfirm, user }) => { + const { t } = useTranslation(); return ( { +const UserSubscriptionsModal = ({ visible, onCancel, user, onSuccess }) => { + const { t } = useTranslation(); const isMobile = useIsMobile(); const [loading, setLoading] = useState(false); const [creating, setCreating] = useState(false); @@ -276,7 +279,7 @@ const UserSubscriptionsModal = ({ visible, onCancel, user, t, onSuccess }) => { title: t('状态'), key: 'status', width: 90, - render: (_, record) => renderStatusTag(record?.subscription, t), + render: (_, record) => renderStatusTag(record?.subscription), }, { title: t('有效期'), diff --git a/web/src/components/topup/InvitationCard.jsx b/web/src/components/topup/InvitationCard.jsx index 7ae6b0a5a2..2282841c07 100644 --- a/web/src/components/topup/InvitationCard.jsx +++ b/web/src/components/topup/InvitationCard.jsx @@ -28,17 +28,17 @@ import { Space, } from '@douyinfe/semi-ui'; import { Copy, Users, BarChart2, TrendingUp, Gift, Zap } from 'lucide-react'; +import { useTranslation } from 'react-i18next'; const { Text } = Typography; -const InvitationCard = ({ - t, - userState, +const InvitationCard = ({ userState, renderQuota, setOpenTransfer, affLink, handleAffLinkClick, }) => { + const { t } = useTranslation(); return ( {/* 卡片头部 */} diff --git a/web/src/components/topup/RechargeCard.jsx b/web/src/components/topup/RechargeCard.jsx index 1ce0230986..1481314e55 100644 --- a/web/src/components/topup/RechargeCard.jsx +++ b/web/src/components/topup/RechargeCard.jsx @@ -49,12 +49,11 @@ import { IconGift } from '@douyinfe/semi-icons'; import { useMinimumLoadingTime } from '../../hooks/common/useMinimumLoadingTime'; import { getCurrencyConfig } from '../../helpers/render'; import SubscriptionPlansCard from './SubscriptionPlansCard'; +import { useTranslation } from 'react-i18next'; const { Text } = Typography; -const RechargeCard = ({ - t, - enableOnlineTopUp, +const RechargeCard = ({ enableOnlineTopUp, enableStripeTopUp, enableCreemTopUp, creemProducts, @@ -95,6 +94,7 @@ const RechargeCard = ({ allSubscriptions = [], reloadSubscriptionSelf, }) => { + const { t } = useTranslation(); const onlineFormApiRef = useRef(null); const redeemFormApiRef = useRef(null); const initialTabSetRef = useRef(false); @@ -293,7 +293,8 @@ const RechargeCard = ({ {payMethods && payMethods.length > 0 ? ( {payMethods.map((payMethod) => { - const minTopupVal = Number(payMethod.min_topup) || 0; + const minTopupVal = + Number(payMethod.min_topup) || 0; const isStripe = payMethod.type === 'stripe'; const disabled = (!enableOnlineTopUp && !isStripe) || @@ -389,7 +390,9 @@ const RechargeCard = ({
{presetAmounts.map((preset, index) => { const discount = - preset.discount || topupInfo?.discount?.[preset.value] || 1.0; + preset.discount || + topupInfo?.discount?.[preset.value] || + 1.0; const originalPrice = preset.value * priceRatio; const discountedPrice = originalPrice * discount; const hasDiscount = discount < 1.0; @@ -405,7 +408,7 @@ const RechargeCard = ({ const s = JSON.parse(statusStr); usdRate = s?.usd_exchange_rate || 7; } - } catch (e) { } + } catch (e) {} let displayValue = preset.value; // 显示的数量 let displayActualPay = actualPay; @@ -456,7 +459,10 @@ const RechargeCard = ({ {hasDiscount && ( {t('折').includes('off') - ? ((1 - parseFloat(discount)) * 100).toFixed(1) + ? ( + (1 - parseFloat(discount)) * + 100 + ).toFixed(1) : (discount * 10).toFixed(1)} {t('折')} diff --git a/web/src/components/topup/SubscriptionPlansCard.jsx b/web/src/components/topup/SubscriptionPlansCard.jsx index a619c74505..2c2aa9fe43 100644 --- a/web/src/components/topup/SubscriptionPlansCard.jsx +++ b/web/src/components/topup/SubscriptionPlansCard.jsx @@ -38,11 +38,13 @@ import { formatSubscriptionDuration, formatSubscriptionResetPeriod, } from '../../helpers/subscriptionFormat'; +import { useTranslation } from 'react-i18next'; const { Text } = Typography; // 过滤易支付方式 function getEpayMethods(payMethods = []) { + const { t } = useTranslation(); return (payMethods || []).filter( (m) => m?.type && m.type !== 'stripe' && m.type !== 'creem', ); @@ -69,9 +71,7 @@ function submitEpayForm({ url, params }) { document.body.removeChild(form); } -const SubscriptionPlansCard = ({ - t, - loading = false, +const SubscriptionPlansCard = ({ loading = false, plans = [], payMethods = [], enableOnlineTopUp = false, @@ -499,12 +499,12 @@ const SubscriptionPlansCard = ({ ? `${t('升级分组')}: ${plan.upgrade_group}` : null; const resetLabel = - formatSubscriptionResetPeriod(plan, t) === t('不重置') + formatSubscriptionResetPeriod(plan) === t('不重置') ? null - : `${t('额度重置')}: ${formatSubscriptionResetPeriod(plan, t)}`; + : `${t('额度重置')}: ${formatSubscriptionResetPeriod(plan)}`; const planBenefits = [ { - label: `${t('有效期')}: ${formatSubscriptionDuration(plan, t)}`, + label: `${t('有效期')}: ${formatSubscriptionDuration(plan)}`, }, resetLabel ? { label: resetLabel } : null, totalAmount > 0 diff --git a/web/src/components/topup/index.jsx b/web/src/components/topup/index.jsx index 55c7a0779f..ad1c41127f 100644 --- a/web/src/components/topup/index.jsx +++ b/web/src/components/topup/index.jsx @@ -197,7 +197,7 @@ const TopUp = () => { } if (topUpCount < minTopUp) { - showError('充值数量不能小于' + minTopUp); + showError(t('充值数量不能小于') + minTopUp); return; } setConfirmLoading(true); @@ -581,7 +581,7 @@ const TopUp = () => { setAmount(parseFloat(data)); } else { setAmount(0); - Toast.error({ content: '错误:' + data, id: 'getAmount' }); + Toast.error({ content: t('错误:') + data, id: 'getAmount' }); } } else { showError(res); @@ -607,7 +607,7 @@ const TopUp = () => { setAmount(parseFloat(data)); } else { setAmount(0); - Toast.error({ content: '错误:' + data, id: 'getAmount' }); + Toast.error({ content: t('错误:') + data, id: 'getAmount' }); } } else { showError(res); diff --git a/web/src/components/topup/modals/PaymentConfirmModal.jsx b/web/src/components/topup/modals/PaymentConfirmModal.jsx index 8bd5455c7f..9189b32f49 100644 --- a/web/src/components/topup/modals/PaymentConfirmModal.jsx +++ b/web/src/components/topup/modals/PaymentConfirmModal.jsx @@ -21,12 +21,11 @@ import React from 'react'; import { Modal, Typography, Card, Skeleton } from '@douyinfe/semi-ui'; import { SiAlipay, SiWechat, SiStripe } from 'react-icons/si'; import { CreditCard } from 'lucide-react'; +import { useTranslation } from 'react-i18next'; const { Text } = Typography; -const PaymentConfirmModal = ({ - t, - open, +const PaymentConfirmModal = ({ open, onlineTopUp, handleCancel, confirmLoading, @@ -40,6 +39,7 @@ const PaymentConfirmModal = ({ amountNumber, discountRate, }) => { + const { t } = useTranslation(); const hasDiscount = discountRate && discountRate > 0 && discountRate < 1 && amountNumber > 0; const originalAmount = hasDiscount ? amountNumber / discountRate : 0; diff --git a/web/src/components/topup/modals/SubscriptionPurchaseModal.jsx b/web/src/components/topup/modals/SubscriptionPurchaseModal.jsx index 8bd861ee30..0e1bc9a9fb 100644 --- a/web/src/components/topup/modals/SubscriptionPurchaseModal.jsx +++ b/web/src/components/topup/modals/SubscriptionPurchaseModal.jsx @@ -37,12 +37,11 @@ import { formatSubscriptionDuration, formatSubscriptionResetPeriod, } from '../../../helpers/subscriptionFormat'; +import { useTranslation } from 'react-i18next'; const { Text } = Typography; -const SubscriptionPurchaseModal = ({ - t, - visible, +const SubscriptionPurchaseModal = ({ visible, onCancel, selectedPlan, paying, @@ -57,6 +56,7 @@ const SubscriptionPurchaseModal = ({ onPayCreem, onPayEpay, }) => { + const { t } = useTranslation(); const plan = selectedPlan?.plan; const totalAmount = Number(plan?.total_amount || 0); const { symbol, rate } = getCurrencyConfig(); @@ -113,17 +113,17 @@ const SubscriptionPurchaseModal = ({
- {formatSubscriptionDuration(plan, t)} + {formatSubscriptionDuration(plan)}
- {formatSubscriptionResetPeriod(plan, t) !== t('不重置') && ( + {formatSubscriptionResetPeriod(plan) !== t('不重置') && (
{t('重置周期')}: - {formatSubscriptionResetPeriod(plan, t)} + {formatSubscriptionResetPeriod(plan)}
)} diff --git a/web/src/components/topup/modals/TopupHistoryModal.jsx b/web/src/components/topup/modals/TopupHistoryModal.jsx index ae56234228..1bb7042a45 100644 --- a/web/src/components/topup/modals/TopupHistoryModal.jsx +++ b/web/src/components/topup/modals/TopupHistoryModal.jsx @@ -37,6 +37,7 @@ import { IconSearch } from '@douyinfe/semi-icons'; import { API, timestamp2string } from '../../../helpers'; import { isAdmin } from '../../../helpers/utils'; import { useIsMobile } from '../../../hooks/common/useIsMobile'; +import { useTranslation } from 'react-i18next'; const { Text } = Typography; @@ -55,7 +56,8 @@ const PAYMENT_METHOD_MAP = { wxpay: '微信', }; -const TopupHistoryModal = ({ visible, onCancel, t }) => { +const TopupHistoryModal = ({ visible, onCancel }) => { + const { t } = useTranslation(); const [loading, setLoading] = useState(false); const [topups, setTopups] = useState([]); const [total, setTotal] = useState(0); diff --git a/web/src/components/topup/modals/TransferModal.jsx b/web/src/components/topup/modals/TransferModal.jsx index d364b678f4..79bb554d4d 100644 --- a/web/src/components/topup/modals/TransferModal.jsx +++ b/web/src/components/topup/modals/TransferModal.jsx @@ -20,10 +20,9 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { Modal, Typography, Input, InputNumber } from '@douyinfe/semi-ui'; import { CreditCard } from 'lucide-react'; +import { useTranslation } from 'react-i18next'; -const TransferModal = ({ - t, - openTransfer, +const TransferModal = ({ openTransfer, transfer, handleTransferCancel, userState, @@ -32,6 +31,7 @@ const TransferModal = ({ transferAmount, setTransferAmount, }) => { + const { t } = useTranslation(); return ( . For commercial licensing, please contact support@quantumnous.com */ +import i18next from 'i18next'; + export const CHANNEL_OPTIONS = [ { value: 1, color: 'green', label: 'OpenAI' }, { @@ -61,32 +63,32 @@ export const CHANNEL_OPTIONS = [ { value: 15, color: 'blue', - label: '百度文心千帆', + label: i18next.t('百度文心千帆'), }, { value: 46, color: 'blue', - label: '百度文心千帆V2', + label: i18next.t('百度文心千帆V2'), }, { value: 17, color: 'orange', - label: '阿里通义千问', + label: i18next.t('阿里通义千问'), }, { value: 18, color: 'blue', - label: '讯飞星火认知', + label: i18next.t('讯飞星火认知'), }, { value: 16, color: 'violet', - label: '智谱 ChatGLM(已经弃用,请使用智谱 GLM-4V)', + label: i18next.t('智谱 ChatGLM(已经弃用,请使用智谱 GLM-4V)'), }, { value: 26, color: 'purple', - label: '智谱 GLM-4V', + label: i18next.t('智谱 GLM-4V'), }, { value: 27, @@ -110,34 +112,34 @@ export const CHANNEL_OPTIONS = [ }, { value: 25, color: 'green', label: 'Moonshot' }, { value: 20, color: 'green', label: 'OpenRouter' }, - { value: 19, color: 'blue', label: '360 智脑' }, - { value: 23, color: 'teal', label: '腾讯混元' }, - { value: 31, color: 'green', label: '零一万物' }, + { value: 19, color: 'blue', label: i18next.t('360 智脑') }, + { value: 23, color: 'teal', label: i18next.t('腾讯混元') }, + { value: 31, color: 'green', label: i18next.t('零一万物') }, { value: 35, color: 'green', label: 'MiniMax' }, { value: 37, color: 'teal', label: 'Dify' }, { value: 38, color: 'blue', label: 'Jina' }, { value: 40, color: 'purple', label: 'SiliconCloud' }, { value: 42, color: 'blue', label: 'Mistral AI' }, - { value: 8, color: 'pink', label: '自定义渠道' }, + { value: 8, color: 'pink', label: i18next.t('自定义渠道') }, { value: 22, color: 'blue', - label: '知识库:FastGPT', + label: i18next.t('知识库:FastGPT'), }, { value: 21, color: 'purple', - label: '知识库:AI Proxy', + label: i18next.t('知识库:AI Proxy'), }, { value: 44, color: 'purple', - label: '嵌入模型:MokaAI M3E', + label: i18next.t('嵌入模型:MokaAI M3E'), }, { value: 45, color: 'blue', - label: '字节火山方舟、豆包通用', + label: i18next.t('字节火山方舟、豆包通用'), }, { value: 48, @@ -152,12 +154,12 @@ export const CHANNEL_OPTIONS = [ { value: 50, color: 'green', - label: '可灵', + label: i18next.t('可灵'), }, { value: 51, color: 'blue', - label: '即梦', + label: i18next.t('即梦'), }, { value: 52, @@ -172,7 +174,7 @@ export const CHANNEL_OPTIONS = [ { value: 54, color: 'blue', - label: '豆包视频', + label: i18next.t('豆包视频'), }, { value: 55, diff --git a/web/src/constants/console.constants.js b/web/src/constants/console.constants.js index bef19e4b97..8e18d7939e 100644 --- a/web/src/constants/console.constants.js +++ b/web/src/constants/console.constants.js @@ -18,31 +18,32 @@ For commercial licensing, please contact support@quantumnous.com */ import dayjs from 'dayjs'; +import i18next from 'i18next'; // ========== 日期预设常量 ========== export const DATE_RANGE_PRESETS = [ { - text: '今天', + text: i18next.t('今天'), start: () => dayjs().startOf('day').toDate(), end: () => dayjs().endOf('day').toDate(), }, { - text: '近 7 天', + text: i18next.t('近 7 天'), start: () => dayjs().subtract(6, 'day').startOf('day').toDate(), end: () => dayjs().endOf('day').toDate(), }, { - text: '本周', + text: i18next.t('本周'), start: () => dayjs().startOf('week').toDate(), end: () => dayjs().endOf('week').toDate(), }, { - text: '近 30 天', + text: i18next.t('近 30 天'), start: () => dayjs().subtract(29, 'day').startOf('day').toDate(), end: () => dayjs().endOf('day').toDate(), }, { - text: '本月', + text: i18next.t('本月'), start: () => dayjs().startOf('month').toDate(), end: () => dayjs().endOf('month').toDate(), }, diff --git a/web/src/constants/dashboard.constants.js b/web/src/constants/dashboard.constants.js index 7e930b479d..15efc73f25 100644 --- a/web/src/constants/dashboard.constants.js +++ b/web/src/constants/dashboard.constants.js @@ -17,6 +17,8 @@ along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ +import i18next from 'i18next'; + // ========== UI 配置常量 ========== export const CHART_CONFIG = { mode: 'desktop-browser' }; @@ -38,9 +40,9 @@ export const ILLUSTRATION_SIZE = { width: 96, height: 96 }; // ========== 时间相关常量 ========== export const TIME_OPTIONS = [ - { label: '小时', value: 'hour' }, - { label: '天', value: 'day' }, - { label: '周', value: 'week' }, + { label: i18next.t('小时'), value: 'hour' }, + { label: i18next.t('天'), value: 'day' }, + { label: i18next.t('周'), value: 'week' }, ]; export const DEFAULT_TIME_INTERVALS = { @@ -119,19 +121,27 @@ export const DEFAULT_CHART_SPECS = { // ========== 公告图例数据 ========== export const ANNOUNCEMENT_LEGEND_DATA = [ - { color: 'grey', label: '默认', type: 'default' }, - { color: 'blue', label: '进行中', type: 'ongoing' }, - { color: 'green', label: '成功', type: 'success' }, - { color: 'orange', label: '警告', type: 'warning' }, - { color: 'red', label: '异常', type: 'error' }, + { color: 'grey', label: i18next.t('默认'), type: 'default' }, + { color: 'blue', label: i18next.t('进行中'), type: 'ongoing' }, + { color: 'green', label: i18next.t('成功'), type: 'success' }, + { color: 'orange', label: i18next.t('警告'), type: 'warning' }, + { color: 'red', label: i18next.t('异常'), type: 'error' }, ]; // ========== Uptime 状态映射 ========== export const UPTIME_STATUS_MAP = { - 1: { color: '#10b981', label: '正常', text: '可用率' }, // UP - 0: { color: '#ef4444', label: '异常', text: '有异常' }, // DOWN - 2: { color: '#f59e0b', label: '高延迟', text: '高延迟' }, // PENDING - 3: { color: '#3b82f6', label: '维护中', text: '维护中' }, // MAINTENANCE + 1: { color: '#10b981', label: i18next.t('正常'), text: i18next.t('可用率') }, // UP + 0: { color: '#ef4444', label: i18next.t('异常'), text: i18next.t('有异常') }, // DOWN + 2: { + color: '#f59e0b', + label: i18next.t('高延迟'), + text: i18next.t('高延迟'), + }, // PENDING + 3: { + color: '#3b82f6', + label: i18next.t('维护中'), + text: i18next.t('维护中'), + }, // MAINTENANCE }; // ========== 本地存储键名 ========== diff --git a/web/src/constants/playground.constants.js b/web/src/constants/playground.constants.js index 9ba88621cb..b696a96fc3 100644 --- a/web/src/constants/playground.constants.js +++ b/web/src/constants/playground.constants.js @@ -17,6 +17,9 @@ along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ +import i18next from 'i18next'; +import { t } from '../helpers/i18n'; + export const MESSAGE_STATUS = { LOADING: 'loading', INCOMPLETE: 'incomplete', @@ -31,7 +34,7 @@ export const MESSAGE_ROLES = { }; // 默认消息示例 - 使用函数生成以支持 i18n -export const getDefaultMessages = (t) => [ +export const getDefaultMessages = () => [ { role: MESSAGE_ROLES.USER, id: '2', @@ -114,14 +117,14 @@ export const THINK_TAG_REGEX = /([\s\S]*?)<\/think>/g; // ========== 错误消息 ========== export const ERROR_MESSAGES = { - NO_TEXT_CONTENT: '此消息没有可复制的文本内容', - INVALID_MESSAGE_TYPE: '无法复制此类型的消息内容', - COPY_FAILED: '复制失败,请手动选择文本复制', - COPY_HTTPS_REQUIRED: '复制功能需要 HTTPS 环境,请手动复制', - BROWSER_NOT_SUPPORTED: '浏览器不支持复制功能,请手动复制', - JSON_PARSE_ERROR: '自定义请求体格式错误,请检查JSON格式', - API_REQUEST_ERROR: '请求发生错误', - NETWORK_ERROR: '网络连接失败或服务器无响应', + NO_TEXT_CONTENT: i18next.t('此消息没有可复制的文本内容'), + INVALID_MESSAGE_TYPE: i18next.t('无法复制此类型的消息内容'), + COPY_FAILED: i18next.t('复制失败,请手动选择文本复制'), + COPY_HTTPS_REQUIRED: i18next.t('复制功能需要 HTTPS 环境,请手动复制'), + BROWSER_NOT_SUPPORTED: i18next.t('浏览器不支持复制功能,请手动复制'), + JSON_PARSE_ERROR: i18next.t('自定义请求体格式错误,请检查JSON格式'), + API_REQUEST_ERROR: i18next.t('请求发生错误'), + NETWORK_ERROR: i18next.t('网络连接失败或服务器无响应'), }; // ========== 存储键名 ========== diff --git a/web/src/constants/redemption.constants.js b/web/src/constants/redemption.constants.js index baba96ee9a..44df6f0885 100644 --- a/web/src/constants/redemption.constants.js +++ b/web/src/constants/redemption.constants.js @@ -17,6 +17,8 @@ along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ +import i18next from 'i18next'; + export const REDEMPTION_STATUS = { UNUSED: 1, // Unused DISABLED: 2, // Disabled @@ -27,15 +29,15 @@ export const REDEMPTION_STATUS = { export const REDEMPTION_STATUS_MAP = { [REDEMPTION_STATUS.UNUSED]: { color: 'green', - text: '未使用', + text: i18next.t('未使用'), }, [REDEMPTION_STATUS.DISABLED]: { color: 'red', - text: '已禁用', + text: i18next.t('已禁用'), }, [REDEMPTION_STATUS.USED]: { color: 'grey', - text: '已使用', + text: i18next.t('已使用'), }, }; diff --git a/web/src/helpers/api.js b/web/src/helpers/api.js index 361d7e09ae..a36b496754 100644 --- a/web/src/helpers/api.js +++ b/web/src/helpers/api.js @@ -24,6 +24,7 @@ import { isValidMessage, } from './utils'; import axios from 'axios'; +import i18next from 'i18next'; import { MESSAGE_ROLES } from '../constants/playground.constants'; export let API = axios.create({ @@ -307,32 +308,46 @@ export async function onLinuxDOOAuthClicked( export async function onCustomOAuthClicked(provider, options = {}) { const state = await prepareOAuthState(options); if (!state) return; - + try { const redirect_uri = `${window.location.origin}/oauth/${provider.slug}`; - + // Check if authorization_endpoint is a full URL or relative path let authUrl; - if (provider.authorization_endpoint.startsWith('http://') || - provider.authorization_endpoint.startsWith('https://')) { + if ( + provider.authorization_endpoint.startsWith('http://') || + provider.authorization_endpoint.startsWith('https://') + ) { authUrl = new URL(provider.authorization_endpoint); } else { // Relative path - this is a configuration error, show error message - console.error('Custom OAuth authorization_endpoint must be a full URL:', provider.authorization_endpoint); - showError('OAuth 配置错误:授权端点必须是完整的 URL(以 http:// 或 https:// 开头)'); + console.error( + 'Custom OAuth authorization_endpoint must be a full URL:', + provider.authorization_endpoint, + ); + showError( + i18next.t( + 'OAuth 配置错误:授权端点必须是完整的 URL(以 http:// 或 https:// 开头)', + ), + ); return; } - + authUrl.searchParams.set('client_id', provider.client_id); authUrl.searchParams.set('redirect_uri', redirect_uri); authUrl.searchParams.set('response_type', 'code'); - authUrl.searchParams.set('scope', provider.scopes || 'openid profile email'); + authUrl.searchParams.set( + 'scope', + provider.scopes || 'openid profile email', + ); authUrl.searchParams.set('state', state); - + window.open(authUrl.toString()); } catch (error) { console.error('Failed to initiate custom OAuth:', error); - showError('OAuth 登录失败:' + (error.message || '未知错误')); + showError( + i18next.t('OAuth 登录失败:') + (error.message || i18next.t('未知错误')), + ); } } diff --git a/web/src/helpers/dashboard.jsx b/web/src/helpers/dashboard.jsx index d93d046191..7c4c53a729 100644 --- a/web/src/helpers/dashboard.jsx +++ b/web/src/helpers/dashboard.jsx @@ -30,6 +30,7 @@ import { copy, showSuccess, } from './utils'; +import { t } from './i18n'; import { STORAGE_KEYS, DEFAULT_TIME_INTERVALS, @@ -148,7 +149,7 @@ export const createFormField = (Component, props, FORM_FIELD_PROPS) => ( ); // ========== 操作处理函数 ========== -export const handleCopyUrl = async (url, t) => { +export const handleCopyUrl = async (url) => { if (await copy(url)) { showSuccess(t('复制成功')); } @@ -164,7 +165,7 @@ export const handleSpeedTest = (apiUrl) => { export const getUptimeStatusColor = (status, uptimeStatusMap) => uptimeStatusMap[status]?.color || '#8b9aa7'; -export const getUptimeStatusText = (status, uptimeStatusMap, t) => +export const getUptimeStatusText = (status, uptimeStatusMap) => uptimeStatusMap[status]?.text || t('未知'); // ========== 监控列表渲染函数 ========== @@ -172,7 +173,6 @@ export const renderMonitorList = ( monitors, getUptimeStatusColor, getUptimeStatusText, - t, ) => { if (!monitors || monitors.length === 0) { return ( diff --git a/web/src/helpers/i18n.js b/web/src/helpers/i18n.js new file mode 100644 index 0000000000..bab81df7a8 --- /dev/null +++ b/web/src/helpers/i18n.js @@ -0,0 +1,3 @@ +import i18next from 'i18next'; + +export const t = (key, options) => i18next.t(key, options); diff --git a/web/src/helpers/render.jsx b/web/src/helpers/render.jsx index 3ba198cb3c..a9651635e4 100644 --- a/web/src/helpers/render.jsx +++ b/web/src/helpers/render.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import i18next from 'i18next'; +import { t } from './i18n'; import { Modal, Tag, Typography, Avatar } from '@douyinfe/semi-ui'; import { copy, showSuccess } from './utils'; import { MOBILE_BREAKPOINT } from '../hooks/common/useIsMobile'; @@ -157,7 +158,7 @@ export const getModelCategories = (() => { let categoriesCache = null; let lastLocale = null; - return (t) => { + return () => { const currentLocale = i18next.language; if (categoriesCache && lastLocale === currentLocale) { return categoriesCache; @@ -594,7 +595,9 @@ export function getOAuthProviderIcon(iconName, size = 20) { return ; } - return {raw.charAt(0).toUpperCase()}; + return ( + {raw.charAt(0).toUpperCase()} + ); } // 颜色列表 @@ -739,7 +742,7 @@ export function renderModelTag(modelName, options = {}) { suffixIcon, } = options; - const categories = getModelCategories(i18next.t); + const categories = getModelCategories(); let icon = null; for (const [key, category] of Object.entries(categories)) { diff --git a/web/src/helpers/subscriptionFormat.js b/web/src/helpers/subscriptionFormat.js index 6e49a839ad..690d10030c 100644 --- a/web/src/helpers/subscriptionFormat.js +++ b/web/src/helpers/subscriptionFormat.js @@ -1,4 +1,24 @@ -export function formatSubscriptionDuration(plan, t) { +/* +Copyright (C) 2025 QuantumNous + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . + +For commercial licensing, please contact support@quantumnous.com +*/ +import { t } from './i18n'; + +export function formatSubscriptionDuration(plan) { const unit = plan?.duration_unit || 'month'; const value = plan?.duration_value || 1; const unitLabels = { @@ -17,7 +37,73 @@ export function formatSubscriptionDuration(plan, t) { return `${value} ${unitLabels[unit] || unit}`; } -export function formatSubscriptionResetPeriod(plan, t) { +export function formatSubscriptionResetPeriodShort(plan) { + const period = plan?.quota_reset_period || 'never'; + if (period === 'daily') return `/${t('天')}`; + if (period === 'weekly') return `/${t('周')}`; + if (period === 'monthly') return `/${t('月')}`; + if (period === 'custom') { + const seconds = Number(plan?.quota_reset_custom_seconds || 0); + if (seconds >= 86400) return `/${Math.floor(seconds / 86400)}${t('天')}`; + if (seconds >= 3600) return `/${Math.floor(seconds / 3600)}${t('小时')}`; + if (seconds >= 60) return `/${Math.floor(seconds / 60)}${t('分钟')}`; + return `/${seconds}${t('秒')}`; + } + return ''; +} + +export function getResetPeriodsCount(plan) { + const period = plan?.quota_reset_period || 'never'; + if (period === 'never') return 0; + + // duration in seconds + const durationUnit = plan?.duration_unit || 'month'; + const durationValue = plan?.duration_value || 1; + let durationSeconds; + switch (durationUnit) { + case 'year': + durationSeconds = durationValue * 365.25 * 86400; + break; + case 'month': + durationSeconds = durationValue * 30.44 * 86400; + break; + case 'day': + durationSeconds = durationValue * 86400; + break; + case 'hour': + durationSeconds = durationValue * 3600; + break; + case 'custom': + durationSeconds = plan?.custom_seconds || 0; + break; + default: + return 0; + } + + // reset period in seconds + let resetSeconds; + switch (period) { + case 'daily': + resetSeconds = 86400; + break; + case 'weekly': + resetSeconds = 7 * 86400; + break; + case 'monthly': + resetSeconds = 30.44 * 86400; + break; + case 'custom': + resetSeconds = Number(plan?.quota_reset_custom_seconds || 0); + break; + default: + return 0; + } + + if (resetSeconds <= 0 || durationSeconds <= 0) return 0; + return Math.floor(durationSeconds / resetSeconds); +} + +export function formatSubscriptionResetPeriod(plan) { const period = plan?.quota_reset_period || 'never'; if (period === 'never') return t('不重置'); if (period === 'daily') return t('每天'); diff --git a/web/src/helpers/utils.jsx b/web/src/helpers/utils.jsx index 5ce83e678a..4118ced50e 100644 --- a/web/src/helpers/utils.jsx +++ b/web/src/helpers/utils.jsx @@ -21,6 +21,8 @@ import { Toast, Pagination } from '@douyinfe/semi-ui'; import { toastConstants } from '../constants'; import React from 'react'; import { toast } from 'react-toastify'; +import i18next from 'i18next'; +import { t } from './i18n'; import { THINK_TAG_REGEX, MESSAGE_ROLES, @@ -131,22 +133,22 @@ export function showError(error) { window.location.href = '/login?expired=true'; break; case 429: - Toast.error('错误:请求次数过多,请稍后再试!'); + Toast.error(i18next.t('错误:请求次数过多,请稍后再试!')); break; case 500: - Toast.error('错误:服务器内部错误,请联系管理员!'); + Toast.error(i18next.t('错误:服务器内部错误,请联系管理员!')); break; case 405: - Toast.info('本站仅作演示之用,无服务端!'); + Toast.info(i18next.t('本站仅作演示之用,无服务端!')); break; default: - Toast.error('错误:' + error.message); + Toast.error(i18next.t('错误:') + error.message); } return; } - Toast.error('错误:' + error.message); + Toast.error(i18next.t('错误:') + error.message); } else { - Toast.error('错误:' + error); + Toast.error(i18next.t('错误:') + error); } } @@ -292,7 +294,7 @@ export function verifyJSONPromise(value) { JSON.parse(value); return Promise.resolve(); } catch (e) { - return Promise.reject('不是合法的 JSON 字符串'); + return Promise.reject(i18next.t('不是合法的 JSON 字符串')); } } @@ -527,19 +529,19 @@ export const getRelativeTime = (publishDate) => { // 根据时间差返回相应的描述 if (diffSeconds < 60) { - return '刚刚'; + return i18next.t('刚刚'); } else if (diffMinutes < 60) { - return `${diffMinutes} 分钟前`; + return `${diffMinutes} ${i18next.t('分钟前')}`; } else if (diffHours < 24) { - return `${diffHours} 小时前`; + return `${diffHours} ${i18next.t('小时前')}`; } else if (diffDays < 7) { - return `${diffDays} 天前`; + return `${diffDays} ${i18next.t('天前')}`; } else if (diffWeeks < 4) { - return `${diffWeeks} 周前`; + return `${diffWeeks} ${i18next.t('周前')}`; } else if (diffMonths < 12) { - return `${diffMonths} 个月前`; + return `${diffMonths} ${i18next.t('个月前')}`; } else if (diffYears < 2) { - return '1 年前'; + return `1 ${i18next.t('年前')}`; } else { // 超过2年显示具体日期 return formatDateString(pubDate); @@ -711,7 +713,7 @@ export const calculateModelPrice = ({ }; // 格式化价格信息(用于卡片视图) -export const formatPriceInfo = (priceData, t) => { +export const formatPriceInfo = (priceData) => { if (priceData.isPerToken) { return ( <> diff --git a/web/src/hooks/channels/useChannelsData.jsx b/web/src/hooks/channels/useChannelsData.jsx index 2db28386af..d04275ef05 100644 --- a/web/src/hooks/channels/useChannelsData.jsx +++ b/web/src/hooks/channels/useChannelsData.jsx @@ -613,7 +613,7 @@ export const useChannelsData = () => { switch (type) { case 'priority': if (data.priority === undefined || data.priority === '') { - showInfo('优先级必须是整数!'); + showInfo(t('优先级必须是整数!')); return; } data.priority = parseInt(data.priority); @@ -624,7 +624,7 @@ export const useChannelsData = () => { data.weight < 0 || data.weight === '' ) { - showInfo('权重必须是非负整数!'); + showInfo(t('权重必须是非负整数!')); return; } data.weight = parseInt(data.weight); @@ -634,7 +634,7 @@ export const useChannelsData = () => { try { const res = await API.put('/api/channel/tag', data); if (res?.data?.success) { - showSuccess('更新成功!'); + showSuccess(t('更新成功!')); await refresh(); } } catch (error) { @@ -749,7 +749,6 @@ export const useChannelsData = () => { const updateChannelBalance = async (record) => { if (record?.type === 57) { openCodexUsageModal({ - t, record, onCopy: async (text) => { const ok = await copy(text); @@ -1201,7 +1200,6 @@ export const useChannelsData = () => { formInitValues, // Helpers - t, isMobile, // Functions diff --git a/web/src/hooks/chat/useTokenKeys.js b/web/src/hooks/chat/useTokenKeys.js index 0aed11004c..3982b33373 100644 --- a/web/src/hooks/chat/useTokenKeys.js +++ b/web/src/hooks/chat/useTokenKeys.js @@ -20,6 +20,7 @@ For commercial licensing, please contact support@quantumnous.com import { useEffect, useState } from 'react'; import { fetchTokenKeys, getServerAddress } from '../../helpers/token'; import { showError } from '../../helpers'; +import i18next from 'i18next'; export function useTokenKeys(id) { const [keys, setKeys] = useState([]); @@ -30,7 +31,9 @@ export function useTokenKeys(id) { const loadAllData = async () => { const fetchedKeys = await fetchTokenKeys(); if (fetchedKeys.length === 0) { - showError('当前没有可用的启用令牌,请确认是否有令牌处于启用状态!'); + showError( + i18next.t('当前没有可用的启用令牌,请确认是否有令牌处于启用状态!'), + ); setTimeout(() => { window.location.href = '/console/token'; }, 1500); // 延迟 1.5 秒后跳转 diff --git a/web/src/hooks/common/useHeaderBar.js b/web/src/hooks/common/useHeaderBar.js index 02b005e56e..9f080f8fc7 100644 --- a/web/src/hooks/common/useHeaderBar.js +++ b/web/src/hooks/common/useHeaderBar.js @@ -232,6 +232,5 @@ export const useHeaderBar = ({ onMobileMenuToggle, drawerOpen }) => { handleThemeToggle, handleMobileMenuToggle, navigate, - t, }; }; diff --git a/web/src/hooks/common/useNavigation.js b/web/src/hooks/common/useNavigation.js index f7e61a203a..f1af021d63 100644 --- a/web/src/hooks/common/useNavigation.js +++ b/web/src/hooks/common/useNavigation.js @@ -18,8 +18,10 @@ For commercial licensing, please contact support@quantumnous.com */ import { useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; -export const useNavigation = (t, docsLink, headerNavModules) => { +export const useNavigation = (docsLink, headerNavModules) => { + const { t } = useTranslation(); const mainNavLinks = useMemo(() => { // 默认配置,如果没有传入配置则显示所有模块 const defaultModules = { diff --git a/web/src/hooks/dashboard/useDashboardData.js b/web/src/hooks/dashboard/useDashboardData.js index b51bcc40c5..d02fd1929b 100644 --- a/web/src/hooks/dashboard/useDashboardData.js +++ b/web/src/hooks/dashboard/useDashboardData.js @@ -316,9 +316,8 @@ export const useDashboardData = (userState, userDispatch, statusState) => { refresh, handleSearchConfirm, - // 导航和翻译 + // 导航 navigate, - t, isMobile, }; }; diff --git a/web/src/hooks/mj-logs/useMjLogsData.js b/web/src/hooks/mj-logs/useMjLogsData.js index 66f4e4f772..913beac2d0 100644 --- a/web/src/hooks/mj-logs/useMjLogsData.js +++ b/web/src/hooks/mj-logs/useMjLogsData.js @@ -332,7 +332,5 @@ export const useMjLogsData = () => { enrichLogs, syncPageData, - // Translation - t, }; }; diff --git a/web/src/hooks/model-deployments/useDeploymentsData.jsx b/web/src/hooks/model-deployments/useDeploymentsData.jsx index dfda01f0d0..5db1ff1cb1 100644 --- a/web/src/hooks/model-deployments/useDeploymentsData.jsx +++ b/web/src/hooks/model-deployments/useDeploymentsData.jsx @@ -516,7 +516,5 @@ export const useDeploymentsData = () => { // Batch operations batchDeleteDeployments, - // Translation - t, }; }; diff --git a/web/src/hooks/model-pricing/useModelPricingData.jsx b/web/src/hooks/model-pricing/useModelPricingData.jsx index 55eb2eaabf..97ac06501f 100644 --- a/web/src/hooks/model-pricing/useModelPricingData.jsx +++ b/web/src/hooks/model-pricing/useModelPricingData.jsx @@ -393,8 +393,5 @@ export const useModelPricingData = () => { // 引用 compositionRef, - - // 国际化 - t, }; }; diff --git a/web/src/hooks/models/useModelsData.jsx b/web/src/hooks/models/useModelsData.jsx index b1bd8b65d6..f65461096a 100644 --- a/web/src/hooks/models/useModelsData.jsx +++ b/web/src/hooks/models/useModelsData.jsx @@ -484,9 +484,6 @@ export const useModelsData = () => { setEditingVendor, loadVendors, - // Translation - t, - // Upstream sync syncing, previewing, diff --git a/web/src/hooks/playground/usePlaygroundState.js b/web/src/hooks/playground/usePlaygroundState.js index 79be10134a..21f321eefa 100644 --- a/web/src/hooks/playground/usePlaygroundState.js +++ b/web/src/hooks/playground/usePlaygroundState.js @@ -87,14 +87,14 @@ export const usePlaygroundState = () => { // 消息相关状态 - 使用加载的消息或默认消息初始化 const [message, setMessage] = useState( - () => initialMessages || getDefaultMessages(t), + () => initialMessages || getDefaultMessages(), ); // 当语言改变时,如果是默认消息则更新 useEffect(() => { // 只在没有保存的消息时才更新默认消息 if (!initialMessages) { - setMessage(getDefaultMessages(t)); + setMessage(getDefaultMessages()); } }, [t, initialMessages]); // 当语言改变时 @@ -203,7 +203,7 @@ export const usePlaygroundState = () => { if (resetMessages) { setMessage([]); setTimeout(() => { - setMessage(getDefaultMessages(t)); + setMessage(getDefaultMessages()); }, 0); } }, []); diff --git a/web/src/hooks/redemptions/useRedemptionsData.jsx b/web/src/hooks/redemptions/useRedemptionsData.jsx index 26b0f3a109..8d53e18832 100644 --- a/web/src/hooks/redemptions/useRedemptionsData.jsx +++ b/web/src/hooks/redemptions/useRedemptionsData.jsx @@ -228,10 +228,10 @@ export const useRedemptionsData = () => { // Copy text const copyText = async (text) => { if (await copy(text)) { - showSuccess('已复制到剪贴板!'); + showSuccess(t('已复制到剪贴板!')); } else { Modal.error({ - title: '无法复制到剪贴板,请手动复制', + title: t('无法复制到剪贴板,请手动复制'), content: text, size: 'large', }); @@ -354,7 +354,5 @@ export const useRedemptionsData = () => { batchCopyRedemptions, batchDeleteRedemptions, - // Translation function - t, }; }; diff --git a/web/src/hooks/subscriptions/useSubscriptionsData.jsx b/web/src/hooks/subscriptions/useSubscriptionsData.jsx index f426501b90..541edc61ab 100644 --- a/web/src/hooks/subscriptions/useSubscriptionsData.jsx +++ b/web/src/hooks/subscriptions/useSubscriptionsData.jsx @@ -160,7 +160,5 @@ export const useSubscriptionsData = () => { openCreate, openEdit, - // Translation - t, }; }; diff --git a/web/src/hooks/task-logs/useTaskLogsData.js b/web/src/hooks/task-logs/useTaskLogsData.js index 6ba3de3882..eaaf7ff3f9 100644 --- a/web/src/hooks/task-logs/useTaskLogsData.js +++ b/web/src/hooks/task-logs/useTaskLogsData.js @@ -370,7 +370,5 @@ export const useTaskLogsData = () => { enrichLogs, syncPageData, - // Translation - t, }; }; diff --git a/web/src/hooks/tokens/useTokensData.jsx b/web/src/hooks/tokens/useTokensData.jsx index 063ee82997..8aa705ce24 100644 --- a/web/src/hooks/tokens/useTokensData.jsx +++ b/web/src/hooks/tokens/useTokensData.jsx @@ -192,8 +192,7 @@ export const useTokensData = (openFluentNotification) => { // Search tokens function const searchTokens = async (page = 1, size = pageSize) => { const normalizedPage = Number.isInteger(page) && page > 0 ? page : 1; - const normalizedSize = - Number.isInteger(size) && size > 0 ? size : pageSize; + const normalizedSize = Number.isInteger(size) && size > 0 ? size : pageSize; const { searchKeyword, searchToken } = getFormValues(); if (searchKeyword === '' && searchToken === '') { @@ -401,7 +400,5 @@ export const useTokensData = (openFluentNotification) => { batchCopyTokens, syncPageData, - // Translation - t, }; }; diff --git a/web/src/hooks/usage-logs/useUsageLogsData.jsx b/web/src/hooks/usage-logs/useUsageLogsData.jsx index b69a7cf188..f666a25eee 100644 --- a/web/src/hooks/usage-logs/useUsageLogsData.jsx +++ b/web/src/hooks/usage-logs/useUsageLogsData.jsx @@ -344,7 +344,10 @@ export const useLogsData = () => { let other = getLogOther(logs[i].other); let expandDataLocal = []; - if (isAdminUser && (logs[i].type === 0 || logs[i].type === 2 || logs[i].type === 6)) { + if ( + isAdminUser && + (logs[i].type === 0 || logs[i].type === 2 || logs[i].type === 6) + ) { expandDataLocal.push({ key: t('渠道信息'), value: `${logs[i].channel} - ${logs[i].channel_name || '[未知]'}`, @@ -546,7 +549,14 @@ export const useLogsData = () => { expandDataLocal.push({ key: t('失败原因'), value: ( -
+
{other.reason}
), @@ -708,7 +718,7 @@ export const useLogsData = () => { const copyText = async (e, text) => { e.stopPropagation(); if (await copy(text)) { - showSuccess('已复制:' + text); + showSuccess(t('已复制:') + text); } else { Modal.error({ title: t('无法复制到剪贴板,请手动复制'), content: text }); } @@ -796,7 +806,5 @@ export const useLogsData = () => { hasExpandableRows, setLogType, - // Translation - t, }; }; diff --git a/web/src/hooks/users/useUsersData.jsx b/web/src/hooks/users/useUsersData.jsx index 96e1a194de..90ab71127a 100644 --- a/web/src/hooks/users/useUsersData.jsx +++ b/web/src/hooks/users/useUsersData.jsx @@ -315,7 +315,5 @@ export const useUsersData = () => { closeEditUser, getFormValues, - // Translation - t, }; }; diff --git a/web/src/i18n/locales/en.json b/web/src/i18n/locales/en.json index f6c13e7d8d..1d44f3c6be 100644 --- a/web/src/i18n/locales/en.json +++ b/web/src/i18n/locales/en.json @@ -8,6 +8,8 @@ " 个模型设置相同的值": " models with the same value", " 吗?": "?", " 秒": "s", + " 秒。": " seconds.", + ",当前无生效订阅,将自动使用钱包": ", no active subscription. Wallet will be used automatically.", ",时间:": ",time:", ",点击更新": ", click Update", "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(Currently only supports Epay interface, the default callback address is the server address above!)", @@ -22,25 +24,33 @@ "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", + "{{name}} ID": "{{name}} ID", "{{ratioType}} {{ratio}}": "{{ratioType}} {{ratio}}", + "• 如果无法获取验证码,请使用备用码": "• If you cannot get the verification code, use a backup code", + "• 每个备用码只能使用一次": "• Each backup code can only be used once", "• 视频服务商的跨域限制": "• Cross-origin limitations from the video provider", "• 防盗链保护机制": "• Hotlink protection mechanisms", "• 需要特定的请求头或认证": "• Specific headers or authentication are required", + "• 验证码每30秒更新一次": "• Verification code updates every 30 seconds", "© {{currentYear}}": "© {{currentYear}}", "| 基于": " | Based on ", "$/1M tokens": "$/1M tokens", "0 - 最低": "0 - Lowest", + "0 表示不限": "0 means unlimited", "0.002-1之间的小数": "Decimal between 0.002-1", "0.1以上的小数": "Decimal above 0.1", + "1) 点击「打开授权页面」完成登录;2) 浏览器会跳转到 localhost(页面打不开也没关系);3) 复制地址栏完整 URL 粘贴到下方;4) 点击「生成并填入」。": "1) Click \"Open Authorization Page\" to complete login; 2) Browser will redirect to localhost (it's OK if the page doesn't load); 3) Copy the full URL from the address bar and paste it below; 4) Click \"Generate and Fill In\".", "10 - 最高": "10 - Highest", "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "1h cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", "1h缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (1h缓存创建倍率: {{cacheCreationRatio1h}})": "1h cache creation price: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (1h cache creation ratio: {{cacheCreationRatio1h}})", "2 - 低": "2 - Low", "2025年5月10日后添加的渠道,不需要再在部署的时候移除模型名称中的\".\"": "After May 10, 2025, channels added do not need to remove the dot in the model name during deployment", + "360 智脑": "360 AI Brain", "360智脑": "360 AI Brain", "5 - 正常(默认)": "5 - Normal (default)", "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "5m cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", "5m缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (5m缓存创建倍率: {{cacheCreationRatio5m}})": "5m cache creation price: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (5m cache creation ratio: {{cacheCreationRatio5m}})", + "5小时窗口": "5-hour window", "8 - 高": "8 - High", "AGPL v3.0协议": "AGPL v3.0 License", "AI 对话": "AI Chat", @@ -58,6 +68,11 @@ "API令牌管理": "API token management", "API使用记录": "API usage records", "API信息": "API Information", + "API信息已删除,请及时点击”保存设置”进行保存": "API info deleted, please click \"Save Settings\" to save", + "API信息已更新": "API info updated", + "API信息已更新,请及时点击”保存设置”进行保存": "API info updated, please click \"Save Settings\" to save", + "API信息已添加,请及时点击”保存设置”进行保存": "API info added, please click \"Save Settings\" to save", + "API信息更新失败": "Failed to update API info", "API信息管理,可以配置多个API地址用于状态展示和负载均衡(最多50个)": "API information management, you can configure multiple API addresses for status display and load balancing (maximum 50)", "API地址": "Base URL", "API渠道配置": "API channel configuration", @@ -65,16 +80,32 @@ "Authorization callback URL 填": "Fill in the Authorization callback URL", "Authorization Endpoint": "Authorization Endpoint", "auto分组调用链路": "auto group call chain", + "Available": "Available", "Bark推送URL": "Bark Push URL", "Bark推送URL必须以http://或https://开头": "Bark push URL must start with http:// or https://", "Bark通知": "Bark notification", + "Basic Auth 头": "Basic Auth Header", + "Cache Directory": "Cache Directory", + "Cached tokens": "Cached tokens", + "Cached tokens 占比口径由后端返回:Claude 语义按 cached/(prompt+cached),其余按 cached/prompt。": "Cached token ratio calculated by backend: Claude uses cached/(prompt+cached), others use cached/prompt.", "Changing batch type to:": "Changing batch type to:", + "ChatCompletions→Responses 兼容配置": "ChatCompletions→Responses Compatibility Config", + "ChatCompletions→Responses 兼容配置(Beta)": "ChatCompletions→Responses Compatibility (Beta)", + "Claude 强制 beta=true": "Force Claude beta=true", "Claude思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Claude thinking adaptation BudgetTokens = MaxTokens * BudgetTokens percentage", "Claude设置": "Claude settings", "Claude请求头覆盖": "Claude request header override", "Client ID": "Client ID", "Client Secret": "Client Secret", + "Codex 授权": "Codex Authorization", + "Codex 渠道不支持批量创建": "Codex channels do not support batch creation", + "Codex 用量": "Codex Usage", "common.changeLanguage": "Change Language", + "Completion tokens": "Completion tokens", + "Configuration": "Configuration", + "context_int/context_string 从请求上下文读取;gjson 从入口请求的 JSON body 按 gjson path 读取。": "context_int/context_string reads from request context; gjson reads from the entry request JSON body via gjson path.", + "CPU 使用率超过此值时拒绝请求": "Reject requests when CPU usage exceeds this value", + "CPU 阈值 (%)": "CPU Threshold (%)", "Creem API 密钥,敏感信息不显示": "Creem API key, sensitive information not displayed", "Creem Setting Tips": "Creem only supports preset fixed-amount products. These products and their prices need to be created and configured in advance on the Creem website, so custom dynamic amount top-ups are not supported. Configure the product name and price on Creem, obtain the Product Id, and then fill it in for the product below. Set the top-up amount and display price for this product in the new API.", "Creem 介绍": "Creem is the payment partner you always deserved, we strive for simplicity and straightforwardness on our APIs.", @@ -87,8 +118,15 @@ "Discord Client ID": "Discord Client ID", "Discord Client Secret": "Discord Client Secret", "Discord ID": "Discord ID", + "Discovery claims": "Discovery claims", + "Discovery scopes": "Discovery scopes", + "Discovery 建议 scopes:": "Suggested Discovery scopes:", "EUR (欧元)": "EUR (Euro)", "false": "false", + "GC execution failed": "GC execution failed", + "GC 已执行": "GC executed", + "GC 执行失败": "GC execution failed", + "GC 次数": "GC Count", "Gemini安全设置": "Gemini safety settings", "Gemini思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Gemini thinking adaptation BudgetTokens = MaxTokens * BudgetTokens percentage", "Gemini思考适配设置": "Gemini thinking adaptation settings", @@ -98,34 +136,53 @@ "GitHub Client ID": "GitHub Client ID", "GitHub Client Secret": "GitHub Client Secret", "GitHub ID": "GitHub ID", + "Goroutine 数": "Goroutine Count", "Gotify应用令牌": "Gotify application token", "Gotify服务器地址": "Gotify server address", "Gotify服务器地址必须以http://或https://开头": "Gotify server address must start with http:// or https://", "Gotify通知": "Gotify notification", - "Grok设置": "Grok Settings", "GPU/容器": "GPU/Container", "GPU数量": "Number of GPUs", + "Grok设置": "Grok Settings", "Homepage URL 填": "Fill in the Homepage URL", "ID": "ID", + "id(用户 ID)": "id (User ID)", + "include_obfuscation 用于控制 Responses 流混淆字段。默认关闭以避免客户端关闭该安全保护": "include_obfuscation controls the Responses stream obfuscation field. Disabled by default to prevent clients from disabling this security protection", + "inference_geo 字段用于控制 Claude 数据驻留推理区域。默认关闭以避免未经授权透传地域信息": "inference_geo controls Claude data residency inference region. Disabled by default to prevent unauthorized geo information passthrough", "IP": "IP", "IP白名单": "IP Whitelist", "IP白名单(支持CIDR表达式)": "IP whitelist (supports CIDR expressions)", "IP限制": "IP restrictions", "IP黑名单": "IP blacklist", "JSON": "JSON", + "JSON 模式": "JSON Mode", "JSON 模式支持手动输入或上传服务账号 JSON": "JSON mode supports manual input or upload service account JSON", "JSON格式密钥,请确保格式正确": "JSON format key, please ensure the format is correct", "JSON格式错误": "JSON format error", "JSON编辑": "JSON Editor", "JSON解析错误:": "JSON parsing error:", + "Key": "Key", + "Key 或 Path": "Key or Path", + "Key 指纹": "Key Fingerprint", + "Key 摘要": "Key Summary", + "Key 来源": "Key Source", + "Key 来源类型": "Key Source Type", "Linux DO Client ID": "Linux DO Client ID", "Linux DO Client Secret": "Linux DO Client Secret", "LinuxDO": "LinuxDO", "LinuxDO ID": "LinuxDO ID", "Logo 图片地址": "Logo image address", + "Logo 已更新": "Logo updated", + "Logo 更新失败": "Failed to update logo", "Midjourney 任务记录": "Midjourney Task Records", "MIT许可证": "MIT License", "New API项目仓库地址:": "New API project repository address: ", + "NewAPI 默认不会将入口请求的 User-Agent 透传到上游渠道;该条件仅用于识别访问本站点的客户端。": "NewAPI does not passthrough the entry request User-Agent to upstream channels by default; this condition is only used to identify clients accessing this site.", + "OAuth Client ID": "OAuth Client ID", + "OAuth Client Secret": "OAuth Client Secret", + "OAuth 登录失败:": "OAuth login failed: ", + "OAuth 端点": "OAuth Endpoints", + "OAuth 配置错误:授权端点必须是完整的 URL(以 http:// 或 https:// 开头)": "OAuth configuration error: Authorization endpoint must be a full URL (starting with http:// or https://)", "OIDC": "OIDC", "OIDC ID": "OIDC ID", "Ollama 模型管理": "Ollama Model Management", @@ -137,13 +194,21 @@ "Passkey 注册失败,请重试": "Passkey registration failed. Please try again.", "Passkey 注册成功": "Passkey registration successful", "Passkey 登录": "Passkey Login", + "Passkey 登录失败,请重试": "Passkey login failed, please try again", + "Passkey 验证失败,请重试": "Passkey verification failed, please try again", "Ping间隔(秒)": "Ping Interval (seconds)", + "POST 参数": "POST Parameters", "price_xxx 的商品价格 ID,新建产品后可获得": "Product price ID for price_xxx, available after creating new product", + "Prompt cache hit tokens": "Prompt cache hit tokens", + "Prompt tokens": "Prompt tokens", "Reasoning Effort": "Reasoning Effort", "Recharge Quota": "Recharge Quota", + "Request ID": "Request ID", "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "The safety_identifier field helps OpenAI identify application users who may violate usage policies. Disabled by default to protect user privacy", + "Scopes(可选)": "Scopes (optional)", "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "The service_tier field is used to specify service level. Allowing pass-through may result in higher billing than expected. Disabled by default to avoid extra charges", "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "Stripe key for sk_xxx or rk_xxx, sensitive information not displayed", + "Slug只能包含字母、数字、下划线和连字符": "Slug can only contain letters, numbers, underscores, and hyphens", "SMTP 发送者邮箱": "SMTP Sender Email", "SMTP 服务器地址": "SMTP Server Address", "SMTP 端口": "SMTP Port", @@ -155,22 +220,33 @@ "SSRF防护设置": "SSRF Protection Settings", "SSRF防护详细说明": "SSRF protection prevents malicious users from using your server to access internal network resources. Configure whitelists for trusted domains/IPs and restrict allowed ports. Applies to file downloads, webhooks, and notifications.", "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "The store field authorizes OpenAI to store request data for product evaluation and optimization. Disabled by default. Enabling may cause Codex to malfunction", - "免责声明:仅限个人使用,请勿分发或共享任何凭证。该渠道存在前置条件与使用门槛,请在充分了解流程与风险后使用,并遵守 OpenAI 的相关条款与政策。相关凭证与配置仅限接入 Codex CLI 使用,不适用于其他客户端、平台或渠道。": "Disclaimer: Personal use only. Do not distribute or share any credentials. This channel has prerequisites and requires prior setup; use only if you understand the flow and risks, and comply with OpenAI’s terms and policies. Credentials and configuration are for Codex CLI integration only, and are not intended for any other client, platform, or channel.", "Stripe 设置": "Stripe Settings", + "Stripe/Creem 商品ID(可选)": "Stripe/Creem Product ID (optional)", + "Stripe/Creem 需在第三方平台创建商品并填入 ID": "Stripe/Creem products must be created on the third-party platform and the ID filled in", "Telegram": "Telegram", "Telegram Bot Token": "Telegram Bot Token", "Telegram Bot 名称": "Telegram Bot Name", "Telegram ID": "Telegram ID", "Token Endpoint": "Token Endpoint", + "token 会按倍率换算成“额度/次数”,请求结束后再做差额结算(补扣/返还)。": "Tokens are converted to quota/count by multiplier. After the request, the difference is settled (charged/refunded).", + "Total tokens": "Total tokens", "true": "true", + "TTL(秒,0 表示默认)": "TTL (seconds, 0 for default)", + "TTL(秒)": "TTL (seconds)", "Turnstile Secret Key": "Turnstile Secret Key", "Turnstile Site Key": "Turnstile Site Key", "Unix时间戳": "Unix timestamp", "Uptime Kuma地址": "Uptime Kuma Address", "Uptime Kuma监控分类管理,可以配置多个监控分类用于服务状态展示(最多20个)": "Uptime Kuma monitoring category management, you can configure multiple monitoring categories for service status display (maximum 20)", + "Uptime Kuma配置已更新": "Uptime Kuma config updated", + "Uptime Kuma配置更新失败": "Failed to update Uptime Kuma config", + "URL 标识,只能包含小写字母、数字和连字符": "URL identifier, can only contain lowercase letters, numbers, and hyphens", "URL链接": "URL Link", "USD (美元)": "USD (US Dollar)", "User Info Endpoint": "User Info Endpoint", + "User-Agent include": "User-Agent include", + "User-Agent include(每行一个,可不写)": "User-Agent include (one per line, optional)", + "Value 正则": "Value Regex", "Vertex AI 不支持 functionResponse.id 字段,开启后将自动移除该字段": "Vertex AI does not support the functionResponse.id field. When enabled, this field will be automatically removed", "Webhook 密钥": "Webhook Secret", "Webhook 签名密钥": "Webhook Signature Key", @@ -197,19 +273,24 @@ "上一步": "Previous", "上次保存: ": "Last saved: ", "上游倍率同步": "Upstream ratio synchronization", + "上游状态码:": "Upstream status code:", "上游返回": "Upstream response", "下一个表单块": "Next form block", "下一步": "Next", "下午好": "Good afternoon", "下载日志": "Download Logs", "不再提醒": "Do not remind again", + "不升级": "No upgrade", "不同用户分组的价格信息": "Price information for different user groups", "不填则为模型列表第一个": "First model in list if empty", "不建议使用": "Not recommended", "不支持": "Not supported", "不是合法的 JSON 字符串": "Not a valid JSON string", "不更改": "Not change", + "不重置": "No reset", + "不限": "Unlimited", "不限制": "Unlimited", + "不需要在末尾加/v1,New API会自动处理,添加后可能导致请求失败,是否继续?": "No need to add /v1 at the end, New API handles it automatically. Adding it may cause request failures. Continue?", "与本地相同": "Same as local", "专属倍率": "Exclusive group ratio", "两次输入的密码不一致": "The two passwords entered do not match", @@ -226,10 +307,14 @@ "个人信息设置": "Personal information settings", "个人设置": "Personal Settings", "个实例": " instances", + "个已过期": "expired", "个性化设置": "Personalization Settings", "个性化设置左侧边栏的显示内容": "Personalize the display content of the left sidebar", + "个月": "Month(s)", + "个月前": "months ago", "个未配置模型": "models not configured", "个模型": "models", + "个生效中": "active", "个部署吗?此操作不可逆。": " deployments? This operation cannot be undone.", "中午好": "Good afternoon", "为一个 JSON 对象,例如:{\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}": "Is a JSON object, e.g.: {\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}", @@ -246,6 +331,7 @@ "为一个 JSON 文本,键为组名称,值为倍率": "Is a JSON text with group name as key and ratio as value", "为了保护账户安全,请验证您的两步验证码。": "To protect account security, please verify your two-factor authentication code.", "为了保护账户安全,请验证您的身份。": "To protect account security, please verify your identity.", + "为保证匹配准确,请确保客户端直连本站点(避免反向代理/网关改写 User-Agent)。": "To ensure accurate matching, make sure the client connects directly to this site (avoid reverse proxy/gateway rewriting User-Agent).", "为空则默认使用服务器地址,多个 Origin 用逗号分隔,例如 https://newapi.pro,https://newapi.com ,注意不能携带[],需使用https": "If empty, defaults to server address. Multiple Origins separated by commas, e.g.: https://newapi.pro,https://newapi.com. Note: cannot contain [], must use https", "主页链接填": "Enter homepage link", "之前的所有日志": "All previous logs", @@ -264,13 +350,21 @@ "仅对自定义模型有效": "Only effective for custom models", "仅当自动禁用开启时有效,关闭后不会自动禁用该渠道": "Only effective when automatic disabling is enabled, after closing, the channel will not be automatically disabled", "仅支持": "Only supports", + "仅支持 JSON 对象,必须包含 access_token 与 account_id": "Only JSON objects are supported, must contain access_token and account_id", "仅支持 JSON 文件": "Only JSON files are supported", "仅支持 JSON 文件,支持多文件": "Only JSON files are supported, multiple files are supported", "仅支持 OpenAI 接口格式": "Only OpenAI interface format is supported", + "仅显示已绑定": "Show bound only", "仅显示矛盾倍率": "Only show conflicting ratios", "仅用于开发环境,生产环境应使用 HTTPS": "For development only, use HTTPS in production", + "仅用于换算,实际保存的是额度": "For conversion only, quota is what gets saved", + "仅用订阅": "Subscription only", + "仅用钱包": "Wallet only", "仅重置配置": "Reset configuration only", + "今天": "Today", "今日关闭": "Close Today", + "今日已签到": "Checked in today", + "今日已签到,累计签到": "Checked in today, total check-ins", "从官方模型库同步": "Sync from official model library", "从认证器应用中获取验证码,或使用备用码": "Get verification code from authenticator app, or use backup code", "从配置文件同步": "Sync from config file", @@ -285,6 +379,7 @@ "令牌已重置并已复制到剪贴板": "Token has been reset and copied to clipboard", "令牌更新成功!": "Token updated successfully!", "令牌的额度仅用于限制令牌本身的最大额度使用量,实际的使用受到账户的剩余额度限制": "The quota of the token is only used to limit the maximum quota usage of the token itself, and the actual usage is limited by the remaining quota of the account", + "令牌端点": "Token Endpoint", "令牌管理": "Token Management", "以下上游数据可能不可信:": "The following upstream data may not be reliable: ", "以下文件解析失败,已忽略:{{list}}": "The following files failed to parse and have been ignored: {{list}}", @@ -302,17 +397,28 @@ "价格重新计算中...": "Recalculating price...", "价格预估": "Price Estimate", "任务 ID": "Task ID", + "任务ID": "Task ID", "任务日志": "Task Logs", "任务状态": "Status", "任务记录": "Task Records", "企业账户为特殊返回格式,需要特殊处理,如果非企业账户,请勿勾选": "Enterprise accounts have special return format and require special handling. If not an enterprise account, do not check this option", "优先级": "Priority", + "优先级必须是整数!": "Priority must be an integer!", + "优先订阅": "Subscription first", + "优先钱包": "Wallet first", "优惠": "Discount", "低于此额度时将发送邮件提醒用户": "Email reminder will be sent when quota falls below this", "余额": "Balance", "余额充值管理": "Balance recharge management", + "作废": "Invalidate", + "作废于": "Invalidated at", + "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "After invalidation, the subscription becomes invalid immediately. History is not affected. Continue?", + "作用域": "Scope", + "作用域:包含分组": "Scope: Include Group", + "作用域:包含规则名称": "Scope: Include Rule Name", "你似乎并没有修改什么": "You seem to have not modified anything", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "You can manually add them under “Custom model names”, click Fill and submit, or use the actions below to handle them automatically.", + "使用 {{name}} 继续": "Continue with {{name}}", "使用 Discord 继续": "Continue with Discord", "使用 GitHub 继续": "Continue with GitHub", "使用 JSON 对象格式,格式为:{\"组名\": [最多请求次数, 最多请求完成次数]}": "Use JSON object format, format: {\"group_name\": [max_requests, max_completions]}", @@ -325,13 +431,21 @@ "使用 用户名 注册": "Sign up with Username", "使用 邮箱或用户名 登录": "Sign in with Email or Username", "使用ID排序": "Sort by ID", + "使用备用码": "Use Backup Code", "使用日志": "Usage Logs", "使用模式": "Usage mode", "使用统计": "Usage Statistics", "使用认证器应用(如 Google Authenticator、Microsoft Authenticator)扫描下方二维码:": "Use an authenticator app (such as Google Authenticator, Microsoft Authenticator) to scan the QR code below:", "使用认证器应用扫描二维码": "Scan QR code with authenticator app", + "使用认证器验证码": "Use Authenticator Code", + "例如": "e.g.", + "例如 /var/cache/new-api": "e.g. /var/cache/new-api", "例如 €, £, Rp, ₩, ₹...": "For example, €, £, Rp, ₩, ₹...", + "例如 100000…": "e.g. 100000...", + "例如 3600…": "e.g. 3600...", + "例如 600…": "e.g. 600...", "例如 https://docs.newapi.pro": "E.g., https://docs.newapi.pro", + "例如 prefer-by-conversation-id…": "e.g. prefer-by-conversation-id...", "例如:": "For example:", "例如: /bin/bash -c \"python app.py\"": "e.g.: /bin/bash -c \"python app.py\"", "例如: nginx:latest": "e.g.: nginx:latest", @@ -344,13 +458,28 @@ "例如:2,就是最低充值2$": "e.g.: 2, means minimum top-up is $2", "例如:2000": "e.g.: 2000", "例如:4.99": "e.g.: 4.99", + "例如:401, 403, 429, 500-599": "e.g. 401,403,429,500-599", "例如:7,就是7元/美金": "e.g.: 7, means 7 yuan per USD", + "例如:email": "e.g.: email", "例如:example.com": "e.g.: example.com", + "例如:github / si:google / https://example.com/logo.png / 🐱": "e.g.: github / si:google / https://example.com/logo.png / 🐱", + "例如:GitHub Enterprise": "e.g.: GitHub Enterprise", + "例如:github-enterprise": "e.g.: github-enterprise", + "例如:https://example.com/.well-known/openid-configuration": "e.g.: https://example.com/.well-known/openid-configuration", + "例如:https://gitea.example.com": "e.g.: https://gitea.example.com", + "例如:https://workername.yourdomain.workers.dev": "e.g.: https://workername.yourdomain.workers.dev", "例如:https://yourdomain.com": "e.g.: https://yourdomain.com", + "例如:name、full_name": "e.g.: name, full_name", "例如:nginx:latest": "e.g.: nginx:latest", + "例如:preferred_username、login": "e.g.: preferred_username, login", "例如:preview": "e.g.: preview", "例如:prod_6I8rBerHpPxyoiU9WK4kot": "e.g.: prod_6I8rBerHpPxyoiU9WK4kot", + "例如:sub、id、data.user.id": "e.g.: sub, id, data.user.id", "例如:基础套餐": "e.g.: Basic Package", + "例如:适合轻度使用": "e.g.: Suitable for light usage", + "例如:需要等级 {{required}},你当前等级 {{current}}": "e.g.: Level {{required}} required, your current level is {{current}}", + "例如(全渠道):": "Example (all channels):", + "例如(指定渠道):": "Example (specific channels):", "例如发卡网站的购买链接": "E.g., purchase link from card issuing website", "供应商": "Provider", "供应商介绍": "Provider introduction", @@ -379,12 +508,14 @@ "保存失败,请重试": "Save failed, please try again", "保存失败:": "Save failed:", "保存屏蔽词过滤设置": "Save sensitive word filtering settings", + "保存性能设置": "Save Performance Settings", "保存成功": "Saved successfully", "保存数据看板设置": "Save data dashboard settings", "保存日志设置": "Save log settings", "保存模型倍率设置": "Save model ratio settings", "保存模型速率限制": "Save model rate limit settings", "保存监控设置": "Save Monitoring Settings", + "保存签到设置": "Save check-in settings", "保存绘图设置": "Save drawing settings", "保存聊天设置": "Save chat settings", "保存设置": "Save Settings", @@ -403,17 +534,22 @@ "倍率是为了方便换算不同价格的模型": "The magnification is to facilitate the conversion of models with different prices.", "倍率模式": "Ratio Mode", "倍率类型": "Ratio type", + "偏好设置": "Preferences", + "停止中": "Stopping", "停止测试": "Stop Testing", "停用": "Deactivate", "允许 AccountFilter 参数": "Allow AccountFilter parameter", "允许 HTTP 协议图片请求(适用于自部署代理)": "Allow HTTP protocol image requests (for self-deployed proxies)", + "允许 inference_geo 透传": "Allow inference_geo passthrough", "允许 safety_identifier 透传": "Allow safety_identifier Pass-through", "允许 service_tier 透传": "Allow service_tier Pass-through", + "允许 stream_options.include_obfuscation 透传": "Allow stream_options.include_obfuscation passthrough", "允许 Turnstile 用户校验": "Allow Turnstile user verification", "允许不安全的 Origin(HTTP)": "Allow insecure Origin (HTTP)", "允许回调(会泄露服务器 IP 地址)": "Allow callback (will leak server IP address)", "允许在 Stripe 支付中输入促销码": "Allow entering promotion codes during Stripe checkout", "允许新用户注册": "Allow new user registration", + "允许注册的最低信任等级": "Minimum trust level for registration", "允许的 Origins": "Allowed Origins", "允许的IP,一行一个,不填写则不限制": "Allowed IPs, one per line, not filled in means no restrictions", "允许的端口": "Allowed Ports", @@ -444,10 +580,11 @@ "充值金额折扣配置不是合法的 JSON 对象": "Top Up amount discount configuration is not a valid JSON object", "充值链接": "Top Up Link", "充值额度": "Top Up Quota", + "先填写配置,再自动填充 OAuth 端点,能显著减少手工输入": "Fill in the config first, then auto-fill OAuth endpoints to significantly reduce manual input", + "免责声明:仅限个人使用,请勿分发或共享任何凭证。该渠道存在前置条件与使用门槛,请在充分了解流程与风险后使用,并遵守 OpenAI 的相关条款与政策。相关凭证与配置仅限接入 Codex CLI 使用,不适用于其他客户端、平台或渠道。": "Disclaimer: Personal use only. Do not distribute or share any credentials. This channel has prerequisites and requires prior setup; use only if you understand the flow and risks, and comply with OpenAI’s terms and policies. Credentials and configuration are for Codex CLI integration only, and are not intended for any other client, platform, or channel.", "兑换人ID": "Redeemer ID", "兑换成功!": "Redemption successful!", "兑换码充值": "Redemption code recharge", - "清理不活跃缓存": "Clean up inactive cache", "兑换码创建成功": "Redemption Code Created", "兑换码创建成功,是否下载兑换码?": "Redemption code created successfully. Do you want to download it?", "兑换码创建成功!": "Redemption code created successfully!", @@ -474,7 +611,10 @@ "全部类型": "All types", "公告": "Announcement", "公告内容": "Notice Content", + "公告已删除,请及时点击”保存设置”进行保存": "Announcement deleted, please click \"Save Settings\" to save", "公告已更新": "Notice updated", + "公告已更新,请及时点击”保存设置”进行保存": "Announcement updated, please click \"Save Settings\" to save", + "公告已添加,请及时点击”保存设置”进行保存": "Announcement added, please click \"Save Settings\" to save", "公告更新失败": "Notice update failed", "公告类型": "Notice Type", "共": "Total", @@ -488,6 +628,8 @@ "共 {{total}} 项,当前显示 {{start}}-{{end}} 项": "{{total}} items total, showing {{start}}-{{end}} items", "关": "Off", "关于": "About", + "关于内容已更新": "About content updated", + "关于内容更新失败": "Failed to update about content", "关于我们": "About Us", "关于系统的详细信息": "Detailed information about the system", "关于项目": "About Project", @@ -496,15 +638,22 @@ "关闭侧边栏": "Close sidebar", "关闭公告": "Close Notice", "关闭后,此模型将不会被“同步官方”自动覆盖或创建": "After closing, this model will not be automatically overwritten or created by \"Sync Official\"", + "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?": "After closing, this notice will no longer be shown (only for this browser). Are you sure you want to close it?", "关闭弹窗,已停止批量测试": "Dialog closed, batch testing stopped", + "关闭提示": "Close notice", "其他": "Other", "其他注册选项": "Other registration options", "其他登录选项": "Other login options", "其他设置": "Other Settings", "其他详情": "Other details", + "内存 阈值 (%)": "Memory Threshold (%)", + "内存使用率超过此值时拒绝请求": "Reject requests when memory usage exceeds this value", + "内存命中": "Memory Hits", + "内存缓存最大条目数。0 表示使用后端默认容量:100000。": "Maximum memory cache entries. 0 uses backend default capacity: 100000.", "内容": "Content", "内容较大,已启用性能优化模式": "Content is large, performance optimization mode enabled", "内容较大,部分功能可能受限": "Content is large, some features may be limited", + "内置": "Built-in", "内置 Ollama 镜像": "Built-in Ollama Image", "再次输入部署名称": "Enter Deployment Name Again", "最低": "lowest", @@ -514,10 +663,21 @@ "最后请求": "Last request", "最大GPU数量": "Max Number of GPUs", "最大可用": "Max Available", + "最大条目数": "Max Entries", + "最终抵扣": "Final Deduction", + "最近一次": "Last", "最近事件": "Recent Events", + "写": "Write", + "准入策略": "Access Policy", + "准入策略 JSON(可选)": "Access Policy JSON (optional)", + "准备中": "Preparing", "准备中...": "Preparing...", "准备完成初始化": "Ready to complete initialization", + "凭证已刷新": "Credentials refreshed", "分类名称": "Category Name", + "分类已删除,请及时点击”保存设置”进行保存": "Category deleted, please click \"Save Settings\" to save", + "分类已更新,请及时点击”保存设置”进行保存": "Category updated, please click \"Save Settings\" to save", + "分类已添加,请及时点击”保存设置”进行保存": "Category added, please click \"Save Settings\" to save", "分组": "Group", "分组与模型定价设置": "Group and Model Pricing Settings", "分组价格": "Group price", @@ -530,6 +690,7 @@ "分组速率配置优先级高于全局速率限制。": "Group rate configuration priority is higher than global rate limit.", "分组速率限制": "Group rate limit", "分钟": "minutes", + "分钟前": "minutes ago", "切换为Assistant角色": "Switch to Assistant role", "切换为System角色": "Switch to System role", "切换为单密钥模式": "Switch to single key mode", @@ -540,21 +701,26 @@ "划转额度": "Transfer amount", "列出的模型将不会自动添加或移除-thinking/-nothinking 后缀": "Models in this list will not automatically add or remove the -thinking/-nothinking suffix.", "列设置": "Column settings", + "刚刚": "just now", "创建": "Create", "创建令牌默认选择auto分组,初始令牌也将设为auto(否则留空,为用户默认分组)": "Create token with auto group by default, initial token will also be set to auto (otherwise leave blank for user default group)", "创建失败": "Creation failed", + "创建成功": "Created successfully", "创建或选择密钥时,将 Project 设置为 io.cloud": "When creating or selecting a key, set Project to io.cloud", "创建新用户账户": "Create new user account", "创建新的令牌": "Create New Token", "创建新的兑换码": "Create a new redemption code", "创建新的模型": "Create new model", "创建新的渠道": "Create New Channel", + "创建新的订阅套餐": "Create a New Subscription Plan", "创建新的预填组": "Create new pre-filled group", "创建时间": "Creation Time", "创建用户": "Create User", "初始化失败,请重试": "Initialization failed, please retry", "初始化系统": "Initialize system", "删除": "Delete", + "删除 Key 来源": "Delete Key Source", + "删除会彻底移除该订阅记录(含权益明细)。是否继续?": "Deletion will permanently remove this subscription record (including benefit details). Continue?", "删除后无法恢复,确定要删除模型 \"{{name}}\" 吗?": "Cannot be recovered after deletion, are you sure you want to delete model \"{{name}}\"?", "删除失败": "Delete failed", "删除密钥失败": "Failed to delete key", @@ -565,17 +731,23 @@ "删除禁用密钥失败": "Failed to delete disabled keys", "删除禁用通道": "Delete disabled channels", "删除自动禁用密钥": "Delete auto disabled keys", + "删除规则": "Delete Rule", "删除账户": "Delete Account", "删除账户确认": "Delete Account Confirmation", "删除部署失败": "Failed to delete deployment", "刷新": "Refresh", + "刷新凭证": "Refresh Credentials", "刷新失败": "Refresh failed", "刷新容器信息": "Refresh Container Info", "刷新日志": "Refresh Logs", + "刷新统计": "Refresh Stats", + "刷新缓存统计": "Refresh Cache Stats", + "刷新缓存统计失败": "Failed to refresh cache stats", "前往 io.net API Keys": "Go to io.net API Keys", "前往设置": "Go to Settings", "前往设置页面": "Go to Settings Page", "前缀": "Prefix", + "前缀名称匹配": "Prefix Name Match", "副本数量": "Number of Replicas", "剩余": "Remaining", "剩余备用码:": "Remaining backup codes: ", @@ -604,27 +776,40 @@ "加载账单失败": "Failed to load bills", "加载隐私政策内容失败...": "Failed to load privacy policy content...", "包含": "Contains", + "包含名称匹配": "Contains Name Match", "包含来自未知或未标明供应商的AI模型,这些模型可能来自小型供应商或开源项目。": "Includes AI models from unknown or unmarked suppliers, which may come from small suppliers or open-source projects.", "包括失败请求的次数,0代表不限制": "Including failed request times, 0 means no limit", "匹配类型": "Matching type", "区域": "Region", + "升级分组": "Upgrade Group", "单GPU小时费率": "Per GPU Hour Rate", + "即梦": "Jimeng", "历史消耗": "Consumption", "原价": "Original price", "原因:": "Reason: ", + "原始 JSON": "Raw JSON", "原密码": "Original Password", + "原生格式": "Native format", + "原生额度": "Raw quota", "去重完成:去重前 {{before}} 个密钥,去重后 {{after}} 个密钥": "Deduplication completed: {{before}} keys before deduplication, {{after}} keys after deduplication", "参与官方同步": "Participate in official sync", "参数": "parameter", + "参数传递": "In Parameters", "参数值": "Parameter value", "参数覆盖": "Parameters override", + "参数覆盖必须是合法的 JSON 格式!": "Parameter override must be valid JSON format!", + "参数配置": "Parameter Config", "参照生视频": "Reference video generation", "友情链接": "Friendly links", "发布日期": "Publish Date", "发布时间": "Publish Time", + "发现文档地址(Discovery URL,可选)": "Discovery URL (optional)", + "发行者 URL(Issuer URL)": "Issuer URL", + "发送验证码失败,请重试": "Failed to send verification code, please try again", "取消": "Cancel", "取消全选": "Deselect all", "取消选择": "Deselect", + "受限": "Restricted", "变换": "Transform", "变焦": "zoom", "变量值": "Variable Value", @@ -634,17 +819,29 @@ "只有当用户设置开启IP记录时,才会进行请求和错误类型日志的IP记录": "Only when the user sets IP recording, the IP recording of request and error type logs will be performed", "可信": "Reliable", "可在设置页面设置关于内容,支持 HTML & Markdown": "The About content can be set on the settings page, supporting HTML & Markdown", + "可手动填写,多个 scope 用空格分隔": "Can be filled manually, separate multiple scopes with spaces", + "可灵": "Kling", + "可用": "Available", "可用令牌分组": "Available token groups", "可用分组": "Available groups", + "可用变量:{{provider}} {{field}} {{op}} {{required}} {{current}} 以及 {{current.path}}": "Available variables: {{provider}} {{field}} {{op}} {{required}} {{current}} and {{current.path}}", "可用数量": "Available Quantity", "可用模型": "Available models", + "可用率": "Availability", + "可用空间: {{free}} / 总空间: {{total}}": "Free: {{free}} / Total: {{total}}", "可用端点类型": "Supported endpoint types", "可用邀请额度": "Available invitation quota", + "可留空;留空时会尝试使用 Issuer URL + /.well-known/openid-configuration": "Can be left empty; when empty, will try using Issuer URL + /.well-known/openid-configuration", "可视化": "Visualization", "可视化倍率设置": "Visual model ratio settings", "可视化编辑": "Visual editing", "可选,公告的补充说明": "Optional, additional information for the notice", "可选,用于复现结果": "Optional, for reproducibility", + "可选:基于用户信息 JSON 做组合条件准入,条件不满足时返回自定义提示": "Optional: Conditional access based on user info JSON, returns custom message when conditions are not met", + "可选:用于自动生成端点或 Discovery URL": "Optional: Used to auto-generate endpoints or Discovery URL", + "可选。匹配入口请求的 User-Agent;任意一行作为子串匹配(忽略大小写)即命中。": "Optional. Match entry request User-Agent; any line matching as substring (case-insensitive) triggers the rule.", + "可选。对提取到的亲和 Key 做正则校验;不填表示不校验。": "Optional. Regex validation on extracted affinity key; leave empty to skip validation.", + "可选。对请求路径进行匹配;不填表示匹配所有路径。": "Optional. Match request path; leave empty to match all paths.", "可选值": "Optional value", "同时重置消息": "Reset messages simultaneously", "同步": "Sync", @@ -661,19 +858,23 @@ "名称匹配类型": "Name matching type", "后端请求失败": "Backend request failed", "后缀": "Suffix", + "后缀名称匹配": "Suffix Name Match", "否": "No", "启动": "Start", "启动参数 (Args)": "Startup Args", "启动命令": "Startup Command", "启动命令 (Entrypoint)": "Entrypoint", + "启动授权失败": "Failed to start authorization", "启动时间": "Startup Time", "启动部署失败": "Failed to start deployment", "启动配置": "Startup Configuration", "启用": "Enable", + "启用 Creem 支付": "Enable Creem Payments", "启用 io.net 部署": "Enable io.net Deployment", "启用 io.net 部署开关": "Enable io.net Deployment Switch", "启用 io.net 部署时必须填写 API Key": "API Key is required when enabling io.net deployment", "启用 Prompt 检查": "Enable Prompt check", + "启用 Stripe 支付": "Enable Stripe Payments", "启用2FA失败": "Failed to enable Two-Factor Authentication", "启用Claude思考适配(-thinking后缀)": "Enable Claude thinking adaptation (-thinking suffix)", "启用FunctionCall思维签名填充": "Enable FunctionCall thoughtSignature fill", @@ -681,36 +882,54 @@ "启用Ping间隔": "Enable Ping interval", "启用SMTP SSL": "Enable SMTP SSL", "启用SSRF防护(推荐开启以保护服务器安全)": "Enable SSRF Protection (Recommended for server security)", + "启用供应商": "Enable Vendor", "启用全部": "Enable all", "启用后可接入 io.net GPU 资源": "After enabling, you can access io.net GPU resources", "启用后可添加图片URL进行多模态对话": "After enabling, you can add image URLs for multimodal conversations", + "启用后套餐将在用户端展示。是否继续?": "After enabling, the plan will be shown to users. Continue?", + "启用后将优先复用上一次成功的渠道(粘滞选路)。": "When enabled, the last successful channel will be preferred (sticky routing).", "启用后将使用 Creem Test Mode": "Use Creem Test Mode after enabling", "启用密钥失败": "Failed to enable key", "启用屏蔽词过滤功能": "Enable sensitive word filtering function", + "启用性能监控": "Enable Performance Monitoring", + "启用性能监控后,当系统资源使用率超过设定阈值时,将拒绝新的 Relay 请求 (/v1, /v1beta 等),以保护系统稳定性。": "When performance monitoring is enabled and system resource usage exceeds the set threshold, new Relay requests (/v1, /v1beta, etc.) will be rejected to protect system stability.", "启用所有密钥失败": "Failed to enable all keys", "启用数据看板(实验性)": "Enable data dashboard (experimental)", "启用此模式后,将使用您自定义的请求体发送API请求,模型配置面板的参数设置将被忽略。": "After enabling this mode, your custom request body will be used to send API requests, and parameter settings in the model configuration panel will be ignored.", + "启用状态": "Enabled Status", "启用用户模型请求速率限制(可能会影响高并发性能)": "Enable user model request rate limit (may affect high concurrency performance)", + "启用磁盘缓存": "Enable Disk Cache", + "启用磁盘缓存后,大请求体将临时存储到磁盘而非内存,可显著降低内存占用,适用于处理包含大量图片/文件的请求。建议在 SSD 环境下使用。": "When enabled, large request bodies are temporarily stored on disk instead of memory, significantly reducing memory usage. Suitable for requests with large images/files. SSD recommended.", + "启用签到功能": "Enable check-in feature", "启用绘图功能": "Enable drawing function", "启用请求体透传功能": "Enable request body pass-through functionality", "启用请求透传": "Enable request pass-through", + "启用违规扣费": "Enable violation deduction", "启用额度消费日志记录": "Enable quota consumption logging", "启用验证": "Enable Authentication", - "启用违规扣费": "Enable violation deduction", "周": "week", + "周前": "weeks ago", + "周期": "period(s)", + "命中判定:usage 中存在 cached tokens(例如 cached_tokens/prompt_cache_hit_tokens)即视为命中。": "Hit criteria: cached tokens present in usage (e.g. cached_tokens/prompt_cache_hit_tokens) counts as a hit.", + "命中率": "Hit Rate", + "命名规则": "Naming Rule", "和": "and", "和Claude不同,默认情况下Gemini的思考模型会自动决定要不要思考,就算不开启适配模型也可以正常使用,如果您需要计费,推荐设置无后缀模型价格按思考价格设置。支持使用 gemini-2.5-pro-preview-06-05-thinking-128 格式来精确传递思考预算。": "Unlike Claude, Gemini thinking models automatically decide whether to think by default. They work normally even without the adapter enabled. If you need billing, set the price of models without suffix to the thinking price. Use format like gemini-2.5-pro-preview-06-05-thinking-128 to specify exact thinking budget.", "响应": "Response", "响应时间": "Response time", + "响应缺少凭据": "Response missing credentials", + "响应缺少授权链接": "Response missing authorization link", "商品价格 ID": "Product Price ID", "回答内容": "Answer Content", "回调 URL 填": "Callback URL Fill", + "回调 URL 格式": "Callback URL format", "回调地址": "Callback address", "固定价格": "Fixed Price", "固定价格(每次)": "Fixed Price (per use)", "固定价格值": "Fixed Price Value", "图像生成": "Image Generation", "图标": "Icon", + "图标使用 react-icons(Simple Icons)或 URL/emoji,例如:github、gitlab、si:google": "Icon uses react-icons (Simple Icons) or URL/emoji, e.g.: github, gitlab, si:google", "图标使用@lobehub/icons库,如:OpenAI、Claude.Color,支持链式参数:OpenAI.Avatar.type={'platform'}、OpenRouter.Avatar.shape={'square'},查询所有可用图标请 ": "The icon uses the @lobehub/icons library, such as: OpenAI, Claude.Color, supports chain parameters: OpenAI.Avatar.type={'platform'}, OpenRouter.Avatar.shape={'square'}, query all available icons please ", "图混合": "Blend", "图片功能在自定义请求体模式下不可用": "Image functionality is not available in custom request body mode", @@ -727,6 +946,7 @@ "在Gotify服务器的应用管理中创建新应用": "Create a new application in the Gotify server's application management", "在找兑换码?": "Looking for a redemption code? ", "在新标签页中打开": "Open in new tab", + "在模型广场向用户展示的端点": "Endpoint shown to users in Model Marketplace", "在此输入 Logo 图片地址": "Enter the Logo image URL here", "在此输入新的公告内容,支持 Markdown & HTML 代码": "Enter the new announcement content here, supports Markdown & HTML code", "在此输入新的关于内容,支持 Markdown & HTML 代码。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为关于页面": "Enter new about content here, support Markdown", @@ -739,14 +959,24 @@ "域名白名单": "Domain Whitelist", "域名黑名单": "Domain Blacklist", "基本信息": "Basic Information", + "填充 Codex / Claude Code 模版": "Fill Codex / Claude Code Template", + "填充模板:等级+激活": "Fill Template: Level + Activation", + "填充模板:等级提示": "Fill Template: Level Prompt", + "填充模板:组织或角色": "Fill Template: Organization or Role", + "填充模板:组织提示": "Fill Template: Organization Prompt", + "填充模板(全渠道)": "Fill template (all channels)", + "填充模板(指定渠道)": "Fill template (selected channels)", "填入": "Fill", "填入所有模型": "Fill in all models", "填入模板": "Fill Template", - "填入透传模版": "Fill Passthrough Template", - "填入透传完整模版": "Fill Full Passthrough Template", "填入相关模型": "Fill Related Models", + "填入透传完整模版": "Fill Full Passthrough Template", + "填入透传模版": "Fill Passthrough Template", + "填写 Issuer URL 后自动生成:": "Auto-generated after filling Issuer URL:", "填写Gotify服务器的完整URL地址": "Fill in the complete URL address of the Gotify server", + "填写后会自动拼接预设端点": "Preset endpoints will be auto-appended after filling", "填写带https的域名,逗号分隔": "Fill in domains with https, separated by commas", + "填写服务器地址后自动生成:": "Auto-generated after entering server address: ", "填写用户协议内容后,用户注册时将被要求勾选已阅读用户协议": "After filling in the user agreement content, users will be required to check that they have read the user agreement during registration", "填写隐私政策内容后,用户注册时将被要求勾选已阅读隐私政策": "After filling in the privacy policy content, users will be required to check that they have read the privacy policy during registration", "处理中": "Processing", @@ -754,12 +984,15 @@ "备份状态": "Backup state", "备注": "Remark", "备用恢复代码": "Backup recovery codes", + "备用码": "Backup Code", "备用码已复制到剪贴板": "Backup codes copied to clipboard", + "备用码必须是8位": "Backup code must be 8 digits", "备用码重新生成成功": "Backup codes regenerated successfully", "复制": "Copy", "复制代码": "Copy code", "复制令牌": "Copy token", "复制全部": "Copy all", + "复制功能需要 HTTPS 环境,请手动复制": "Copy function requires HTTPS, please copy manually", "复制名称": "Copy name", "复制失败": "Copy failed", "复制失败,请手动复制": "Copy failed, please copy manually", @@ -771,6 +1004,7 @@ "复制所有模型": "Copy all models", "复制所选令牌": "Copy selected token", "复制所选兑换码到剪贴板": "Copy selected redemption codes to clipboard", + "复制授权链接": "Copy Authorization Link", "复制日志": "Copy Logs", "复制渠道的所有信息": "Copy all information for a channel", "复制版本号": "Copy Version", @@ -785,18 +1019,29 @@ "天": "day", "天前": "days ago", "失败": "Failed", + "失败原因": "Failure Reason", + "失败后不重试": "No retry after failure", "失败时自动禁用通道": "Automatically disable channel on failure", "失败重试次数": "Failed retry times", "奖励说明": "Reward description", + "套餐": "Plan", + "套餐副标题": "Plan Subtitle", + "套餐名称": "Plan Name", + "套餐标题": "Plan Title", + "套餐标题不能为空": "Plan title cannot be empty", + "套餐的基本信息和定价": "Basic plan info and pricing", "如:大带宽批量分析图片推荐": "e.g. Large bandwidth batch analysis of image recommendations", "如:香港线路": "e.g. Hong Kong line", + "如果亲和到的渠道失败,重试到其他渠道成功后,将亲和更新到成功的渠道。": "If the affinity channel fails, after retrying and succeeding with another channel, the affinity will be updated to the successful channel.", "如果你对接的是上游One API或者New API等转发项目,请使用OpenAI类型,不要使用此类型,除非你知道你在做什么。": "If you are connecting to upstream One API or New API forwarding projects, please use OpenAI type. Do not use this type unless you know what you are doing.", "如果用户请求中包含系统提示词,则使用此设置拼接到用户的系统提示词前面": "If the user request contains a system prompt, this setting will be appended to the user's system prompt", "如果镜像为私有,请填写密码或Token": "If the image is private, please fill in the password or token", "如果镜像为私有,请填写用户名": "If the image is private, please fill in the username", "始终使用浅色主题": "Always use light theme", "始终使用深色主题": "Always use dark theme", + "字段映射": "Field Mapping", "字段透传控制": "Field Pass-through Control", + "字节火山方舟、豆包通用": "ByteDance Volcengine / Doubao", "存在惩罚,鼓励讨论新话题": "Presence penalty, encourages discussing new topics", "存在重复的键名:": "Duplicate key names exist:", "安全提醒": "Security reminder", @@ -812,8 +1057,8 @@ "完整的 Base URL,支持变量{model}": "Complete Base URL, supports variable {model}", "官方": "Official", "官方文档": "Official documentation", - "官方说明": "Official documentation", "官方模型同步": "Official models sync", + "官方说明": "Official documentation", "定价模式": "Pricing Mode", "定时测试所有通道": "Periodically test all channels", "定期更改密码可以提高账户安全性": "Regularly changing your password can improve account security", @@ -850,8 +1095,11 @@ "密码重置": "Password Reset", "密码重置完成": "Password reset completed", "密码重置确认": "Password Reset Confirmation", + "密码长度不得小于 8 位!": "Password must be at least 8 characters!", "密码长度至少为8个字符": "Password must be at least 8 characters long", "密钥": "Key", + "密钥 JSON 必须包含 access_token": "Secret JSON must contain access_token", + "密钥 JSON 必须包含 account_id": "Secret JSON must contain account_id", "密钥(编辑模式下,保存的密钥不会显示)": "Key (in edit mode, saved keys will not be displayed)", "密钥去重": "Key deduplication", "密钥将以Bearer方式添加到请求头中,用于验证webhook请求的合法性": "The key will be added to the request header as Bearer to verify the legitimacy of the webhook request", @@ -859,6 +1107,8 @@ "密钥已启用": "Key has been enabled", "密钥已复制到剪贴板": "Key copied to clipboard", "密钥已禁用": "Key has been disabled", + "密钥必须是 JSON 对象": "Secret must be a JSON object", + "密钥必须是合法的 JSON 格式!": "Secret must be valid JSON format!", "密钥文件 (.json)": "Key file (.json)", "密钥更新模式": "Key update mode", "密钥格式": "Key format", @@ -885,9 +1135,13 @@ "将仅保留第一个密钥文件,其余文件将被移除,是否继续?": "Only the first key file will be retained, and the remaining files will be removed. Continue?", "将删除": "Deleting", "将删除已使用、已禁用及过期的兑换码,此操作不可撤销。": "This will delete all used, disabled, and expired redemption codes, this operation cannot be undone.", + "将删除所有仍在内存中的渠道亲和性缓存条目。": "All channel affinity cache entries still in memory will be deleted.", + "将大请求体临时存储到磁盘": "Store large request bodies temporarily on disk", "将清除所有保存的配置并恢复默认设置,此操作不可撤销。是否继续?": "This will clear all saved configurations and restore default settings, this operation cannot be undone. Continue?", "将清除选定时间之前的所有日志": "This will clear all logs before the selected time", + "将追加 2 条规则到现有规则列表。": "2 rules will be appended to the existing rule list.", "小时": "Hour", + "小时前": "hours ago", "小时费率": "Hourly Rate", "尚未使用": "Not used yet", "局部重绘-提交": "Vary Region", @@ -896,18 +1150,27 @@ "展开": "Expand", "展开更多": "Expand more", "展示价格": "Display Pricing", + "嵌入模型:MokaAI M3E": "Embedding Model: MokaAI M3E", "左侧边栏个人设置": "Personal settings in left sidebar", "已为 {{count}} 个模型设置{{type}}_one": "Set {{type}} for {{count}} model", "已为 {{count}} 个模型设置{{type}}_other": "Set {{type}} for {{count}} models", "已为 ${count} 个渠道设置标签!": "Set tags for ${count} channels!", + "已从 Discovery 自动填充配置": "Config auto-filled from Discovery", + "已从 Discovery 获取配置,可继续手动修改所有字段。": "Config retrieved from Discovery, you can continue to manually modify all fields.", + "已作废": "Invalidated", + "已使用": "Used", + "已使用:": "Used:", + "已保存偏好为": "Saved preference: ", "已修复 ${success} 个通道,失败 ${fails} 个通道。": "Fixed ${success} channels, failed ${fails} channels.", "已停止": "Stopped", "已停止批量测试": "Stopped batch testing", "已关闭后续提醒": "Subsequent notifications turned off", + "已分配内存": "Allocated Memory", "已切换为Assistant角色": "Switched to Assistant role", "已切换为System角色": "Switched to System role", "已切换至最优倍率视图,每个模型使用其最低倍率分组": "Switched to the optimal ratio view, each model uses its lowest ratio group", "已初始化": "Initialized", + "已删除": "Deleted", "已删除 {{count}} 个令牌!": "Deleted {{count}} tokens!", "已删除 {{count}} 个令牌!_one": "Deleted {{count}} token!", "已删除 {{count}} 个令牌!_other": "Deleted {{count}} tokens!", @@ -916,13 +1179,18 @@ "已删除 ${data} 个通道!": "Deleted ${data} channels!", "已删除所有禁用渠道,共计 ${data} 个": "Deleted all disabled channels, total ${data}", "已删除消息及其回复": "Deleted message and its replies", + "已发起支付": "Payment initiated", "已发送到 Fluent": "Sent to Fluent", "已取消 Passkey 注册": "Passkey registration cancelled", + "已取消 Passkey 登录": "Passkey login cancelled", "已同步到渠道": "Synced to Channel", "已启用": "Enabled", "已启用 Passkey,无需密码即可登录": "Passkey enabled, login without password", "已启用所有密钥": "All keys have been enabled", "已在自定义模式中忽略": "Ignored in custom mode", + "已填充提示模板": "Prompt template filled", + "已填充模版": "Template filled", + "已填充策略模板": "Policy template filled", "已备份": "Backed up", "已复制": "Copied", "已复制 ${count} 个模型": "Copied ${count} models", @@ -939,6 +1207,8 @@ "已完成": "Completed", "已开启全局请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "Global request pass-through is enabled. Built-in NewAPI features such as parameter overrides, model redirection, and channel adaptation will be disabled. This is not a best practice. If this causes issues, please do not submit an issue.", "已成功开始测试所有已启用通道,请刷新页面查看结果。": "Successfully started testing all enabled channels. Please refresh page to view results.", + "已打开授权页面": "Authorization page opened", + "已打开支付页面": "Payment page opened", "已提交": "Submitted", "已支付金额": "Amount Paid", "已新增 {{count}} 个模型:{{list}}_one": "Added {{count}} model: {{list}}", @@ -952,31 +1222,44 @@ "已注销": "Logged out", "已添加": "Added", "已添加到白名单": "Added to whitelist", + "已清空": "Cleared", "已清空测试结果": "Cleared test results", + "已生成授权凭据": "Authorization credentials generated", "已用": "Used", "已用/剩余": "Used/Remaining", "已用额度": "Quota used", "已禁用": "Disabled", "已禁用所有密钥": "Disabled all keys", + "已终止": "Terminated", "已绑定": "Bound", "已绑定渠道": "Bound channels", "已结束": "Ended", "已耗尽": "Exhausted", "已解锁豆包自定义 API 地址编辑": "Custom Doubao API address editing unlocked", + "已达上限": "Limit reached", + "已达到购买上限": "Purchase limit reached", "已过期": "Expired", "已运行时间": "Uptime", "已选择 {{count}} 个模型_one": "Selected {{count}} model", "已选择 {{count}} 个模型_other": "Selected {{count}} models", "已选择 {{selected}} / {{total}}": "Selected {{selected}} / {{total}}", "已选择 ${count} 个渠道": "Selected ${count} channels", + "已部署": "Deployed", "已重置为默认配置": "Reset to default configuration", "已销毁": "Destroyed", + "币种": "Currency", + "常用上下文 Key(用于 context_*)": "Common context keys (for context_*)", "常见问答": "FAQ", + "常见问答已更新": "FAQ updated", + "常见问答更新失败": "Failed to update FAQ", "常见问答管理,为用户提供常见问题的答案(最多50个,前端显示最新20条)": "FAQ management, providing answers to common questions for users (maximum 50, display latest 20 on the front end)", "平台": "platform", "平均RPM": "Average RPM", "平均TPM": "Average TPM", "平移": "Pan", + "年": "Year(s)", + "年前": "years ago", + "应付金额": "Amount Due", "应用同步": "Apply synchronization", "应用更改": "Apply changes", "应用覆盖": "Apply overwrite", @@ -994,18 +1277,25 @@ "开": "On", "开启之后会清除用户提示词中的": "After enabling, the user prompt will be cleared", "开启之后将上游地址替换为服务器地址": "After enabling, the upstream address will be replaced with the server address", + "开启后,using_group 会参与 cache key(不同分组隔离)。": "When enabled, using_group is included in the cache key (isolated by group).", "开启后,仅\"消费\"和\"错误\"日志将记录您的客户端IP地址": "After enabling, only \"consumption\" and \"error\" logs will record your client IP address", "开启后,对免费模型(倍率为0,或者价格为0)的模型也会预消耗额度": "After enabling, free models (ratio 0 or price 0) will also pre-consume quota", "开启后,将定期发送ping数据保持连接活跃": "After enabling, ping data will be sent periodically to keep the connection active", "开启后,当前分组渠道失败时会按顺序尝试下一个分组的渠道": "After enabling, when the current group channel fails, it will try the next group's channel in order", "开启后,所有请求将直接透传给上游,不会进行任何处理(重定向和渠道适配也将失效),请谨慎开启": "When enabled, all requests will be directly forwarded to the upstream without any processing (redirects and channel adaptation will also be disabled). Please enable with caution.", + "开启后,若该规则命中且请求失败,将不会切换渠道重试。": "When enabled, if this rule matches and the request fails, no channel retry will occur.", + "开启后,规则名称会参与 cache key(不同规则隔离)。": "When enabled, the rule name is included in the cache key (isolated by rule).", + "开启后,该渠道请求 Claude 时将强制追加 ?beta=true(无需客户端手动传参)": "When enabled, requests to Claude through this channel will force append ?beta=true (no need for client to pass it manually)", "开启后,违规请求将额外扣费。": "When enabled, violation requests will incur additional charges.", "开启后不限制:必须设置模型倍率": "After enabling, no limit: must set model ratio", "开启后未登录用户无法访问模型广场": "When enabled, unauthenticated users cannot access the model marketplace", "开启批量操作": "Enable batch selection", + "开始": "Start", "开始同步": "Start sync", "开始批量测试 ${count} 个模型,已清空上次结果...": "Starting batch test of ${count} models, cleared previous results...", "开始时间": "start time", + "异常": "Error", + "异步任务退款": "Async Task Refund", "张图片": " images", "弱变换": "High Variation", "强制将响应格式化为 OpenAI 标准格式(只适用于OpenAI渠道类型)": "Force format responses to OpenAI standard format (Only for OpenAI channel types)", @@ -1015,6 +1305,7 @@ "当上游通道返回错误中包含这些关键词时(不区分大小写),自动禁用通道": "When the upstream channel returns an error containing these keywords (not case-sensitive), automatically disable the channel", "当前 API 密钥已过期,请在设置中更新。": "Current API key has expired, please update it in settings.", "当前 Ollama 版本为 ${version}": "Current Ollama version is ${version}", + "当前仅 OpenAI / Claude 语义支持缓存 token 统计,其他通道将隐藏 token 相关字段。": "Currently only OpenAI / Claude semantics support cached token statistics, other channels will hide token-related fields.", "当前余额": "Current balance", "当前值": "Current value", "当前分组为 auto,会自动选择最优分组,当一个组不可用时自动降级到下一个组(熔断机制)": "The current group is auto, it will automatically select the optimal group, and automatically downgrade to the next group when a group is unavailable (breakage mechanism)", @@ -1023,23 +1314,30 @@ "当前未开启Midjourney回调,部分项目可能无法获得绘图结果,可在运营设置中开启。": "Current Midjourney callback is not enabled, some projects may not be able to obtain drawing results, which can be enabled in the operation settings.", "当前查看的分组为:{{group}},倍率为:{{ratio}}": "Current group: {{group}}, ratio: {{ratio}}", "当前模型列表为该标签下所有渠道模型列表最长的一个,并非所有渠道的并集,请注意可能导致某些渠道模型丢失。": "The current model list is the longest one among all channel model lists under this tag, not the union of all channels. Please note that this may cause some channel models to be lost.", + "当前没有可用的启用令牌,请确认是否有令牌处于启用状态!": "No enabled tokens available, please check if any tokens are in enabled state!", + "当前浏览器不支持 Passkey": "Current browser does not support Passkey", "当前版本": "Current version", "当前状态": "Current Status", + "当前环境无法使用 Passkey 登录": "Cannot use Passkey login in current environment", + "当前缓存大小": "Current Cache Size", "当前计费": "Current billing", "当前设备不支持 Passkey": "Passkey is not supported on this device", "当前设置类型: ": "Current setting type: ", "当前跟随系统": "Currently following system", "当前配置无法连接到 io.net。": "Unable to connect to io.net with current configuration.", - "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知": "When wallet or subscription remaining quota falls below this value, the system will send a notification through the selected method", "当模型没有设置价格时仍接受调用,仅当您信任该网站时使用,可能会产生高额费用": "Accept calls even if the model has no price settings, use only when you trust the website, which may incur high costs", "当运行通道全部测试时,超过此时间将自动禁用通道": "When running all channel tests, the channel will be automatically disabled when this time is exceeded", + "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知": "When wallet or subscription remaining quota falls below this value, the system will send a notification through the selected method", "待使用收益": "Proceeds to be used", "待部署": "Pending Deployment", "微信": "WeChat", + "微信二维码": "WeChat QR Code", "微信公众号二维码图片链接": "WeChat Public Account QR Code Image Link", "微信扫码关注公众号,输入「验证码」获取验证码(三分钟内有效)": "Scan WeChat QR code to follow official account, enter \"verification code\" to get code (valid for 3 minutes)", "微信扫码登录": "WeChat scan code to log in", "微信账户绑定成功!": "WeChat account bound successfully!", + "必填:请输入服务器地址以自动生成完整端点 URL": "Required: Enter server address to auto-generate full endpoint URLs", + "必填。对请求的 model 名称进行匹配,任意一条匹配即命中该规则。": "Required. Match the model name in the request, any match triggers the rule.", "必须是有效的 JSON 字符串数组,例如:[\"g1\",\"g2\"]": "Must be a valid JSON string array, for example: [\"g1\",\"g2\"]", "忘记密码?": "Forgot password?", "快速开始": "Quick Start", @@ -1050,8 +1348,11 @@ "思考适配 BudgetTokens 百分比": "Thinking adaptation BudgetTokens percentage", "思考预算占比": "Thinking budget ratio", "性能指标": "Performance Indicators", + "性能监控": "Performance Monitor", + "性能设置": "Performance Settings", "总 GPU 小时": "Total GPU Hours", "总价:文字价格 {{textPrice}} + 音频价格 {{audioPrice}} = {{symbol}}{{total}}": "Total price: text price {{textPrice}} + audio price {{audioPrice}} = {{symbol}}{{total}}", + "总分配内存": "Total Allocated Memory", "总密钥数": "Total key count", "总收益": "total revenue", "总计": "Total", @@ -1062,6 +1363,7 @@ "您正在使用 MySQL 数据库。MySQL 是一个可靠的关系型数据库管理系统,适合生产环境使用。": "You are using the MySQL database. MySQL is a reliable relational database management system, suitable for production environments.", "您正在使用 PostgreSQL 数据库。PostgreSQL 是一个功能强大的开源关系型数据库系统,提供了出色的可靠性和数据完整性,适合生产环境使用。": "You are using the PostgreSQL database. PostgreSQL is a powerful open-source relational database system that provides excellent reliability and data integrity, suitable for production environments.", "您正在使用 SQLite 数据库。如果您在容器环境中运行,请确保已正确设置数据库文件的持久化映射,否则容器重启后所有数据将丢失!": "You are using the SQLite database. If you are running in a container environment, please ensure that the database file persistence mapping is correctly set, otherwise all data will be lost after container restart!", + "您正在使用默认密码!": "You are using the default password!", "您正在删除自己的帐户,将清空所有数据且不可恢复": "You are deleting your account. All data will be cleared and cannot be recovered.", "您的数据将安全地存储在本地计算机上。所有配置、用户信息和使用记录都会自动保存,关闭应用后不会丢失。": "Your data will be securely stored on your local computer. All configurations, user information, and usage records will be automatically saved and will not be lost when the application is closed.", "您确定要取消密码登录功能吗?这可能会影响用户的登录方式。": "Are you sure you want to disable the password login feature? This may affect users' login methods.", @@ -1070,9 +1372,12 @@ "想起来了?": "Remember?", "成功": "Success", "成功兑换额度:": "Successful redemption amount:", + "成功后切换亲和": "Switch Affinity on Success", "成功时自动启用通道": "Enable channel when successful", "我已了解禁用两步验证将永久删除所有相关设置和备用码,此操作不可撤销": "I have understood that disabling two-factor authentication will permanently delete all related settings and backup codes, this operation cannot be undone", "我已阅读并同意": "I have read and agree to", + "我的订阅": "My Subscriptions", + "我确认开启高危重试": "I confirm enabling high-risk retry", "或": "or", "或其兼容new-api-worker格式的其他版本": "or other versions compatible with new-api-worker format", "或手动输入密钥:": "Or manually enter the secret:", @@ -1083,6 +1388,9 @@ "手动编辑": "Manual editing", "手动输入": "Manual input", "打开侧边栏": "Open sidebar", + "打开授权页面": "Open Authorization Page", + "扣费": "Charge", + "执行 GC": "Run GC", "执行中": "processing", "扫描二维码": "Scan QR code", "批量创建": "Batch Create", @@ -1109,6 +1417,8 @@ "拉取新模型": "Pull New Model", "拉取模型": "Pull Model", "拉取进度": "Pull Progress", + "拒绝提示模板(可选)": "Rejection Prompt Template (optional)", + "拦截原因": "Block Reason", "按K显示单位": "Display in K", "按价格设置": "Set by price", "按倍率类型筛选": "Filter by ratio type", @@ -1120,6 +1430,9 @@ "换脸": "Face swap", "授权,需在遵守": " and must be used in compliance with the ", "授权失败": "Authorization failed", + "授权端点": "Authorization Endpoint", + "授权范围 (Scopes)": "Scopes", + "排序": "Sort Order", "排队中": "Queuing", "接受未设置价格模型": "Accept models without price settings", "接口凭证": "Interface credentials", @@ -1128,23 +1441,27 @@ "控制台区域": "Console Area", "控制输出的随机性和创造性": "Controls randomness and creativity of output", "控制顶栏模块显示状态,全局生效": "Control header module display status, global effect", + "推荐": "Recommended", "推荐:用户可以选择是否使用指纹等验证": "Recommended: Users can choose whether to use fingerprint verification", "推荐使用(用户可选)": "Recommended (user optional)", "描述": "Description", "提交": "Submit", "提交时间": "Submission time", "提交结果": "Results", + "提供商名称": "Provider Name", "提升": "Promote", "提示": "Prompt", "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "Prompt {{input}} tokens / 1M tokens * {{symbol}}{{price}}", "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Prompt {{input}} tokens / 1M tokens * {{symbol}}{{price}} + Completion {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 缓存创建 {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Prompt {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + Cache {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + Cache creation {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + Completion {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "提示:": "Note:", "提示:如需备份数据,只需复制上述目录即可": "Tip: To back up data, simply copy the directory above", + "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。": "Notice: This configuration only affects how models are displayed in the Model Marketplace and does not impact actual model invocation or routing. To configure real invocation behavior, please go to Channel Management.", + "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。": "Notice: This feature is beta. The configuration structure and behavior may change in the future. Do not use in production.", + "提示:语言偏好会同步到您登录的所有设备,并影响API返回的错误消息语言。": "Note: Language preference syncs across all your logged-in devices and affects the language of API error messages.", "提示:链接中的{key}将被替换为API密钥,{address}将被替换为服务器地址": "Tip: {key} in the link will be replaced with the API key, {address} will be replaced with the server address", "提示价格:{{symbol}}{{price}} / 1M tokens": "Prompt price: {{symbol}}{{price}} / 1M tokens", "提示缓存倍率": "Prompt cache ratio", - "缓存创建倍率": "Cache creation ratio", - "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)": "Defaults to the 5m cache creation ratio; the 1h cache creation ratio is computed by fixed multiplication (currently 1.6x)", "搜索供应商": "Search vendor", "搜索关键字": "Search keywords", "搜索失败": "Search failed", @@ -1161,17 +1478,26 @@ "操作": "Actions", "操作失败": "Operation failed", "操作失败,请重试": "Operation failed, please retry", + "操作失败: ": "Operation failed: ", "操作成功完成!": "Operation completed successfully!", "操作暂时被禁用": "Operation temporarily disabled", + "操作确认": "Operation confirmation", "操练场": "Playground", "操练场和聊天功能": "Playground and chat functions", + "支付": "Pay", "支付地址": "Payment address", + "支付失败": "Payment failed", "支付宝": "Alipay", "支付方式": "Payment method", + "支付渠道": "Payment Channels", "支付设置": "Payment Settings", "支付请求失败": "Payment request failed", "支付金额": "Payment Amount", "支持 Ctrl+V 粘贴图片": "Supports Ctrl+V to paste images", + "支持 JSONPath,如 email, data.user.email": "Supports JSONPath, e.g. email, data.user.email", + "支持 JSONPath,如 name, display_name, data.user.name": "Supports JSONPath, e.g. name, display_name, data.user.name", + "支持 JSONPath,如 preferred_username, login, data.user.username": "Supports JSONPath, e.g. preferred_username, login, data.user.username", + "支持 JSONPath,如 sub, id, data.user.id": "Supports JSONPath, e.g. sub, id, data.user.id", "支持6位TOTP验证码或8位备用码,可到`个人设置-安全设置-两步验证设置`配置或查看。": "Supports 6-digit TOTP verification code or 8-digit backup code, can be configured or viewed in `Personal Settings - Security Settings - Two-Factor Authentication Settings`.", "支持CIDR格式,如:8.8.8.8, 192.168.1.0/24": "Supports CIDR format, e.g.: 8.8.8.8, 192.168.1.0/24", "支持HTTP和HTTPS,填写Gotify服务器的完整URL地址": "Supports HTTP and HTTPS, enter the complete URL of the Gotify server", @@ -1179,11 +1505,15 @@ "支持众多的大模型供应商": "Supporting various LLM providers", "支持单个端口和端口范围,如:80, 443, 8000-8999": "Supports single ports and port ranges, e.g.: 80, 443, 8000-8999", "支持变量:": "Supported variables:", + "支持周期性重置套餐权益额度": "Supports periodic reset of plan quota", + "支持填写单个状态码或范围(含首尾),使用逗号分隔": "Supports single status codes or inclusive ranges; separate with commas", + "支持填写单个状态码或范围(含首尾),使用逗号分隔;504 和 524 始终不重试,不受此处配置影响": "Supports single status codes or inclusive ranges; separate with commas. 504 and 524 are never retried and are not affected by this setting", "支持备份": "Supported", "支持拉取 Ollama 官方模型库中的所有模型,拉取过程可能需要几分钟时间": "Supports pulling all models from the Ollama official model library, the pulling process may take a few minutes", "支持搜索用户的 ID、用户名、显示名称和邮箱地址": "Support searching for user ID, username, display name, and email address", "支持的图像模型": "Supported image models", "支持通配符格式,如:example.com, *.api.example.com": "Supports wildcard format, e.g.: example.com, *.api.example.com", + "支持逻辑 and/or 与嵌套 groups;操作符支持 eq/ne/gt/gte/lt/lte/in/not_in/contains/exists": "Supports logical and/or with nested groups; operators: eq/ne/gt/gte/lt/lte/in/not_in/contains/exists", "收益": "Earnings", "收益统计": "Income statistics", "收起": "Collapse", @@ -1214,10 +1544,16 @@ "文档": "Documentation", "文档地址": "Document Link", "文生视频": "Text-to-video", + "新增 Key 来源": "Add Key Source", "新增供应商": "Add vendor", + "新增失败": "Failed to add", + "新增成功": "Added successfully", + "新增规则": "Add Rule", + "新增订阅": "Add subscription", "新密码": "New Password", "新密码需要和原密码不一致!": "New password must be different from the old password!", "新建": "Create", + "新建套餐": "Create Plan", "新建容器": "Create Container", "新建容器部署": "Create Container Deployment", "新建数量": "New quantity", @@ -1237,13 +1573,17 @@ "无效的部署信息": "Invalid deployment information", "无效的重置链接,请重新发起密码重置请求": "Invalid reset link, please initiate a new password reset request", "无法发起 Passkey 注册": "Unable to initiate Passkey registration", + "无法发起 Passkey 登录": "Unable to initiate Passkey login", "无法复制到剪贴板,请手动复制": "Unable to copy to clipboard, please copy manually", + "无法复制此类型的消息内容": "Cannot copy this type of message content", "无法添加图片": "Unable to add image", "无法获取容器详情": "Unable to get container details", "无法连接 io.net": "Unable to connect to io.net", + "无生效": "No active", "无邀请人": "No Inviter", "无限制": "Unlimited", "无限额度": "Unlimited quota", + "日": "Day(s)", "日志导出成功": "Logs exported successfully", "日志已下载": "Logs downloaded", "日志已加载": "Logs loaded", @@ -1256,10 +1596,12 @@ "旧格式(直接覆盖):": "Old format (direct override):", "旧格式模板": "Old format template", "旧的备用码已失效,请保存新的备用码": "Old backup codes have been invalidated, please save the new backup codes", + "旧配置迁移完成": "Legacy config migration complete", "早上好": "Good morning", "时间": "Time", "时间信息": "Time Information", "时间粒度": "Time granularity", + "易支付": "Epay", "易支付商户ID": "Epay merchant ID", "易支付商户密钥": "Epay merchant key", "是": "Yes", @@ -1272,6 +1614,8 @@ "显示倍率": "Show ratio", "显示最新20条": "Display latest 20", "显示名称": "Display Name", + "显示名称字段": "Display Name Field", + "显示名称字段(可选)": "Display Name Field (optional)", "显示完整内容": "Show full content", "显示操作项": "Show actions", "显示更多": "Show more", @@ -1284,6 +1628,8 @@ "智能体ID": "Agent ID", "智能熔断": "Smart fallback", "智谱": "Zhipu AI", + "智谱 ChatGLM(已经弃用,请使用智谱 GLM-4V)": "Zhipu ChatGLM (deprecated, use Zhipu GLM-4V)", + "智谱 GLM-4V": "Zhipu GLM-4V", "暂无": "None", "暂无API信息": "No API information", "暂无SSE响应数据": "No SSE response data", @@ -1293,12 +1639,15 @@ "暂无公告": "No Notice", "暂无匹配模型": "No matching model", "暂无可复制的版本信息": "No version information to copy", + "暂无可展示数据": "No data to display", "暂无可用的支付方式,请联系管理员配置": "No payment methods available, please contact administrator for configuration", + "暂无可购买套餐": "No plans available for purchase", "暂无响应数据": "No response data", "暂无容器信息": "No container information", "暂无容器详情": "No container details", "暂无密钥数据": "No key data", "暂无差异化倍率显示": "No differential ratio display", + "暂无已绑定项": "No bound items", "暂无常见问答": "No FAQ", "暂无成功模型": "No successful models", "暂无数据": "No data", @@ -1313,6 +1662,9 @@ "暂无监控数据": "No monitoring data", "暂无系统公告": "No system notice", "暂无缺失模型": "No missing models", + "暂无自定义 OAuth 提供商": "No custom OAuth providers", + "暂无订阅套餐": "No subscription plans", + "暂无订阅记录": "No subscription records", "暂无请求数据": "No request data", "暂无项目": "No projects", "暂无预填组": "No prefilled groups", @@ -1331,8 +1683,11 @@ "更新名称失败": "Failed to update name", "更新失败": "Update failed", "更新失败,请检查输入信息": "Update failed, please check the input information", + "更新套餐信息": "Update Plan Info", "更新容器配置": "Update Container Configuration", "更新容器配置可能会导致容器重启,请确保在合适的时间进行此操作。": "Updating container configuration may cause the container to restart, please ensure you perform this operation at an appropriate time.", + "更新成功": "Updated successfully", + "更新成功!": "Updated successfully!", "更新所有已启用通道余额": "Update balance for all enabled channels", "更新支付设置": "Update payment settings", "更新时间": "Update time", @@ -1344,16 +1699,25 @@ "更新配置后,容器可能需要重启以应用新的设置。请确保您了解这些更改的影响。": "After updating the configuration, the container may need to restart to apply the new settings. Please ensure you understand the impact of these changes.", "更新配置失败": "Failed to update configuration", "更新预填组": "Update pre-filled group", + "月": "Month(s)", "有 Reasoning": "Has Reasoning", + "有异常": "Has Errors", + "有效期": "Validity", + "有效期单位": "Validity Unit", + "有效期数值": "Validity Value", + "有效期设置": "Validity Settings", "服务可用性": "Service Status", "服务商": "Service Provider", "服务器地址": "Server Address", "服务显示名称": "Service Display Name", + "未使用": "Unused", + "未匹配到模型,按回车键可将「{{name}}」作为自定义模型名添加": "No matching models. Press Enter to add \"{{name}}\" as a custom model name.", "未发现新增模型": "No new models were added", "未发现重复密钥": "No duplicate keys found", "未启动": "No start", "未启用": "Not Enabled", "未命名": "Unnamed", + "未在 Discovery 响应中找到可用的 OAuth 端点": "No available OAuth endpoints found in Discovery response", "未备份": "Not backed up", "未开始": "Not Started", "未找到匹配的模型": "No matching model found", @@ -1380,9 +1744,13 @@ "未设置倍率模型": "Models without ratio settings", "未配置模型": "No model configured", "未配置的模型列表": "Models not configured", + "本周": "This Week", "本地": "Local", "本地数据存储": "Local data storage", "本地计费": "Local billing", + "本月": "This Month", + "本月获得": "This month", + "本站仅作演示之用,无服务端!": "This site is for demo purposes only, no server!", "本设备:手机指纹/面容,外接:USB安全密钥": "Built-in: phone fingerprint/face, External: USB security key", "本设备内置": "Built-in device", "本项目根据": "This project is licensed under the ", @@ -1390,11 +1758,13 @@ "机密环境变量将被加密存储,适用于存储密码、API密钥等敏感信息。": "Secret environment variables will be stored encrypted, suitable for storing passwords, API keys and other sensitive information.", "机密环境变量说明": "Secret Environment Variables Description", "权重": "Weight", + "权重必须是非负整数!": "Weight must be a non-negative integer!", "权限设置": "Permission Settings", "条": "items", "条 - 第": "to", "条,共": "of", "条日志已清理!": "logs have been cleared!", + "来源": "Source", "来源于 IO.NET 部署": "From IO.NET Deployment", "来自模型重定向,尚未加入模型列表": "From model redirect, not yet added to the model list", "某些配置更改可能需要几分钟才能生效。": "Some configuration changes may take a few minutes to take effect.", @@ -1412,20 +1782,27 @@ "标签不能为空!": "Label cannot be empty!", "标签信息": "Tag Information", "标签名称": "Tag Name", + "标签更新成功!": "Tag updated successfully!", "标签的基本配置": "Tag basic configuration", "标签组": "Tag group", "标签聚合": "Tag aggregation", "标签聚合模式": "Enable tag mode", + "标识符 (Slug)": "Slug", "标识颜色": "Identifier color", "核采样,控制词汇选择的多样性": "Nucleus sampling, controls vocabulary selection diversity", + "根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。": "Per Anthropic conventions, /v1/messages input tokens count only non-cached input and exclude cache read/write tokens.", "根据模型名称和匹配规则查找模型元数据,优先级:精确 > 前缀 > 后缀 > 包含": "Find model metadata based on model name and matching rules, priority: exact > prefix > suffix > contains", "格式化": "Format", + "格式化 JSON": "Format JSON", "格式正确": "Format Correct", "格式示例:": "Format example:", "格式错误": "Format Error", "检查更新": "Check for updates", + "检查更新失败,请稍后再试": "Failed to check for updates, please try again later", "检测到 FluentRead(流畅阅读)": "FluentRead (smooth reading) detected", + "检测到以下高危状态码重定向规则": "Detected high-risk status-code redirect rules", "检测到多个密钥,您可以单独复制每个密钥,或点击复制全部获取完整内容。": "Detected multiple keys, you can copy each key individually or click Copy All to get the complete content.", + "检测到旧版本的配置数据,是否要迁移到新的配置格式?": "Legacy config data detected, migrate to the new config format?", "检测到该消息后有AI回复,是否删除后续回复并重新生成?": "AI reply detected after this message, delete subsequent replies and regenerate?", "检测必须等待绘图成功才能进行放大等操作": "Detection must wait for drawing to succeed before performing zooming and other operations", "模型": "Model", @@ -1434,6 +1811,7 @@ "模型价格": "Model price", "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}": "Model price {{symbol}}{{price}}, {{ratioType}} {{ratio}}", "模型价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "Model price: {{symbol}}{{price}} * {{ratioType}}: {{ratio}} = {{symbol}}{{total}}", + "模型价格不能为0": "Model price cannot be 0", "模型倍率": "Model ratio", "模型倍率 {{modelRatio}}": "Model ratio {{modelRatio}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}}": "Model ratio {{modelRatio}}, cache ratio {{cacheRatio}}, completion ratio {{completionRatio}}, {{ratioType}} {{ratio}}", @@ -1464,6 +1842,9 @@ "模型映射必须是合法的 JSON 格式!": "Model mapping must be in valid JSON format!", "模型更新成功!": "Model updated successfully!", "模型未加入列表,可能无法调用": "Model not in the list; requests may fail", + "模型正则": "Model Regex", + "模型正则(每行一个)": "Model Regex (one per line)", + "模型正则不能为空": "Model regex cannot be empty", "模型消耗分布": "Model consumption distribution", "模型消耗趋势": "Model consumption trend", "模型版本": "Model version", @@ -1491,6 +1872,7 @@ "欢迎使用,请完成以下设置以开始使用系统": "Welcome! Please complete the following settings to start using the system", "欧元": "EUR", "正在加载可用部署位置...": "Loading available deployment locations...", + "正在加载签到状态...": "Loading check-in status...", "正在处理大内容...": "Processing large content...", "正在提交": "Submitting", "正在构造请求体预览...": "Constructing request body preview...", @@ -1499,6 +1881,7 @@ "正在跟随最新日志": "Following latest logs", "正在跳转 GitHub...": "Redirecting to GitHub...", "正在跳转...": "Redirecting...", + "正常": "Normal", "此代理仅用于图片请求转发,Webhook通知发送等,AI API请求仍然由服务器直接发出,可在渠道设置中单独配置代理": "This proxy is only used for image request forwarding, webhook notification sending, etc. AI API requests are still sent directly by the server, and proxy can be configured separately in channel settings", "此修改将不可逆": "This modification will be irreversible", "此操作不可恢复,请仔细确认时间后再操作!": "This operation cannot be recovered, please confirm the time carefully before proceeding!", @@ -1513,6 +1896,7 @@ "此操作将解绑用户当前的 Passkey,下次登录需要重新注册。": "This will detach the user's current Passkey. They will need to register again on next login.", "此操作将降低用户的权限级别": "This operation will reduce the user's permission level", "此支付方式最低充值金额为": "Minimum recharge amount for this payment method is", + "此消息没有可复制的文本内容": "This message has no copyable text content", "此渠道由 IO.NET 自动同步,类型、密钥和 API 地址已锁定。": "This channel is automatically synchronized by IO.NET, type, key and API address are locked.", "此设置用于系统内部计算,默认值500000是为了精确到6位小数点设计,不推荐修改。": "This setting is used for internal system calculations. The default value of 500000 is designed for 6 decimal places precision, modification is not recommended.", "此页面仅显示未设置价格或倍率的模型,设置后将自动从列表中移除": "This page only shows models without price or ratio settings. After setting, they will be automatically removed from the list", @@ -1523,11 +1907,20 @@ "此项可选,用于覆盖请求参数。不支持覆盖 stream 参数": "This is optional, used to override request parameters. Overriding stream parameter is not supported.", "此项可选,用于覆盖请求头参数": "This is optional, used to override request header parameters.", "此项可选,用于通过自定义API地址来进行 API 调用,末尾不要带/v1和/": "Optional for API calls through custom API address, do not add /v1 and / at the end", + "每个用户最多可创建的令牌数量,默认 1000,设置过大可能会影响性能": "Maximum tokens each user can create, default 1000. Setting too high may impact performance", + "每周": "Weekly", + "每周窗口": "Weekly window", + "每天": "Daily", "每容器GPU数": "GPUs per Container", + "每日仅可签到一次,请勿重复签到": "Only one check-in per day, please do not check in repeatedly", + "每日签到": "Daily Check-in", + "每日签到可获得随机额度奖励": "Daily check-in rewards random quota", + "每月": "Monthly", "每隔多少分钟测试一次所有通道": "How many minutes between testing all channels", "永不过期": "Never expires", "永久删除您的两步验证设置": "Permanently delete your two-factor authentication settings", "永久删除所有备用码(包括未使用的)": "Permanently delete all backup codes (including unused ones)", + "没有任何修改!": "No changes made!", "没有匹配的日志条目": "No matching log entries", "没有可用令牌用于填充": "No available tokens for filling", "没有可用模型": "No available models", @@ -1538,15 +1931,20 @@ "注 册": "Sign Up", "注册": "Sign up", "注册 Passkey": "Register Passkey", + "注册失败,请重试": "Registration failed, please try again", + "注册成功!": "Registration successful!", "注意": "Note", + "注意:": "Note:", "注意:JSON中重复的键只会保留最后一个同名键的值": "Note: In JSON, duplicate keys will only keep the value of the last key with the same name", "注意非Chat API,请务必填写正确的API地址,否则可能导致无法使用": "Note: For non-Chat API, please make sure to enter the correct API address, otherwise it may not work", "注销": "Logout", "注销成功!": "Logout successful!", + "活跃文件": "Active Files", + "活跃缓存数": "Active Cache Count", "流": "stream", + "流式": "Streaming", "流式响应完成": "Streaming response completed", "流式输出": "Streaming Output", - "流式": "Streaming", "流量端口": "Traffic Port", "浅色": "Light", "浅色模式": "Light Mode", @@ -1557,12 +1955,13 @@ "测试单个渠道操作项目组": "Test a single channel operation project group", "测试失败": "Test failed", "测试失败:": "Test failed: ", + "测试所有未手动禁用渠道": "Test all channels except manually disabled ones", "测试所有渠道的最长响应时间": "Maximum response time for testing all channels", "测试所有通道": "Test all channels", - "测试所有未手动禁用渠道": "Test all channels except manually disabled ones", "测试模式": "Test Mode", "测试连接": "Test Connection", "测速": "Speed Test", + "浏览器不支持复制功能,请手动复制": "Browser does not support copy, please copy manually", "消息优先级": "Message priority", "消息优先级,范围0-10,默认为5": "Message priority, range 0-10, default is 5", "消息已删除": "Message deleted", @@ -1576,6 +1975,7 @@ "深色": "Dark", "深色模式": "Dark Mode", "添加": "Add", + "添加 OAuth 提供商": "Add OAuth Provider", "添加API": "Add API", "添加产品": "Add Product", "添加令牌": "Create token", @@ -1587,6 +1987,7 @@ "添加启动命令": "Add Startup Command", "添加密钥环境变量": "Add Secret Environment Variable", "添加成功": "Added successfully", + "添加提供商": "Add Provider", "添加模型": "Add model", "添加模型区域": "Add model region", "添加渠道": "Add channel", @@ -1596,14 +1997,22 @@ "添加键值对": "Add key-value pair", "添加问答": "Add FAQ", "添加额度": "Add quota", + "清理不活跃缓存": "Clean up inactive cache", + "清理失败": "Cleanup failed", "清空": "Clear", + "清空全部缓存": "Clear All Cache", + "清空该规则缓存": "Clear Rule Cache", "清空重定向": "Clear redirect", "清除历史日志": "Clear historical logs", "清除失效兑换码": "Clear invalid redemption codes", "清除所有模型": "Clear all models", "渠道": "Channel", "渠道 ID": "Channel ID", + "渠道:": "Channel:", "渠道ID,名称,密钥,API地址": "Channel ID, name, key, Base URL", + "渠道亲和性": "Channel Affinity", + "渠道亲和性:上游缓存命中": "Channel Affinity: Upstream Cache Hit", + "渠道亲和性会基于从请求上下文或 JSON Body 提取的 Key,优先复用上一次成功的渠道。": "Channel affinity prioritizes reusing the last successful channel based on keys extracted from request context or JSON body.", "渠道优先级": "Channel Priority", "渠道信息": "Channel information", "渠道创建成功!": "Channel created successfully!", @@ -1635,8 +2044,6 @@ "点击此处": "click here", "点击预览视频": "Click to preview video", "点击预览音乐": "Click to preview music", - "音乐预览": "Music Preview", - "音频无法播放": "Audio cannot be played", "点击验证按钮,使用您的生物特征或安全密钥": "Click the verification button and use your biometrics or security key", "版权所有": "All rights reserved", "状态": "Status", @@ -1646,12 +2053,15 @@ "状态页面Slug": "Status Page Slug", "环境变量": "Environment Variables", "生成令牌": "Generate Token", + "生成并填入": "Generate and Fill", "生成数量": "Generate quantity", "生成数量必须大于0": "Generation quantity must be greater than 0", "生成新的备用码": "Generate new backup codes", "生成歌词": "Generate lyrics", "生成音乐": "generate music", + "生效": "Active", "用于API调用的身份验证令牌,请妥善保管": "Authentication token for API calls, please keep it safe", + "用于唯一标识用户的字段路径": "Field path for uniquely identifying users", "用于配置网络代理,支持 socks5 协议": "Used to configure network proxy, supports socks5 protocol", "用于验证回调 new-api 的 webhook 请求的密钥,敏感信息不显示": "The key used to validate webhook requests for the callback new-api, sensitive information is not displayed.", "用以支持基于 WebAuthn 的无密码登录注册": "Support WebAuthn-based passwordless login and registration", @@ -1665,11 +2075,16 @@ "用以支持通过微信进行登录注册": "To support login & registration via WeChat", "用以防止恶意用户利用临时邮箱批量注册": "To prevent malicious users from bulk registration using temporary email addresses", "用户": "User", + "用户 ID 字段": "User ID Field", + "用户 ID 字段(可选)": "User ID Field (optional)", "用户个人功能": "User personal functions", "用户主页,展示系统信息": "User homepage, displaying system information", "用户优先:如果用户在请求中指定了系统提示词,将优先使用用户的设置": "User priority: If the user specifies a system prompt in the request, the user's setting will be used first", "用户信息": "User information", "用户信息更新成功!": "User information updated successfully!", + "用户信息端点": "User Info Endpoint", + "用户信息缺失": "User info missing", + "用户最大令牌数量": "Max Tokens Per User", "用户分组": "Your default group", "用户分组和额度管理": "User Group and Quota Management", "用户分组配置": "User group configuration", @@ -1678,6 +2093,8 @@ "用户协议更新失败": "User agreement update failed", "用户可选分组": "User selectable groups", "用户名": "Username", + "用户名字段": "Username Field", + "用户名字段(可选)": "Username Field (optional)", "用户名或邮箱": "Username or email", "用户名称": "User Name", "用户控制面板,管理账户": "User control panel for account management", @@ -1688,25 +2105,39 @@ "用户的基本账户信息": "User basic account information", "用户管理": "User Management", "用户组": "User group", + "用户订阅管理": "User Subscription Management", "用户账户创建成功!": "User account created successfully!", "用户账户管理": "User account management", "用时/首字": "Time/first word", + "由全站货币展示设置统一控制": "Controlled by the site-wide currency display settings", + "由订阅抵扣": "Deducted from subscription", + "界面语言和其他个人偏好": "Interface language and other personal preferences", + "留空使用系统临时目录": "Leave empty to use system temp directory", "留空则使用账号绑定的邮箱": "If left blank, the email address bound to the account will be used", "留空则使用默认端点;支持 {path, method}": "Leave blank to use the default endpoint; supports {path, method}", + "留空则保持原有密钥": "Leave empty to keep existing secret", "留空则默认使用服务器地址,注意不能携带http://或者https://": "If left blank, the server address will be used by default. Note that http:// or https:// should not be included", "登 录": "Log In", "登录": "Sign in", + "登录失败,请重试": "Login failed, please try again", + "登录成功": "Login successful", "登录成功!": "Login successful!", "登录过期,请重新登录!": "Login expired, please log in again!", "白名单": "Whitelist", + "百度文心千帆": "Baidu ERNIE", + "百度文心千帆V2": "Baidu ERNIE V2", "的前提下使用。": "for use under the following conditions:", "监控设置": "Monitoring Settings", + "目录总大小": "Directory Total Size", + "目录文件数": "Directory File Count", "目标用户:{{username}}": "Target user: {{username}}", "直接提交": "Submit directly", "相关项目": "Related Projects", "相当于删除用户,此修改将不可逆": "Equivalent to deleting the user, this modification is irreversible", "矛盾": "Conflict", "知识库 ID": "Knowledge Base ID", + "知识库:AI Proxy": "Knowledge Base: AI Proxy", + "知识库:FastGPT": "Knowledge Base: FastGPT", "硬件": "Hardware", "硬件与性能": "Hardware & Performance", "硬件类型": "Hardware Type", @@ -1734,44 +2165,63 @@ "确定要删除所选的 {{count}} 个令牌吗?_other": "Are you sure you want to delete the selected {{count}} tokens?", "确定要删除所选的 {{count}} 个模型吗?_one": "Are you sure you want to delete the selected {{count}} model?", "确定要删除所选的 {{count}} 个模型吗?_other": "Are you sure you want to delete the selected {{count}} models?", + "确定要删除此 OAuth 提供商吗?": "Are you sure you want to delete this OAuth provider?", "确定要删除此API信息吗?": "Are you sure you want to delete this API information?", "确定要删除此公告吗?": "Are you sure you want to delete this notice?", "确定要删除此分类吗?": "Are you sure you want to delete this category?", "确定要删除此密钥吗?": "Are you sure you want to delete this key?", "确定要删除此问答吗?": "Are you sure you want to delete this FAQ?", + "确定要删除该提供商吗?": "Are you sure you want to delete this provider?", "确定要删除这条消息吗?": "Are you sure you want to delete this message?", "确定要删除选中的": "Are you sure you want to delete the selected", "确定要启用所有密钥吗?": "Are you sure you want to enable all keys?", "确定要启用此用户吗?": "Are you sure you want to enable this user?", "确定要提升此用户吗?": "Are you sure you want to promote this user?", "确定要更新所有已启用通道余额吗?": "Are you sure you want to update the balance of all enabled channels?", - "确定要测试所有通道吗?": "Are you sure you want to test all channels?", "确定要测试所有未手动禁用渠道吗?": "Are you sure you want to test all channels except manually disabled ones?", + "确定要测试所有通道吗?": "Are you sure you want to test all channels?", "确定要禁用所有的密钥吗?": "Are you sure you want to disable all keys?", "确定要禁用此用户吗?": "Are you sure you want to disable this user?", + "确定要解绑 {{name}} 吗?": "Are you sure you want to unbind {{name}}?", "确定要降级此用户吗?": "Are you sure you want to demote this user?", "确定重置": "Confirm reset", "确定重置模型倍率吗?": "Confirm to reset model ratio?", "确认": "Confirm", + "确认作废": "Confirm invalidation", + "确认关闭提示": "Confirm close", "确认冲突项修改": "Confirm conflict item modification", "确认删除": "Confirm deletion", "确认删除模型": "Confirm Delete Model", "确认取消密码登录": "Confirm cancel password login", + "确认启用": "Confirm Enable", "确认密码": "Confirm Password", "确认导入配置": "Confirm import configuration", "确认延长": "Confirm Extension", "确认延长容器时长": "Confirm Container Duration Extension", "确认操作": "Confirm Operation", "确认新密码": "Confirm new password", - "确认清除历史日志": "Confirm clear historical logs", "确认清理不活跃的磁盘缓存?": "Confirm cleanup of inactive disk cache?", + "确认清空全部渠道亲和性缓存": "Confirm clear all channel affinity cache", + "确认清空该规则缓存": "Confirm clear rule cache", + "确认清除历史日志": "Confirm clear historical logs", "确认禁用": "Confirm disable", "确认补单": "Confirm Order Completion", + "确认解绑": "Confirm Unbind", "确认解绑 Passkey": "Confirm Unbind Passkey", "确认设置并完成初始化": "Confirm settings and complete initialization", + "确认迁移": "Confirm Migration", "确认重置 Passkey": "Confirm Passkey Reset", "确认重置两步验证": "Confirm Two-Factor Reset", "确认重置密码": "Confirm Password Reset", + "磁盘 阈值 (%)": "Disk Threshold (%)", + "磁盘使用率超过此值时拒绝请求": "Reject requests when disk usage exceeds this value", + "磁盘可用空间小于缓存最大总量设置": "Disk free space is less than max cache size setting", + "磁盘命中": "Disk Hits", + "磁盘缓存最大总量 (MB)": "Max Disk Cache Size (MB)", + "磁盘缓存占用的最大空间": "Maximum space occupied by disk cache", + "磁盘缓存已清理": "Disk cache cleared", + "磁盘缓存设置(磁盘换内存)": "Disk Cache Settings (Disk Swap Memory)", + "磁盘缓存阈值 (MB)": "Disk Cache Threshold (MB)", "示例": "Example", "示例:{\"default\": [200, 100], \"vip\": [0, 1000]}。": "Example: {\"default\": [200, 100], \"vip\": [0, 1000]}.", "视频": "Video", @@ -1783,6 +2233,7 @@ "禁用两步验证": "Disable two-factor authentication", "禁用全部": "Disable all", "禁用原因": "Disable reason", + "禁用后用户端不再展示,但历史订单不受影响。是否继续?": "After disabling, it will no longer be shown to users, but historical orders are not affected. Continue?", "禁用后的影响:": "Impact after disabling:", "禁用密钥失败": "Failed to disable key", "禁用思考处理的模型列表": "Models skipping thinking handling", @@ -1795,21 +2246,35 @@ "秒": "Second", "移除 functionResponse.id 字段": "Remove functionResponse.id Field", "移除 One API 的版权标识必须首先获得授权,项目维护需要花费大量精力,如果本项目对你有意义,请主动支持本项目": "Removal of One API copyright mark must first be authorized. Project maintenance requires a lot of effort. If this project is meaningful to you, please actively support it.", + "窗口:": "Window:", "窗口处理": "window handling", "窗口等待": "window wait", + "立即签到": "Check in now", + "立即订阅": "Subscribe now", "站点额度展示类型及汇率": "Site quota display type and exchange rate", "端口号必须在1-65535之间": "Port number must be between 1-65535", "端口配置详细说明": "Restrict external requests to specific ports. Use single ports (80, 443) or ranges (8000-8999). Empty list allows all ports. Default includes common web ports.", "端点": "Endpoint", + "端点 URL 必须以 http:// 或 https:// 开头:": "Endpoint URL must start with http:// or https://: ", + "端点 URL 必须是完整地址(以 http:// 或 https:// 开头)": "Endpoint URL must be a full address (starting with http:// or https://)", "端点映射": "Endpoint mapping", - "在模型广场向用户展示的端点": "Endpoint shown to users in Model Marketplace", "端点类型": "Endpoint type", "端点组": "Endpoint group", + "第三方支付配置": "Third-party Payment Configuration", "第三方账户绑定状态(只读)": "Third-party account binding status (read-only)", "等价金额:": "Equivalent Amount: ", "等待中": "Waiting", "等待获取邮箱信息...": "Waiting to get email information...", "筛选": "Filter", + "签到最大额度": "Maximum check-in quota", + "签到最小额度": "Minimum check-in quota", + "签到功能允许用户每日签到获取随机额度奖励": "Check-in feature allows users to check in daily to receive random quota rewards", + "签到失败": "Check-in failed", + "签到奖励将直接添加到您的账户余额": "Check-in rewards will be directly added to your account balance", + "签到奖励的最大额度": "Maximum quota for check-in rewards", + "签到奖励的最小额度": "Minimum quota for check-in rewards", + "签到成功!获得": "Check-in successful! Received", + "签到设置": "Check-in Settings", "管理": "Manage", "管理 Ollama 模型的拉取和删除": "Manage Ollama model pulling and deletion", "管理你的 LinuxDO OAuth App": "Manage your LinuxDO OAuth App", @@ -1820,20 +2285,27 @@ "管理员未开启Stripe充值!": "Administrator has not enabled Stripe recharge!", "管理员未开启在线充值!": "The administrator has not enabled online recharge!", "管理员未开启在线充值功能,请联系管理员开启或使用兑换码充值。": "The administrator has not enabled the online recharge function, please contact the administrator to enable it or recharge with a redemption code.", + "管理员未开启在线支付功能,请联系管理员配置。": "Online payment is not enabled by the admin. Please contact the administrator.", "管理员未设置用户可选分组": "Administrator has not set user-selectable groups", "管理员设置了外部链接,点击下方按钮访问": "Administrator has set up external links, click the button below to access", "管理员账号": "Admin account", "管理员账号已经初始化过,请继续设置其他参数": "The admin account has already been initialized, please continue to set other parameters", "管理模型、标签、端点等预填组": "Manage model, tag, endpoint, etc. pre-filled groups", + "管理用户已绑定的第三方账户,支持筛选与解绑": "Manage third-party accounts bound to users, with filtering and unbinding support", + "管理绑定": "Manage Bindings", "类型": "Type", "粘贴图片失败": "Failed to paste image", "精确": "Exact", + "精确名称匹配": "Exact Name Match", "系统": "System", "系统令牌已复制到剪切板": "System token copied to clipboard", "系统任务记录": "System task records", "系统信息": "System Information", "系统公告": "System Notice", + "系统公告已更新": "System announcement updated", + "系统公告更新失败": "Failed to update system announcement", "系统公告管理,可以发布系统通知和重要消息(最多100个,前端显示最新20条)": "System notice management, you can publish system notices and important messages (maximum 100, display latest 20 on the front end)", + "系统内存": "System Memory", "系统初始化": "System initialization", "系统初始化失败,请重试": "System initialization failed, please try again", "系统初始化成功,正在跳转...": "System initialization successful, redirecting...", @@ -1842,6 +2314,7 @@ "系统名称已更新": "System name updated", "系统名称更新失败": "System name update failed", "系统已为该部署准备 Ollama 镜像与随机 API Key": "System has prepared Ollama image and random API Key for this deployment", + "系统性能监控": "System Performance Monitoring", "系统提示覆盖": "System prompt override", "系统提示词": "System Prompt", "系统提示词拼接": "System prompt append", @@ -1849,22 +2322,13 @@ "系统文档和帮助信息": "System documentation and help information", "系统消息": "System message", "系统管理功能": "System management functions", - "系统性能监控": "System Performance Monitoring", - "启用性能监控后,当系统资源使用率超过设定阈值时,将拒绝新的 Relay 请求 (/v1, /v1beta 等),以保护系统稳定性。": "When performance monitoring is enabled and system resource usage exceeds the set threshold, new Relay requests (/v1, /v1beta, etc.) will be rejected to protect system stability.", - "启用性能监控": "Enable Performance Monitoring", - "超过阈值时拒绝新请求": "Reject new requests when threshold is exceeded", - "CPU 阈值 (%)": "CPU Threshold (%)", - "CPU 使用率超过此值时拒绝请求": "Reject requests when CPU usage exceeds this value", - "内存 阈值 (%)": "Memory Threshold (%)", - "内存使用率超过此值时拒绝请求": "Reject requests when memory usage exceeds this value", - "磁盘 阈值 (%)": "Disk Threshold (%)", - "磁盘使用率超过此值时拒绝请求": "Reject requests when disk usage exceeds this value", - "保存性能设置": "Save Performance Settings", "系统设置": "System Settings", "系统访问令牌": "System Access Token", "约": "Approximately", "索引": "Index", "紧凑列表": "Compact list", + "累计签到": "Total check-ins", + "累计获得": "Total received", "线路描述": "Route description", "组列表": "Group list", "组名": "Group name", @@ -1875,20 +2339,26 @@ "绑定": "Bind", "绑定 Telegram": "Bind Telegram", "绑定信息": "Binding Information", + "绑定后会立即生成用户订阅(无需支付),有效期按套餐配置计算。": "After binding, a user subscription is created immediately (no payment required); validity follows the plan configuration.", "绑定微信账户": "Bind WeChat Account", "绑定成功!": "Binding successful!", + "绑定订阅套餐": "Bind Subscription Plan", "绑定邮箱地址": "Bind Email Address", + "结束": "End", "结束时间": "End Time", "结果图片": "Result", + "结算差额": "Settlement Difference", "绘图": "Drawing", "绘图任务记录": "Drawing task records", "绘图日志": "Drawing Logs", "绘图设置": "Drawing settings", "统一的": "The Unified", "统计Tokens": "Statistical Tokens", + "统计已重置": "Statistics reset", "统计次数": "Statistical count", "统计额度": "Statistical quota", "继续": "Continue", + "维护中": "Maintenance", "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Cache {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", "缓存 Tokens": "Cache Tokens", "缓存: {{cacheRatio}}": "Cache: {{cacheRatio}}", @@ -1896,6 +2366,7 @@ "缓存价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存倍率: {{cacheRatio}})": "Cache price: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (Cache ratio: {{cacheRatio}})", "缓存倍率": "Cache ratio", "缓存倍率 {{cacheRatio}}": "Cache ratio {{cacheRatio}}", + "缓存写": "Cache Write", "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", "缓存创建 Tokens": "Cache Creation Tokens", "缓存创建: {{cacheCreationRatio}}": "Cache creation: {{cacheCreationRatio}}", @@ -1904,11 +2375,18 @@ "缓存创建: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Cache creation: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", "缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存创建倍率: {{cacheCreationRatio}})": "Cache creation price: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (Cache creation ratio: {{cacheCreationRatio}})", "缓存创建价格合计:5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens": "Cache creation price total: 5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens", + "缓存创建倍率": "Cache creation ratio", "缓存创建倍率 {{cacheCreationRatio}}": "Cache creation ratio {{cacheCreationRatio}}", "缓存创建倍率 1h {{cacheCreationRatio1h}}": "Cache creation multiplier 1h {{cacheCreationRatio1h}}", "缓存创建倍率 5m {{cacheCreationRatio5m}}": "Cache creation multiplier 5m {{cacheCreationRatio5m}}", "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Cache creation ratio 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", + "缓存条目数": "Cache Entries", + "缓存目录": "Cache Directory", + "缓存目录磁盘空间": "Cache Directory Disk Space", + "缓存读": "Cache Read", + "编号:": "ID:", "编辑": "Edit", + "编辑 OAuth 提供商": "Edit OAuth Provider", "编辑API": "Edit API", "编辑产品": "Edit Product", "编辑供应商": "Edit Provider", @@ -1916,17 +2394,20 @@ "编辑公告内容": "Edit announcement content", "编辑分类": "Edit Category", "编辑成功": "Edit Successful", + "编辑提供商": "Edit Provider", "编辑标签": "Edit Tag", "编辑模型": "Edit Model", "编辑模式": "Edit Mode", "编辑用户": "Edit User", "编辑聊天配置": "Edit Chat Configuration", + "编辑规则": "Edit Rule", "编辑问答": "Edit FAQ", "缩词": "Shorten", "缺省 MaxTokens": "Default MaxTokens", "网站地址": "Website Address", "网站域名标识": "Website Domain ID", "网络连接失败,请检查网络设置或稍后重试": "Network connection failed, please check network settings or try again later", + "网络连接失败或服务器无响应": "Network connection failed or server not responding", "网络配置": "Network Configuration", "网络错误": "Network Error", "置信度": "Confidence", @@ -1936,6 +2417,7 @@ "聊天区域": "Chat Area", "聊天应用名称": "Chat Application Name", "聊天应用名称已存在,请使用其他名称": "Chat application name already exists, please use another name", + "聊天数据解析失败": "Failed to parse chat data", "聊天设置": "Chat settings", "聊天配置": "Chat configuration", "聊天链接配置错误,请联系管理员": "Chat link configuration error, please contact administrator", @@ -1944,45 +2426,42 @@ "自动分组auto,从第一个开始选择": "Auto grouping auto, select from the first one", "自动刷新": "Auto Refresh", "自动刷新中": "Auto refreshing", + "自动填充字段": "Auto-fill Fields", + "自动检测": "Auto-detect", "自动模式": "Auto Mode", "自动测试所有通道间隔时间": "Auto test interval for all channels", + "自动生成:": "Auto-generated: ", "自动禁用": "Auto disabled", "自动禁用关键词": "Automatic disable keywords", "自动禁用状态码": "Auto-disable status codes", "自动禁用状态码格式不正确": "Invalid auto-disable status code format", + "自动选择": "Auto Select", "自动重试状态码": "Auto-retry status codes", "自动重试状态码格式不正确": "Invalid auto-retry status code format", - "支持填写单个状态码或范围(含首尾),使用逗号分隔": "Supports single status codes or inclusive ranges; separate with commas", - "支持填写单个状态码或范围(含首尾),使用逗号分隔;504 和 524 始终不重试,不受此处配置影响": "Supports single status codes or inclusive ranges; separate with commas. 504 and 524 are never retried and are not affected by this setting", - "高危操作确认": "High-risk operation confirmation", - "检测到以下高危状态码重定向规则": "Detected high-risk status-code redirect rules", - "操作确认": "Operation confirmation", - "我确认开启高危重试": "I confirm enabling high-risk retry", - "高危状态码重试风险告知与免责声明Markdown": "### ⚠️ High-Risk Operation: Risk Notice and Disclaimer for 504/524 Retry\nBy default, this project does not retry for status codes `400` (bad request), `504` (gateway timeout), and `524` (timeout occurred).\n In many cases, 504 and 524 mean the request has reached the upstream AI service and processing has started, but the connection was closed due to long processing time.\n\nEnabling redirection/retry for these timeout status codes is a **high-risk operation**. Before enabling it, you must read and understand the consequences below:\n\n#### 1. Core Risks (Read Carefully)\n1. 💸 Duplicate/multiple billing risk: Most upstream AI providers **still charge** for requests that started processing but got interrupted by network timeout (504/524). If retry is triggered, a new upstream request will be sent, which can lead to **duplicate or multiple charges**.\n2. ⏳ Severe client timeout: If a single request already timed out, adding retries can multiply total latency and cause severe or unacceptable timeout behavior for your final client/caller.\n3. 💥 Request backlog and system crash risk: Forcing retries on timeout requests keeps threads and connections occupied for longer. Under high concurrency, this can cause serious backlog, exhaust system resources, trigger a cascading failure, and crash your proxy service.\n\n#### 2. Risk Acknowledgement\nIf you still choose to enable this feature, you acknowledge all of the following:", - "高危状态码重试风险确认输入文本": "I understand the duplicate billing and crash risks, and confirm enabling it.", - "高危状态码重试风险确认项1": "I have fully read and understood the risks and fully understand the destructive consequences of forcing retries for status codes 504 and 524.", - "高危状态码重试风险确认项2": "I have communicated with the upstream provider and confirmed that the timeout issue is an upstream bottleneck and cannot be resolved upstream at this time.", - "高危状态码重试风险确认项3": "I voluntarily accept all duplicate/multiple billing risks and will not file issues or complaints in this project repository regarding billing anomalies caused by this retry behavior.", - "高危状态码重试风险确认项4": "I voluntarily accept system stability risks, including severe client timeout and possible service crash. Any consequences caused by enabling this feature are my own responsibility.", - "高危状态码重试风险输入框占位文案": "Please type the exact text above", - "高危状态码重试风险输入不匹配提示": "The input does not match the required text", - "例如:401, 403, 429, 500-599": "e.g. 401,403,429,500-599", - "自动选择": "Auto Select", + "自定义": "Custom", + "自定义 OAuth 提供商": "Custom OAuth Providers", + "自定义(秒)": "Custom (sec)", "自定义充值数量选项": "Custom Recharge Amount Options", "自定义充值数量选项不是合法的 JSON 数组": "Custom recharge amount options is not a valid JSON array", "自定义变焦-提交": "Custom Zoom-Submit", "自定义模型名称": "Custom model name", "自定义模式下不可用": "Not available in custom mode", + "自定义渠道": "Custom Channel", + "自定义秒数": "Custom seconds", + "自定义请求体格式错误,请检查JSON格式": "Custom request body format error, please check JSON format", "自定义请求体模式": "Custom Request Body Mode", "自定义货币": "Custom currency", "自定义货币符号": "Custom currency symbol", "自定义镜像": "Custom Image", "自用模式": "Self-use mode", "自适应列表": "Adaptive list", + "至": "until", "节省": "Save", "花费": "Spend", "花费时间": "Time spent", "若你的 OIDC Provider 支持 Discovery Endpoint,你可以仅填写 OIDC Well-Known URL,系统会自动获取 OIDC 配置": "If your OIDC Provider supports Discovery Endpoint, you can only fill in the OIDC Well-Known URL, and the system will automatically obtain the OIDC configuration", + "获取 Discovery 配置": "Fetch Discovery Config", + "获取 Discovery 配置失败:": "Failed to fetch Discovery config: ", "获取 io.net API Key": "Get io.net API Key", "获取 OIDC 配置失败,请检查网络状况和 Well-Known URL 是否正确": "Failed to get OIDC configuration, please check network status and whether the Well-Known URL is correct", "获取 OIDC 配置成功!": "OIDC configuration obtained successfully!", @@ -2003,12 +2482,17 @@ "获取模型列表": "Get Model List", "获取模型列表失败": "Failed to retrieve model list", "获取渠道失败:": "Failed to get channels: ", + "获取用量失败": "Failed to get usage", "获取硬件类型失败: ": "Failed to get hardware types: ", + "获取签到状态失败": "Failed to get check-in status", "获取组列表失败": "Failed to get group list", + "获取绑定信息失败": "Failed to get binding info", + "获取自定义 OAuth 提供商列表失败": "Failed to get custom OAuth provider list", "获取详情失败": "Failed to get details", "获取部署列表失败": "Failed to get deployment list", "获取金额失败": "Failed to get amount", "获取验证码": "Get Verification Code", + "获得": "Received", "补全": "Completion", "补全 {{completion}} tokens / 1M tokens * {{symbol}}{{price}}": "Completion {{completion}} tokens / 1M tokens * {{symbol}}{{price}}", "补全价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "Completion price: {{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (Completion ratio: {{completionRatio}})", @@ -2022,12 +2506,21 @@ "表格视图": "Table view", "覆盖模式:将完全替换现有的所有密钥": "Overwrite mode: completely replace all existing keys", "覆盖现有密钥": "Overwrite existing key", + "规则": "Rule", + "规则 JSON": "Rule JSON", + "规则 JSON 格式不正确": "Rule JSON format is incorrect", + "规则 ttl_seconds 为 0 时使用。0 表示使用后端默认 TTL:3600 秒。": "Used when rule ttl_seconds is 0. 0 means using backend default TTL: 3600 seconds.", + "规则为 JSON 数组;可视化与 JSON 模式共用同一份数据。": "Rules are JSON arrays; visual and JSON modes share the same data.", + "规则名称(可读性更好,也会出现在管理侧日志中)。": "Rule name (for better readability, also appears in admin logs).", + "规则未找到,请刷新后重试": "Rule not found, please refresh and try again", "角色": "Role", "解析响应数据时发生错误": "An error occurred while parsing response data", "解析密钥文件失败: {{msg}}": "Failed to parse key file: {{msg}}", "解析错误": "Parse Error", + "解绑": "Unbind", "解绑 Passkey": "Remove Passkey", "解绑后将无法使用 Passkey 登录,确定要继续吗?": "After unbinding, you will not be able to login with Passkey. Are you sure you want to continue?", + "解绑成功": "Unbind successful", "计价币种": "Pricing Currency", "计算中": "Calculating", "计算成本": "Calculate Cost", @@ -2037,7 +2530,18 @@ "计费类型": "Billing type", "计费过程": "Billing process", "订单号": "Order No.", + "订阅": "Subscription", + "订阅剩余": "Subscription Remaining", + "订阅套餐": "Subscription Plans", + "订阅套餐管理": "Subscription Plan Management", + "订阅实例": "Subscription Instance", + "订阅抵扣": "Subscription Deduction", + "订阅管理": "Subscription Management", + "订阅结算": "Subscription Settlement", + "订阅说明": "Subscription Description", + "认证方式": "Auth Style", "讯飞星火": "Spark Desk", + "讯飞星火认知": "iFlytek Spark", "记录请求与错误日志IP": "Record request and error log IP", "设备": "Device", "设备类型偏好": "Device Type Preference", @@ -2069,6 +2573,7 @@ "设置首页内容": "Set home page content", "设置默认地区和特定模型的专用地区": "Set default region and dedicated regions for specific models", "设计与开发由": "Designed & Developed by", + "设计版本": "b80c3466cb6feafeb3990c7820e10e50", "访问 io.net 控制台的 API Keys 页面": "Visit the API Keys page of the io.net console", "访问容器": "Access Container", "访问模型部署功能需要先启用 io.net 部署服务": "Accessing model deployment features requires enabling the io.net deployment service first", @@ -2076,16 +2581,25 @@ "该供应商提供多种AI模型,适用于不同的应用场景。": "This supplier provides multiple AI models, suitable for different application scenarios.", "该分类下没有可用模型": "No available models under this category", "该域名已存在于白名单中": "The domain already exists in the whitelist", + "该套餐未配置 Creem": "This plan is not configured for Creem", + "该套餐未配置 Stripe": "This plan is not configured for Stripe", "该数据可能不可信,请谨慎使用": "This data may not be reliable, please use with caution", "该服务器地址将影响支付回调地址以及默认首页展示的地址,请确保正确配置": "This server address will affect the payment callback address and the address displayed on the default homepage, please ensure correct configuration", "该模型存在固定价格与倍率计费方式冲突,请确认选择": "The model has a fixed price and ratio billing method conflict, please confirm the selection", "该渠道已开启请求透传,参数覆写、模型重定向等 NewAPI 内置功能将失效,非最佳实践。": "Request pass-through is enabled for this channel; built-in NewAPI features such as parameter overrides and model redirection will be disabled. This is not a best practice.", "该渠道已开启请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "Request pass-through is enabled for this channel. Built-in NewAPI features such as parameter overrides, model redirection, and channel adaptation will be disabled. This is not a best practice. If this causes issues, please do not submit an issue.", + "该规则未启用“作用域:包含规则名称”,无法按规则清空缓存。": "This rule has not enabled \"Scope: Include Rule Name\", cannot clear cache by rule.", + "该规则的缓存保留时长;0 表示使用默认 TTL:": "Cache retention duration for this rule; 0 uses the default TTL:", + "该记录不包含可用的 token 统计口径。": "This record does not contain available token statistics.", "详情": "Details", + "语言偏好": "Language Preference", + "语言偏好已保存": "Language preference saved", "语音输入": "Voice input", "语音输出": "Voice output", "说明": "Description", "说明:": "Instructions:", + "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。": "Note: Tests on this page use non-streaming requests. If a channel only supports streaming responses, tests may fail. Please rely on actual usage.", + "说明:生成结果是可直接粘贴到渠道密钥里的 JSON(包含 access_token / refresh_token / account_id)。": "Note: The generated result is a JSON that can be directly pasted into the channel secret (contains access_token / refresh_token / account_id).", "说明信息": "Description", "请上传密钥文件": "Please upload the key file", "请上传密钥文件!": "Please upload the key file!", @@ -2093,13 +2607,21 @@ "请使用 Project 为 io.cloud 的密钥": "Please use a key with Project set to io.cloud", "请先在设置中启用图片功能": "Please enable image feature in settings first", "请先填写 API Key": "Please fill in API Key first", + "请先填写 Discovery URL 或 Issuer URL": "Please fill in Discovery URL or Issuer URL first", + "请先填写 Issuer URL,以自动生成完整的端点 URL": "Please fill in Issuer URL first to auto-generate full endpoint URLs", "请先填写 Ollama API 地址": "Please fill in Ollama API address first", "请先填写服务器地址": "Please fill in the server address first", + "请先填写服务器地址,以自动生成完整的端点 URL": "Please enter the server address first to auto-generate full endpoint URLs", + "请先粘贴回调 URL": "Please paste callback URL first", "请先输入密钥": "Please enter the key first", "请先选择同步渠道": "Please select the synchronization channel first", "请先选择模型!": "Please select a model first!", "请先选择硬件类型": "Please select hardware type first", + "请先选择要删除的API信息": "Please select the API info to delete first", "请先选择要删除的令牌!": "Please select the token to be deleted!", + "请先选择要删除的分类": "Please select the category to delete first", + "请先选择要删除的常见问答": "Please select the FAQ to delete first", + "请先选择要删除的系统公告": "Please select the announcement to delete first", "请先选择要删除的通道!": "Please select the channel you want to delete first!", "请先选择要设置标签的渠道!": "Please select the channel to set tags for first!", "请先选择需要批量设置的模型": "Please select models for batch setting first", @@ -2108,8 +2630,12 @@ "请前往个人设置 → 安全设置进行配置。": "Please go to Personal Settings → Security Settings to configure.", "请勿过度信任此功能,IP可能被伪造,请配合nginx和cdn等网关使用": "Do not over-trust this feature, IP can be spoofed, please use it in conjunction with gateways such as nginx and CDN", "请在系统设置页面编辑分组倍率以添加新的分组:": "Please edit Group ratios in system settings to add new groups:", + "请填写完整的API信息": "Please fill in complete API info", "请填写完整的产品信息": "Please fill in complete product information", + "请填写完整的公告信息": "Please fill in complete announcement info", + "请填写完整的分类信息": "Please fill in complete category info", "请填写完整的管理员账号信息": "Please fill in the complete administrator account information", + "请填写完整的问答信息": "Please fill in complete FAQ info", "请填写密钥": "Please enter the key", "请填写渠道名称和渠道密钥!": "Please enter channel name and key!", "请填写部署地区": "Please fill in the deployment region", @@ -2119,12 +2645,16 @@ "请检查表单填写是否正确": "Please check if the form is filled out correctly", "请检查输入": "Please check your input", "请求体 JSON": "Request Body JSON", + "请求体内存缓存": "Request Body Memory Cache", + "请求体磁盘缓存": "Request Body Disk Cache", + "请求体超过此大小时使用磁盘缓存": "Use disk cache when request body exceeds this size", "请求参数无效": "Invalid request parameters", "请求发生错误": "An error occurred with the request", "请求发生错误: ": "An error occurred with the request: ", "请求后端接口失败:": "Failed to request the backend interface: ", "请求失败": "Request failed", "请求头覆盖": "Request header override", + "请求头覆盖必须是合法的 JSON 格式!": "Header override must be valid JSON format!", "请求并计费模型": "Request and charge model", "请求时长: ${time}s": "Request time: ${time}s", "请求次数": "Number of Requests", @@ -2132,14 +2662,14 @@ "请求超时,请刷新页面后重新发起 GitHub 登录": "Request timed out, please refresh and restart GitHub login", "请求路径": "Request path", "请求转换": "Request conversion", - "原生格式": "Native format", - "转换": "Convert", "请求预扣费额度": "Pre-deduction quota for requests", "请点击我": "Please click me", "请确认以下设置信息,点击\"初始化系统\"开始配置": "Please confirm the following settings information, click \"Initialize system\" to start configuration", "请确认您已了解禁用两步验证的后果": "Please confirm that you understand the consequences of disabling two-factor authentication", "请确认管理员密码": "Please confirm the admin password", "请稍后几秒重试,Turnstile 正在检查用户环境!": "Please try again in a few seconds, Turnstile is checking the user environment!", + "请立刻修改默认密码!": "Please change the default password immediately!", + "请粘贴完整回调 URL(包含 code 与 state)": "Please paste the full callback URL (containing code and state)", "请联系管理员在系统设置中配置API信息": "Please contact the administrator to configure API information in the system settings.", "请联系管理员在系统设置中配置Uptime": "Please contact the administrator to configure Uptime in the system settings.", "请联系管理员在系统设置中配置公告信息": "Please contact the administrator to configure notice information in the system settings.", @@ -2152,12 +2682,22 @@ "请至少选择一个渠道": "Please select at least one channel", "请输入 API Key,一行一个,格式:APIKey|Region": "Enter API Key, one per line, format: APIKey|Region", "请输入 API Key,格式:APIKey|Region": "Enter API Key, format: APIKey|Region", + "请输入 Authorization Endpoint": "Please enter Authorization Endpoint", "请输入 AZURE_OPENAI_ENDPOINT,例如:https://docs-test-001.openai.azure.com": "Please enter AZURE_OPENAI_ENDPOINT, e.g.: https://docs-test-001.openai.azure.com", + "请输入 Client ID": "Please enter Client ID", + "请输入 Client Secret": "Please enter Client Secret", "请输入 io.net API Key": "Please enter io.net API Key", "请输入 io.net API Key(敏感信息不显示)": "Please enter io.net API Key (sensitive information not displayed)", + "请输入 JSON 格式的 OAuth 凭据,例如:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}": "Please enter OAuth credentials in JSON format, e.g.:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}", "请输入 JSON 格式的密钥内容,例如:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}": "Please enter the key content in JSON format, for example:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}", "请输入 OIDC 的 Well-Known URL": "Please enter the Well-Known URL for OIDC", + "请输入 Slug": "Please enter Slug", + "请输入 Token Endpoint": "Please enter Token Endpoint", + "请输入 User Info Endpoint": "Please enter User Info Endpoint", + "请输入6位验证码": "Please enter 6-digit verification code", "请输入6位验证码或8位备用码": "Please enter a 6-digit verification code or 8-digit backup code", + "请输入8位备用码": "Please enter 8-digit backup code", + "请输入Account ID,例如:d6b5da8hk1awo8nap34ube6gh": "Please enter Account ID, e.g.: d6b5da8hk1awo8nap34ube6gh", "请输入API地址": "Please enter the API address", "请输入API地址!": "Please enter the API address!", "请输入Bark推送URL": "Please enter Bark push URL", @@ -2191,6 +2731,7 @@ "请输入图标名称": "Please enter the icon name", "请输入填充值": "Please enter a value", "请输入备注(仅管理员可见)": "Please enter a remark (only visible to administrators)", + "请输入套餐标题": "Please enter plan title", "请输入完整的 JSON 格式密钥内容": "Please enter the complete JSON format key content", "请输入完整的URL,例如:https://api.openai.com/v1/chat/completions": "Please enter complete URL, e.g.: https://api.openai.com/v1/chat/completions", "请输入完整的URL链接": "Please enter the complete URL link", @@ -2201,6 +2742,7 @@ "请输入密钥,一行一个,格式:AccessKey|SecretAccessKey|Region": "Enter keys one per line, format: AccessKey|SecretAccessKey|Region", "请输入密钥!": "Please enter the key!", "请输入延长时长": "Please enter extension duration", + "请输入总额度": "Please enter total quota", "请输入您的密码": "Please enter your password", "请输入您的用户名以确认删除": "Please enter your username to confirm deletion", "请输入您的用户名或邮箱地址": "Please enter your username or email address", @@ -2218,7 +2760,9 @@ "请输入新的用户名": "Please enter a new username", "请输入新的部署名称": "Please enter new deployment name", "请输入显示名称": "Please enter display name", + "请输入智能体ID,例如:7342866812345": "Please enter Agent ID, e.g.: 7342866812345", "请输入有效的JSON格式的请求体。您可以参考预览面板中的默认请求体格式。": "Please enter a valid JSON format request body. You can refer to the default request body format in the preview panel.", + "请输入有效的URL地址": "Please enter a valid URL", "请输入有效的数字": "Please enter a valid number", "请输入有效的镜像地址": "Please enter a valid image address", "请输入标签名称": "Please enter the tag name", @@ -2233,7 +2777,10 @@ "请输入状态页面的Slug,如:my-status": "Please enter the slug for the status page, such as: my-status", "请输入生成数量": "Please enter the quantity to generate", "请输入用户名": "Please enter username", + "请输入用户名和密码!": "Please enter username and password!", + "请输入知识库 ID,例如:123456": "Please enter Knowledge Base ID, e.g.: 123456", "请输入私有部署地址,格式为:https://fastgpt.run/api/openapi": "Please enter private deployment address, format: https://fastgpt.run/api/openapi", + "请输入秒数": "Please enter seconds", "请输入管理员密码": "Please enter the admin password", "请输入管理员用户名": "Please enter the admin username", "请输入线路描述": "Please enter the route description", @@ -2244,6 +2791,7 @@ "请输入补全倍率": "Enter completion ratio", "请输入要延长的小时数": "Please enter the number of hours to extend", "请输入要设置的标签名称": "Please enter the tag name to be set", + "请输入认证器应用显示的验证码完成登录": "Enter the verification code from your authenticator app to complete login", "请输入认证器验证码": "Please enter authenticator verification code", "请输入认证器验证码或备用码": "Please enter authenticator verification code or backup code", "请输入说明": "Please enter the description", @@ -2254,6 +2802,7 @@ "请输入部署名称": "Please enter deployment name", "请输入部署名称以完成二次确认": "Enter deployment name to complete secondary confirmation", "请输入部署地区,例如:us-central1\n支持使用模型映射格式\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}": "Please enter the deployment region, for example: us-central1\nSupports using model mapping format\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}", + "请输入金额": "Please enter amount", "请输入镜像地址": "Please enter image address", "请输入问题标题": "Please enter the question title", "请输入预警阈值": "Please enter alert threshold", @@ -2275,6 +2824,7 @@ "请选择多密钥使用策略": "Please select multi-key usage policy", "请选择密钥更新模式": "Please select key update mode", "请选择密钥格式": "Please select key format", + "请选择支付方式": "Please select a payment method", "请选择日志记录时间": "Please select log record time", "请选择模型": "Please select model", "请选择模型。": "Please select model.", @@ -2283,6 +2833,7 @@ "请选择硬件类型": "Please select hardware type", "请选择组类型": "Please select group type", "请选择至少一个部署位置": "Please select at least one deployment location", + "请选择订阅套餐": "Please select a subscription plan", "请选择该令牌支持的模型,留空支持所有模型": "Select models supported by the token, leave blank to support all models", "请选择该渠道所支持的模型": "Please select the model supported by this channel", "请选择该渠道所支持的模型,留空则不更改": "Please select the models supported by the channel, leaving blank will not change", @@ -2297,6 +2848,7 @@ "警告:启用保活后,如果已经写入保活数据后渠道出错,系统无法重试,如果必须开启,推荐设置尽可能大的Ping间隔": "Warning: After enabling keep-alive, if the channel fails after keep-alive data has been written, the system cannot retry. If you must enable it, it is recommended to set the Ping interval as large as possible", "警告:禁用两步验证将永久删除您的验证设置和所有备用码,此操作不可撤销!": "Warning: Disabling two-factor authentication will permanently delete your verification settings and all backup codes. This action is irreversible!", "豆包": "Doubao", + "豆包视频": "Doubao Video", "账单": "Bills", "账户充值": "Account recharge", "账户已删除!": "Account has been deleted!", @@ -2305,21 +2857,31 @@ "账户管理": "Account management", "账户绑定": "Account Binding", "账户绑定、安全设置和身份验证": "Account binding, security settings and identity verification", + "账户绑定管理": "Account Binding Management", "账户统计": "Account statistics", "货币": "Currency", "货币单位": "Currency Unit", + "购买上限": "Purchase Limit", "购买兑换码": "Buy redemption code", + "购买套餐后即可享受模型权益": "Enjoy model benefits after purchasing a plan", + "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。": "Purchasing or manually adding a subscription will upgrade to this group. When the plan expires or is invalidated/deleted, it will revert to the previous group. The rollback is not immediate and usually takes a few minutes.", + "购买订阅套餐": "Purchase Subscription Plan", "费用信息": "Cost Information", "费用预估": "Cost Estimate", "资源消耗": "Resource Consumption", "起始时间": "Start Time", "超级管理员": "Super Admin", "超级管理员未设置充值链接!": "Super administrator has not set the recharge link!", + "超过阈值时拒绝新请求": "Reject new requests when threshold is exceeded", + "距离重置:": "Time until reset:", "跟随日志": "Follow Logs", "跟随系统主题设置": "Follow system theme", "跨分组": "Cross-group", "跨分组重试": "Cross-group retry", + "路径正则": "Path Regex", + "路径正则(每行一个)": "Path Regex (one per line)", "跳转": "Jump", + "转换": "Convert", "轮询": "Polling", "轮询模式": "Polling mode", "轮询模式必须搭配Redis和内存缓存功能使用,否则性能将大幅降低,并且无法实现轮询功能": "Polling mode must be used with Redis and memory cache functions, otherwise the performance will be significantly reduced and the polling function will not be implemented", @@ -2336,6 +2898,7 @@ "输入你的账户名{{username}}以确认删除": "Enter your account name{{username}} to confirm deletion", "输入域名后回车": "Enter domain and press Enter", "输入域名后回车,如:example.com": "Enter domain and press Enter, e.g.: example.com", + "输入基础 URL": "Enter base URL", "输入密码,最短 8 位,最长 20 位": "Enter password, at least 8 characters and up to 20 characters", "输入数字": "Enter Number", "输入标签或使用\",\"分隔多个标签": "Enter tags or use \",\" to separate multiple tags", @@ -2349,17 +2912,20 @@ "输入要添加的邮箱域名": "Enter the email domain to add", "输入认证器应用显示的6位数字验证码": "Enter the 6-digit verification code displayed on the authenticator application", "输入邮箱地址": "Enter Email Address", + "输入金额": "Enter amount", "输入项目名称,按回车添加": "Enter the item name, press Enter to add", + "输入额度": "Enter quota", "输入验证码": "Enter Verification Code", "输入验证码完成设置": "Enter verification code to complete setup", "输出": "Output", "输出 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}}) * {{ratioType}} {{ratio}}": "Output {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}}", - "GC 执行失败": "GC execution failed", - "缓存目录": "Cache Directory", - "可用": "Available", + "输出价格": "Output Price", "输出价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "Output price: {{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (Completion ratio: {{completionRatio}})", "输出倍率 {{completionRatio}}": "Output ratio {{completionRatio}}", "边栏设置": "Sidebar Settings", + "迁移失败: ": "Migration failed: ", + "迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。": "Data format conversion is handled automatically during migration. Old config will be cleared after migration, please backup in database before migrating.", + "过期于": "Expires at", "过期时间": "Expiration time", "过期时间不能早于当前时间!": "Expiration time cannot be earlier than the current time!", "过期时间快捷设置": "Expiration time quick settings", @@ -2369,15 +2935,18 @@ "运行命令 (Command)": "Command", "运行时长": "Runtime Duration", "运行时长(小时)": "Runtime Duration (hours)", + "近 30 天": "Last 30 Days", + "近 7 天": "Last 7 Days", "返回修改": "Go back and edit", "返回登录": "Return to Login", - "违规扣费金额": "Violation deduction amount", - "这是重复键中的最后一个,其值将被使用": "This is the last one among duplicate keys, and its value will be used", - "这是基础金额,实际扣费 = 基础金额 x 系统分组倍率。": "This is the base amount. Actual deduction = base amount × system group ratio.", "这将删除超过 10 分钟未使用的临时缓存文件": "This will delete temporary cache files that have not been used for more than 10 minutes", + "这是基础金额,实际扣费 = 基础金额 x 系统分组倍率。": "This is the base amount. Actual deduction = base amount × system group ratio.", + "这是重复键中的最后一个,其值将被使用": "This is the last one among duplicate keys, and its value will be used", "进度": "Progress", "进行中": "Ongoing", "进行该操作时,可能导致渠道访问错误,请仅在数据库出现问题时使用": "When performing this operation, it may cause channel access errors. Please only use it when there is a problem with the database.", + "违规扣费": "Violation Charge", + "违规扣费金额": "Violation deduction amount", "连接保活设置": "Connection Keep-alive Settings", "连接已断开": "Connection Disconnected", "连接测试中...": "Testing connection...", @@ -2385,6 +2954,7 @@ "追加模式:将新密钥添加到现有密钥列表末尾": "Append mode: add new keys to the end of the existing key list", "追加模式:新密钥将添加到现有密钥列表的末尾": "Append mode: new keys will be added to the end of the existing key list", "退出": "Quit", + "退款": "Refund", "适用于个人使用的场景,不需要设置模型价格": "Suitable for personal use, no need to set model price.", "适用于为多个用户提供服务的场景": "Suitable for scenarios where multiple users are provided.", "适用于展示系统功能的场景,提供基础功能演示": "Suitable for scenarios where the system functions are displayed, providing basic feature demonstrations.", @@ -2396,6 +2966,7 @@ "选择同步渠道": "Select synchronization channel", "选择同步语言": "Select sync language", "选择容器": "Select Container", + "选择您的首选界面语言,设置将自动保存并同步到所有设备": "Select your preferred interface language. Settings will be saved automatically and synced across all devices", "选择成功": "Selection successful", "选择支付方式": "Select payment method", "选择支持的认证设备类型": "Choose supported authentication device types", @@ -2411,9 +2982,12 @@ "选择系统运行模式": "Select system running mode", "选择组类型": "Please select group type", "选择要覆盖的冲突项": "Select conflict items to overwrite", + "选择订阅套餐": "Select subscription plan", "选择语言": "Select language", "选择过期时间(可选,留空为永久)": "Select expiration time (optional, leave blank for permanent)", "选择部署位置(可多选)": "Select deployment location(s) (multiple selections allowed)", + "选择预设...": "Select preset...", + "选择预设模板(可选)": "Select Preset Template (optional)", "透传请求体": "Pass through body", "通义千问": "Qwen", "通用设置": "General Settings", @@ -2450,6 +3024,8 @@ "邮箱地址": "Email address", "邮箱域名格式不正确,请输入有效的域名,如 gmail.com": "The email domain format is incorrect. Please enter a valid domain such as gmail.com", "邮箱域名白名单格式不正确": "The email domain whitelist format is incorrect", + "邮箱字段": "Email Field", + "邮箱字段(可选)": "Email Field (optional)", "邮箱账户绑定成功!": "Email account bound successfully!", "部分保存失败": "Some settings failed to save", "部分保存失败,请重试": "Partial saving failed, please try again", @@ -2480,6 +3056,8 @@ "配置 Turnstile": "Configure Turnstile", "配置 WeChat Server": "Configure WeChat Server", "配置和消息已全部重置": "Configuration and messages have been completely reset", + "配置套餐的有效时长": "Configure the plan validity duration", + "配置如何从用户信息 API 响应中提取用户数据,支持 JSONPath 语法": "Configure how to extract user data from user info API response, supports JSONPath syntax", "配置完成后刷新页面即可使用模型部署功能": "After configuration is complete, refresh the page to use the model deployment feature", "配置导入成功": "Configuration imported successfully", "配置已导出到下载文件夹": "Configuration has been exported to the download folder", @@ -2490,7 +3068,9 @@ "配置服务器端请求伪造(SSRF)防护,用于保护内网资源安全": "Configure Server-Side Request Forgery (SSRF) protection to secure internal network resources", "配置模型部署服务提供商的API密钥和启用状态": "Configure the API key and enabled status of the model deployment service provider", "配置登录注册": "Configure Login/Registration", + "配置自定义 OAuth 提供商,支持 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 协议的身份提供商": "Configure custom OAuth providers, supports GitHub Enterprise, GitLab, Gitea, Nextcloud, Keycloak, ORY and other OAuth 2.0 compatible identity providers", "配置说明": "Configuration instructions", + "配置迁移确认": "Config Migration Confirmation", "配置邮箱域名白名单": "Configure email domain whitelist", "重启部署失败": "Failed to restart deployment", "重命名部署": "Rename Deployment", @@ -2504,26 +3084,31 @@ "重新生成备用码失败": "Failed to regenerate backup codes", "重新生成备用码将使现有的备用码失效,请确保您已保存了当前的备用码。": "Regenerating backup codes will invalidate existing backup codes. Please ensure you have saved the current backup codes.", "重绘": "Vary", + "重置": "Reset", "重置 2FA": "Reset Two-Factor Authentication", "重置 Passkey": "Reset Passkey", "重置为默认": "Reset to Default", + "重置周期": "Reset Period", + "重置失败": "Reset failed", + "重置时间:": "Reset time:", "重置模型倍率": "Reset model ratio", + "重置统计": "Reset Stats", "重置选项": "Reset options", "重置邮件发送成功,请检查邮箱!": "The reset email was sent successfully, please check your email!", "重置配置": "Reset configuration", "重要提醒": "Important Notice", "重试": "Retry", "重试连接": "Retry Connection", + "金额": "Amount", "钱包管理": "Wallet Management", "链接中的{key}将自动替换为sk-xxxx,{address}将自动替换为系统设置的服务器地址,末尾不带/和/v1": "The {key} in the link will be automatically replaced with sk-xxxx, the {address} will be automatically replaced with the server address in system settings, and the end will not have / and /v1", "销毁容器": "Destroy Container", "销毁容器失败": "Failed to destroy container", "错误": "errors", - "退款": "Refund", + "错误:": "Error: ", + "错误:服务器内部错误,请联系管理员!": "Error: Internal server error, please contact administrator!", + "错误:请求次数过多,请稍后再试!": "Error: Too many requests, please try again later!", "错误详情": "Error Details", - "异步任务退款": "Async Task Refund", - "任务ID": "Task ID", - "失败原因": "Failure Reason", "键为分组名称,值为另一个 JSON 对象,键为分组名称,值为该分组的用户的特殊分组倍率,例如:{\"vip\": {\"default\": 0.5, \"test\": 1}},表示 vip 分组的用户在使用default分组的令牌时倍率为0.5,使用test分组时倍率为1": "The key is the group name, and the value is another JSON object. The key is the group name, and the value is the special group ratio for users in that group. For example: {\"vip\": {\"default\": 0.5, \"test\": 1}} means that users in the vip group have a ratio of 0.5 when using tokens from the default group, and a ratio of 1 when using tokens from the test group", "键为原状态码,值为要复写的状态码,仅影响本地判断": "The key is the original status code, and the value is the status code to override, only affects local judgment", "键为用户分组名称,值为操作映射对象。内层键以\"+:\"开头表示添加指定分组(键值为分组名称,值为描述),以\"-:\"开头表示移除指定分组(键值为分组名称),不带前缀的键直接添加该分组。例如:{\"vip\": {\"+:premium\": \"高级分组\", \"special\": \"特殊分组\", \"-:default\": \"默认分组\"}},表示 vip 分组的用户可以使用 premium 和 special 分组,同时移除 default 分组的访问权限": "Keys are user group names and values are operation mappings. Inner keys prefixed with \"+:\" add the specified group (key is the group name, value is the description); keys prefixed with \"-:\" remove the specified group; keys without a prefix add that group directly. Example: {\"vip\": {\"+:premium\": \"Advanced group\", \"special\": \"Special group\", \"-:default\": \"Default group\"}} means vip users can access the premium and special groups while removing access to the default group.", @@ -2536,12 +3121,17 @@ "镜像地址": "Image Address", "镜像选择": "Image Selection", "镜像配置": "Image Configuration", + "问答已删除,请及时点击”保存设置”进行保存": "FAQ deleted, please click \"Save Settings\" to save", + "问答已更新,请及时点击”保存设置”进行保存": "FAQ updated, please click \"Save Settings\" to save", + "问答已添加,请及时点击”保存设置”进行保存": "FAQ added, please click \"Save Settings\" to save", "问题标题": "Question Title", "队列中": "In queue", + "阿里通义千问": "Alibaba Tongyi Qianwen", "降低您账户的安全性": "Reduce your account security", "降级": "Demote", "限制周期": "Limit period", "限制周期统一使用上方配置的“限制周期”值。": "The limit period uniformly uses the \"limit period\" value configured above.", + "限购": "Limit", "隐私政策": "Privacy Policy", "隐私政策已更新": "Privacy policy updated", "隐私政策更新失败": "Privacy policy update failed", @@ -2559,59 +3149,82 @@ "需要重新完整设置才能再次启用": "Need to set up again to re-enable", "非必要,不建议启用模型限制": "Not necessary, model restrictions are not recommended", "非流": "not stream", + "音乐预览": "Music Preview", "音频倍率(仅部分模型支持该计费)": "Audio ratio (only supported by some models for billing)", "音频提示 {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}": "Audio prompt {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + Audio completion {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}", "音频提示价格:{{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens (音频倍率: {{audioRatio}})": "Audio prompt price: {{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens (Audio ratio: {{audioRatio}})", + "音频无法播放": "Audio cannot be played", "音频补全价格:{{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens (音频补全倍率: {{audioCompRatio}})": "Audio completion price: {{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens (Audio completion ratio: {{audioCompRatio}})", "音频补全倍率(仅部分模型支持该计费)": "Audio completion ratio (only supported by some models for this billing)", "音频输入相关的倍率设置,键为模型名称,值为倍率": "Audio input related ratio settings, key is model name, value is ratio", "音频输出补全相关的倍率设置,键为模型名称,值为倍率": "Audio output completion related ratio settings, key is model name, value is ratio", "页脚": "Footer", + "页脚内容已更新": "Footer content updated", + "页脚内容更新失败": "Failed to update footer content", "页面未找到,请检查您的浏览器地址是否正确": "Page not found, please check if your browser address is correct", "顶栏管理": "Header Management", "项目": "Project", "项目内容": "Project content", "项目操作按钮组": "Project action button group", "预估总费用": "Estimated Total Cost", + "预估总额度": "Est. total quota", "预估费用仅供参考,实际费用可能略有差异": "Estimated cost is for reference only, actual cost may vary slightly", "预填组管理": "Pre-filled group", + "预扣": "Pre-charge", "预览失败": "Preview failed", "预览更新": "Preview update", "预览请求体": "Preview request body", "预计结束": "Estimated End", + "预设模板": "Preset Template", "预警阈值必须为正数": "Warning threshold must be a positive number", "频率惩罚,减少重复词汇的出现": "Frequency penalty, reduces repeated vocabulary", "频率限制的周期(分钟)": "Rate limit period (minutes)", "颜色": "Color", "额度": "Quota", - "输入额度": "Enter quota", - "金额": "Amount", - "输入金额": "Enter amount", - "仅用于换算,实际保存的是额度": "For conversion only, quota is what gets saved", + "额度充值": "Quota Top-up", "额度必须大于0": "Quota must be greater than 0", "额度提醒阈值": "Quota reminder threshold", "额度查询接口返回令牌额度而非用户额度": "Displays token quota instead of user quota", "额度设置": "Quota Settings", + "额度重置": "Quota Reset", "额度预警阈值": "Quota warning threshold", "首尾生视频": "Head-tail generated video", "首页": "Home", "首页内容": "Home Page Content", + "首页内容已更新": "Homepage content updated", + "首页内容更新失败": "Failed to update homepage content", "验证": "Verify", "验证 Passkey": "Verify Passkey", "验证失败,请重试": "Verification failed, please try again", + "验证并登录": "Verify and Login", "验证成功": "Verification successful", "验证数据库连接状态": "Verify database connection status", "验证码": "Verification Code", + "验证码发送成功,请检查你的邮箱!": "Verification code sent, please check your email!", "验证码发送成功,请检查邮箱!": "The verification code was sent successfully, please check your email!", + "验证码必须是6位数字": "Verification code must be 6 digits", "验证设置": "Verify setup", "验证身份": "Verify identity", "验证配置错误": "Verification configuration error", + "高危操作确认": "High-risk operation confirmation", + "高危状态码重试风险告知与免责声明Markdown": "### ⚠️ High-Risk Operation: Risk Notice and Disclaimer for 504/524 Retry\nBy default, this project does not retry for status codes `400` (bad request), `504` (gateway timeout), and `524` (timeout occurred).\n In many cases, 504 and 524 mean the request has reached the upstream AI service and processing has started, but the connection was closed due to long processing time.\n\nEnabling redirection/retry for these timeout status codes is a **high-risk operation**. Before enabling it, you must read and understand the consequences below:\n\n#### 1. Core Risks (Read Carefully)\n1. 💸 Duplicate/multiple billing risk: Most upstream AI providers **still charge** for requests that started processing but got interrupted by network timeout (504/524). If retry is triggered, a new upstream request will be sent, which can lead to **duplicate or multiple charges**.\n2. ⏳ Severe client timeout: If a single request already timed out, adding retries can multiply total latency and cause severe or unacceptable timeout behavior for your final client/caller.\n3. 💥 Request backlog and system crash risk: Forcing retries on timeout requests keeps threads and connections occupied for longer. Under high concurrency, this can cause serious backlog, exhaust system resources, trigger a cascading failure, and crash your proxy service.\n\n#### 2. Risk Acknowledgement\nIf you still choose to enable this feature, you acknowledge all of the following:", + "高危状态码重试风险确认输入文本": "I understand the duplicate billing and crash risks, and confirm enabling it.", + "高危状态码重试风险确认项1": "I have fully read and understood the risks and fully understand the destructive consequences of forcing retries for status codes 504 and 524.", + "高危状态码重试风险确认项2": "I have communicated with the upstream provider and confirmed that the timeout issue is an upstream bottleneck and cannot be resolved upstream at this time.", + "高危状态码重试风险确认项3": "I voluntarily accept all duplicate/multiple billing risks and will not file issues or complaints in this project repository regarding billing anomalies caused by this retry behavior.", + "高危状态码重试风险确认项4": "I voluntarily accept system stability risks, including severe client timeout and possible service crash. Any consequences caused by enabling this feature are my own responsibility.", + "高危状态码重试风险输入不匹配提示": "The input does not match the required text", + "高危状态码重试风险输入框占位文案": "Please type the exact text above", + "高延迟": "High Latency", "高级设置": "Advanced Settings", + "高级选项": "Advanced Options", "高级配置": "Advanced Configuration", "黑名单": "Blacklist", "默认": "Default", "默认 API 版本": "Default API Version", "默认 Responses API 版本,为空则使用上方版本": "Default Responses API version, if empty, uses the version above", + "默认 TTL(秒)": "Default TTL (seconds)", + "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)": "Defaults to the 5m cache creation ratio; the 1h cache creation ratio is computed by fixed multiplication (currently 1.6x)", "默认使用系统名称": "Default uses system name", "默认助手消息": "Default Assistant Message", "默认区域": "Default region", @@ -2619,223 +3232,6 @@ "默认折叠侧边栏": "Default collapse sidebar", "默认测试模型": "Default Test Model", "默认用户消息": "Default User Message", - "默认补全倍率": "Default completion ratio", - "每日签到": "Daily Check-in", - "今日已签到,累计签到": "Checked in today, total check-ins", - "每日签到可获得随机额度奖励": "Daily check-in rewards random quota", - "今日已签到": "Checked in today", - "立即签到": "Check in now", - "正在加载签到状态...": "Loading check-in status...", - "获取签到状态失败": "Failed to get check-in status", - "签到成功!获得": "Check-in successful! Received", - "签到失败": "Check-in failed", - "获得": "Received", - "累计签到": "Total check-ins", - "本月获得": "This month", - "累计获得": "Total received", - "签到奖励将直接添加到您的账户余额": "Check-in rewards will be directly added to your account balance", - "每日仅可签到一次,请勿重复签到": "Only one check-in per day, please do not check in repeatedly", - "签到设置": "Check-in Settings", - "签到功能允许用户每日签到获取随机额度奖励": "Check-in feature allows users to check in daily to receive random quota rewards", - "启用签到功能": "Enable check-in feature", - "签到最小额度": "Minimum check-in quota", - "签到奖励的最小额度": "Minimum quota for check-in rewards", - "签到最大额度": "Maximum check-in quota", - "签到奖励的最大额度": "Maximum quota for check-in rewards", - "保存签到设置": "Save check-in settings", - "ChatCompletions→Responses 兼容配置(Beta)": "ChatCompletions→Responses Compatibility (Beta)", - "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。": "Notice: This feature is beta. The configuration structure and behavior may change in the future. Do not use in production.", - "填充模板(指定渠道)": "Fill template (selected channels)", - "填充模板(全渠道)": "Fill template (all channels)", - "格式化 JSON": "Format JSON", - "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。": "Notice: This configuration only affects how models are displayed in the Model Marketplace and does not impact actual model invocation or routing. To configure real invocation behavior, please go to Channel Management.", - "确认关闭提示": "Confirm close", - "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?": "After closing, this notice will no longer be shown (only for this browser). Are you sure you want to close it?", - "关闭提示": "Close notice", - "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。": "Note: Tests on this page use non-streaming requests. If a channel only supports streaming responses, tests may fail. Please rely on actual usage.", - "Stripe/Creem 需在第三方平台创建商品并填入 ID": "Stripe/Creem products must be created on the third-party platform and the ID filled in", - "暂无订阅套餐": "No subscription plans", - "订阅管理": "Subscription Management", - "订阅套餐管理": "Subscription Plan Management", - "新建套餐": "Create Plan", - "套餐": "Plan", - "支付渠道": "Payment Channels", - "购买上限": "Purchase Limit", - "有效期": "Validity", - "重置": "Reset", - "禁用后用户端不再展示,但历史订单不受影响。是否继续?": "After disabling, it will no longer be shown to users, but historical orders are not affected. Continue?", - "启用后套餐将在用户端展示。是否继续?": "After enabling, the plan will be shown to users. Continue?", - "更新套餐信息": "Update Plan Info", - "创建新的订阅套餐": "Create a New Subscription Plan", - "套餐的基本信息和定价": "Basic plan info and pricing", - "套餐标题": "Plan Title", - "请输入套餐标题": "Please enter plan title", - "套餐副标题": "Plan Subtitle", - "例如:适合轻度使用": "e.g.: Suitable for light usage", - "请输入金额": "Please enter amount", - "请输入总额度": "Please enter total quota", - "0 表示不限": "0 means unlimited", - "原生额度": "Raw quota", - "升级分组": "Upgrade Group", - "不升级": "No upgrade", - "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。": "Purchasing or manually adding a subscription will upgrade to this group. When the plan expires or is invalidated/deleted, it will revert to the previous group. The rollback is not immediate and usually takes a few minutes.", - "币种": "Currency", - "由全站货币展示设置统一控制": "Controlled by the site-wide currency display settings", - "排序": "Sort Order", - "启用状态": "Enabled Status", - "有效期设置": "Validity Settings", - "配置套餐的有效时长": "Configure the plan validity duration", - "有效期单位": "Validity Unit", - "自定义秒数": "Custom seconds", - "请输入秒数": "Please enter seconds", - "有效期数值": "Validity Value", - "额度重置": "Quota Reset", - "支持周期性重置套餐权益额度": "Supports periodic reset of plan quota", - "重置周期": "Reset Period", - "第三方支付配置": "Third-party Payment Configuration", - "Stripe/Creem 商品ID(可选)": "Stripe/Creem Product ID (optional)", - "生效": "Active", - "已作废": "Invalidated", - "用户订阅管理": "User Subscription Management", - "选择订阅套餐": "Select subscription plan", - "新增订阅": "Add subscription", - "暂无订阅记录": "No subscription records", - "来源": "Source", - "开始": "Start", - "结束": "End", - "作废": "Invalidate", - "确认作废": "Confirm invalidation", - "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "After invalidation, the subscription becomes invalid immediately. History is not affected. Continue?", - "删除会彻底移除该订阅记录(含权益明细)。是否继续?": "Deletion will permanently remove this subscription record (including benefit details). Continue?", - "绑定订阅套餐": "Bind Subscription Plan", - "绑定后会立即生成用户订阅(无需支付),有效期按套餐配置计算。": "After binding, a user subscription is created immediately (no payment required); validity follows the plan configuration.", - "订阅套餐": "Subscription Plans", - "额度充值": "Quota Top-up", - "优先订阅": "Subscription first", - "优先钱包": "Wallet first", - "仅用订阅": "Subscription only", - "仅用钱包": "Wallet only", - "我的订阅": "My Subscriptions", - "个生效中": "active", - "无生效": "No active", - "已保存偏好为": "Saved preference: ", - ",当前无生效订阅,将自动使用钱包": ", no active subscription. Wallet will be used automatically.", - "个已过期": "expired", - "订阅": "Subscription", - "至": "until", - "过期于": "Expires at", - "作废于": "Invalidated at", - "购买套餐后即可享受模型权益": "Enjoy model benefits after purchasing a plan", - "限购": "Limit", - "推荐": "Recommended", - "已达到购买上限": "Purchase limit reached", - "已达上限": "Limit reached", - "立即订阅": "Subscribe now", - "暂无可购买套餐": "No plans available for purchase", - "该套餐未配置 Stripe": "This plan is not configured for Stripe", - "已打开支付页面": "Payment page opened", - "支付失败": "Payment failed", - "该套餐未配置 Creem": "This plan is not configured for Creem", - "已发起支付": "Payment initiated", - "购买订阅套餐": "Purchase Subscription Plan", - "套餐名称": "Plan Name", - "应付金额": "Amount Due", - "支付": "Pay", - "管理员未开启在线支付功能,请联系管理员配置。": "Online payment is not enabled by the admin. Please contact the administrator.", - "磁盘缓存设置(磁盘换内存)": "Disk Cache Settings (Disk Swap Memory)", - "启用磁盘缓存后,大请求体将临时存储到磁盘而非内存,可显著降低内存占用,适用于处理包含大量图片/文件的请求。建议在 SSD 环境下使用。": "When enabled, large request bodies are temporarily stored on disk instead of memory, significantly reducing memory usage. Suitable for requests with large images/files. SSD recommended.", - "启用磁盘缓存": "Enable Disk Cache", - "将大请求体临时存储到磁盘": "Store large request bodies temporarily on disk", - "磁盘缓存阈值 (MB)": "Disk Cache Threshold (MB)", - "请求体超过此大小时使用磁盘缓存": "Use disk cache when request body exceeds this size", - "磁盘缓存最大总量 (MB)": "Max Disk Cache Size (MB)", - "可用空间: {{free}} / 总空间: {{total}}": "Free: {{free}} / Total: {{total}}", - "磁盘缓存占用的最大空间": "Maximum space occupied by disk cache", - "留空使用系统临时目录": "Leave empty to use system temp directory", - "例如 /var/cache/new-api": "e.g. /var/cache/new-api", - "性能监控": "Performance Monitor", - "刷新统计": "Refresh Stats", - "重置统计": "Reset Stats", - "执行 GC": "Run GC", - "请求体磁盘缓存": "Request Body Disk Cache", - "活跃文件": "Active Files", - "磁盘命中": "Disk Hits", - "请求体内存缓存": "Request Body Memory Cache", - "当前缓存大小": "Current Cache Size", - "活跃缓存数": "Active Cache Count", - "内存命中": "Memory Hits", - "缓存目录磁盘空间": "Cache Directory Disk Space", - "磁盘可用空间小于缓存最大总量设置": "Disk free space is less than max cache size setting", - "已分配内存": "Allocated Memory", - "总分配内存": "Total Allocated Memory", - "系统内存": "System Memory", - "GC 次数": "GC Count", - "Goroutine 数": "Goroutine Count", - "目录文件数": "Directory File Count", - "目录总大小": "Directory Total Size", - "磁盘缓存已清理": "Disk cache cleared", - "清理失败": "Cleanup failed", - "统计已重置": "Statistics reset", - "重置失败": "Reset failed", - "GC 已执行": "GC executed", - "GC execution failed": "GC execution failed", - "Cache Directory": "Cache Directory", - "Available": "Available", - "输出价格": "Output Price", - "偏好设置": "Preferences", - "界面语言和其他个人偏好": "Interface language and other personal preferences", - "语言偏好": "Language Preference", - "选择您的首选界面语言,设置将自动保存并同步到所有设备": "Select your preferred interface language. Settings will be saved automatically and synced across all devices", - "语言偏好已保存": "Language preference saved", - "提示:语言偏好会同步到您登录的所有设备,并影响API返回的错误消息语言。": "Note: Language preference syncs across all your logged-in devices and affects the language of API error messages.", - "自定义 OAuth 提供商": "Custom OAuth Providers", - "配置自定义 OAuth 提供商,支持 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 协议的身份提供商": "Configure custom OAuth providers, supports GitHub Enterprise, GitLab, Gitea, Nextcloud, Keycloak, ORY and other OAuth 2.0 compatible identity providers", - "回调 URL 格式": "Callback URL format", - "添加提供商": "Add Provider", - "编辑提供商": "Edit Provider", - "选择预设...": "Select preset...", - "输入基础 URL": "Enter base URL", - "例如": "e.g.", - "提供商名称": "Provider Name", - "标识符 (Slug)": "Slug", - "授权端点": "Authorization Endpoint", - "令牌端点": "Token Endpoint", - "用户信息端点": "User Info Endpoint", - "用户 ID 字段": "User ID Field", - "支持 JSONPath,如 sub, id, data.user.id": "Supports JSONPath, e.g. sub, id, data.user.id", - "用户名字段": "Username Field", - "支持 JSONPath,如 preferred_username, login, data.user.username": "Supports JSONPath, e.g. preferred_username, login, data.user.username", - "显示名称字段": "Display Name Field", - "支持 JSONPath,如 name, display_name, data.user.name": "Supports JSONPath, e.g. name, display_name, data.user.name", - "邮箱字段": "Email Field", - "支持 JSONPath,如 email, data.user.email": "Supports JSONPath, e.g. email, data.user.email", - "授权范围 (Scopes)": "Scopes", - "认证方式": "Auth Style", - "自动检测": "Auto-detect", - "参数传递": "In Parameters", - "Basic Auth 头": "Basic Auth Header", - "暂无自定义 OAuth 提供商": "No custom OAuth providers", - "确定要删除该提供商吗?": "Are you sure you want to delete this provider?", - "创建成功": "Created successfully", - "更新成功": "Updated successfully", - "确认解绑": "Confirm Unbind", - "确定要解绑 {{name}} 吗?": "Are you sure you want to unbind {{name}}?", - "解绑成功": "Unbind successful", - "{{name}} ID": "{{name}} ID", - "使用 {{name}} 继续": "Continue with {{name}}", - "端点 URL 必须以 http:// 或 https:// 开头:": "Endpoint URL must start with http:// or https://: ", - "OAuth 配置错误:授权端点必须是完整的 URL(以 http:// 或 https:// 开头)": "OAuth configuration error: Authorization endpoint must be a full URL (starting with http:// or https://)", - "OAuth 登录失败:": "OAuth login failed: ", - "必填:请输入服务器地址以自动生成完整端点 URL": "Required: Enter server address to auto-generate full endpoint URLs", - "填写服务器地址后自动生成:": "Auto-generated after entering server address: ", - "自动生成:": "Auto-generated: ", - "请先填写服务器地址,以自动生成完整的端点 URL": "Please enter the server address first to auto-generate full endpoint URLs", - "端点 URL 必须是完整地址(以 http:// 或 https:// 开头)": "Endpoint URL must be a full address (starting with http:// or https://)", - "缓存读": "Cache Read", - "缓存写": "Cache Write", - "写": "Write", - "根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。": "Per Anthropic conventions, /v1/messages input tokens count only non-cached input and exclude cache read/write tokens.", - "设计版本": "b80c3466cb6feafeb3990c7820e10e50", - "未匹配到模型,按回车键可将「{{name}}」作为自定义模型名添加": "No matching models. Press Enter to add \"{{name}}\" as a custom model name." + "默认补全倍率": "Default completion ratio" } } diff --git a/web/src/i18n/locales/fr.json b/web/src/i18n/locales/fr.json index c36b969dd6..149aa5bc3e 100644 --- a/web/src/i18n/locales/fr.json +++ b/web/src/i18n/locales/fr.json @@ -10,6 +10,8 @@ " 个模型设置相同的值": " modèles avec la même valeur", " 吗?": " ?", " 秒": "s", + " 秒。": " seconds.", + ",当前无生效订阅,将自动使用钱包": ", aucun abonnement actif, le portefeuille sera utilisé automatiquement.", ",时间:": ", time:", ",点击更新": ", cliquez sur Mettre à jour", "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(Actuellement, seule l'interface Epay est prise en charge, l'adresse du serveur ci-dessus est utilisée par défaut comme adresse de rappel !)", @@ -25,25 +27,33 @@ "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", + "{{name}} ID": "{{name}} ID", "{{ratioType}} {{ratio}}": "{{ratioType}} {{ratio}}", + "• 如果无法获取验证码,请使用备用码": "• If you cannot get the verification code, use a backup code", + "• 每个备用码只能使用一次": "• Each backup code can only be used once", "• 视频服务商的跨域限制": "• Des restrictions cross-origin imposées par le fournisseur vidéo", "• 防盗链保护机制": "• Un mécanisme de protection anti-hotlink", "• 需要特定的请求头或认证": "• Des en-têtes ou une authentification spécifiques sont requis", + "• 验证码每30秒更新一次": "• Verification code updates every 30 seconds", "© {{currentYear}}": "© {{currentYear}}", "| 基于": " | Basé sur ", "$/1M tokens": "$/1M tokens", "0 - 最低": "0 - La plus basse", + "0 表示不限": "0 signifie illimité", "0.002-1之间的小数": "Décimal entre 0,002-1", "0.1以上的小数": "Décimal supérieur à 0,1", + "1) 点击「打开授权页面」完成登录;2) 浏览器会跳转到 localhost(页面打不开也没关系);3) 复制地址栏完整 URL 粘贴到下方;4) 点击「生成并填入」。": "1) Click \"Open Authorization Page\" to complete login; 2) Browser will redirect to localhost (it's OK if the page doesn't load); 3) Copy the full URL from the address bar and paste it below; 4) Click \"Generate and Fill In\".", "10 - 最高": "10 - La plus haute", "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Création du cache 1h {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio : {{ratio}})", "1h缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (1h缓存创建倍率: {{cacheCreationRatio1h}})": "Prix de création de cache 1h : {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (ratio de création 1h : {{cacheCreationRatio1h}})", "2 - 低": "2 - Basse", "2025年5月10日后添加的渠道,不需要再在部署的时候移除模型名称中的\".\"": "Après le 10 mai 2025, les canaux ajoutés n'ont plus besoin de supprimer le point dans le nom du modèle lors du déploiement", + "360 智脑": "360 AI Brain", "360智脑": "360 AI Brain", "5 - 正常(默认)": "5 - Normale (par défaut)", "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Création du cache 5m {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio : {{ratio}})", "5m缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (5m缓存创建倍率: {{cacheCreationRatio5m}})": "Prix de création de cache 5m : {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (ratio de création 5m : {{cacheCreationRatio5m}})", + "5小时窗口": "5-hour window", "8 - 高": "8 - Haute", "AGPL v3.0协议": "Licence AGPL v3.0", "AI 对话": "Conversation IA", @@ -61,6 +71,11 @@ "API令牌管理": "Jetons API", "API使用记录": "Journaux d'API", "API信息": "Informations sur l'API", + "API信息已删除,请及时点击”保存设置”进行保存": "API info deleted, please click \"Save Settings\" to save", + "API信息已更新": "API info updated", + "API信息已更新,请及时点击”保存设置”进行保存": "API info updated, please click \"Save Settings\" to save", + "API信息已添加,请及时点击”保存设置”进行保存": "API info added, please click \"Save Settings\" to save", + "API信息更新失败": "Failed to update API info", "API信息管理,可以配置多个API地址用于状态展示和负载均衡(最多50个)": "Infos API, vous pouvez configurer plusieurs adresses d'API pour l'affichage de l'état et l'équilibrage de charge (maximum 50)", "API地址": "URL de base", "API渠道配置": "Configuration du canal de l'API", @@ -71,13 +86,27 @@ "Bark推送URL": "URL de notification Bark", "Bark推送URL必须以http://或https://开头": "L'URL de notification Bark doit commencer par http:// ou https://", "Bark通知": "Notification Bark", + "Basic Auth 头": "Basic Auth Header", + "Cached tokens": "Cached tokens", + "Cached tokens 占比口径由后端返回:Claude 语义按 cached/(prompt+cached),其余按 cached/prompt。": "Cached token ratio calculated by backend: Claude uses cached/(prompt+cached), others use cached/prompt.", "Changing batch type to:": "Changement du type de lot en :", + "ChatCompletions→Responses 兼容配置": "ChatCompletions→Responses Compatibility Config", + "ChatCompletions→Responses 兼容配置(Beta)": "Compatibilité ChatCompletions→Responses (bêta)", + "Claude 强制 beta=true": "Force Claude beta=true", "Claude思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Adaptation de la pensée Claude BudgetTokens = MaxTokens * BudgetTokens pourcentage", "Claude设置": "Paramètres Claude", "Claude请求头覆盖": "Remplacement de l'en-tête de la requête Claude", "Client ID": "ID client", "Client Secret": "Secret client", + "Codex 授权": "Codex Authorization", + "Codex 渠道不支持批量创建": "Codex channels do not support batch creation", + "Codex 用量": "Codex Usage", "common.changeLanguage": "Changer de langue", + "Completion tokens": "Completion tokens", + "Configuration": "Configuration", + "context_int/context_string 从请求上下文读取;gjson 从入口请求的 JSON body 按 gjson path 读取。": "context_int/context_string reads from request context; gjson reads from the entry request JSON body via gjson path.", + "CPU 使用率超过此值时拒绝请求": "Rejeter les requêtes lorsque l'utilisation du CPU dépasse cette valeur", + "CPU 阈值 (%)": "Seuil CPU (%)", "Creem API 密钥,敏感信息不显示": "Clé API Creem, les informations sensibles ne sont pas affichées", "Creem Setting Tips": "Creem ne prend en charge que des produits à montant fixe préconfigurés. Ces produits et leurs prix doivent être créés et configurés à l'avance sur le site Creem, les recharges à montant dynamique ne sont donc pas prises en charge. Configurez le nom et le prix du produit sur Creem, récupérez l'identifiant du produit, puis remplissez-le ci-dessous. Définissez enfin le montant et le prix affiché dans new-api.", "Creem 介绍": "Présentation de Creem", @@ -90,8 +119,14 @@ "Discord Client ID": "ID client Discord", "Discord Client Secret": "Secret client Discord", "Discord ID": "ID Discord", + "Discovery claims": "Discovery claims", + "Discovery scopes": "Discovery scopes", + "Discovery 建议 scopes:": "Suggested Discovery scopes:", "EUR (欧元)": "EUR (Euro)", "false": "faux", + "GC 已执行": "GC executed", + "GC 执行失败": "GC execution failed", + "GC 次数": "GC Count", "Gemini安全设置": "Paramètres de sécurité Gemini", "Gemini思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Adaptation de la pensée Gemini BudgetTokens = MaxTokens * BudgetTokens pourcentage", "Gemini思考适配设置": "Paramètres d'adaptation de la pensée Gemini", @@ -101,34 +136,53 @@ "GitHub Client ID": "ID client GitHub", "GitHub Client Secret": "Secret client GitHub", "GitHub ID": "ID GitHub", + "Goroutine 数": "Goroutine Count", "Gotify应用令牌": "Jeton d'application Gotify", "Gotify服务器地址": "Adresse du serveur Gotify", "Gotify服务器地址必须以http://或https://开头": "L'adresse du serveur Gotify doit commencer par http:// ou https://", "Gotify通知": "Notification Gotify", - "Grok设置": "Paramètres Grok", "GPU/容器": "GPU/Container", "GPU数量": "Number of GPUs", + "Grok设置": "Paramètres Grok", "Homepage URL 填": "Remplir l'URL de la page d'accueil", "ID": "ID", + "id(用户 ID)": "id (User ID)", + "include_obfuscation 用于控制 Responses 流混淆字段。默认关闭以避免客户端关闭该安全保护": "include_obfuscation controls the Responses stream obfuscation field. Disabled by default to prevent clients from disabling this security protection", + "inference_geo 字段用于控制 Claude 数据驻留推理区域。默认关闭以避免未经授权透传地域信息": "inference_geo controls Claude data residency inference region. Disabled by default to prevent unauthorized geo information passthrough", "IP": "IP", "IP白名单": "IP Whitelist", "IP白名单(支持CIDR表达式)": "Liste blanche d'adresses IP (prise en charge des expressions CIDR)", "IP限制": "Restrictions d'IP", "IP黑名单": "Liste noire d'adresses IP", "JSON": "JSON", + "JSON 模式": "JSON Mode", "JSON 模式支持手动输入或上传服务账号 JSON": "Le mode JSON prend en charge la saisie manuelle ou le téléchargement du JSON du compte de service", "JSON格式密钥,请确保格式正确": "Clé au format JSON, veuillez vous assurer que le format est correct", "JSON格式错误": "Erreur de format JSON", "JSON编辑": "Édition JSON", "JSON解析错误:": "Erreur d'analyse JSON :", + "Key": "Key", + "Key 或 Path": "Key or Path", + "Key 指纹": "Key Fingerprint", + "Key 摘要": "Key Summary", + "Key 来源": "Key Source", + "Key 来源类型": "Key Source Type", "Linux DO Client ID": "ID client Linux DO", "Linux DO Client Secret": "Secret client Linux DO", "LinuxDO": "LinuxDO", "LinuxDO ID": "ID LinuxDO", "Logo 图片地址": "Adresse de l'image du logo", + "Logo 已更新": "Logo updated", + "Logo 更新失败": "Failed to update logo", "Midjourney 任务记录": "Tâches Midjourney", "MIT许可证": "Licence MIT", "New API项目仓库地址:": "Adresse du référentiel du projet New API : ", + "NewAPI 默认不会将入口请求的 User-Agent 透传到上游渠道;该条件仅用于识别访问本站点的客户端。": "NewAPI does not passthrough the entry request User-Agent to upstream channels by default; this condition is only used to identify clients accessing this site.", + "OAuth Client ID": "OAuth Client ID", + "OAuth Client Secret": "OAuth Client Secret", + "OAuth 登录失败:": "OAuth login failed: ", + "OAuth 端点": "OAuth Endpoints", + "OAuth 配置错误:授权端点必须是完整的 URL(以 http:// 或 https:// 开头)": "OAuth configuration error: Authorization endpoint must be a full URL (starting with http:// or https://)", "OIDC": "OIDC", "OIDC ID": "ID OIDC", "Ollama 模型管理": "Ollama Model Management", @@ -140,12 +194,20 @@ "Passkey 注册失败,请重试": "L'enregistrement du Passkey a échoué. Veuillez réessayer.", "Passkey 注册成功": "Enregistrement du Passkey réussi", "Passkey 登录": "Connexion avec Passkey", + "Passkey 登录失败,请重试": "Passkey login failed, please try again", + "Passkey 验证失败,请重试": "Passkey verification failed, please try again", "Ping间隔(秒)": "Intervalle de ping (secondes)", + "POST 参数": "POST Parameters", "price_xxx 的商品价格 ID,新建产品后可获得": "ID de prix du produit price_xxx, peut être obtenu après la création d'un nouveau produit", + "Prompt cache hit tokens": "Prompt cache hit tokens", + "Prompt tokens": "Prompt tokens", "Reasoning Effort": "Effort de raisonnement", + "Request ID": "Request ID", "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "Le champ safety_identifier aide OpenAI à identifier les utilisateurs d'applications susceptibles de violer les politiques d'utilisation. Désactivé par défaut pour protéger la confidentialité des utilisateurs", + "Scopes(可选)": "Scopes (optional)", "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "Le champ service_tier est utilisé pour spécifier le niveau de service. Permettre le passage peut entraîner une facturation plus élevée que prévu. Désactivé par défaut pour éviter des frais supplémentaires", "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "Clé secrète Stripe sk_xxx ou rk_xxx, les informations sensibles ne sont pas affichées", + "Slug只能包含字母、数字、下划线和连字符": "Slug can only contain letters, numbers, underscores, and hyphens", "SMTP 发送者邮箱": "Adresse e-mail de l'expéditeur SMTP", "SMTP 服务器地址": "Adresse du serveur SMTP", "SMTP 端口": "Port SMTP", @@ -157,22 +219,33 @@ "SSRF防护设置": "Protection SSRF", "SSRF防护详细说明": "La protection SSRF empêche les utilisateurs malveillants d'utiliser votre serveur pour accéder aux ressources du réseau interne. Configurez des listes blanches pour les domaines/IP de confiance et limitez les ports autorisés. S'applique aux téléchargements de fichiers, aux webhooks et aux notifications.", "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "Le champ store autorise OpenAI à stocker les données de requête pour l'évaluation et l'optimisation du produit. Désactivé par défaut. L'activation peut causer un dysfonctionnement de Codex", - "免责声明:仅限个人使用,请勿分发或共享任何凭证。该渠道存在前置条件与使用门槛,请在充分了解流程与风险后使用,并遵守 OpenAI 的相关条款与政策。相关凭证与配置仅限接入 Codex CLI 使用,不适用于其他客户端、平台或渠道。": "Avertissement : usage personnel uniquement. Ne distribuez ni ne partagez aucun identifiant. Ce canal a des prérequis et nécessite une configuration préalable ; utilisez‑le uniquement si vous comprenez la procédure et les risques, et respectez les conditions et politiques d’OpenAI. Les identifiants et la configuration sont réservés à l’intégration Codex CLI et ne sont pas destinés à d’autres clients, plateformes ou canaux.", "Stripe 设置": "Paramètres Stripe", + "Stripe/Creem 商品ID(可选)": "ID produit Stripe/Creem (optionnel)", + "Stripe/Creem 需在第三方平台创建商品并填入 ID": "Les produits Stripe/Creem doivent être créés sur la plateforme tierce et l'ID doit être renseigné", "Telegram": "Telegram", "Telegram Bot Token": "Jeton du bot Telegram", "Telegram Bot 名称": "Nom du bot Telegram", "Telegram ID": "ID Telegram", "Token Endpoint": "Point de terminaison du jeton", + "token 会按倍率换算成“额度/次数”,请求结束后再做差额结算(补扣/返还)。": "Tokens are converted to quota/count by multiplier. After the request, the difference is settled (charged/refunded).", + "Total tokens": "Total tokens", "true": "vrai", + "TTL(秒,0 表示默认)": "TTL (seconds, 0 for default)", + "TTL(秒)": "TTL (seconds)", "Turnstile Secret Key": "Clé secrète Turnstile", "Turnstile Site Key": "Clé du site Turnstile", "Unix时间戳": "Horodatage Unix", "Uptime Kuma地址": "Adresse Uptime Kuma", "Uptime Kuma监控分类管理,可以配置多个监控分类用于服务状态展示(最多20个)": "Catégories de surveillance Uptime Kuma, vous pouvez configurer plusieurs catégories de surveillance pour l'affichage de l'état du service (maximum 20)", + "Uptime Kuma配置已更新": "Uptime Kuma config updated", + "Uptime Kuma配置更新失败": "Failed to update Uptime Kuma config", + "URL 标识,只能包含小写字母、数字和连字符": "URL identifier, can only contain lowercase letters, numbers, and hyphens", "URL链接": "Lien URL", "USD (美元)": "USD (Dollar US)", "User Info Endpoint": "Point de terminaison des informations utilisateur", + "User-Agent include": "User-Agent include", + "User-Agent include(每行一个,可不写)": "User-Agent include (one per line, optional)", + "Value 正则": "Value Regex", "Vertex AI 不支持 functionResponse.id 字段,开启后将自动移除该字段": "Vertex AI ne prend pas en charge le champ functionResponse.id. Lorsqu'il est activé, ce champ sera automatiquement supprimé", "Webhook 密钥": "Clé Webhook", "Webhook 签名密钥": "Clé de signature Webhook", @@ -199,19 +272,24 @@ "上一步": "Précédent", "上次保存: ": "Dernier enregistrement : ", "上游倍率同步": "Synchronisation du ratio en amont", + "上游状态码:": "Upstream status code:", "上游返回": "Réponse amont", "下一个表单块": "Bloc de formulaire suivant", "下一步": "Suivant", "下午好": "Bon après-midi", "下载日志": "Download Logs", "不再提醒": "Ne plus rappeler", + "不升级": "Pas de mise à niveau", "不同用户分组的价格信息": "Informations sur les prix pour différents groupes d'utilisateurs", "不填则为模型列表第一个": "Premier modèle de la liste si vide", "不建议使用": "Non recommandé", "不支持": "Non pris en charge", "不是合法的 JSON 字符串": "N'est pas une chaîne JSON valide", "不更改": "Ne pas changer", + "不重置": "Pas de réinitialisation", + "不限": "Illimité", "不限制": "Illimité", + "不需要在末尾加/v1,New API会自动处理,添加后可能导致请求失败,是否继续?": "No need to add /v1 at the end, New API handles it automatically. Adding it may cause request failures. Continue?", "与本地相同": "Identique au local", "专属倍率": "Ratio de groupe exclusif", "两次输入的密码不一致": "Les deux mots de passe saisis ne correspondent pas", @@ -228,10 +306,14 @@ "个人信息设置": "Infos personnelles", "个人设置": "Profil", "个实例": " instances", + "个已过期": "expirés", "个性化设置": "Personnalisation", "个性化设置左侧边栏的显示内容": "Personnaliser le contenu affiché dans la barre latérale gauche", + "个月": "mois", + "个月前": "months ago", "个未配置模型": "modèles non configurés", "个模型": "modèles", + "个生效中": "actifs", "个部署吗?此操作不可逆。": " deployments? This operation cannot be undone.", "中午好": "Bon midi", "为一个 JSON 对象,例如:{\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}": "Est un objet JSON, par exemple : {\"100\": 0,95, \"200\": 0,9, \"500\": 0,85}", @@ -248,6 +330,7 @@ "为一个 JSON 文本,键为组名称,值为倍率": "Est un texte JSON, la clé est le nom du groupe, la valeur est le ratio", "为了保护账户安全,请验证您的两步验证码。": "Pour protéger la sécurité du compte, veuillez vérifier votre code d'authentification à deux facteurs.", "为了保护账户安全,请验证您的身份。": "Pour protéger la sécurité de votre compte, veuillez vérifier votre identité.", + "为保证匹配准确,请确保客户端直连本站点(避免反向代理/网关改写 User-Agent)。": "To ensure accurate matching, make sure the client connects directly to this site (avoid reverse proxy/gateway rewriting User-Agent).", "为空则默认使用服务器地址,多个 Origin 用逗号分隔,例如 https://newapi.pro,https://newapi.com ,注意不能携带[],需使用https": "Si vide, l'adresse du serveur est utilisée par défaut, plusieurs Origines sont séparées par des virgules, par exemple https://newapi.pro,https://newapi.com, attention ne pas inclure [], utiliser https", "主页链接填": "Remplir le lien de la page d'accueil", "之前的所有日志": "Tous les journaux précédents", @@ -266,13 +349,21 @@ "仅对自定义模型有效": "Uniquement efficace pour les modèles personnalisés", "仅当自动禁用开启时有效,关闭后不会自动禁用该渠道": "Efficace uniquement lorsque la désactivation automatique est activée, après la fermeture, le canal ne sera pas automatiquement désactivé", "仅支持": "Seulement prend en charge", + "仅支持 JSON 对象,必须包含 access_token 与 account_id": "Only JSON objects are supported, must contain access_token and account_id", "仅支持 JSON 文件": "Seuls les fichiers JSON sont pris en charge", "仅支持 JSON 文件,支持多文件": "Seuls les fichiers JSON sont pris en charge, plusieurs fichiers sont pris en charge", "仅支持 OpenAI 接口格式": "Seul le format d'interface OpenAI est pris en charge", + "仅显示已绑定": "Show bound only", "仅显示矛盾倍率": "Afficher uniquement les ratios contradictoires", "仅用于开发环境,生产环境应使用 HTTPS": "Pour le développement uniquement, utilisez HTTPS en production", + "仅用于换算,实际保存的是额度": "Uniquement pour la conversion, c'est le quota qui est enregistré", + "仅用订阅": "Abonnement uniquement", + "仅用钱包": "Portefeuille uniquement", "仅重置配置": "Réinitialiser uniquement la configuration", + "今天": "Today", "今日关闭": "Fermer aujourd'hui", + "今日已签到": "Enregistré aujourd'hui", + "今日已签到,累计签到": "Enregistré aujourd'hui, total des enregistrements", "从官方模型库同步": "Synchroniser depuis la bibliothèque de modèles officielle", "从认证器应用中获取验证码,或使用备用码": "Obtenez le code de vérification à partir de l'application d'authentification ou utilisez un code de secours", "从配置文件同步": "Synchroniser depuis un fichier de configuration", @@ -304,17 +395,28 @@ "价格重新计算中...": "Recalculating price...", "价格预估": "Price Estimate", "任务 ID": "ID de la tâche", + "任务ID": "ID de tâche", "任务日志": "Tâches", "任务状态": "Statut de la tâche", "任务记录": "Tâches", "企业账户为特殊返回格式,需要特殊处理,如果非企业账户,请勿勾选": "Les comptes d'entreprise ont un format de retour spécial et nécessitent un traitement particulier. Si ce n'est pas un compte d'entreprise, veuillez ne pas cocher cette case.", "优先级": "Priorité", + "优先级必须是整数!": "Priority must be an integer!", + "优先订阅": "Abonnement en priorité", + "优先钱包": "Portefeuille en priorité", "优惠": "Remise", "低于此额度时将发送邮件提醒用户": "Un rappel par e-mail sera envoyé lorsque le quota tombera en dessous de ce seuil", "余额": "Solde", "余额充值管理": "Recharge du solde", + "作废": "Invalider", + "作废于": "Invalidé le", + "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "Après invalidation, l'abonnement devient immédiatement invalide. L'historique n'est pas affecté. Continuer ?", + "作用域": "Scope", + "作用域:包含分组": "Scope: Include Group", + "作用域:包含规则名称": "Scope: Include Rule Name", "你似乎并没有修改什么": "Vous ne semblez rien avoir modifié", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "Vous pouvez les ajouter manuellement dans « Noms de modèles personnalisés », cliquer sur Remplir puis soumettre, ou utiliser directement les actions ci-dessous pour les traiter automatiquement.", + "使用 {{name}} 继续": "Continue with {{name}}", "使用 Discord 继续": "Continuer avec Discord", "使用 GitHub 继续": "Continuer avec GitHub", "使用 JSON 对象格式,格式为:{\"组名\": [最多请求次数, 最多请求完成次数]}": "Utiliser le format d'objet JSON, au format : {\"nom du groupe\": [nombre maximal de requêtes, nombre maximal d'achèvements de requêtes]}", @@ -327,13 +429,20 @@ "使用 用户名 注册": "S'inscrire avec un nom d'utilisateur", "使用 邮箱或用户名 登录": "Connectez-vous avec votre e-mail ou votre nom d'utilisateur", "使用ID排序": "Trier par ID", + "使用备用码": "Use Backup Code", "使用日志": "Journaux", "使用模式": "Mode d'utilisation", "使用统计": "Statistiques d'utilisation", "使用认证器应用(如 Google Authenticator、Microsoft Authenticator)扫描下方二维码:": "Utilisez une application d'authentification (telle que Google Authenticator, Microsoft Authenticator) pour scanner le code QR ci-dessous :", "使用认证器应用扫描二维码": "Scanner le code QR avec l'application d'authentification", + "使用认证器验证码": "Use Authenticator Code", + "例如 /var/cache/new-api": "e.g. /var/cache/new-api", "例如 €, £, Rp, ₩, ₹...": "Par exemple, €, £, Rp, ₩, ₹...", + "例如 100000…": "e.g. 100000...", + "例如 3600…": "e.g. 3600...", + "例如 600…": "e.g. 600...", "例如 https://docs.newapi.pro": "Par exemple, https://docs.newapi.pro", + "例如 prefer-by-conversation-id…": "e.g. prefer-by-conversation-id...", "例如:": "Par exemple :", "例如: /bin/bash -c \"python app.py\"": "e.g.: /bin/bash -c \"python app.py\"", "例如: nginx:latest": "e.g.: nginx:latest", @@ -346,13 +455,28 @@ "例如:2,就是最低充值2$": "Par exemple : 2, c'est-à-dire un minimum de 2$ de recharge", "例如:2000": "Par exemple : 2000", "例如:4.99": "Ex. : 4.99", + "例如:401, 403, 429, 500-599": "e.g. 401,403,429,500-599", "例如:7,就是7元/美金": "Par exemple : 7, c'est-à-dire 7 yuans/dollar", + "例如:email": "e.g.: email", "例如:example.com": "ex: example.com", + "例如:github / si:google / https://example.com/logo.png / 🐱": "e.g.: github / si:google / https://example.com/logo.png / 🐱", + "例如:GitHub Enterprise": "e.g.: GitHub Enterprise", + "例如:github-enterprise": "e.g.: github-enterprise", + "例如:https://example.com/.well-known/openid-configuration": "e.g.: https://example.com/.well-known/openid-configuration", + "例如:https://gitea.example.com": "e.g.: https://gitea.example.com", + "例如:https://workername.yourdomain.workers.dev": "e.g.: https://workername.yourdomain.workers.dev", "例如:https://yourdomain.com": "Par exemple : https://yourdomain.com", + "例如:name、full_name": "e.g.: name, full_name", "例如:nginx:latest": "e.g.: nginx:latest", + "例如:preferred_username、login": "e.g.: preferred_username, login", "例如:preview": "Par exemple : preview", "例如:prod_6I8rBerHpPxyoiU9WK4kot": "Ex. : prod_6I8rBerHpPxyoiU9WK4kot", + "例如:sub、id、data.user.id": "e.g.: sub, id, data.user.id", "例如:基础套餐": "Ex. : forfait de base", + "例如:适合轻度使用": "Ex. : Convient à un usage léger", + "例如:需要等级 {{required}},你当前等级 {{current}}": "e.g.: Level {{required}} required, your current level is {{current}}", + "例如(全渠道):": "Example (all channels):", + "例如(指定渠道):": "Example (specific channels):", "例如发卡网站的购买链接": "Par exemple, lien d'achat sur un site d'émission de cartes", "供应商": "Fournisseur", "供应商介绍": "Présentation du fournisseur", @@ -381,12 +505,14 @@ "保存失败,请重试": "Échec de l'enregistrement, veuillez réessayer", "保存失败:": "Échec de l'enregistrement :", "保存屏蔽词过滤设置": "Enregistrer les paramètres de filtrage des mots sensibles", + "保存性能设置": "Enregistrer les paramètres de performance", "保存成功": "Enregistré avec succès", "保存数据看板设置": "Enregistrer les paramètres du tableau de bord des données", "保存日志设置": "Enregistrer les paramètres du journal", "保存模型倍率设置": "Enregistrer les paramètres de ratio de modèle", "保存模型速率限制": "Enregistrer les paramètres de limite de débit de modèle", "保存监控设置": "Enregistrer les paramètres de surveillance", + "保存签到设置": "Enregistrer les paramètres d'enregistrement", "保存绘图设置": "Enregistrer les paramètres de dessin", "保存聊天设置": "Enregistrer les paramètres de discussion", "保存设置": "Enregistrer les paramètres", @@ -405,17 +531,22 @@ "倍率是为了方便换算不同价格的模型": "Le ratio sert à faciliter la conversion de modèles à des prix différents.", "倍率模式": "Mode de ratio", "倍率类型": "Type de ratio", + "偏好设置": "Preferences", + "停止中": "Stopping", "停止测试": "Arrêter le test", "停用": "Désactiver", "允许 AccountFilter 参数": "Autoriser le paramètre AccountFilter", "允许 HTTP 协议图片请求(适用于自部署代理)": "Autoriser les requêtes d'images via le protocole HTTP (applicable aux proxies auto-déployés)", + "允许 inference_geo 透传": "Allow inference_geo passthrough", "允许 safety_identifier 透传": "Autoriser le passage de safety_identifier", "允许 service_tier 透传": "Autoriser le passage de service_tier", + "允许 stream_options.include_obfuscation 透传": "Allow stream_options.include_obfuscation passthrough", "允许 Turnstile 用户校验": "Autoriser la vérification des utilisateurs Turnstile", "允许不安全的 Origin(HTTP)": "Autoriser une origine non sécurisée (HTTP)", "允许回调(会泄露服务器 IP 地址)": "Autoriser le rappel (divulguera l'adresse IP du serveur)", "允许在 Stripe 支付中输入促销码": "Autoriser la saisie de codes promotionnels lors du paiement Stripe", "允许新用户注册": "Autoriser l'inscription de nouveaux utilisateurs", + "允许注册的最低信任等级": "Minimum trust level for registration", "允许的 Origins": "Origines autorisées", "允许的IP,一行一个,不填写则不限制": "Adresses IP autorisées, une par ligne, non remplies signifie aucune restriction", "允许的端口": "Ports autorisés", @@ -446,10 +577,11 @@ "充值金额折扣配置不是合法的 JSON 对象": "La configuration des remises sur le montant de recharge n'est pas un objet JSON valide", "充值链接": "Lien de recharge", "充值额度": "Quota de recharge", + "先填写配置,再自动填充 OAuth 端点,能显著减少手工输入": "Fill in the config first, then auto-fill OAuth endpoints to significantly reduce manual input", + "免责声明:仅限个人使用,请勿分发或共享任何凭证。该渠道存在前置条件与使用门槛,请在充分了解流程与风险后使用,并遵守 OpenAI 的相关条款与政策。相关凭证与配置仅限接入 Codex CLI 使用,不适用于其他客户端、平台或渠道。": "Avertissement : usage personnel uniquement. Ne distribuez ni ne partagez aucun identifiant. Ce canal a des prérequis et nécessite une configuration préalable ; utilisez‑le uniquement si vous comprenez la procédure et les risques, et respectez les conditions et politiques d’OpenAI. Les identifiants et la configuration sont réservés à l’intégration Codex CLI et ne sont pas destinés à d’autres clients, plateformes ou canaux.", "兑换人ID": "ID du demandeur", "兑换成功!": "Échange réussi !", "兑换码充值": "Recharge par code d'échange", - "清理不活跃缓存": "Nettoyer le cache inactif", "兑换码创建成功": "Code d'échange créé", "兑换码创建成功,是否下载兑换码?": "Code d'échange créé avec succès. Voulez-vous le télécharger ?", "兑换码创建成功!": "Code d'échange créé avec succès !", @@ -476,7 +608,10 @@ "全部类型": "Tous les types", "公告": "Annonce", "公告内容": "Contenu de l'avis", + "公告已删除,请及时点击”保存设置”进行保存": "Announcement deleted, please click \"Save Settings\" to save", "公告已更新": "Avis mis à jour", + "公告已更新,请及时点击”保存设置”进行保存": "Announcement updated, please click \"Save Settings\" to save", + "公告已添加,请及时点击”保存设置”进行保存": "Announcement added, please click \"Save Settings\" to save", "公告更新失败": "Échec de la mise à jour de l'avis", "公告类型": "Type d'avis", "共": "Total", @@ -493,6 +628,8 @@ "共 {{total}} 项,当前显示 {{start}}-{{end}} 项": "Total {{total}} éléments, affichage actuel {{start}}-{{end}} éléments", "关": "Fermer", "关于": "À propos", + "关于内容已更新": "About content updated", + "关于内容更新失败": "Failed to update about content", "关于我们": "Nous", "关于系统的详细信息": "Informations détaillées sur le système", "关于项目": "À propos du projet", @@ -501,15 +638,22 @@ "关闭侧边栏": "Fermer la barre latérale", "关闭公告": "Fermer l'avis", "关闭后,此模型将不会被“同步官方”自动覆盖或创建": "Après fermeture, ce modèle ne sera pas automatiquement remplacé ou créé par \"Synchroniser depuis la bibliothèque de modèles officielle\"", + "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?": "Après fermeture, cet avertissement ne sera plus affiché (uniquement pour ce navigateur). Voulez-vous vraiment le fermer ?", "关闭弹窗,已停止批量测试": "Fermer la fenêtre popup, le test par lots a été arrêté", + "关闭提示": "Fermer l’avertissement", "其他": "Autre", "其他注册选项": "Autres options d'inscription", "其他登录选项": "Autres options de connexion", "其他设置": "Autres", "其他详情": "Autres détails", + "内存 阈值 (%)": "Seuil mémoire (%)", + "内存使用率超过此值时拒绝请求": "Rejeter les requêtes lorsque l'utilisation de la mémoire dépasse cette valeur", + "内存命中": "Memory Hits", + "内存缓存最大条目数。0 表示使用后端默认容量:100000。": "Maximum memory cache entries. 0 uses backend default capacity: 100000.", "内容": "Contenu", "内容较大,已启用性能优化模式": "Le contenu est volumineux, le mode d'optimisation des performances a été activé", "内容较大,部分功能可能受限": "Le contenu est volumineux, certaines fonctionnalités peuvent être limitées", + "内置": "Built-in", "内置 Ollama 镜像": "Built-in Ollama Image", "再次输入部署名称": "Enter Deployment Name Again", "最低": "Le plus bas", @@ -519,10 +663,21 @@ "最后请求": "Dernière requête", "最大GPU数量": "Max Number of GPUs", "最大可用": "Max Available", + "最大条目数": "Max Entries", + "最终抵扣": "Final Deduction", + "最近一次": "Last", "最近事件": "Recent Events", + "写": "Écriture", + "准入策略": "Access Policy", + "准入策略 JSON(可选)": "Access Policy JSON (optional)", + "准备中": "Preparing", "准备中...": "Preparing...", "准备完成初始化": "Prêt à terminer l'initialisation", + "凭证已刷新": "Credentials refreshed", "分类名称": "Nom de la catégorie", + "分类已删除,请及时点击”保存设置”进行保存": "Category deleted, please click \"Save Settings\" to save", + "分类已更新,请及时点击”保存设置”进行保存": "Category updated, please click \"Save Settings\" to save", + "分类已添加,请及时点击”保存设置”进行保存": "Category added, please click \"Save Settings\" to save", "分组": "Groupe", "分组与模型定价设置": "Groupe et tarification", "分组价格": "Prix de groupe", @@ -535,6 +690,7 @@ "分组速率配置优先级高于全局速率限制。": "La priorité de configuration du taux de groupe est supérieure à la limite de taux globale.", "分组速率限制": "Limitation du taux de groupe", "分钟": "minutes", + "分钟前": "minutes ago", "切换为Assistant角色": "Basculer vers le rôle Assistant", "切换为System角色": "Basculer vers le rôle Système", "切换为单密钥模式": "Passer en mode clé unique", @@ -545,6 +701,7 @@ "划转额度": "Montant du virement", "列出的模型将不会自动添加或移除-thinking/-nothinking 后缀": "Les modèles listés ici n'ajouteront ni ne retireront automatiquement le suffixe -thinking/-nothinking.", "列设置": "Colonnes", + "刚刚": "just now", "创建": "Create", "创建令牌默认选择auto分组,初始令牌也将设为auto(否则留空,为用户默认分组)": "Lors de la création d'un jeton, le groupe auto est sélectionné par défaut, et le jeton initial sera également défini sur auto (sinon laisser vide, pour le groupe par défaut de l'utilisateur)", "创建失败": "Échec de la création", @@ -555,12 +712,15 @@ "创建新的兑换码": "Créer un nouveau code d'échange", "创建新的模型": "Créer un nouveau modèle", "创建新的渠道": "Créer un nouveau canal", + "创建新的订阅套餐": "Créer un nouveau plan d'abonnement", "创建新的预填组": "Créer un nouveau groupe pré-rempli", "创建时间": "Heure de création", "创建用户": "Créer un utilisateur", "初始化失败,请重试": "Échec de l'initialisation, veuillez réessayer", "初始化系统": "Initialiser le système", "删除": "Supprimer", + "删除 Key 来源": "Delete Key Source", + "删除会彻底移除该订阅记录(含权益明细)。是否继续?": "La suppression retirera définitivement cet enregistrement d'abonnement (y compris les détails des avantages). Continuer ?", "删除后无法恢复,确定要删除模型 \"{{name}}\" 吗?": "Cannot be recovered after deletion, are you sure you want to delete model \"{{name}}\"?", "删除失败": "Échec de la suppression", "删除密钥失败": "Échec de la suppression de la clé", @@ -571,17 +731,23 @@ "删除禁用密钥失败": "Échec de la suppression des clés désactivées", "删除禁用通道": "Supprimer les canaux désactivés", "删除自动禁用密钥": "Supprimer les clés désactivées automatiquement", + "删除规则": "Delete Rule", "删除账户": "Supprimer le compte", "删除账户确认": "Confirmation de la suppression du compte", "删除部署失败": "Failed to delete deployment", "刷新": "Actualiser", + "刷新凭证": "Refresh Credentials", "刷新失败": "Échec de l'actualisation", "刷新容器信息": "Refresh Container Info", "刷新日志": "Refresh Logs", + "刷新统计": "Refresh Stats", + "刷新缓存统计": "Refresh Cache Stats", + "刷新缓存统计失败": "Failed to refresh cache stats", "前往 io.net API Keys": "Go to io.net API Keys", "前往设置": "Go to Settings", "前往设置页面": "Go to Settings Page", "前缀": "Préfixe", + "前缀名称匹配": "Prefix Name Match", "副本数量": "Number of Replicas", "剩余": "Remaining", "剩余备用码:": "Codes de sauvegarde restants : ", @@ -610,27 +776,39 @@ "加载账单失败": "Échec du chargement des factures", "加载隐私政策内容失败...": "Échec du chargement du contenu de la politique de confidentialité...", "包含": "Contient", + "包含名称匹配": "Contains Name Match", "包含来自未知或未标明供应商的AI模型,这些模型可能来自小型供应商或开源项目。": "Comprend des modèles d'IA de fournisseurs inconnus ou non marqués, qui peuvent provenir de petits fournisseurs ou de projets open-source.", "包括失败请求的次数,0代表不限制": "Y compris les tentatives de requête échouées, 0 signifie aucune limite", "匹配类型": "Type de correspondance", "区域": "Région", + "升级分组": "Groupe de mise à niveau", "单GPU小时费率": "Per GPU Hour Rate", + "即梦": "Jimeng", "历史消耗": "Consommation historique", "原价": "Prix original", "原因:": "Raison :", + "原始 JSON": "Raw JSON", "原密码": "Mot de passe original", + "原生格式": "Native format", + "原生额度": "Quota brut", "去重完成:去重前 {{before}} 个密钥,去重后 {{after}} 个密钥": "Doublons supprimés : {{before}} clés avant, {{after}} clés après", "参与官方同步": "Participer à la synchronisation officielle", "参数": "paramètre", "参数值": "Valeur du paramètre", "参数覆盖": "Remplacement des paramètres", + "参数覆盖必须是合法的 JSON 格式!": "Parameter override must be valid JSON format!", + "参数配置": "Parameter Config", "参照生视频": "Générer une vidéo par référence", "友情链接": "Liens amicaux", "发布日期": "Date de publication", "发布时间": "Heure de publication", + "发现文档地址(Discovery URL,可选)": "Discovery URL (optional)", + "发行者 URL(Issuer URL)": "Issuer URL", + "发送验证码失败,请重试": "Failed to send verification code, please try again", "取消": "Annuler", "取消全选": "Annuler la sélection", "取消选择": "Deselect", + "受限": "Restricted", "变换": "Variation", "变焦": "Zoom", "变量值": "Variable Value", @@ -640,17 +818,29 @@ "只有当用户设置开启IP记录时,才会进行请求和错误类型日志的IP记录": "Ce n'est que lorsque l'utilisateur définit l'enregistrement IP que l'enregistrement IP des journaux de type requête et erreur sera effectué", "可信": "Fiable", "可在设置页面设置关于内容,支持 HTML & Markdown": "Le contenu \"À propos\" peut être défini sur la page des paramètres, prenant en charge HTML & Markdown", + "可手动填写,多个 scope 用空格分隔": "Can be filled manually, separate multiple scopes with spaces", + "可灵": "Kling", + "可用": "Available", "可用令牌分组": "Groupes de jetons disponibles", "可用分组": "Groupes disponibles", + "可用变量:{{provider}} {{field}} {{op}} {{required}} {{current}} 以及 {{current.path}}": "Available variables: {{provider}} {{field}} {{op}} {{required}} {{current}} and {{current.path}}", "可用数量": "Available Quantity", "可用模型": "Modèles disponibles", + "可用率": "Availability", + "可用空间: {{free}} / 总空间: {{total}}": "Free: {{free}} / Total: {{total}}", "可用端点类型": "Types de points de terminaison pris en charge", "可用邀请额度": "Quota d'invitation disponible", + "可留空;留空时会尝试使用 Issuer URL + /.well-known/openid-configuration": "Can be left empty; when empty, will try using Issuer URL + /.well-known/openid-configuration", "可视化": "Visualisation", "可视化倍率设置": "Ratio visuel", "可视化编辑": "Édition visuelle", "可选,公告的补充说明": "Facultatif, informations supplémentaires pour l'avis", "可选,用于复现结果": "Optionnel, pour des résultats reproductibles", + "可选:基于用户信息 JSON 做组合条件准入,条件不满足时返回自定义提示": "Optional: Conditional access based on user info JSON, returns custom message when conditions are not met", + "可选:用于自动生成端点或 Discovery URL": "Optional: Used to auto-generate endpoints or Discovery URL", + "可选。匹配入口请求的 User-Agent;任意一行作为子串匹配(忽略大小写)即命中。": "Optional. Match entry request User-Agent; any line matching as substring (case-insensitive) triggers the rule.", + "可选。对提取到的亲和 Key 做正则校验;不填表示不校验。": "Optional. Regex validation on extracted affinity key; leave empty to skip validation.", + "可选。对请求路径进行匹配;不填表示匹配所有路径。": "Optional. Match request path; leave empty to match all paths.", "可选值": "Valeur facultative", "同时重置消息": "Réinitialiser également les messages", "同步": "Synchroniser", @@ -667,19 +857,23 @@ "名称匹配类型": "Type de correspondance de nom", "后端请求失败": "Échec de la requête du backend", "后缀": "Suffixe", + "后缀名称匹配": "Suffix Name Match", "否": "Non", "启动": "Start", "启动参数 (Args)": "Startup Args", "启动命令": "Startup Command", "启动命令 (Entrypoint)": "Entrypoint", + "启动授权失败": "Failed to start authorization", "启动时间": "Heure de démarrage", "启动部署失败": "Failed to start deployment", "启动配置": "Startup Configuration", "启用": "Activer", + "启用 Creem 支付": "Activer les paiements Creem", "启用 io.net 部署": "Enable io.net Deployment", "启用 io.net 部署开关": "Enable io.net Deployment Switch", "启用 io.net 部署时必须填写 API Key": "API Key is required when enabling io.net deployment", "启用 Prompt 检查": "Activer la vérification de l'invite", + "启用 Stripe 支付": "Activer les paiements Stripe", "启用2FA失败": "Échec de l'activation de 2FA", "启用Claude思考适配(-thinking后缀)": "Activer l'adaptation de la pensée Claude (suffixe -thinking)", "启用FunctionCall思维签名填充": "Activer le remplissage de thoughtSignature pour FunctionCall", @@ -687,36 +881,54 @@ "启用Ping间隔": "Activer l'intervalle de ping", "启用SMTP SSL": "Activer SMTP SSL", "启用SSRF防护(推荐开启以保护服务器安全)": "Activer la protection SSRF (recommandé pour la sécurité du serveur)", + "启用供应商": "Enable Vendor", "启用全部": "Activer tout", "启用后可接入 io.net GPU 资源": "After enabling, you can access io.net GPU resources", "启用后可添加图片URL进行多模态对话": "Activer pour ajouter des URL d'images pour une conversation multimodale", + "启用后套餐将在用户端展示。是否继续?": "Après activation, le plan sera affiché côté utilisateur. Continuer ?", + "启用后将优先复用上一次成功的渠道(粘滞选路)。": "When enabled, the last successful channel will be preferred (sticky routing).", "启用后将使用 Creem Test Mode": "Après activation, le mode test Creem sera utilisé", "启用密钥失败": "Échec de l'activation de la clé", "启用屏蔽词过滤功能": "Activer la fonction de filtrage des mots sensibles", + "启用性能监控": "Activer la surveillance des performances", + "启用性能监控后,当系统资源使用率超过设定阈值时,将拒绝新的 Relay 请求 (/v1, /v1beta 等),以保护系统稳定性。": "Lorsque la surveillance des performances est activée et que l'utilisation des ressources système dépasse le seuil défini, les nouvelles requêtes Relay (/v1, /v1beta, etc.) seront rejetées pour protéger la stabilité du système.", "启用所有密钥失败": "Échec de l'activation de toutes les clés", "启用数据看板(实验性)": "Activer le tableau de bord des données (expérimental)", "启用此模式后,将使用您自定义的请求体发送API请求,模型配置面板的参数设置将被忽略。": "Lorsqu'il est activé, votre corps de requête personnalisé sera utilisé pour les requêtes API et les paramètres du panneau de configuration du modèle seront ignorés.", + "启用状态": "Statut d'activation", "启用用户模型请求速率限制(可能会影响高并发性能)": "Activer la limite de débit de requête de modèle utilisateur (peut affecter les performances à haute concurrence)", + "启用磁盘缓存": "Enable Disk Cache", + "启用磁盘缓存后,大请求体将临时存储到磁盘而非内存,可显著降低内存占用,适用于处理包含大量图片/文件的请求。建议在 SSD 环境下使用。": "When enabled, large request bodies are temporarily stored on disk instead of memory, significantly reducing memory usage. Suitable for requests with large images/files. SSD recommended.", + "启用签到功能": "Activer la fonction d'enregistrement", "启用绘图功能": "Activer la fonction de dessin", "启用请求体透传功能": "Activer la fonctionnalité de transmission du corps de la requête", "启用请求透传": "Activer la transmission de la requête", + "启用违规扣费": "Activer la déduction de violation", "启用额度消费日志记录": "Activer la journalisation de la consommation de quota", "启用验证": "Activer l'authentification", - "启用违规扣费": "Activer la déduction de violation", "周": "semaine", + "周前": "weeks ago", + "周期": "période(s)", + "命中判定:usage 中存在 cached tokens(例如 cached_tokens/prompt_cache_hit_tokens)即视为命中。": "Hit criteria: cached tokens present in usage (e.g. cached_tokens/prompt_cache_hit_tokens) counts as a hit.", + "命中率": "Hit Rate", + "命名规则": "Naming Rule", "和": "et", "和Claude不同,默认情况下Gemini的思考模型会自动决定要不要思考,就算不开启适配模型也可以正常使用,如果您需要计费,推荐设置无后缀模型价格按思考价格设置。支持使用 gemini-2.5-pro-preview-06-05-thinking-128 格式来精确传递思考预算。": "Contrairement à Claude, les modèles de réflexion Gemini décident automatiquement s'ils doivent réfléchir. Ils fonctionnent normalement même sans l'adaptateur activé. Si vous avez besoin de facturation, définissez le prix des modèles sans suffixe au prix de réflexion. Utilisez un format comme gemini-2.5-pro-preview-06-05-thinking-128 pour spécifier le budget de réflexion exact.", "响应": "Réponse", "响应时间": "Temps de réponse", + "响应缺少凭据": "Response missing credentials", + "响应缺少授权链接": "Response missing authorization link", "商品价格 ID": "ID du prix du produit", "回答内容": "Contenu de la réponse", "回调 URL 填": "Remplir l'URL de rappel", + "回调 URL 格式": "Callback URL format", "回调地址": "Adresse de rappel", "固定价格": "Prix fixe", "固定价格(每次)": "Prix fixe (par utilisation)", "固定价格值": "Valeur de prix fixe", "图像生成": "Génération d'images", "图标": "Icône", + "图标使用 react-icons(Simple Icons)或 URL/emoji,例如:github、gitlab、si:google": "Icon uses react-icons (Simple Icons) or URL/emoji, e.g.: github, gitlab, si:google", "图标使用@lobehub/icons库,如:OpenAI、Claude.Color,支持链式参数:OpenAI.Avatar.type={'platform'}、OpenRouter.Avatar.shape={'square'},查询所有可用图标请 ": "L'icône utilise la bibliothèque @lobehub/icons, telle que : OpenAI, Claude.Color, prend en charge les paramètres de chaîne : OpenAI.Avatar.type={'platform'}, OpenRouter.Avatar.shape={'square'}, interroger toutes les icônes disponibles s'il vous plaît ", "图混合": "Mélanger", "图片功能在自定义请求体模式下不可用": "La fonction image n'est pas disponible en mode requête personnalisée", @@ -733,6 +945,7 @@ "在Gotify服务器的应用管理中创建新应用": "Créer une nouvelle application dans la gestion des applications du serveur Gotify", "在找兑换码?": "Vous cherchez un code d'échange ? ", "在新标签页中打开": "Ouvrir dans un nouvel onglet", + "在模型广场向用户展示的端点": "Endpoint affiché aux utilisateurs dans la place de marché des modèles", "在此输入 Logo 图片地址": "Saisissez l'URL de l'image du logo ici", "在此输入新的公告内容,支持 Markdown & HTML 代码": "Saisissez le nouveau contenu de l'annonce ici, prend en charge le code Markdown & HTML", "在此输入新的关于内容,支持 Markdown & HTML 代码。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为关于页面": "Saisissez le nouveau contenu \"À propos\" ici, prend en charge Markdown", @@ -745,13 +958,22 @@ "域名白名单": "Liste blanche de domaines", "域名黑名单": "Liste noire de domaines", "基本信息": "Informations de base", + "填充 Codex / Claude Code 模版": "Fill Codex / Claude Code Template", + "填充模板:等级+激活": "Fill Template: Level + Activation", + "填充模板:等级提示": "Fill Template: Level Prompt", + "填充模板:组织或角色": "Fill Template: Organization or Role", + "填充模板:组织提示": "Fill Template: Organization Prompt", + "填充模板(全渠道)": "Remplir le modèle (tous les canaux)", + "填充模板(指定渠道)": "Remplir le modèle (canaux sélectionnés)", "填入": "Remplir", "填入所有模型": "Remplir tous les modèles", "填入模板": "Remplir le modèle", - "填入透传模版": "Remplir le modèle passthrough", - "填入透传完整模版": "Remplir le modèle passthrough complet", "填入相关模型": "Remplir les modèles associés", + "填入透传完整模版": "Remplir le modèle passthrough complet", + "填入透传模版": "Remplir le modèle passthrough", + "填写 Issuer URL 后自动生成:": "Auto-generated after filling Issuer URL:", "填写Gotify服务器的完整URL地址": "Remplir l'adresse URL complète du serveur Gotify", + "填写后会自动拼接预设端点": "Preset endpoints will be auto-appended after filling", "填写带https的域名,逗号分隔": "Saisir les domaines avec https, séparés par des virgules", "填写用户协议内容后,用户注册时将被要求勾选已阅读用户协议": "Après avoir rempli le contenu de l'accord utilisateur, les utilisateurs devront cocher avoir lu l'accord utilisateur lors de l'inscription", "填写隐私政策内容后,用户注册时将被要求勾选已阅读隐私政策": "Après avoir rempli le contenu de la politique de confidentialité, les utilisateurs devront cocher avoir lu la politique de confidentialité lors de l'inscription", @@ -760,12 +982,15 @@ "备份状态": "État de la sauvegarde", "备注": "Remarque", "备用恢复代码": "Codes de récupération de sauvegarde", + "备用码": "Backup Code", "备用码已复制到剪贴板": "Codes de sauvegarde copiés dans le presse-papiers", + "备用码必须是8位": "Backup code must be 8 digits", "备用码重新生成成功": "Codes de sauvegarde régénérés avec succès", "复制": "Copier", "复制代码": "Copier le code", "复制令牌": "Copier le Jeton", "复制全部": "Tout copier", + "复制功能需要 HTTPS 环境,请手动复制": "Copy function requires HTTPS, please copy manually", "复制名称": "Copier le nom", "复制失败": "Échec de la copie", "复制失败,请手动复制": "Échec de la copie, veuillez copier manuellement", @@ -777,6 +1002,7 @@ "复制所有模型": "Copier tous les modèles", "复制所选令牌": "Copier le jeton sélectionné", "复制所选兑换码到剪贴板": "Copier les codes d'échange sélectionnés dans le presse-papiers", + "复制授权链接": "Copy Authorization Link", "复制日志": "Copy Logs", "复制渠道的所有信息": "Copier toutes les informations d'un canal", "复制版本号": "Copy Version", @@ -791,18 +1017,29 @@ "天": "Jour", "天前": "il y a des jours", "失败": "Échec", + "失败原因": "Raison de l'échec", + "失败后不重试": "No retry after failure", "失败时自动禁用通道": "Désactiver automatiquement le canal en cas d'échec", "失败重试次数": "Nombre de tentatives en cas d'échec", "奖励说明": "Description de la récompense", + "套餐": "Plan", + "套餐副标题": "Sous-titre du plan", + "套餐名称": "Nom du plan", + "套餐标题": "Titre du plan", + "套餐标题不能为空": "Plan title cannot be empty", + "套餐的基本信息和定价": "Informations de base et tarification du plan", "如:大带宽批量分析图片推荐": "par exemple, Recommandations d'analyse d'images par lots à large bande passante", "如:香港线路": "par exemple, Ligne de Hong Kong", + "如果亲和到的渠道失败,重试到其他渠道成功后,将亲和更新到成功的渠道。": "If the affinity channel fails, after retrying and succeeding with another channel, the affinity will be updated to the successful channel.", "如果你对接的是上游One API或者New API等转发项目,请使用OpenAI类型,不要使用此类型,除非你知道你在做什么。": "Si vous vous connectez à des projets de redirection One API ou New API en amont, veuillez utiliser le type OpenAI. N'utilisez pas ce type, sauf si vous savez ce que vous faites.", "如果用户请求中包含系统提示词,则使用此设置拼接到用户的系统提示词前面": "Si la requête de l'utilisateur contient un prompt système, utilisez ce paramètre pour le concaténer avant le prompt système de l'utilisateur", "如果镜像为私有,请填写密码或Token": "If the image is private, please fill in the password or token", "如果镜像为私有,请填写用户名": "If the image is private, please fill in the username", "始终使用浅色主题": "Toujours utiliser le thème clair", "始终使用深色主题": "Toujours utiliser le thème sombre", + "字段映射": "Field Mapping", "字段透传控制": "Contrôle du passage des champs", + "字节火山方舟、豆包通用": "ByteDance Volcengine / Doubao", "存在惩罚,鼓励讨论新话题": "Pénalité de présence, encourage de nouveaux sujets", "存在重复的键名:": "Il existe des noms de clés en double :", "安全提醒": "Rappel de sécurité", @@ -818,8 +1055,8 @@ "完整的 Base URL,支持变量{model}": "URL de base complète, prend en charge la variable {model}", "官方": "Officiel", "官方文档": "Documentation officielle", - "官方说明": "Documentation officielle", "官方模型同步": "Synchronisation des modèles officiels", + "官方说明": "Documentation officielle", "定价模式": "Mode de tarification", "定时测试所有通道": "Tester périodiquement tous les canaux", "定期更改密码可以提高账户安全性": "Changer régulièrement votre mot de passe peut améliorer la sécurité de votre compte", @@ -856,8 +1093,11 @@ "密码重置": "Réinitialisation du mot de passe", "密码重置完成": "Réinitialisation du mot de passe terminée", "密码重置确认": "Confirmation de la réinitialisation du mot de passe", + "密码长度不得小于 8 位!": "Password must be at least 8 characters!", "密码长度至少为8个字符": "Le mot de passe doit comporter au moins 8 caractères", "密钥": "Clé API", + "密钥 JSON 必须包含 access_token": "Secret JSON must contain access_token", + "密钥 JSON 必须包含 account_id": "Secret JSON must contain account_id", "密钥(编辑模式下,保存的密钥不会显示)": "Clé (en mode édition, les clés enregistrées ne sont pas affichées)", "密钥去重": "Suppression des doublons de clés", "密钥将以Bearer方式添加到请求头中,用于验证webhook请求的合法性": "La clé sera ajoutée à l'en-tête de la requête en tant que Bearer pour vérifier la légitimité de la requête webhook", @@ -865,6 +1105,8 @@ "密钥已启用": "La clé a été activée", "密钥已复制到剪贴板": "Clé copiée dans le presse-papiers", "密钥已禁用": "La clé a été désactivée", + "密钥必须是 JSON 对象": "Secret must be a JSON object", + "密钥必须是合法的 JSON 格式!": "Secret must be valid JSON format!", "密钥文件 (.json)": "Fichier de clé (.json)", "密钥更新模式": "Mode de mise à jour de la clé", "密钥格式": "Format de la clé", @@ -891,9 +1133,13 @@ "将仅保留第一个密钥文件,其余文件将被移除,是否继续?": "Seul le premier fichier de clé sera conservé, et les fichiers restants seront supprimés. Continuer ?", "将删除": "Supprimera", "将删除已使用、已禁用及过期的兑换码,此操作不可撤销。": "Cela supprimera tous les codes d'échange utilisés, désactivés et expirés, cette opération ne peut pas être annulée.", + "将删除所有仍在内存中的渠道亲和性缓存条目。": "All channel affinity cache entries still in memory will be deleted.", + "将大请求体临时存储到磁盘": "Store large request bodies temporarily on disk", "将清除所有保存的配置并恢复默认设置,此操作不可撤销。是否继续?": "Effacera toutes les configurations enregistrées et rétablira les paramètres par défaut. Cette opération ne peut pas être annulée. Continuer ?", "将清除选定时间之前的所有日志": "Effacera tous les journaux avant l'heure sélectionnée", + "将追加 2 条规则到现有规则列表。": "2 rules will be appended to the existing rule list.", "小时": "Heure", + "小时前": "hours ago", "小时费率": "Hourly Rate", "尚未使用": "Pas encore utilisé", "局部重绘-提交": "Varier la région", @@ -902,19 +1148,28 @@ "展开": "Développer", "展开更多": "Développer plus", "展示价格": "Prix affiché", + "嵌入模型:MokaAI M3E": "Embedding Model: MokaAI M3E", "左侧边栏个人设置": "Paramètres personnels de la barre latérale gauche", "已为 {{count}} 个模型设置{{type}}_one": "{{type}} défini pour {{count}} modèle", "已为 {{count}} 个模型设置{{type}}_many": "{{type}} défini pour {{count}} modèles", "已为 {{count}} 个模型设置{{type}}_other": "{{type}} défini pour {{count}} modèles", "已为 ${count} 个渠道设置标签!": "Étiquettes définies pour ${count} canaux !", + "已从 Discovery 自动填充配置": "Config auto-filled from Discovery", + "已从 Discovery 获取配置,可继续手动修改所有字段。": "Config retrieved from Discovery, you can continue to manually modify all fields.", + "已作废": "Invalidé", + "已使用": "Used", + "已使用:": "Used:", + "已保存偏好为": "Préférence enregistrée : ", "已修复 ${success} 个通道,失败 ${fails} 个通道。": "${success} canaux réparés, ${fails} canaux en échec.", "已停止": "Stopped", "已停止批量测试": "Test par lots arrêté", "已关闭后续提醒": "Rappels suivants désactivés", + "已分配内存": "Allocated Memory", "已切换为Assistant角色": "Basculé vers le rôle Assistant", "已切换为System角色": "Basculé vers le rôle Système", "已切换至最优倍率视图,每个模型使用其最低倍率分组": "Passé à la vue de ratio optimal, chaque modèle utilise son groupe de ratio le plus bas", "已初始化": "Initialisé", + "已删除": "Deleted", "已删除 {{count}} 个令牌!": "Supprimé {{count}} jetons !", "已删除 {{count}} 个令牌!_one": "Supprimé {{count}} jeton !", "已删除 {{count}} 个令牌!_many": "Supprimé {{count}} jetons !", @@ -925,13 +1180,18 @@ "已删除 ${data} 个通道!": "${data} canaux supprimés !", "已删除所有禁用渠道,共计 ${data} 个": "Tous les canaux désactivés ont été supprimés, au total ${data}", "已删除消息及其回复": "Message et ses réponses supprimés", + "已发起支付": "Paiement initié", "已发送到 Fluent": "Envoyé à Fluent", "已取消 Passkey 注册": "Enregistrement du Passkey annulé", + "已取消 Passkey 登录": "Passkey login cancelled", "已同步到渠道": "Synced to Channel", "已启用": "Activé", "已启用 Passkey,无需密码即可登录": "Passkey activé. Connexion sans mot de passe disponible.", "已启用所有密钥": "Toutes les clés ont été activées", "已在自定义模式中忽略": "Ignoré en mode personnalisé", + "已填充提示模板": "Prompt template filled", + "已填充模版": "Template filled", + "已填充策略模板": "Policy template filled", "已备份": "Sauvegardé", "已复制": "Copié", "已复制 ${count} 个模型": "${count} modèles copiés", @@ -948,6 +1208,8 @@ "已完成": "Completed", "已开启全局请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "La transmission globale des requêtes est activée. Les fonctionnalités intégrées de NewAPI (surcharge des paramètres, redirection de modèle, adaptation du canal, etc.) seront désactivées. Ce n'est pas une bonne pratique. Si cela cause des problèmes, merci de ne pas ouvrir d'issue.", "已成功开始测试所有已启用通道,请刷新页面查看结果。": "Le test de tous les canaux activés a démarré avec succès. Veuillez actualiser la page pour voir les résultats.", + "已打开授权页面": "Authorization page opened", + "已打开支付页面": "Page de paiement ouverte", "已提交": "Soumis", "已支付金额": "Amount Paid", "已新增 {{count}} 个模型:{{list}}_one": "{{count}} nouveau modèle ajouté : {{list}}", @@ -962,17 +1224,22 @@ "已注销": "Déconnecté", "已添加": "Ajouté", "已添加到白名单": "Ajouté à la liste blanche", + "已清空": "Cleared", "已清空测试结果": "Résultats de test effacés", + "已生成授权凭据": "Authorization credentials generated", "已用": "Used", "已用/剩余": "Utilisé/Restant", "已用额度": "Quota utilisé", "已禁用": "Désactivé", "已禁用所有密钥": "Toutes les clés ont été désactivées", + "已终止": "Terminated", "已绑定": "Lié", "已绑定渠道": "Canaux liés", "已结束": "Ended", "已耗尽": "Épuisé", "已解锁豆包自定义 API 地址编辑": "L'édition de l'adresse API personnalisée Doubao est déverrouillée", + "已达上限": "Limite atteinte", + "已达到购买上限": "Limite d'achat atteinte", "已过期": "Expiré", "已运行时间": "Uptime", "已选择 {{count}} 个模型_one": "{{count}} modèle sélectionné", @@ -980,14 +1247,22 @@ "已选择 {{count}} 个模型_other": "{{count}} modèles sélectionnés", "已选择 {{selected}} / {{total}}": "{{selected}} / {{total}} sélectionnés", "已选择 ${count} 个渠道": "${count} canaux sélectionnés", + "已部署": "Deployed", "已重置为默认配置": "Réinitialisé à la configuration par défaut", "已销毁": "Destroyed", + "币种": "Devise", + "常用上下文 Key(用于 context_*)": "Common context keys (for context_*)", "常见问答": "FAQ", + "常见问答已更新": "FAQ updated", + "常见问答更新失败": "Failed to update FAQ", "常见问答管理,为用户提供常见问题的答案(最多50个,前端显示最新20条)": "Gestion de la FAQ, fournissant des réponses aux questions courantes des utilisateurs (maximum 50, afficher les 20 dernières sur le front-end)", "平台": "plateforme", "平均RPM": "RPM moyen", "平均TPM": "TPM moyen", "平移": "Panoramique", + "年": "an(s)", + "年前": "years ago", + "应付金额": "Montant à payer", "应用同步": "Appliquer la synchronisation", "应用更改": "Appliquer les modifications", "应用覆盖": "Appliquer le remplacement", @@ -1005,18 +1280,25 @@ "开": "Ouvert", "开启之后会清除用户提示词中的": "Après l'activation, l'invite de l'utilisateur sera effacée", "开启之后将上游地址替换为服务器地址": "Après l'activation, l'adresse en amont sera remplacée par l'adresse du serveur", + "开启后,using_group 会参与 cache key(不同分组隔离)。": "When enabled, using_group is included in the cache key (isolated by group).", "开启后,仅\"消费\"和\"错误\"日志将记录您的客户端IP地址": "Après l'activation, seuls les journaux \"consommation\" et \"erreur\" enregistreront votre adresse IP client", "开启后,对免费模型(倍率为0,或者价格为0)的模型也会预消耗额度": "Après activation, les modèles gratuits (ratio 0 ou prix 0) préconsommeront également du quota", "开启后,将定期发送ping数据保持连接活跃": "Après activation, des données ping seront envoyées périodiquement pour maintenir la connexion active", "开启后,当前分组渠道失败时会按顺序尝试下一个分组的渠道": "Après activation, lorsque le canal du groupe actuel échoue, il essaiera le canal du groupe suivant dans l'ordre", "开启后,所有请求将直接透传给上游,不会进行任何处理(重定向和渠道适配也将失效),请谨慎开启": "Après activation, toutes les requêtes seront directement transmises en amont sans aucun traitement (la redirection et l'adaptation de canal seront également désactivées), veuillez activer avec prudence", + "开启后,若该规则命中且请求失败,将不会切换渠道重试。": "When enabled, if this rule matches and the request fails, no channel retry will occur.", + "开启后,规则名称会参与 cache key(不同规则隔离)。": "When enabled, the rule name is included in the cache key (isolated by rule).", + "开启后,该渠道请求 Claude 时将强制追加 ?beta=true(无需客户端手动传参)": "When enabled, requests to Claude through this channel will force append ?beta=true (no need for client to pass it manually)", "开启后,违规请求将额外扣费。": "Lorsqu'il est activé, les requêtes en violation entraîneront des frais supplémentaires.", "开启后不限制:必须设置模型倍率": "Après l'activation, aucune limite : le ratio de modèle doit être défini", "开启后未登录用户无法访问模型广场": "Lorsqu'il est activé, les utilisateurs non authentifiés ne peuvent pas accéder à la place du marché des modèles", "开启批量操作": "Activer la sélection par lots", + "开始": "Début", "开始同步": "Démarrer la synchronisation", "开始批量测试 ${count} 个模型,已清空上次结果...": "Démarrage du test par lots de ${count} modèles, résultats précédents effacés...", "开始时间": "heure de début", + "异常": "Error", + "异步任务退款": "Remboursement de tâche asynchrone", "张图片": "images", "弱变换": "Faible variation", "强制将响应格式化为 OpenAI 标准格式(只适用于OpenAI渠道类型)": "Forcer le formatage des réponses au format standard OpenAI (uniquement pour les types de canaux OpenAI)", @@ -1026,6 +1308,7 @@ "当上游通道返回错误中包含这些关键词时(不区分大小写),自动禁用通道": "Lorsque le canal en amont renvoie une erreur contenant ces mots-clés (insensible à la casse), désactivez automatiquement le canal", "当前 API 密钥已过期,请在设置中更新。": "Current API key has expired, please update it in settings.", "当前 Ollama 版本为 ${version}": "Current Ollama version is ${version}", + "当前仅 OpenAI / Claude 语义支持缓存 token 统计,其他通道将隐藏 token 相关字段。": "Currently only OpenAI / Claude semantics support cached token statistics, other channels will hide token-related fields.", "当前余额": "Solde actuel", "当前值": "Valeur actuelle", "当前分组为 auto,会自动选择最优分组,当一个组不可用时自动降级到下一个组(熔断机制)": "Le groupe actuel est auto, il sélectionnera automatiquement le groupe optimal et passera automatiquement au groupe suivant lorsqu'un groupe n'est pas disponible (mécanisme de disjoncteur)", @@ -1034,23 +1317,29 @@ "当前未开启Midjourney回调,部分项目可能无法获得绘图结果,可在运营设置中开启。": "Le rappel Midjourney actuel n'est pas activé, certains projets peuvent ne pas être en mesure d'obtenir des résultats de dessin, qui peuvent être activés dans les paramètres de fonctionnement.", "当前查看的分组为:{{group}},倍率为:{{ratio}}": "Groupe actuel : {{group}}, ratio : {{ratio}}", "当前模型列表为该标签下所有渠道模型列表最长的一个,并非所有渠道的并集,请注意可能导致某些渠道模型丢失。": "La liste de modèles actuelle est la plus longue liste de modèles de canal sous cette étiquette, pas l'union de tous les canaux. Veuillez noter que cela peut entraîner la perte de certains modèles de canal.", + "当前没有可用的启用令牌,请确认是否有令牌处于启用状态!": "No enabled tokens available, please check if any tokens are in enabled state!", + "当前浏览器不支持 Passkey": "Current browser does not support Passkey", "当前版本": "Version actuelle", "当前状态": "Current Status", + "当前环境无法使用 Passkey 登录": "Cannot use Passkey login in current environment", + "当前缓存大小": "Current Cache Size", "当前计费": "Facturation actuelle", "当前设备不支持 Passkey": "Passkey n'est pas pris en charge sur cet appareil", "当前设置类型: ": "Type de paramètre actuel : ", "当前跟随系统": "Suit actuellement le système", "当前配置无法连接到 io.net。": "Unable to connect to io.net with current configuration.", - "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知": "Lorsque le quota restant du portefeuille ou de l'abonnement est inférieur à cette valeur, le système enverra une notification via la méthode sélectionnée", "当模型没有设置价格时仍接受调用,仅当您信任该网站时使用,可能会产生高额费用": "Acceptez les appels même si le modèle n'a pas de prix défini, utilisez uniquement lorsque vous faites confiance au site Web, ce qui peut entraîner des coûts élevés", "当运行通道全部测试时,超过此时间将自动禁用通道": "Lors de l'exécution de tous les tests de canaux, le canal sera automatiquement désactivé lorsque ce temps sera dépassé", + "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知": "Lorsque le quota restant du portefeuille ou de l'abonnement est inférieur à cette valeur, le système enverra une notification via la méthode sélectionnée", "待使用收益": "Produits à utiliser", "待部署": "Pending Deployment", "微信": "WeChat", + "微信二维码": "WeChat QR Code", "微信公众号二维码图片链接": "Lien de l'image du code QR du compte public WeChat", "微信扫码关注公众号,输入「验证码」获取验证码(三分钟内有效)": "Scannez le code QR WeChat pour suivre le compte officiel, entrez \"code de vérification\" pour obtenir le code (valide 3 minutes)", "微信扫码登录": "Scanner le code WeChat pour vous connecter", "微信账户绑定成功!": "Compte WeChat lié avec succès !", + "必填。对请求的 model 名称进行匹配,任意一条匹配即命中该规则。": "Required. Match the model name in the request, any match triggers the rule.", "必须是有效的 JSON 字符串数组,例如:[\"g1\",\"g2\"]": "Doit être un tableau de chaînes JSON valide, par exemple : [\"g1\",\"g2\"]", "忘记密码?": "Mot de passe oublié ?", "快速开始": "Démarrage rapide", @@ -1061,8 +1350,11 @@ "思考适配 BudgetTokens 百分比": "Adaptation de la pensée BudgetTokens pourcentage", "思考预算占比": "Ratio du budget de la pensée", "性能指标": "Indicateurs de performance", + "性能监控": "Performance Monitor", + "性能设置": "Performance Settings", "总 GPU 小时": "Total GPU Hours", "总价:文字价格 {{textPrice}} + 音频价格 {{audioPrice}} = {{symbol}}{{total}}": "Prix total : prix du texte {{textPrice}} + prix de l'audio {{audioPrice}} = {{symbol}}{{total}}", + "总分配内存": "Total Allocated Memory", "总密钥数": "Nombre total de clés", "总收益": "revenu total", "总计": "Total", @@ -1073,6 +1365,7 @@ "您正在使用 MySQL 数据库。MySQL 是一个可靠的关系型数据库管理系统,适合生产环境使用。": "Vous utilisez la base de données MySQL. MySQL est un système de gestion de base de données relationnelle fiable, adapté aux environnements de production.", "您正在使用 PostgreSQL 数据库。PostgreSQL 是一个功能强大的开源关系型数据库系统,提供了出色的可靠性和数据完整性,适合生产环境使用。": "Vous utilisez la base de données PostgreSQL. PostgreSQL est un système de base de données relationnelle open-source puissant qui offre une excellente fiabilité et intégrité des données, adapté aux environnements de production.", "您正在使用 SQLite 数据库。如果您在容器环境中运行,请确保已正确设置数据库文件的持久化映射,否则容器重启后所有数据将丢失!": "Vous utilisez la base de données SQLite. Si vous exécutez dans un environnement de conteneur, veuillez vous assurer que le mappage de persistance du fichier de base de données est correctement défini, sinon toutes les données seront perdues après le redémarrage du conteneur !", + "您正在使用默认密码!": "You are using the default password!", "您正在删除自己的帐户,将清空所有数据且不可恢复": "Vous êtes sur le point de supprimer votre compte. Toutes les données seront effacées et ne pourront pas être récupérées.", "您的数据将安全地存储在本地计算机上。所有配置、用户信息和使用记录都会自动保存,关闭应用后不会丢失。": "Vos données seront stockées en toute sécurité sur votre ordinateur local. Toutes les configurations, informations utilisateur et historiques d'utilisation seront automatiquement sauvegardés et ne seront pas perdus après la fermeture de l'application.", "您确定要取消密码登录功能吗?这可能会影响用户的登录方式。": "Êtes-vous sûr de vouloir annuler la fonction de connexion par mot de passe ? Cela pourrait affecter les méthodes de connexion des utilisateurs.", @@ -1081,9 +1374,12 @@ "想起来了?": "Vous vous souvenez ?", "成功": "Succès", "成功兑换额度:": "Montant de l'échange réussi :", + "成功后切换亲和": "Switch Affinity on Success", "成功时自动启用通道": "Activer le canal en cas de succès", "我已了解禁用两步验证将永久删除所有相关设置和备用码,此操作不可撤销": "J'ai compris que la désactivation de l'authentification à deux facteurs supprimera définitivement tous les paramètres et codes de sauvegarde associés, cette opération ne peut pas être annulée", "我已阅读并同意": "J'ai lu et j'accepte", + "我的订阅": "Mes abonnements", + "我确认开启高危重试": "I confirm enabling high-risk retry", "或": "Ou", "或其兼容new-api-worker格式的其他版本": "ou d'autres versions compatibles avec le format new-api-worker", "或手动输入密钥:": "Ou saisissez manuellement le secret :", @@ -1094,6 +1390,9 @@ "手动编辑": "Modification manuelle", "手动输入": "Saisie manuelle", "打开侧边栏": "Ouvrir la barre latérale", + "打开授权页面": "Open Authorization Page", + "扣费": "Charge", + "执行 GC": "Run GC", "执行中": "En cours", "扫描二维码": "Scanner le code QR", "批量创建": "Création par lots", @@ -1120,6 +1419,8 @@ "拉取新模型": "Pull New Model", "拉取模型": "Pull Model", "拉取进度": "Pull Progress", + "拒绝提示模板(可选)": "Rejection Prompt Template (optional)", + "拦截原因": "Block Reason", "按K显示单位": "Afficher en K", "按价格设置": "Définir par prix", "按倍率类型筛选": "Filtrer par type de ratio", @@ -1131,6 +1432,7 @@ "换脸": "Remplacement de visage", "授权,需在遵守": " et doit être utilisé conformément au ", "授权失败": "Échec de l'autorisation", + "排序": "Ordre", "排队中": "En file d'attente", "接受未设置价格模型": "Accepter les modèles sans prix défini", "接口凭证": "Informations d'identification de l'interface", @@ -1139,6 +1441,7 @@ "控制台区域": "Zone de la console", "控制输出的随机性和创造性": "Contrôle l'aléatoire et la créativité de la sortie", "控制顶栏模块显示状态,全局生效": "Contrôler l'état d'affichage du module d'en-tête, effet global", + "推荐": "Recommandé", "推荐:用户可以选择是否使用指纹等验证": "Recommandé : les utilisateurs peuvent choisir d'utiliser ou non la vérification par empreinte digitale", "推荐使用(用户可选)": "Recommandé (optionnel pour l'utilisateur)", "描述": "Description", @@ -1150,12 +1453,14 @@ "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "Invite {{input}} tokens / 1M tokens * {{symbol}}{{price}}", "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Invite {{input}} tokens / 1M tokens * {{symbol}}{{price}} + Complétion {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 缓存创建 {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Invite {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + Cache {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + Création de cache {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + Complétion {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "提示:": "Note:", "提示:如需备份数据,只需复制上述目录即可": "Astuce : pour sauvegarder les données, il suffit de copier le répertoire ci-dessus", + "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。": "Remarque : cette configuration n'affecte que l'affichage des modèles dans la place de marché des modèles et n'a aucun impact sur l'invocation ou le routage réels. Pour configurer le comportement réel des appels, veuillez aller dans « Gestion des canaux ».", + "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。": "Remarque : cette fonctionnalité est en version bêta. La structure de configuration et le comportement peuvent changer à l’avenir. Ne l’utilisez pas en production.", + "提示:语言偏好会同步到您登录的所有设备,并影响API返回的错误消息语言。": "Note: Language preference syncs across all your logged-in devices and affects the language of API error messages.", "提示:链接中的{key}将被替换为API密钥,{address}将被替换为服务器地址": "Astuce : {key} dans le lien sera remplacé par la clé API, {address} sera remplacé par l'adresse du serveur", "提示价格:{{symbol}}{{price}} / 1M tokens": "Prix d'invite : {{symbol}}{{price}} / 1M tokens", "提示缓存倍率": "Ratio de cache d'invite", - "缓存创建倍率": "Ratio de création du cache", - "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)": "Par défaut, le ratio de création de cache 5m est utilisé ; le ratio de création de cache 1h est calculé via une multiplication fixe (actuellement 1.6x)", "搜索供应商": "Rechercher un fournisseur", "搜索关键字": "Rechercher des mots-clés", "搜索失败": "Search failed", @@ -1172,13 +1477,18 @@ "操作": "Actions", "操作失败": "Opération échouée", "操作失败,请重试": "L'opération a échoué, veuillez réessayer", + "操作失败: ": "Operation failed: ", "操作成功完成!": "Opération terminée avec succès !", "操作暂时被禁用": "Opération temporairement désactivée", + "操作确认": "Operation confirmation", "操练场": "Terrain de jeu", "操练场和聊天功能": "Terrain de jeu et fonctions de discussion", + "支付": "Payer", "支付地址": "Adresse de paiement", + "支付失败": "Paiement échoué", "支付宝": "Alipay", "支付方式": "Mode de paiement", + "支付渠道": "Canaux de paiement", "支付设置": "Paiement", "支付请求失败": "Échec de la demande de paiement", "支付金额": "Montant payé", @@ -1190,11 +1500,15 @@ "支持众多的大模型供应商": "Prise en charge de divers fournisseurs de LLM", "支持单个端口和端口范围,如:80, 443, 8000-8999": "Prend en charge les ports uniques et les plages de ports, par exemple : 80, 443, 8000-8999", "支持变量:": "Variables prises en charge :", + "支持周期性重置套餐权益额度": "Prend en charge la réinitialisation périodique du quota du plan", + "支持填写单个状态码或范围(含首尾),使用逗号分隔": "Supports single status codes or inclusive ranges; separate with commas", + "支持填写单个状态码或范围(含首尾),使用逗号分隔;504 和 524 始终不重试,不受此处配置影响": "Supports single status codes or inclusive ranges; separate with commas. 504 and 524 are never retried and are not affected by this setting", "支持备份": "Pris en charge", "支持拉取 Ollama 官方模型库中的所有模型,拉取过程可能需要几分钟时间": "Supports pulling all models from the Ollama official model library, the pulling process may take a few minutes", "支持搜索用户的 ID、用户名、显示名称和邮箱地址": "Prise en charge de la recherche par ID utilisateur, nom d'utilisateur, nom d'affichage et adresse e-mail", "支持的图像模型": "Modèles d'image pris en charge", "支持通配符格式,如:example.com, *.api.example.com": "Prend en charge le format générique, par exemple : example.com, *.api.example.com", + "支持逻辑 and/or 与嵌套 groups;操作符支持 eq/ne/gt/gte/lt/lte/in/not_in/contains/exists": "Supports logical and/or with nested groups; operators: eq/ne/gt/gte/lt/lte/in/not_in/contains/exists", "收益": "Gains", "收益统计": "Statistiques sur les revenus", "收起": "Réduire", @@ -1225,10 +1539,16 @@ "文档": "Documentation", "文档地址": "Lien du document", "文生视频": "Texte vers vidéo", + "新增 Key 来源": "Add Key Source", "新增供应商": "Ajouter un fournisseur", + "新增失败": "Failed to add", + "新增成功": "Added successfully", + "新增规则": "Add Rule", + "新增订阅": "Ajouter un abonnement", "新密码": "Nouveau mot de passe", "新密码需要和原密码不一致!": "Le nouveau mot de passe doit être différent de l'ancien mot de passe !", "新建": "Créer", + "新建套餐": "Créer un plan", "新建容器": "Create Container", "新建容器部署": "Create Container Deployment", "新建数量": "Nouvelle quantité", @@ -1248,13 +1568,17 @@ "无效的部署信息": "Invalid deployment information", "无效的重置链接,请重新发起密码重置请求": "Lien de réinitialisation non valide, veuillez lancer une nouvelle demande de réinitialisation de mot de passe", "无法发起 Passkey 注册": "Impossible de lancer l'inscription Passkey", + "无法发起 Passkey 登录": "Unable to initiate Passkey login", "无法复制到剪贴板,请手动复制": "Impossible de copier dans le presse-papiers, veuillez copier manuellement", + "无法复制此类型的消息内容": "Cannot copy this type of message content", "无法添加图片": "Impossible d'ajouter l'image", "无法获取容器详情": "Unable to get container details", "无法连接 io.net": "Unable to connect to io.net", + "无生效": "Aucun actif", "无邀请人": "Pas d'invitant", "无限制": "Illimité", "无限额度": "Quota illimité", + "日": "jour(s)", "日志导出成功": "Logs exported successfully", "日志已下载": "Logs downloaded", "日志已加载": "Logs loaded", @@ -1267,10 +1591,12 @@ "旧格式(直接覆盖):": "Ancien format (remplacement direct) :", "旧格式模板": "Modèle d'ancien format", "旧的备用码已失效,请保存新的备用码": "Les anciens codes de sauvegarde ont été invalidés, veuillez enregistrer les nouveaux codes de sauvegarde", + "旧配置迁移完成": "Legacy config migration complete", "早上好": "Bonjour", "时间": "Heure", "时间信息": "Time Information", "时间粒度": "Granularité temporelle", + "易支付": "Epay", "易支付商户ID": "ID marchand Epay", "易支付商户密钥": "Clé marchand Epay", "是": "Oui", @@ -1283,6 +1609,7 @@ "显示倍率": "Afficher le ratio", "显示最新20条": "Afficher les 20 dernières", "显示名称": "Nom d'affichage", + "显示名称字段(可选)": "Display Name Field (optional)", "显示完整内容": "Afficher le contenu complet", "显示操作项": "Afficher les actions", "显示更多": "Afficher plus", @@ -1295,6 +1622,8 @@ "智能体ID": "ID de l'agent intelligent", "智能熔断": "Fallback intelligent", "智谱": "Zhipu AI", + "智谱 ChatGLM(已经弃用,请使用智谱 GLM-4V)": "Zhipu ChatGLM (deprecated, use Zhipu GLM-4V)", + "智谱 GLM-4V": "Zhipu GLM-4V", "暂无": "None", "暂无API信息": "Aucune information sur l'API", "暂无SSE响应数据": "Aucune donnée de réponse SSE", @@ -1304,12 +1633,15 @@ "暂无公告": "Pas d'avis", "暂无匹配模型": "Aucun modèle correspondant", "暂无可复制的版本信息": "No version information to copy", + "暂无可展示数据": "No data to display", "暂无可用的支付方式,请联系管理员配置": "Aucune méthode de paiement disponible, veuillez contacter l'administrateur pour la configuration", + "暂无可购买套餐": "Aucun plan disponible à l'achat", "暂无响应数据": "Aucune donnée de réponse", "暂无容器信息": "No container information", "暂无容器详情": "No container details", "暂无密钥数据": "Aucune donnée de clé", "暂无差异化倍率显示": "Aucun affichage de ratio différentiel", + "暂无已绑定项": "No bound items", "暂无常见问答": "Pas de FAQ", "暂无成功模型": "Aucun modèle réussi", "暂无数据": "Aucune donnée", @@ -1324,6 +1656,9 @@ "暂无监控数据": "Pas de données de surveillance", "暂无系统公告": "Pas d'avis système", "暂无缺失模型": "Aucun modèle manquant", + "暂无自定义 OAuth 提供商": "No custom OAuth providers", + "暂无订阅套餐": "Aucun plan d'abonnement", + "暂无订阅记录": "Aucun enregistrement d'abonnement", "暂无请求数据": "Aucune donnée de requête", "暂无项目": "Aucun projet", "暂无预填组": "Aucun groupe pré-rempli", @@ -1342,9 +1677,11 @@ "更新名称失败": "Failed to update name", "更新失败": "Échec de la mise à jour", "更新失败,请检查输入信息": "Update failed, please check the input information", + "更新套餐信息": "Mettre à jour le plan", "更新容器配置": "Update Container Configuration", "更新容器配置可能会导致容器重启,请确保在合适的时间进行此操作。": "Updating container configuration may cause the container to restart, please ensure you perform this operation at an appropriate time.", "更新成功": "Mise à jour réussie", + "更新成功!": "Updated successfully!", "更新所有已启用通道余额": "Mettre à jour le solde de tous les canaux activés", "更新支付设置": "Mettre à jour les paramètres de paiement", "更新时间": "Heure de mise à jour", @@ -1356,16 +1693,25 @@ "更新配置后,容器可能需要重启以应用新的设置。请确保您了解这些更改的影响。": "After updating the configuration, the container may need to restart to apply the new settings. Please ensure you understand the impact of these changes.", "更新配置失败": "Failed to update configuration", "更新预填组": "Mettre à jour le groupe pré-rempli", + "月": "mois", "有 Reasoning": "A un raisonnement", + "有异常": "Has Errors", + "有效期": "Validité", + "有效期单位": "Unité de validité", + "有效期数值": "Valeur de validité", + "有效期设置": "Paramètres de validité", "服务可用性": "État du service", "服务商": "Service Provider", "服务器地址": "Adresse du serveur", "服务显示名称": "Nom d'affichage du service", + "未使用": "Unused", + "未匹配到模型,按回车键可将「{{name}}」作为自定义模型名添加": "Aucun modèle correspondant. Appuyez sur Entrée pour ajouter «{{name}}» comme nom de modèle personnalisé.", "未发现新增模型": "Aucun nouveau modèle n'a été ajouté", "未发现重复密钥": "Aucune clé en double trouvée", "未启动": "Pas de démarrage", "未启用": "Non activé", "未命名": "Sans nom", + "未在 Discovery 响应中找到可用的 OAuth 端点": "No available OAuth endpoints found in Discovery response", "未备份": "Non sauvegardé", "未开始": "Non démarré", "未找到匹配的模型": "Aucun modèle correspondant trouvé", @@ -1392,9 +1738,13 @@ "未设置倍率模型": "Modèles sans ratio", "未配置模型": "Aucun modèle configuré", "未配置的模型列表": "Modèles non configurés", + "本周": "This Week", "本地": "Local", "本地数据存储": "Stockage de données locales", "本地计费": "Facturation locale", + "本月": "This Month", + "本月获得": "Ce mois-ci", + "本站仅作演示之用,无服务端!": "This site is for demo purposes only, no server!", "本设备:手机指纹/面容,外接:USB安全密钥": "Intégré : empreinte digitale/visage du téléphone, Externe : clé de sécurité USB", "本设备内置": "Intégré à cet appareil", "本项目根据": "Ce projet est sous licence ", @@ -1402,11 +1752,13 @@ "机密环境变量将被加密存储,适用于存储密码、API密钥等敏感信息。": "Secret environment variables will be stored encrypted, suitable for storing passwords, API keys and other sensitive information.", "机密环境变量说明": "Secret Environment Variables Description", "权重": "Poids", + "权重必须是非负整数!": "Weight must be a non-negative integer!", "权限设置": "Paramètres d'autorisation", "条": "éléments", "条 - 第": "à", "条,共": "sur", "条日志已清理!": "les journaux ont été effacés !", + "来源": "Source", "来源于 IO.NET 部署": "From IO.NET Deployment", "来自模型重定向,尚未加入模型列表": "Issu d'une redirection de modèle, pas encore ajouté à la liste des modèles", "某些配置更改可能需要几分钟才能生效。": "Some configuration changes may take a few minutes to take effect.", @@ -1424,20 +1776,26 @@ "标签不能为空!": "L'étiquette ne peut pas être vide !", "标签信息": "Informations sur l'étiquette", "标签名称": "Nom de l'étiquette", + "标签更新成功!": "Tag updated successfully!", "标签的基本配置": "Configuration de base de l'étiquette", "标签组": "Groupe d'étiquettes", "标签聚合": "Agrégation d'étiquettes", "标签聚合模式": "Activer le mode étiquette", "标识颜色": "Couleur de l'identifiant", "核采样,控制词汇选择的多样性": "Échantillonnage nucléaire, contrôle la diversité de la sélection du vocabulaire", + "根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。": "Selon la convention Anthropic, les tokens d'entrée de /v1/messages ne comptent que les entrées non mises en cache et excluent les tokens de lecture/écriture du cache.", "根据模型名称和匹配规则查找模型元数据,优先级:精确 > 前缀 > 后缀 > 包含": "Rechercher les métadonnées du modèle en fonction du nom du modèle et des règles de correspondance, priorité : exact > préfixe > suffixe > contient", "格式化": "Formater", + "格式化 JSON": "Formater le JSON", "格式正确": "Format valide", "格式示例:": "Exemple de format :", "格式错误": "Format invalide", "检查更新": "Vérifier les mises à jour", + "检查更新失败,请稍后再试": "Failed to check for updates, please try again later", "检测到 FluentRead(流畅阅读)": "FluentRead détecté", + "检测到以下高危状态码重定向规则": "Detected high-risk status-code redirect rules", "检测到多个密钥,您可以单独复制每个密钥,或点击复制全部获取完整内容。": "Plusieurs clés détectées, vous pouvez copier chaque clé individuellement ou cliquer sur Tout copier pour obtenir le contenu complet.", + "检测到旧版本的配置数据,是否要迁移到新的配置格式?": "Legacy config data detected, migrate to the new config format?", "检测到该消息后有AI回复,是否删除后续回复并重新生成?": "Une réponse IA a été détectée après ce message, voulez-vous supprimer les réponses suivantes et régénérer ?", "检测必须等待绘图成功才能进行放大等操作": "La détection doit attendre que le dessin réussisse avant d'effectuer un zoom et d'autres opérations", "模型": "Modèle", @@ -1446,6 +1804,7 @@ "模型价格": "Prix du modèle", "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}": "Prix du modèle {{symbol}}{{price}}, {{ratioType}} {{ratio}}", "模型价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "Prix du modèle : {{symbol}}{{price}} * {{ratioType}} : {{ratio}} = {{symbol}}{{total}}", + "模型价格不能为0": "Model price cannot be 0", "模型倍率": "Ratio", "模型倍率 {{modelRatio}}": "Ratio du modèle {{modelRatio}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}}": "Ratio du modèle {{modelRatio}}, ratio de cache {{cacheRatio}}, ratio de complétion {{completionRatio}}, {{ratioType}} {{ratio}}", @@ -1476,6 +1835,9 @@ "模型映射必须是合法的 JSON 格式!": "Le mappage de modèles doit être au format JSON valide !", "模型更新成功!": "Modèle mis à jour avec succès !", "模型未加入列表,可能无法调用": "Le modèle n'est pas dans la liste, il peut ne pas être disponible", + "模型正则": "Model Regex", + "模型正则(每行一个)": "Model Regex (one per line)", + "模型正则不能为空": "Model regex cannot be empty", "模型消耗分布": "Distribution de la consommation des modèles", "模型消耗趋势": "Tendance de la consommation des modèles", "模型版本": "Version du modèle", @@ -1503,6 +1865,7 @@ "欢迎使用,请完成以下设置以开始使用系统": "Bienvenue, veuillez compléter les paramètres suivants pour commencer à utiliser le système", "欧元": "Euro", "正在加载可用部署位置...": "Loading available deployment locations...", + "正在加载签到状态...": "Chargement du statut d'enregistrement...", "正在处理大内容...": "Traitement de contenu volumineux...", "正在提交": "Envoi en cours", "正在构造请求体预览...": "Construction de l'aperçu du corps de la requête...", @@ -1511,6 +1874,7 @@ "正在跟随最新日志": "Following latest logs", "正在跳转 GitHub...": "Redirection vers GitHub...", "正在跳转...": "Redirection...", + "正常": "Normal", "此代理仅用于图片请求转发,Webhook通知发送等,AI API请求仍然由服务器直接发出,可在渠道设置中单独配置代理": "Ce proxy est utilisé uniquement pour le transfert des requêtes d'images, l'envoi de notifications Webhook, etc. Les requêtes d'API IA sont toujours émises directement par le serveur, le proxy peut être configuré séparément dans les paramètres du canal", "此修改将不可逆": "Cette modification sera irréversible", "此操作不可恢复,请仔细确认时间后再操作!": "Cette opération est irréversible, veuillez confirmer attentivement l'heure avant d'opérer !", @@ -1525,6 +1889,7 @@ "此操作将解绑用户当前的 Passkey,下次登录需要重新注册。": "Cela détachera le Passkey actuel de l'utilisateur. Il devra se réenregistrer lors de sa prochaine connexion.", "此操作将降低用户的权限级别": "Cette opération abaissera le niveau de permission de l'utilisateur", "此支付方式最低充值金额为": "Le montant minimum de recharge pour ce mode de paiement est de", + "此消息没有可复制的文本内容": "This message has no copyable text content", "此渠道由 IO.NET 自动同步,类型、密钥和 API 地址已锁定。": "This channel is automatically synchronized by IO.NET, type, key and API address are locked.", "此设置用于系统内部计算,默认值500000是为了精确到6位小数点设计,不推荐修改。": "Ce paramètre est utilisé pour les calculs internes du système, la valeur par défaut 500000 est conçue pour une précision de 6 décimales, la modification n'est pas recommandée.", "此页面仅显示未设置价格或倍率的模型,设置后将自动从列表中移除": "Cette page n'affiche que les modèles sans prix ni ratio. Après le paramétrage, ils seront automatiquement supprimés de la liste", @@ -1535,11 +1900,20 @@ "此项可选,用于覆盖请求参数。不支持覆盖 stream 参数": "Ceci est facultatif, utilisé pour remplacer les paramètres de requête. Ne prend pas en charge le remplacement du paramètre stream", "此项可选,用于覆盖请求头参数": "Ceci est facultatif, utilisé pour remplacer les paramètres d'en-tête de requête", "此项可选,用于通过自定义API地址来进行 API 调用,末尾不要带/v1和/": "Facultatif pour les appels d'API via une adresse d'API personnalisée, n'ajoutez pas /v1 et / à la fin", + "每个用户最多可创建的令牌数量,默认 1000,设置过大可能会影响性能": "Maximum tokens each user can create, default 1000. Setting too high may impact performance", + "每周": "Hebdomadaire", + "每周窗口": "Weekly window", + "每天": "Quotidien", "每容器GPU数": "GPUs per Container", + "每日仅可签到一次,请勿重复签到": "Un seul enregistrement par jour, veuillez ne pas vous enregistrer plusieurs fois", + "每日签到": "Enregistrement quotidien", + "每日签到可获得随机额度奖励": "L'enregistrement quotidien récompense un quota aléatoire", + "每月": "Mensuel", "每隔多少分钟测试一次所有通道": "Tous les combien de minutes tester tous les canaux", "永不过期": "N'expire jamais", "永久删除您的两步验证设置": "Supprimer définitivement vos paramètres d'authentification à deux facteurs", "永久删除所有备用码(包括未使用的)": "Supprimer définitivement tous les codes de sauvegarde (y compris ceux non utilisés)", + "没有任何修改!": "No changes made!", "没有匹配的日志条目": "No matching log entries", "没有可用令牌用于填充": "Aucun jeton disponible pour le remplissage", "没有可用模型": "Aucun modèle disponible", @@ -1550,15 +1924,20 @@ "注 册": "S'inscrire", "注册": "S'inscrire", "注册 Passkey": "Enregistrer un Passkey", + "注册失败,请重试": "Registration failed, please try again", + "注册成功!": "Registration successful!", "注意": "Remarque", + "注意:": "Note:", "注意:JSON中重复的键只会保留最后一个同名键的值": "Remarque : Dans JSON, pour les clés dupliquées, seule la valeur de la dernière clé du même nom sera conservée", "注意非Chat API,请务必填写正确的API地址,否则可能导致无法使用": "Remarque : Pour les API non-Chat, assurez-vous de saisir l'adresse API correcte, sinon elle pourrait ne pas fonctionner", "注销": "Se déconnecter", "注销成功!": "Déconnexion réussie !", + "活跃文件": "Active Files", + "活跃缓存数": "Active Cache Count", "流": "Flux", + "流式": "Streaming", "流式响应完成": "Flux terminé", "流式输出": "Sortie en flux", - "流式": "Streaming", "流量端口": "Traffic Port", "浅色": "Clair", "浅色模式": "Mode clair", @@ -1569,12 +1948,13 @@ "测试单个渠道操作项目组": "Tester un seul groupe de projet d'opération de canal", "测试失败": "Échec du test", "测试失败:": "Test failed: ", + "测试所有未手动禁用渠道": "Tester tous les canaux sauf ceux désactivés manuellement", "测试所有渠道的最长响应时间": "Temps de réponse maximal pour tester tous les canaux", "测试所有通道": "Tester tous les canaux", - "测试所有未手动禁用渠道": "Tester tous les canaux sauf ceux désactivés manuellement", "测试模式": "Mode test", "测试连接": "Test Connection", "测速": "Test de vitesse", + "浏览器不支持复制功能,请手动复制": "Browser does not support copy, please copy manually", "消息优先级": "Priorité du message", "消息优先级,范围0-10,默认为5": "Priorité du message, plage 0-10, par défaut 5", "消息已删除": "Message supprimé", @@ -1588,6 +1968,7 @@ "深色": "Sombre", "深色模式": "Mode sombre", "添加": "Ajouter", + "添加 OAuth 提供商": "Add OAuth Provider", "添加API": "Ajouter une API", "添加产品": "Ajouter un produit", "添加令牌": "Créer un jeton", @@ -1608,14 +1989,22 @@ "添加键值对": "Ajouter une paire clé-valeur", "添加问答": "Ajouter une FAQ", "添加额度": "Ajouter un quota", + "清理不活跃缓存": "Nettoyer le cache inactif", + "清理失败": "Cleanup failed", "清空": "Clear", + "清空全部缓存": "Clear All Cache", + "清空该规则缓存": "Clear Rule Cache", "清空重定向": "Effacer la redirection", "清除历史日志": "Effacer les journaux historiques", "清除失效兑换码": "Effacer les codes d'échange non valides", "清除所有模型": "Effacer tous les modèles", "渠道": "Canal", "渠道 ID": "ID du Canal", + "渠道:": "Channel:", "渠道ID,名称,密钥,API地址": "ID du canal, nom, clé, URL de base", + "渠道亲和性": "Channel Affinity", + "渠道亲和性:上游缓存命中": "Channel Affinity: Upstream Cache Hit", + "渠道亲和性会基于从请求上下文或 JSON Body 提取的 Key,优先复用上一次成功的渠道。": "Channel affinity prioritizes reusing the last successful channel based on keys extracted from request context or JSON body.", "渠道优先级": "Priorité du canal", "渠道信息": "Informations sur le canal", "渠道创建成功!": "Canal créé avec succès !", @@ -1647,8 +2036,6 @@ "点击此处": "cliquez ici", "点击预览视频": "Cliquez pour prévisualiser la vidéo", "点击预览音乐": "Cliquez pour écouter la musique", - "音乐预览": "Aperçu musical", - "音频无法播放": "Impossible de lire l'audio", "点击验证按钮,使用您的生物特征或安全密钥": "Cliquez sur le bouton de vérification pour utiliser vos caractéristiques biométriques ou votre clé de sécurité", "版权所有": "Tous droits réservés", "状态": "Statut", @@ -1658,12 +2045,15 @@ "状态页面Slug": "Slug de la page d'état", "环境变量": "Environment Variables", "生成令牌": "Générer un jeton", + "生成并填入": "Generate and Fill", "生成数量": "Générer la quantité", "生成数量必须大于0": "La quantité de génération doit être supérieure à 0", "生成新的备用码": "Générer de nouveaux codes de sauvegarde", "生成歌词": "Générer des paroles", "生成音乐": "générer de la musique", + "生效": "Actif", "用于API调用的身份验证令牌,请妥善保管": "Jeton d'authentification pour les appels d'API, veuillez le conserver en lieu sûr", + "用于唯一标识用户的字段路径": "Field path for uniquely identifying users", "用于配置网络代理,支持 socks5 协议": "Utilisé pour configurer le proxy réseau, prend en charge le protocole socks5", "用于验证回调 new-api 的 webhook 请求的密钥,敏感信息不显示": "Clé utilisée pour vérifier les requêtes webhook de rappel de new-api, les informations sensibles ne sont pas affichées.", "用以支持基于 WebAuthn 的无密码登录注册": "Prise en charge de la connexion et de l'enregistrement sans mot de passe basés sur WebAuthn", @@ -1677,11 +2067,14 @@ "用以支持通过微信进行登录注册": "Pour prendre en charge la connexion & l'inscription via WeChat", "用以防止恶意用户利用临时邮箱批量注册": "Pour empêcher les utilisateurs malveillants d'utiliser des e-mails temporaires pour s'inscrire en masse", "用户": "Utilisateurs", + "用户 ID 字段(可选)": "User ID Field (optional)", "用户个人功能": "Fonctions personnelles de l'utilisateur", "用户主页,展示系统信息": "Page d'accueil de l'utilisateur, affichant les informations système", "用户优先:如果用户在请求中指定了系统提示词,将优先使用用户的设置": "Priorité de l'utilisateur : si l'utilisateur spécifie une invite système dans la requête, le paramètre de l'utilisateur sera utilisé en premier", "用户信息": "Informations utilisateur", "用户信息更新成功!": "Informations utilisateur mises à jour avec succès !", + "用户信息缺失": "User info missing", + "用户最大令牌数量": "Max Tokens Per User", "用户分组": "Votre groupe par défaut", "用户分组和额度管理": "Groupes et quotas", "用户分组配置": "Configuration du groupe d'utilisateurs", @@ -1690,6 +2083,7 @@ "用户协议更新失败": "Échec de la mise à jour de l'accord utilisateur", "用户可选分组": "Groupes sélectionnables par l'utilisateur", "用户名": "Nom d'utilisateur", + "用户名字段(可选)": "Username Field (optional)", "用户名或邮箱": "Nom d'utilisateur ou e-mail", "用户名称": "Nom d'utilisateur", "用户控制面板,管理账户": "Panneau de configuration de l'utilisateur pour la gestion du compte", @@ -1700,25 +2094,39 @@ "用户的基本账户信息": "Informations de base du compte utilisateur", "用户管理": "Utilisateurs", "用户组": "Groupe d'utilisateurs", + "用户订阅管理": "Gestion des abonnements utilisateur", "用户账户创建成功!": "Compte utilisateur créé avec succès !", "用户账户管理": "Comptes utilisateurs", "用时/首字": "Temps/premier mot", + "由全站货币展示设置统一控制": "Contrôlé par les paramètres globaux d'affichage des devises", + "由订阅抵扣": "Deducted from subscription", + "界面语言和其他个人偏好": "Interface language and other personal preferences", + "留空使用系统临时目录": "Leave empty to use system temp directory", "留空则使用账号绑定的邮箱": "Si ce champ est laissé vide, l'adresse e-mail liée au compte sera utilisée", "留空则使用默认端点;支持 {path, method}": "Laissez vide pour utiliser le point de terminaison par défaut ; prend en charge {path, method}", + "留空则保持原有密钥": "Leave empty to keep existing secret", "留空则默认使用服务器地址,注意不能携带http://或者https://": "Laissez vide pour utiliser l'adresse du serveur par défaut, notez que vous ne pouvez pas inclure http:// ou https://", "登 录": "Se connecter", "登录": "Se connecter", + "登录失败,请重试": "Login failed, please try again", + "登录成功": "Login successful", "登录成功!": "Connexion réussie !", "登录过期,请重新登录!": "Session expirée, veuillez vous reconnecter !", "白名单": "Liste blanche", + "百度文心千帆": "Baidu ERNIE", + "百度文心千帆V2": "Baidu ERNIE V2", "的前提下使用。": "doit être utilisé conformément aux conditions.", "监控设置": "Surveillance", + "目录总大小": "Directory Total Size", + "目录文件数": "Directory File Count", "目标用户:{{username}}": "Utilisateur cible : {{username}}", "直接提交": "Soumettre directement", "相关项目": "Projets connexes", "相当于删除用户,此修改将不可逆": "Équivalent à supprimer l'utilisateur, cette modification sera irréversible", "矛盾": "Conflit", "知识库 ID": "ID de la base de connaissances", + "知识库:AI Proxy": "Knowledge Base: AI Proxy", + "知识库:FastGPT": "Knowledge Base: FastGPT", "硬件": "Hardware", "硬件与性能": "Hardware & Performance", "硬件类型": "Hardware Type", @@ -1748,6 +2156,7 @@ "确定要删除所选的 {{count}} 个模型吗?_one": "Êtes-vous sûr de vouloir supprimer le modèle sélectionné ?", "确定要删除所选的 {{count}} 个模型吗?_many": "Êtes-vous sûr de vouloir supprimer les {{count}} modèles sélectionnés ?", "确定要删除所选的 {{count}} 个模型吗?_other": "Êtes-vous sûr de vouloir supprimer les {{count}} modèles sélectionnés ?", + "确定要删除此 OAuth 提供商吗?": "Are you sure you want to delete this OAuth provider?", "确定要删除此API信息吗?": "Êtes-vous sûr de vouloir supprimer ces informations d'API ?", "确定要删除此公告吗?": "Êtes-vous sûr de vouloir supprimer cet avis ?", "确定要删除此分类吗?": "Êtes-vous sûr de vouloir supprimer cette catégorie ?", @@ -1759,34 +2168,50 @@ "确定要启用此用户吗?": "Êtes-vous sûr de vouloir activer cet utilisateur ?", "确定要提升此用户吗?": "Êtes-vous sûr de vouloir promouvoir cet utilisateur ?", "确定要更新所有已启用通道余额吗?": "Êtes-vous sûr de vouloir mettre à jour le solde de tous les canaux activés ?", - "确定要测试所有通道吗?": "Êtes-vous sûr de vouloir tester tous les canaux ?", "确定要测试所有未手动禁用渠道吗?": "Êtes-vous sûr de vouloir tester tous les canaux sauf ceux désactivés manuellement ?", + "确定要测试所有通道吗?": "Êtes-vous sûr de vouloir tester tous les canaux ?", "确定要禁用所有的密钥吗?": "Êtes-vous sûr de vouloir désactiver toutes les clés ?", "确定要禁用此用户吗?": "Êtes-vous sûr de vouloir désactiver cet utilisateur ?", + "确定要解绑 {{name}} 吗?": "Are you sure you want to unbind {{name}}?", "确定要降级此用户吗?": "Êtes-vous sûr de vouloir rétrograder cet utilisateur ?", "确定重置": "Confirmer la réinitialisation", "确定重置模型倍率吗?": "Confirmer la réinitialisation du ratio de modèle ?", "确认": "Confirmer", + "确认作废": "Confirmer l'invalidation", + "确认关闭提示": "Confirmer la fermeture", "确认冲突项修改": "Confirmer la modification de l'élément de conflit", "确认删除": "Confirmer la suppression", "确认删除模型": "Confirm Delete Model", "确认取消密码登录": "Confirmer l'annulation de la connexion par mot de passe", + "确认启用": "Confirm Enable", "确认密码": "Confirmer le mot de passe", "确认导入配置": "Confirmer l'importation de la configuration", "确认延长": "Confirm Extension", "确认延长容器时长": "Confirm Container Duration Extension", "确认操作": "Confirm Operation", "确认新密码": "Confirmer le nouveau mot de passe", - "确认清除历史日志": "Confirmer l'effacement des journaux historiques", "确认清理不活跃的磁盘缓存?": "Confirmer le nettoyage du cache disque inactif ?", + "确认清空全部渠道亲和性缓存": "Confirm clear all channel affinity cache", + "确认清空该规则缓存": "Confirm clear rule cache", + "确认清除历史日志": "Confirmer l'effacement des journaux historiques", "确认禁用": "Confirmer la désactivation", "确认补单": "Confirmer la complétion", "确认解绑": "Confirmer la dissociation", "确认解绑 Passkey": "Confirmer la dissociation du Passkey", "确认设置并完成初始化": "Confirmer les paramètres et terminer l'initialisation", + "确认迁移": "Confirm Migration", "确认重置 Passkey": "Confirmer la réinitialisation du Passkey", "确认重置两步验证": "Confirmer la réinitialisation de l'authentification à deux facteurs", "确认重置密码": "Confirmer la réinitialisation du mot de passe", + "磁盘 阈值 (%)": "Seuil disque (%)", + "磁盘使用率超过此值时拒绝请求": "Rejeter les requêtes lorsque l'utilisation du disque dépasse cette valeur", + "磁盘可用空间小于缓存最大总量设置": "Disk free space is less than max cache size setting", + "磁盘命中": "Disk Hits", + "磁盘缓存最大总量 (MB)": "Max Disk Cache Size (MB)", + "磁盘缓存占用的最大空间": "Maximum space occupied by disk cache", + "磁盘缓存已清理": "Disk cache cleared", + "磁盘缓存设置(磁盘换内存)": "Disk Cache Settings (Disk Swap Memory)", + "磁盘缓存阈值 (MB)": "Disk Cache Threshold (MB)", "示例": "Exemple", "示例:{\"default\": [200, 100], \"vip\": [0, 1000]}。": "Exemple : {\"default\": [200, 100], \"vip\": [0, 1000]}.", "视频": "Vidéo", @@ -1798,6 +2223,7 @@ "禁用两步验证": "Désactiver l'authentification à deux facteurs", "禁用全部": "Désactiver tout", "禁用原因": "Raison de la désactivation", + "禁用后用户端不再展示,但历史订单不受影响。是否继续?": "Après désactivation, il ne sera plus affiché côté utilisateur, mais les commandes historiques ne sont pas affectées. Continuer ?", "禁用后的影响:": "Impact après la désactivation :", "禁用密钥失败": "Échec de la désactivation de la clé", "禁用思考处理的模型列表": "Liste noire des modèles pour le traitement thinking", @@ -1810,21 +2236,34 @@ "秒": "Seconde", "移除 functionResponse.id 字段": "Supprimer le champ functionResponse.id", "移除 One API 的版权标识必须首先获得授权,项目维护需要花费大量精力,如果本项目对你有意义,请主动支持本项目": "La suppression de la marque de copyright de One API doit d'abord être autorisée. La maintenance du projet demande beaucoup d'efforts. Si ce projet a du sens pour vous, veuillez le soutenir activement.", + "窗口:": "Window:", "窗口处理": "gestion des fenêtres", "窗口等待": "attente de la fenêtre", + "立即签到": "S'enregistrer maintenant", + "立即订阅": "S'abonner maintenant", "站点额度展示类型及汇率": "Type d'affichage du quota du site et taux de change", "端口号必须在1-65535之间": "Port number must be between 1-65535", "端口配置详细说明": "Limitez les requêtes externes à des ports spécifiques. Utilisez des ports uniques (80, 443) ou des plages (8000-8999). Une liste vide autorise tous les ports. La valeur par défaut inclut les ports Web courants.", "端点": "Point de terminaison", + "端点 URL 必须是完整地址(以 http:// 或 https:// 开头)": "Endpoint URL must be a full address (starting with http:// or https://)", "端点映射": "Mappage de points de terminaison", - "在模型广场向用户展示的端点": "Endpoint affiché aux utilisateurs dans la place de marché des modèles", "端点类型": "Type de point de terminaison", "端点组": "Groupe de points de terminaison", + "第三方支付配置": "Configuration des paiements tiers", "第三方账户绑定状态(只读)": "État de la liaison du compte tiers (lecture seule)", "等价金额:": "Montant équivalent : ", "等待中": "En attente", "等待获取邮箱信息...": "En attente d'obtenir des informations par e-mail...", "筛选": "Filtre", + "签到最大额度": "Quota maximum d'enregistrement", + "签到最小额度": "Quota minimum d'enregistrement", + "签到功能允许用户每日签到获取随机额度奖励": "La fonction d'enregistrement permet aux utilisateurs de s'enregistrer quotidiennement pour recevoir des récompenses de quota aléatoires", + "签到失败": "Échec de l'enregistrement", + "签到奖励将直接添加到您的账户余额": "Les récompenses d'enregistrement seront directement ajoutées à votre solde de compte", + "签到奖励的最大额度": "Quota maximum pour les récompenses d'enregistrement", + "签到奖励的最小额度": "Quota minimum pour les récompenses d'enregistrement", + "签到成功!获得": "Enregistrement réussi ! Reçu", + "签到设置": "Paramètres d'enregistrement", "管理": "Gérer", "管理 Ollama 模型的拉取和删除": "Manage Ollama model pulling and deletion", "管理你的 LinuxDO OAuth App": "Gérer votre application OAuth LinuxDO", @@ -1835,20 +2274,27 @@ "管理员未开启Stripe充值!": "L'administrateur n'a pas activé la recharge Stripe !", "管理员未开启在线充值!": "L'administrateur n'a pas activé la recharge en ligne !", "管理员未开启在线充值功能,请联系管理员开启或使用兑换码充值。": "L'administrateur n'a pas activé la fonction de recharge en ligne, veuillez contacter l'administrateur pour l'activer ou recharger avec un code d'échange.", + "管理员未开启在线支付功能,请联系管理员配置。": "Le paiement en ligne n'est pas activé par l'administrateur. Veuillez contacter l'administrateur.", "管理员未设置用户可选分组": "L'administrateur n'a pas défini de groupes sélectionnables par l'utilisateur", "管理员设置了外部链接,点击下方按钮访问": "L'administrateur a défini un lien externe, cliquez sur le bouton ci-dessous pour y accéder", "管理员账号": "Compte administrateur", "管理员账号已经初始化过,请继续设置其他参数": "Le compte administrateur a déjà été initialisé, veuillez continuer à définir d'autres paramètres", "管理模型、标签、端点等预填组": "Gérer les groupes pré-remplis de modèles, d'étiquettes, de points de terminaison, etc.", + "管理用户已绑定的第三方账户,支持筛选与解绑": "Manage third-party accounts bound to users, with filtering and unbinding support", + "管理绑定": "Manage Bindings", "类型": "Type", "粘贴图片失败": "Échec du collage de l'image", "精确": "Exact", + "精确名称匹配": "Exact Name Match", "系统": "Système", "系统令牌已复制到剪切板": "Le jeton système a été copié dans le presse-papiers", "系统任务记录": "Tâches système", "系统信息": "Informations système", "系统公告": "Avis système", + "系统公告已更新": "System announcement updated", + "系统公告更新失败": "Failed to update system announcement", "系统公告管理,可以发布系统通知和重要消息(最多100个,前端显示最新20条)": "Avis système, vous pouvez publier des avis système et des messages importants (maximum 100, afficher les 20 derniers sur le front-end)", + "系统内存": "System Memory", "系统初始化": "Initialisation du système", "系统初始化失败,请重试": "L'initialisation du système a échoué, veuillez réessayer", "系统初始化成功,正在跳转...": "Initialisation du système réussie, redirection en cours...", @@ -1857,6 +2303,7 @@ "系统名称已更新": "Nom du système mis à jour", "系统名称更新失败": "Échec de la mise à jour du nom du système", "系统已为该部署准备 Ollama 镜像与随机 API Key": "System has prepared Ollama image and random API Key for this deployment", + "系统性能监控": "Surveillance des performances du système", "系统提示覆盖": "Remplacement de l'invite système", "系统提示词": "Invite système", "系统提示词拼接": "Concaténation des invites système", @@ -1864,22 +2311,13 @@ "系统文档和帮助信息": "Documentation système et informations d'aide", "系统消息": "Messages système", "系统管理功能": "Fonctions de gestion du système", - "系统性能监控": "Surveillance des performances du système", - "启用性能监控后,当系统资源使用率超过设定阈值时,将拒绝新的 Relay 请求 (/v1, /v1beta 等),以保护系统稳定性。": "Lorsque la surveillance des performances est activée et que l'utilisation des ressources système dépasse le seuil défini, les nouvelles requêtes Relay (/v1, /v1beta, etc.) seront rejetées pour protéger la stabilité du système.", - "启用性能监控": "Activer la surveillance des performances", - "超过阈值时拒绝新请求": "Rejeter les nouvelles requêtes lorsque le seuil est dépassé", - "CPU 阈值 (%)": "Seuil CPU (%)", - "CPU 使用率超过此值时拒绝请求": "Rejeter les requêtes lorsque l'utilisation du CPU dépasse cette valeur", - "内存 阈值 (%)": "Seuil mémoire (%)", - "内存使用率超过此值时拒绝请求": "Rejeter les requêtes lorsque l'utilisation de la mémoire dépasse cette valeur", - "磁盘 阈值 (%)": "Seuil disque (%)", - "磁盘使用率超过此值时拒绝请求": "Rejeter les requêtes lorsque l'utilisation du disque dépasse cette valeur", - "保存性能设置": "Enregistrer les paramètres de performance", "系统设置": "Système", "系统访问令牌": "Jeton d'accès au système", "约": "Environ", "索引": "Index", "紧凑列表": "Liste compacte", + "累计签到": "Total des enregistrements", + "累计获得": "Total reçu", "线路描述": "Description de l'itinéraire", "组列表": "Liste des groupes", "组名": "Nom du groupe", @@ -1890,20 +2328,26 @@ "绑定": "Lier", "绑定 Telegram": "Lier Telegram", "绑定信息": "Informations de liaison", + "绑定后会立即生成用户订阅(无需支付),有效期按套餐配置计算。": "Après liaison, un abonnement utilisateur est créé immédiatement (sans paiement) ; la validité suit la configuration du plan.", "绑定微信账户": "Lier le compte WeChat", "绑定成功!": "Liaison réussie !", + "绑定订阅套餐": "Lier un plan d'abonnement", "绑定邮箱地址": "Lier l'adresse e-mail", + "结束": "Fin", "结束时间": "Heure de fin", "结果图片": "Résultat", + "结算差额": "Settlement Difference", "绘图": "Dessin", "绘图任务记录": "Tâches dessin", "绘图日志": "Dessins", "绘图设置": "Dessin", "统一的": "La Passerelle", "统计Tokens": "Jetons statistiques", + "统计已重置": "Statistics reset", "统计次数": "Nombre de statistiques", "统计额度": "Quota statistique", "继续": "Continuer", + "维护中": "Maintenance", "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Cache {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio : {{ratio}})", "缓存 Tokens": "Jetons de cache", "缓存: {{cacheRatio}}": "Cache : {{cacheRatio}}", @@ -1911,6 +2355,7 @@ "缓存价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存倍率: {{cacheRatio}})": "Prix du cache : {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (taux de cache : {{cacheRatio}})", "缓存倍率": "Ratio de cache", "缓存倍率 {{cacheRatio}}": "Ratio de cache {{cacheRatio}}", + "缓存写": "Écriture cache", "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Création de cache {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio : {{ratio}})", "缓存创建 Tokens": "Jetons de création de cache", "缓存创建: {{cacheCreationRatio}}": "Création de cache : {{cacheCreationRatio}}", @@ -1919,11 +2364,18 @@ "缓存创建: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Création de cache : 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", "缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存创建倍率: {{cacheCreationRatio}})": "Prix de création du cache : {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (taux de création de cache : {{cacheCreationRatio}})", "缓存创建价格合计:5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens": "Total du prix de création de cache : 5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens", + "缓存创建倍率": "Ratio de création du cache", "缓存创建倍率 {{cacheCreationRatio}}": "Ratio de création de cache {{cacheCreationRatio}}", "缓存创建倍率 1h {{cacheCreationRatio1h}}": "Multiplicateur de création de cache 1h {{cacheCreationRatio1h}}", "缓存创建倍率 5m {{cacheCreationRatio5m}}": "Multiplicateur de création de cache 5m {{cacheCreationRatio5m}}", "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Ratio de création de cache 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", + "缓存条目数": "Cache Entries", + "缓存目录": "Cache Directory", + "缓存目录磁盘空间": "Cache Directory Disk Space", + "缓存读": "Lecture cache", + "编号:": "ID:", "编辑": "Modifier", + "编辑 OAuth 提供商": "Edit OAuth Provider", "编辑API": "Modifier l'API", "编辑产品": "Modifier le produit", "编辑供应商": "Modifier le fournisseur", @@ -1936,12 +2388,14 @@ "编辑模式": "Mode d'édition", "编辑用户": "Modifier l'utilisateur", "编辑聊天配置": "Modifier la configuration de discussion", + "编辑规则": "Edit Rule", "编辑问答": "Modifier la FAQ", "缩词": "Raccourcir", "缺省 MaxTokens": "MaxTokens par défaut", "网站地址": "Adresse du site web", "网站域名标识": "ID de domaine du site Web", "网络连接失败,请检查网络设置或稍后重试": "Network connection failed, please check network settings or try again later", + "网络连接失败或服务器无响应": "Network connection failed or server not responding", "网络配置": "Network Configuration", "网络错误": "Erreur réseau", "置信度": "Confiance", @@ -1951,6 +2405,7 @@ "聊天区域": "Zone de discussion", "聊天应用名称": "Nom de l'application de discussion", "聊天应用名称已存在,请使用其他名称": "Le nom de l'application de discussion existe déjà, veuillez utiliser un autre nom", + "聊天数据解析失败": "Failed to parse chat data", "聊天设置": "Discussion", "聊天配置": "Configuration de la discussion", "聊天链接配置错误,请联系管理员": "Erreur de configuration du lien de discussion, veuillez contacter l'administrateur", @@ -1959,27 +2414,42 @@ "自动分组auto,从第一个开始选择": "Regroupement automatique auto, sélection à partir du premier", "自动刷新": "Auto Refresh", "自动刷新中": "Auto refreshing", + "自动填充字段": "Auto-fill Fields", "自动检测": "Détection automatique", "自动模式": "Mode automatique", "自动测试所有通道间隔时间": "Intervalle de test automatique pour tous les canaux", + "自动生成:": "Auto-generated: ", "自动禁用": "Désactivé automatiquement", "自动禁用关键词": "Mots-clés de désactivation automatique", + "自动禁用状态码": "Auto-disable status codes", + "自动禁用状态码格式不正确": "Invalid auto-disable status code format", "自动选择": "Sélection automatique", + "自动重试状态码": "Auto-retry status codes", + "自动重试状态码格式不正确": "Invalid auto-retry status code format", + "自定义": "Personnalisé", + "自定义 OAuth 提供商": "Custom OAuth Providers", + "自定义(秒)": "Personnalisé (sec)", "自定义充值数量选项": "Options de montant de recharge personnalisées", "自定义充值数量选项不是合法的 JSON 数组": "Les options de montant de recharge personnalisées ne sont pas un tableau JSON valide", "自定义变焦-提交": "Zoom personnalisé-Soumettre", "自定义模型名称": "Nom de modèle personnalisé", "自定义模式下不可用": "Non disponible en mode personnalisé", + "自定义渠道": "Custom Channel", + "自定义秒数": "Secondes personnalisées", + "自定义请求体格式错误,请检查JSON格式": "Custom request body format error, please check JSON format", "自定义请求体模式": "Mode de corps de requête personnalisé", "自定义货币": "Devise personnalisée", "自定义货币符号": "Symbole de devise personnalisé", "自定义镜像": "Custom Image", "自用模式": "Mode auto-utilisation", "自适应列表": "Liste adaptative", + "至": "jusqu'à", "节省": "Économiser", "花费": "Dépenser", "花费时间": "passer du temps", "若你的 OIDC Provider 支持 Discovery Endpoint,你可以仅填写 OIDC Well-Known URL,系统会自动获取 OIDC 配置": "Si votre fournisseur OIDC prend en charge le Discovery Endpoint, vous pouvez simplement remplir l'URL OIDC Well-Known, le système obtiendra automatiquement la configuration OIDC", + "获取 Discovery 配置": "Fetch Discovery Config", + "获取 Discovery 配置失败:": "Failed to fetch Discovery config: ", "获取 io.net API Key": "Get io.net API Key", "获取 OIDC 配置失败,请检查网络状况和 Well-Known URL 是否正确": "Échec de l'obtention de la configuration OIDC, veuillez vérifier l'état du réseau et si l'URL Well-Known est correcte", "获取 OIDC 配置成功!": "Configuration OIDC obtenue avec succès !", @@ -2000,12 +2470,17 @@ "获取模型列表": "Obtenir la liste des modèles", "获取模型列表失败": "Échec de la récupération de la liste des modèles", "获取渠道失败:": "Échec de l'obtention des canaux : ", + "获取用量失败": "Failed to get usage", "获取硬件类型失败: ": "Failed to get hardware types: ", + "获取签到状态失败": "Échec de la récupération du statut d'enregistrement", "获取组列表失败": "Échec de l'obtention de la liste des groupes", + "获取绑定信息失败": "Failed to get binding info", + "获取自定义 OAuth 提供商列表失败": "Failed to get custom OAuth provider list", "获取详情失败": "Failed to get details", "获取部署列表失败": "Failed to get deployment list", "获取金额失败": "Échec de l'obtention du montant", "获取验证码": "Obtenir le code de vérification", + "获得": "Reçu", "补全": "Achèvement", "补全 {{completion}} tokens / 1M tokens * {{symbol}}{{price}}": "Complétion {{completion}} tokens / 1M tokens * {{symbol}}{{price}}", "补全价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "Prix de complétion : {{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (taux de complétion : {{completionRatio}})", @@ -2019,12 +2494,21 @@ "表格视图": "Vue tableau", "覆盖模式:将完全替换现有的所有密钥": "Mode de remplacement : remplacera complètement toutes les clés existantes", "覆盖现有密钥": "Remplacer les clés existantes", + "规则": "Rule", + "规则 JSON": "Rule JSON", + "规则 JSON 格式不正确": "Rule JSON format is incorrect", + "规则 ttl_seconds 为 0 时使用。0 表示使用后端默认 TTL:3600 秒。": "Used when rule ttl_seconds is 0. 0 means using backend default TTL: 3600 seconds.", + "规则为 JSON 数组;可视化与 JSON 模式共用同一份数据。": "Rules are JSON arrays; visual and JSON modes share the same data.", + "规则名称(可读性更好,也会出现在管理侧日志中)。": "Rule name (for better readability, also appears in admin logs).", + "规则未找到,请刷新后重试": "Rule not found, please refresh and try again", "角色": "Rôle", "解析响应数据时发生错误": "Erreur lors de l'analyse des données de réponse", "解析密钥文件失败: {{msg}}": "Échec de l'analyse du fichier de clés : {{msg}}", "解析错误": "Erreur d'analyse", + "解绑": "Unbind", "解绑 Passkey": "Supprimer le Passkey", "解绑后将无法使用 Passkey 登录,确定要继续吗?": "Après la dissociation, vous ne pourrez plus vous connecter avec Passkey. Êtes-vous sûr de vouloir continuer ?", + "解绑成功": "Unbind successful", "计价币种": "Pricing Currency", "计算中": "Calculating", "计算成本": "Calculate Cost", @@ -2034,7 +2518,18 @@ "计费类型": "Type de facturation", "计费过程": "Processus de mise en lots", "订单号": "N° de commande", + "订阅": "Abonnement", + "订阅剩余": "Subscription Remaining", + "订阅套餐": "Plans d'abonnement", + "订阅套餐管理": "Gestion des plans d'abonnement", + "订阅实例": "Subscription Instance", + "订阅抵扣": "Subscription Deduction", + "订阅管理": "Gestion des abonnements", + "订阅结算": "Subscription Settlement", + "订阅说明": "Subscription Description", + "认证方式": "Auth Style", "讯飞星火": "Spark Desk", + "讯飞星火认知": "iFlytek Spark", "记录请求与错误日志IP": "Enregistrer l'adresse IP du journal des requêtes et des erreurs", "设备": "Device", "设备类型偏好": "Préférence de type d'appareil", @@ -2066,6 +2561,7 @@ "设置首页内容": "Définir le contenu de la page d'accueil", "设置默认地区和特定模型的专用地区": "Définir la région par défaut et les régions dédiées pour des modèles spécifiques", "设计与开发由": "Conçu et développé avec amour par", + "设计版本": "b80c3466cb6feafeb3990c7820e10e50", "访问 io.net 控制台的 API Keys 页面": "Visit the API Keys page of the io.net console", "访问容器": "Access Container", "访问模型部署功能需要先启用 io.net 部署服务": "Accessing model deployment features requires enabling the io.net deployment service first", @@ -2073,16 +2569,25 @@ "该供应商提供多种AI模型,适用于不同的应用场景。": "Ce fournisseur propose plusieurs modèles d'IA, adaptés à différents scénarios d'application.", "该分类下没有可用模型": "Aucun modèle disponible dans cette catégorie", "该域名已存在于白名单中": "Ce nom de domaine existe déjà dans la liste blanche", + "该套餐未配置 Creem": "Ce plan n'est pas configuré pour Creem", + "该套餐未配置 Stripe": "Ce plan n'est pas configuré pour Stripe", "该数据可能不可信,请谨慎使用": "Ces données peuvent ne pas être fiables, veuillez les utiliser avec prudence", "该服务器地址将影响支付回调地址以及默认首页展示的地址,请确保正确配置": "Cette adresse de serveur affectera l'adresse de rappel de paiement et l'adresse affichée sur la page d'accueil par défaut, veuillez vous assurer d'une configuration correcte", "该模型存在固定价格与倍率计费方式冲突,请确认选择": "Le modèle a un conflit de méthode de facturation à prix fixe et à ratio, veuillez confirmer la sélection", "该渠道已开启请求透传,参数覆写、模型重定向等 NewAPI 内置功能将失效,非最佳实践。": "La transmission des requêtes est activée pour ce canal ; les fonctionnalités intégrées de NewAPI (comme la surcharge des paramètres et la redirection de modèle) seront désactivées. Ce n'est pas une bonne pratique.", "该渠道已开启请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "La transmission des requêtes est activée pour ce canal. Les fonctionnalités intégrées de NewAPI (surcharge des paramètres, redirection de modèle, adaptation du canal, etc.) seront désactivées. Ce n'est pas une bonne pratique. Si cela cause des problèmes, merci de ne pas ouvrir d'issue.", + "该规则未启用“作用域:包含规则名称”,无法按规则清空缓存。": "This rule has not enabled \"Scope: Include Rule Name\", cannot clear cache by rule.", + "该规则的缓存保留时长;0 表示使用默认 TTL:": "Cache retention duration for this rule; 0 uses the default TTL:", + "该记录不包含可用的 token 统计口径。": "This record does not contain available token statistics.", "详情": "Détails", + "语言偏好": "Language Preference", + "语言偏好已保存": "Language preference saved", "语音输入": "Entrée vocale", "语音输出": "Sortie vocale", "说明": "Description", "说明:": "Description :", + "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。": "Remarque : les tests sur cette page utilisent des requêtes non-streaming. Si un canal ne prend en charge que les réponses en streaming, les tests peuvent échouer. Veuillez vous référer à l’usage réel.", + "说明:生成结果是可直接粘贴到渠道密钥里的 JSON(包含 access_token / refresh_token / account_id)。": "Note: The generated result is a JSON that can be directly pasted into the channel secret (contains access_token / refresh_token / account_id).", "说明信息": "Description", "请上传密钥文件": "Veuillez télécharger le fichier de clé", "请上传密钥文件!": "Veuillez télécharger le fichier de clé !", @@ -2090,13 +2595,20 @@ "请使用 Project 为 io.cloud 的密钥": "Please use a key with Project set to io.cloud", "请先在设置中启用图片功能": "Veuillez d'abord activer la fonction image dans les paramètres", "请先填写 API Key": "Please fill in API Key first", + "请先填写 Discovery URL 或 Issuer URL": "Please fill in Discovery URL or Issuer URL first", + "请先填写 Issuer URL,以自动生成完整的端点 URL": "Please fill in Issuer URL first to auto-generate full endpoint URLs", "请先填写 Ollama API 地址": "Please fill in Ollama API address first", "请先填写服务器地址": "Veuillez d'abord remplir l'adresse du serveur", + "请先粘贴回调 URL": "Please paste callback URL first", "请先输入密钥": "Veuillez d'abord saisir la clé", "请先选择同步渠道": "Veuillez d'abord sélectionner le canal de synchronisation", "请先选择模型!": "Veuillez d'abord sélectionner un modèle !", "请先选择硬件类型": "Please select hardware type first", + "请先选择要删除的API信息": "Please select the API info to delete first", "请先选择要删除的令牌!": "Veuillez sélectionner le jeton à supprimer !", + "请先选择要删除的分类": "Please select the category to delete first", + "请先选择要删除的常见问答": "Please select the FAQ to delete first", + "请先选择要删除的系统公告": "Please select the announcement to delete first", "请先选择要删除的通道!": "Veuillez d'abord sélectionner le canal que vous souhaitez supprimer !", "请先选择要设置标签的渠道!": "Veuillez d'abord sélectionner le canal pour lequel définir les étiquettes !", "请先选择需要批量设置的模型": "Veuillez d'abord sélectionner les modèles pour le paramétrage par lots", @@ -2105,8 +2617,12 @@ "请前往个人设置 → 安全设置进行配置。": "Veuillez aller dans Paramètres personnels → Paramètres de sécurité pour configurer.", "请勿过度信任此功能,IP可能被伪造,请配合nginx和cdn等网关使用": "Ne faites pas trop confiance à cette fonctionnalité, l'IP peut être usurpée, veuillez l'utiliser en conjonction avec des passerelles telles que nginx et cdn", "请在系统设置页面编辑分组倍率以添加新的分组:": "Veuillez modifier les ratios de groupe dans les paramètres système pour ajouter de nouveaux groupes :", + "请填写完整的API信息": "Please fill in complete API info", "请填写完整的产品信息": "Veuillez renseigner l'ensemble des informations produit", + "请填写完整的公告信息": "Please fill in complete announcement info", + "请填写完整的分类信息": "Please fill in complete category info", "请填写完整的管理员账号信息": "Veuillez remplir les informations complètes du compte administrateur", + "请填写完整的问答信息": "Please fill in complete FAQ info", "请填写密钥": "Veuillez saisir la clé", "请填写渠道名称和渠道密钥!": "Veuillez saisir le nom et la clé du canal !", "请填写部署地区": "Veuillez remplir la région de déploiement", @@ -2116,24 +2632,31 @@ "请检查表单填写是否正确": "Veuillez vérifier si le formulaire est correctement rempli", "请检查输入": "Veuillez vérifier votre saisie", "请求体 JSON": "Corps de requête JSON", + "请求体内存缓存": "Request Body Memory Cache", + "请求体磁盘缓存": "Request Body Disk Cache", + "请求体超过此大小时使用磁盘缓存": "Use disk cache when request body exceeds this size", "请求参数无效": "Invalid request parameters", "请求发生错误": "Une erreur s'est produite lors de la demande", "请求发生错误: ": "Une erreur s'est produite lors de la demande : ", "请求后端接口失败:": "Échec de la requête de l'interface backend : ", "请求失败": "Échec de la demande", "请求头覆盖": "Remplacement des en-têtes de demande", + "请求头覆盖必须是合法的 JSON 格式!": "Header override must be valid JSON format!", "请求并计费模型": "Modèle de demande et de facturation", "请求时长: ${time}s": "Durée de la requête : ${time}s", "请求次数": "Nombre de demandes", "请求结束后多退少补": "Ajuster après la fin de la demande", "请求超时,请刷新页面后重新发起 GitHub 登录": "Délai dépassé, veuillez actualiser la page puis relancer la connexion GitHub", "请求路径": "Chemin de requête", + "请求转换": "Request conversion", "请求预扣费额度": "Quota de pré-déduction pour les demandes", "请点击我": "Veuillez cliquer sur moi", "请确认以下设置信息,点击\"初始化系统\"开始配置": "Veuillez confirmer les informations de configuration suivantes, cliquez sur \"Initialiser le système\" pour commencer la configuration", "请确认您已了解禁用两步验证的后果": "Veuillez confirmer que vous comprenez les conséquences de la désactivation de l'authentification à deux facteurs", "请确认管理员密码": "Veuillez confirmer le mot de passe de l'administrateur", "请稍后几秒重试,Turnstile 正在检查用户环境!": "Veuillez réessayer dans quelques secondes, Turnstile vérifie l'environnement utilisateur !", + "请立刻修改默认密码!": "Please change the default password immediately!", + "请粘贴完整回调 URL(包含 code 与 state)": "Please paste the full callback URL (containing code and state)", "请联系管理员在系统设置中配置API信息": "Veuillez contacter l'administrateur pour configurer les informations de l'API dans les paramètres système.", "请联系管理员在系统设置中配置Uptime": "Veuillez contacter l'administrateur pour configurer Uptime dans les paramètres système.", "请联系管理员在系统设置中配置公告信息": "Veuillez contacter l'administrateur pour configurer les informations d'avis dans les paramètres système.", @@ -2146,12 +2669,22 @@ "请至少选择一个渠道": "Veuillez sélectionner au moins un canal", "请输入 API Key,一行一个,格式:APIKey|Region": "Saisissez une API Key par ligne, format : APIKey|Region", "请输入 API Key,格式:APIKey|Region": "Saisissez l'API Key au format : APIKey|Region", + "请输入 Authorization Endpoint": "Please enter Authorization Endpoint", "请输入 AZURE_OPENAI_ENDPOINT,例如:https://docs-test-001.openai.azure.com": "Veuillez saisir AZURE_OPENAI_ENDPOINT, par exemple : https://docs-test-001.openai.azure.com", + "请输入 Client ID": "Please enter Client ID", + "请输入 Client Secret": "Please enter Client Secret", "请输入 io.net API Key": "Please enter io.net API Key", "请输入 io.net API Key(敏感信息不显示)": "Please enter io.net API Key (sensitive information not displayed)", + "请输入 JSON 格式的 OAuth 凭据,例如:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}": "Please enter OAuth credentials in JSON format, e.g.:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}", "请输入 JSON 格式的密钥内容,例如:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}": "Veuillez saisir le contenu de la clé au format JSON, par exemple :\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}", "请输入 OIDC 的 Well-Known URL": "Veuillez saisir l'URL Well-Known de l'OIDC", + "请输入 Slug": "Please enter Slug", + "请输入 Token Endpoint": "Please enter Token Endpoint", + "请输入 User Info Endpoint": "Please enter User Info Endpoint", + "请输入6位验证码": "Please enter 6-digit verification code", "请输入6位验证码或8位备用码": "Veuillez saisir le code de vérification à 6 chiffres ou le code de sauvegarde à 8 chiffres", + "请输入8位备用码": "Please enter 8-digit backup code", + "请输入Account ID,例如:d6b5da8hk1awo8nap34ube6gh": "Please enter Account ID, e.g.: d6b5da8hk1awo8nap34ube6gh", "请输入API地址": "Veuillez saisir l'adresse de l'API", "请输入API地址!": "Veuillez saisir l'adresse de l'API !", "请输入Bark推送URL": "Veuillez saisir l'URL de notification Bark", @@ -2185,6 +2718,7 @@ "请输入图标名称": "Veuillez saisir le nom de l'icône", "请输入填充值": "Veuillez saisir une valeur", "请输入备注(仅管理员可见)": "Veuillez saisir une remarque (visible uniquement par les administrateurs)", + "请输入套餐标题": "Veuillez saisir le titre du plan", "请输入完整的 JSON 格式密钥内容": "Veuillez saisir le contenu complet de la clé au format JSON", "请输入完整的URL,例如:https://api.openai.com/v1/chat/completions": "Veuillez saisir l'URL complète, par exemple : https://api.openai.com/v1/chat/completions", "请输入完整的URL链接": "Veuillez saisir le lien URL complet", @@ -2195,6 +2729,7 @@ "请输入密钥,一行一个,格式:AccessKey|SecretAccessKey|Region": "Saisissez les clés une par ligne, format : AccessKey|SecretAccessKey|Region", "请输入密钥!": "Veuillez saisir la clé !", "请输入延长时长": "Please enter extension duration", + "请输入总额度": "Veuillez saisir le quota total", "请输入您的密码": "Veuillez saisir votre mot de passe", "请输入您的用户名以确认删除": "Veuillez saisir votre nom d'utilisateur pour confirmer la suppression", "请输入您的用户名或邮箱地址": "Veuillez saisir votre nom d'utilisateur ou votre adresse e-mail", @@ -2212,7 +2747,9 @@ "请输入新的用户名": "Veuillez saisir un nouveau nom d'utilisateur", "请输入新的部署名称": "Please enter new deployment name", "请输入显示名称": "Veuillez saisir un nom d'affichage", + "请输入智能体ID,例如:7342866812345": "Please enter Agent ID, e.g.: 7342866812345", "请输入有效的JSON格式的请求体。您可以参考预览面板中的默认请求体格式。": "Veuillez entrer un corps de requête au format JSON valide. Vous pouvez vous référer au format de corps de requête par défaut dans le panneau d'aperçu.", + "请输入有效的URL地址": "Please enter a valid URL", "请输入有效的数字": "Veuillez saisir un nombre valide", "请输入有效的镜像地址": "Please enter a valid image address", "请输入标签名称": "Veuillez saisir le nom de l'étiquette", @@ -2227,7 +2764,10 @@ "请输入状态页面的Slug,如:my-status": "Veuillez saisir le slug de la page d'état, tel que : my-status", "请输入生成数量": "Veuillez saisir la quantité à générer", "请输入用户名": "Veuillez saisir un nom d'utilisateur", + "请输入用户名和密码!": "Please enter username and password!", + "请输入知识库 ID,例如:123456": "Please enter Knowledge Base ID, e.g.: 123456", "请输入私有部署地址,格式为:https://fastgpt.run/api/openapi": "Veuillez saisir l'adresse de déploiement privée, format : https://fastgpt.run/api/openapi", + "请输入秒数": "Veuillez saisir le nombre de secondes", "请输入管理员密码": "Veuillez saisir le mot de passe de l'administrateur", "请输入管理员用户名": "Veuillez saisir le nom d'utilisateur de l'administrateur", "请输入线路描述": "Veuillez saisir la description de l'itinéraire", @@ -2238,6 +2778,7 @@ "请输入补全倍率": "Saisir le ratio d'achèvement", "请输入要延长的小时数": "Please enter the number of hours to extend", "请输入要设置的标签名称": "Veuillez saisir le nom de l'étiquette à définir", + "请输入认证器应用显示的验证码完成登录": "Enter the verification code from your authenticator app to complete login", "请输入认证器验证码": "Veuillez saisir le code de vérification de l'authentificateur", "请输入认证器验证码或备用码": "Veuillez saisir le code de vérification de l'authentificateur ou le code de sauvegarde", "请输入说明": "Veuillez saisir la description", @@ -2248,6 +2789,7 @@ "请输入部署名称": "Please enter deployment name", "请输入部署名称以完成二次确认": "Enter deployment name to complete secondary confirmation", "请输入部署地区,例如:us-central1\n支持使用模型映射格式\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}": "Veuillez saisir la région de déploiement, par exemple : us-central1\nPrend en charge l'utilisation du format de mappage de modèle\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}", + "请输入金额": "Veuillez saisir le montant", "请输入镜像地址": "Please enter image address", "请输入问题标题": "Veuillez saisir le titre de la question", "请输入预警阈值": "Veuillez saisir le seuil d'alerte", @@ -2269,6 +2811,7 @@ "请选择多密钥使用策略": "Veuillez sélectionner la stratégie d'utilisation de plusieurs clés", "请选择密钥更新模式": "Veuillez sélectionner le mode de mise à jour des clés", "请选择密钥格式": "Veuillez sélectionner le format de clé", + "请选择支付方式": "Please select a payment method", "请选择日志记录时间": "Veuillez sélectionner l'heure d'enregistrement du journal", "请选择模型": "Veuillez sélectionner un modèle", "请选择模型。": "Veuillez sélectionner un modèle.", @@ -2277,6 +2820,7 @@ "请选择硬件类型": "Please select hardware type", "请选择组类型": "Veuillez sélectionner le type de groupe", "请选择至少一个部署位置": "Please select at least one deployment location", + "请选择订阅套餐": "Please select a subscription plan", "请选择该令牌支持的模型,留空支持所有模型": "Sélectionnez les modèles pris en charge par le jeton, laissez vide pour prendre en charge tous les modèles", "请选择该渠道所支持的模型": "Veuillez sélectionner le modèle pris en charge par ce canal", "请选择该渠道所支持的模型,留空则不更改": "Veuillez sélectionner les modèles pris en charge par le canal, laisser vide ne changera rien", @@ -2291,6 +2835,7 @@ "警告:启用保活后,如果已经写入保活数据后渠道出错,系统无法重试,如果必须开启,推荐设置尽可能大的Ping间隔": "Avertissement : après l'activation du keep-alive, si une erreur de canal se produit après l'écriture des données de keep-alive, le système ne peut pas réessayer. Si vous devez l'activer, il est recommandé de définir un intervalle Ping aussi grand que possible", "警告:禁用两步验证将永久删除您的验证设置和所有备用码,此操作不可撤销!": "Avertissement : la désactivation de l'authentification à deux facteurs supprimera définitivement vos paramètres de vérification et tous les codes de sauvegarde. Cette action est irréversible !", "豆包": "Doubao", + "豆包视频": "Doubao Video", "账单": "Factures", "账户充值": "Recharge de compte", "账户已删除!": "Le compte a été supprimé !", @@ -2299,20 +2844,29 @@ "账户管理": "Gestion de compte", "账户绑定": "Liaison de compte", "账户绑定、安全设置和身份验证": "Liaison de compte, paramètres de sécurité et vérification d'identité", + "账户绑定管理": "Account Binding Management", "账户统计": "Statistiques du compte", "货币": "Devise", "货币单位": "Unité monétaire", + "购买上限": "Limite d'achat", "购买兑换码": "Acheter un code d'échange", + "购买套餐后即可享受模型权益": "Profitez des avantages du modèle après l'achat d'un plan", + "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。": "L'achat ou l'ajout manuel d'un abonnement mettra à niveau vers ce groupe. À l'expiration ou en cas d'invalidation/suppression, il reviendra au groupe précédent. Le retour n'est pas immédiat et prend généralement quelques minutes.", + "购买订阅套餐": "Acheter un plan d'abonnement", "费用信息": "Cost Information", "费用预估": "Cost Estimate", "资源消耗": "Consommation de ressources", "起始时间": "Heure de début", "超级管理员": "Super Admin", "超级管理员未设置充值链接!": "Le super administrateur n'a pas défini le lien de recharge !", + "超过阈值时拒绝新请求": "Rejeter les nouvelles requêtes lorsque le seuil est dépassé", + "距离重置:": "Time until reset:", "跟随日志": "Follow Logs", "跟随系统主题设置": "Suivre le thème du système", "跨分组": "Inter-groupes", "跨分组重试": "Nouvelle tentative inter-groupes", + "路径正则": "Path Regex", + "路径正则(每行一个)": "Path Regex (one per line)", "跳转": "Sauter", "轮询": "Sondage", "轮询模式": "Mode de sondage", @@ -2343,7 +2897,9 @@ "输入要添加的邮箱域名": "Saisir le domaine e-mail à ajouter", "输入认证器应用显示的6位数字验证码": "Saisissez le code de vérification à 6 chiffres affiché sur l'application d'authentification", "输入邮箱地址": "Saisir l'adresse e-mail", + "输入金额": "Entrer le montant", "输入项目名称,按回车添加": "Saisissez le nom de l'élément, appuyez sur Entrée pour ajouter", + "输入额度": "Entrer le quota", "输入验证码": "Saisir le code de vérification", "输入验证码完成设置": "Saisissez le code de vérification pour terminer la configuration", "输出": "Sortie", @@ -2352,6 +2908,9 @@ "输出价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "Prix de sortie : {{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (ratio d'achèvement : {{completionRatio}})", "输出倍率 {{completionRatio}}": "Ratio de sortie {{completionRatio}}", "边栏设置": "Barre latérale", + "迁移失败: ": "Migration failed: ", + "迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。": "Data format conversion is handled automatically during migration. Old config will be cleared after migration, please backup in database before migrating.", + "过期于": "Expire le", "过期时间": "Date d'expiration", "过期时间不能早于当前时间!": "La date d'expiration ne peut pas être antérieure à l'heure actuelle !", "过期时间快捷设置": "Paramètres rapides de la date d'expiration", @@ -2361,15 +2920,18 @@ "运行命令 (Command)": "Command", "运行时长": "Runtime Duration", "运行时长(小时)": "Runtime Duration (hours)", + "近 30 天": "Last 30 Days", + "近 7 天": "Last 7 Days", "返回修改": "Revenir pour modifier", "返回登录": "Retour à la connexion", - "违规扣费金额": "Montant de la déduction de violation", - "这是重复键中的最后一个,其值将被使用": "Ceci est la dernière clé dupliquée, sa valeur sera utilisée", - "这是基础金额,实际扣费 = 基础金额 x 系统分组倍率。": "Ceci est le montant de base. Déduction réelle = montant de base × ratio de groupe système.", "这将删除超过 10 分钟未使用的临时缓存文件": "Cela supprimera les fichiers de cache temporaires non utilisés depuis plus de 10 minutes", + "这是基础金额,实际扣费 = 基础金额 x 系统分组倍率。": "Ceci est le montant de base. Déduction réelle = montant de base × ratio de groupe système.", + "这是重复键中的最后一个,其值将被使用": "Ceci est la dernière clé dupliquée, sa valeur sera utilisée", "进度": "calendrier", "进行中": "En cours", "进行该操作时,可能导致渠道访问错误,请仅在数据库出现问题时使用": "Lors de cette opération, cela peut entraîner des erreurs d'accès au canal. Veuillez ne l'utiliser que lorsqu'il y a un problème avec la base de données.", + "违规扣费": "Violation Charge", + "违规扣费金额": "Montant de la déduction de violation", "连接保活设置": "Maintien connexion", "连接已断开": "Connexion interrompue", "连接测试中...": "Testing connection...", @@ -2377,6 +2939,7 @@ "追加模式:将新密钥添加到现有密钥列表末尾": "Mode d'ajout : ajouter les nouvelles clés à la fin de la liste de clés existantes", "追加模式:新密钥将添加到现有密钥列表的末尾": "Mode d'ajout : les nouvelles clés seront ajoutées à la fin de la liste de clés existantes", "退出": "Quitter", + "退款": "Remboursement", "适用于个人使用的场景,不需要设置模型价格": "Adapté à un usage personnel, pas besoin de définir le prix du modèle.", "适用于为多个用户提供服务的场景": "Adapté aux scénarios où plusieurs utilisateurs sont fournis.", "适用于展示系统功能的场景,提供基础功能演示": "Adapté aux scénarios où les fonctions du système sont affichées, fournissant des démonstrations de fonctionnalités de base.", @@ -2387,6 +2950,7 @@ "选择同步渠道": "Sélectionner le canal de synchronisation", "选择同步语言": "Sélectionner la langue de synchronisation", "选择容器": "Select Container", + "选择您的首选界面语言,设置将自动保存并同步到所有设备": "Select your preferred interface language. Settings will be saved automatically and synced across all devices", "选择成功": "Sélection réussie", "选择支付方式": "Sélectionner le mode de paiement", "选择支持的认证设备类型": "Choisissez les types d'appareils d'authentification pris en charge", @@ -2402,9 +2966,11 @@ "选择系统运行模式": "Sélectionner le mode de fonctionnement du système", "选择组类型": "Sélectionner le type de groupe", "选择要覆盖的冲突项": "Sélectionner les éléments en conflit à remplacer", + "选择订阅套餐": "Sélectionner un plan d'abonnement", "选择语言": "Sélectionner la langue", "选择过期时间(可选,留空为永久)": "Sélectionnez la date d'expiration (facultatif, laissez vide pour permanent)", "选择部署位置(可多选)": "Select deployment location(s) (multiple selections allowed)", + "选择预设模板(可选)": "Select Preset Template (optional)", "透传请求体": "Corps de transmission", "通义千问": "Qwen", "通用设置": "Général", @@ -2441,6 +3007,7 @@ "邮箱地址": "Adresse e-mail", "邮箱域名格式不正确,请输入有效的域名,如 gmail.com": "Le format du domaine e-mail est incorrect, veuillez saisir un domaine valide, comme gmail.com", "邮箱域名白名单格式不正确": "Le format de la liste blanche des domaines e-mail est incorrect", + "邮箱字段(可选)": "Email Field (optional)", "邮箱账户绑定成功!": "Liaison du compte e-mail réussie !", "部分保存失败": "Certains paramètres n'ont pas pu être enregistrés", "部分保存失败,请重试": "Échec de l'enregistrement partiel, veuillez réessayer", @@ -2471,6 +3038,8 @@ "配置 Turnstile": "Configurer Turnstile", "配置 WeChat Server": "Configurer le serveur WeChat", "配置和消息已全部重置": "La configuration et les messages ont été entièrement réinitialisés", + "配置套餐的有效时长": "Configurer la durée de validité du plan", + "配置如何从用户信息 API 响应中提取用户数据,支持 JSONPath 语法": "Configure how to extract user data from user info API response, supports JSONPath syntax", "配置完成后刷新页面即可使用模型部署功能": "After configuration is complete, refresh the page to use the model deployment feature", "配置导入成功": "Importation de la configuration réussie", "配置已导出到下载文件夹": "La configuration a été exportée vers le dossier de téléchargement", @@ -2481,7 +3050,9 @@ "配置服务器端请求伪造(SSRF)防护,用于保护内网资源安全": "Configurez la protection contre la falsification de requêtes côté serveur (SSRF) pour sécuriser les ressources du réseau interne", "配置模型部署服务提供商的API密钥和启用状态": "Configure the API key and enabled status of the model deployment service provider", "配置登录注册": "Configurer la connexion/l'inscription", + "配置自定义 OAuth 提供商,支持 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 协议的身份提供商": "Configure custom OAuth providers, supports GitHub Enterprise, GitLab, Gitea, Nextcloud, Keycloak, ORY and other OAuth 2.0 compatible identity providers", "配置说明": "Instructions de configuration", + "配置迁移确认": "Config Migration Confirmation", "配置邮箱域名白名单": "Configurer la liste blanche des domaines e-mail", "重启部署失败": "Failed to restart deployment", "重命名部署": "Rename Deployment", @@ -2495,26 +3066,31 @@ "重新生成备用码失败": "Échec de la régénération des codes de sauvegarde", "重新生成备用码将使现有的备用码失效,请确保您已保存了当前的备用码。": "La régénération des codes de sauvegarde invalidera les codes de sauvegarde existants. Veuillez vous assurer que vous avez enregistré les codes de sauvegarde actuels.", "重绘": "Varier", + "重置": "Réinitialisation", "重置 2FA": "Réinitialiser 2FA", "重置 Passkey": "Réinitialiser le Passkey", "重置为默认": "Réinitialiser aux valeurs par défaut", + "重置周期": "Période de réinitialisation", + "重置失败": "Reset failed", + "重置时间:": "Reset time:", "重置模型倍率": "Réinitialiser le ratio de modèle", + "重置统计": "Reset Stats", "重置选项": "Options de réinitialisation", "重置邮件发送成功,请检查邮箱!": "L'e-mail de réinitialisation a été envoyé avec succès, veuillez vérifier votre e-mail !", "重置配置": "Réinitialiser la configuration", "重要提醒": "Important Notice", "重试": "Réessayer", "重试连接": "Retry Connection", + "金额": "Montant", "钱包管理": "Portefeuille", "链接中的{key}将自动替换为sk-xxxx,{address}将自动替换为系统设置的服务器地址,末尾不带/和/v1": "Le {key} dans le lien sera automatiquement remplacé par sk-xxxx, le {address} sera automatiquement remplacé par l'adresse du serveur dans les paramètres système, et la fin n'aura pas / et /v1", "销毁容器": "Destroy Container", "销毁容器失败": "Failed to destroy container", "错误": "Erreur", - "退款": "Remboursement", + "错误:": "Error: ", + "错误:服务器内部错误,请联系管理员!": "Error: Internal server error, please contact administrator!", + "错误:请求次数过多,请稍后再试!": "Error: Too many requests, please try again later!", "错误详情": "Détails de l'erreur", - "异步任务退款": "Remboursement de tâche asynchrone", - "任务ID": "ID de tâche", - "失败原因": "Raison de l'échec", "键为分组名称,值为另一个 JSON 对象,键为分组名称,值为该分组的用户的特殊分组倍率,例如:{\"vip\": {\"default\": 0.5, \"test\": 1}},表示 vip 分组的用户在使用default分组的令牌时倍率为0.5,使用test分组时倍率为1": "La clé est le nom du groupe, la valeur est un autre objet JSON, la clé est le nom du groupe, la valeur est le ratio de groupe spécial des utilisateurs de ce groupe, par exemple : {\"vip\": {\"default\": 0.5, \"test\": 1}}, ce qui signifie que les utilisateurs du groupe vip ont un ratio de 0.5 lors de l'utilisation de jetons du groupe default et un ratio de 1 lors de l'utilisation du groupe test", "键为原状态码,值为要复写的状态码,仅影响本地判断": "La clé est le code d'état d'origine, la valeur est le code d'état à réécrire, n'affecte que le jugement local", "键为用户分组名称,值为操作映射对象。内层键以\"+:\"开头表示添加指定分组(键值为分组名称,值为描述),以\"-:\"开头表示移除指定分组(键值为分组名称),不带前缀的键直接添加该分组。例如:{\"vip\": {\"+:premium\": \"高级分组\", \"special\": \"特殊分组\", \"-:default\": \"默认分组\"}},表示 vip 分组的用户可以使用 premium 和 special 分组,同时移除 default 分组的访问权限": "La clé correspond au nom du groupe d'utilisateurs et la valeur à un objet de mappage des opérations. Les clés internes commençant par \"+:\" ajoutent le groupe indiqué (clé = nom du groupe, valeur = description), celles commençant par \"-:\" retirent le groupe indiqué, et les clés sans préfixe ajoutent directement ce groupe. Exemple : {\"vip\": {\"+:premium\": \"Groupe avancé\", \"special\": \"Groupe spécial\", \"-:default\": \"Groupe par défaut\"}} signifie que les utilisateurs du groupe vip peuvent accéder aux groupes premium et special tout en perdant l'accès au groupe default.", @@ -2527,12 +3103,17 @@ "镜像地址": "Image Address", "镜像选择": "Image Selection", "镜像配置": "Image Configuration", + "问答已删除,请及时点击”保存设置”进行保存": "FAQ deleted, please click \"Save Settings\" to save", + "问答已更新,请及时点击”保存设置”进行保存": "FAQ updated, please click \"Save Settings\" to save", + "问答已添加,请及时点击”保存设置”进行保存": "FAQ added, please click \"Save Settings\" to save", "问题标题": "Titre de la question", "队列中": "En file d'attente", + "阿里通义千问": "Alibaba Tongyi Qianwen", "降低您账户的安全性": "Réduire la sécurité de votre compte", "降级": "Rétrograder", "限制周期": "Période de limite", "限制周期统一使用上方配置的“限制周期”值。": "La période de limite utilise uniformément la valeur \"période de limite\" configurée ci-dessus.", + "限购": "Limite", "隐私政策": "Politique de confidentialité", "隐私政策已更新": "La politique de confidentialité a été mise à jour", "隐私政策更新失败": "Échec de la mise à jour de la politique de confidentialité", @@ -2550,194 +3131,89 @@ "需要重新完整设置才能再次启用": "Nécessite une nouvelle configuration pour être réactivé", "非必要,不建议启用模型限制": "Non nécessaire, les restrictions de modèle ne sont pas recommandées", "非流": "Non flux", + "音乐预览": "Aperçu musical", "音频倍率(仅部分模型支持该计费)": "Ratio audio (seuls certains modèles prennent en charge cette facturation)", "音频提示 {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}": "Invite audio {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + achèvement audio {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}", "音频提示价格:{{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens (音频倍率: {{audioRatio}})": "Prix de l'invite audio : {{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens (ratio audio : {{audioRatio}})", + "音频无法播放": "Impossible de lire l'audio", "音频补全价格:{{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens (音频补全倍率: {{audioCompRatio}})": "Prix d'achèvement audio : {{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens (ratio d'achèvement audio : {{audioCompRatio}})", "音频补全倍率(仅部分模型支持该计费)": "Ratio d'achèvement audio (seuls certains modèles prennent en charge cette facturation)", "音频输入相关的倍率设置,键为模型名称,值为倍率": "Paramètres de ratio liés à l'entrée audio, la clé est le nom du modèle, la valeur est le ratio", "音频输出补全相关的倍率设置,键为模型名称,值为倍率": "Paramètres de ratio liés à l'achèvement de la sortie audio, la clé est le nom du modèle, la valeur est le ratio", "页脚": "Pied de page", + "页脚内容已更新": "Footer content updated", + "页脚内容更新失败": "Failed to update footer content", "页面未找到,请检查您的浏览器地址是否正确": "Page non trouvée, veuillez vérifier si l'adresse de votre navigateur est correcte", "顶栏管理": "En-tête", "项目": "Élément", "项目内容": "Contenu de l'élément", "项目操作按钮组": "Groupe de boutons d'action du projet", "预估总费用": "Estimated Total Cost", + "预估总额度": "Quota total estimé", "预估费用仅供参考,实际费用可能略有差异": "Estimated cost is for reference only, actual cost may vary slightly", "预填组管理": "Groupe pré-rempli", + "预扣": "Pre-charge", "预览失败": "Échec de l'aperçu", "预览更新": "Mise à jour de l'aperçu", "预览请求体": "Aperçu du corps de la requête", "预计结束": "Estimated End", + "预设模板": "Preset Template", "预警阈值必须为正数": "Le seuil d'alerte doit être un nombre positif", "频率惩罚,减少重复词汇的出现": "Pénalité de fréquence, réduit la répétition des mots", "频率限制的周期(分钟)": "Période de limitation de débit (minutes)", "颜色": "Couleur", "额度": "Quota", - "输入额度": "Entrer le quota", - "金额": "Montant", - "输入金额": "Entrer le montant", - "仅用于换算,实际保存的是额度": "Uniquement pour la conversion, c'est le quota qui est enregistré", + "额度充值": "Recharge de quota", "额度必须大于0": "Le quota doit être supérieur à 0", "额度提醒阈值": "Seuil de rappel de quota", "额度查询接口返回令牌额度而非用户额度": "Affiche le quota de jetons au lieu du quota utilisateur", "额度设置": "Quota", + "额度重置": "Réinitialisation du quota", "额度预警阈值": "Seuil d'avertissement de quota", "首尾生视频": "Vidéo de début et de fin", "首页": "Accueil", "首页内容": "Contenu de la page d'accueil", + "首页内容已更新": "Homepage content updated", + "首页内容更新失败": "Failed to update homepage content", "验证": "Vérifier", "验证 Passkey": "Vérifier Passkey", "验证失败,请重试": "Échec de la vérification, veuillez réessayer", + "验证并登录": "Verify and Login", "验证成功": "Vérification réussie", "验证数据库连接状态": "Vérifier l'état de la connexion à la base de données", "验证码": "Code de vérification", + "验证码发送成功,请检查你的邮箱!": "Verification code sent, please check your email!", "验证码发送成功,请检查邮箱!": "Le code de vérification a été envoyé avec succès, veuillez vérifier votre e-mail !", + "验证码必须是6位数字": "Verification code must be 6 digits", "验证设置": "Vérifier la configuration", "验证身份": "Vérifier l'identité", "验证配置错误": "Erreur de configuration de vérification", + "高危操作确认": "High-risk operation confirmation", + "高危状态码重试风险告知与免责声明Markdown": "### ⚠️ High-Risk Operation: Risk Notice and Disclaimer for 504/524 Retry\nBy default, this project does not retry for status codes `400` (bad request), `504` (gateway timeout), and `524` (timeout occurred).\n In many cases, 504 and 524 mean the request has reached the upstream AI service and processing has started, but the connection was closed due to long processing time.\n\nEnabling redirection/retry for these timeout status codes is a **high-risk operation**. Before enabling it, you must read and understand the consequences below:\n\n#### 1. Core Risks (Read Carefully)\n1. 💸 Duplicate/multiple billing risk: Most upstream AI providers **still charge** for requests that started processing but got interrupted by network timeout (504/524). If retry is triggered, a new upstream request will be sent, which can lead to **duplicate or multiple charges**.\n2. ⏳ Severe client timeout: If a single request already timed out, adding retries can multiply total latency and cause severe or unacceptable timeout behavior for your final client/caller.\n3. 💥 Request backlog and system crash risk: Forcing retries on timeout requests keeps threads and connections occupied for longer. Under high concurrency, this can cause serious backlog, exhaust system resources, trigger a cascading failure, and crash your proxy service.\n\n#### 2. Risk Acknowledgement\nIf you still choose to enable this feature, you acknowledge all of the following:", + "高危状态码重试风险确认输入文本": "I understand the duplicate billing and crash risks, and confirm enabling it.", + "高危状态码重试风险确认项1": "I have fully read and understood the risks and fully understand the destructive consequences of forcing retries for status codes 504 and 524.", + "高危状态码重试风险确认项2": "I have communicated with the upstream provider and confirmed that the timeout issue is an upstream bottleneck and cannot be resolved upstream at this time.", + "高危状态码重试风险确认项3": "I voluntarily accept all duplicate/multiple billing risks and will not file issues or complaints in this project repository regarding billing anomalies caused by this retry behavior.", + "高危状态码重试风险确认项4": "I voluntarily accept system stability risks, including severe client timeout and possible service crash. Any consequences caused by enabling this feature are my own responsibility.", + "高危状态码重试风险输入不匹配提示": "The input does not match the required text", + "高危状态码重试风险输入框占位文案": "Please type the exact text above", + "高延迟": "High Latency", "高级设置": "Paramètres avancés", + "高级选项": "Advanced Options", "高级配置": "Advanced Configuration", "黑名单": "Liste noire", "默认": "Par défaut", "默认 API 版本": "Version de l'API par défaut", "默认 Responses API 版本,为空则使用上方版本": "Version de l'API Responses par défaut, utilise la version ci-dessus si vide", + "默认 TTL(秒)": "Default TTL (seconds)", + "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)": "Par défaut, le ratio de création de cache 5m est utilisé ; le ratio de création de cache 1h est calculé via une multiplication fixe (actuellement 1.6x)", "默认使用系统名称": "Le nom du système est utilisé par défaut", + "默认助手消息": "Bonjour ! Comment puis-je vous aider aujourd'hui ?", "默认区域": "Région par défaut", "默认区域,如: us-central1": "Région par défaut, ex: us-central1", "默认折叠侧边栏": "Réduire la barre latérale par défaut", "默认测试模型": "Modèle de test par défaut", "默认用户消息": "Bonjour", - "默认助手消息": "Bonjour ! Comment puis-je vous aider aujourd'hui ?", - "默认补全倍率": "Taux de complétion par défaut", - "每日签到": "Enregistrement quotidien", - "今日已签到,累计签到": "Enregistré aujourd'hui, total des enregistrements", - "每日签到可获得随机额度奖励": "L'enregistrement quotidien récompense un quota aléatoire", - "今日已签到": "Enregistré aujourd'hui", - "立即签到": "S'enregistrer maintenant", - "正在加载签到状态...": "Chargement du statut d'enregistrement...", - "获取签到状态失败": "Échec de la récupération du statut d'enregistrement", - "签到成功!获得": "Enregistrement réussi ! Reçu", - "签到失败": "Échec de l'enregistrement", - "获得": "Reçu", - "累计签到": "Total des enregistrements", - "本月获得": "Ce mois-ci", - "累计获得": "Total reçu", - "签到奖励将直接添加到您的账户余额": "Les récompenses d'enregistrement seront directement ajoutées à votre solde de compte", - "每日仅可签到一次,请勿重复签到": "Un seul enregistrement par jour, veuillez ne pas vous enregistrer plusieurs fois", - "签到设置": "Paramètres d'enregistrement", - "签到功能允许用户每日签到获取随机额度奖励": "La fonction d'enregistrement permet aux utilisateurs de s'enregistrer quotidiennement pour recevoir des récompenses de quota aléatoires", - "启用签到功能": "Activer la fonction d'enregistrement", - "签到最小额度": "Quota minimum d'enregistrement", - "签到奖励的最小额度": "Quota minimum pour les récompenses d'enregistrement", - "签到最大额度": "Quota maximum d'enregistrement", - "签到奖励的最大额度": "Quota maximum pour les récompenses d'enregistrement", - "保存签到设置": "Enregistrer les paramètres d'enregistrement", - "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。": "Remarque : cette configuration n'affecte que l'affichage des modèles dans la place de marché des modèles et n'a aucun impact sur l'invocation ou le routage réels. Pour configurer le comportement réel des appels, veuillez aller dans « Gestion des canaux ».", - "确认关闭提示": "Confirmer la fermeture", - "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?": "Après fermeture, cet avertissement ne sera plus affiché (uniquement pour ce navigateur). Voulez-vous vraiment le fermer ?", - "ChatCompletions→Responses 兼容配置(Beta)": "Compatibilité ChatCompletions→Responses (bêta)", - "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。": "Remarque : cette fonctionnalité est en version bêta. La structure de configuration et le comportement peuvent changer à l’avenir. Ne l’utilisez pas en production.", - "填充模板(指定渠道)": "Remplir le modèle (canaux sélectionnés)", - "填充模板(全渠道)": "Remplir le modèle (tous les canaux)", - "格式化 JSON": "Formater le JSON", - "关闭提示": "Fermer l’avertissement", - "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。": "Remarque : les tests sur cette page utilisent des requêtes non-streaming. Si un canal ne prend en charge que les réponses en streaming, les tests peuvent échouer. Veuillez vous référer à l’usage réel.", - "Stripe/Creem 需在第三方平台创建商品并填入 ID": "Les produits Stripe/Creem doivent être créés sur la plateforme tierce et l'ID doit être renseigné", - "暂无订阅套餐": "Aucun plan d'abonnement", - "订阅管理": "Gestion des abonnements", - "订阅套餐管理": "Gestion des plans d'abonnement", - "新建套餐": "Créer un plan", - "套餐": "Plan", - "支付渠道": "Canaux de paiement", - "购买上限": "Limite d'achat", - "有效期": "Validité", - "重置": "Réinitialisation", - "禁用后用户端不再展示,但历史订单不受影响。是否继续?": "Après désactivation, il ne sera plus affiché côté utilisateur, mais les commandes historiques ne sont pas affectées. Continuer ?", - "启用后套餐将在用户端展示。是否继续?": "Après activation, le plan sera affiché côté utilisateur. Continuer ?", - "更新套餐信息": "Mettre à jour le plan", - "创建新的订阅套餐": "Créer un nouveau plan d'abonnement", - "套餐的基本信息和定价": "Informations de base et tarification du plan", - "套餐标题": "Titre du plan", - "请输入套餐标题": "Veuillez saisir le titre du plan", - "套餐副标题": "Sous-titre du plan", - "例如:适合轻度使用": "Ex. : Convient à un usage léger", - "请输入金额": "Veuillez saisir le montant", - "请输入总额度": "Veuillez saisir le quota total", - "0 表示不限": "0 signifie illimité", - "原生额度": "Quota brut", - "升级分组": "Groupe de mise à niveau", - "不升级": "Pas de mise à niveau", - "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。": "L'achat ou l'ajout manuel d'un abonnement mettra à niveau vers ce groupe. À l'expiration ou en cas d'invalidation/suppression, il reviendra au groupe précédent. Le retour n'est pas immédiat et prend généralement quelques minutes.", - "币种": "Devise", - "由全站货币展示设置统一控制": "Contrôlé par les paramètres globaux d'affichage des devises", - "排序": "Ordre", - "启用状态": "Statut d'activation", - "有效期设置": "Paramètres de validité", - "配置套餐的有效时长": "Configurer la durée de validité du plan", - "有效期单位": "Unité de validité", - "自定义秒数": "Secondes personnalisées", - "请输入秒数": "Veuillez saisir le nombre de secondes", - "有效期数值": "Valeur de validité", - "额度重置": "Réinitialisation du quota", - "支持周期性重置套餐权益额度": "Prend en charge la réinitialisation périodique du quota du plan", - "重置周期": "Période de réinitialisation", - "第三方支付配置": "Configuration des paiements tiers", - "Stripe/Creem 商品ID(可选)": "ID produit Stripe/Creem (optionnel)", - "生效": "Actif", - "已作废": "Invalidé", - "用户订阅管理": "Gestion des abonnements utilisateur", - "选择订阅套餐": "Sélectionner un plan d'abonnement", - "新增订阅": "Ajouter un abonnement", - "暂无订阅记录": "Aucun enregistrement d'abonnement", - "来源": "Source", - "开始": "Début", - "结束": "Fin", - "作废": "Invalider", - "确认作废": "Confirmer l'invalidation", - "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "Après invalidation, l'abonnement devient immédiatement invalide. L'historique n'est pas affecté. Continuer ?", - "删除会彻底移除该订阅记录(含权益明细)。是否继续?": "La suppression retirera définitivement cet enregistrement d'abonnement (y compris les détails des avantages). Continuer ?", - "绑定订阅套餐": "Lier un plan d'abonnement", - "绑定后会立即生成用户订阅(无需支付),有效期按套餐配置计算。": "Après liaison, un abonnement utilisateur est créé immédiatement (sans paiement) ; la validité suit la configuration du plan.", - "订阅套餐": "Plans d'abonnement", - "额度充值": "Recharge de quota", - "优先订阅": "Abonnement en priorité", - "优先钱包": "Portefeuille en priorité", - "仅用订阅": "Abonnement uniquement", - "仅用钱包": "Portefeuille uniquement", - "我的订阅": "Mes abonnements", - "个生效中": "actifs", - "无生效": "Aucun actif", - "已保存偏好为": "Préférence enregistrée : ", - ",当前无生效订阅,将自动使用钱包": ", aucun abonnement actif, le portefeuille sera utilisé automatiquement.", - "个已过期": "expirés", - "订阅": "Abonnement", - "至": "jusqu'à", - "过期于": "Expire le", - "作废于": "Invalidé le", - "购买套餐后即可享受模型权益": "Profitez des avantages du modèle après l'achat d'un plan", - "限购": "Limite", - "推荐": "Recommandé", - "已达到购买上限": "Limite d'achat atteinte", - "已达上限": "Limite atteinte", - "立即订阅": "S'abonner maintenant", - "暂无可购买套餐": "Aucun plan disponible à l'achat", - "该套餐未配置 Stripe": "Ce plan n'est pas configuré pour Stripe", - "已打开支付页面": "Page de paiement ouverte", - "支付失败": "Paiement échoué", - "该套餐未配置 Creem": "Ce plan n'est pas configuré pour Creem", - "已发起支付": "Paiement initié", - "购买订阅套餐": "Acheter un plan d'abonnement", - "套餐名称": "Nom du plan", - "应付金额": "Montant à payer", - "支付": "Payer", - "管理员未开启在线支付功能,请联系管理员配置。": "Le paiement en ligne n'est pas activé par l'administrateur. Veuillez contacter l'administrateur.", - "缓存读": "Lecture cache", - "缓存写": "Écriture cache", - "写": "Écriture", - "根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。": "Selon la convention Anthropic, les tokens d'entrée de /v1/messages ne comptent que les entrées non mises en cache et excluent les tokens de lecture/écriture du cache.", - "设计版本": "b80c3466cb6feafeb3990c7820e10e50", - "未匹配到模型,按回车键可将「{{name}}」作为自定义模型名添加": "Aucun modèle correspondant. Appuyez sur Entrée pour ajouter «{{name}}» comme nom de modèle personnalisé." + "默认补全倍率": "Taux de complétion par défaut" } } diff --git a/web/src/i18n/locales/ja.json b/web/src/i18n/locales/ja.json index 2951e9ea3b..0007cf8bc9 100644 --- a/web/src/i18n/locales/ja.json +++ b/web/src/i18n/locales/ja.json @@ -8,6 +8,8 @@ " 个模型设置相同的值": "個のモデルに同じ値を設定", " 吗?": "に変更しますか?", " 秒": " 秒", + " 秒。": " seconds.", + ",当前无生效订阅,将自动使用钱包": "、有効なサブスクリプションがないため、自動的にウォレットを使用します", ",时间:": "、時間:", ",点击更新": "、クリックして更新してください", "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(現在、Epay APIのみに対応しています。デフォルトで、上記のサーバーURLがコールバックアドレスとして使用されます。)", @@ -21,25 +23,33 @@ "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", + "{{name}} ID": "{{name}} ID", "{{ratioType}} {{ratio}}": "{{ratioType}} {{ratio}}", + "• 如果无法获取验证码,请使用备用码": "• If you cannot get the verification code, use a backup code", + "• 每个备用码只能使用一次": "• Each backup code can only be used once", "• 视频服务商的跨域限制": "• Cross-origin limitations from the video provider", "• 防盗链保护机制": "• Hotlink protection mechanisms", "• 需要特定的请求头或认证": "• Specific headers or authentication are required", + "• 验证码每30秒更新一次": "• Verification code updates every 30 seconds", "© {{currentYear}}": "© {{currentYear}}", "| 基于": "| ベース: ", "$/1M tokens": "$/1M tokens", "0 - 最低": "0 - 最低", + "0 表示不限": "0 は無制限を意味します", "0.002-1之间的小数": "0.002~1の小数", "0.1以上的小数": "0.1以上の小数", + "1) 点击「打开授权页面」完成登录;2) 浏览器会跳转到 localhost(页面打不开也没关系);3) 复制地址栏完整 URL 粘贴到下方;4) 点击「生成并填入」。": "1) Click \"Open Authorization Page\" to complete login; 2) Browser will redirect to localhost (it's OK if the page doesn't load); 3) Copy the full URL from the address bar and paste it below; 4) Click \"Generate and Fill In\".", "10 - 最高": "10 - 最高", "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "1h cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", "1h缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (1h缓存创建倍率: {{cacheCreationRatio1h}})": "1h cache creation price: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (1h cache creation ratio: {{cacheCreationRatio1h}})", "2 - 低": "2 - 低", "2025年5月10日后添加的渠道,不需要再在部署的时候移除模型名称中的\".\"": "2025年5月10日以降に追加されたチャネルでは、デプロイ時にモデル名から「.」を削除する必要はなくなりました。", + "360 智脑": "360 AI Brain", "360智脑": "360智脑", "5 - 正常(默认)": "5 - 正常(デフォルト)", "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "5m cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", "5m缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (5m缓存创建倍率: {{cacheCreationRatio5m}})": "5m cache creation price: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (5m cache creation ratio: {{cacheCreationRatio5m}})", + "5小时窗口": "5-hour window", "8 - 高": "8 - 高", "AGPL v3.0协议": "AGPL v3.0ライセンス", "AI 对话": "AIチャット", @@ -57,6 +67,11 @@ "API令牌管理": "APIトークン管理", "API使用记录": "API利用履歴", "API信息": "API情報", + "API信息已删除,请及时点击”保存设置”进行保存": "API info deleted, please click \"Save Settings\" to save", + "API信息已更新": "API info updated", + "API信息已更新,请及时点击”保存设置”进行保存": "API info updated, please click \"Save Settings\" to save", + "API信息已添加,请及时点击”保存设置”进行保存": "API info added, please click \"Save Settings\" to save", + "API信息更新失败": "Failed to update API info", "API信息管理,可以配置多个API地址用于状态展示和负载均衡(最多50个)": "API情報管理:ステータス表示とロードバランシング用に、複数のベースURL(最大50個)を設定できます", "API地址": "ベースURL", "API渠道配置": "APIチャネル設定", @@ -67,13 +82,27 @@ "Bark推送URL": "BarkプッシュURL", "Bark推送URL必须以http://或https://开头": "BarkプッシュURLは、http://またはhttps://で始まることが必須です", "Bark通知": "Bark通知", + "Basic Auth 头": "Basic Auth Header", + "Cached tokens": "Cached tokens", + "Cached tokens 占比口径由后端返回:Claude 语义按 cached/(prompt+cached),其余按 cached/prompt。": "Cached token ratio calculated by backend: Claude uses cached/(prompt+cached), others use cached/prompt.", "Changing batch type to:": "Changing batch type to:", + "ChatCompletions→Responses 兼容配置": "ChatCompletions→Responses Compatibility Config", + "ChatCompletions→Responses 兼容配置(Beta)": "ChatCompletions→Responses 互換設定(ベータ)", + "Claude 强制 beta=true": "Force Claude beta=true", "Claude思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Claude思考モード:BudgetTokens = MaxTokens * BudgetTokensの割合", "Claude设置": "Claude設定", "Claude请求头覆盖": "Claudeリクエストヘッダーの上書き", "Client ID": "Client ID", "Client Secret": "Client Secret", + "Codex 授权": "Codex Authorization", + "Codex 渠道不支持批量创建": "Codex channels do not support batch creation", + "Codex 用量": "Codex Usage", "common.changeLanguage": "common.changeLanguage", + "Completion tokens": "Completion tokens", + "Configuration": "Configuration", + "context_int/context_string 从请求上下文读取;gjson 从入口请求的 JSON body 按 gjson path 读取。": "context_int/context_string reads from request context; gjson reads from the entry request JSON body via gjson path.", + "CPU 使用率超过此值时拒绝请求": "CPU使用率がこの値を超えた場合にリクエストを拒否", + "CPU 阈值 (%)": "CPUしきい値 (%)", "Creem API 密钥,敏感信息不显示": "Creem API key, sensitive information not displayed", "Creem Setting Tips": "Creem only supports preset fixed-amount products. These products and their prices need to be created and configured in advance on the Creem website, so custom dynamic amount top-ups are not supported. Configure the product name and price on Creem, obtain the Product Id, and then fill it in for the product below. Set the top-up amount and display price for this product in the new API.", "Creem 介绍": "Creem is the payment partner you always deserved, we strive for simplicity and straightforwardness on our APIs.", @@ -86,8 +115,14 @@ "Discord Client ID": "Discord Client ID", "Discord Client Secret": "Discord Client Secret", "Discord ID": "Discord ID", + "Discovery claims": "Discovery claims", + "Discovery scopes": "Discovery scopes", + "Discovery 建议 scopes:": "Suggested Discovery scopes:", "EUR (欧元)": "EUR (Euro)", "false": "false", + "GC 已执行": "GC executed", + "GC 执行失败": "GC execution failed", + "GC 次数": "GC Count", "Gemini安全设置": "Geminiセキュリティ設定", "Gemini思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Gemini思考モード:BudgetTokens = MaxTokens * BudgetTokensの割合", "Gemini思考适配设置": "Gemini思考モード設定", @@ -97,34 +132,53 @@ "GitHub Client ID": "GitHub Client ID", "GitHub Client Secret": "GitHub Client Secret", "GitHub ID": "GitHub ID", + "Goroutine 数": "Goroutine Count", "Gotify应用令牌": "Gotifyアプリトークン", "Gotify服务器地址": "GotifyサーバーURL", "Gotify服务器地址必须以http://或https://开头": "GotifyサーバーURLは、http://またはhttps://で始まることが必須です", "Gotify通知": "Gotify通知", - "Grok设置": "Grok設定", "GPU/容器": "GPU/Container", "GPU数量": "Number of GPUs", + "Grok设置": "Grok設定", "Homepage URL 填": "ホームページURLを入力してください", "ID": "ID", + "id(用户 ID)": "id (User ID)", + "include_obfuscation 用于控制 Responses 流混淆字段。默认关闭以避免客户端关闭该安全保护": "include_obfuscation controls the Responses stream obfuscation field. Disabled by default to prevent clients from disabling this security protection", + "inference_geo 字段用于控制 Claude 数据驻留推理区域。默认关闭以避免未经授权透传地域信息": "inference_geo controls Claude data residency inference region. Disabled by default to prevent unauthorized geo information passthrough", "IP": "IP", "IP白名单": "IP Whitelist", "IP白名单(支持CIDR表达式)": "IPホワイトリスト(CIDR表記に対応)", "IP限制": "IP制限", "IP黑名单": "IPブラックリスト", "JSON": "JSON", + "JSON 模式": "JSON Mode", "JSON 模式支持手动输入或上传服务账号 JSON": "JSONモードは、サービスアカウントJSONの手動入力またはアップロードに対応しています。", "JSON格式密钥,请确保格式正确": "JSON形式のAPIキー。正しい形式であることをご確認ください。", "JSON格式错误": "JSON形式エラー", "JSON编辑": "JSON編集", "JSON解析错误:": "JSONの解析エラー:", + "Key": "Key", + "Key 或 Path": "Key or Path", + "Key 指纹": "Key Fingerprint", + "Key 摘要": "Key Summary", + "Key 来源": "Key Source", + "Key 来源类型": "Key Source Type", "Linux DO Client ID": "Linux DO Client ID", "Linux DO Client Secret": "Linux DO Client Secret", "LinuxDO": "LinuxDO", "LinuxDO ID": "LinuxDO ID", "Logo 图片地址": "ロゴ画像URL", + "Logo 已更新": "Logo updated", + "Logo 更新失败": "Failed to update logo", "Midjourney 任务记录": "Midjourneyタスク履歴", "MIT许可证": "MITライセンス", "New API项目仓库地址:": "New APIプロジェクトリポジトリ:", + "NewAPI 默认不会将入口请求的 User-Agent 透传到上游渠道;该条件仅用于识别访问本站点的客户端。": "NewAPI does not passthrough the entry request User-Agent to upstream channels by default; this condition is only used to identify clients accessing this site.", + "OAuth Client ID": "OAuth Client ID", + "OAuth Client Secret": "OAuth Client Secret", + "OAuth 登录失败:": "OAuth login failed: ", + "OAuth 端点": "OAuth Endpoints", + "OAuth 配置错误:授权端点必须是完整的 URL(以 http:// 或 https:// 开头)": "OAuth configuration error: Authorization endpoint must be a full URL (starting with http:// or https://)", "OIDC": "OIDC", "OIDC ID": "OIDC ID", "Ollama 模型管理": "Ollama Model Management", @@ -136,12 +190,20 @@ "Passkey 注册失败,请重试": "Passkeyの登録に失敗しました。再試行してください", "Passkey 注册成功": "Passkeyの登録に成功しました", "Passkey 登录": "Passkeyログイン", + "Passkey 登录失败,请重试": "Passkey login failed, please try again", + "Passkey 验证失败,请重试": "Passkey verification failed, please try again", "Ping间隔(秒)": "Ping間隔(秒)", + "POST 参数": "POST Parameters", "price_xxx 的商品价格 ID,新建产品后可获得": "price_xxx の料金ID。新規製品の作成後に取得できます", + "Prompt cache hit tokens": "Prompt cache hit tokens", + "Prompt tokens": "Prompt tokens", "Reasoning Effort": "Reasoning Effort", + "Request ID": "Request ID", "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "safety_identifierフィールドは、OpenAIが利用ポリシーに違反する可能性のあるアプリユーザーを特定するために使用されます。ユーザーのプライバシーを保護するため、デフォルトでは無効です", + "Scopes(可选)": "Scopes (optional)", "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "service_tierフィールドはサービス階層の指定に使用されます。パススルーを許可すると実際の課金額が想定を上回る場合があるため、追加料金を避けるためにデフォルトでは無効になっています", "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "sk_xxx または rk_xxx のStripe APIキー。機密情報は表示されません", + "Slug只能包含字母、数字、下划线和连字符": "Slug can only contain letters, numbers, underscores, and hyphens", "SMTP 发送者邮箱": "SMTP 送信元メールアドレス", "SMTP 服务器地址": "SMTP サーバーURL", "SMTP 端口": "SMTP ポート", @@ -153,22 +215,33 @@ "SSRF防护设置": "SSRF保護設定", "SSRF防护详细说明": "SSRF保護の詳細説明", "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "storeフィールドは、製品の評価と最適化のためにOpenAIがリクエストデータを保存することを許可します。デフォルトでは無効です。有効にすると、Codexが正常に利用できなくなる場合があります", - "免责声明:仅限个人使用,请勿分发或共享任何凭证。该渠道存在前置条件与使用门槛,请在充分了解流程与风险后使用,并遵守 OpenAI 的相关条款与政策。相关凭证与配置仅限接入 Codex CLI 使用,不适用于其他客户端、平台或渠道。": "免責事項:個人利用に限ります。認証情報を配布・共有しないでください。このチャネルには前提条件があり、事前の設定が必要です。手順とリスクを理解した上で利用し、OpenAI の利用規約および関連ポリシーを遵守してください。認証情報と設定は Codex CLI 連携専用であり、他のクライアント、プラットフォーム、またはチャネルでは利用できません。", "Stripe 设置": "Stripe 設定", + "Stripe/Creem 商品ID(可选)": "Stripe/Creem 商品ID(任意)", + "Stripe/Creem 需在第三方平台创建商品并填入 ID": "Stripe/Creem の商品は外部プラットフォームで作成し、ID を入力してください", "Telegram": "Telegram", "Telegram Bot Token": "Telegram Bot Token", "Telegram Bot 名称": "Telegram Bot 名称", "Telegram ID": "Telegram ID", "Token Endpoint": "Token Endpoint", + "token 会按倍率换算成“额度/次数”,请求结束后再做差额结算(补扣/返还)。": "Tokens are converted to quota/count by multiplier. After the request, the difference is settled (charged/refunded).", + "Total tokens": "Total tokens", "true": "true", + "TTL(秒,0 表示默认)": "TTL (seconds, 0 for default)", + "TTL(秒)": "TTL (seconds)", "Turnstile Secret Key": "Turnstile Secret Key", "Turnstile Site Key": "Turnstile Site Key", "Unix时间戳": "Unixタイムスタンプ", "Uptime Kuma地址": "Uptime Kumaアドレス", "Uptime Kuma监控分类管理,可以配置多个监控分类用于服务状态展示(最多20个)": "Uptime Kumaの監視分類管理:サービスステータス表示用に、複数の監視分類を設定できます(最大20個)", + "Uptime Kuma配置已更新": "Uptime Kuma config updated", + "Uptime Kuma配置更新失败": "Failed to update Uptime Kuma config", + "URL 标识,只能包含小写字母、数字和连字符": "URL identifier, can only contain lowercase letters, numbers, and hyphens", "URL链接": "URL", "USD (美元)": "USD (US Dollar)", "User Info Endpoint": "User Info Endpoint", + "User-Agent include": "User-Agent include", + "User-Agent include(每行一个,可不写)": "User-Agent include (one per line, optional)", + "Value 正则": "Value Regex", "Vertex AI 不支持 functionResponse.id 字段,开启后将自动移除该字段": "Vertex AIはfunctionResponse.idフィールドをサポートしていません。有効にすると、このフィールドは自動的に削除されます", "Webhook 密钥": "Webhook Secret", "Webhook 签名密钥": "Webhook署名シークレット", @@ -195,19 +268,24 @@ "上一步": "前へ", "上次保存: ": "最終保存: ", "上游倍率同步": "アップストリーム倍率同期", + "上游状态码:": "Upstream status code:", "上游返回": "Upstream response", "下一个表单块": "次のフォームブロック", "下一步": "次へ", "下午好": "こんにちは", "下载日志": "Download Logs", "不再提醒": "今後表示しない", + "不升级": "アップグレードしない", "不同用户分组的价格信息": "ユーザーグループ別の料金情報", "不填则为模型列表第一个": "未入力の場合、モデルリストの先頭モデルが使用されます", "不建议使用": "非推奨", "不支持": "サポート対象外", "不是合法的 JSON 字符串": "は有効なJSON文字列ではありません", "不更改": "変更なし", + "不重置": "リセットなし", + "不限": "無制限", "不限制": "制限なし", + "不需要在末尾加/v1,New API会自动处理,添加后可能导致请求失败,是否继续?": "No need to add /v1 at the end, New API handles it automatically. Adding it may cause request failures. Continue?", "与本地相同": "ローカルと同じ", "专属倍率": "専用倍率", "两次输入的密码不一致": "パスワードが一致しません", @@ -224,10 +302,14 @@ "个人信息设置": "プロフィール設定", "个人设置": "アカウント設定", "个实例": " instances", + "个已过期": "件期限切れ", "个性化设置": "カスタマイズ設定", "个性化设置左侧边栏的显示内容": "サイドバーのカスタマイズ設定", + "个月": "ヶ月", + "个月前": "months ago", "个未配置模型": "個の未設定モデル", "个模型": "個のモデル", + "个生效中": "件有効中", "个部署吗?此操作不可逆。": " deployments? This operation cannot be undone.", "中午好": "こんにちは", "为一个 JSON 对象,例如:{\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}": "JSONオブジェクト形式で入力。例:{\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}", @@ -244,6 +326,7 @@ "为一个 JSON 文本,键为组名称,值为倍率": "JSON形式で入力。キー:グループ名、値:倍率", "为了保护账户安全,请验证您的两步验证码。": "アカウント保護のため、2要素認証コードを入力してください。", "为了保护账户安全,请验证您的身份。": "アカウント保護のため、本人確認を行ってください。", + "为保证匹配准确,请确保客户端直连本站点(避免反向代理/网关改写 User-Agent)。": "To ensure accurate matching, make sure the client connects directly to this site (avoid reverse proxy/gateway rewriting User-Agent).", "为空则默认使用服务器地址,多个 Origin 用逗号分隔,例如 https://newapi.pro,https://newapi.com ,注意不能携带[],需使用https": "空欄の場合は、デフォルトのサーバーURLが使用されます。複数のオリジンはカンマで区切ってください(例:https://newapi.pro,https://newapi.com)。ご注意:[]は含めず、httpsを使用してください。", "主页链接填": "ホームページURLを入力してください。", "之前的所有日志": "これまでのすべてのログ", @@ -262,13 +345,21 @@ "仅对自定义模型有效": "カスタムモデルにのみ有効", "仅当自动禁用开启时有效,关闭后不会自动禁用该渠道": "「自動的に無効にする」が有効な場合にのみ適用されます。無効にすると、このチャネルは自動的に無効になりません", "仅支持": "対応形式:", + "仅支持 JSON 对象,必须包含 access_token 与 account_id": "Only JSON objects are supported, must contain access_token and account_id", "仅支持 JSON 文件": "JSONファイルにのみ対応しています", "仅支持 JSON 文件,支持多文件": "JSONファイルにのみ対応しています(複数ファイル可)", "仅支持 OpenAI 接口格式": "OpenAI API形式にのみ対応しています", + "仅显示已绑定": "Show bound only", "仅显示矛盾倍率": "競合する倍率のみ表示", "仅用于开发环境,生产环境应使用 HTTPS": "開発環境専用です。本番環境ではHTTPSを使用してください", + "仅用于换算,实际保存的是额度": "換算用のみ、実際に保存されるのはクォータです", + "仅用订阅": "サブスクリプションのみ", + "仅用钱包": "ウォレットのみ", "仅重置配置": "設定のみリセット", + "今天": "Today", "今日关闭": "今日は表示しない", + "今日已签到": "本日チェックイン済み", + "今日已签到,累计签到": "本日チェックイン済み、累計チェックイン", "从官方模型库同步": "公式モデルライブラリから同期", "从认证器应用中获取验证码,或使用备用码": "認証アプリから認証コードを取得するか、バックアップコードを使用してください", "从配置文件同步": "設定ファイルから同期", @@ -300,17 +391,28 @@ "价格重新计算中...": "Recalculating price...", "价格预估": "Price Estimate", "任务 ID": "タスクID", + "任务ID": "タスクID", "任务日志": "タスク履歴", "任务状态": "タスクステータス", "任务记录": "タスク履歴", "企业账户为特殊返回格式,需要特殊处理,如果非企业账户,请勿勾选": "エンタープライズアカウントはレスポンス形式が特殊なため、特別な処理が必要です。エンタープライズアカウント以外の場合は、チェックしないでください", "优先级": "優先度", + "优先级必须是整数!": "Priority must be an integer!", + "优先订阅": "サブスクリプション優先", + "优先钱包": "ウォレット優先", "优惠": "特典", "低于此额度时将发送邮件提醒用户": "このクォータを下回った場合に、ユーザーへメールで通知します。", "余额": "残高", "余额充值管理": "残高チャージ管理", + "作废": "無効化", + "作废于": "無効化日", + "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "無効化するとこのサブスクリプションは直ちに失効します。履歴には影響しません。続行しますか?", + "作用域": "Scope", + "作用域:包含分组": "Scope: Include Group", + "作用域:包含规则名称": "Scope: Include Rule Name", "你似乎并没有修改什么": "何も変更されていないようです", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "You can manually add them under “Custom model names”, click Fill and submit, or use the actions below to handle them automatically.", + "使用 {{name}} 继续": "Continue with {{name}}", "使用 Discord 继续": "Continue with Discord", "使用 GitHub 继续": "GitHubでログイン", "使用 JSON 对象格式,格式为:{\"组名\": [最多请求次数, 最多请求完成次数]}": "JSONオブジェクト形式で入力してください。形式:{\"グループ名\": [最大リクエスト数, 最大成功リクエスト数]}", @@ -323,13 +425,20 @@ "使用 用户名 注册": "ユーザー名でサインアップ", "使用 邮箱或用户名 登录": "メールアドレスまたはユーザー名でログイン", "使用ID排序": "IDでソート", + "使用备用码": "Use Backup Code", "使用日志": "利用履歴", "使用模式": "利用モード", "使用统计": "利用統計", "使用认证器应用(如 Google Authenticator、Microsoft Authenticator)扫描下方二维码:": "Google Authenticator、Microsoft Authenticatorなどの認証アプリで、以下のQRコードをスキャンしてください:", "使用认证器应用扫描二维码": " 認証アプリスキャン", + "使用认证器验证码": "Use Authenticator Code", + "例如 /var/cache/new-api": "e.g. /var/cache/new-api", "例如 €, £, Rp, ₩, ₹...": "例:€, £, Rp, ₩, ₹...", + "例如 100000…": "e.g. 100000...", + "例如 3600…": "e.g. 3600...", + "例如 600…": "e.g. 600...", "例如 https://docs.newapi.pro": "例:https://docs.newapi.pro", + "例如 prefer-by-conversation-id…": "e.g. prefer-by-conversation-id...", "例如:": "例:", "例如: /bin/bash -c \"python app.py\"": "e.g.: /bin/bash -c \"python app.py\"", "例如: nginx:latest": "e.g.: nginx:latest", @@ -342,13 +451,28 @@ "例如:2,就是最低充值2$": "例:2(最低チャージ額$2)", "例如:2000": "例:2000", "例如:4.99": "e.g.: 4.99", + "例如:401, 403, 429, 500-599": "e.g. 401,403,429,500-599", "例如:7,就是7元/美金": "例:7(1USDあたり7CNY)", + "例如:email": "e.g.: email", "例如:example.com": "例:example.com", + "例如:github / si:google / https://example.com/logo.png / 🐱": "e.g.: github / si:google / https://example.com/logo.png / 🐱", + "例如:GitHub Enterprise": "e.g.: GitHub Enterprise", + "例如:github-enterprise": "e.g.: github-enterprise", + "例如:https://example.com/.well-known/openid-configuration": "e.g.: https://example.com/.well-known/openid-configuration", + "例如:https://gitea.example.com": "e.g.: https://gitea.example.com", + "例如:https://workername.yourdomain.workers.dev": "e.g.: https://workername.yourdomain.workers.dev", "例如:https://yourdomain.com": "例:https://yourdomain.com", + "例如:name、full_name": "e.g.: name, full_name", "例如:nginx:latest": "e.g.: nginx:latest", + "例如:preferred_username、login": "e.g.: preferred_username, login", "例如:preview": "例:preview", "例如:prod_6I8rBerHpPxyoiU9WK4kot": "e.g.: prod_6I8rBerHpPxyoiU9WK4kot", + "例如:sub、id、data.user.id": "e.g.: sub, id, data.user.id", "例如:基础套餐": "e.g.: Basic Package", + "例如:适合轻度使用": "例:軽めの利用に最適", + "例如:需要等级 {{required}},你当前等级 {{current}}": "e.g.: Level {{required}} required, your current level is {{current}}", + "例如(全渠道):": "Example (all channels):", + "例如(指定渠道):": "Example (specific channels):", "例如发卡网站的购买链接": "例:カード発行サイトの購入リンク", "供应商": "プロバイダー", "供应商介绍": "プロバイダー紹介", @@ -377,12 +501,14 @@ "保存失败,请重试": "保存に失敗しました。再試行してください", "保存失败:": "保存に失敗しました:", "保存屏蔽词过滤设置": "NGワードフィルタリング設定を保存", + "保存性能设置": "パフォーマンス設定を保存", "保存成功": "保存に成功しました", "保存数据看板设置": "ダッシュボード設定を保存", "保存日志设置": "ログ設定を保存", "保存模型倍率设置": "モデル倍率設定を保存", "保存模型速率限制": "モデルのレート制限を保存", "保存监控设置": "監視設定を保存", + "保存签到设置": "チェックイン設定を保存", "保存绘图设置": "画像生成設定を保存", "保存聊天设置": "チャット設定を保存", "保存设置": "設定を保存", @@ -401,17 +527,22 @@ "倍率是为了方便换算不同价格的模型": "倍率は、料金が異なるモデルの換算を容易にするためのものです", "倍率模式": "倍率モード", "倍率类型": "倍率タイプ", + "偏好设置": "Preferences", + "停止中": "Stopping", "停止测试": "テストを停止", "停用": "無効", "允许 AccountFilter 参数": "AccountFilterパラメータを許可する", "允许 HTTP 协议图片请求(适用于自部署代理)": "HTTPプロトコルによる画像リクエストを許可する(セルフホストプロキシ向け)", + "允许 inference_geo 透传": "Allow inference_geo passthrough", "允许 safety_identifier 透传": "safety_identifierのパススルーを許可する", "允许 service_tier 透传": "service_tierのパススルーを許可する", + "允许 stream_options.include_obfuscation 透传": "Allow stream_options.include_obfuscation passthrough", "允许 Turnstile 用户校验": "Turnstileによるユーザー検証を許可する", "允许不安全的 Origin(HTTP)": "安全でないオリジン(HTTP)を許可する", "允许回调(会泄露服务器 IP 地址)": "コールバックを許可する(サーバーIPアドレスが漏洩します)", "允许在 Stripe 支付中输入促销码": "Stripe決済でのプロモーションコード入力を許可する", "允许新用户注册": "新規ユーザーのサインアップを許可する", + "允许注册的最低信任等级": "Minimum trust level for registration", "允许的 Origins": "許可するオリジン", "允许的IP,一行一个,不填写则不限制": "許可するIP(1行に1つずつ)。未入力の場合は無制限。", "允许的端口": "許可するポート", @@ -442,10 +573,11 @@ "充值金额折扣配置不是合法的 JSON 对象": "チャージ額の割引設定は有効なJSONオブジェクトではありません", "充值链接": "チャージリンク", "充值额度": "チャージ額", + "先填写配置,再自动填充 OAuth 端点,能显著减少手工输入": "Fill in the config first, then auto-fill OAuth endpoints to significantly reduce manual input", + "免责声明:仅限个人使用,请勿分发或共享任何凭证。该渠道存在前置条件与使用门槛,请在充分了解流程与风险后使用,并遵守 OpenAI 的相关条款与政策。相关凭证与配置仅限接入 Codex CLI 使用,不适用于其他客户端、平台或渠道。": "免責事項:個人利用に限ります。認証情報を配布・共有しないでください。このチャネルには前提条件があり、事前の設定が必要です。手順とリスクを理解した上で利用し、OpenAI の利用規約および関連ポリシーを遵守してください。認証情報と設定は Codex CLI 連携専用であり、他のクライアント、プラットフォーム、またはチャネルでは利用できません。", "兑换人ID": "引き換えユーザーID", "兑换成功!": "引き換えに成功しました", "兑换码充值": "引き換えコードによるチャージ", - "清理不活跃缓存": "非アクティブなキャッシュをクリーンアップ", "兑换码创建成功": "引き換えコードの作成に成功しました", "兑换码创建成功,是否下载兑换码?": "引き換えコードの作成に成功しました。ダウンロードしますか?", "兑换码创建成功!": "引き換えコードの作成に成功しました", @@ -472,7 +604,10 @@ "全部类型": "すべて", "公告": "お知らせ", "公告内容": "お知らせ内容", + "公告已删除,请及时点击”保存设置”进行保存": "Announcement deleted, please click \"Save Settings\" to save", "公告已更新": "お知らせが更新されました", + "公告已更新,请及时点击”保存设置”进行保存": "Announcement updated, please click \"Save Settings\" to save", + "公告已添加,请及时点击”保存设置”进行保存": "Announcement added, please click \"Save Settings\" to save", "公告更新失败": "お知らせの更新に失敗しました", "公告类型": "お知らせのタイプ", "共": "合計", @@ -484,6 +619,8 @@ "共 {{total}} 项,当前显示 {{start}}-{{end}} 项": "全 {{total}} 件中、{{start}}~{{end}} 件目を表示", "关": "Off", "关于": "このサービスについて", + "关于内容已更新": "About content updated", + "关于内容更新失败": "Failed to update about content", "关于我们": "このサービスについて", "关于系统的详细信息": "システムの詳細情報", "关于项目": "プロジェクトについて", @@ -492,15 +629,22 @@ "关闭侧边栏": "サイドバー折りたたみ", "关闭公告": "お知らせを閉じる", "关闭后,此模型将不会被“同步官方”自动覆盖或创建": "オフにすると、このモデルは「公式から同期」機能によって自動的に上書き・作成されなくなります", + "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?": "閉じると、このお知らせは今後表示されません(このブラウザのみ)。閉じてもよろしいですか?", "关闭弹窗,已停止批量测试": "ポップアップを閉じたため、一括テストは停止されました", + "关闭提示": "お知らせを閉じる", "其他": "その他", "其他注册选项": "その他のサインアップオプション", "其他登录选项": "その他のログインオプション", "其他设置": "その他の設定", "其他详情": "Other details", + "内存 阈值 (%)": "メモリしきい値 (%)", + "内存使用率超过此值时拒绝请求": "メモリ使用率がこの値を超えた場合にリクエストを拒否", + "内存命中": "Memory Hits", + "内存缓存最大条目数。0 表示使用后端默认容量:100000。": "Maximum memory cache entries. 0 uses backend default capacity: 100000.", "内容": "コンテンツ", "内容较大,已启用性能优化模式": "コンテンツが大きいため、パフォーマンス最適化モードが有効になりました", "内容较大,部分功能可能受限": "コンテンツが大きいため、一部の機能が制限される場合があります", + "内置": "Built-in", "内置 Ollama 镜像": "Built-in Ollama Image", "再次输入部署名称": "Enter Deployment Name Again", "最低": "最低", @@ -510,10 +654,21 @@ "最后请求": "最終リクエスト日時", "最大GPU数量": "Max Number of GPUs", "最大可用": "Max Available", + "最大条目数": "Max Entries", + "最终抵扣": "Final Deduction", + "最近一次": "Last", "最近事件": "Recent Events", + "写": "書込", + "准入策略": "Access Policy", + "准入策略 JSON(可选)": "Access Policy JSON (optional)", + "准备中": "Preparing", "准备中...": "Preparing...", "准备完成初始化": "初期化準備完了", + "凭证已刷新": "Credentials refreshed", "分类名称": "分類名称", + "分类已删除,请及时点击”保存设置”进行保存": "Category deleted, please click \"Save Settings\" to save", + "分类已更新,请及时点击”保存设置”进行保存": "Category updated, please click \"Save Settings\" to save", + "分类已添加,请及时点击”保存设置”进行保存": "Category added, please click \"Save Settings\" to save", "分组": "グループ", "分组与模型定价设置": "グループとモデルの料金設定", "分组价格": "グループ料金", @@ -526,6 +681,7 @@ "分组速率配置优先级高于全局速率限制。": "グループレート設定が、グローバルレート制限より優先されます。", "分组速率限制": "グループレート制限", "分钟": "分", + "分钟前": "minutes ago", "切换为Assistant角色": "アシスタントロールに切り替える", "切换为System角色": "システムロールに切り替える", "切换为单密钥模式": "シングルAPIキーモードに切り替える", @@ -536,6 +692,7 @@ "划转额度": "振替額", "列出的模型将不会自动添加或移除-thinking/-nothinking 后缀": "ここに含まれるモデルでは-thinking/-nothinkingサフィックスを自動的に追加・削除しません。", "列设置": "列設定", + "刚刚": "just now", "创建": "Create", "创建令牌默认选择auto分组,初始令牌也将设为auto(否则留空,为用户默认分组)": "トークン作成時、デフォルトで「auto」グループが選択され、初期トークンも「auto」に設定されます。(空欄の場合は、ユーザーのデフォルトグループが適用されます)", "创建失败": "作成に失敗しました", @@ -546,12 +703,15 @@ "创建新的兑换码": "新規引き換えコード作成", "创建新的模型": "新規モデル作成", "创建新的渠道": "新規チャネル作成", + "创建新的订阅套餐": "新しいサブスクリプションプランを作成", "创建新的预填组": "新規事前入力グループ作成", "创建时间": "作成日時", "创建用户": "ユーザー作成", "初始化失败,请重试": "初期化に失敗しました。再試行してください", "初始化系统": "システム初期化", "删除": "削除", + "删除 Key 来源": "Delete Key Source", + "删除会彻底移除该订阅记录(含权益明细)。是否继续?": "削除するとこのサブスクリプション記録(特典詳細を含む)が完全に削除されます。続行しますか?", "删除后无法恢复,确定要删除模型 \"{{name}}\" 吗?": "Cannot be recovered after deletion, are you sure you want to delete model \"{{name}}\"?", "删除失败": "削除に失敗しました。", "删除密钥失败": "APIキーの削除に失敗しました", @@ -562,17 +722,23 @@ "删除禁用密钥失败": "無効なAPIキーの削除に失敗しました", "删除禁用通道": "無効なチャネルを削除", "删除自动禁用密钥": "自動無効化APIキーを削除", + "删除规则": "Delete Rule", "删除账户": "アカウント削除", "删除账户确认": "アカウント削除の確認", "删除部署失败": "Failed to delete deployment", "刷新": "更新", + "刷新凭证": "Refresh Credentials", "刷新失败": "更新に失敗しました", "刷新容器信息": "Refresh Container Info", "刷新日志": "Refresh Logs", + "刷新统计": "Refresh Stats", + "刷新缓存统计": "Refresh Cache Stats", + "刷新缓存统计失败": "Failed to refresh cache stats", "前往 io.net API Keys": "Go to io.net API Keys", "前往设置": "Go to Settings", "前往设置页面": "Go to Settings Page", "前缀": "プレフィックス", + "前缀名称匹配": "Prefix Name Match", "副本数量": "Number of Replicas", "剩余": "Remaining", "剩余备用码:": "残りバックアップコード:", @@ -601,27 +767,39 @@ "加载账单失败": "請求情報の読み込みに失敗しました", "加载隐私政策内容失败...": "プライバシーポリシーのコンテンツの読み込みに失敗しました", "包含": "含む", + "包含名称匹配": "Contains Name Match", "包含来自未知或未标明供应商的AI模型,这些模型可能来自小型供应商或开源项目。": "プロバイダーが不明または明記されていないAIモデルが含まれています。これらのモデルは、小規模なプロバイダーやオープンソースプロジェクト由来の場合があります。", "包括失败请求的次数,0代表不限制": "失敗したリクエストの回数を含みます。0は無制限を意味します", "匹配类型": "マッチングタイプ", "区域": "リージョン", + "升级分组": "アップグレードグループ", "单GPU小时费率": "Per GPU Hour Rate", + "即梦": "Jimeng", "历史消耗": "消費履歴", "原价": "通常料金", "原因:": "原因:", + "原始 JSON": "Raw JSON", "原密码": "現在のパスワード", + "原生格式": "Native format", + "原生额度": "生クォータ", "去重完成:去重前 {{before}} 个密钥,去重后 {{after}} 个密钥": "重複排除完了:重複排除前 {{before}} 個のAPIキー、重複排除後 {{after}} 個のAPIキー", "参与官方同步": "公式との同期", "参数": "パラメータ", "参数值": "パラメータ値", "参数覆盖": "パラメータの上書き", + "参数覆盖必须是合法的 JSON 格式!": "Parameter override must be valid JSON format!", + "参数配置": "Parameter Config", "参照生视频": "参照動画生成", "友情链接": "関連リンク", "发布日期": "公開日", "发布时间": "公開日時", + "发现文档地址(Discovery URL,可选)": "Discovery URL (optional)", + "发行者 URL(Issuer URL)": "Issuer URL", + "发送验证码失败,请重试": "Failed to send verification code, please try again", "取消": "キャンセル", "取消全选": "すべての選択を解除", "取消选择": "Deselect", + "受限": "Restricted", "变换": "バリエーション", "变焦": "ズーム", "变量值": "Variable Value", @@ -631,17 +809,29 @@ "只有当用户设置开启IP记录时,才会进行请求和错误类型日志的IP记录": "ユーザーがIP記録を有効に設定した場合にのみ、リクエストとエラータイプのログにIPが記録されます", "可信": "信頼できる", "可在设置页面设置关于内容,支持 HTML & Markdown": "「このサービスについて」のコンテンツは設定ページで設定でき、HTML & Markdownに対応しています", + "可手动填写,多个 scope 用空格分隔": "Can be filled manually, separate multiple scopes with spaces", + "可灵": "Kling", + "可用": "Available", "可用令牌分组": "利用可能なトークングループ", "可用分组": "利用可能なグループ", + "可用变量:{{provider}} {{field}} {{op}} {{required}} {{current}} 以及 {{current.path}}": "Available variables: {{provider}} {{field}} {{op}} {{required}} {{current}} and {{current.path}}", "可用数量": "Available Quantity", "可用模型": "利用可能なモデル", + "可用率": "Availability", + "可用空间: {{free}} / 总空间: {{total}}": "Free: {{free}} / Total: {{total}}", "可用端点类型": "利用可能なエンドポイントタイプ", "可用邀请额度": "利用可能な招待クォータ", + "可留空;留空时会尝试使用 Issuer URL + /.well-known/openid-configuration": "Can be left empty; when empty, will try using Issuer URL + /.well-known/openid-configuration", "可视化": "可視化", "可视化倍率设置": "倍率設定の可視化", "可视化编辑": "ビジュアル編集", "可选,公告的补充说明": "(オプション)お知らせの補足説明", "可选,用于复现结果": "オプション、結果の再現用", + "可选:基于用户信息 JSON 做组合条件准入,条件不满足时返回自定义提示": "Optional: Conditional access based on user info JSON, returns custom message when conditions are not met", + "可选:用于自动生成端点或 Discovery URL": "Optional: Used to auto-generate endpoints or Discovery URL", + "可选。匹配入口请求的 User-Agent;任意一行作为子串匹配(忽略大小写)即命中。": "Optional. Match entry request User-Agent; any line matching as substring (case-insensitive) triggers the rule.", + "可选。对提取到的亲和 Key 做正则校验;不填表示不校验。": "Optional. Regex validation on extracted affinity key; leave empty to skip validation.", + "可选。对请求路径进行匹配;不填表示匹配所有路径。": "Optional. Match request path; leave empty to match all paths.", "可选值": "選択可能な値", "同时重置消息": "メッセージも同時にリセット", "同步": "同期", @@ -658,19 +848,23 @@ "名称匹配类型": "名称マッチングタイプ", "后端请求失败": "バックエンドリクエストに失敗しました", "后缀": "サフィックス", + "后缀名称匹配": "Suffix Name Match", "否": "いいえ", "启动": "Start", "启动参数 (Args)": "Startup Args", "启动命令": "Startup Command", "启动命令 (Entrypoint)": "Entrypoint", + "启动授权失败": "Failed to start authorization", "启动时间": "起動時間", "启动部署失败": "Failed to start deployment", "启动配置": "Startup Configuration", "启用": "有効にする", + "启用 Creem 支付": "Creem決済を有効化", "启用 io.net 部署": "Enable io.net Deployment", "启用 io.net 部署开关": "Enable io.net Deployment Switch", "启用 io.net 部署时必须填写 API Key": "API Key is required when enabling io.net deployment", "启用 Prompt 检查": "プロンプトチェックを有効にする", + "启用 Stripe 支付": "Stripe決済を有効化", "启用2FA失败": "2要素認証の有効化に失敗しました", "启用Claude思考适配(-thinking后缀)": "Claude思考モードを有効にする(-thinkingサフィックス)", "启用FunctionCall思维签名填充": "FunctionCall用のthoughtSignature自動付与を有効化", @@ -678,36 +872,54 @@ "启用Ping间隔": "Ping間隔を有効にする", "启用SMTP SSL": "SMTP SSLを有効にする", "启用SSRF防护(推荐开启以保护服务器安全)": "SSRF保護を有効にする(サーバーを保護するため、有効化を推奨します)", + "启用供应商": "Enable Vendor", "启用全部": "すべてを有効にする", "启用后可接入 io.net GPU 资源": "After enabling, you can access io.net GPU resources", "启用后可添加图片URL进行多模态对话": "有効にすると画像URLを追加してマルチモーダル会話ができます", + "启用后套餐将在用户端展示。是否继续?": "有効化するとユーザー側に表示されます。続行しますか?", + "启用后将优先复用上一次成功的渠道(粘滞选路)。": "When enabled, the last successful channel will be preferred (sticky routing).", "启用后将使用 Creem Test Mode": "Use Creem Test Mode after enabling", "启用密钥失败": "APIキーの有効化に失敗しました", "启用屏蔽词过滤功能": "NGワードフィルタリング機能を有効にする", + "启用性能监控": "パフォーマンス監視を有効にする", + "启用性能监控后,当系统资源使用率超过设定阈值时,将拒绝新的 Relay 请求 (/v1, /v1beta 等),以保护系统稳定性。": "パフォーマンス監視が有効で、システムリソース使用率が設定されたしきい値を超えた場合、システムの安定性を保護するために新しいRelayリクエスト(/v1, /v1betaなど)は拒否されます。", "启用所有密钥失败": "すべてのAPIキーの有効化に失敗しました", "启用数据看板(实验性)": "ダッシュボードを有効にする(実験的)", "启用此模式后,将使用您自定义的请求体发送API请求,模型配置面板的参数设置将被忽略。": "このモードを有効にすると、カスタムリクエストボディがAPIリクエストに使用され、モデル設定パネルのパラメータ設定は無視されます。", + "启用状态": "有効状態", "启用用户模型请求速率限制(可能会影响高并发性能)": "ユーザー単位のモデルリクエストレート制限を有効にする(高同時実行パフォーマンスに影響する可能性があります)", + "启用磁盘缓存": "Enable Disk Cache", + "启用磁盘缓存后,大请求体将临时存储到磁盘而非内存,可显著降低内存占用,适用于处理包含大量图片/文件的请求。建议在 SSD 环境下使用。": "When enabled, large request bodies are temporarily stored on disk instead of memory, significantly reducing memory usage. Suitable for requests with large images/files. SSD recommended.", + "启用签到功能": "チェックイン機能を有効にする", "启用绘图功能": "画像生成機能を有効にする", "启用请求体透传功能": "リクエストボディのパススルー機能を有効にします。", "启用请求透传": "リクエストパススルーを有効にする", + "启用违规扣费": "違反課金を有効にする", "启用额度消费日志记录": "クォータ消費のログ記録を有効にする", "启用验证": "認証を有効にする", - "启用违规扣费": "違反課金を有効にする", "周": "週", + "周前": "weeks ago", + "周期": "期間", + "命中判定:usage 中存在 cached tokens(例如 cached_tokens/prompt_cache_hit_tokens)即视为命中。": "Hit criteria: cached tokens present in usage (e.g. cached_tokens/prompt_cache_hit_tokens) counts as a hit.", + "命中率": "Hit Rate", + "命名规则": "Naming Rule", "和": "および", "和Claude不同,默认情况下Gemini的思考模型会自动决定要不要思考,就算不开启适配模型也可以正常使用,如果您需要计费,推荐设置无后缀模型价格按思考価格設置。支持使用 gemini-2.5-pro-preview-06-05-thinking-128 格式来精确传递思考预算。": "Claudeとは異なり、Geminiの思考モデルはデフォルトで思考するかどうかを自動的に決定します。アダプターを有効にしなくても正常に動作します。課金が必要な場合は、サフィックスなしモデルの価格を思考価格に設定してください。gemini-2.5-pro-preview-06-05-thinking-128のような形式を使用して、正確な思考予算を指定できます。", "响应": "レスポンス", "响应时间": "応答時間", + "响应缺少凭据": "Response missing credentials", + "响应缺少授权链接": "Response missing authorization link", "商品价格 ID": "料金ID", "回答内容": "回答", "回调 URL 填": "コールバックURLを入力してください", + "回调 URL 格式": "Callback URL format", "回调地址": "コールバックアドレス", "固定价格": "固定料金", "固定价格(每次)": "固定料金(1回あたり)", "固定价格值": "固定料金", "图像生成": "画像生成", "图标": "アイコン", + "图标使用 react-icons(Simple Icons)或 URL/emoji,例如:github、gitlab、si:google": "Icon uses react-icons (Simple Icons) or URL/emoji, e.g.: github, gitlab, si:google", "图标使用@lobehub/icons库,如:OpenAI、Claude.Color,支持链式参数:OpenAI.Avatar.type={'platform'}、OpenRouter.Avatar.shape={'square'},查询所有可用图标请 ": "アイコンは `@lobehub/icons` ライブラリを使用しています(例:OpenAI、Claude.Color)。`OpenAI.Avatar.type={'platform'}`、`OpenRouter.Avatar.shape={'square'}` のようなチェーンパラメータに対応しています。利用可能なすべてのアイコンは、こちらで確認できます。", "图混合": "Blend", "图片功能在自定义请求体模式下不可用": "カスタムリクエストモードでは画像機能は利用できません", @@ -724,6 +936,7 @@ "在Gotify服务器的应用管理中创建新应用": "Gotifyサーバーのアプリ管理で新規アプリを作成します。", "在找兑换码?": "引き換えコードをお探しですか?", "在新标签页中打开": "Open in new tab", + "在模型广场向用户展示的端点": "モデル広場でユーザーに表示するエンドポイント", "在此输入 Logo 图片地址": "ロゴ画像URLを入力してください", "在此输入新的公告内容,支持 Markdown & HTML 代码": "新しいお知らせコンテンツを入力してください。MarkdownとHTMLに対応しています", "在此输入新的关于内容,支持 Markdown & HTML 代码。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为关于页面": "「このサービスについて」の新しいコンテンツを入力してください。MarkdownとHTMLに対応しています。リンクを入力した場合は、そのリンクがiframeのsrc属性として使用され、任意のWebページを「このサービスについて」ページとして設定できます", @@ -736,13 +949,22 @@ "域名白名单": "ドメインホワイトリスト", "域名黑名单": "ドメインブラックリスト", "基本信息": "基本情報", + "填充 Codex / Claude Code 模版": "Fill Codex / Claude Code Template", + "填充模板:等级+激活": "Fill Template: Level + Activation", + "填充模板:等级提示": "Fill Template: Level Prompt", + "填充模板:组织或角色": "Fill Template: Organization or Role", + "填充模板:组织提示": "Fill Template: Organization Prompt", + "填充模板(全渠道)": "テンプレートを入力(全チャネル)", + "填充模板(指定渠道)": "テンプレートを入力(指定チャネル)", "填入": "入力", "填入所有模型": "すべてのモデルを入力", "填入模板": "テンプレートを入力", - "填入透传模版": "パススルーテンプレートを入力", - "填入透传完整模版": "完全なパススルーテンプレートを入力", "填入相关模型": "関連モデルを入力", + "填入透传完整模版": "完全なパススルーテンプレートを入力", + "填入透传模版": "パススルーテンプレートを入力", + "填写 Issuer URL 后自动生成:": "Auto-generated after filling Issuer URL:", "填写Gotify服务器的完整URL地址": "Gotifyサーバーの完全なURLを入力してください", + "填写后会自动拼接预设端点": "Preset endpoints will be auto-appended after filling", "填写带https的域名,逗号分隔": "https://を含むドメインをカンマ区切りで入力してください", "填写用户协议内容后,用户注册时将被要求勾选已阅读用户协议": "ユーザー利用規約のコンテンツを設定すると、ユーザーがサインアップする際に、利用規約を読んだことへの同意チェックが求められます", "填写隐私政策内容后,用户注册时将被要求勾选已阅读隐私政策": "プライバシーポリシーのコンテンツを設定すると、ユーザーがサインアップする際に、プライバシーポリシーを読んだことへの同意チェックが求められます", @@ -751,12 +973,15 @@ "备份状态": "バックアップステータス", "备注": "備考", "备用恢复代码": "バックアップコード", + "备用码": "Backup Code", "备用码已复制到剪贴板": "バックアップコードがクリップボードにコピーされました", + "备用码必须是8位": "Backup code must be 8 digits", "备用码重新生成成功": "バックアップコードの再生成に成功しました", "复制": "コピー", "复制代码": "コードをコピー", "复制令牌": "トークンをコピー", "复制全部": "すべてをコピー", + "复制功能需要 HTTPS 环境,请手动复制": "Copy function requires HTTPS, please copy manually", "复制名称": "名称をコピー", "复制失败": "コピーに失敗しました", "复制失败,请手动复制": "コピーに失敗しました。手動でコピーしてください。", @@ -768,6 +993,7 @@ "复制所有模型": "すべてのモデルをコピー", "复制所选令牌": "選択したトークンをコピー", "复制所选兑换码到剪贴板": "選択した引き換えコードをクリップボードにコピー", + "复制授权链接": "Copy Authorization Link", "复制日志": "Copy Logs", "复制渠道的所有信息": "チャネルのすべての情報をコピー", "复制版本号": "Copy Version", @@ -782,18 +1008,29 @@ "天": "日", "天前": "日前", "失败": "失敗", + "失败原因": "失敗の原因", + "失败后不重试": "No retry after failure", "失败时自动禁用通道": "失敗時にチャネルを自動的に無効にする", "失败重试次数": "再試行回数", "奖励说明": "特典説明", + "套餐": "プラン", + "套餐副标题": "プランのサブタイトル", + "套餐名称": "プラン名", + "套餐标题": "プラン名", + "套餐标题不能为空": "Plan title cannot be empty", + "套餐的基本信息和定价": "プランの基本情報と価格", "如:大带宽批量分析图片推荐": "例:広帯域での画像一括分析に推奨", "如:香港线路": "例:香港回線", + "如果亲和到的渠道失败,重试到其他渠道成功后,将亲和更新到成功的渠道。": "If the affinity channel fails, after retrying and succeeding with another channel, the affinity will be updated to the successful channel.", "如果你对接的是上游One API或者New API等转发项目,请使用OpenAI类型,不要使用此类型,除非你知道你在做什么。": "New APIなどのリレープロジェクトに接続する場合は、OpenAIタイプを利用してください。設定内容を熟知している場合を除き、このタイプは利用しないでください", "如果用户请求中包含系统提示词,则使用此设置拼接到用户的系统提示词前面": "ユーザーリクエストにシステムプロンプトが含まれている場合、この設定内容がユーザーのシステムプロンプトの前に追加されます", "如果镜像为私有,请填写密码或Token": "If the image is private, please fill in the password or token", "如果镜像为私有,请填写用户名": "If the image is private, please fill in the username", "始终使用浅色主题": "常にライトテーマを使用", "始终使用深色主题": "常にダークテーマを使用", + "字段映射": "Field Mapping", "字段透传控制": "フィールドパススルー制御", + "字节火山方舟、豆包通用": "ByteDance Volcengine / Doubao", "存在惩罚,鼓励讨论新话题": "存在ペナルティ、新しいトピックを促進", "存在重复的键名:": "キー名が重複しています:", "安全提醒": "セキュリティ通知", @@ -809,8 +1046,8 @@ "完整的 Base URL,支持变量{model}": "完全なベースURL(変数{model}に対応)", "官方": "公式", "官方文档": "公式ドキュメント", - "官方说明": "公式ドキュメント", "官方模型同步": "公式モデルの同期", + "官方说明": "公式ドキュメント", "定价模式": "課金タイプ", "定时测试所有通道": "すべてのチャネルの定期テスト", "定期更改密码可以提高账户安全性": "パスワードを定期的に変更することで、アカウントのセキュリティが向上します", @@ -847,8 +1084,11 @@ "密码重置": "パスワードリセット", "密码重置完成": "パスワードリセットが完了しました", "密码重置确认": "パスワードのリセットの確認", + "密码长度不得小于 8 位!": "Password must be at least 8 characters!", "密码长度至少为8个字符": "パスワードは8文字以上にしてください", "密钥": "APIキー", + "密钥 JSON 必须包含 access_token": "Secret JSON must contain access_token", + "密钥 JSON 必须包含 account_id": "Secret JSON must contain account_id", "密钥(编辑模式下,保存的密钥不会显示)": "APIキー(編集モードでは、保存済みのAPIキーは表示されません)", "密钥去重": "APIキーの重複排除", "密钥将以Bearer方式添加到请求头中,用于验证webhook请求的合法性": "シークレットキーは、Webhookリクエストの正当性を検証するため、Bearerトークンとしてリクエストヘッダーに追加されます。", @@ -856,6 +1096,8 @@ "密钥已启用": "APIキーが有効になりました", "密钥已复制到剪贴板": "APIキーがクリップボードにコピーされました", "密钥已禁用": "APIキーが無効になりました", + "密钥必须是 JSON 对象": "Secret must be a JSON object", + "密钥必须是合法的 JSON 格式!": "Secret must be valid JSON format!", "密钥文件 (.json)": "APIキーファイル(.json)", "密钥更新模式": "APIキー更新モード", "密钥格式": "APIキー形式", @@ -882,9 +1124,13 @@ "将仅保留第一个密钥文件,其余文件将被移除,是否继续?": "最初のAPIキーファイルのみ保持され、残りのファイルは削除されます。続行しますか?", "将删除": "削除の確認", "将删除已使用、已禁用及过期的兑换码,此操作不可撤销。": "使用済み、無効、および有効期限切れの引き換えコードを削除します。この操作は元に戻すことはできません。", + "将删除所有仍在内存中的渠道亲和性缓存条目。": "All channel affinity cache entries still in memory will be deleted.", + "将大请求体临时存储到磁盘": "Store large request bodies temporarily on disk", "将清除所有保存的配置并恢复默认设置,此操作不可撤销。是否继续?": "保存されているすべての設定がクリアされ、デフォルト設定に復元されます。この操作は元に戻すことはできません。続行しますか?", "将清除选定时间之前的所有日志": "選択した日時以前のすべてのログをクリアします", + "将追加 2 条规则到现有规则列表。": "2 rules will be appended to the existing rule list.", "小时": "時間", + "小时前": "hours ago", "小时费率": "Hourly Rate", "尚未使用": "未使用", "局部重绘-提交": "部分再描画", @@ -893,18 +1139,27 @@ "展开": "展開", "展开更多": "もっと見る", "展示价格": "Display Pricing", + "嵌入模型:MokaAI M3E": "Embedding Model: MokaAI M3E", "左侧边栏个人设置": "サイドバーのアカウント設定", "已为 {{count}} 个模型设置{{type}}_one": "{{count}}個のモデルに{{type}}が設定されました_one", "已为 {{count}} 个模型设置{{type}}_other": "{{count}}個のモデルに{{type}}_otherが設定されました_other", "已为 ${count} 个渠道设置标签!": "${count}個のチャネルにタグが設定されました", + "已从 Discovery 自动填充配置": "Config auto-filled from Discovery", + "已从 Discovery 获取配置,可继续手动修改所有字段。": "Config retrieved from Discovery, you can continue to manually modify all fields.", + "已作废": "無効化済み", + "已使用": "Used", + "已使用:": "Used:", + "已保存偏好为": "保存された設定は", "已修复 ${success} 个通道,失败 ${fails} 个通道。": "${success}個のチャネルを修復し、${fails}個は失敗しました。", "已停止": "Stopped", "已停止批量测试": "一括テストを停止しました", "已关闭后续提醒": "今後の通知を無効にしました", + "已分配内存": "Allocated Memory", "已切换为Assistant角色": "アシスタントロールに切り替えられました", "已切换为System角色": "システムロールに切り替えられました", "已切换至最优倍率视图,每个模型使用其最低倍率分组": "各モデルが最低倍率グループを利用する最適倍率ビューに切り替えられました", "已初始化": "初期化済み", + "已删除": "Deleted", "已删除 {{count}} 个令牌!": "{{count}}個のトークンが削除されました", "已删除 {{count}} 个令牌!_other": "Deleted {{count}} tokens!", "已删除 {{count}} 条失效兑换码_one": "無効な引き換えコードが{{count}}件削除されました_one", @@ -912,13 +1167,18 @@ "已删除 ${data} 个通道!": "${data}個のチャネルが削除されました!", "已删除所有禁用渠道,共计 ${data} 个": "すべての無効なチャネル(合計${data}個)が削除されました", "已删除消息及其回复": "メッセージとその返信が削除されました", + "已发起支付": "支払いを開始しました", "已发送到 Fluent": "Fluentに送信されました", "已取消 Passkey 注册": "Passkeyの登録がキャンセルされました", + "已取消 Passkey 登录": "Passkey login cancelled", "已同步到渠道": "Synced to Channel", "已启用": "有効", "已启用 Passkey,无需密码即可登录": "Passkeyが有効になり、パスワードなしでログインできます", "已启用所有密钥": "すべてのAPIキーが有効になりました", "已在自定义模式中忽略": "カスタムモードで無視されました", + "已填充提示模板": "Prompt template filled", + "已填充模版": "Template filled", + "已填充策略模板": "Policy template filled", "已备份": "バックアップ済み", "已复制": "コピーされました", "已复制 ${count} 个模型": "${count}個のモデルがコピーされました", @@ -935,6 +1195,8 @@ "已完成": "Completed", "已开启全局请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "全体のリクエストパススルーが有効です。パラメータ上書き、モデルリダイレクト、チャネル適応などの NewAPI 内蔵機能は無効になります。ベストプラクティスではありません。これにより問題が発生しても issue を投稿しないでください。", "已成功开始测试所有已启用通道,请刷新页面查看结果。": "有効なすべてのチャネルのテストを開始しました。ページを更新して結果を確認してください。", + "已打开授权页面": "Authorization page opened", + "已打开支付页面": "決済ページを開きました", "已提交": "送信済み", "已支付金额": "Amount Paid", "已新增 {{count}} 个模型:{{list}}_one": "{{count}}個のモデルが追加されました:{{list}}_one", @@ -948,31 +1210,44 @@ "已注销": "ログアウトしました", "已添加": "追加済み", "已添加到白名单": "ホワイトリストに追加されました", + "已清空": "Cleared", "已清空测试结果": "テスト結果がクリアされました", + "已生成授权凭据": "Authorization credentials generated", "已用": "Used", "已用/剩余": "使用済み/残り", "已用额度": "使用済みクォータ", "已禁用": "無効", "已禁用所有密钥": "すべてのAPIキーが無効になりました", + "已终止": "Terminated", "已绑定": "連携済み", "已绑定渠道": "連携済みのチャネル", "已结束": "Ended", "已耗尽": "上限到達", "已解锁豆包自定义 API 地址编辑": "Custom Doubao API address editing unlocked", + "已达上限": "上限に達しました", + "已达到购买上限": "購入上限に達しました", "已过期": "有効期限切れ", "已运行时间": "Uptime", "已选择 {{count}} 个模型_one": "{{count}}個のモデルが選択されました_one", "已选择 {{count}} 个模型_other": "{{count}}個のモデルが選択されました_other", "已选择 {{selected}} / {{total}}": "{{selected}} / {{total}} 件選択済み", "已选择 ${count} 个渠道": "${count}個のチャネルが選択されました", + "已部署": "Deployed", "已重置为默认配置": "デフォルト設定にリセットされました", "已销毁": "Destroyed", + "币种": "通貨", + "常用上下文 Key(用于 context_*)": "Common context keys (for context_*)", "常见问答": "FAQ", + "常见问答已更新": "FAQ updated", + "常见问答更新失败": "Failed to update FAQ", "常见问答管理,为用户提供常见问题的答案(最多50个,前端显示最新20条)": "FAQ管理:ユーザー向けのFAQと回答を管理します。(最大50件、フロントエンドには最新20件が表示されます)", "平台": "プラットフォーム", "平均RPM": "平均RPM", "平均TPM": "平均TPM", "平移": "パン", + "年": "年", + "年前": "years ago", + "应付金额": "支払金額", "应用同步": "同期の実行", "应用更改": "変更を適用", "应用覆盖": "上書きの適用", @@ -990,18 +1265,25 @@ "开": "On", "开启之后会清除用户提示词中的": "有効にすると、ユーザープロンプトがクリアされます", "开启之后将上游地址替换为服务器地址": "有効にすると、アップストリームアドレスがサーバーURLに置換されます", + "开启后,using_group 会参与 cache key(不同分组隔离)。": "When enabled, using_group is included in the cache key (isolated by group).", "开启后,仅\"消费\"和\"错误\"日志将记录您的客户端IP地址": "有効にすると、「消費」と「エラー」のログにのみ、クライアントIPアドレスが記録されます", "开启后,对免费模型(倍率为0,或者价格为0)的模型也会预消耗额度": "After enabling, free models (ratio 0 or price 0) will also pre-consume quota", "开启后,将定期发送ping数据保持连接活跃": "有効にすると、接続をアクティブに保つためにpingデータが定期的に送信されます", "开启后,当前分组渠道失败时会按顺序尝试下一个分组的渠道": "有効にすると、現在のグループチャネルが失敗した場合、次のグループのチャネルを順番に試行します", "开启后,所有请求将直接透传给上游,不会进行任何处理(重定向和渠道适配也将失效),请谨慎开启": "有効にすると、すべてのリクエストは直接アップストリームにパススルーされ、いかなる処理も行われません(リダイレクトとチャネルの自動調整も無効になります)。有効にする際はご注意ください", + "开启后,若该规则命中且请求失败,将不会切换渠道重试。": "When enabled, if this rule matches and the request fails, no channel retry will occur.", + "开启后,规则名称会参与 cache key(不同规则隔离)。": "When enabled, the rule name is included in the cache key (isolated by rule).", + "开启后,该渠道请求 Claude 时将强制追加 ?beta=true(无需客户端手动传参)": "When enabled, requests to Claude through this channel will force append ?beta=true (no need for client to pass it manually)", "开启后,违规请求将额外扣费。": "有効にすると、違反リクエストには追加料金が発生します。", "开启后不限制:必须设置模型倍率": "有効化後は制限なし:モデル倍率の設定が必須", "开启后未登录用户无法访问模型广场": "有効にすると、ログインしていないユーザーはモデルマーケットプレイスにアクセスできなくなります", "开启批量操作": "一括操作を有効にする", + "开始": "開始", "开始同步": "同期開始", "开始批量测试 ${count} 个模型,已清空上次结果...": "${count}個のモデルの一括テストを開始します。前回の結果はリセットされました…", "开始时间": "開始時間", + "异常": "Error", + "异步任务退款": "非同期タスク返金", "张图片": "枚の画像", "弱变换": "バリエーション(弱)", "强制将响应格式化为 OpenAI 标准格式(只适用于OpenAI渠道类型)": "レスポンスをOpenAI標準形式に強制フォーマットします(OpenAIタイプのチャネルのみ対応)。", @@ -1011,6 +1293,7 @@ "当上游通道返回错误中包含这些关键词时(不区分大小写),自动禁用通道": "アップストリームチャネルがこれらのキーワード(大文字と小文字を区別しない)を含むエラーを返した場合、チャネルは自動的に無効になります", "当前 API 密钥已过期,请在设置中更新。": "Current API key has expired, please update it in settings.", "当前 Ollama 版本为 ${version}": "Current Ollama version is ${version}", + "当前仅 OpenAI / Claude 语义支持缓存 token 统计,其他通道将隐藏 token 相关字段。": "Currently only OpenAI / Claude semantics support cached token statistics, other channels will hide token-related fields.", "当前余额": "現在の残高", "当前值": "現在の値", "当前分组为 auto,会自动选择最优分组,当一个组不可用时自动降级到下一个组(熔断机制)": "現在のグループは auto です。最適なグループが自動的に選択され、利用できないグループが発生した場合は、次のグループへ自動的にフォールバックします(サーキットブレーカー機能)", @@ -1019,23 +1302,29 @@ "当前未开启Midjourney回调,部分项目可能无法获得绘图结果,可在运营设置中开启。": "現在、Midjourneyコールバックが有効になっていないため、一部のプロジェクトで画像生成結果を取得できない場合があります。この機能は運用設定で有効にできます", "当前查看的分组为:{{group}},倍率为:{{ratio}}": "現在表示中のグループ:{{group}}、倍率:{{ratio}}", "当前模型列表为该标签下所有渠道模型列表最长的一个,并非所有渠道的并集,请注意可能导致某些渠道模型丢失。": "現在のモデルリストは、このタグに属するチャネルの中で最も長いモデルリストを採用しており、すべてのチャネルのモデルの和集合ではありません。これにより一部のチャネルのモデルがリストに含まれない可能性があるため、ご注意ください。", + "当前没有可用的启用令牌,请确认是否有令牌处于启用状态!": "No enabled tokens available, please check if any tokens are in enabled state!", + "当前浏览器不支持 Passkey": "Current browser does not support Passkey", "当前版本": "現在のバージョン", "当前状态": "Current Status", + "当前环境无法使用 Passkey 登录": "Cannot use Passkey login in current environment", + "当前缓存大小": "Current Cache Size", "当前计费": "現在の課金", "当前设备不支持 Passkey": "このデバイスはPasskeyに対応していません", "当前设置类型: ": "現在の設定タイプ:", "当前跟随系统": "システム設定に準拠", "当前配置无法连接到 io.net。": "Unable to connect to io.net with current configuration.", - "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知": "ウォレットまたはサブスクリプションの残りクォータがこの値を下回ると、システムは選択した方法で通知します", "当模型没有设置价格时仍接受调用,仅当您信任该网站时使用,可能会产生高额费用": "モデルに料金が設定されていない場合でもAPIコールを受け付けます。信頼できるウェブサイトの場合にのみ使用してください。高額な料金が発生する可能性があります", "当运行通道全部测试时,超过此时间将自动禁用通道": "すべてのチャネルテストの実行時、この時間を超えたチャネルは自動的に無効になります", + "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知": "ウォレットまたはサブスクリプションの残りクォータがこの値を下回ると、システムは選択した方法で通知します", "待使用收益": "未使用の収益", "待部署": "Pending Deployment", "微信": "WeChat Pay", + "微信二维码": "WeChat QR Code", "微信公众号二维码图片链接": "WeChat公式アカウントのQRコード画像URL", "微信扫码关注公众号,输入「验证码」获取验证码(三分钟内有效)": "WeChatでQRコードをスキャンして公式アカウントをフォローし、「認証コード」と送信してコードを取得してください(3分間有効)。", "微信扫码登录": "WeChatでQRコードをスキャンしてログイン", "微信账户绑定成功!": "WeChatアカウントの連携に成功しました", + "必填。对请求的 model 名称进行匹配,任意一条匹配即命中该规则。": "Required. Match the model name in the request, any match triggers the rule.", "必须是有效的 JSON 字符串数组,例如:[\"g1\",\"g2\"]": "有効なJSON文字列の配列である必要があります。例:[\"g1\",\"g2\"]", "忘记密码?": "パスワードをお忘れですか?", "快速开始": "クイックスタート", @@ -1046,8 +1335,11 @@ "思考适配 BudgetTokens 百分比": "思考モード:BudgetTokensの割合(%)", "思考预算占比": "思考予算の割合", "性能指标": "性能指標", + "性能监控": "Performance Monitor", + "性能设置": "Performance Settings", "总 GPU 小时": "Total GPU Hours", "总价:文字价格 {{textPrice}} + 音频价格 {{audioPrice}} = {{symbol}}{{total}}": "合計料金:テキスト料金 {{textPrice}} + オーディオ料金 {{audioPrice}} = {{symbol}}{{total}}", + "总分配内存": "Total Allocated Memory", "总密钥数": "合計APIキー数", "总收益": "総収益", "总计": "総計", @@ -1058,6 +1350,7 @@ "您正在使用 MySQL 数据库。MySQL 是一个可靠的关系型数据库管理系统,适合生产环境使用。": "現在、MySQLデータベースを使用しています。MySQLは信頼性の高いリレーショナルデータベース管理システムであり、本番環境での利用に適しています。", "您正在使用 PostgreSQL 数据库。PostgreSQL 是一个功能强大的开源关系型数据库系统,提供了出色的可靠性和数据完整性,适合生产环境使用。": "現在、PostgreSQLデータベースを使用しています。PostgreSQLは、優れた信頼性とデータ整合性を提供する強力なオープンソースのリレーショナルデータベースシステムであり、本番環境での利用に適しています。", "您正在使用 SQLite 数据库。如果您在容器环境中运行,请确保已正确设置数据库文件的持久化映射,否则容器重启后所有数据将丢失!": "現在、SQLite データベースを使用しています。コンテナ環境で実行している場合、データベースファイルの永続化マッピングが正しく設定されていることをご確認ください。設定されていない場合、コンテナの再起動後にすべてのデータが失われます", + "您正在使用默认密码!": "You are using the default password!", "您正在删除自己的帐户,将清空所有数据且不可恢复": "アカウントを削除します。この操作は元に戻すことができず、すべてのデータが完全に削除されます", "您的数据将安全地存储在本地计算机上。所有配置、用户信息和使用记录都会自动保存,关闭应用后不会丢失。": "データはローカルコンピュータに安全に保存されます。すべての設定、ユーザー情報、利用履歴は自動的に保存され、アプリを閉じても失われることはありません。", "您确定要取消密码登录功能吗?这可能会影响用户的登录方式。": "パスワードログイン機能を無効にしてもよろしいですか?この操作はユーザーのログイン方法に影響を与える可能性があります。", @@ -1066,9 +1359,12 @@ "想起来了?": "ログインに戻る", "成功": "成功", "成功兑换额度:": "引き換え額:", + "成功后切换亲和": "Switch Affinity on Success", "成功时自动启用通道": "成功時にチャネルを自動的に有効にする", "我已了解禁用两步验证将永久删除所有相关设置和备用码,此操作不可撤销": "2要素認証を無効にすると、すべての関連設定とバックアップコードが永久に削除され、この操作は元に戻すことができないことを理解しました", "我已阅读并同意": "読んで同意します", + "我的订阅": "私のサブスクリプション", + "我确认开启高危重试": "I confirm enabling high-risk retry", "或": "または", "或其兼容new-api-worker格式的其他版本": "またはnew-api-worker形式と互換性のある他のバージョン", "或手动输入密钥:": "またはAPIキーを手動で入力:", @@ -1079,6 +1375,9 @@ "手动编辑": "手動編集", "手动输入": "手動入力", "打开侧边栏": "サイドバーを展開", + "打开授权页面": "Open Authorization Page", + "扣费": "Charge", + "执行 GC": "Run GC", "执行中": "実行中", "扫描二维码": "QRコードスキャン", "批量创建": "一括作成", @@ -1105,6 +1404,8 @@ "拉取新模型": "Pull New Model", "拉取模型": "Pull Model", "拉取进度": "Pull Progress", + "拒绝提示模板(可选)": "Rejection Prompt Template (optional)", + "拦截原因": "Block Reason", "按K显示单位": "K単位で表示", "按价格设置": "料金設定", "按倍率类型筛选": "倍率タイプで絞り込み", @@ -1116,6 +1417,7 @@ "换脸": "フェイススワップ", "授权,需在遵守": "の条件に基づき、", "授权失败": "認可に失敗しました", + "排序": "並び順", "排队中": "待機中", "接受未设置价格模型": "料金未設定モデルを許可", "接口凭证": "API認証情報", @@ -1124,6 +1426,7 @@ "控制台区域": "コンソールエリア", "控制输出的随机性和创造性": "出力のランダム性と創造性を制御", "控制顶栏模块显示状态,全局生效": "トップバーモジュールの表示ステータスをグローバルに制御します", + "推荐": "おすすめ", "推荐:用户可以选择是否使用指纹等验证": "推奨:ユーザーは指紋認証などの利用を選択できます", "推荐使用(用户可选)": "(オプション)推奨", "描述": "説明", @@ -1135,12 +1438,14 @@ "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "Prompt {{input}} tokens / 1M tokens * {{symbol}}{{price}}", "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "プロンプト {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 補完 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 缓存创建 {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "プロンプト {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + キャッシュ {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + キャッシュ作成 {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + 補完 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "提示:": "Note:", "提示:如需备份数据,只需复制上述目录即可": "ヒント:データをバックアップする際は、上記のディレクトリをコピーしてください", + "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。": "注意: ここでの設定は「モデル広場」での表示にのみ影響し、実際の呼び出しやルーティングには影響しません。実際の呼び出しを設定する場合は、「チャネル管理」で設定してください。", + "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。": "注意: この機能はベータ版です。今後、設定構造や挙動が変更される可能性があります。本番環境では使用しないでください。", + "提示:语言偏好会同步到您登录的所有设备,并影响API返回的错误消息语言。": "Note: Language preference syncs across all your logged-in devices and affects the language of API error messages.", "提示:链接中的{key}将被替换为API密钥,{address}将被替换为服务器地址": "ヒント:リンク内の{key}はAPIキーに、{address}はサーバーURLに置換されます", "提示价格:{{symbol}}{{price}} / 1M tokens": "プロンプト料金:{{symbol}}{{price}} / 1M tokens", "提示缓存倍率": "プロンプトキャッシュ倍率", - "缓存创建倍率": "キャッシュ作成倍率", - "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)": "デフォルトは5mのキャッシュ作成倍率です。1hのキャッシュ作成倍率は固定乗数で自動計算されます(現在は1.6倍)", "搜索供应商": "プロバイダーで検索", "搜索关键字": "検索キーワード", "搜索失败": "Search failed", @@ -1157,13 +1462,18 @@ "操作": "操作", "操作失败": "操作に失敗しました", "操作失败,请重试": "操作に失敗しました。再試行してください。", + "操作失败: ": "Operation failed: ", "操作成功完成!": "操作が正常に完了しました", "操作暂时被禁用": "この操作は一時的に無効にされています", + "操作确认": "Operation confirmation", "操练场": "Playground", "操练场和聊天功能": "プレイグラウンドとチャット機能", + "支付": "支払う", "支付地址": "決済URL", + "支付失败": "支払いに失敗しました", "支付宝": "Alipay", "支付方式": "チャージ方法", + "支付渠道": "決済チャネル", "支付设置": "決済設定", "支付请求失败": "決済リクエストに失敗しました", "支付金额": "決済金額", @@ -1175,11 +1485,15 @@ "支持众多的大模型供应商": "様々な大規模言語モデルプロバイダーに対応しています", "支持单个端口和端口范围,如:80, 443, 8000-8999": "単一ポートとポート範囲に対応しています(例:80, 443, 8000-8999)", "支持变量:": "利用可能な変数:", + "支持周期性重置套餐权益额度": "プランのクォータを定期的にリセット可能", + "支持填写单个状态码或范围(含首尾),使用逗号分隔": "Supports single status codes or inclusive ranges; separate with commas", + "支持填写单个状态码或范围(含首尾),使用逗号分隔;504 和 524 始终不重试,不受此处配置影响": "Supports single status codes or inclusive ranges; separate with commas. 504 and 524 are never retried and are not affected by this setting", "支持备份": "バックアップ対応", "支持拉取 Ollama 官方模型库中的所有模型,拉取过程可能需要几分钟时间": "Supports pulling all models from the Ollama official model library, the pulling process may take a few minutes", "支持搜索用户的 ID、用户名、显示名称和邮箱地址": "ユーザーID、ユーザー名、表示名、メールアドレスで検索", "支持的图像模型": "利用可能な画像モデル", "支持通配符格式,如:example.com, *.api.example.com": "ワイルドカード形式に対応しています(例:example.com, *.api.example.com)", + "支持逻辑 and/or 与嵌套 groups;操作符支持 eq/ne/gt/gte/lt/lte/in/not_in/contains/exists": "Supports logical and/or with nested groups; operators: eq/ne/gt/gte/lt/lte/in/not_in/contains/exists", "收益": "収益", "收益统计": "収益統計", "收起": "折りたたみ", @@ -1210,10 +1524,16 @@ "文档": "ドキュメント", "文档地址": "ドキュメントURL", "文生视频": "テキストからの動画生成", + "新增 Key 来源": "Add Key Source", "新增供应商": "プロバイダーの追加", + "新增失败": "Failed to add", + "新增成功": "Added successfully", + "新增规则": "Add Rule", + "新增订阅": "サブスクリプションを追加", "新密码": "新しいパスワード", "新密码需要和原密码不一致!": "新しいパスワードは現在のパスワードと同じにすることはできません", "新建": "新規作成", + "新建套餐": "プラン作成", "新建容器": "Create Container", "新建容器部署": "Create Container Deployment", "新建数量": "作成数", @@ -1233,13 +1553,17 @@ "无效的部署信息": "Invalid deployment information", "无效的重置链接,请重新发起密码重置请求": "無効なパスワードリセットリンクです。再度パスワードのリセットをリクエストしてください", "无法发起 Passkey 注册": "Passkeyの登録を開始できません", + "无法发起 Passkey 登录": "Unable to initiate Passkey login", "无法复制到剪贴板,请手动复制": "クリップボードにコピーできません。手動でコピーしてください。", + "无法复制此类型的消息内容": "Cannot copy this type of message content", "无法添加图片": "画像を追加できません", "无法获取容器详情": "Unable to get container details", "无法连接 io.net": "Unable to connect to io.net", + "无生效": "有効なし", "无邀请人": "招待元なし", "无限制": "無制限", "无限额度": "無制限クォータ", + "日": "日", "日志导出成功": "Logs exported successfully", "日志已下载": "Logs downloaded", "日志已加载": "Logs loaded", @@ -1252,10 +1576,12 @@ "旧格式(直接覆盖):": "旧形式(直接上書き):", "旧格式模板": "旧形式テンプレート", "旧的备用码已失效,请保存新的备用码": "古いバックアップコードは無効になりました。新規バックアップコードを保存してください", + "旧配置迁移完成": "Legacy config migration complete", "早上好": "おはようございます", "时间": "時間", "时间信息": "Time Information", "时间粒度": "時間粒度", + "易支付": "Epay", "易支付商户ID": "Epay マーチャントID", "易支付商户密钥": "Epay APIキー", "是": "はい", @@ -1268,6 +1594,7 @@ "显示倍率": "表示倍率", "显示最新20条": "最新20件を表示", "显示名称": "表示名", + "显示名称字段(可选)": "Display Name Field (optional)", "显示完整内容": "すべてのコンテンツを表示", "显示操作项": "操作項目を表示", "显示更多": "もっと見る", @@ -1280,6 +1607,8 @@ "智能体ID": "エージェントID", "智能熔断": "スマートフォールバック", "智谱": "Zhipu AI", + "智谱 ChatGLM(已经弃用,请使用智谱 GLM-4V)": "Zhipu ChatGLM (deprecated, use Zhipu GLM-4V)", + "智谱 GLM-4V": "Zhipu GLM-4V", "暂无": "None", "暂无API信息": "API情報はありません", "暂无SSE响应数据": "SSE応答データがありません", @@ -1289,12 +1618,15 @@ "暂无公告": "お知らせはありません", "暂无匹配模型": "マッチングするモデルはありません", "暂无可复制的版本信息": "No version information to copy", + "暂无可展示数据": "No data to display", "暂无可用的支付方式,请联系管理员配置": "利用可能なチャージ方法はありません。設定については管理者にお問い合わせください", + "暂无可购买套餐": "購入可能なプランがありません", "暂无响应数据": "レスポンスデータはありません", "暂无容器信息": "No container information", "暂无容器详情": "No container details", "暂无密钥数据": "APIキーのデータはありません", "暂无差异化倍率显示": "表示する差別化倍率がありません", + "暂无已绑定项": "No bound items", "暂无常见问答": "FAQはありません", "暂无成功模型": "成功したモデルはありません", "暂无数据": "データなし", @@ -1309,6 +1641,9 @@ "暂无监控数据": "監視データはありません", "暂无系统公告": "システムからのお知らせはありません", "暂无缺失模型": "欠落しているモデルはありません", + "暂无自定义 OAuth 提供商": "No custom OAuth providers", + "暂无订阅套餐": "利用可能なサブスクリプションプランがありません", + "暂无订阅记录": "サブスクリプション記録がありません", "暂无请求数据": "リクエストデータはありません", "暂无项目": "プロジェクトはありません", "暂无预填组": "事前入力グループはありません", @@ -1327,9 +1662,11 @@ "更新名称失败": "Failed to update name", "更新失败": "更新に失敗しました", "更新失败,请检查输入信息": "Update failed, please check the input information", + "更新套餐信息": "プラン情報を更新", "更新容器配置": "Update Container Configuration", "更新容器配置可能会导致容器重启,请确保在合适的时间进行此操作。": "Updating container configuration may cause the container to restart, please ensure you perform this operation at an appropriate time.", "更新成功": "更新に成功しました", + "更新成功!": "Updated successfully!", "更新所有已启用通道余额": "有効なすべてのチャネルの残高を更新", "更新支付设置": "決済設定の更新", "更新时间": "更新日時", @@ -1341,16 +1678,25 @@ "更新配置后,容器可能需要重启以应用新的设置。请确保您了解这些更改的影响。": "After updating the configuration, the container may need to restart to apply the new settings. Please ensure you understand the impact of these changes.", "更新配置失败": "Failed to update configuration", "更新预填组": "事前入力グループの更新", + "月": "月", "有 Reasoning": "推論あり", + "有异常": "Has Errors", + "有效期": "有効期限", + "有效期单位": "有効期限の単位", + "有效期数值": "有効期限の値", + "有效期设置": "有効期限設定", "服务可用性": "サービスの可用性", "服务商": "Service Provider", "服务器地址": "サーバーURL", "服务显示名称": "サービス表示名", + "未使用": "Unused", + "未匹配到模型,按回车键可将「{{name}}」作为自定义模型名添加": "一致するモデルが見つかりません。Enterキーで「{{name}}」をカスタムモデル名として追加できます。", "未发现新增模型": "追加された新規モデルはありません", "未发现重复密钥": "重複したAPIキーは見つかりませんでした", "未启动": "未開始", "未启用": "無効", "未命名": "未命名", + "未在 Discovery 响应中找到可用的 OAuth 端点": "No available OAuth endpoints found in Discovery response", "未备份": "未バックアップ", "未开始": "未開始", "未找到匹配的模型": "マッチングするモデルが見つかりませんでした", @@ -1377,9 +1723,13 @@ "未设置倍率模型": "倍率が未設定のモデル", "未配置模型": "未設定モデル", "未配置的模型列表": "未設定のモデルリスト", + "本周": "This Week", "本地": "ローカル", "本地数据存储": "ローカルストレージ", "本地计费": "Local billing", + "本月": "This Month", + "本月获得": "今月の獲得", + "本站仅作演示之用,无服务端!": "This site is for demo purposes only, no server!", "本设备:手机指纹/面容,外接:USB安全密钥": "内蔵:スマートフォンの指紋/顔認証、外部:USBセキュリティキー", "本设备内置": "このデバイス", "本项目根据": "本プロジェクトは", @@ -1387,11 +1737,13 @@ "机密环境变量将被加密存储,适用于存储密码、API密钥等敏感信息。": "Secret environment variables will be stored encrypted, suitable for storing passwords, API keys and other sensitive information.", "机密环境变量说明": "Secret Environment Variables Description", "权重": "ウェイト", + "权重必须是非负整数!": "Weight must be a non-negative integer!", "权限设置": "権限設定", "条": "件", "条 - 第": "~", "条,共": "件、合計", "条日志已清理!": "件のログがクリアされました", + "来源": "ソース", "来源于 IO.NET 部署": "From IO.NET Deployment", "来自模型重定向,尚未加入模型列表": "From model redirect, not yet added to the model list", "某些配置更改可能需要几分钟才能生效。": "Some configuration changes may take a few minutes to take effect.", @@ -1409,20 +1761,26 @@ "标签不能为空!": "タグは空にできません", "标签信息": "タグ情報", "标签名称": "タグ名", + "标签更新成功!": "Tag updated successfully!", "标签的基本配置": "タグの基本設定", "标签组": "タググループ", "标签聚合": "タグ別表示", "标签聚合模式": "タグ別表示モード", "标识颜色": "識別カラー", "核采样,控制词汇选择的多样性": "ニュークリアスサンプリング、語彙選択の多様性を制御", + "根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。": "Anthropic の仕様により、/v1/messages の入力 tokens は非キャッシュ入力のみを集計し、キャッシュ読み取り/書き込み tokens は含みません。", "根据模型名称和匹配规则查找模型元数据,优先级:精确 > 前缀 > 后缀 > 包含": "モデル名とマッチングルールに基づきモデルメタデータを検索します。優先度:完全一致 > プレフィックス > サフィックス > 部分一致", "格式化": "フォーマット", + "格式化 JSON": "JSON を整形", "格式正确": "有効な形式", "格式示例:": "フォーマット例:", "格式错误": "無効な形式", "检查更新": "更新を確認", + "检查更新失败,请稍后再试": "Failed to check for updates, please try again later", "检测到 FluentRead(流畅阅读)": "FluentReadが検出されました", + "检测到以下高危状态码重定向规则": "Detected high-risk status-code redirect rules", "检测到多个密钥,您可以单独复制每个密钥,或点击复制全部获取完整内容。": "複数のAPIキーが検出されました。各キーを個別にコピーするか、「すべてコピー」をクリックして全内容を取得できます。", + "检测到旧版本的配置数据,是否要迁移到新的配置格式?": "Legacy config data detected, migrate to the new config format?", "检测到该消息后有AI回复,是否删除后续回复并重新生成?": "このメッセージの後にAIからの返信があります。後続の返信を削除して再生成しますか?", "检测必须等待绘图成功才能进行放大等操作": "アップスケールなどの操作を行うには、画像生成が成功するまで待つ必要があります", "模型": "モデル", @@ -1431,6 +1789,7 @@ "模型价格": "モデル料金", "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}": "モデル料金 {{symbol}}{{price}}、{{ratioType}} {{ratio}}", "模型价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "モデル料金:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}", + "模型价格不能为0": "Model price cannot be 0", "模型倍率": "モデル倍率", "模型倍率 {{modelRatio}}": "Model ratio {{modelRatio}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}}": "モデル倍率 {{modelRatio}}、キャッシュ倍率 {{cacheRatio}}、補完倍率 {{completionRatio}}、{{ratioType}} {{ratio}}", @@ -1461,6 +1820,9 @@ "模型映射必须是合法的 JSON 格式!": "モデルマッピングは、有効なJSON形式である必要があります", "模型更新成功!": "モデルの更新に成功しました!", "模型未加入列表,可能无法调用": "Model not in the list; requests may fail", + "模型正则": "Model Regex", + "模型正则(每行一个)": "Model Regex (one per line)", + "模型正则不能为空": "Model regex cannot be empty", "模型消耗分布": "モデル消費分布", "模型消耗趋势": "モデル消費推移", "模型版本": "モデルバージョン", @@ -1488,6 +1850,7 @@ "欢迎使用,请完成以下设置以开始使用系统": "ようこそ。システムを利用開始するには、以下の設定を完了してください", "欧元": "EUR", "正在加载可用部署位置...": "Loading available deployment locations...", + "正在加载签到状态...": "チェックイン状態を読み込み中...", "正在处理大内容...": "大容量のコンテンツを処理中...", "正在提交": "送信中", "正在构造请求体预览...": "リクエストボディのプレビューを生成中...", @@ -1496,6 +1859,7 @@ "正在跟随最新日志": "Following latest logs", "正在跳转 GitHub...": "GitHub にリダイレクトしています...", "正在跳转...": "リダイレクト中...", + "正常": "Normal", "此代理仅用于图片请求转发,Webhook通知发送等,AI API请求仍然由服务器直接发出,可在渠道设置中单独配置代理": "このプロキシは、画像リクエストの転送やWebhook通知の送信などにのみ使用されます。AI APIリクエストは引き続きサーバーから直接送信されます。プロキシが必要な場合は、チャネル設定で個別に設定してください", "此修改将不可逆": "この変更は元に戻すことはできません。", "此操作不可恢复,请仔细确认时间后再操作!": "この操作は元に戻すことができません。時刻を慎重にご確認の上、実行してください", @@ -1510,6 +1874,7 @@ "此操作将解绑用户当前的 Passkey,下次登录需要重新注册。": "この操作は、ユーザーの現在のPasskeyとの連携を解除します。次回ログイン時に再登録が必要になります。", "此操作将降低用户的权限级别": "この操作はユーザーの権限レベルを降格させます", "此支付方式最低充值金额为": "このチャージ方法の最低チャージ額:", + "此消息没有可复制的文本内容": "This message has no copyable text content", "此渠道由 IO.NET 自动同步,类型、密钥和 API 地址已锁定。": "This channel is automatically synchronized by IO.NET, type, key and API address are locked.", "此设置用于系统内部计算,默认值500000是为了精确到6位小数点设计,不推荐修改。": "この設定はシステム内部の計算用です。デフォルト値の500000は小数点以下6桁までの精度を確保するために設計されており、変更は推奨されません", "此页面仅显示未设置价格或倍率的模型,设置后将自动从列表中移除": "このページには料金や倍率が未設定のモデルのみが表示され、設定後にリストから自動的に削除されます", @@ -1520,11 +1885,20 @@ "此项可选,用于覆盖请求参数。不支持覆盖 stream 参数": "(オプション)リクエストヘッダーのパラメータを上書きする場合に使用します。stream パラメータの上書きはサポート対象外です。", "此项可选,用于覆盖请求头参数": "(オプション)リクエストヘッダーのパラメータを上書きする場合に使用します", "此项可选,用于通过自定义API地址来进行 API 调用,末尾不要带/v1和/": "(オプション)カスタムベースURLでのAPIコール用。末尾に/v1, /は含めません", + "每个用户最多可创建的令牌数量,默认 1000,设置过大可能会影响性能": "Maximum tokens each user can create, default 1000. Setting too high may impact performance", + "每周": "毎週", + "每周窗口": "Weekly window", + "每天": "毎日", "每容器GPU数": "GPUs per Container", + "每日仅可签到一次,请勿重复签到": "1日1回のみチェックイン可能です。重複チェックインはしないでください", + "每日签到": "毎日のチェックイン", + "每日签到可获得随机额度奖励": "毎日のチェックインでランダムなクォータ報酬を獲得できます", + "每月": "毎月", "每隔多少分钟测试一次所有通道": "すべてのチャネルのテスト間隔(分)", "永不过期": "無期限", "永久删除您的两步验证设置": "2要素認証設定を永久に削除", "永久删除所有备用码(包括未使用的)": "すべてのバックアップコード(未使用分を含む)を永久に削除", + "没有任何修改!": "No changes made!", "没有匹配的日志条目": "No matching log entries", "没有可用令牌用于填充": "利用可能なトークンがありません", "没有可用模型": "利用可能なモデルがありません", @@ -1535,15 +1909,20 @@ "注 册": "サインアップ", "注册": "サインアップ", "注册 Passkey": "Passkeyの登録", + "注册失败,请重试": "Registration failed, please try again", + "注册成功!": "Registration successful!", "注意": "ご注意", + "注意:": "Note:", "注意:JSON中重复的键只会保留最后一个同名键的值": "ご注意:JSONでは、キーが重複している場合、最後の同名キーの値のみが保持されます", "注意非Chat API,请务必填写正确的API地址,否则可能导致无法使用": "ご注意:Chat API以外の場合、必ず正しいベースURLを入力してください。正しく入力しないと、利用できません", "注销": "ログアウト", "注销成功!": "ログアウトしました", + "活跃文件": "Active Files", + "活跃缓存数": "Active Cache Count", "流": "ストリーム", + "流式": "ストリーミング", "流式响应完成": "ストリーム完了", "流式输出": "ストリーム出力", - "流式": "ストリーミング", "流量端口": "Traffic Port", "浅色": "ライト", "浅色模式": "ライトモード", @@ -1554,12 +1933,13 @@ "测试单个渠道操作项目组": "単一チャネルをテスト", "测试失败": "テストに失敗しました", "测试失败:": "Test failed: ", + "测试所有未手动禁用渠道": "手動で無効化されたものを除くすべてのチャネルをテスト", "测试所有渠道的最长响应时间": "すべてのチャネルテストの最大応答時間", "测试所有通道": "すべてのチャネルをテスト", - "测试所有未手动禁用渠道": "手動で無効化されたものを除くすべてのチャネルをテスト", "测试模式": "Test Mode", "测试连接": "Test Connection", "测速": "スピードテスト", + "浏览器不支持复制功能,请手动复制": "Browser does not support copy, please copy manually", "消息优先级": "メッセージ優先度", "消息优先级,范围0-10,默认为5": "メッセージ優先度、範囲:0~10、デフォルト:5", "消息已删除": "メッセージが削除されました", @@ -1573,6 +1953,7 @@ "深色": "ダーク", "深色模式": "ダークモード", "添加": "追加", + "添加 OAuth 提供商": "Add OAuth Provider", "添加API": "API追加", "添加产品": "Add Product", "添加令牌": "トークン作成", @@ -1593,14 +1974,22 @@ "添加键值对": "キー/値ペア追加", "添加问答": "FAQ追加", "添加额度": "残高追加", + "清理不活跃缓存": "非アクティブなキャッシュをクリーンアップ", + "清理失败": "Cleanup failed", "清空": "Clear", + "清空全部缓存": "Clear All Cache", + "清空该规则缓存": "Clear Rule Cache", "清空重定向": "マッピングをクリア", "清除历史日志": "履歴ログのクリア", "清除失效兑换码": "無効な引き換えコードを削除", "清除所有模型": "すべてのモデルをクリア", "渠道": "チャネル", "渠道 ID": "チャネルID", + "渠道:": "Channel:", "渠道ID,名称,密钥,API地址": "チャネルID\\名称\\キー\\ベースURL", + "渠道亲和性": "Channel Affinity", + "渠道亲和性:上游缓存命中": "Channel Affinity: Upstream Cache Hit", + "渠道亲和性会基于从请求上下文或 JSON Body 提取的 Key,优先复用上一次成功的渠道。": "Channel affinity prioritizes reusing the last successful channel based on keys extracted from request context or JSON body.", "渠道优先级": "チャネル優先度", "渠道信息": "チャネル情報", "渠道创建成功!": "チャネルの作成に成功しました", @@ -1632,8 +2021,6 @@ "点击此处": "こちらをクリック", "点击预览视频": "動画をプレビュー", "点击预览音乐": "音楽をプレビュー", - "音乐预览": "音楽プレビュー", - "音频无法播放": "音声を再生できません", "点击验证按钮,使用您的生物特征或安全密钥": "認証ボタンをクリックし、生体情報またはセキュリティキーを使用してください", "版权所有": "All rights reserved", "状态": "ステータス", @@ -1643,12 +2030,15 @@ "状态页面Slug": "ステータスページスラッグ", "环境变量": "Environment Variables", "生成令牌": "トークン生成", + "生成并填入": "Generate and Fill", "生成数量": "生成数", "生成数量必须大于0": "生成数は0より大きい必要があります。", "生成新的备用码": "新規バックアップコード生成", "生成歌词": "歌詞生成", "生成音乐": "音楽生成", + "生效": "有効", "用于API调用的身份验证令牌,请妥善保管": "API呼び出し用の認証トークンです。大切に保管してください。", + "用于唯一标识用户的字段路径": "Field path for uniquely identifying users", "用于配置网络代理,支持 socks5 协议": "ネットワークプロキシの設定に使用し、SOCKS5プロトコルに対応しています", "用于验证回调 new-api 的 webhook 请求的密钥,敏感信息不显示": "The key used to validate webhook requests for the callback new-api, sensitive information is not displayed.", "用以支持基于 WebAuthn 的无密码登录注册": "WebAuthnベースのパスワードレスログインとサインアップを有効にします", @@ -1662,11 +2052,14 @@ "用以支持通过微信进行登录注册": "WeChatによるログインとサインアップを有効にします", "用以防止恶意用户利用临时邮箱批量注册": "使い捨てメールアドレスを利用した、悪意のあるユーザーによる大量サインアップを防止します", "用户": "ユーザー", + "用户 ID 字段(可选)": "User ID Field (optional)", "用户个人功能": "アカウント設定", "用户主页,展示系统信息": "ユーザー向けのホーム。システム情報を表示します", "用户优先:如果用户在请求中指定了系统提示词,将优先使用用户的设置": "ユーザー優先:ユーザーがリクエストでシステムプロンプトを指定した場合、ユーザーの設定が優先されます", "用户信息": "ユーザー情報", "用户信息更新成功!": "ユーザー情報の更新に成功しました", + "用户信息缺失": "User info missing", + "用户最大令牌数量": "Max Tokens Per User", "用户分组": "ユーザーグループ", "用户分组和额度管理": "ユーザーグループとクォータの管理", "用户分组配置": "ユーザーグループ設定", @@ -1675,6 +2068,7 @@ "用户协议更新失败": "ユーザー利用規約の更新に失敗しました", "用户可选分组": "利用可能なグループ", "用户名": "ユーザー名", + "用户名字段(可选)": "Username Field (optional)", "用户名或邮箱": "ユーザー名かメールアドレス", "用户名称": "ユーザー名", "用户控制面板,管理账户": "ユーザーコンソールでアカウントを管理します", @@ -1685,25 +2079,39 @@ "用户的基本账户信息": "ユーザーの基本アカウント情報", "用户管理": "ユーザー管理", "用户组": "ユーザーグループ", + "用户订阅管理": "ユーザーサブスクリプション管理", "用户账户创建成功!": "ユーザーアカウントの作成に成功しました", "用户账户管理": "ユーザーアカウント管理", "用时/首字": "所要時間 / 初回トークン", + "由全站货币展示设置统一控制": "サイト全体の通貨表示設定で統一して管理", + "由订阅抵扣": "Deducted from subscription", + "界面语言和其他个人偏好": "Interface language and other personal preferences", + "留空使用系统临时目录": "Leave empty to use system temp directory", "留空则使用账号绑定的邮箱": "未入力の場合、アカウントに登録されているメールアドレスが使用されます", "留空则使用默认端点;支持 {path, method}": "未入力の場合、デフォルトのエンドポイントが使用されます。{path, method}に対応しています", + "留空则保持原有密钥": "Leave empty to keep existing secret", "留空则默认使用服务器地址,注意不能携带http://或者https://": "未入力の場合、デフォルトのサーバーURLが使用されます。ご注意:http://またはhttps://は含めないでください", "登 录": "ログイン", "登录": "ログイン", + "登录失败,请重试": "Login failed, please try again", + "登录成功": "Login successful", "登录成功!": "ログインに成功しました", "登录过期,请重新登录!": "セッションの有効期限が切れています。再度ログインしてください", "白名单": "ホワイトリスト", + "百度文心千帆": "Baidu ERNIE", + "百度文心千帆V2": "Baidu ERNIE V2", "的前提下使用。": "の元で利用可能です。", "监控设置": "監視設定", + "目录总大小": "Directory Total Size", + "目录文件数": "Directory File Count", "目标用户:{{username}}": "対象ユーザー:{{username}}", "直接提交": "Submit directly", "相关项目": "関連プロジェクト", "相当于删除用户,此修改将不可逆": "ユーザーの削除に相当します。この変更は元に戻すことはできません", "矛盾": "競合", "知识库 ID": "ナレッジベースID", + "知识库:AI Proxy": "Knowledge Base: AI Proxy", + "知识库:FastGPT": "Knowledge Base: FastGPT", "硬件": "Hardware", "硬件与性能": "Hardware & Performance", "硬件类型": "Hardware Type", @@ -1731,6 +2139,7 @@ "确定要删除所选的 {{count}} 个令牌吗?_other": "選択した{{count}}個のトークンを削除してもよろしいですか?_other", "确定要删除所选的 {{count}} 个模型吗?_one": "選択した{{count}}個のモデルを削除してもよろしいですか?_one", "确定要删除所选的 {{count}} 个模型吗?_other": "選択した{{count}}個のモデルを削除してもよろしいですか?_other", + "确定要删除此 OAuth 提供商吗?": "Are you sure you want to delete this OAuth provider?", "确定要删除此API信息吗?": "このAPI情報を削除してもよろしいですか?", "确定要删除此公告吗?": "このお知らせを削除してもよろしいですか?", "确定要删除此分类吗?": "この分類を削除してもよろしいですか?", @@ -1742,34 +2151,50 @@ "确定要启用此用户吗?": "このユーザーを有効にしてもよろしいですか?", "确定要提升此用户吗?": "このユーザーを昇格させてもよろしいですか?", "确定要更新所有已启用通道余额吗?": "有効なすべてのチャネルのクォータを更新してもよろしいですか?", - "确定要测试所有通道吗?": "すべてのチャネルをテストしてもよろしいですか?", "确定要测试所有未手动禁用渠道吗?": "手動で無効化されたチャネルを除くすべてのチャネルをテストしてもよろしいですか?", + "确定要测试所有通道吗?": "すべてのチャネルをテストしてもよろしいですか?", "确定要禁用所有的密钥吗?": "すべてのAPIキーを無効にしてもよろしいですか?", "确定要禁用此用户吗?": "このユーザーを無効にしてもよろしいですか?", + "确定要解绑 {{name}} 吗?": "Are you sure you want to unbind {{name}}?", "确定要降级此用户吗?": "このユーザーを降格させてもよろしいですか?", "确定重置": "リセットの確認", "确定重置模型倍率吗?": "モデル倍率をリセットしますか?", "确认": "確認", + "确认作废": "無効化の確認", + "确认关闭提示": "閉じる確認", "确认冲突项修改": "競合項目の変更の確認", "确认删除": "削除の確認", "确认删除模型": "Confirm Delete Model", "确认取消密码登录": "パスワードログイン無効化の確認", + "确认启用": "Confirm Enable", "确认密码": "パスワード(確認用)", "确认导入配置": "設定インポートの確認", "确认延长": "Confirm Extension", "确认延长容器时长": "Confirm Container Duration Extension", "确认操作": "Confirm Operation", "确认新密码": "新しいパスワードの確認", - "确认清除历史日志": "履歴のクリアの確認", "确认清理不活跃的磁盘缓存?": "非アクティブなディスクキャッシュをクリーンアップしますか?", + "确认清空全部渠道亲和性缓存": "Confirm clear all channel affinity cache", + "确认清空该规则缓存": "Confirm clear rule cache", + "确认清除历史日志": "履歴のクリアの確認", "确认禁用": "無効化の確認", "确认补单": "手動チャージの確認", "确认解绑": "連携解除の確認", "确认解绑 Passkey": "Passkey連携解除の確認", "确认设置并完成初始化": "設定を確定し初期化を実行", + "确认迁移": "Confirm Migration", "确认重置 Passkey": "Passkeyリセットの確認", "确认重置两步验证": "2要素認証リセットの確認", "确认重置密码": "パスワードをリセット", + "磁盘 阈值 (%)": "ディスクしきい値 (%)", + "磁盘使用率超过此值时拒绝请求": "ディスク使用率がこの値を超えた場合にリクエストを拒否", + "磁盘可用空间小于缓存最大总量设置": "Disk free space is less than max cache size setting", + "磁盘命中": "Disk Hits", + "磁盘缓存最大总量 (MB)": "Max Disk Cache Size (MB)", + "磁盘缓存占用的最大空间": "Maximum space occupied by disk cache", + "磁盘缓存已清理": "Disk cache cleared", + "磁盘缓存设置(磁盘换内存)": "Disk Cache Settings (Disk Swap Memory)", + "磁盘缓存阈值 (MB)": "Disk Cache Threshold (MB)", "示例": "サンプル", "示例:{\"default\": [200, 100], \"vip\": [0, 1000]}。": "例:{\"default\": [200, 100], \"vip\": [0, 1000]}。", "视频": "動画", @@ -1781,6 +2206,7 @@ "禁用两步验证": "2要素認証を無効にする", "禁用全部": "すべてを無効にする", "禁用原因": "無効化の理由", + "禁用后用户端不再展示,但历史订单不受影响。是否继续?": "無効化するとユーザー側に表示されなくなりますが、過去の注文には影響しません。続行しますか?", "禁用后的影响:": "無効化後の影響:", "禁用密钥失败": "APIキーの無効化に失敗しました", "禁用思考处理的模型列表": "Thinking処理を無効化するモデル一覧", @@ -1793,21 +2219,34 @@ "秒": "秒", "移除 functionResponse.id 字段": "functionResponse.idフィールドを削除", "移除 One API 的版权标识必须首先获得授权,项目维护需要花费大量精力,如果本项目对你有意义,请主动支持本项目": "One APIの著作権表示を削除するには、事前の許可が必要です。プロジェクトの維持には多大な労力がかかります。もしこのプロジェクトがあなたにとって有意義でしたら、積極的なご支援をお願いいたします", + "窗口:": "Window:", "窗口处理": "ウィンドウ処理", "窗口等待": "ウィンドウ待機中", + "立即签到": "今すぐチェックイン", + "立即订阅": "今すぐサブスクリプション", "站点额度展示类型及汇率": "サイトの残高表示タイプと為替レート", "端口号必须在1-65535之间": "Port number must be between 1-65535", "端口配置详细说明": "ポート設定の詳細説明", "端点": "エンドポイント", + "端点 URL 必须是完整地址(以 http:// 或 https:// 开头)": "Endpoint URL must be a full address (starting with http:// or https://)", "端点映射": "エンドポイントマッピング", - "在模型广场向用户展示的端点": "モデル広場でユーザーに表示するエンドポイント", "端点类型": "エンドポイントタイプ", "端点组": "エンドポイントグループ", + "第三方支付配置": "サードパーティ決済設定", "第三方账户绑定状态(只读)": "サードパーティアカウントの連携ステータス(読み取り専用)", "等价金额:": "相当額:", "等待中": "待機中", "等待获取邮箱信息...": "メールアドレス情報を取得中...", "筛选": "フィルター", + "签到最大额度": "チェックイン最大クォータ", + "签到最小额度": "チェックイン最小クォータ", + "签到功能允许用户每日签到获取随机额度奖励": "チェックイン機能により、ユーザーは毎日チェックインしてランダムなクォータ報酬を獲得できます", + "签到失败": "チェックインに失敗しました", + "签到奖励将直接添加到您的账户余额": "チェックイン報酬は直接アカウント残高に追加されます", + "签到奖励的最大额度": "チェックイン報酬の最大クォータ", + "签到奖励的最小额度": "チェックイン報酬の最小クォータ", + "签到成功!获得": "チェックイン成功!獲得", + "签到设置": "チェックイン設定", "管理": "管理", "管理 Ollama 模型的拉取和删除": "Manage Ollama model pulling and deletion", "管理你的 LinuxDO OAuth App": "LinuxDO OAuth Appの管理", @@ -1818,20 +2257,27 @@ "管理员未开启Stripe充值!": "管理者がStripeチャージを有効にしていません", "管理员未开启在线充值!": "管理者がオンラインチャージを有効にしていません", "管理员未开启在线充值功能,请联系管理员开启或使用兑换码充值。": "管理者がオンラインチャージ機能を有効にしていません。管理者にお問い合わせいただくか、引き換えコードでチャージしてください。", + "管理员未开启在线支付功能,请联系管理员配置。": "管理者がオンライン決済を有効にしていません。管理者に連絡してください。", "管理员未设置用户可选分组": "管理者がユーザー利用可能なグループを設定していません", "管理员设置了外部链接,点击下方按钮访问": "管理者が外部リンクを設定しています。下のボタンをクリックしてアクセスしてください", "管理员账号": "管理アカウント", "管理员账号已经初始化过,请继续设置其他参数": "管理者アカウントは初期化済みです。引き続き他のパラメータを設定してください。", "管理模型、标签、端点等预填组": "モデル、タグ、エンドポイントなどの事前入力グループ管理", + "管理用户已绑定的第三方账户,支持筛选与解绑": "Manage third-party accounts bound to users, with filtering and unbinding support", + "管理绑定": "Manage Bindings", "类型": "タイプ", "粘贴图片失败": "画像の貼り付けに失敗しました", "精确": "完全一致", + "精确名称匹配": "Exact Name Match", "系统": "システム", "系统令牌已复制到剪切板": "システムトークンがクリップボードにコピーされました", "系统任务记录": "システムタスク履歴", "系统信息": "システム情報", "系统公告": "システムからのお知らせ", + "系统公告已更新": "System announcement updated", + "系统公告更新失败": "Failed to update system announcement", "系统公告管理,可以发布系统通知和重要消息(最多100个,前端显示最新20条)": "システムからのお知らせ管理:システムに関する通知や重要なお知らせを管理します。(最大100件、フロントエンドには最新20件が表示されます)", + "系统内存": "System Memory", "系统初始化": "システム初期化", "系统初始化失败,请重试": "システム初期化に失敗しました。再試行してください", "系统初始化成功,正在跳转...": "システム初期化に成功しました。リダイレクト中...", @@ -1840,6 +2286,7 @@ "系统名称已更新": "システム名称が更新されました", "系统名称更新失败": "システム名称の更新に失敗しました", "系统已为该部署准备 Ollama 镜像与随机 API Key": "System has prepared Ollama image and random API Key for this deployment", + "系统性能监控": "システムパフォーマンス監視", "系统提示覆盖": "システムプロンプトの上書き", "系统提示词": "システムプロンプト", "系统提示词拼接": "システムプロンプトの結合", @@ -1847,22 +2294,13 @@ "系统文档和帮助信息": "システムのドキュメントとヘルプ", "系统消息": "システムメッセージ", "系统管理功能": "システム管理機能", - "系统性能监控": "システムパフォーマンス監視", - "启用性能监控后,当系统资源使用率超过设定阈值时,将拒绝新的 Relay 请求 (/v1, /v1beta 等),以保护系统稳定性。": "パフォーマンス監視が有効で、システムリソース使用率が設定されたしきい値を超えた場合、システムの安定性を保護するために新しいRelayリクエスト(/v1, /v1betaなど)は拒否されます。", - "启用性能监控": "パフォーマンス監視を有効にする", - "超过阈值时拒绝新请求": "閾値を超えた場合に新しいリクエストを拒否する", - "CPU 阈值 (%)": "CPUしきい値 (%)", - "CPU 使用率超过此值时拒绝请求": "CPU使用率がこの値を超えた場合にリクエストを拒否", - "内存 阈值 (%)": "メモリしきい値 (%)", - "内存使用率超过此值时拒绝请求": "メモリ使用率がこの値を超えた場合にリクエストを拒否", - "磁盘 阈值 (%)": "ディスクしきい値 (%)", - "磁盘使用率超过此值时拒绝请求": "ディスク使用率がこの値を超えた場合にリクエストを拒否", - "保存性能设置": "パフォーマンス設定を保存", "系统设置": "システム設定", "系统访问令牌": "システムアクセストークン", "约": "約", "索引": "インデックス", "紧凑列表": "コンパクトリスト", + "累计签到": "累計チェックイン", + "累计获得": "累計獲得", "线路描述": "チャネルの説明", "组列表": "グループリスト", "组名": "グループ名", @@ -1873,20 +2311,26 @@ "绑定": "連携", "绑定 Telegram": "Telegram連携", "绑定信息": "連携情報", + "绑定后会立即生成用户订阅(无需支付),有效期按套餐配置计算。": "紐付け後、ユーザーサブスクリプションが即時に作成されます(支払い不要)。有効期限はプラン設定に従います。", "绑定微信账户": "WeChatアカウント連携", "绑定成功!": "連携に成功しました", + "绑定订阅套餐": "サブスクリプションプランを紐付け", "绑定邮箱地址": "メールアドレス連携", + "结束": "終了", "结束时间": "終了時間", "结果图片": "結果画像", + "结算差额": "Settlement Difference", "绘图": "画像生成", "绘图任务记录": "画像生成タスク履歴", "绘图日志": "画像生成履歴", "绘图设置": "画像生成設定", "统一的": "統合型", "统计Tokens": "トークン統計", + "统计已重置": "Statistics reset", "统计次数": "リクエスト数統計", "统计额度": "クォータ統計", "继续": "次へ", + "维护中": "Maintenance", "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Cache {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", "缓存 Tokens": "キャッシュトークン", "缓存: {{cacheRatio}}": "キャッシュ:{{cacheRatio}}", @@ -1894,6 +2338,7 @@ "缓存价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存倍率: {{cacheRatio}})": "キャッシュ料金:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens(キャッシュ倍率:{{cacheRatio}})", "缓存倍率": "キャッシュ倍率", "缓存倍率 {{cacheRatio}}": "Cache ratio {{cacheRatio}}", + "缓存写": "キャッシュ書込", "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", "缓存创建 Tokens": "キャッシュ作成トークン", "缓存创建: {{cacheCreationRatio}}": "キャッシュ作成:{{cacheCreationRatio}}", @@ -1902,11 +2347,18 @@ "缓存创建: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Cache creation: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", "缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存创建倍率: {{cacheCreationRatio}})": "キャッシュ作成料金:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1Mtokens(キャッシュ作成倍率:{{cacheCreationRatio}})", "缓存创建价格合计:5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens": "Cache creation price total: 5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens", + "缓存创建倍率": "キャッシュ作成倍率", "缓存创建倍率 {{cacheCreationRatio}}": "Cache creation ratio {{cacheCreationRatio}}", "缓存创建倍率 1h {{cacheCreationRatio1h}}": "キャッシュ作成倍率 1h {{cacheCreationRatio1h}}", "缓存创建倍率 5m {{cacheCreationRatio5m}}": "キャッシュ作成倍率 5m {{cacheCreationRatio5m}}", "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Cache creation ratio 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", + "缓存条目数": "Cache Entries", + "缓存目录": "Cache Directory", + "缓存目录磁盘空间": "Cache Directory Disk Space", + "缓存读": "キャッシュ読取", + "编号:": "ID:", "编辑": "編集", + "编辑 OAuth 提供商": "Edit OAuth Provider", "编辑API": "API編集", "编辑产品": "Edit Product", "编辑供应商": "プロバイダー編集", @@ -1919,12 +2371,14 @@ "编辑模式": "モード編集", "编辑用户": "ユーザーの編集", "编辑聊天配置": "チャット設定編集", + "编辑规则": "Edit Rule", "编辑问答": "FAQ編集", "缩词": "短縮", "缺省 MaxTokens": "デフォルト MaxTokens", "网站地址": "ウェブサイトURL", "网站域名标识": "ウェブサイトドメインID", "网络连接失败,请检查网络设置或稍后重试": "Network connection failed, please check network settings or try again later", + "网络连接失败或服务器无响应": "Network connection failed or server not responding", "网络配置": "Network Configuration", "网络错误": "ネットワークエラー", "置信度": "信頼度", @@ -1934,6 +2388,7 @@ "聊天区域": "チャットエリア", "聊天应用名称": "チャットアプリ名", "聊天应用名称已存在,请使用其他名称": "このチャットアプリ名はすでに存在します。別の名称を入力してください", + "聊天数据解析失败": "Failed to parse chat data", "聊天设置": "チャット設定", "聊天配置": "チャット設定", "聊天链接配置错误,请联系管理员": "チャットURLの設定でエラーが発生しました。管理者にお問い合わせください", @@ -1942,27 +2397,42 @@ "自动分组auto,从第一个开始选择": "「auto」グループ(先頭から自動選択)", "自动刷新": "Auto Refresh", "自动刷新中": "Auto refreshing", + "自动填充字段": "Auto-fill Fields", "自动检测": "自動テスト", "自动模式": "自動モード", "自动测试所有通道间隔时间": "すべてのチャネルの自動テスト間隔", + "自动生成:": "Auto-generated: ", "自动禁用": "自動無効化", "自动禁用关键词": "自動無効化キーワード", + "自动禁用状态码": "Auto-disable status codes", + "自动禁用状态码格式不正确": "Invalid auto-disable status code format", "自动选择": "自動選択", + "自动重试状态码": "Auto-retry status codes", + "自动重试状态码格式不正确": "Invalid auto-retry status code format", + "自定义": "カスタム", + "自定义 OAuth 提供商": "Custom OAuth Providers", + "自定义(秒)": "カスタム(秒)", "自定义充值数量选项": "カスタムチャージ額オプション", "自定义充值数量选项不是合法的 JSON 数组": "カスタムチャージ額オプションは有効なJSON配列ではありません", "自定义变焦-提交": "カスタムズーム", "自定义模型名称": "カスタムモデル名", "自定义模式下不可用": "カスタムモードでは利用できません", + "自定义渠道": "Custom Channel", + "自定义秒数": "秒数を指定", + "自定义请求体格式错误,请检查JSON格式": "Custom request body format error, please check JSON format", "自定义请求体模式": "カスタムリクエストボディモード", "自定义货币": "カスタム通貨", "自定义货币符号": "カスタム通貨記号", "自定义镜像": "Custom Image", "自用模式": "個人モード", "自适应列表": "レスポンシブリスト", + "至": "まで", "节省": "節約", "花费": "費用", "花费时间": "所要時間", "若你的 OIDC Provider 支持 Discovery Endpoint,你可以仅填写 OIDC Well-Known URL,系统会自动获取 OIDC 配置": "お使いのOIDCプロバイダーがディスカバリーエンドポイントに対応している場合、OIDC Well-Known URLを入力するだけで、システムが自動的にOIDC設定を取得します。", + "获取 Discovery 配置": "Fetch Discovery Config", + "获取 Discovery 配置失败:": "Failed to fetch Discovery config: ", "获取 io.net API Key": "Get io.net API Key", "获取 OIDC 配置失败,请检查网络状况和 Well-Known URL 是否正确": "OIDC設定の取得に失敗しました。ネットワーク状況とWell-Known URLが正しいかご確認ください", "获取 OIDC 配置成功!": "OIDC設定の取得に成功しました", @@ -1983,12 +2453,17 @@ "获取模型列表": "モデルリストの取得", "获取模型列表失败": "モデルリストの取得に失敗しました", "获取渠道失败:": "チャネルの取得に失敗しました:", + "获取用量失败": "Failed to get usage", "获取硬件类型失败: ": "Failed to get hardware types: ", + "获取签到状态失败": "チェックイン状態の取得に失敗しました", "获取组列表失败": "グループリストの取得に失敗しました", + "获取绑定信息失败": "Failed to get binding info", + "获取自定义 OAuth 提供商列表失败": "Failed to get custom OAuth provider list", "获取详情失败": "Failed to get details", "获取部署列表失败": "Failed to get deployment list", "获取金额失败": "金額の取得に失敗しました", "获取验证码": "認証コードを取得", + "获得": "獲得", "补全": "補完", "补全 {{completion}} tokens / 1M tokens * {{symbol}}{{price}}": "Completion {{completion}} tokens / 1M tokens * {{symbol}}{{price}}", "补全价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "補完料金:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens(補完倍率:{{completionRatio}})", @@ -2002,12 +2477,21 @@ "表格视图": "テーブルビュー", "覆盖模式:将完全替换现有的所有密钥": "上書きモード:既存のすべてのAPIキーを完全に置き換えます", "覆盖现有密钥": "既存のAPIキーを上書き", + "规则": "Rule", + "规则 JSON": "Rule JSON", + "规则 JSON 格式不正确": "Rule JSON format is incorrect", + "规则 ttl_seconds 为 0 时使用。0 表示使用后端默认 TTL:3600 秒。": "Used when rule ttl_seconds is 0. 0 means using backend default TTL: 3600 seconds.", + "规则为 JSON 数组;可视化与 JSON 模式共用同一份数据。": "Rules are JSON arrays; visual and JSON modes share the same data.", + "规则名称(可读性更好,也会出现在管理侧日志中)。": "Rule name (for better readability, also appears in admin logs).", + "规则未找到,请刷新后重试": "Rule not found, please refresh and try again", "角色": "ロール", "解析响应数据时发生错误": "レスポンスデータの解析時にエラーが発生しました", "解析密钥文件失败: {{msg}}": "APIキーファイルの解析に失敗しました:{{msg}}", "解析错误": "解析エラー", + "解绑": "Unbind", "解绑 Passkey": "Passkey連携解除", "解绑后将无法使用 Passkey 登录,确定要继续吗?": "連携解除後は、Passkeyでログインできなくなります。連携を解除してもよろしいですか?", + "解绑成功": "Unbind successful", "计价币种": "Pricing Currency", "计算中": "Calculating", "计算成本": "Calculate Cost", @@ -2017,7 +2501,18 @@ "计费类型": "課金タイプ", "计费过程": "課金プロセス", "订单号": "注文番号", + "订阅": "サブスクリプション", + "订阅剩余": "Subscription Remaining", + "订阅套餐": "サブスクリプションプラン", + "订阅套餐管理": "サブスクリプションプラン管理", + "订阅实例": "Subscription Instance", + "订阅抵扣": "Subscription Deduction", + "订阅管理": "サブスクリプション管理", + "订阅结算": "Subscription Settlement", + "订阅说明": "Subscription Description", + "认证方式": "Auth Style", "讯飞星火": "Spark Desk", + "讯飞星火认知": "iFlytek Spark", "记录请求与错误日志IP": "リクエストログとエラーログのIP記録", "设备": "Device", "设备类型偏好": "優先デバイスタイプ", @@ -2049,6 +2544,7 @@ "设置首页内容": "ホームコンテンツを設定", "设置默认地区和特定模型的专用地区": "デフォルトリージョンと特定モデル専用のリージョンを設定します", "设计与开发由": "開発元:", + "设计版本": "b80c3466cb6feafeb3990c7820e10e50", "访问 io.net 控制台的 API Keys 页面": "Visit the API Keys page of the io.net console", "访问容器": "Access Container", "访问模型部署功能需要先启用 io.net 部署服务": "Accessing model deployment features requires enabling the io.net deployment service first", @@ -2056,16 +2552,25 @@ "该供应商提供多种AI模型,适用于不同的应用场景。": "このプロバイダーは多様なAIモデルを提供し、さまざまなユースケースに対応しています", "该分类下没有可用模型": "この分類では利用可能なモデルがありません。", "该域名已存在于白名单中": "このドメインはすでにホワイトリストに登録されています", + "该套餐未配置 Creem": "このプランには Creem が設定されていません", + "该套餐未配置 Stripe": "このプランには Stripe が設定されていません", "该数据可能不可信,请谨慎使用": "このデータは信頼できない可能性があるため、ご利用の際はご注意ください", "该服务器地址将影响支付回调地址以及默认首页展示的地址,请确保正确配置": "このサーバーURLは決済コールバックアドレスおよびデフォルトホームのアドレスに影響するため、正しく設定されていることをご確認ください", "该模型存在固定价格与倍率计费方式冲突,请确认选择": "このモデルは固定料金と倍率による課金方式が競合しているため、選択内容をご確認ください", "该渠道已开启请求透传,参数覆写、模型重定向等 NewAPI 内置功能将失效,非最佳实践。": "このチャネルではリクエストのパススルーが有効です。パラメータ上書きやモデルリダイレクトなどの NewAPI 内蔵機能は無効になります。ベストプラクティスではありません。", "该渠道已开启请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "このチャネルではリクエストのパススルーが有効です。パラメータ上書き、モデルリダイレクト、チャネル適応などの NewAPI 内蔵機能は無効になります。ベストプラクティスではありません。これにより問題が発生しても issue を投稿しないでください。", + "该规则未启用“作用域:包含规则名称”,无法按规则清空缓存。": "This rule has not enabled \"Scope: Include Rule Name\", cannot clear cache by rule.", + "该规则的缓存保留时长;0 表示使用默认 TTL:": "Cache retention duration for this rule; 0 uses the default TTL:", + "该记录不包含可用的 token 统计口径。": "This record does not contain available token statistics.", "详情": "詳細", + "语言偏好": "Language Preference", + "语言偏好已保存": "Language preference saved", "语音输入": "音声入力", "语音输出": "音声出力", "说明": "説明", "说明:": "説明:", + "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。": "注意: このページのテストは非ストリーミングリクエストです。チャネルがストリーミング応答のみ対応の場合、テストが失敗することがあります。実際の利用結果を優先してください。", + "说明:生成结果是可直接粘贴到渠道密钥里的 JSON(包含 access_token / refresh_token / account_id)。": "Note: The generated result is a JSON that can be directly pasted into the channel secret (contains access_token / refresh_token / account_id).", "说明信息": "説明", "请上传密钥文件": "APIキーファイルをアップロードしてください", "请上传密钥文件!": "APIキーファイルをアップロードしてください", @@ -2073,13 +2578,20 @@ "请使用 Project 为 io.cloud 的密钥": "Please use a key with Project set to io.cloud", "请先在设置中启用图片功能": "まず設定で画像機能を有効にしてください", "请先填写 API Key": "Please fill in API Key first", + "请先填写 Discovery URL 或 Issuer URL": "Please fill in Discovery URL or Issuer URL first", + "请先填写 Issuer URL,以自动生成完整的端点 URL": "Please fill in Issuer URL first to auto-generate full endpoint URLs", "请先填写 Ollama API 地址": "Please fill in Ollama API address first", "请先填写服务器地址": "まずサーバーURLを入力してください", + "请先粘贴回调 URL": "Please paste callback URL first", "请先输入密钥": "まずAPIキーを入力してください", "请先选择同步渠道": "まず同期するチャネルを選択してください", "请先选择模型!": "まずモデルを選択してください", "请先选择硬件类型": "Please select hardware type first", + "请先选择要删除的API信息": "Please select the API info to delete first", "请先选择要删除的令牌!": "まず削除するトークンを選択してください", + "请先选择要删除的分类": "Please select the category to delete first", + "请先选择要删除的常见问答": "Please select the FAQ to delete first", + "请先选择要删除的系统公告": "Please select the announcement to delete first", "请先选择要删除的通道!": "まず削除するチャネルを選択してください", "请先选择要设置标签的渠道!": "まずタグを設定するチャネルを選択してください", "请先选择需要批量设置的模型": "まず一括設定するモデルを選択してください", @@ -2088,8 +2600,12 @@ "请前往个人设置 → 安全设置进行配置。": "アカウント設定 → セキュリティ設定 にて設定してください。", "请勿过度信任此功能,IP可能被伪造,请配合nginx和cdn等网关使用": "IPは偽装される可能性があるため、この機能を過信しないでください。nginxやCDNなどのゲートウェイと組み合わせて使用してください。", "请在系统设置页面编辑分组倍率以添加新的分组:": "新規グループを追加するには、システム設定ページでグループ倍率を編集してください:", + "请填写完整的API信息": "Please fill in complete API info", "请填写完整的产品信息": "Please fill in complete product information", + "请填写完整的公告信息": "Please fill in complete announcement info", + "请填写完整的分类信息": "Please fill in complete category info", "请填写完整的管理员账号信息": "管理者アカウント情報をすべて入力してください", + "请填写完整的问答信息": "Please fill in complete FAQ info", "请填写密钥": "APIキーを入力してください", "请填写渠道名称和渠道密钥!": "チャネル名とAPIキーを入力してください", "请填写部署地区": "デプロイ先リージョンを入力してください", @@ -2099,24 +2615,31 @@ "请检查表单填写是否正确": "フォームへの入力内容が正しいかご確認ください", "请检查输入": "入力内容をご確認ください", "请求体 JSON": "リクエストボディJSON", + "请求体内存缓存": "Request Body Memory Cache", + "请求体磁盘缓存": "Request Body Disk Cache", + "请求体超过此大小时使用磁盘缓存": "Use disk cache when request body exceeds this size", "请求参数无效": "Invalid request parameters", "请求发生错误": "リクエストでエラーが発生しました", "请求发生错误: ": "リクエストでエラーが発生しました:", "请求后端接口失败:": "バックエンドAPIリクエストに失敗しました:", "请求失败": "リクエストに失敗しました", "请求头覆盖": "リクエストヘッダーの上書き", + "请求头覆盖必须是合法的 JSON 格式!": "Header override must be valid JSON format!", "请求并计费模型": "リクエスト課金モデル", "请求时长: ${time}s": "応答時間:${time}s", "请求次数": "リクエスト数", "请求结束后多退少补": "リクエスト完了後、差額が精算されます", "请求超时,请刷新页面后重新发起 GitHub 登录": "タイムアウトしました。ページをリロードして GitHub ログインをやり直してください", "请求路径": "Request path", + "请求转换": "Request conversion", "请求预扣费额度": "リクエスト時の事前差し引きクォータ", "请点击我": "こちらをクリック", "请确认以下设置信息,点击\"初始化系统\"开始配置": "以下の設定内容をご確認の上、「システム初期化」をクリックして設定を開始してください", "请确认您已了解禁用两步验证的后果": "2要素認証を無効にするリスクを理解しているかご確認ください", "请确认管理员密码": "管理者パスワード(確認用)", "请稍后几秒重试,Turnstile 正在检查用户环境!": "Turnstileがユーザー環境を確認中のため、数秒後に再試行してください", + "请立刻修改默认密码!": "Please change the default password immediately!", + "请粘贴完整回调 URL(包含 code 与 state)": "Please paste the full callback URL (containing code and state)", "请联系管理员在系统设置中配置API信息": "システム設定でAPI情報を設定するため、管理者にお問い合わせください", "请联系管理员在系统设置中配置Uptime": "システム設定でUptimeを設定するため、管理者にお問い合わせください", "请联系管理员在系统设置中配置公告信息": "システム設定でお知らせを設定するため、管理者にお問い合わせください", @@ -2129,12 +2652,22 @@ "请至少选择一个渠道": "チャネルを少なくとも1つ選択してください", "请输入 API Key,一行一个,格式:APIKey|Region": "Enter API Key, one per line, format: APIKey|Region", "请输入 API Key,格式:APIKey|Region": "Enter API Key, format: APIKey|Region", + "请输入 Authorization Endpoint": "Please enter Authorization Endpoint", "请输入 AZURE_OPENAI_ENDPOINT,例如:https://docs-test-001.openai.azure.com": "AZURE_OPENAI_ENDPOINTを入力してください(例:https://docs-test-001.openai.azure.com)", + "请输入 Client ID": "Please enter Client ID", + "请输入 Client Secret": "Please enter Client Secret", "请输入 io.net API Key": "Please enter io.net API Key", "请输入 io.net API Key(敏感信息不显示)": "Please enter io.net API Key (sensitive information not displayed)", + "请输入 JSON 格式的 OAuth 凭据,例如:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}": "Please enter OAuth credentials in JSON format, e.g.:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}", "请输入 JSON 格式的密钥内容,例如:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}": "JSON形式のAPIキーを入力してください。例:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}", "请输入 OIDC 的 Well-Known URL": "OIDCのWell-Known URLを入力してください", + "请输入 Slug": "Please enter Slug", + "请输入 Token Endpoint": "Please enter Token Endpoint", + "请输入 User Info Endpoint": "Please enter User Info Endpoint", + "请输入6位验证码": "Please enter 6-digit verification code", "请输入6位验证码或8位备用码": "6桁の認証コードまたは8桁のバックアップコードを入力してください", + "请输入8位备用码": "Please enter 8-digit backup code", + "请输入Account ID,例如:d6b5da8hk1awo8nap34ube6gh": "Please enter Account ID, e.g.: d6b5da8hk1awo8nap34ube6gh", "请输入API地址": "ベースURLを入力してください", "请输入API地址!": "ベースURLを入力してください!", "请输入Bark推送URL": "BarkプッシュURLを入力してください", @@ -2168,6 +2701,7 @@ "请输入图标名称": "アイコン名を入力してください", "请输入填充值": "値を入力してください", "请输入备注(仅管理员可见)": "備考を入力してください(管理者のみ閲覧可能です)", + "请输入套餐标题": "プラン名を入力してください", "请输入完整的 JSON 格式密钥内容": "完全なJSON形式のAPIキーを入力してください", "请输入完整的URL,例如:https://api.openai.com/v1/chat/completions": "完全なURLを入力してください(例:https://api.openai.com/v1/chat/completions)", "请输入完整的URL链接": "完全なURLを入力してください", @@ -2178,6 +2712,7 @@ "请输入密钥,一行一个,格式:AccessKey|SecretAccessKey|Region": "Enter keys one per line, format: AccessKey|SecretAccessKey|Region", "请输入密钥!": "APIキーを入力してください", "请输入延长时长": "Please enter extension duration", + "请输入总额度": "総クォータを入力してください", "请输入您的密码": "パスワードを入力してください", "请输入您的用户名以确认删除": "削除を確認するには、ユーザー名を入力してください", "请输入您的用户名或邮箱地址": "ユーザー名 メールアドレスを入力してください", @@ -2195,7 +2730,9 @@ "请输入新的用户名": "新しいユーザー名を入力してください", "请输入新的部署名称": "Please enter new deployment name", "请输入显示名称": "表示名を入力してください", + "请输入智能体ID,例如:7342866812345": "Please enter Agent ID, e.g.: 7342866812345", "请输入有效的JSON格式的请求体。您可以参考预览面板中的默认请求体格式。": "有効なJSON形式のリクエストボディを入力してください。プレビューパネルのデフォルトのリクエストボディ形式を参照できます。", + "请输入有效的URL地址": "Please enter a valid URL", "请输入有效的数字": "有効な数値を入力してください", "请输入有效的镜像地址": "Please enter a valid image address", "请输入标签名称": "タグ名を入力してください", @@ -2210,7 +2747,10 @@ "请输入状态页面的Slug,如:my-status": "ステータスページスラッグを入力してください(例: my-status)", "请输入生成数量": "生成数を入力してください", "请输入用户名": "ユーザー名を入力してください", + "请输入用户名和密码!": "Please enter username and password!", + "请输入知识库 ID,例如:123456": "Please enter Knowledge Base ID, e.g.: 123456", "请输入私有部署地址,格式为:https://fastgpt.run/api/openapi": "https://fastgpt.run/api/openapi の形式で、プライベートデプロイ先URLを入力してください", + "请输入秒数": "秒数を入力してください", "请输入管理员密码": "管理者パスワードを入力してください", "请输入管理员用户名": "管理者ユーザー名を入力してください", "请输入线路描述": "チャネルの説明を入力してください", @@ -2221,6 +2761,7 @@ "请输入补全倍率": "補完倍率を入力してください", "请输入要延长的小时数": "Please enter the number of hours to extend", "请输入要设置的标签名称": "設定するタグ名を入力してください", + "请输入认证器应用显示的验证码完成登录": "Enter the verification code from your authenticator app to complete login", "请输入认证器验证码": "オーセンティケーターの認証コードを入力してください", "请输入认证器验证码或备用码": "オーセンティケーターの認証コードまたはバックアップコードを入力してください", "请输入说明": "説明を入力してください", @@ -2231,6 +2772,7 @@ "请输入部署名称": "Please enter deployment name", "请输入部署名称以完成二次确认": "Enter deployment name to complete secondary confirmation", "请输入部署地区,例如:us-central1\n支持使用模型映射格式\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}": "デプロイ先リージョンを入力してください(例:us-central1)\nモデルマッピング形式に対応しています\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}", + "请输入金额": "金額を入力してください", "请输入镜像地址": "Please enter image address", "请输入问题标题": "質問のタイトルを入力してください", "请输入预警阈值": "クォータアラートを入力してください", @@ -2252,6 +2794,7 @@ "请选择多密钥使用策略": "複数APIキーの利用ポリシーを選択してください", "请选择密钥更新模式": "APIキー更新モードを選択してください", "请选择密钥格式": "APIキー形式を選択してください", + "请选择支付方式": "Please select a payment method", "请选择日志记录时间": "ログ記録時間を選択してください", "请选择模型": "モデルを選択してください", "请选择模型。": "モデルを選択してください。", @@ -2260,6 +2803,7 @@ "请选择硬件类型": "Please select hardware type", "请选择组类型": "グループタイプを選択してください", "请选择至少一个部署位置": "Please select at least one deployment location", + "请选择订阅套餐": "Please select a subscription plan", "请选择该令牌支持的模型,留空支持所有模型": "対応モデルを選択してください。空欄の場合は全モデルに対応します。", "请选择该渠道所支持的模型": "このチャネルでサポートされているモデルを選択してください", "请选择该渠道所支持的模型,留空则不更改": "このチャネルに対応しているモデルを選択してください。空欄の場合は変更されません", @@ -2274,6 +2818,7 @@ "警告:启用保活后,如果已经写入保活数据后渠道出错,系统无法重试,如果必须开启,推荐设置尽可能大的Ping间隔": "警告:キープアライブを有効にした後、データ書き込み後にチャネルエラーが発生した場合、システムは再試行できません。有効化が必須の場合は、Ping間隔を可能な限り長く設定することを推奨します", "警告:禁用两步验证将永久删除您的验证设置和所有备用码,此操作不可撤销!": "警告:2要素認証を無効にすると、認証設定とすべてのバックアップコードが永久に削除されます。この操作は元に戻すことができません", "豆包": "豆包", + "豆包视频": "Doubao Video", "账单": "請求情報", "账户充值": "アカウントチャージ", "账户已删除!": "アカウントが削除されました", @@ -2282,20 +2827,29 @@ "账户管理": "アカウント管理", "账户绑定": "アカウント連携", "账户绑定、安全设置和身份验证": "アカウント連携、セキュリティ設定、認証", + "账户绑定管理": "Account Binding Management", "账户统计": "アカウント統計", "货币": "Currency", "货币单位": "通貨単位", + "购买上限": "購入上限", "购买兑换码": "引き換えコードの購入", + "购买套餐后即可享受模型权益": "プラン購入後にモデル特典を利用できます", + "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。": "購入または手動での追加によりこのグループにアップグレードされます。プランの失効/期限切れ、無効化/削除後は元のグループに戻ります。反映には数分かかる場合があります。", + "购买订阅套餐": "サブスクリプションプランを購入", "费用信息": "Cost Information", "费用预估": "Cost Estimate", "资源消耗": "リソース消費", "起始时间": "開始時間", "超级管理员": "スーパー管理者", "超级管理员未设置充值链接!": "スーパー管理者がチャージリンクを設定していません", + "超过阈值时拒绝新请求": "閾値を超えた場合に新しいリクエストを拒否する", + "距离重置:": "Time until reset:", "跟随日志": "Follow Logs", "跟随系统主题设置": "システムテーマ", "跨分组": "グループ間", "跨分组重试": "グループ間リトライ", + "路径正则": "Path Regex", + "路径正则(每行一个)": "Path Regex (one per line)", "跳转": "リダイレクト", "轮询": "ポーリング", "轮询模式": "ポーリングモード", @@ -2326,7 +2880,9 @@ "输入要添加的邮箱域名": "追加するメールドメインを入力してください", "输入认证器应用显示的6位数字验证码": "認証アプリに表示される6桁の認証コードを入力してください", "输入邮箱地址": "メールアドレスを入力", + "输入金额": "金額を入力", "输入项目名称,按回车添加": "プロジェクト名を入力してEnterで追加", + "输入额度": "クォータを入力", "输入验证码": "認証コードを入力してください", "输入验证码完成设置": "認証コードを入力して設定を完了してください", "输出": "出力", @@ -2335,6 +2891,9 @@ "输出价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "補完料金:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (補完倍率:{{completionRatio}})", "输出倍率 {{completionRatio}}": "Output ratio {{completionRatio}}", "边栏设置": "サイドバー設定", + "迁移失败: ": "Migration failed: ", + "迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。": "Data format conversion is handled automatically during migration. Old config will be cleared after migration, please backup in database before migrating.", + "过期于": "有効期限", "过期时间": "有効期限", "过期时间不能早于当前时间!": "有効期限は現在時刻より前に設定できません", "过期时间快捷设置": "有効期限クイック設定", @@ -2344,15 +2903,18 @@ "运行命令 (Command)": "Command", "运行时长": "Runtime Duration", "运行时长(小时)": "Runtime Duration (hours)", + "近 30 天": "Last 30 Days", + "近 7 天": "Last 7 Days", "返回修改": "Go back and edit", "返回登录": "ログインに戻る", - "违规扣费金额": "違反課金金額", - "这是重复键中的最后一个,其值将被使用": "重複するキーのうち、最後のキーの値が使用されます", - "这是基础金额,实际扣费 = 基础金额 x 系统分组倍率。": "これは基本金額です。実際の課金 = 基本金額 × システムグループ倍率。", "这将删除超过 10 分钟未使用的临时缓存文件": "10分以上使用されていない一時キャッシュファイルを削除します", + "这是基础金额,实际扣费 = 基础金额 x 系统分组倍率。": "これは基本金額です。実際の課金 = 基本金額 × システムグループ倍率。", + "这是重复键中的最后一个,其值将被使用": "重複するキーのうち、最後のキーの値が使用されます", "进度": "進捗", "进行中": "進行中", "进行该操作时,可能导致渠道访问错误,请仅在数据库出现问题时使用": "この操作の実行時、チャネルへのアクセスエラーが発生する可能性があります。データベースに問題がある場合のみ使用してください", + "违规扣费": "Violation Charge", + "违规扣费金额": "違反課金金額", "连接保活设置": "接続キープアライブ設定", "连接已断开": "接続が切断されました", "连接测试中...": "Testing connection...", @@ -2360,6 +2922,7 @@ "追加模式:将新密钥添加到现有密钥列表末尾": "追加モード:新しいAPIキーを既存のAPIキーリストの末尾に追加します", "追加模式:新密钥将添加到现有密钥列表的末尾": "追加モード:新しいAPIキーを、既存のAPIキーリストの末尾に追加します", "退出": "ログアウト", + "退款": "返金", "适用于个人使用的场景,不需要设置模型价格": "個人利用のシナリオに適しており、モデル料金の設定は不要です", "适用于为多个用户提供服务的场景": "複数のユーザーにサービスを提供するシナリオに適しています", "适用于展示系统功能的场景,提供基础功能演示": "システムの機能を紹介するシナリオに適しており、基本的な機能のデモンストレーションを提供します", @@ -2370,6 +2933,7 @@ "选择同步渠道": "同期チャネルを選択", "选择同步语言": "同期する言語を選択", "选择容器": "Select Container", + "选择您的首选界面语言,设置将自动保存并同步到所有设备": "Select your preferred interface language. Settings will be saved automatically and synced across all devices", "选择成功": "選択に成功しました", "选择支付方式": "チャージ方法を選択", "选择支持的认证设备类型": "対応している認証デバイスタイプを選択", @@ -2385,9 +2949,11 @@ "选择系统运行模式": "システムの動作モードを選択", "选择组类型": "グループタイプを選択", "选择要覆盖的冲突项": "上書きする競合項目を選択", + "选择订阅套餐": "サブスクリプションプランを選択", "选择语言": "言語を選択", "选择过期时间(可选,留空为永久)": "有効期限を選択(オプション、空欄の場合は無期限)", "选择部署位置(可多选)": "Select deployment location(s) (multiple selections allowed)", + "选择预设模板(可选)": "Select Preset Template (optional)", "透传请求体": "リクエストボディパススルー", "通义千问": "Qwen", "通用设置": "一般設定", @@ -2424,6 +2990,7 @@ "邮箱地址": "メールアドレス", "邮箱域名格式不正确,请输入有效的域名,如 gmail.com": "メールドメインの形式が正しくありません。gmail.com のような有効なドメインを入力してください", "邮箱域名白名单格式不正确": "メールドメインのホワイトリストの形式が正しくありません", + "邮箱字段(可选)": "Email Field (optional)", "邮箱账户绑定成功!": "メールアカウントの連携に成功しました", "部分保存失败": "一部の保存に失敗しました", "部分保存失败,请重试": "一部の保存に失敗しました。再試行してください", @@ -2454,6 +3021,8 @@ "配置 Turnstile": "Turnstile 設定", "配置 WeChat Server": "WeChatサーバー設定", "配置和消息已全部重置": "設定とメッセージがすべてリセットされました", + "配置套餐的有效时长": "プランの有効期間を設定", + "配置如何从用户信息 API 响应中提取用户数据,支持 JSONPath 语法": "Configure how to extract user data from user info API response, supports JSONPath syntax", "配置完成后刷新页面即可使用模型部署功能": "After configuration is complete, refresh the page to use the model deployment feature", "配置导入成功": "設定のインポートに成功しました", "配置已导出到下载文件夹": "設定がダウンロードフォルダーにエクスポートされました", @@ -2464,7 +3033,9 @@ "配置服务器端请求伪造(SSRF)防护,用于保护内网资源安全": "内部ネットワークリソースを保護するため、サーバーサイド・リクエスト・フォージェリ(SSRF)保護を設定します", "配置模型部署服务提供商的API密钥和启用状态": "Configure the API key and enabled status of the model deployment service provider", "配置登录注册": "ログイン・サインアップ設定", + "配置自定义 OAuth 提供商,支持 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 协议的身份提供商": "Configure custom OAuth providers, supports GitHub Enterprise, GitLab, Gitea, Nextcloud, Keycloak, ORY and other OAuth 2.0 compatible identity providers", "配置说明": "設定の説明", + "配置迁移确认": "Config Migration Confirmation", "配置邮箱域名白名单": "メールドメインのホワイトリスト設定", "重启部署失败": "Failed to restart deployment", "重命名部署": "Rename Deployment", @@ -2478,26 +3049,31 @@ "重新生成备用码失败": "バックアップコードの再生成に失敗しました", "重新生成备用码将使现有的备用码失效,请确保您已保存了当前的备用码。": "バックアップコードを再生成すると、既存のバックアップコードは無効になります。現在のバックアップコードを保存済みであることをご確認ください。", "重绘": "再生成", + "重置": "リセット", "重置 2FA": "2要素認証のリセット", "重置 Passkey": "Passkeyリセット", "重置为默认": "デフォルトへのリセット", + "重置周期": "リセット周期", + "重置失败": "Reset failed", + "重置时间:": "Reset time:", "重置模型倍率": "モデル倍率をリセット", + "重置统计": "Reset Stats", "重置选项": "オプションリセット", "重置邮件发送成功,请检查邮箱!": "パスワードリセットのメールを送信しました。メールをご確認ください", "重置配置": "設定リセット", "重要提醒": "Important Notice", "重试": "再試行", "重试连接": "Retry Connection", + "金额": "金額", "钱包管理": "ウォレット管理", "链接中的{key}将自动替换为sk-xxxx,{address}将自动替换为系统设置的服务器地址,末尾不带/和/v1": "リンク内の{key}は自動的にsk-xxxxに、{address}はシステム設定のサーバーURLに置換されます。末尾に/や/v1は含みません", "销毁容器": "Destroy Container", "销毁容器失败": "Failed to destroy container", "错误": "エラー", - "退款": "返金", + "错误:": "Error: ", + "错误:服务器内部错误,请联系管理员!": "Error: Internal server error, please contact administrator!", + "错误:请求次数过多,请稍后再试!": "Error: Too many requests, please try again later!", "错误详情": "エラー詳細", - "异步任务退款": "非同期タスク返金", - "任务ID": "タスクID", - "失败原因": "失敗の原因", "键为分组名称,值为另一个 JSON 对象,键为分组名称,值为该分组的用户的特殊分组倍率,例如:{\"vip\": {\"default\": 0.5, \"test\": 1}},表示 vip 分组的用户在使用default分组的令牌时倍率为0.5,使用test分组时倍率为1": "キーはグループ名、値は別のJSONオブジェクトです。このオブジェクトのキーには、利用するトークンが属するグループ名を指定し、値にはそのユーザーグループに適用される特別な倍率を指定します。例:{\"vip\": {\"default\": 0.5, \"test\": 1}} は、vipグループのユーザーがdefaultグループのトークンを利用する際の倍率が0.5、testグループのトークンを利用する際の倍率が1になることを示します", "键为原状态码,值为要复写的状态码,仅影响本地判断": "キーは元のステータスコード、値は上書きするステータスコードで、ローカルでの判断にのみ影響します", "键为用户分组名称,值为操作映射对象。内层键以\"+:\"开头表示添加指定分组(键值为分组名称,值为描述),以\"-:\"开头表示移除指定分组(键值为分组名称),不带前缀的键直接添加该分组。例如:{\"vip\": {\"+:premium\": \"高级分组\", \"special\": \"特殊分组\", \"-:default\": \"默认分组\"}},表示 vip 分组的用户可以使用 premium 和 special 分组,同时移除 default 分组的访问权限": "Keys are user group names and values are operation mappings. Inner keys prefixed with \"+:\" add the specified group (key is the group name, value is the description); keys prefixed with \"-:\" remove the specified group; keys without a prefix add that group directly. Example: {\"vip\": {\"+:premium\": \"Advanced group\", \"special\": \"Special group\", \"-:default\": \"Default group\"}} means vip users can access the premium and special groups while removing access to the default group.", @@ -2510,12 +3086,17 @@ "镜像地址": "Image Address", "镜像选择": "Image Selection", "镜像配置": "Image Configuration", + "问答已删除,请及时点击”保存设置”进行保存": "FAQ deleted, please click \"Save Settings\" to save", + "问答已更新,请及时点击”保存设置”进行保存": "FAQ updated, please click \"Save Settings\" to save", + "问答已添加,请及时点击”保存设置”进行保存": "FAQ added, please click \"Save Settings\" to save", "问题标题": "質問タイトル", "队列中": "待機中", + "阿里通义千问": "Alibaba Tongyi Qianwen", "降低您账户的安全性": "アカウントのセキュリティを低下させる", "降级": "降格", "限制周期": "制限期間", "限制周期统一使用上方配置的“限制周期”值。": "制限期間は、一律で上記にて設定された「制限期間」の値を使用します。", + "限购": "購入制限", "隐私政策": "プライバシーポリシー", "隐私政策已更新": "プライバシーポリシーが更新されました", "隐私政策更新失败": "プライバシーポリシーの更新に失敗しました", @@ -2533,59 +3114,82 @@ "需要重新完整设置才能再次启用": "再度有効にするには、改めてすべての設定を完了させる必要があります", "非必要,不建议启用模型限制": "必須ではないため、モデル制限の有効化は推奨しません", "非流": "非ストリーミング", + "音乐预览": "音楽プレビュー", "音频倍率(仅部分模型支持该计费)": "オーディオ倍率(一部のモデルのみこの課金に対応)", "音频提示 {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}": "オーディオプロンプト {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + オーディオ補完 {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}", "音频提示价格:{{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens (音频倍率: {{audioRatio}})": "オーディオプロンプト料金:{{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens(オーディオ倍率:{{audioRatio}})", + "音频无法播放": "音声を再生できません", "音频补全价格:{{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens (音频补全倍率: {{audioCompRatio}})": "オーディオ補完料金:{{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens(オーディオ補完倍率:{{audioCompRatio}})", "音频补全倍率(仅部分模型支持该计费)": "オーディオ補完倍率(一部のモデルのみこの課金に対応)", "音频输入相关的倍率设置,键为模型名称,值为倍率": "オーディオ入力に関する倍率設定です。キー:モデル名、値:倍率。", "音频输出补全相关的倍率设置,键为模型名称,值为倍率": "オーディオ補完に関する倍率設定です。キー:モデル名、値:倍率。", "页脚": "フッター", + "页脚内容已更新": "Footer content updated", + "页脚内容更新失败": "Failed to update footer content", "页面未找到,请检查您的浏览器地址是否正确": "ページが見つかりませんでした。ブラウザのアドレスが正しいかご確認ください", "顶栏管理": "トップバー管理", "项目": "プロジェクト", "项目内容": "プロジェクト内容", "项目操作按钮组": "プロジェクト操作ボタングループ", "预估总费用": "Estimated Total Cost", + "预估总额度": "推定総額", "预估费用仅供参考,实际费用可能略有差异": "Estimated cost is for reference only, actual cost may vary slightly", "预填组管理": "事前入力グループ管理", + "预扣": "Pre-charge", "预览失败": "プレビューに失敗しました", "预览更新": "更新のプレビュー", "预览请求体": "リクエストボディのプレビュー", "预计结束": "Estimated End", + "预设模板": "Preset Template", "预警阈值必须为正数": "アラートしきい値は0より大きい必要があります", "频率惩罚,减少重复词汇的出现": "頻度ペナルティ、単語の繰り返しを減少", "频率限制的周期(分钟)": "レート制限の期間(分)", "颜色": "カラー", "额度": "クォータ", - "输入额度": "クォータを入力", - "金额": "金額", - "输入金额": "金額を入力", - "仅用于换算,实际保存的是额度": "換算用のみ、実際に保存されるのはクォータです", + "额度充值": "クォータ補充", "额度必须大于0": "クォータは0より大きい必要があります", "额度提醒阈值": "クォータアラートしきい値", "额度查询接口返回令牌额度而非用户额度": "クォータ取得APIは、ユーザークォータではなくトークンクォータを返します", "额度设置": "クォータ設定", + "额度重置": "クォータリセット", "额度预警阈值": "クォータアラートしきい値", "首尾生视频": "冒頭・末尾動画生成", "首页": "ホーム", "首页内容": "ホームコンテンツ", + "首页内容已更新": "Homepage content updated", + "首页内容更新失败": "Failed to update homepage content", "验证": "認証", "验证 Passkey": "Passkeyの認証", "验证失败,请重试": "認証に失敗しました。再試行してください", + "验证并登录": "Verify and Login", "验证成功": "認証に成功しました。", "验证数据库连接状态": "データベース接続検証", "验证码": "認証コード", + "验证码发送成功,请检查你的邮箱!": "Verification code sent, please check your email!", "验证码发送成功,请检查邮箱!": "認証コードを送信しました。メールをご確認ください", + "验证码必须是6位数字": "Verification code must be 6 digits", "验证设置": "認証設定", "验证身份": "本人認証", "验证配置错误": "認証設定のエラー", + "高危操作确认": "High-risk operation confirmation", + "高危状态码重试风险告知与免责声明Markdown": "### ⚠️ High-Risk Operation: Risk Notice and Disclaimer for 504/524 Retry\nBy default, this project does not retry for status codes `400` (bad request), `504` (gateway timeout), and `524` (timeout occurred).\n In many cases, 504 and 524 mean the request has reached the upstream AI service and processing has started, but the connection was closed due to long processing time.\n\nEnabling redirection/retry for these timeout status codes is a **high-risk operation**. Before enabling it, you must read and understand the consequences below:\n\n#### 1. Core Risks (Read Carefully)\n1. 💸 Duplicate/multiple billing risk: Most upstream AI providers **still charge** for requests that started processing but got interrupted by network timeout (504/524). If retry is triggered, a new upstream request will be sent, which can lead to **duplicate or multiple charges**.\n2. ⏳ Severe client timeout: If a single request already timed out, adding retries can multiply total latency and cause severe or unacceptable timeout behavior for your final client/caller.\n3. 💥 Request backlog and system crash risk: Forcing retries on timeout requests keeps threads and connections occupied for longer. Under high concurrency, this can cause serious backlog, exhaust system resources, trigger a cascading failure, and crash your proxy service.\n\n#### 2. Risk Acknowledgement\nIf you still choose to enable this feature, you acknowledge all of the following:", + "高危状态码重试风险确认输入文本": "I understand the duplicate billing and crash risks, and confirm enabling it.", + "高危状态码重试风险确认项1": "I have fully read and understood the risks and fully understand the destructive consequences of forcing retries for status codes 504 and 524.", + "高危状态码重试风险确认项2": "I have communicated with the upstream provider and confirmed that the timeout issue is an upstream bottleneck and cannot be resolved upstream at this time.", + "高危状态码重试风险确认项3": "I voluntarily accept all duplicate/multiple billing risks and will not file issues or complaints in this project repository regarding billing anomalies caused by this retry behavior.", + "高危状态码重试风险确认项4": "I voluntarily accept system stability risks, including severe client timeout and possible service crash. Any consequences caused by enabling this feature are my own responsibility.", + "高危状态码重试风险输入不匹配提示": "The input does not match the required text", + "高危状态码重试风险输入框占位文案": "Please type the exact text above", + "高延迟": "High Latency", "高级设置": "詳細設定", + "高级选项": "Advanced Options", "高级配置": "Advanced Configuration", "黑名单": "ブラックリスト", "默认": "デフォルト", "默认 API 版本": "デフォルトAPIバージョン", "默认 Responses API 版本,为空则使用上方版本": "デフォルトのレスポンスAPIバージョン。未入力の場合、上記のバージョンが使用されます。", + "默认 TTL(秒)": "Default TTL (seconds)", + "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)": "デフォルトは5mのキャッシュ作成倍率です。1hのキャッシュ作成倍率は固定乗数で自動計算されます(現在は1.6倍)", "默认使用系统名称": "デフォルトのシステム名称", "默认助手消息": "こんにちは!何かお手伝いできることはありますか?", "默认区域": "デフォルトリージョン", @@ -2593,134 +3197,6 @@ "默认折叠侧边栏": "サイドバーをデフォルトで折りたたむ", "默认测试模型": "デフォルトテストモデル", "默认用户消息": "こんにちは", - "默认补全倍率": "デフォルト補完倍率", - "每日签到": "毎日のチェックイン", - "今日已签到,累计签到": "本日チェックイン済み、累計チェックイン", - "每日签到可获得随机额度奖励": "毎日のチェックインでランダムなクォータ報酬を獲得できます", - "今日已签到": "本日チェックイン済み", - "立即签到": "今すぐチェックイン", - "正在加载签到状态...": "チェックイン状態を読み込み中...", - "获取签到状态失败": "チェックイン状態の取得に失敗しました", - "签到成功!获得": "チェックイン成功!獲得", - "签到失败": "チェックインに失敗しました", - "获得": "獲得", - "累计签到": "累計チェックイン", - "本月获得": "今月の獲得", - "累计获得": "累計獲得", - "签到奖励将直接添加到您的账户余额": "チェックイン報酬は直接アカウント残高に追加されます", - "每日仅可签到一次,请勿重复签到": "1日1回のみチェックイン可能です。重複チェックインはしないでください", - "签到设置": "チェックイン設定", - "签到功能允许用户每日签到获取随机额度奖励": "チェックイン機能により、ユーザーは毎日チェックインしてランダムなクォータ報酬を獲得できます", - "启用签到功能": "チェックイン機能を有効にする", - "签到最小额度": "チェックイン最小クォータ", - "签到奖励的最小额度": "チェックイン報酬の最小クォータ", - "签到最大额度": "チェックイン最大クォータ", - "签到奖励的最大额度": "チェックイン報酬の最大クォータ", - "保存签到设置": "チェックイン設定を保存", - "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。": "注意: ここでの設定は「モデル広場」での表示にのみ影響し、実際の呼び出しやルーティングには影響しません。実際の呼び出しを設定する場合は、「チャネル管理」で設定してください。", - "确认关闭提示": "閉じる確認", - "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?": "閉じると、このお知らせは今後表示されません(このブラウザのみ)。閉じてもよろしいですか?", - "ChatCompletions→Responses 兼容配置(Beta)": "ChatCompletions→Responses 互換設定(ベータ)", - "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。": "注意: この機能はベータ版です。今後、設定構造や挙動が変更される可能性があります。本番環境では使用しないでください。", - "填充模板(指定渠道)": "テンプレートを入力(指定チャネル)", - "填充模板(全渠道)": "テンプレートを入力(全チャネル)", - "格式化 JSON": "JSON を整形", - "关闭提示": "お知らせを閉じる", - "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。": "注意: このページのテストは非ストリーミングリクエストです。チャネルがストリーミング応答のみ対応の場合、テストが失敗することがあります。実際の利用結果を優先してください。", - "Stripe/Creem 需在第三方平台创建商品并填入 ID": "Stripe/Creem の商品は外部プラットフォームで作成し、ID を入力してください", - "暂无订阅套餐": "利用可能なサブスクリプションプランがありません", - "订阅管理": "サブスクリプション管理", - "订阅套餐管理": "サブスクリプションプラン管理", - "新建套餐": "プラン作成", - "套餐": "プラン", - "支付渠道": "決済チャネル", - "购买上限": "購入上限", - "有效期": "有効期限", - "重置": "リセット", - "禁用后用户端不再展示,但历史订单不受影响。是否继续?": "無効化するとユーザー側に表示されなくなりますが、過去の注文には影響しません。続行しますか?", - "启用后套餐将在用户端展示。是否继续?": "有効化するとユーザー側に表示されます。続行しますか?", - "更新套餐信息": "プラン情報を更新", - "创建新的订阅套餐": "新しいサブスクリプションプランを作成", - "套餐的基本信息和定价": "プランの基本情報と価格", - "套餐标题": "プラン名", - "请输入套餐标题": "プラン名を入力してください", - "套餐副标题": "プランのサブタイトル", - "例如:适合轻度使用": "例:軽めの利用に最適", - "请输入金额": "金額を入力してください", - "请输入总额度": "総クォータを入力してください", - "0 表示不限": "0 は無制限を意味します", - "原生额度": "生クォータ", - "升级分组": "アップグレードグループ", - "不升级": "アップグレードしない", - "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。": "購入または手動での追加によりこのグループにアップグレードされます。プランの失効/期限切れ、無効化/削除後は元のグループに戻ります。反映には数分かかる場合があります。", - "币种": "通貨", - "由全站货币展示设置统一控制": "サイト全体の通貨表示設定で統一して管理", - "排序": "並び順", - "启用状态": "有効状態", - "有效期设置": "有効期限設定", - "配置套餐的有效时长": "プランの有効期間を設定", - "有效期单位": "有効期限の単位", - "自定义秒数": "秒数を指定", - "请输入秒数": "秒数を入力してください", - "有效期数值": "有効期限の値", - "额度重置": "クォータリセット", - "支持周期性重置套餐权益额度": "プランのクォータを定期的にリセット可能", - "重置周期": "リセット周期", - "第三方支付配置": "サードパーティ決済設定", - "Stripe/Creem 商品ID(可选)": "Stripe/Creem 商品ID(任意)", - "生效": "有効", - "已作废": "無効化済み", - "用户订阅管理": "ユーザーサブスクリプション管理", - "选择订阅套餐": "サブスクリプションプランを選択", - "新增订阅": "サブスクリプションを追加", - "暂无订阅记录": "サブスクリプション記録がありません", - "来源": "ソース", - "开始": "開始", - "结束": "終了", - "作废": "無効化", - "确认作废": "無効化の確認", - "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "無効化するとこのサブスクリプションは直ちに失効します。履歴には影響しません。続行しますか?", - "删除会彻底移除该订阅记录(含权益明细)。是否继续?": "削除するとこのサブスクリプション記録(特典詳細を含む)が完全に削除されます。続行しますか?", - "绑定订阅套餐": "サブスクリプションプランを紐付け", - "绑定后会立即生成用户订阅(无需支付),有效期按套餐配置计算。": "紐付け後、ユーザーサブスクリプションが即時に作成されます(支払い不要)。有効期限はプラン設定に従います。", - "订阅套餐": "サブスクリプションプラン", - "额度充值": "クォータ補充", - "优先订阅": "サブスクリプション優先", - "优先钱包": "ウォレット優先", - "仅用订阅": "サブスクリプションのみ", - "仅用钱包": "ウォレットのみ", - "我的订阅": "私のサブスクリプション", - "个生效中": "件有効中", - "无生效": "有効なし", - "已保存偏好为": "保存された設定は", - ",当前无生效订阅,将自动使用钱包": "、有効なサブスクリプションがないため、自動的にウォレットを使用します", - "个已过期": "件期限切れ", - "订阅": "サブスクリプション", - "至": "まで", - "过期于": "有効期限", - "作废于": "無効化日", - "购买套餐后即可享受模型权益": "プラン購入後にモデル特典を利用できます", - "限购": "購入制限", - "推荐": "おすすめ", - "已达到购买上限": "購入上限に達しました", - "已达上限": "上限に達しました", - "立即订阅": "今すぐサブスクリプション", - "暂无可购买套餐": "購入可能なプランがありません", - "该套餐未配置 Stripe": "このプランには Stripe が設定されていません", - "已打开支付页面": "決済ページを開きました", - "支付失败": "支払いに失敗しました", - "该套餐未配置 Creem": "このプランには Creem が設定されていません", - "已发起支付": "支払いを開始しました", - "购买订阅套餐": "サブスクリプションプランを購入", - "套餐名称": "プラン名", - "应付金额": "支払金額", - "支付": "支払う", - "管理员未开启在线支付功能,请联系管理员配置。": "管理者がオンライン決済を有効にしていません。管理者に連絡してください。", - "缓存读": "キャッシュ読取", - "缓存写": "キャッシュ書込", - "写": "書込", - "根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。": "Anthropic の仕様により、/v1/messages の入力 tokens は非キャッシュ入力のみを集計し、キャッシュ読み取り/書き込み tokens は含みません。", - "设计版本": "b80c3466cb6feafeb3990c7820e10e50", - "未匹配到模型,按回车键可将「{{name}}」作为自定义模型名添加": "一致するモデルが見つかりません。Enterキーで「{{name}}」をカスタムモデル名として追加できます。" + "默认补全倍率": "デフォルト補完倍率" } } diff --git a/web/src/i18n/locales/ru.json b/web/src/i18n/locales/ru.json index 82ccb0edf7..cb748bf66f 100644 --- a/web/src/i18n/locales/ru.json +++ b/web/src/i18n/locales/ru.json @@ -12,6 +12,8 @@ " 个模型设置相同的值": " моделей с одинаковыми значениями настроек", " 吗?": "?", " 秒": " сек", + " 秒。": " seconds.", + ",当前无生效订阅,将自动使用钱包": ", нет активной подписки, автоматически будет использоваться кошелек.", ",时间:": ", время: ", ",点击更新": ", нажмите для обновления", "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(В настоящее время поддерживается только интерфейс YiPay, по умолчанию используется адрес сервера выше в качестве адреса обратного вызова!)", @@ -28,25 +30,33 @@ "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", + "{{name}} ID": "{{name}} ID", "{{ratioType}} {{ratio}}": "{{ratioType}} {{ratio}}", + "• 如果无法获取验证码,请使用备用码": "• If you cannot get the verification code, use a backup code", + "• 每个备用码只能使用一次": "• Each backup code can only be used once", "• 视频服务商的跨域限制": "• Ограничения кросс-доменных запросов со стороны видеосервиса", "• 防盗链保护机制": "• Защита от хотлинков", "• 需要特定的请求头或认证": "• Требуются специальные заголовки или авторизация", + "• 验证码每30秒更新一次": "• Verification code updates every 30 seconds", "© {{currentYear}}": "© {{currentYear}}", "| 基于": "| Основано на", "$/1M tokens": "$/1M токенов", "0 - 最低": "0 - Минимум", + "0 表示不限": "0 означает без лимита", "0.002-1之间的小数": "Десятичное число между 0.002-1", "0.1以上的小数": "Десятичное число выше 0.1", + "1) 点击「打开授权页面」完成登录;2) 浏览器会跳转到 localhost(页面打不开也没关系);3) 复制地址栏完整 URL 粘贴到下方;4) 点击「生成并填入」。": "1) Click \"Open Authorization Page\" to complete login; 2) Browser will redirect to localhost (it's OK if the page doesn't load); 3) Copy the full URL from the address bar and paste it below; 4) Click \"Generate and Fill In\".", "10 - 最高": "10 - Максимум", "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Создание кеша 1ч {{tokens}} токенов / 1M токенов * {{symbol}}{{price}} (множитель: {{ratio}})", "1h缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (1h缓存创建倍率: {{cacheCreationRatio1h}})": "Цена создания кеша за 1ч: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M токенов (множитель создания 1ч: {{cacheCreationRatio1h}})", "2 - 低": "2 - Низкий", "2025年5月10日后添加的渠道,不需要再在部署的时候移除模型名称中的\".\"": "Каналы, добавленные после 10 мая 2025 года, не требуют удаления \".\" из имен моделей при развертывании", + "360 智脑": "360 AI Brain", "360智脑": "360 ZhiNao", "5 - 正常(默认)": "5 - Нормальный (по умолчанию)", "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Создание кеша 5м {{tokens}} токенов / 1M токенов * {{symbol}}{{price}} (множитель: {{ratio}})", "5m缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (5m缓存创建倍率: {{cacheCreationRatio5m}})": "Цена создания кеша за 5м: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M токенов (множитель создания 5м: {{cacheCreationRatio5m}})", + "5小时窗口": "5-hour window", "8 - 高": "8 - Высокий", "AGPL v3.0协议": "Лицензия AGPL v3.0", "AI 对话": "AI диалог", @@ -64,6 +74,11 @@ "API令牌管理": "Управление токенами API", "API使用记录": "История использования API", "API信息": "Информация об API", + "API信息已删除,请及时点击”保存设置”进行保存": "API info deleted, please click \"Save Settings\" to save", + "API信息已更新": "API info updated", + "API信息已更新,请及时点击”保存设置”进行保存": "API info updated, please click \"Save Settings\" to save", + "API信息已添加,请及时点击”保存设置”进行保存": "API info added, please click \"Save Settings\" to save", + "API信息更新失败": "Failed to update API info", "API信息管理,可以配置多个API地址用于状态展示和负载均衡(最多50个)": "Управление информацией API, можно настроить несколько адресов API для отображения статуса и балансировки нагрузки (максимум 50)", "API地址": "Адрес API", "API渠道配置": "Конфигурация каналов API", @@ -74,13 +89,27 @@ "Bark推送URL": "URL для push-уведомлений Bark", "Bark推送URL必须以http://或https://开头": "URL для push-уведомлений Bark должен начинаться с http:// или https://", "Bark通知": "Уведомления Bark", + "Basic Auth 头": "Basic Auth Header", + "Cached tokens": "Cached tokens", + "Cached tokens 占比口径由后端返回:Claude 语义按 cached/(prompt+cached),其余按 cached/prompt。": "Cached token ratio calculated by backend: Claude uses cached/(prompt+cached), others use cached/prompt.", "Changing batch type to:": "Изменение типа пакета на:", + "ChatCompletions→Responses 兼容配置": "ChatCompletions→Responses Compatibility Config", + "ChatCompletions→Responses 兼容配置(Beta)": "Совместимость ChatCompletions→Responses (бета)", + "Claude 强制 beta=true": "Force Claude beta=true", "Claude思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Адаптация мышления Claude BudgetTokens = MaxTokens * процент BudgetTokens", "Claude设置": "Настройки Claude", "Claude请求头覆盖": "Переопределение заголовков запроса Claude", "Client ID": "ID клиента", "Client Secret": "Секрет клиента", + "Codex 授权": "Codex Authorization", + "Codex 渠道不支持批量创建": "Codex channels do not support batch creation", + "Codex 用量": "Codex Usage", "common.changeLanguage": "common.changeLanguage", + "Completion tokens": "Completion tokens", + "Configuration": "Configuration", + "context_int/context_string 从请求上下文读取;gjson 从入口请求的 JSON body 按 gjson path 读取。": "context_int/context_string reads from request context; gjson reads from the entry request JSON body via gjson path.", + "CPU 使用率超过此值时拒绝请求": "Отклонять запросы, когда использование CPU превышает это значение", + "CPU 阈值 (%)": "Порог CPU (%)", "Creem API 密钥,敏感信息不显示": "API-ключ Creem, чувствительные данные не отображаются", "Creem Setting Tips": "Creem поддерживает только преднастроенные товары с фиксированной суммой. Эти товары и их цены нужно заранее создать и настроить на сайте Creem, поэтому пополнения с произвольной суммой не поддерживаются. Настройте название и цену товара в Creem, получите идентификатор товара и укажите его ниже. Затем задайте сумму пополнения и отображаемую цену в new-api.", "Creem 介绍": "О сервисе Creem", @@ -93,8 +122,14 @@ "Discord Client ID": "ID клиента Discord", "Discord Client Secret": "Секрет клиента Discord", "Discord ID": "ID Discord", + "Discovery claims": "Discovery claims", + "Discovery scopes": "Discovery scopes", + "Discovery 建议 scopes:": "Suggested Discovery scopes:", "EUR (欧元)": "EUR (евро)", "false": "false", + "GC 已执行": "GC executed", + "GC 执行失败": "GC execution failed", + "GC 次数": "GC Count", "Gemini安全设置": "Настройки безопасности Gemini", "Gemini思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Адаптация мышления Gemini BudgetTokens = MaxTokens * процент BudgetTokens", "Gemini思考适配设置": "Настройки адаптации мышления Gemini", @@ -104,34 +139,53 @@ "GitHub Client ID": "ID клиента GitHub", "GitHub Client Secret": "Секрет клиента GitHub", "GitHub ID": "ID GitHub", + "Goroutine 数": "Goroutine Count", "Gotify应用令牌": "Токен приложения Gotify", "Gotify服务器地址": "Адрес сервера Gotify", "Gotify服务器地址必须以http://或https://开头": "Адрес сервера Gotify должен начинаться с http:// или https://", "Gotify通知": "Уведомления Gotify", - "Grok设置": "Настройки Grok", "GPU/容器": "GPU/Container", "GPU数量": "Number of GPUs", + "Grok设置": "Настройки Grok", "Homepage URL 填": "URL домашней страницы:", "ID": "ID", + "id(用户 ID)": "id (User ID)", + "include_obfuscation 用于控制 Responses 流混淆字段。默认关闭以避免客户端关闭该安全保护": "include_obfuscation controls the Responses stream obfuscation field. Disabled by default to prevent clients from disabling this security protection", + "inference_geo 字段用于控制 Claude 数据驻留推理区域。默认关闭以避免未经授权透传地域信息": "inference_geo controls Claude data residency inference region. Disabled by default to prevent unauthorized geo information passthrough", "IP": "IP", "IP白名单": "IP Whitelist", "IP白名单(支持CIDR表达式)": "Белый список IP (поддерживает выражения CIDR)", "IP限制": "Ограничения IP", "IP黑名单": "Черный список IP", "JSON": "JSON", + "JSON 模式": "JSON Mode", "JSON 模式支持手动输入或上传服务账号 JSON": "Режим JSON поддерживает ручной ввод или загрузку JSON сервисного аккаунта", "JSON格式密钥,请确保格式正确": "Ключ в формате JSON, убедитесь в правильности формата", "JSON格式错误": "Ошибка формата JSON", "JSON编辑": "Редактирование JSON", "JSON解析错误:": "Ошибка парсинга JSON:", + "Key": "Key", + "Key 或 Path": "Key or Path", + "Key 指纹": "Key Fingerprint", + "Key 摘要": "Key Summary", + "Key 来源": "Key Source", + "Key 来源类型": "Key Source Type", "Linux DO Client ID": "ID клиента Linux DO", "Linux DO Client Secret": "Секрет клиента Linux DO", "LinuxDO": "LinuxDO", "LinuxDO ID": "ID LinuxDO", "Logo 图片地址": "Адрес изображения логотипа", + "Logo 已更新": "Logo updated", + "Logo 更新失败": "Failed to update logo", "Midjourney 任务记录": "Записи задач Midjourney", "MIT许可证": "Лицензия MIT", "New API项目仓库地址:": "Адрес репозитория проекта New API:", + "NewAPI 默认不会将入口请求的 User-Agent 透传到上游渠道;该条件仅用于识别访问本站点的客户端。": "NewAPI does not passthrough the entry request User-Agent to upstream channels by default; this condition is only used to identify clients accessing this site.", + "OAuth Client ID": "OAuth Client ID", + "OAuth Client Secret": "OAuth Client Secret", + "OAuth 登录失败:": "OAuth login failed: ", + "OAuth 端点": "OAuth Endpoints", + "OAuth 配置错误:授权端点必须是完整的 URL(以 http:// 或 https:// 开头)": "OAuth configuration error: Authorization endpoint must be a full URL (starting with http:// or https://)", "OIDC": "OIDC", "OIDC ID": "ID OIDC", "Ollama 模型管理": "Ollama Model Management", @@ -143,12 +197,20 @@ "Passkey 注册失败,请重试": "Регистрация Passkey не удалась, попробуйте еще раз", "Passkey 注册成功": "Регистрация Passkey успешна", "Passkey 登录": "Вход через Passkey", + "Passkey 登录失败,请重试": "Passkey login failed, please try again", + "Passkey 验证失败,请重试": "Passkey verification failed, please try again", "Ping间隔(秒)": "Интервал Ping (секунды)", + "POST 参数": "POST Parameters", "price_xxx 的商品价格 ID,新建产品后可获得": "ID цены товара price_xxx, можно получить после создания нового продукта", + "Prompt cache hit tokens": "Prompt cache hit tokens", + "Prompt tokens": "Prompt tokens", "Reasoning Effort": "Усилие рассуждения", + "Request ID": "Request ID", "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "Поле safety_identifier помогает OpenAI идентифицировать пользователей приложений, которые могут нарушать политику использования. По умолчанию отключено для защиты конфиденциальности пользователей", + "Scopes(可选)": "Scopes (optional)", "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "Поле service_tier используется для указания уровня сервиса, позволяет передавать параметры, которые могут привести к фактической оплате выше ожидаемой. По умолчанию отключено для избежания дополнительных расходов", "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "Ключ Stripe sk_xxx или rk_xxx, конфиденциальная информация не отображается", + "Slug只能包含字母、数字、下划线和连字符": "Slug can only contain letters, numbers, underscores, and hyphens", "SMTP 发送者邮箱": "Email отправителя SMTP", "SMTP 服务器地址": "Адрес сервера SMTP", "SMTP 端口": "Порт SMTP", @@ -160,22 +222,33 @@ "SSRF防护设置": "Настройки защиты SSRF", "SSRF防护详细说明": "Подробное описание защиты SSRF", "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "Поле store используется для авторизации OpenAI хранить данные запросов для оценки и оптимизации продукта. По умолчанию отключено, после включения может привести к неработоспособности Codex", - "免责声明:仅限个人使用,请勿分发或共享任何凭证。该渠道存在前置条件与使用门槛,请在充分了解流程与风险后使用,并遵守 OpenAI 的相关条款与政策。相关凭证与配置仅限接入 Codex CLI 使用,不适用于其他客户端、平台或渠道。": "Предупреждение: только для личного использования. Не распространяйте и не передавайте учетные данные. Для этого канала требуются предварительные условия и начальная настройка; используйте его только если понимаете процедуру и риски, и соблюдайте условия и политики OpenAI. Учетные данные и конфигурация предназначены только для интеграции с Codex CLI и не предназначены для других клиентов, платформ или каналов.", "Stripe 设置": "Настройки Stripe", + "Stripe/Creem 商品ID(可选)": "ID продукта Stripe/Creem (необязательно)", + "Stripe/Creem 需在第三方平台创建商品并填入 ID": "Товары Stripe/Creem нужно создать на сторонней платформе и указать их ID", "Telegram": "Telegram", "Telegram Bot Token": "Токен бота Telegram", "Telegram Bot 名称": "Имя бота Telegram", "Telegram ID": "ID Telegram", "Token Endpoint": "Конечная точка токена", + "token 会按倍率换算成“额度/次数”,请求结束后再做差额结算(补扣/返还)。": "Tokens are converted to quota/count by multiplier. After the request, the difference is settled (charged/refunded).", + "Total tokens": "Total tokens", "true": "true", + "TTL(秒,0 表示默认)": "TTL (seconds, 0 for default)", + "TTL(秒)": "TTL (seconds)", "Turnstile Secret Key": "Секретный ключ Turnstile", "Turnstile Site Key": "Ключ сайта Turnstile", "Unix时间戳": "Временная метка Unix", "Uptime Kuma地址": "Адрес Uptime Kuma", "Uptime Kuma监控分类管理,可以配置多个监控分类用于服务状态展示(最多20个)": "Управление категориями мониторинга Uptime Kuma, можно настроить несколько категорий мониторинга для отображения статуса сервисов (максимум 20)", + "Uptime Kuma配置已更新": "Uptime Kuma config updated", + "Uptime Kuma配置更新失败": "Failed to update Uptime Kuma config", + "URL 标识,只能包含小写字母、数字和连字符": "URL identifier, can only contain lowercase letters, numbers, and hyphens", "URL链接": "URL ссылка", "USD (美元)": "USD (доллар США)", "User Info Endpoint": "Конечная точка информации о пользователе", + "User-Agent include": "User-Agent include", + "User-Agent include(每行一个,可不写)": "User-Agent include (one per line, optional)", + "Value 正则": "Value Regex", "Vertex AI 不支持 functionResponse.id 字段,开启后将自动移除该字段": "Vertex AI не поддерживает поле functionResponse.id. При включении это поле будет автоматически удалено", "Webhook 密钥": "Секрет вебхука", "Webhook 签名密钥": "Ключ подписи Webhook", @@ -202,19 +275,24 @@ "上一步": "Предыдущий шаг", "上次保存: ": "Последнее сохранение: ", "上游倍率同步": "Синхронизация множителей upstream", + "上游状态码:": "Upstream status code:", "上游返回": "Ответ апстрима", "下一个表单块": "Следующий блок формы", "下一步": "Следующий шаг", "下午好": "Добрый день", "下载日志": "Download Logs", "不再提醒": "Больше не напоминать", + "不升级": "Не повышать", "不同用户分组的价格信息": "Информация о ценах для разных групп пользователей", "不填则为模型列表第一个": "Если не заполнено, используется первая модель из списка", "不建议使用": "Не рекомендуется использовать", "不支持": "Не поддерживается", "不是合法的 JSON 字符串": "Недопустимая JSON строка", "不更改": "Не изменять", + "不重置": "Без сброса", + "不限": "Без ограничений", "不限制": "Без ограничений", + "不需要在末尾加/v1,New API会自动处理,添加后可能导致请求失败,是否继续?": "No need to add /v1 at the end, New API handles it automatically. Adding it may cause request failures. Continue?", "与本地相同": "Так же как локально", "专属倍率": "Специальный коэффициент", "两次输入的密码不一致": "Введенные пароли не совпадают", @@ -231,10 +309,14 @@ "个人信息设置": "Настройки личной информации", "个人设置": "Личные настройки", "个实例": " instances", + "个已过期": "истекших", "个性化设置": "Персонализированные настройки", "个性化设置左侧边栏的显示内容": "Настройка отображения содержимого левой боковой панели", + "个月": "мес.", + "个月前": "months ago", "个未配置模型": " не настроенных моделей", "个模型": " моделей", + "个生效中": "активных", "个部署吗?此操作不可逆。": " deployments? This operation cannot be undone.", "中午好": "Добрый день", "为一个 JSON 对象,例如:{\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}": "Является JSON объектом, например: {\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}", @@ -251,6 +333,7 @@ "为一个 JSON 文本,键为组名称,值为倍率": "Является JSON текстом, ключ - имя группы, значение - коэффициент", "为了保护账户安全,请验证您的两步验证码。": "Для защиты безопасности вашего аккаунта, пожалуйста, подтвердите ваш код двухфакторной аутентификации.", "为了保护账户安全,请验证您的身份。": "Для защиты безопасности вашего аккаунта, пожалуйста, подтвердите вашу личность.", + "为保证匹配准确,请确保客户端直连本站点(避免反向代理/网关改写 User-Agent)。": "To ensure accurate matching, make sure the client connects directly to this site (avoid reverse proxy/gateway rewriting User-Agent).", "为空则默认使用服务器地址,多个 Origin 用逗号分隔,例如 https://newapi.pro,https://newapi.com ,注意不能携带[],需使用https": "Если пусто, используется адрес сервера по умолчанию. Несколько Origin разделяются запятыми, например https://newapi.pro,https://newapi.com. Обратите внимание, что нельзя использовать [], необходимо использовать https", "主页链接填": "Введите ссылку на главную страницу", "之前的所有日志": "Все предыдущие журналы", @@ -269,13 +352,21 @@ "仅对自定义模型有效": "Действительно только для пользовательских моделей", "仅当自动禁用开启时有效,关闭后不会自动禁用该渠道": "Действительно только при включенном автоматическом отключении, после выключения канал не будет отключаться автоматически", "仅支持": "Поддерживается только", + "仅支持 JSON 对象,必须包含 access_token 与 account_id": "Only JSON objects are supported, must contain access_token and account_id", "仅支持 JSON 文件": "Поддерживаются только JSON файлы", "仅支持 JSON 文件,支持多文件": "Поддерживаются только JSON файлы, поддерживается несколько файлов", "仅支持 OpenAI 接口格式": "Поддерживается только формат интерфейса OpenAI", + "仅显示已绑定": "Show bound only", "仅显示矛盾倍率": "Отображать только противоречивые коэффициенты", "仅用于开发环境,生产环境应使用 HTTPS": "Только для среды разработки, в производственной среде следует использовать HTTPS", + "仅用于换算,实际保存的是额度": "Только для пересчёта, сохраняется квота", + "仅用订阅": "Только подписка", + "仅用钱包": "Только кошелек", "仅重置配置": "Только сбросить конфигурацию", + "今天": "Today", "今日关闭": "Закрыть сегодня", + "今日已签到": "Зарегистрирован сегодня", + "今日已签到,累计签到": "Зарегистрирован сегодня, всего регистраций", "从官方模型库同步": "Синхронизировать из официальной библиотеки моделей", "从认证器应用中获取验证码,或使用备用码": "Получите код подтверждения из приложения аутентификатора или используйте резервный код", "从配置文件同步": "Синхронизировать из файла конфигурации", @@ -307,17 +398,28 @@ "价格重新计算中...": "Recalculating price...", "价格预估": "Price Estimate", "任务 ID": "ID задачи", + "任务ID": "ID задачи", "任务日志": "Журнал задач", "任务状态": "Статус задачи", "任务记录": "Записи задач", "企业账户为特殊返回格式,需要特殊处理,如果非企业账户,请勿勾选": "Корпоративные аккаунты имеют специальный формат возврата, требующий специальной обработки. Если это не корпоративный аккаунт, не отмечайте этот пункт", "优先级": "Приоритет", + "优先级必须是整数!": "Priority must be an integer!", + "优先订阅": "Сначала подписка", + "优先钱包": "Сначала кошелек", "优惠": "Скидка", "低于此额度时将发送邮件提醒用户": "Когда баланс ниже этого лимита, пользователю будет отправлено email напоминание", "余额": "Баланс", "余额充值管理": "Управление пополнением баланса", + "作废": "Аннулировать", + "作废于": "Аннулировано", + "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "После аннулирования подписка сразу станет недействительной. История не изменится. Продолжить?", + "作用域": "Scope", + "作用域:包含分组": "Scope: Include Group", + "作用域:包含规则名称": "Scope: Include Rule Name", "你似乎并没有修改什么": "Похоже, вы ничего не изменили", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "Вы можете добавить их вручную в разделе «Пользовательские названия моделей», нажать «Заполнить», затем отправить или воспользоваться действиями ниже для автоматической обработки.", + "使用 {{name}} 继续": "Continue with {{name}}", "使用 Discord 继续": "Продолжить через Discord", "使用 GitHub 继续": "Продолжить с GitHub", "使用 JSON 对象格式,格式为:{\"组名\": [最多请求次数, 最多请求完成次数]}": "Используйте формат объекта JSON, формат: {\"Имя группы\": [Максимальное количество запросов, Максимальное количество выполненных запросов]}", @@ -330,13 +432,20 @@ "使用 用户名 注册": "Зарегистрироваться с именем пользователя", "使用 邮箱或用户名 登录": "Войти с email или именем пользователя", "使用ID排序": "Сортировать по ID", + "使用备用码": "Use Backup Code", "使用日志": "Журнал использования", "使用模式": "Режим использования", "使用统计": "Статистика использования", "使用认证器应用(如 Google Authenticator、Microsoft Authenticator)扫描下方二维码:": "Отсканируйте QR-код ниже с помощью приложения аутентификатора (например, Google Authenticator, Microsoft Authenticator):", "使用认证器应用扫描二维码": "Отсканировать QR-код с помощью приложения аутентификатора", + "使用认证器验证码": "Use Authenticator Code", + "例如 /var/cache/new-api": "e.g. /var/cache/new-api", "例如 €, £, Rp, ₩, ₹...": "Например €, £, Rp, ₩, ₹...", + "例如 100000…": "e.g. 100000...", + "例如 3600…": "e.g. 3600...", + "例如 600…": "e.g. 600...", "例如 https://docs.newapi.pro": "Например https://docs.newapi.pro", + "例如 prefer-by-conversation-id…": "e.g. prefer-by-conversation-id...", "例如:": "например:", "例如: /bin/bash -c \"python app.py\"": "e.g.: /bin/bash -c \"python app.py\"", "例如: nginx:latest": "e.g.: nginx:latest", @@ -349,13 +458,28 @@ "例如:2,就是最低充值2$": "например: 2, это минимальное пополнение 2$", "例如:2000": "например: 2000", "例如:4.99": "Например: 4.99", + "例如:401, 403, 429, 500-599": "e.g. 401,403,429,500-599", "例如:7,就是7元/美金": "например: 7, это 7 юаней/доллар США", + "例如:email": "e.g.: email", "例如:example.com": "например: example.com", + "例如:github / si:google / https://example.com/logo.png / 🐱": "e.g.: github / si:google / https://example.com/logo.png / 🐱", + "例如:GitHub Enterprise": "e.g.: GitHub Enterprise", + "例如:github-enterprise": "e.g.: github-enterprise", + "例如:https://example.com/.well-known/openid-configuration": "e.g.: https://example.com/.well-known/openid-configuration", + "例如:https://gitea.example.com": "e.g.: https://gitea.example.com", + "例如:https://workername.yourdomain.workers.dev": "e.g.: https://workername.yourdomain.workers.dev", "例如:https://yourdomain.com": "например: https://yourdomain.com", + "例如:name、full_name": "e.g.: name, full_name", "例如:nginx:latest": "e.g.: nginx:latest", + "例如:preferred_username、login": "e.g.: preferred_username, login", "例如:preview": "например: preview", "例如:prod_6I8rBerHpPxyoiU9WK4kot": "Например: prod_6I8rBerHpPxyoiU9WK4kot", + "例如:sub、id、data.user.id": "e.g.: sub, id, data.user.id", "例如:基础套餐": "Например: базовый пакет", + "例如:适合轻度使用": "Например: для легкого использования", + "例如:需要等级 {{required}},你当前等级 {{current}}": "e.g.: Level {{required}} required, your current level is {{current}}", + "例如(全渠道):": "Example (all channels):", + "例如(指定渠道):": "Example (specific channels):", "例如发卡网站的购买链接": "например ссылка на покупку на сайте карт", "供应商": "Поставщик", "供应商介绍": "Описание поставщика", @@ -384,12 +508,14 @@ "保存失败,请重试": "Не удалось сохранить, попробуйте еще раз", "保存失败:": "Не удалось сохранить:", "保存屏蔽词过滤设置": "Сохранить настройки фильтрации запрещенных слов", + "保存性能设置": "Сохранить настройки производительности", "保存成功": "Успешно сохранено", "保存数据看板设置": "Сохранить настройки панели данных", "保存日志设置": "Сохранить настройки журнала", "保存模型倍率设置": "Сохранить настройки коэффициентов моделей", "保存模型速率限制": "Сохранить ограничения скорости моделей", "保存监控设置": "Сохранить настройки мониторинга", + "保存签到设置": "Сохранить настройки регистрации", "保存绘图设置": "Сохранить настройки рисования", "保存聊天设置": "Сохранить настройки чата", "保存设置": "Сохранить настройки", @@ -408,17 +534,22 @@ "倍率是为了方便换算不同价格的模型": "Коэффициенты предназначены для удобного пересчета моделей с разными ценами", "倍率模式": "Режим коэффициентов", "倍率类型": "Тип коэффициента", + "偏好设置": "Preferences", + "停止中": "Stopping", "停止测试": "Остановить тест", "停用": "Отключить", "允许 AccountFilter 参数": "Разрешить параметр AccountFilter", "允许 HTTP 协议图片请求(适用于自部署代理)": "Разрешить запросы изображений по протоколу HTTP (применимо для самостоятельно развернутых прокси)", + "允许 inference_geo 透传": "Allow inference_geo passthrough", "允许 safety_identifier 透传": "Разрешить сквозную передачу safety_identifier", "允许 service_tier 透传": "Разрешить сквозную передачу service_tier", + "允许 stream_options.include_obfuscation 透传": "Allow stream_options.include_obfuscation passthrough", "允许 Turnstile 用户校验": "Разрешить проверку пользователей Turnstile", "允许不安全的 Origin(HTTP)": "Разрешить небезопасные Origin (HTTP)", "允许回调(会泄露服务器 IP 地址)": "Разрешить обратные вызовы (может раскрыть IP-адрес сервера)", "允许在 Stripe 支付中输入促销码": "Разрешить ввод промокодов при оплате через Stripe", "允许新用户注册": "Разрешить регистрацию новых пользователей", + "允许注册的最低信任等级": "Minimum trust level for registration", "允许的 Origins": "Разрешенные Origins", "允许的IP,一行一个,不填写则不限制": "Разрешенные IP, по одному на строку, если не заполнено - без ограничений", "允许的端口": "Разрешенные порты", @@ -449,10 +580,11 @@ "充值金额折扣配置不是合法的 JSON 对象": "Конфигурация скидок на суммы пополнения не является допустимым JSON объектом", "充值链接": "Ссылка пополнения", "充值额度": "Лимит пополнения", + "先填写配置,再自动填充 OAuth 端点,能显著减少手工输入": "Fill in the config first, then auto-fill OAuth endpoints to significantly reduce manual input", + "免责声明:仅限个人使用,请勿分发或共享任何凭证。该渠道存在前置条件与使用门槛,请在充分了解流程与风险后使用,并遵守 OpenAI 的相关条款与政策。相关凭证与配置仅限接入 Codex CLI 使用,不适用于其他客户端、平台或渠道。": "Предупреждение: только для личного использования. Не распространяйте и не передавайте учетные данные. Для этого канала требуются предварительные условия и начальная настройка; используйте его только если понимаете процедуру и риски, и соблюдайте условия и политики OpenAI. Учетные данные и конфигурация предназначены только для интеграции с Codex CLI и не предназначены для других клиентов, платформ или каналов.", "兑换人ID": "ID обменщика", "兑换成功!": "Обмен успешен!", "兑换码充值": "Пополнение кодом купона", - "清理不活跃缓存": "Очистить неактивный кэш", "兑换码创建成功": "Код купона успешно создан", "兑换码创建成功,是否下载兑换码?": "Код купона успешно создан, скачать код купона?", "兑换码创建成功!": "Код купона успешно создан!", @@ -479,7 +611,10 @@ "全部类型": "Все типы", "公告": "Объявление", "公告内容": "Содержание объявления", + "公告已删除,请及时点击”保存设置”进行保存": "Announcement deleted, please click \"Save Settings\" to save", "公告已更新": "Объявление обновлено", + "公告已更新,请及时点击”保存设置”进行保存": "Announcement updated, please click \"Save Settings\" to save", + "公告已添加,请及时点击”保存设置”进行保存": "Announcement added, please click \"Save Settings\" to save", "公告更新失败": "Не удалось обновить объявление", "公告类型": "Тип объявления", "共": "Всего", @@ -499,6 +634,8 @@ "共 {{total}} 项,当前显示 {{start}}-{{end}} 项": "Всего {{total}} элементов, отображаются {{start}}-{{end}}", "关": "Выкл", "关于": "О", + "关于内容已更新": "About content updated", + "关于内容更新失败": "Failed to update about content", "关于我们": "О нас", "关于系统的详细信息": "Подробная информация о системе", "关于项目": "О проекте", @@ -507,15 +644,22 @@ "关闭侧边栏": "Закрыть боковую панель", "关闭公告": "Закрыть объявление", "关闭后,此模型将不会被“同步官方”自动覆盖或创建": "После отключения эта модель не будет автоматически перезаписана или создана при \"синхронизации с официальной\"", + "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?": "После закрытия это уведомление больше не будет показываться (только в этом браузере). Закрыть?", "关闭弹窗,已停止批量测试": "Окно закрыто, массовое тестирование остановлено", + "关闭提示": "Закрыть уведомление", "其他": "Другое", "其他注册选项": "Другие варианты регистрации", "其他登录选项": "Другие варианты входа", "其他设置": "Другие настройки", "其他详情": "Другие детали", + "内存 阈值 (%)": "Порог памяти (%)", + "内存使用率超过此值时拒绝请求": "Отклонять запросы, когда использование памяти превышает это значение", + "内存命中": "Memory Hits", + "内存缓存最大条目数。0 表示使用后端默认容量:100000。": "Maximum memory cache entries. 0 uses backend default capacity: 100000.", "内容": "Содержание", "内容较大,已启用性能优化模式": "Содержание большое, включен режим оптимизации производительности", "内容较大,部分功能可能受限": "Содержание большое, некоторые функции могут быть ограничены", + "内置": "Built-in", "内置 Ollama 镜像": "Built-in Ollama Image", "再次输入部署名称": "Enter Deployment Name Again", "最低": "Минимум", @@ -525,10 +669,21 @@ "最后请求": "Последний запрос", "最大GPU数量": "Max Number of GPUs", "最大可用": "Max Available", + "最大条目数": "Max Entries", + "最终抵扣": "Final Deduction", + "最近一次": "Last", "最近事件": "Recent Events", + "写": "Запись", + "准入策略": "Access Policy", + "准入策略 JSON(可选)": "Access Policy JSON (optional)", + "准备中": "Preparing", "准备中...": "Preparing...", "准备完成初始化": "Подготовка к инициализации завершена", + "凭证已刷新": "Credentials refreshed", "分类名称": "Название категории", + "分类已删除,请及时点击”保存设置”进行保存": "Category deleted, please click \"Save Settings\" to save", + "分类已更新,请及时点击”保存设置”进行保存": "Category updated, please click \"Save Settings\" to save", + "分类已添加,请及时点击”保存设置”进行保存": "Category added, please click \"Save Settings\" to save", "分组": "Группа", "分组与模型定价设置": "Настройки групп и ценообразования моделей", "分组价格": "Цена группы", @@ -541,6 +696,7 @@ "分组速率配置优先级高于全局速率限制。": "Конфигурация скорости группы имеет более высокий приоритет, чем глобальные ограничения скорости.", "分组速率限制": "Ограничение скорости группы", "分钟": "минут", + "分钟前": "minutes ago", "切换为Assistant角色": "Переключиться на роль Assistant", "切换为System角色": "Переключиться на роль System", "切换为单密钥模式": "Переключиться на режим одного ключа", @@ -551,6 +707,7 @@ "划转额度": "Перевести квоту", "列出的模型将不会自动添加或移除-thinking/-nothinking 后缀": "Для этих моделей суффиксы -thinking/-nothinking не будут добавляться или удаляться автоматически.", "列设置": "Настройки столбцов", + "刚刚": "just now", "创建": "Create", "创建令牌默认选择auto分组,初始令牌也将设为auto(否则留空,为用户默认分组)": "При создании токена по умолчанию выбирается группа auto, начальный токен также будет установлен в auto (иначе оставить пустым для группы пользователя по умолчанию)", "创建失败": "Не удалось создать", @@ -561,12 +718,15 @@ "创建新的兑换码": "Создать новый код купона", "创建新的模型": "Создать новую модель", "创建新的渠道": "Создать новый канал", + "创建新的订阅套餐": "Создать новый план подписки", "创建新的预填组": "Создать новую группу предварительного заполнения", "创建时间": "Время создания", "创建用户": "Создать пользователя", "初始化失败,请重试": "Инициализация не удалась, попробуйте еще раз", "初始化系统": "Инициализация системы", "删除": "Удалить", + "删除 Key 来源": "Delete Key Source", + "删除会彻底移除该订阅记录(含权益明细)。是否继续?": "Удаление полностью удалит запись подписки (включая детали прав). Продолжить?", "删除后无法恢复,确定要删除模型 \"{{name}}\" 吗?": "Cannot be recovered after deletion, are you sure you want to delete model \"{{name}}\"?", "删除失败": "Не удалось удалить", "删除密钥失败": "Не удалось удалить Токен", @@ -577,17 +737,23 @@ "删除禁用密钥失败": "Не удалось удалить отключенные Токены", "删除禁用通道": "Удалить отключенные каналы", "删除自动禁用密钥": "Удалить автоматически отключенные Токены", + "删除规则": "Delete Rule", "删除账户": "Удалить аккаунт", "删除账户确认": "Подтверждение удаления аккаунта", "删除部署失败": "Failed to delete deployment", "刷新": "Обновить", + "刷新凭证": "Refresh Credentials", "刷新失败": "Не удалось обновить", "刷新容器信息": "Refresh Container Info", "刷新日志": "Refresh Logs", + "刷新统计": "Refresh Stats", + "刷新缓存统计": "Refresh Cache Stats", + "刷新缓存统计失败": "Failed to refresh cache stats", "前往 io.net API Keys": "Go to io.net API Keys", "前往设置": "Go to Settings", "前往设置页面": "Go to Settings Page", "前缀": "Префикс", + "前缀名称匹配": "Prefix Name Match", "副本数量": "Number of Replicas", "剩余": "Remaining", "剩余备用码:": "Оставшиеся резервные коды:", @@ -616,27 +782,39 @@ "加载账单失败": "Не удалось загрузить счёт", "加载隐私政策内容失败...": "Не удалось загрузить содержимое политики конфиденциальности...", "包含": "Включает", + "包含名称匹配": "Contains Name Match", "包含来自未知或未标明供应商的AI模型,这些模型可能来自小型供应商或开源项目。": "Включает модели ИИ от неизвестных или неуказанных поставщиков, эти модели могут быть от небольших поставщиков или проектов с открытым исходным кодом.", "包括失败请求的次数,0代表不限制": "Включает количество неудачных запросов, 0 означает без ограничений", "匹配类型": "Тип соответствия", "区域": "Регион", + "升级分组": "Группа повышения", "单GPU小时费率": "Per GPU Hour Rate", + "即梦": "Jimeng", "历史消耗": "Историческое потребление", "原价": "Первоначальная цена", "原因:": "Причина:", + "原始 JSON": "Raw JSON", "原密码": "Старый пароль", + "原生格式": "Native format", + "原生额度": "Исходный лимит", "去重完成:去重前 {{before}} 个密钥,去重后 {{after}} 个密钥": "Дедупликация завершена: до дедупликации {{before}} ключей, после дедупликации {{after}} ключей", "参与官方同步": "Участвовать в официальной синхронизации", "参数": "Параметры", "参数值": "Значение параметра", "参数覆盖": "Переопределение параметров", + "参数覆盖必须是合法的 JSON 格式!": "Parameter override must be valid JSON format!", + "参数配置": "Parameter Config", "参照生视频": "Ссылка на генерацию видео", "友情链接": "Дружественные ссылки", "发布日期": "Дата публикации", "发布时间": "Время публикации", + "发现文档地址(Discovery URL,可选)": "Discovery URL (optional)", + "发行者 URL(Issuer URL)": "Issuer URL", + "发送验证码失败,请重试": "Failed to send verification code, please try again", "取消": "Отмена", "取消全选": "Отменить выбор всех", "取消选择": "Deselect", + "受限": "Restricted", "变换": "Трансформация", "变焦": "Масштабирование", "变量值": "Variable Value", @@ -646,17 +824,29 @@ "只有当用户设置开启IP记录时,才会进行请求和错误类型日志的IP记录": "IP-адреса в журналах запросов и ошибок записываются только когда пользователь включил запись IP-адресов в настройках", "可信": "Доверенный", "可在设置页面设置关于内容,支持 HTML & Markdown": "Можно установить содержимое страницы \"О нас\" на странице настроек, поддерживается HTML и Markdown", + "可手动填写,多个 scope 用空格分隔": "Can be filled manually, separate multiple scopes with spaces", + "可灵": "Kling", + "可用": "Available", "可用令牌分组": "Доступные группы токенов", "可用分组": "Доступные группы", + "可用变量:{{provider}} {{field}} {{op}} {{required}} {{current}} 以及 {{current.path}}": "Available variables: {{provider}} {{field}} {{op}} {{required}} {{current}} and {{current.path}}", "可用数量": "Available Quantity", "可用模型": "Доступные модели", + "可用率": "Availability", + "可用空间: {{free}} / 总空间: {{total}}": "Free: {{free}} / Total: {{total}}", "可用端点类型": "Доступные типы конечных точек", "可用邀请额度": "Доступная пригласительная квота", + "可留空;留空时会尝试使用 Issuer URL + /.well-known/openid-configuration": "Can be left empty; when empty, will try using Issuer URL + /.well-known/openid-configuration", "可视化": "Визуализация", "可视化倍率设置": "Визуальные настройки коэффициента", "可视化编辑": "Визуальное редактирование", "可选,公告的补充说明": "Необязательно, дополнительное описание объявления", "可选,用于复现结果": "Необязательно, для воспроизводимых результатов", + "可选:基于用户信息 JSON 做组合条件准入,条件不满足时返回自定义提示": "Optional: Conditional access based on user info JSON, returns custom message when conditions are not met", + "可选:用于自动生成端点或 Discovery URL": "Optional: Used to auto-generate endpoints or Discovery URL", + "可选。匹配入口请求的 User-Agent;任意一行作为子串匹配(忽略大小写)即命中。": "Optional. Match entry request User-Agent; any line matching as substring (case-insensitive) triggers the rule.", + "可选。对提取到的亲和 Key 做正则校验;不填表示不校验。": "Optional. Regex validation on extracted affinity key; leave empty to skip validation.", + "可选。对请求路径进行匹配;不填表示匹配所有路径。": "Optional. Match request path; leave empty to match all paths.", "可选值": "Дополнительные значения", "同时重置消息": "Одновременно сбросить сообщения", "同步": "Синхронизация", @@ -673,19 +863,23 @@ "名称匹配类型": "Тип соответствия названия", "后端请求失败": "Запрос к бэкенду не удался", "后缀": "Суффикс", + "后缀名称匹配": "Suffix Name Match", "否": "Нет", "启动": "Start", "启动参数 (Args)": "Startup Args", "启动命令": "Startup Command", "启动命令 (Entrypoint)": "Entrypoint", + "启动授权失败": "Failed to start authorization", "启动时间": "Время запуска", "启动部署失败": "Failed to start deployment", "启动配置": "Startup Configuration", "启用": "Включить", + "启用 Creem 支付": "Включить платежи Creem", "启用 io.net 部署": "Enable io.net Deployment", "启用 io.net 部署开关": "Enable io.net Deployment Switch", "启用 io.net 部署时必须填写 API Key": "API Key is required when enabling io.net deployment", "启用 Prompt 检查": "Включить проверку Prompt", + "启用 Stripe 支付": "Включить платежи Stripe", "启用2FA失败": "Не удалось включить 2FA", "启用Claude思考适配(-thinking后缀)": "Включить адаптацию мышления Claude (суффикс -thinking)", "启用FunctionCall思维签名填充": "Включить автозаполнение thoughtSignature для FunctionCall", @@ -693,36 +887,54 @@ "启用Ping间隔": "Включить интервал Ping", "启用SMTP SSL": "Включить SMTP SSL", "启用SSRF防护(推荐开启以保护服务器安全)": "Включить защиту SSRF (рекомендуется включить для защиты безопасности сервера)", + "启用供应商": "Enable Vendor", "启用全部": "Включить все", "启用后可接入 io.net GPU 资源": "After enabling, you can access io.net GPU resources", "启用后可添加图片URL进行多模态对话": "Включите для добавления URL изображений для мультимодального диалога", + "启用后套餐将在用户端展示。是否继续?": "После включения план будет отображаться пользователям. Продолжить?", + "启用后将优先复用上一次成功的渠道(粘滞选路)。": "When enabled, the last successful channel will be preferred (sticky routing).", "启用后将使用 Creem Test Mode": "После включения будет использован тестовый режим Creem", "启用密钥失败": "Не удалось включить ключ", "启用屏蔽词过滤功能": "Включить функцию фильтрации запрещённых слов", + "启用性能监控": "Включить мониторинг производительности", + "启用性能监控后,当系统资源使用率超过设定阈值时,将拒绝新的 Relay 请求 (/v1, /v1beta 等),以保护系统稳定性。": "При включённом мониторинге производительности, когда использование системных ресурсов превышает установленный порог, новые Relay-запросы (/v1, /v1beta и т.д.) будут отклоняться для защиты стабильности системы.", "启用所有密钥失败": "Не удалось включить все ключи", "启用数据看板(实验性)": "Включить панель данных (экспериментальная функция)", "启用此模式后,将使用您自定义的请求体发送API请求,模型配置面板的参数设置将被忽略。": "При включении ваше пользовательское тело запроса будет использоваться для API-запросов, а настройки параметров на панели конфигурации модели будут игнорироваться.", + "启用状态": "Статус включения", "启用用户模型请求速率限制(可能会影响高并发性能)": "Включить ограничение скорости запросов моделей пользователя (может повлиять на производительность при высокой нагрузке)", + "启用磁盘缓存": "Enable Disk Cache", + "启用磁盘缓存后,大请求体将临时存储到磁盘而非内存,可显著降低内存占用,适用于处理包含大量图片/文件的请求。建议在 SSD 环境下使用。": "When enabled, large request bodies are temporarily stored on disk instead of memory, significantly reducing memory usage. Suitable for requests with large images/files. SSD recommended.", + "启用签到功能": "Включить функцию регистрации", "启用绘图功能": "Включить функцию рисования", "启用请求体透传功能": "Включить функцию прозрачной передачи тела запроса", "启用请求透传": "Включить прозрачную передачу запросов", + "启用违规扣费": "Включить удержание за нарушения", "启用额度消费日志记录": "Включить журналирование потребления квоты", "启用验证": "Включить проверку", - "启用违规扣费": "Включить удержание за нарушения", "周": "Неделя", + "周前": "weeks ago", + "周期": "период(ов)", + "命中判定:usage 中存在 cached tokens(例如 cached_tokens/prompt_cache_hit_tokens)即视为命中。": "Hit criteria: cached tokens present in usage (e.g. cached_tokens/prompt_cache_hit_tokens) counts as a hit.", + "命中率": "Hit Rate", + "命名规则": "Naming Rule", "和": "и", "和Claude不同,默认情况下Gemini的思考模型会自动决定要不要思考,就算不开启适配模型也可以正常使用,如果您需要计费,推荐设置无后缀模型价格按思考价格设置。支持使用 gemini-2.5-pro-preview-06-05-thinking-128 格式来精确传递思考预算。": "В отличие от Claude, модели мышления Gemini автоматически решают, использовать ли режим мышления. Они работают нормально даже без включённого адаптера. Если нужна тарификация, установите цену моделей без суффикса на цену мышления. Используйте формат gemini-2.5-pro-preview-06-05-thinking-128 для точного указания бюджета мышления.", "响应": "Ответ", "响应时间": "Время ответа", + "响应缺少凭据": "Response missing credentials", + "响应缺少授权链接": "Response missing authorization link", "商品价格 ID": "ID цены товара", "回答内容": "Содержание ответа", "回调 URL 填": "URL обратного вызова", + "回调 URL 格式": "Callback URL format", "回调地址": "Адрес обратного вызова", "固定价格": "Фиксированная цена", "固定价格(每次)": "Фиксированная цена (за каждый раз)", "固定价格值": "Значение фиксированной цены", "图像生成": "Генерация изображений", "图标": "Значок", + "图标使用 react-icons(Simple Icons)或 URL/emoji,例如:github、gitlab、si:google": "Icon uses react-icons (Simple Icons) or URL/emoji, e.g.: github, gitlab, si:google", "图标使用@lobehub/icons库,如:OpenAI、Claude.Color,支持链式参数:OpenAI.Avatar.type={'platform'}、OpenRouter.Avatar.shape={'square'},查询所有可用图标请 ": "Используйте библиотеку @lobehub/icons, например: OpenAI, Claude.Color, поддерживаются цепочечные параметры: OpenAI.Avatar.type={'platform'}, OpenRouter.Avatar.shape={'square'}, для просмотра всех доступных иконок, пожалуйста, ", "图混合": "Смешивание изображений", "图片功能在自定义请求体模式下不可用": "Функция изображений недоступна в режиме пользовательского запроса", @@ -739,6 +951,7 @@ "在Gotify服务器的应用管理中创建新应用": "Создать новое приложение в управлении приложениями на сервере Gotify", "在找兑换码?": "Ищете код купона?", "在新标签页中打开": "Открыть в новой вкладке", + "在模型广场向用户展示的端点": "Эндпоинт, отображаемый пользователям в маркетплейсе моделей", "在此输入 Logo 图片地址": "Введите здесь адрес изображения Logo", "在此输入新的公告内容,支持 Markdown & HTML 代码": "Введите здесь новое содержание объявления, поддерживается код Markdown и HTML", "在此输入新的关于内容,支持 Markdown & HTML 代码。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为关于页面": "Введите здесь новое содержание о проекте, поддерживается код Markdown и HTML. Если введена ссылка, она будет использована как атрибут src для iframe, что позволяет установить любую веб-страницу как страницу о проекте", @@ -751,13 +964,22 @@ "域名白名单": "Белый список доменов", "域名黑名单": "Чёрный список доменов", "基本信息": "Основная информация", + "填充 Codex / Claude Code 模版": "Fill Codex / Claude Code Template", + "填充模板:等级+激活": "Fill Template: Level + Activation", + "填充模板:等级提示": "Fill Template: Level Prompt", + "填充模板:组织或角色": "Fill Template: Organization or Role", + "填充模板:组织提示": "Fill Template: Organization Prompt", + "填充模板(全渠道)": "Заполнить шаблон (все каналы)", + "填充模板(指定渠道)": "Заполнить шаблон (выбранные каналы)", "填入": "Заполнить", "填入所有模型": "Заполнить все модели", "填入模板": "Заполнить шаблон", - "填入透传模版": "Заполнить шаблон passthrough", - "填入透传完整模版": "Заполнить полный шаблон passthrough", "填入相关模型": "Заполнить связанные модели", + "填入透传完整模版": "Заполнить полный шаблон passthrough", + "填入透传模版": "Заполнить шаблон passthrough", + "填写 Issuer URL 后自动生成:": "Auto-generated after filling Issuer URL:", "填写Gotify服务器的完整URL地址": "Введите полный URL-адрес сервера Gotify", + "填写后会自动拼接预设端点": "Preset endpoints will be auto-appended after filling", "填写带https的域名,逗号分隔": "Введите домены с https, разделённые запятыми", "填写用户协议内容后,用户注册时将被要求勾选已阅读用户协议": "После заполнения содержимого пользовательского соглашения, пользователям потребуется отметить, что они прочитали пользовательское соглашение при регистрации", "填写隐私政策内容后,用户注册时将被要求勾选已阅读隐私政策": "После заполнения содержимого политики конфиденциальности, пользователям потребуется отметить, что они прочитали политику конфиденциальности при регистрации", @@ -766,12 +988,15 @@ "备份状态": "Состояние резервного копирования", "备注": "Примечания", "备用恢复代码": "Резервный код восстановления", + "备用码": "Backup Code", "备用码已复制到剪贴板": "Резервный код скопирован в буфер обмена", + "备用码必须是8位": "Backup code must be 8 digits", "备用码重新生成成功": "Резервный код успешно сгенерирован заново", "复制": "Копировать", "复制代码": "Копировать код", "复制令牌": "Копировать токен", "复制全部": "Копировать всё", + "复制功能需要 HTTPS 环境,请手动复制": "Copy function requires HTTPS, please copy manually", "复制名称": "Копировать название", "复制失败": "Не удалось скопировать", "复制失败,请手动复制": "Не удалось скопировать, пожалуйста, скопируйте вручную", @@ -783,6 +1008,7 @@ "复制所有模型": "Копировать все модели", "复制所选令牌": "Копировать выбранные токены", "复制所选兑换码到剪贴板": "Копировать выбранные коды обмена в буфер обмена", + "复制授权链接": "Copy Authorization Link", "复制日志": "Copy Logs", "复制渠道的所有信息": "Копировать всю информацию о канале", "复制版本号": "Copy Version", @@ -797,18 +1023,29 @@ "天": "день", "天前": "дней назад", "失败": "Неудача", + "失败原因": "Причина ошибки", + "失败后不重试": "No retry after failure", "失败时自动禁用通道": "Автоматически отключать канал при неудаче", "失败重试次数": "Количество повторных попыток при неудаче", "奖励说明": "Описание награды", + "套餐": "План", + "套餐副标题": "Подзаголовок плана", + "套餐名称": "Название плана", + "套餐标题": "Название плана", + "套餐标题不能为空": "Plan title cannot be empty", + "套餐的基本信息和定价": "Основная информация и цена плана", "如:大带宽批量分析图片推荐": "Например: рекомендуется для пакетного анализа изображений с большой пропускной способностью", "如:香港线路": "Например: Гонконгская линия", + "如果亲和到的渠道失败,重试到其他渠道成功后,将亲和更新到成功的渠道。": "If the affinity channel fails, after retrying and succeeding with another channel, the affinity will be updated to the successful channel.", "如果你对接的是上游One API或者New API等转发项目,请使用OpenAI类型,不要使用此类型,除非你知道你在做什么。": "Если вы интегрируетесь с восходящими проектами пересылки, такими как One API или New API, используйте тип OpenAI, не используйте этот тип, если вы не знаете, что делаете.", "如果用户请求中包含系统提示词,则使用此设置拼接到用户的系统提示词前面": "Если запрос пользователя содержит системный промпт, используйте эту настройку для добавления перед системным промптом пользователя", "如果镜像为私有,请填写密码或Token": "If the image is private, please fill in the password or token", "如果镜像为私有,请填写用户名": "If the image is private, please fill in the username", "始终使用浅色主题": "Всегда использовать светлую тему", "始终使用深色主题": "Всегда использовать темную тему", + "字段映射": "Field Mapping", "字段透传控制": "Управление прозрачной передачей полей", + "字节火山方舟、豆包通用": "ByteDance Volcengine / Doubao", "存在惩罚,鼓励讨论新话题": "Штраф за присутствие, поощряет новые темы", "存在重复的键名:": "Обнаружены повторяющиеся имена ключей:", "安全提醒": "Напоминание о безопасности", @@ -824,8 +1061,8 @@ "完整的 Base URL,支持变量{model}": "Полный Base URL, поддерживает переменную {model}", "官方": "Официальный", "官方文档": "Официальная документация", - "官方说明": "Официальная документация", "官方模型同步": "Синхронизация официальных моделей", + "官方说明": "Официальная документация", "定价模式": "Режим ценообразования", "定时测试所有通道": "Периодическое тестирование всех каналов", "定期更改密码可以提高账户安全性": "Регулярная смена пароля может повысить безопасность аккаунта", @@ -862,8 +1099,11 @@ "密码重置": "Сброс пароля", "密码重置完成": "Сброс пароля завершен", "密码重置确认": "Подтверждение сброса пароля", + "密码长度不得小于 8 位!": "Password must be at least 8 characters!", "密码长度至少为8个字符": "Длина пароля должна быть не менее 8 символов", "密钥": "Ключ", + "密钥 JSON 必须包含 access_token": "Secret JSON must contain access_token", + "密钥 JSON 必须包含 account_id": "Secret JSON must contain account_id", "密钥(编辑模式下,保存的密钥不会显示)": "Токен (в режиме редактирования сохраненные токены не отображаются)", "密钥去重": "Удаление дубликатов ключей", "密钥将以Bearer方式添加到请求头中,用于验证webhook请求的合法性": "Ключ будет добавлен в заголовок запроса методом Bearer для проверки легитимности webhook-запросов", @@ -871,6 +1111,8 @@ "密钥已启用": "Токен включен", "密钥已复制到剪贴板": "Ключ скопирован в буфер обмена", "密钥已禁用": "Токен отключен", + "密钥必须是 JSON 对象": "Secret must be a JSON object", + "密钥必须是合法的 JSON 格式!": "Secret must be valid JSON format!", "密钥文件 (.json)": "Файл ключей (.json)", "密钥更新模式": "Режим обновления ключей", "密钥格式": "Формат ключа", @@ -897,9 +1139,13 @@ "将仅保留第一个密钥文件,其余文件将被移除,是否继续?": "Будет сохранен только первый файл ключей, остальные файлы будут удалены, продолжить?", "将删除": "Будет удалено", "将删除已使用、已禁用及过期的兑换码,此操作不可撤销。": "Будут удалены использованные, отключенные и просроченные коды обмена, эта операция необратима.", + "将删除所有仍在内存中的渠道亲和性缓存条目。": "All channel affinity cache entries still in memory will be deleted.", + "将大请求体临时存储到磁盘": "Store large request bodies temporarily on disk", "将清除所有保存的配置并恢复默认设置,此操作不可撤销。是否继续?": "Будут очищены все сохраненные конфигурации и восстановлены настройки по умолчанию, эта операция необратима. Продолжить?", "将清除选定时间之前的所有日志": "Будут очищены все логи до выбранного времени", + "将追加 2 条规则到现有规则列表。": "2 rules will be appended to the existing rule list.", "小时": "час", + "小时前": "hours ago", "小时费率": "Hourly Rate", "尚未使用": "Еще не использовано", "局部重绘-提交": "Локальная перерисовка - отправить", @@ -908,20 +1154,29 @@ "展开": "Развернуть", "展开更多": "Развернуть больше", "展示价格": "Отображаемая цена", + "嵌入模型:MokaAI M3E": "Embedding Model: MokaAI M3E", "左侧边栏个人设置": "Персональные настройки левой боковой панели", "已为 {{count}} 个模型设置{{type}}_one": "Установлено {{type}} для {{count}} модели", "已为 {{count}} 个模型设置{{type}}_few": "Установлено {{type}} для {{count}} моделей", "已为 {{count}} 个模型设置{{type}}_many": "Установлено {{type}} для {{count}} моделей", "已为 {{count}} 个模型设置{{type}}_other": "Установлено {{type}} для {{count}} моделей", "已为 ${count} 个渠道设置标签!": "Установлены метки для ${count} каналов!", + "已从 Discovery 自动填充配置": "Config auto-filled from Discovery", + "已从 Discovery 获取配置,可继续手动修改所有字段。": "Config retrieved from Discovery, you can continue to manually modify all fields.", + "已作废": "Аннулировано", + "已使用": "Used", + "已使用:": "Used:", + "已保存偏好为": "Сохранённая настройка: ", "已修复 ${success} 个通道,失败 ${fails} 个通道。": "Исправлено ${success} каналов, не удалось исправить ${fails} каналов.", "已停止": "Stopped", "已停止批量测试": "Пакетное тестирование остановлено", "已关闭后续提醒": "Последующие уведомления отключены", + "已分配内存": "Allocated Memory", "已切换为Assistant角色": "Переключено на роль Assistant", "已切换为System角色": "Переключено на роль System", "已切换至最优倍率视图,每个模型使用其最低倍率分组": "Переключено на оптимальный вид множителей, каждая модель использует свою группу с минимальным множителем", "已初始化": "Инициализировано", + "已删除": "Deleted", "已删除 {{count}} 个令牌!": "Удалено {{count}} токенов!", "已删除 {{count}} 个令牌!_one": "Удалён {{count}} токен!", "已删除 {{count}} 个令牌!_few": "Удалено {{count}} токена!", @@ -934,13 +1189,18 @@ "已删除 ${data} 个通道!": "Удалено ${data} каналов!", "已删除所有禁用渠道,共计 ${data} 个": "Удалены все отключенные каналы, всего ${data}", "已删除消息及其回复": "Сообщение и его ответы удалены", + "已发起支付": "Оплата инициирована", "已发送到 Fluent": "Отправлено в Fluent", "已取消 Passkey 注册": "Регистрация Passkey отменена", + "已取消 Passkey 登录": "Passkey login cancelled", "已同步到渠道": "Synced to Channel", "已启用": "Включено", "已启用 Passkey,无需密码即可登录": "Passkey включен, вход без пароля", "已启用所有密钥": "Все ключи включены", "已在自定义模式中忽略": "Игнорируется в пользовательском режиме", + "已填充提示模板": "Prompt template filled", + "已填充模版": "Template filled", + "已填充策略模板": "Policy template filled", "已备份": "Резервная копия создана", "已复制": "Скопировано", "已复制 ${count} 个模型": "Скопировано ${count} моделей", @@ -957,6 +1217,8 @@ "已完成": "Completed", "已开启全局请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "Глобальная сквозная передача запросов включена. Встроенные возможности NewAPI, такие как переопределение параметров, перенаправление моделей и адаптация канала, будут отключены. Это не является лучшей практикой. Если из-за этого возникнут проблемы, пожалуйста, не создавайте issue.", "已成功开始测试所有已启用通道,请刷新页面查看结果。": "Успешно начато тестирование всех включенных каналов, обновите страницу для просмотра результатов.", + "已打开授权页面": "Authorization page opened", + "已打开支付页面": "Страница оплаты открыта", "已提交": "Отправлено", "已支付金额": "Amount Paid", "已新增 {{count}} 个模型:{{list}}_one": "Добавлена {{count}} модель: {{list}}", @@ -972,17 +1234,22 @@ "已注销": "Выход выполнен", "已添加": "Добавлено", "已添加到白名单": "Добавлено в белый список", + "已清空": "Cleared", "已清空测试结果": "Результаты тестов очищены", + "已生成授权凭据": "Authorization credentials generated", "已用": "Used", "已用/剩余": "Использовано/Осталось", "已用额度": "Использованная квота", "已禁用": "Отключено", "已禁用所有密钥": "Все ключи отключены", + "已终止": "Terminated", "已绑定": "Привязано", "已绑定渠道": "Каналы привязаны", "已结束": "Ended", "已耗尽": "Исчерпано", "已解锁豆包自定义 API 地址编辑": "Редактирование пользовательского API-адреса Doubao разблокировано", + "已达上限": "Лимит достигнут", + "已达到购买上限": "Достигнут лимит покупок", "已过期": "Просрочено", "已运行时间": "Uptime", "已选择 {{count}} 个模型_one": "Выбрана {{count}} модель", @@ -991,14 +1258,22 @@ "已选择 {{count}} 个模型_other": "Выбрано {{count}} моделей", "已选择 {{selected}} / {{total}}": "Выбрано {{selected}} / {{total}}", "已选择 ${count} 个渠道": "Выбрано ${count} каналов", + "已部署": "Deployed", "已重置为默认配置": "Сброшено на конфигурацию по умолчанию", "已销毁": "Destroyed", + "币种": "Валюта", + "常用上下文 Key(用于 context_*)": "Common context keys (for context_*)", "常见问答": "Часто задаваемые вопросы", + "常见问答已更新": "FAQ updated", + "常见问答更新失败": "Failed to update FAQ", "常见问答管理,为用户提供常见问题的答案(最多50个,前端显示最新20条)": "Управление часто задаваемыми вопросами, предоставление ответов на распространенные вопросы пользователям (максимум 50, на интерфейсе отображаются последние 20)", "平台": "Платформа", "平均RPM": "Среднее RPM", "平均TPM": "Среднее TPM", "平移": "Панорамирование", + "年": "г.", + "年前": "years ago", + "应付金额": "К оплате", "应用同步": "Синхронизация приложения", "应用更改": "Применить изменения", "应用覆盖": "Перезапись приложения", @@ -1016,18 +1291,25 @@ "开": "Вкл", "开启之后会清除用户提示词中的": "После включения будет очищено в промптах пользователя:", "开启之后将上游地址替换为服务器地址": "После включения адреса восходящих каналов будут заменены на адрес сервера", + "开启后,using_group 会参与 cache key(不同分组隔离)。": "When enabled, using_group is included in the cache key (isolated by group).", "开启后,仅\"消费\"和\"错误\"日志将记录您的客户端IP地址": "После включения, только логи \"потребление\" и \"ошибки\" будут записывать IP-адрес вашего клиента", "开启后,对免费模型(倍率为0,或者价格为0)的模型也会预消耗额度": "После включения бесплатные модели (коэффициент 0 или цена 0) тоже будут предварительно расходовать квоту", "开启后,将定期发送ping数据保持连接活跃": "После включения будет периодически отправляться ping-данные для поддержания активности соединения", "开启后,当前分组渠道失败时会按顺序尝试下一个分组的渠道": "После включения, когда канал текущей группы не работает, он будет пытаться использовать канал следующей группы по порядку", "开启后,所有请求将直接透传给上游,不会进行任何处理(重定向和渠道适配也将失效),请谨慎开启": "После включения все запросы будут напрямую передаваться upstream без какой-либо обработки (перенаправление и адаптация каналов также будут отключены), включайте с осторожностью", + "开启后,若该规则命中且请求失败,将不会切换渠道重试。": "When enabled, if this rule matches and the request fails, no channel retry will occur.", + "开启后,规则名称会参与 cache key(不同规则隔离)。": "When enabled, the rule name is included in the cache key (isolated by rule).", + "开启后,该渠道请求 Claude 时将强制追加 ?beta=true(无需客户端手动传参)": "When enabled, requests to Claude through this channel will force append ?beta=true (no need for client to pass it manually)", "开启后,违规请求将额外扣费。": "При включении за нарушающие запросы будет взиматься дополнительная плата.", "开启后不限制:必须设置模型倍率": "После включения без ограничений: необходимо установить множители моделей", "开启后未登录用户无法访问模型广场": "После включения незарегистрированные пользователи не смогут получить доступ к площади моделей", "开启批量操作": "Включить пакетные операции", + "开始": "Начало", "开始同步": "Начать синхронизацию", "开始批量测试 ${count} 个模型,已清空上次结果...": "Начало пакетного тестирования ${count} моделей, предыдущие результаты очищены...", "开始时间": "Время начала", + "异常": "Error", + "异步任务退款": "Возврат асинхронной задачи", "张图片": "изображений", "弱变换": "Слабое преобразование", "强制将响应格式化为 OpenAI 标准格式(只适用于OpenAI渠道类型)": "Принудительно форматировать ответ в стандартный формат OpenAI (только для типов каналов OpenAI)", @@ -1037,6 +1319,7 @@ "当上游通道返回错误中包含这些关键词时(不区分大小写),自动禁用通道": "Автоматически отключать канал, когда в ошибке от восходящего канала содержатся эти ключевые слова (без учета регистра)", "当前 API 密钥已过期,请在设置中更新。": "Current API key has expired, please update it in settings.", "当前 Ollama 版本为 ${version}": "Current Ollama version is ${version}", + "当前仅 OpenAI / Claude 语义支持缓存 token 统计,其他通道将隐藏 token 相关字段。": "Currently only OpenAI / Claude semantics support cached token statistics, other channels will hide token-related fields.", "当前余额": "Текущий баланс", "当前值": "Текущее значение", "当前分组为 auto,会自动选择最优分组,当一个组不可用时自动降级到下一个组(熔断机制)": "Текущая группа - auto, автоматически выбирается оптимальная группа, когда одна группа недоступна, автоматически переключается на следующую (механизм предохранителя)", @@ -1045,23 +1328,29 @@ "当前未开启Midjourney回调,部分项目可能无法获得绘图结果,可在运营设置中开启。": "В настоящее время обратный вызов Midjourney отключен, некоторые проекты могут не получить результаты рисования, можно включить в настройках эксплуатации.", "当前查看的分组为:{{group}},倍率为:{{ratio}}": "Текущая просматриваемая группа: {{group}}, коэффициент: {{ratio}}", "当前模型列表为该标签下所有渠道模型列表最长的一个,并非所有渠道的并集,请注意可能导致某些渠道模型丢失。": "Текущий список моделей является самым длинным списком моделей всех каналов под этой меткой, а не объединением всех каналов, обратите внимание, что это может привести к потере моделей некоторых каналов.", + "当前没有可用的启用令牌,请确认是否有令牌处于启用状态!": "No enabled tokens available, please check if any tokens are in enabled state!", + "当前浏览器不支持 Passkey": "Current browser does not support Passkey", "当前版本": "Текущая версия", "当前状态": "Current Status", + "当前环境无法使用 Passkey 登录": "Cannot use Passkey login in current environment", + "当前缓存大小": "Current Cache Size", "当前计费": "Текущая тарификация", "当前设备不支持 Passkey": "Текущее устройство не поддерживает Passkey", "当前设置类型: ": "Текущий тип настроек: ", "当前跟随系统": "Следовать системе", "当前配置无法连接到 io.net。": "Unable to connect to io.net with current configuration.", - "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知": "Когда оставшаяся квота кошелька или подписки ниже этого значения, система отправит уведомление выбранным способом", "当模型没有设置价格时仍接受调用,仅当您信任该网站时使用,可能会产生高额费用": "Принимать вызовы моделей без установленной цены, использовать только если вы доверяете сайту, могут возникнуть высокие расходы", "当运行通道全部测试时,超过此时间将自动禁用通道": "При тестировании всех работающих каналов, превышение этого времени автоматически отключит канал", + "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知": "Когда оставшаяся квота кошелька или подписки ниже этого значения, система отправит уведомление выбранным способом", "待使用收益": "Ожидаемый доход", "待部署": "Pending Deployment", "微信": "WeChat", + "微信二维码": "WeChat QR Code", "微信公众号二维码图片链接": "Ссылка на изображение QR-кода официальной учетной записи WeChat", "微信扫码关注公众号,输入「验证码」获取验证码(三分钟内有效)": "Отсканируйте QR-код в WeChat, чтобы подписаться на официальную учетную запись, введите «код подтверждения», чтобы получить код подтверждения (действителен в течение трех минут)", "微信扫码登录": "Вход через сканирование QR-кода в WeChat", "微信账户绑定成功!": "Привязка учетной записи WeChat успешна!", + "必填。对请求的 model 名称进行匹配,任意一条匹配即命中该规则。": "Required. Match the model name in the request, any match triggers the rule.", "必须是有效的 JSON 字符串数组,例如:[\"g1\",\"g2\"]": "Должен быть действительный массив строк JSON, например: [\"g1\",\"g2\"]", "忘记密码?": "Забыли пароль?", "快速开始": "Быстрый старт", @@ -1072,8 +1361,11 @@ "思考适配 BudgetTokens 百分比": "Адаптация размышлений к проценту BudgetTokens", "思考预算占比": "Доля бюджета на размышления", "性能指标": "Показатели производительности", + "性能监控": "Performance Monitor", + "性能设置": "Performance Settings", "总 GPU 小时": "Total GPU Hours", "总价:文字价格 {{textPrice}} + 音频价格 {{audioPrice}} = {{symbol}}{{total}}": "Общая цена: цена текста {{textPrice}} + цена аудио {{audioPrice}} = {{symbol}}{{total}}", + "总分配内存": "Total Allocated Memory", "总密钥数": "Общее количество ключей", "总收益": "Общий доход", "总计": "Итого", @@ -1084,6 +1376,7 @@ "您正在使用 MySQL 数据库。MySQL 是一个可靠的关系型数据库管理系统,适合生产环境使用。": "Вы используете базу данных MySQL. MySQL - это надежная система управления реляционными базами данных, подходящая для использования в производственной среде.", "您正在使用 PostgreSQL 数据库。PostgreSQL 是一个功能强大的开源关系型数据库系统,提供了出色的可靠性和数据完整性,适合生产环境使用。": "Вы используете базу данных PostgreSQL. PostgreSQL - это мощная система управления реляционными базами данных с открытым исходным кодом, обеспечивающая превосходную надежность и целостность данных, подходящая для использования в производственной среде.", "您正在使用 SQLite 数据库。如果您在容器环境中运行,请确保已正确设置数据库文件的持久化映射,否则容器重启后所有数据将丢失!": "Вы используете базу данных SQLite. Если вы работаете в контейнерной среде, убедитесь, что правильно настроено постоянное сопоставление файлов базы данных, иначе все данные будут потеряны после перезапуска контейнера!", + "您正在使用默认密码!": "You are using the default password!", "您正在删除自己的帐户,将清空所有数据且不可恢复": "Вы удаляете свою учетную запись, все данные будут очищены и не могут быть восстановлены", "您的数据将安全地存储在本地计算机上。所有配置、用户信息和使用记录都会自动保存,关闭应用后不会丢失。": "Ваши данные будут безопасно храниться на локальном компьютере. Все конфигурации, информация о пользователях и записи об использовании будут автоматически сохранены и не потеряются после закрытия приложения.", "您确定要取消密码登录功能吗?这可能会影响用户的登录方式。": "Вы уверены, что хотите отменить функцию входа по паролю? Это может повлиять на способ входа пользователей.", @@ -1092,9 +1385,12 @@ "想起来了?": "Вспомнили?", "成功": "Успешно", "成功兑换额度:": "Успешно обменяно квота: ", + "成功后切换亲和": "Switch Affinity on Success", "成功时自动启用通道": "Автоматически включать канал при успехе", "我已了解禁用两步验证将永久删除所有相关设置和备用码,此操作不可撤销": "Я понимаю, что отключение двухфакторной аутентификации приведет к постоянному удалению всех связанных настроек и резервных кодов, и эта операция не может быть отменена", "我已阅读并同意": "Я прочитал(а) и согласен(на)", + "我的订阅": "Мои подписки", + "我确认开启高危重试": "I confirm enabling high-risk retry", "或": "или", "或其兼容new-api-worker格式的其他版本": "или другие версии, совместимые с форматом new-api-worker", "或手动输入密钥:": "или введите ключ вручную: ", @@ -1105,6 +1401,9 @@ "手动编辑": "Редактировать вручную", "手动输入": "Ввести вручную", "打开侧边栏": "Открыть боковую панель", + "打开授权页面": "Open Authorization Page", + "扣费": "Charge", + "执行 GC": "Run GC", "执行中": "Выполняется", "扫描二维码": "Сканировать QR-код", "批量创建": "Пакетное создание", @@ -1131,6 +1430,8 @@ "拉取新模型": "Pull New Model", "拉取模型": "Pull Model", "拉取进度": "Pull Progress", + "拒绝提示模板(可选)": "Rejection Prompt Template (optional)", + "拦截原因": "Block Reason", "按K显示单位": "Отображать единицы в K", "按价格设置": "Настроить по цене", "按倍率类型筛选": "Фильтровать по типу коэффициента", @@ -1142,6 +1443,7 @@ "换脸": "Замена лица", "授权,需在遵守": "Авторизация, необходимо соблюдать", "授权失败": "Авторизация не удалась", + "排序": "Порядок", "排队中": "В очереди", "接受未设置价格模型": "Принимать модели без установленной цены", "接口凭证": "Учетные данные интерфейса", @@ -1150,6 +1452,7 @@ "控制台区域": "Область консоли", "控制输出的随机性和创造性": "Управляет случайностью и креативностью вывода", "控制顶栏模块显示状态,全局生效": "Управление состоянием отображения модулей верхней панели, действует глобально", + "推荐": "Рекомендуется", "推荐:用户可以选择是否使用指纹等验证": "Рекомендуется: пользователи могут выбирать, использовать ли проверку по отпечатку пальца и другие методы", "推荐使用(用户可选)": "Рекомендуется использовать (по выбору пользователя)", "描述": "Описание", @@ -1161,12 +1464,14 @@ "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "Промпт {{input}} токенов / 1M токенов * {{symbol}}{{price}}", "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Ввод {{input}} токенов / 1M токенов * {{symbol}}{{price}} + Вывод {{completion}} токенов / 1M токенов * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 缓存创建 {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Ввод {{nonCacheInput}} токенов / 1M токенов * {{symbol}}{{price}} + Кэш {{cacheInput}} токенов / 1M токенов * {{symbol}}{{cachePrice}} + Создание кэша {{cacheCreationInput}} токенов / 1M токенов * {{symbol}}{{cacheCreationPrice}} + Вывод {{completion}} токенов / 1M токенов * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "提示:": "Note:", "提示:如需备份数据,只需复制上述目录即可": "Промпт: для резервного копирования данных просто скопируйте указанный выше каталог", + "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。": "Примечание: эта настройка влияет только на отображение моделей в «Маркетплейсе моделей» и не влияет на фактический вызов или маршрутизацию. Чтобы настроить реальное поведение вызовов, перейдите в «Управление каналами».", + "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。": "Примечание: это бета-функция. Структура конфигурации и поведение могут измениться в будущем. Не используйте в продакшене.", + "提示:语言偏好会同步到您登录的所有设备,并影响API返回的错误消息语言。": "Note: Language preference syncs across all your logged-in devices and affects the language of API error messages.", "提示:链接中的{key}将被替换为API密钥,{address}将被替换为服务器地址": "Промпт: {key} в ссылке будет заменен на API-ключ, {address} будет заменен на адрес сервера", "提示价格:{{symbol}}{{price}} / 1M tokens": "Цена промпта: {{symbol}}{{price}} / 1M токенов", "提示缓存倍率": "Коэффициент кэша промптов", - "缓存创建倍率": "Коэффициент создания кэша", - "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)": "По умолчанию используется коэффициент создания кэша 5m; коэффициент создания кэша 1h автоматически вычисляется фиксированным умножением (сейчас 1.6x)", "搜索供应商": "Поиск поставщиков", "搜索关键字": "Поиск по ключевым словам", "搜索失败": "Search failed", @@ -1183,13 +1488,18 @@ "操作": "Операции", "操作失败": "Операция не удалась", "操作失败,请重试": "Операция не удалась, попробуйте еще раз", + "操作失败: ": "Operation failed: ", "操作成功完成!": "Операция успешно завершена!", "操作暂时被禁用": "Операция временно отключена", + "操作确认": "Operation confirmation", "操练场": "Тренировочная площадка", "操练场和聊天功能": "Тренировочная площадка и чат-функции", + "支付": "Оплатить", "支付地址": "Адрес оплаты", + "支付失败": "Оплата не удалась", "支付宝": "Alipay", "支付方式": "Способ оплаты", + "支付渠道": "Платежные каналы", "支付设置": "Настройки оплаты", "支付请求失败": "Запрос на оплату не удался", "支付金额": "Сумма оплаты", @@ -1201,11 +1511,15 @@ "支持众多的大模型供应商": "Поддерживает множество поставщиков больших моделей", "支持单个端口和端口范围,如:80, 443, 8000-8999": "Поддерживает отдельные порты и диапазоны портов, например: 80, 443, 8000-8999", "支持变量:": "Поддерживаемые переменные: ", + "支持周期性重置套餐权益额度": "Поддерживает периодический сброс лимита плана", + "支持填写单个状态码或范围(含首尾),使用逗号分隔": "Supports single status codes or inclusive ranges; separate with commas", + "支持填写单个状态码或范围(含首尾),使用逗号分隔;504 和 524 始终不重试,不受此处配置影响": "Supports single status codes or inclusive ranges; separate with commas. 504 and 524 are never retried and are not affected by this setting", "支持备份": "Поддерживает резервное копирование", "支持拉取 Ollama 官方模型库中的所有模型,拉取过程可能需要几分钟时间": "Supports pulling all models from the Ollama official model library, the pulling process may take a few minutes", "支持搜索用户的 ID、用户名、显示名称和邮箱地址": "Поддерживает поиск по ID пользователя, имени пользователя, отображаемому имени и адресу электронной почты", "支持的图像模型": "Поддерживаемые модели изображений", "支持通配符格式,如:example.com, *.api.example.com": "Поддерживает формат с подстановочными знаками, например: example.com, *.api.example.com", + "支持逻辑 and/or 与嵌套 groups;操作符支持 eq/ne/gt/gte/lt/lte/in/not_in/contains/exists": "Supports logical and/or with nested groups; operators: eq/ne/gt/gte/lt/lte/in/not_in/contains/exists", "收益": "Доход", "收益统计": "Статистика доходов", "收起": "Свернуть", @@ -1236,10 +1550,16 @@ "文档": "Документация", "文档地址": "Адрес документации", "文生视频": "Текст в видео", + "新增 Key 来源": "Add Key Source", "新增供应商": "Добавить поставщика", + "新增失败": "Failed to add", + "新增成功": "Added successfully", + "新增规则": "Add Rule", + "新增订阅": "Добавить подписку", "新密码": "Новый пароль", "新密码需要和原密码不一致!": "Новый пароль должен отличаться от старого!", "新建": "Создать", + "新建套餐": "Создать план", "新建容器": "Create Container", "新建容器部署": "Create Container Deployment", "新建数量": "Количество для создания", @@ -1259,13 +1579,17 @@ "无效的部署信息": "Invalid deployment information", "无效的重置链接,请重新发起密码重置请求": "Недействительная ссылка для сброса, пожалуйста, отправьте запрос на сброс пароля повторно", "无法发起 Passkey 注册": "Не удалось инициировать регистрацию Passkey", + "无法发起 Passkey 登录": "Unable to initiate Passkey login", "无法复制到剪贴板,请手动复制": "Не удалось скопировать в буфер обмена, пожалуйста, скопируйте вручную", + "无法复制此类型的消息内容": "Cannot copy this type of message content", "无法添加图片": "Невозможно добавить изображение", "无法获取容器详情": "Unable to get container details", "无法连接 io.net": "Unable to connect to io.net", + "无生效": "Нет активных", "无邀请人": "Нет приглашающего", "无限制": "Без ограничений", "无限额度": "Безлимитная квота", + "日": "дн.", "日志导出成功": "Logs exported successfully", "日志已下载": "Logs downloaded", "日志已加载": "Logs loaded", @@ -1278,10 +1602,12 @@ "旧格式(直接覆盖):": "Старый формат (прямая перезапись):", "旧格式模板": "Шаблон старого формата", "旧的备用码已失效,请保存新的备用码": "Старые резервные коды больше не действительны, пожалуйста, сохраните новые резервные коды", + "旧配置迁移完成": "Legacy config migration complete", "早上好": "Доброе утро", "时间": "Время", "时间信息": "Time Information", "时间粒度": "Временная гранулярность", + "易支付": "Epay", "易支付商户ID": "ID торговца EasyPay", "易支付商户密钥": "Ключ торговца EasyPay", "是": "Да", @@ -1294,6 +1620,7 @@ "显示倍率": "Отображать коэффициент", "显示最新20条": "Отображать последние 20 записей", "显示名称": "Отображаемое имя", + "显示名称字段(可选)": "Display Name Field (optional)", "显示完整内容": "Отображать полное содержимое", "显示操作项": "Отображать элементы операций", "显示更多": "Отображать больше", @@ -1306,6 +1633,8 @@ "智能体ID": "ID интеллектуального агента", "智能熔断": "Интеллектуальный предохранитель", "智谱": "Zhipu", + "智谱 ChatGLM(已经弃用,请使用智谱 GLM-4V)": "Zhipu ChatGLM (deprecated, use Zhipu GLM-4V)", + "智谱 GLM-4V": "Zhipu GLM-4V", "暂无": "None", "暂无API信息": "Временно нет информации об API", "暂无SSE响应数据": "Нет данных ответа SSE", @@ -1315,12 +1644,15 @@ "暂无公告": "Нет объявлений", "暂无匹配模型": "Нет соответствующих моделей", "暂无可复制的版本信息": "No version information to copy", + "暂无可展示数据": "No data to display", "暂无可用的支付方式,请联系管理员配置": "Нет доступных способов оплаты, свяжитесь с администратором для настройки", + "暂无可购买套餐": "Нет доступных для покупки планов", "暂无响应数据": "Нет данных ответа", "暂无容器信息": "No container information", "暂无容器详情": "No container details", "暂无密钥数据": "Нет данных ключей", "暂无差异化倍率显示": "Нет отображения дифференцированных множителей", + "暂无已绑定项": "No bound items", "暂无常见问答": "Нет часто задаваемых вопросов", "暂无成功模型": "Нет успешных моделей", "暂无数据": "Нет данных", @@ -1335,6 +1667,9 @@ "暂无监控数据": "Нет данных мониторинга", "暂无系统公告": "Нет системных объявлений", "暂无缺失模型": "Нет отсутствующих моделей", + "暂无自定义 OAuth 提供商": "No custom OAuth providers", + "暂无订阅套餐": "Нет тарифных планов", + "暂无订阅记录": "Нет записей подписок", "暂无请求数据": "Нет данных запросов", "暂无项目": "Нет проектов", "暂无预填组": "Нет предварительно заполненных групп", @@ -1353,9 +1688,11 @@ "更新名称失败": "Failed to update name", "更新失败": "Обновление не удалось", "更新失败,请检查输入信息": "Update failed, please check the input information", + "更新套餐信息": "Обновить информацию о плане", "更新容器配置": "Update Container Configuration", "更新容器配置可能会导致容器重启,请确保在合适的时间进行此操作。": "Updating container configuration may cause the container to restart, please ensure you perform this operation at an appropriate time.", "更新成功": "Обновление успешно", + "更新成功!": "Updated successfully!", "更新所有已启用通道余额": "Обновить баланс всех включенных каналов", "更新支付设置": "Обновить настройки оплаты", "更新时间": "Время обновления", @@ -1367,16 +1704,25 @@ "更新配置后,容器可能需要重启以应用新的设置。请确保您了解这些更改的影响。": "After updating the configuration, the container may need to restart to apply the new settings. Please ensure you understand the impact of these changes.", "更新配置失败": "Failed to update configuration", "更新预填组": "Обновить предварительно заполненную группу", + "月": "мес.", "有 Reasoning": "Есть рассуждение", + "有异常": "Has Errors", + "有效期": "Срок действия", + "有效期单位": "Единица срока", + "有效期数值": "Значение срока", + "有效期设置": "Настройки срока действия", "服务可用性": "Доступность сервиса", "服务商": "Service Provider", "服务器地址": "Адрес сервера", "服务显示名称": "Отображаемое имя сервиса", + "未使用": "Unused", + "未匹配到模型,按回车键可将「{{name}}」作为自定义模型名添加": "Совпадающих моделей не найдено. Нажмите Enter, чтобы добавить «{{name}}» как пользовательское имя модели.", "未发现新增模型": "Новые модели не обнаружены", "未发现重复密钥": "Дублирующиеся ключи не обнаружены", "未启动": "Не запущено", "未启用": "Не включено", "未命名": "Без имени", + "未在 Discovery 响应中找到可用的 OAuth 端点": "No available OAuth endpoints found in Discovery response", "未备份": "Не резервировано", "未开始": "Не начато", "未找到匹配的模型": "Соответствующие модели не найдены", @@ -1403,9 +1749,13 @@ "未设置倍率模型": "Модели с неустановленным множителем", "未配置模型": "Ненастроенные модели", "未配置的模型列表": "Список ненастроенных моделей", + "本周": "This Week", "本地": "Локальный", "本地数据存储": "Локальное хранение данных", "本地计费": "Локальная тарификация", + "本月": "This Month", + "本月获得": "В этом месяце", + "本站仅作演示之用,无服务端!": "This site is for demo purposes only, no server!", "本设备:手机指纹/面容,外接:USB安全密钥": "Это устройство: отпечаток пальца/лицо телефона, внешнее: USB-ключ безопасности", "本设备内置": "Встроенное в это устройство", "本项目根据": "Этот проект основан на", @@ -1413,11 +1763,13 @@ "机密环境变量将被加密存储,适用于存储密码、API密钥等敏感信息。": "Secret environment variables will be stored encrypted, suitable for storing passwords, API keys and other sensitive information.", "机密环境变量说明": "Secret Environment Variables Description", "权重": "Вес", + "权重必须是非负整数!": "Weight must be a non-negative integer!", "权限设置": "Настройки прав доступа", "条": "запись", "条 - 第": "запись -", "条,共": "записей, всего", "条日志已清理!": "записей журнала очищено!", + "来源": "Источник", "来源于 IO.NET 部署": "From IO.NET Deployment", "来自模型重定向,尚未加入模型列表": "Из перенаправления модели, ещё не добавлен в список моделей", "某些配置更改可能需要几分钟才能生效。": "Some configuration changes may take a few minutes to take effect.", @@ -1435,20 +1787,26 @@ "标签不能为空!": "Метка не может быть пустой!", "标签信息": "Информация о метке", "标签名称": "Название метки", + "标签更新成功!": "Tag updated successfully!", "标签的基本配置": "Базовая конфигурация метки", "标签组": "Группа меток", "标签聚合": "Агрегация меток", "标签聚合模式": "Режим агрегации меток", "标识颜色": "Цвет идентификатора", "核采样,控制词汇选择的多样性": "Ядерная выборка, управляет разнообразием выбора слов", + "根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。": "Согласно соглашению Anthropic, входные токены /v1/messages учитывают только некэшированный ввод и не включают токены чтения/записи кэша.", "根据模型名称和匹配规则查找模型元数据,优先级:精确 > 前缀 > 后缀 > 包含": "Поиск метаданных модели по имени и правилам соответствия, приоритет: точный > префикс > суффикс > содержит", "格式化": "Форматировать", + "格式化 JSON": "Форматировать JSON", "格式正确": "Действительный формат", "格式示例:": "Пример формата: ", "格式错误": "Недействительный формат", "检查更新": "Проверить обновления", + "检查更新失败,请稍后再试": "Failed to check for updates, please try again later", "检测到 FluentRead(流畅阅读)": "Обнаружен FluentRead (плавное чтение)", + "检测到以下高危状态码重定向规则": "Detected high-risk status-code redirect rules", "检测到多个密钥,您可以单独复制每个密钥,或点击复制全部获取完整内容。": "Обнаружено несколько ключей, вы можете скопировать каждый ключ отдельно или нажать \"Копировать все\" для получения полного содержимого.", + "检测到旧版本的配置数据,是否要迁移到新的配置格式?": "Legacy config data detected, migrate to the new config format?", "检测到该消息后有AI回复,是否删除后续回复并重新生成?": "Обнаружен ответ ИИ после этого сообщения, удалить ли последующие ответы и сгенерировать заново?", "检测必须等待绘图成功才能进行放大等操作": "Обнаружение должно ждать успешного вывода рисования для выполнения операций увеличения и т.д.", "模型": "Модель", @@ -1457,6 +1815,7 @@ "模型价格": "Цена модели", "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}": "Цена модели {{symbol}}{{price}}, {{ratioType}} {{ratio}}", "模型价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "Цена модели: {{symbol}}{{price}} * {{ratioType}}: {{ratio}} = {{symbol}}{{total}}", + "模型价格不能为0": "Model price cannot be 0", "模型倍率": "Коэффициент модели", "模型倍率 {{modelRatio}}": "Коэффициент модели {{modelRatio}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}}": "Коэффициент модели {{modelRatio}}, коэффициент кэша {{cacheRatio}}, коэффициент вывода {{completionRatio}}, {{ratioType}} {{ratio}}", @@ -1487,6 +1846,9 @@ "模型映射必须是合法的 JSON 格式!": "Сопоставление моделей должно быть в допустимом формате JSON!", "模型更新成功!": "Модель успешно обновлена!", "模型未加入列表,可能无法调用": "Модель не добавлена в список, вызовы могут не работать", + "模型正则": "Model Regex", + "模型正则(每行一个)": "Model Regex (one per line)", + "模型正则不能为空": "Model regex cannot be empty", "模型消耗分布": "Распределение потребления моделей", "模型消耗趋势": "Тенденции потребления моделей", "模型版本": "Версия модели", @@ -1514,6 +1876,7 @@ "欢迎使用,请完成以下设置以开始使用系统": "Добро пожаловать, пожалуйста, выполните следующие настройки, чтобы начать использовать систему", "欧元": "Евро", "正在加载可用部署位置...": "Loading available deployment locations...", + "正在加载签到状态...": "Загрузка статуса регистрации...", "正在处理大内容...": "Обработка большого содержимого...", "正在提交": "Отправка...", "正在构造请求体预览...": "Создание предварительного просмотра тела запроса...", @@ -1522,6 +1885,7 @@ "正在跟随最新日志": "Following latest logs", "正在跳转 GitHub...": "Перенаправление на GitHub...", "正在跳转...": "Переход...", + "正常": "Normal", "此代理仅用于图片请求转发,Webhook通知发送等,AI API请求仍然由服务器直接发出,可在渠道设置中单独配置代理": "Этот прокси используется только для пересылки изображений, отправки уведомлений Webhook и т.д., AI API запросы по-прежнему отправляются напрямую сервером, прокси можно настроить отдельно в настройках канала", "此修改将不可逆": "Это изменение будет необратимым", "此操作不可恢复,请仔细确认时间后再操作!": "Эта операция необратима, пожалуйста, внимательно подтвердите время перед выполнением!", @@ -1536,6 +1900,7 @@ "此操作将解绑用户当前的 Passkey,下次登录需要重新注册。": "Эта операция отвяжет текущий Passkey пользователя, при следующем входе потребуется повторная регистрация.", "此操作将降低用户的权限级别": "Эта операция понизит уровень прав пользователя", "此支付方式最低充值金额为": "Минимальная сумма пополнения для этого способа оплаты составляет", + "此消息没有可复制的文本内容": "This message has no copyable text content", "此渠道由 IO.NET 自动同步,类型、密钥和 API 地址已锁定。": "This channel is automatically synchronized by IO.NET, type, key and API address are locked.", "此设置用于系统内部计算,默认值500000是为了精确到6位小数点设计,不推荐修改。": "Этот параметр используется для внутренних вычислений системы, значение по умолчанию 500000 разработано для точности до 6 знаков после запятой, не рекомендуется изменять.", "此页面仅显示未设置价格或倍率的模型,设置后将自动从列表中移除": "Эта страница отображает только модели с неустановленной ценой или коэффициентом, после настройки они автоматически удалятся из списка", @@ -1546,11 +1911,20 @@ "此项可选,用于覆盖请求参数。不支持覆盖 stream 参数": "Этот параметр необязательный, используется для переопределения параметров запроса. Не поддерживает переопределение параметра stream", "此项可选,用于覆盖请求头参数": "Этот параметр необязательный, используется для переопределения параметров заголовка запроса", "此项可选,用于通过自定义API地址来进行 API 调用,末尾不要带/v1和/": "Этот параметр необязательный, используется для выполнения API вызовов через пользовательский адрес API, в конце не должно быть /v1 и /", + "每个用户最多可创建的令牌数量,默认 1000,设置过大可能会影响性能": "Maximum tokens each user can create, default 1000. Setting too high may impact performance", + "每周": "Еженедельно", + "每周窗口": "Weekly window", + "每天": "Ежедневно", "每容器GPU数": "GPUs per Container", + "每日仅可签到一次,请勿重复签到": "Только одна регистрация в день, пожалуйста, не регистрируйтесь повторно", + "每日签到": "Ежедневная регистрация", + "每日签到可获得随机额度奖励": "Ежедневная регистрация награждает случайной квотой", + "每月": "Ежемесячно", "每隔多少分钟测试一次所有通道": "Как часто тестировать все каналы (в минутах)", "永不过期": "Никогда не истекает", "永久删除您的两步验证设置": "Окончательно удалить настройки двухфакторной аутентификации", "永久删除所有备用码(包括未使用的)": "Окончательно удалить все резервные коды (включая неиспользованные)", + "没有任何修改!": "No changes made!", "没有匹配的日志条目": "No matching log entries", "没有可用令牌用于填充": "Нет доступных токенов для заполнения", "没有可用模型": "Нет доступных моделей", @@ -1561,15 +1935,20 @@ "注 册": "РЕГИСТРАЦИЯ", "注册": "Регистрация", "注册 Passkey": "Регистрация Passkey", + "注册失败,请重试": "Registration failed, please try again", + "注册成功!": "Registration successful!", "注意": "Внимание", + "注意:": "Note:", "注意:JSON中重复的键只会保留最后一个同名键的值": "Внимание: в JSON повторяющиеся ключи сохранят только значение последнего ключа с тем же именем", "注意非Chat API,请务必填写正确的API地址,否则可能导致无法使用": "Внимание: это не Chat API, обязательно укажите правильный адрес API, иначе это может привести к невозможности использования", "注销": "Выйти", "注销成功!": "Выход выполнен успешно!", + "活跃文件": "Active Files", + "活跃缓存数": "Active Cache Count", "流": "Поток", + "流式": "Стриминг", "流式响应完成": "Поток завершён", "流式输出": "Потоковый вывод", - "流式": "Стриминг", "流量端口": "Traffic Port", "浅色": "Светлая", "浅色模式": "Светлый режим", @@ -1580,12 +1959,13 @@ "测试单个渠道操作项目组": "Тестирование отдельного канала операционной группы проекта", "测试失败": "Тест не удался", "测试失败:": "Test failed: ", + "测试所有未手动禁用渠道": "Тестировать все каналы, кроме отключенных вручную", "测试所有渠道的最长响应时间": "Максимальное время отклика для тестирования всех каналов", "测试所有通道": "Тестировать все каналы", - "测试所有未手动禁用渠道": "Тестировать все каналы, кроме отключенных вручную", "测试模式": "Тестовый режим", "测试连接": "Test Connection", "测速": "Измерение скорости", + "浏览器不支持复制功能,请手动复制": "Browser does not support copy, please copy manually", "消息优先级": "Приоритет сообщения", "消息优先级,范围0-10,默认为5": "Приоритет сообщения, диапазон 0-10, по умолчанию 5", "消息已删除": "Сообщение удалено", @@ -1599,6 +1979,7 @@ "深色": "Тёмная", "深色模式": "Тёмный режим", "添加": "Добавить", + "添加 OAuth 提供商": "Add OAuth Provider", "添加API": "Добавить API", "添加产品": "Добавить продукт", "添加令牌": "Добавить токен", @@ -1619,14 +2000,22 @@ "添加键值对": "Добавить пару ключ-значение", "添加问答": "Добавить вопрос-ответ", "添加额度": "Добавить лимит", + "清理不活跃缓存": "Очистить неактивный кэш", + "清理失败": "Cleanup failed", "清空": "Clear", + "清空全部缓存": "Clear All Cache", + "清空该规则缓存": "Clear Rule Cache", "清空重定向": "Очистить перенаправление", "清除历史日志": "Очистить историю логов", "清除失效兑换码": "Очистить недействительные коды обмена", "清除所有模型": "Очистить все модели", "渠道": "Канал", "渠道 ID": "ID канала", + "渠道:": "Channel:", "渠道ID,名称,密钥,API地址": "ID Канала, имя, Токен, адрес API", + "渠道亲和性": "Channel Affinity", + "渠道亲和性:上游缓存命中": "Channel Affinity: Upstream Cache Hit", + "渠道亲和性会基于从请求上下文或 JSON Body 提取的 Key,优先复用上一次成功的渠道。": "Channel affinity prioritizes reusing the last successful channel based on keys extracted from request context or JSON body.", "渠道优先级": "Приоритет канала", "渠道信息": "Информация о канале", "渠道创建成功!": "Канал создан успешно!", @@ -1658,8 +2047,6 @@ "点击此处": "Нажмите здесь", "点击预览视频": "Нажмите для предварительного просмотра видео", "点击预览音乐": "Нажмите для прослушивания музыки", - "音乐预览": "Предварительное прослушивание", - "音频无法播放": "Не удалось воспроизвести аудио", "点击验证按钮,使用您的生物特征或安全密钥": "Нажмите кнопку проверки, используйте ваши биометрические данные или ключ безопасности", "版权所有": "Все права защищены", "状态": "Статус", @@ -1669,12 +2056,15 @@ "状态页面Slug": "Slug страницы статуса", "环境变量": "Environment Variables", "生成令牌": "Сгенерировать токен", + "生成并填入": "Generate and Fill", "生成数量": "Количество для генерации", "生成数量必须大于0": "Количество для генерации должно быть больше 0", "生成新的备用码": "Сгенерировать новые резервные коды", "生成歌词": "Сгенерировать текст песни", "生成音乐": "Сгенерировать музыку", + "生效": "Активно", "用于API调用的身份验证令牌,请妥善保管": "Токен аутентификации для API вызовов, пожалуйста, храните его надёжно", + "用于唯一标识用户的字段路径": "Field path for uniquely identifying users", "用于配置网络代理,支持 socks5 协议": "Используется для настройки сетевого прокси, поддерживает протокол socks5", "用于验证回调 new-api 的 webhook 请求的密钥,敏感信息不显示": "Ключ для проверки обратных запросов new-api по webhook, чувствительные данные не показываются.", "用以支持基于 WebAuthn 的无密码登录注册": "Используется для поддержки входа и регистрации без пароля на основе WebAuthn", @@ -1688,11 +2078,14 @@ "用以支持通过微信进行登录注册": "Используется для поддержки входа и регистрации через WeChat", "用以防止恶意用户利用临时邮箱批量注册": "Используется для предотвращения массовой регистрации злоумышленниками с использованием временных почтовых ящиков", "用户": "Пользователь", + "用户 ID 字段(可选)": "User ID Field (optional)", "用户个人功能": "Персональные функции пользователя", "用户主页,展示系统信息": "Главная страница пользователя, отображение системной информации", "用户优先:如果用户在请求中指定了系统提示词,将优先使用用户的设置": "Приоритет пользователя: если пользователь указал системное приглашение в запросе, будут использоваться настройки пользователя", "用户信息": "Информация о пользователе", "用户信息更新成功!": "Информация о пользователе обновлена успешно!", + "用户信息缺失": "User info missing", + "用户最大令牌数量": "Max Tokens Per User", "用户分组": "Группы пользователей", "用户分组和额度管理": "Управление группами пользователей и лимитами", "用户分组配置": "Конфигурация групп пользователей", @@ -1701,6 +2094,7 @@ "用户协议更新失败": "Не удалось обновить пользовательское соглашение", "用户可选分组": "Доступные для выбора группы пользователей", "用户名": "Имя пользователя", + "用户名字段(可选)": "Username Field (optional)", "用户名或邮箱": "Имя пользователя или email", "用户名称": "Имя пользователя", "用户控制面板,管理账户": "Панель управления пользователя, управление аккаунтом", @@ -1711,25 +2105,39 @@ "用户的基本账户信息": "Основная информация об аккаунте пользователя", "用户管理": "Управление пользователями", "用户组": "Группа пользователей", + "用户订阅管理": "Управление подписками пользователей", "用户账户创建成功!": "Аккаунт пользователя создан успешно!", "用户账户管理": "Управление аккаунтами пользователей", "用时/首字": "Время/первый символ", + "由全站货币展示设置统一控制": "Управляется глобальными настройками отображения валюты", + "由订阅抵扣": "Deducted from subscription", + "界面语言和其他个人偏好": "Interface language and other personal preferences", + "留空使用系统临时目录": "Leave empty to use system temp directory", "留空则使用账号绑定的邮箱": "Если оставить пустым, будет использован email, привязанный к аккаунту", "留空则使用默认端点;支持 {path, method}": "Если оставить пустым, будет использоваться конечная точка по умолчанию; поддерживает {path, method}", + "留空则保持原有密钥": "Leave empty to keep existing secret", "留空则默认使用服务器地址,注意不能携带http://或者https://": "Если оставить пустым, по умолчанию будет использоваться адрес сервера, обратите внимание, что нельзя указывать http:// или https://", "登 录": "ВОЙТИ", "登录": "Войти", + "登录失败,请重试": "Login failed, please try again", + "登录成功": "Login successful", "登录成功!": "Вход выполнен успешно!", "登录过期,请重新登录!": "Сессия истекла, пожалуйста, войдите снова!", "白名单": "Белый список", + "百度文心千帆": "Baidu ERNIE", + "百度文心千帆V2": "Baidu ERNIE V2", "的前提下使用。": "использовать при условии.", "监控设置": "Настройки мониторинга", + "目录总大小": "Directory Total Size", + "目录文件数": "Directory File Count", "目标用户:{{username}}": "Целевой пользователь: {{username}}", "直接提交": "Отправить напрямую", "相关项目": "Связанные проекты", "相当于删除用户,此修改将不可逆": "Эквивалентно удалению пользователя, это изменение будет необратимым", "矛盾": "Противоречие", "知识库 ID": "ID базы знаний", + "知识库:AI Proxy": "Knowledge Base: AI Proxy", + "知识库:FastGPT": "Knowledge Base: FastGPT", "硬件": "Hardware", "硬件与性能": "Hardware & Performance", "硬件类型": "Hardware Type", @@ -1761,6 +2169,7 @@ "确定要删除所选的 {{count}} 个模型吗?_few": "Подтвердить удаление выбранных {{count}} моделей?", "确定要删除所选的 {{count}} 个模型吗?_many": "Подтвердить удаление выбранных {{count}} моделей?", "确定要删除所选的 {{count}} 个模型吗?_other": "Подтвердить удаление выбранных {{count}} моделей?", + "确定要删除此 OAuth 提供商吗?": "Are you sure you want to delete this OAuth provider?", "确定要删除此API信息吗?": "Подтвердить удаление этой информации API?", "确定要删除此公告吗?": "Подтвердить удаление этого объявления?", "确定要删除此分类吗?": "Подтвердить удаление этой категории?", @@ -1772,34 +2181,50 @@ "确定要启用此用户吗?": "Подтвердить включение этого пользователя?", "确定要提升此用户吗?": "Подтвердить повышение этого пользователя?", "确定要更新所有已启用通道余额吗?": "Подтвердить обновление баланса всех включенных каналов?", - "确定要测试所有通道吗?": "Подтвердить тестирование всех каналов?", "确定要测试所有未手动禁用渠道吗?": "Вы уверены, что хотите протестировать все каналы, кроме отключенных вручную?", + "确定要测试所有通道吗?": "Подтвердить тестирование всех каналов?", "确定要禁用所有的密钥吗?": "Подтвердить отключение всех ключей?", "确定要禁用此用户吗?": "Подтвердить отключение этого пользователя?", + "确定要解绑 {{name}} 吗?": "Are you sure you want to unbind {{name}}?", "确定要降级此用户吗?": "Подтвердить понижение этого пользователя?", "确定重置": "Подтвердить сброс", "确定重置模型倍率吗?": "Подтвердить сброс коэффициента модели?", "确认": "Подтверждение", + "确认作废": "Подтвердить аннулирование", + "确认关闭提示": "Подтвердить закрытие", "确认冲突项修改": "Подтвердить изменение конфликтующих элементов", "确认删除": "Подтвердить удаление", "确认删除模型": "Confirm Delete Model", "确认取消密码登录": "Подтвердить отмену входа по паролю", + "确认启用": "Confirm Enable", "确认密码": "Подтвердить пароль", "确认导入配置": "Подтвердить импорт конфигурации", "确认延长": "Confirm Extension", "确认延长容器时长": "Confirm Container Duration Extension", "确认操作": "Confirm Operation", "确认新密码": "Подтвердить новый пароль", - "确认清除历史日志": "Подтвердить очистку истории логов", "确认清理不活跃的磁盘缓存?": "Подтвердить очистку неактивного дискового кэша?", + "确认清空全部渠道亲和性缓存": "Confirm clear all channel affinity cache", + "确认清空该规则缓存": "Confirm clear rule cache", + "确认清除历史日志": "Подтвердить очистку истории логов", "确认禁用": "Подтвердить отключение", "确认补单": "Подтвердить дополнение заказа", "确认解绑": "Подтвердить отвязку", "确认解绑 Passkey": "Подтвердить отвязку Passkey", "确认设置并完成初始化": "Подтвердить настройки и завершить инициализацию", + "确认迁移": "Confirm Migration", "确认重置 Passkey": "Подтвердить сброс Passkey", "确认重置两步验证": "Подтвердить сброс двухфакторной аутентификации", "确认重置密码": "Подтвердить сброс пароля", + "磁盘 阈值 (%)": "Порог диска (%)", + "磁盘使用率超过此值时拒绝请求": "Отклонять запросы, когда использование диска превышает это значение", + "磁盘可用空间小于缓存最大总量设置": "Disk free space is less than max cache size setting", + "磁盘命中": "Disk Hits", + "磁盘缓存最大总量 (MB)": "Max Disk Cache Size (MB)", + "磁盘缓存占用的最大空间": "Maximum space occupied by disk cache", + "磁盘缓存已清理": "Disk cache cleared", + "磁盘缓存设置(磁盘换内存)": "Disk Cache Settings (Disk Swap Memory)", + "磁盘缓存阈值 (MB)": "Disk Cache Threshold (MB)", "示例": "Пример", "示例:{\"default\": [200, 100], \"vip\": [0, 1000]}。": "Пример: {\"default\": [200, 100], \"vip\": [0, 1000]}.", "视频": "Видео", @@ -1811,6 +2236,7 @@ "禁用两步验证": "Отключить двухфакторную аутентификацию", "禁用全部": "Отключить все", "禁用原因": "Причина отключения", + "禁用后用户端不再展示,但历史订单不受影响。是否继续?": "После отключения план не будет отображаться пользователям, но история заказов не затрагивается. Продолжить?", "禁用后的影响:": "Последствия отключения:", "禁用密钥失败": "Ошибка отключения ключа", "禁用思考处理的模型列表": "Список моделей без обработки thinking", @@ -1823,21 +2249,34 @@ "秒": "секунда", "移除 functionResponse.id 字段": "Удалить поле functionResponse.id", "移除 One API 的版权标识必须首先获得授权,项目维护需要花费大量精力,如果本项目对你有意义,请主动支持本项目": "Удаление авторских знаков One API требует предварительного разрешения, поддержка проекта требует больших усилий, если этот проект важен для вас, пожалуйста, поддержите его", + "窗口:": "Window:", "窗口处理": "Обработка окна", "窗口等待": "Ожидание окна", + "立即签到": "Зарегистрироваться сейчас", + "立即订阅": "Оформить сейчас", "站点额度展示类型及汇率": "Тип отображения квот сайта и обменные курсы", "端口号必须在1-65535之间": "Port number must be between 1-65535", "端口配置详细说明": "Ограничение внешних запросов только к указанным портам. Поддерживает отдельные порты (80, 443) или диапазоны портов (8000-8999). Пустой список разрешает все порты. По умолчанию включает распространенные веб-порты.", "端点": "Конечная точка", + "端点 URL 必须是完整地址(以 http:// 或 https:// 开头)": "Endpoint URL must be a full address (starting with http:// or https://)", "端点映射": "Отображение конечных точек", - "在模型广场向用户展示的端点": "Эндпоинт, отображаемый пользователям в маркетплейсе моделей", "端点类型": "Тип конечной точки", "端点组": "Группа конечных точек", + "第三方支付配置": "Настройки сторонних платежей", "第三方账户绑定状态(只读)": "Статус привязки сторонних аккаунтов (только для чтения)", "等价金额:": "Эквивалентная сумма:", "等待中": "Ожидание", "等待获取邮箱信息...": "Ожидание получения информации об email...", "筛选": "Фильтр", + "签到最大额度": "Максимальная квота регистрации", + "签到最小额度": "Минимальная квота регистрации", + "签到功能允许用户每日签到获取随机额度奖励": "Функция регистрации позволяет пользователям регистрироваться ежедневно для получения случайных наград в виде квоты", + "签到失败": "Регистрация не удалась", + "签到奖励将直接添加到您的账户余额": "Награды за регистрацию будут напрямую добавлены на баланс вашего счета", + "签到奖励的最大额度": "Максимальная квота для наград за регистрацию", + "签到奖励的最小额度": "Минимальная квота для наград за регистрацию", + "签到成功!获得": "Регистрация успешна! Получено", + "签到设置": "Настройки регистрации", "管理": "Управление", "管理 Ollama 模型的拉取和删除": "Manage Ollama model pulling and deletion", "管理你的 LinuxDO OAuth App": "Управление вашим LinuxDO OAuth App", @@ -1848,20 +2287,27 @@ "管理员未开启Stripe充值!": "Администратор не включил пополнение через Stripe!", "管理员未开启在线充值!": "Администратор не включил онлайн пополнение!", "管理员未开启在线充值功能,请联系管理员开启或使用兑换码充值。": "Администратор не включил функцию онлайн пополнения, свяжитесь с администратором для включения или используйте коды купонов для пополнения.", + "管理员未开启在线支付功能,请联系管理员配置。": "Онлайн-оплата не включена администратором. Пожалуйста, свяжитесь с администратором.", "管理员未设置用户可选分组": "Администратор не установил доступные для выбора группы пользователей", "管理员设置了外部链接,点击下方按钮访问": "Администратор установил внешнюю ссылку, нажмите кнопку ниже для доступа", "管理员账号": "Аккаунт администратора", "管理员账号已经初始化过,请继续设置其他参数": "Аккаунт администратора уже инициализирован, продолжите настройку других параметров", "管理模型、标签、端点等预填组": "Управление предзаполненными группами моделей, тегов, конечных точек и т.д.", + "管理用户已绑定的第三方账户,支持筛选与解绑": "Manage third-party accounts bound to users, with filtering and unbinding support", + "管理绑定": "Manage Bindings", "类型": "Тип", "粘贴图片失败": "Ошибка вставки изображения", "精确": "Точный", + "精确名称匹配": "Exact Name Match", "系统": "Система", "系统令牌已复制到剪切板": "Системный токен скопирован в буфер обмена", "系统任务记录": "Записи системных задач", "系统信息": "Системная информация", "系统公告": "Системные объявления", + "系统公告已更新": "System announcement updated", + "系统公告更新失败": "Failed to update system announcement", "系统公告管理,可以发布系统通知和重要消息(最多100个,前端显示最新20条)": "Управление системными объявлениями, позволяет публиковать системные уведомления и важные сообщения (максимум 100, на интерфейсе отображаются последние 20)", + "系统内存": "System Memory", "系统初始化": "Инициализация системы", "系统初始化失败,请重试": "Инициализация системы не удалась, попробуйте снова", "系统初始化成功,正在跳转...": "Инициализация системы прошла успешно, выполняется перенаправление...", @@ -1870,6 +2316,7 @@ "系统名称已更新": "Название системы обновлено", "系统名称更新失败": "Не удалось обновить название системы", "系统已为该部署准备 Ollama 镜像与随机 API Key": "System has prepared Ollama image and random API Key for this deployment", + "系统性能监控": "Мониторинг производительности системы", "系统提示覆盖": "Переопределение системного приглашения", "系统提示词": "Системное приглашение", "系统提示词拼接": "Объединение системных приглашений", @@ -1877,22 +2324,13 @@ "系统文档和帮助信息": "Системная документация и справочная информация", "系统消息": "Системные сообщения", "系统管理功能": "Функции системного управления", - "系统性能监控": "Мониторинг производительности системы", - "启用性能监控后,当系统资源使用率超过设定阈值时,将拒绝新的 Relay 请求 (/v1, /v1beta 等),以保护系统稳定性。": "При включённом мониторинге производительности, когда использование системных ресурсов превышает установленный порог, новые Relay-запросы (/v1, /v1beta и т.д.) будут отклоняться для защиты стабильности системы.", - "启用性能监控": "Включить мониторинг производительности", - "超过阈值时拒绝新请求": "Отклонять новые запросы при превышении порога", - "CPU 阈值 (%)": "Порог CPU (%)", - "CPU 使用率超过此值时拒绝请求": "Отклонять запросы, когда использование CPU превышает это значение", - "内存 阈值 (%)": "Порог памяти (%)", - "内存使用率超过此值时拒绝请求": "Отклонять запросы, когда использование памяти превышает это значение", - "磁盘 阈值 (%)": "Порог диска (%)", - "磁盘使用率超过此值时拒绝请求": "Отклонять запросы, когда использование диска превышает это значение", - "保存性能设置": "Сохранить настройки производительности", "系统设置": "Системные настройки", "系统访问令牌": "Токен доступа к системе", "约": "Приблизительно", "索引": "Индекс", "紧凑列表": "Компактный список", + "累计签到": "Всего регистраций", + "累计获得": "Всего получено", "线路描述": "Описание маршрута", "组列表": "Список групп", "组名": "Имя группы", @@ -1903,20 +2341,26 @@ "绑定": "Привязка", "绑定 Telegram": "Привязка Telegram", "绑定信息": "Информация о привязке", + "绑定后会立即生成用户订阅(无需支付),有效期按套餐配置计算。": "После привязки подписка будет создана сразу (без оплаты); срок действия рассчитывается по настройкам плана.", "绑定微信账户": "Привязка аккаунта WeChat", "绑定成功!": "Привязка успешна!", + "绑定订阅套餐": "Привязать план подписки", "绑定邮箱地址": "Привязка адреса электронной почты", + "结束": "Окончание", "结束时间": "Время окончания", "结果图片": "Изображение результата", + "结算差额": "Settlement Difference", "绘图": "Рисование", "绘图任务记录": "Записи задач рисования", "绘图日志": "Журнал рисования", "绘图设置": "Настройки рисования", "统一的": "Единый", "统计Tokens": "Статистика токенов", + "统计已重置": "Statistics reset", "统计次数": "Статистика количества", "统计额度": "Статистика лимитов", "继续": "Продолжить", + "维护中": "Maintenance", "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Кэш {{tokens}} токенов / 1M токенов * {{symbol}}{{price}} (множитель: {{ratio}})", "缓存 Tokens": "Кэширование токенов", "缓存: {{cacheRatio}}": "Кэш: {{cacheRatio}}", @@ -1924,6 +2368,7 @@ "缓存价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存倍率: {{cacheRatio}})": "Цена кэша: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M токенов (коэффициент кэширования: {{cacheRatio}})", "缓存倍率": "Коэффициент кэширования", "缓存倍率 {{cacheRatio}}": "Коэффициент кэша {{cacheRatio}}", + "缓存写": "Запись в кэш", "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Создание кэша {{tokens}} токенов / 1M токенов * {{symbol}}{{price}} (множитель: {{ratio}})", "缓存创建 Tokens": "Создание кэша токенов", "缓存创建: {{cacheCreationRatio}}": "Создание кэша: {{cacheCreationRatio}}", @@ -1932,11 +2377,18 @@ "缓存创建: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Создание кэша: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", "缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存创建倍率: {{cacheCreationRatio}})": "Цена создания кэша: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M токенов (коэффициент создания кэша: {{cacheCreationRatio}})", "缓存创建价格合计:5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens": "Итого цена создания кэша: 5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M токенов", + "缓存创建倍率": "Коэффициент создания кэша", "缓存创建倍率 {{cacheCreationRatio}}": "Коэффициент создания кэша {{cacheCreationRatio}}", "缓存创建倍率 1h {{cacheCreationRatio1h}}": "Множитель создания кэша 1h {{cacheCreationRatio1h}}", "缓存创建倍率 5m {{cacheCreationRatio5m}}": "Множитель создания кэша 5m {{cacheCreationRatio5m}}", "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Коэффициент создания кэша 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", + "缓存条目数": "Cache Entries", + "缓存目录": "Cache Directory", + "缓存目录磁盘空间": "Cache Directory Disk Space", + "缓存读": "Чтение кэша", + "编号:": "ID:", "编辑": "Редактировать", + "编辑 OAuth 提供商": "Edit OAuth Provider", "编辑API": "Редактировать API", "编辑产品": "Редактировать продукт", "编辑供应商": "Редактировать поставщика", @@ -1949,12 +2401,14 @@ "编辑模式": "Режим редактирования", "编辑用户": "Редактировать пользователя", "编辑聊天配置": "Редактировать настройки чата", + "编辑规则": "Edit Rule", "编辑问答": "Редактировать вопрос-ответ", "缩词": "Сокращение", "缺省 MaxTokens": "MaxTokens по умолчанию", "网站地址": "Адрес веб-сайта", "网站域名标识": "Идентификатор домена веб-сайта", "网络连接失败,请检查网络设置或稍后重试": "Network connection failed, please check network settings or try again later", + "网络连接失败或服务器无响应": "Network connection failed or server not responding", "网络配置": "Network Configuration", "网络错误": "Сетевая ошибка", "置信度": "Уровень доверия", @@ -1964,6 +2418,7 @@ "聊天区域": "Область чата", "聊天应用名称": "Название чат-приложения", "聊天应用名称已存在,请使用其他名称": "Название чат-приложения уже существует, используйте другое название", + "聊天数据解析失败": "Failed to parse chat data", "聊天设置": "Настройки чата", "聊天配置": "Конфигурация чата", "聊天链接配置错误,请联系管理员": "Ошибка конфигурации ссылки чата, свяжитесь с администратором", @@ -1972,27 +2427,42 @@ "自动分组auto,从第一个开始选择": "Автоматическая группировка auto, выбор начинается с первого", "自动刷新": "Auto Refresh", "自动刷新中": "Auto refreshing", + "自动填充字段": "Auto-fill Fields", "自动检测": "Автоматическое обнаружение", "自动模式": "Автоматический режим", "自动测试所有通道间隔时间": "Интервал автоматического тестирования всех каналов", + "自动生成:": "Auto-generated: ", "自动禁用": "Автоматическое отключение", "自动禁用关键词": "Ключевые слова для автоматического отключения", + "自动禁用状态码": "Auto-disable status codes", + "自动禁用状态码格式不正确": "Invalid auto-disable status code format", "自动选择": "Автоматический выбор", + "自动重试状态码": "Auto-retry status codes", + "自动重试状态码格式不正确": "Invalid auto-retry status code format", + "自定义": "Пользовательский", + "自定义 OAuth 提供商": "Custom OAuth Providers", + "自定义(秒)": "Пользовательский (сек)", "自定义充值数量选项": "Пользовательские опции количества пополнения", "自定义充值数量选项不是合法的 JSON 数组": "Пользовательские опции количества пополнения не являются допустимым массивом JSON", "自定义变焦-提交": "Пользовательское масштабирование-отправка", "自定义模型名称": "Пользовательское название модели", "自定义模式下不可用": "Недоступно в пользовательском режиме", + "自定义渠道": "Custom Channel", + "自定义秒数": "Пользовательские секунды", + "自定义请求体格式错误,请检查JSON格式": "Custom request body format error, please check JSON format", "自定义请求体模式": "Режим пользовательского тела запроса", "自定义货币": "Пользовательская валюта", "自定义货币符号": "Пользовательский символ валюты", "自定义镜像": "Custom Image", "自用模式": "Режим личного использования", "自适应列表": "Адаптивный список", + "至": "до", "节省": "Экономия", "花费": "Расходы", "花费时间": "Затраченное время", "若你的 OIDC Provider 支持 Discovery Endpoint,你可以仅填写 OIDC Well-Known URL,系统会自动获取 OIDC 配置": "Если ваш OIDC Provider поддерживает Discovery Endpoint, вы можете указать только OIDC Well-Known URL, и система автоматически получит OIDC конфигурацию", + "获取 Discovery 配置": "Fetch Discovery Config", + "获取 Discovery 配置失败:": "Failed to fetch Discovery config: ", "获取 io.net API Key": "Get io.net API Key", "获取 OIDC 配置失败,请检查网络状况和 Well-Known URL 是否正确": "Не удалось получить OIDC конфигурацию, проверьте состояние сети и правильность Well-Known URL", "获取 OIDC 配置成功!": "OIDC конфигурация успешно получена!", @@ -2013,12 +2483,17 @@ "获取模型列表": "Получить список моделей", "获取模型列表失败": "Не удалось получить список моделей", "获取渠道失败:": "Не удалось получить канал:", + "获取用量失败": "Failed to get usage", "获取硬件类型失败: ": "Failed to get hardware types: ", + "获取签到状态失败": "Не удалось получить статус регистрации", "获取组列表失败": "Не удалось получить список групп", + "获取绑定信息失败": "Failed to get binding info", + "获取自定义 OAuth 提供商列表失败": "Failed to get custom OAuth provider list", "获取详情失败": "Failed to get details", "获取部署列表失败": "Failed to get deployment list", "获取金额失败": "Не удалось получить сумму", "获取验证码": "Получить код подтверждения", + "获得": "Получено", "补全": "Вывод", "补全 {{completion}} tokens / 1M tokens * {{symbol}}{{price}}": "Дополнение {{completion}} токенов / 1M токенов * {{symbol}}{{price}}", "补全价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "Цена вывода: {{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M токенов (коэффициент вывода: {{completionRatio}})", @@ -2032,12 +2507,21 @@ "表格视图": "Табличное представление", "覆盖模式:将完全替换现有的所有密钥": "Режим перезаписи: полностью заменит все существующие ключи", "覆盖现有密钥": "Перезаписать существующие ключи", + "规则": "Rule", + "规则 JSON": "Rule JSON", + "规则 JSON 格式不正确": "Rule JSON format is incorrect", + "规则 ttl_seconds 为 0 时使用。0 表示使用后端默认 TTL:3600 秒。": "Used when rule ttl_seconds is 0. 0 means using backend default TTL: 3600 seconds.", + "规则为 JSON 数组;可视化与 JSON 模式共用同一份数据。": "Rules are JSON arrays; visual and JSON modes share the same data.", + "规则名称(可读性更好,也会出现在管理侧日志中)。": "Rule name (for better readability, also appears in admin logs).", + "规则未找到,请刷新后重试": "Rule not found, please refresh and try again", "角色": "Роль", "解析响应数据时发生错误": "Произошла ошибка при разборе данных ответа", "解析密钥文件失败: {{msg}}": "Не удалось разобрать файл ключа: {{msg}}", "解析错误": "Ошибка разбора", + "解绑": "Unbind", "解绑 Passkey": "Отвязать Passkey", "解绑后将无法使用 Passkey 登录,确定要继续吗?": "После отвязки невозможно будет использовать Passkey для входа, продолжить?", + "解绑成功": "Unbind successful", "计价币种": "Pricing Currency", "计算中": "Calculating", "计算成本": "Calculate Cost", @@ -2047,7 +2531,18 @@ "计费类型": "Тип выставления счёта", "计费过程": "Процесс выставления счёта", "订单号": "Номер заказа", + "订阅": "Подписка", + "订阅剩余": "Subscription Remaining", + "订阅套餐": "Планы подписки", + "订阅套餐管理": "Управление тарифами подписки", + "订阅实例": "Subscription Instance", + "订阅抵扣": "Subscription Deduction", + "订阅管理": "Управление подписками", + "订阅结算": "Subscription Settlement", + "订阅说明": "Subscription Description", + "认证方式": "Auth Style", "讯飞星火": "iFlytek Spark", + "讯飞星火认知": "iFlytek Spark", "记录请求与错误日志IP": "Записывать IP запросов и логов ошибок", "设备": "Device", "设备类型偏好": "Предпочтения типа устройства", @@ -2079,6 +2574,7 @@ "设置首页内容": "Установить содержимое главной страницы", "设置默认地区和特定模型的专用地区": "Установить регион по умолчанию и специальные регионы для конкретных моделей", "设计与开发由": "Дизайн и разработка", + "设计版本": "b80c3466cb6feafeb3990c7820e10e50", "访问 io.net 控制台的 API Keys 页面": "Visit the API Keys page of the io.net console", "访问容器": "Access Container", "访问模型部署功能需要先启用 io.net 部署服务": "Accessing model deployment features requires enabling the io.net deployment service first", @@ -2086,16 +2582,25 @@ "该供应商提供多种AI模型,适用于不同的应用场景。": "Этот поставщик предоставляет различные модели ИИ, подходящие для разных сценариев применения.", "该分类下没有可用模型": "В этой категории нет доступных моделей", "该域名已存在于白名单中": "Этот домен уже существует в белом списке", + "该套餐未配置 Creem": "Для этого плана не настроен Creem", + "该套餐未配置 Stripe": "Для этого плана не настроен Stripe", "该数据可能不可信,请谨慎使用": "Эти данные могут быть недостоверными, используйте с осторожностью", "该服务器地址将影响支付回调地址以及默认首页展示的地址,请确保正确配置": "Этот адрес сервера повлияет на адрес обратного вызова оплаты и адрес отображения главной страницы по умолчанию, убедитесь в правильной конфигурации", "该模型存在固定价格与倍率计费方式冲突,请确认选择": "Эта модель имеет конфликт между фиксированной ценой и способом выставления счёта по коэффициенту, подтвердите выбор", "该渠道已开启请求透传,参数覆写、模型重定向等 NewAPI 内置功能将失效,非最佳实践。": "Для этого канала включена сквозная передача запросов; встроенные функции NewAPI, такие как переопределение параметров и перенаправление моделей, будут отключены. Это не является лучшей практикой.", "该渠道已开启请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "Для этого канала включена сквозная передача запросов. Встроенные возможности NewAPI, такие как переопределение параметров, перенаправление моделей и адаптация канала, будут отключены. Это не является лучшей практикой. Если из-за этого возникнут проблемы, пожалуйста, не создавайте issue.", + "该规则未启用“作用域:包含规则名称”,无法按规则清空缓存。": "This rule has not enabled \"Scope: Include Rule Name\", cannot clear cache by rule.", + "该规则的缓存保留时长;0 表示使用默认 TTL:": "Cache retention duration for this rule; 0 uses the default TTL:", + "该记录不包含可用的 token 统计口径。": "This record does not contain available token statistics.", "详情": "Подробности", + "语言偏好": "Language Preference", + "语言偏好已保存": "Language preference saved", "语音输入": "Голосовой ввод", "语音输出": "Голосовой вывод", "说明": "Описание", "说明:": "Описание:", + "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。": "Примечание: тесты на этой странице используют нестриминговые запросы. Если канал поддерживает только стриминговые ответы, тест может завершиться неудачей. Ориентируйтесь на реальное использование.", + "说明:生成结果是可直接粘贴到渠道密钥里的 JSON(包含 access_token / refresh_token / account_id)。": "Note: The generated result is a JSON that can be directly pasted into the channel secret (contains access_token / refresh_token / account_id).", "说明信息": "Информация об описании", "请上传密钥文件": "Пожалуйста, загрузите файл ключа", "请上传密钥文件!": "Пожалуйста, загрузите файл ключа!", @@ -2103,13 +2608,20 @@ "请使用 Project 为 io.cloud 的密钥": "Please use a key with Project set to io.cloud", "请先在设置中启用图片功能": "Сначала включите функцию изображений в настройках", "请先填写 API Key": "Please fill in API Key first", + "请先填写 Discovery URL 或 Issuer URL": "Please fill in Discovery URL or Issuer URL first", + "请先填写 Issuer URL,以自动生成完整的端点 URL": "Please fill in Issuer URL first to auto-generate full endpoint URLs", "请先填写 Ollama API 地址": "Please fill in Ollama API address first", "请先填写服务器地址": "Пожалуйста, сначала заполните адрес сервера", + "请先粘贴回调 URL": "Please paste callback URL first", "请先输入密钥": "Пожалуйста, сначала введите ключ", "请先选择同步渠道": "Пожалуйста, сначала выберите канал синхронизации", "请先选择模型!": "Пожалуйста, сначала выберите модель!", "请先选择硬件类型": "Please select hardware type first", + "请先选择要删除的API信息": "Please select the API info to delete first", "请先选择要删除的令牌!": "Пожалуйста, сначала выберите токен для удаления!", + "请先选择要删除的分类": "Please select the category to delete first", + "请先选择要删除的常见问答": "Please select the FAQ to delete first", + "请先选择要删除的系统公告": "Please select the announcement to delete first", "请先选择要删除的通道!": "Пожалуйста, сначала выберите канал для удаления!", "请先选择要设置标签的渠道!": "Пожалуйста, сначала выберите канал для установки тега!", "请先选择需要批量设置的模型": "Пожалуйста, сначала выберите модели для пакетной настройки", @@ -2118,8 +2630,12 @@ "请前往个人设置 → 安全设置进行配置。": "Пожалуйста, перейдите в Личные настройки → Настройки безопасности для конфигурации.", "请勿过度信任此功能,IP可能被伪造,请配合nginx和cdn等网关使用": "Не доверяйте этой функции чрезмерно, IP может быть подделан, используйте её вместе с nginx и CDN и другими шлюзами", "请在系统设置页面编辑分组倍率以添加新的分组:": "Пожалуйста, отредактируйте коэффициенты групп на странице системных настроек для добавления новой группы:", + "请填写完整的API信息": "Please fill in complete API info", "请填写完整的产品信息": "Пожалуйста, заполните всю информацию о продукте", + "请填写完整的公告信息": "Please fill in complete announcement info", + "请填写完整的分类信息": "Please fill in complete category info", "请填写完整的管理员账号信息": "Пожалуйста, заполните полную информацию об учётной записи администратора", + "请填写完整的问答信息": "Please fill in complete FAQ info", "请填写密钥": "Пожалуйста, заполните ключ", "请填写渠道名称和渠道密钥!": "Пожалуйста, заполните имя канала и ключ канала!", "请填写部署地区": "Пожалуйста, заполните регион развертывания", @@ -2129,24 +2645,31 @@ "请检查表单填写是否正确": "Пожалуйста, проверьте правильность заполнения формы", "请检查输入": "Пожалуйста, проверьте ввод", "请求体 JSON": "Тело запроса JSON", + "请求体内存缓存": "Request Body Memory Cache", + "请求体磁盘缓存": "Request Body Disk Cache", + "请求体超过此大小时使用磁盘缓存": "Use disk cache when request body exceeds this size", "请求参数无效": "Invalid request parameters", "请求发生错误": "Произошла ошибка запроса", "请求发生错误: ": "Произошла ошибка запроса: ", "请求后端接口失败:": "Не удалось запросить внутренний интерфейс:", "请求失败": "Запрос не удался", "请求头覆盖": "Переопределение заголовков запроса", + "请求头覆盖必须是合法的 JSON 格式!": "Header override must be valid JSON format!", "请求并计费模型": "Запрос и выставление счёта модели", "请求时长: ${time}s": "Время запроса: ${time}s", "请求次数": "Количество запросов", "请求结束后多退少补": "После вывода запроса возврат излишков и доплата недостатка", "请求超时,请刷新页面后重新发起 GitHub 登录": "Время ожидания истекло, обновите страницу и снова запустите вход через GitHub", "请求路径": "Путь запроса", + "请求转换": "Request conversion", "请求预扣费额度": "Запрос суммы предварительного удержания", "请点击我": "Пожалуйста, нажмите на меня", "请确认以下设置信息,点击\"初始化系统\"开始配置": "Пожалуйста, подтвердите следующую информацию о настройках, нажмите \"Инициализация системы\" для начала конфигурации", "请确认您已了解禁用两步验证的后果": "Пожалуйста, подтвердите, что вы понимаете последствия отключения двухфакторной аутентификации", "请确认管理员密码": "Пожалуйста, подтвердите пароль администратора", "请稍后几秒重试,Turnstile 正在检查用户环境!": "Пожалуйста, повторите попытку через несколько секунд, Turnstile проверяет среду пользователя!", + "请立刻修改默认密码!": "Please change the default password immediately!", + "请粘贴完整回调 URL(包含 code 与 state)": "Please paste the full callback URL (containing code and state)", "请联系管理员在系统设置中配置API信息": "Пожалуйста, свяжитесь с администратором для настройки информации API в системных настройках", "请联系管理员在系统设置中配置Uptime": "Пожалуйста, свяжитесь с администратором для настройки Uptime в системных настройках", "请联系管理员在系统设置中配置公告信息": "Пожалуйста, свяжитесь с администратором для настройки информации об объявлениях в системных настройках", @@ -2159,12 +2682,22 @@ "请至少选择一个渠道": "Пожалуйста, выберите хотя бы один канал", "请输入 API Key,一行一个,格式:APIKey|Region": "Введите API Key, по одному в строке, формат: APIKey|Region", "请输入 API Key,格式:APIKey|Region": "Введите API Key в формате: APIKey|Region", + "请输入 Authorization Endpoint": "Please enter Authorization Endpoint", "请输入 AZURE_OPENAI_ENDPOINT,例如:https://docs-test-001.openai.azure.com": "Пожалуйста, введите AZURE_OPENAI_ENDPOINT, например: https://docs-test-001.openai.azure.com", + "请输入 Client ID": "Please enter Client ID", + "请输入 Client Secret": "Please enter Client Secret", "请输入 io.net API Key": "Please enter io.net API Key", "请输入 io.net API Key(敏感信息不显示)": "Please enter io.net API Key (sensitive information not displayed)", + "请输入 JSON 格式的 OAuth 凭据,例如:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}": "Please enter OAuth credentials in JSON format, e.g.:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}", "请输入 JSON 格式的密钥内容,例如:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}": "Пожалуйста, введите содержимое ключа в формате JSON, например:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}", "请输入 OIDC 的 Well-Known URL": "Пожалуйста, введите Well-Known URL OIDC", + "请输入 Slug": "Please enter Slug", + "请输入 Token Endpoint": "Please enter Token Endpoint", + "请输入 User Info Endpoint": "Please enter User Info Endpoint", + "请输入6位验证码": "Please enter 6-digit verification code", "请输入6位验证码或8位备用码": "Пожалуйста, введите 6-значный код подтверждения или 8-значный резервный код", + "请输入8位备用码": "Please enter 8-digit backup code", + "请输入Account ID,例如:d6b5da8hk1awo8nap34ube6gh": "Please enter Account ID, e.g.: d6b5da8hk1awo8nap34ube6gh", "请输入API地址": "Пожалуйста, введите адрес API", "请输入API地址!": "Пожалуйста, введите адрес API!", "请输入Bark推送URL": "Пожалуйста, введите URL для push-уведомлений Bark", @@ -2198,6 +2731,7 @@ "请输入图标名称": "Пожалуйста, введите имя иконки", "请输入填充值": "Пожалуйста, введите значение заполнения", "请输入备注(仅管理员可见)": "Пожалуйста, введите примечание (видимо только администратору)", + "请输入套餐标题": "Введите название плана", "请输入完整的 JSON 格式密钥内容": "Пожалуйста, введите полное содержимое ключа в формате JSON", "请输入完整的URL,例如:https://api.openai.com/v1/chat/completions": "Пожалуйста, введите полный URL, например: https://api.openai.com/v1/chat/completions", "请输入完整的URL链接": "Пожалуйста, введите полную URL-ссылку", @@ -2208,6 +2742,7 @@ "请输入密钥,一行一个,格式:AccessKey|SecretAccessKey|Region": "Введите ключи по одному в строке в формате: AccessKey|SecretAccessKey|Region", "请输入密钥!": "Пожалуйста, введите ключ!", "请输入延长时长": "Please enter extension duration", + "请输入总额度": "Введите общий лимит", "请输入您的密码": "Пожалуйста, введите ваш пароль", "请输入您的用户名以确认删除": "Пожалуйста, введите ваше имя пользователя для подтверждения удаления", "请输入您的用户名或邮箱地址": "Пожалуйста, введите ваше имя пользователя или адрес электронной почты", @@ -2225,7 +2760,9 @@ "请输入新的用户名": "Пожалуйста, введите новое имя пользователя", "请输入新的部署名称": "Please enter new deployment name", "请输入显示名称": "Пожалуйста, введите отображаемое имя", + "请输入智能体ID,例如:7342866812345": "Please enter Agent ID, e.g.: 7342866812345", "请输入有效的JSON格式的请求体。您可以参考预览面板中的默认请求体格式。": "Пожалуйста, введите тело запроса в действительном формате JSON. Вы можете обратиться к формату тела запроса по умолчанию на панели предварительного просмотра.", + "请输入有效的URL地址": "Please enter a valid URL", "请输入有效的数字": "Пожалуйста, введите действительное число", "请输入有效的镜像地址": "Please enter a valid image address", "请输入标签名称": "Пожалуйста, введите имя тега", @@ -2240,7 +2777,10 @@ "请输入状态页面的Slug,如:my-status": "Пожалуйста, введите Slug страницы состояния, например: my-status", "请输入生成数量": "Пожалуйста, введите количество для генерации", "请输入用户名": "Пожалуйста, введите имя пользователя", + "请输入用户名和密码!": "Please enter username and password!", + "请输入知识库 ID,例如:123456": "Please enter Knowledge Base ID, e.g.: 123456", "请输入私有部署地址,格式为:https://fastgpt.run/api/openapi": "Пожалуйста, введите адрес частного развертывания, формат: https://fastgpt.run/api/openapi", + "请输入秒数": "Введите количество секунд", "请输入管理员密码": "Пожалуйста, введите пароль администратора", "请输入管理员用户名": "Пожалуйста, введите имя пользователя администратора", "请输入线路描述": "Пожалуйста, введите описание линии", @@ -2251,6 +2791,7 @@ "请输入补全倍率": "Пожалуйста, введите коэффициент вывода", "请输入要延长的小时数": "Please enter the number of hours to extend", "请输入要设置的标签名称": "Пожалуйста, введите имя тега для установки", + "请输入认证器应用显示的验证码完成登录": "Enter the verification code from your authenticator app to complete login", "请输入认证器验证码": "Пожалуйста, введите код подтверждения аутентификатора", "请输入认证器验证码或备用码": "Пожалуйста, введите код подтверждения аутентификатора или резервный код", "请输入说明": "Пожалуйста, введите описание", @@ -2261,6 +2802,7 @@ "请输入部署名称": "Please enter deployment name", "请输入部署名称以完成二次确认": "Enter deployment name to complete secondary confirmation", "请输入部署地区,例如:us-central1\n支持使用模型映射格式\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}": "Пожалуйста, введите регион развертывания, например: us-central1\nПоддерживается формат сопоставления моделей\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}", + "请输入金额": "Введите сумму", "请输入镜像地址": "Please enter image address", "请输入问题标题": "Пожалуйста, введите заголовок вопроса", "请输入预警阈值": "Пожалуйста, введите порог предупреждения", @@ -2282,6 +2824,7 @@ "请选择多密钥使用策略": "Пожалуйста, выберите стратегию использования нескольких ключей", "请选择密钥更新模式": "Пожалуйста, выберите режим обновления ключей", "请选择密钥格式": "Пожалуйста, выберите формат ключей", + "请选择支付方式": "Please select a payment method", "请选择日志记录时间": "Пожалуйста, выберите время записи журнала", "请选择模型": "Пожалуйста, выберите модель", "请选择模型。": "Пожалуйста, выберите модель.", @@ -2290,6 +2833,7 @@ "请选择硬件类型": "Please select hardware type", "请选择组类型": "Пожалуйста, выберите тип группы", "请选择至少一个部署位置": "Please select at least one deployment location", + "请选择订阅套餐": "Please select a subscription plan", "请选择该令牌支持的模型,留空支持所有模型": "Пожалуйста, выберите модели, поддерживаемые этим токеном, оставьте пустым для поддержки всех моделей", "请选择该渠道所支持的模型": "Пожалуйста, выберите модели, поддерживаемые этим каналом", "请选择该渠道所支持的模型,留空则不更改": "Пожалуйста, выберите модели, поддерживаемые этим каналом, оставьте пустым для без изменений", @@ -2304,6 +2848,7 @@ "警告:启用保活后,如果已经写入保活数据后渠道出错,系统无法重试,如果必须开启,推荐设置尽可能大的Ping间隔": "Предупреждение: после включения поддержания активности, если канал выдаёт ошибку после записи данных поддержания активности, система не может повторить попытку, если необходимо включить, рекомендуется установить максимально возможный интервал Ping", "警告:禁用两步验证将永久删除您的验证设置和所有备用码,此操作不可撤销!": "Предупреждение: отключение двухфакторной аутентификации навсегда удалит ваши настройки проверки и все резервные коды, эта операция необратима!", "豆包": "Doubao", + "豆包视频": "Doubao Video", "账单": "Счёт", "账户充值": "Пополнение счёта", "账户已删除!": "Учётная запись удалена!", @@ -2312,20 +2857,29 @@ "账户管理": "Управление учётными записями", "账户绑定": "Привязка учётной записи", "账户绑定、安全设置和身份验证": "Привязка учётной записи, настройки безопасности и аутентификация", + "账户绑定管理": "Account Binding Management", "账户统计": "Статистика учётной записи", "货币": "Валюта", "货币单位": "Валюта", + "购买上限": "Лимит покупок", "购买兑换码": "Покупка кодов купонов", + "购买套餐后即可享受模型权益": "После покупки плана доступны преимущества моделей", + "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。": "Покупка или ручное добавление подписки повысит группу до этой. При истечении/аннулировании/удалении плана произойдет возврат к предыдущей группе. Возврат обычно занимает несколько минут.", + "购买订阅套餐": "Купить план подписки", "费用信息": "Cost Information", "费用预估": "Cost Estimate", "资源消耗": "Потребление ресурсов", "起始时间": "Время начала", "超级管理员": "Суперадминистратор", "超级管理员未设置充值链接!": "Суперадминистратор не установил ссылку пополнения!", + "超过阈值时拒绝新请求": "Отклонять новые запросы при превышении порога", + "距离重置:": "Time until reset:", "跟随日志": "Follow Logs", "跟随系统主题设置": "Следовать настройкам темы системы", "跨分组": "Межгрупповой", "跨分组重试": "Повторная попытка между группами", + "路径正则": "Path Regex", + "路径正则(每行一个)": "Path Regex (one per line)", "跳转": "Перейти", "轮询": "Опрос", "轮询模式": "Режим опроса", @@ -2356,7 +2910,9 @@ "输入要添加的邮箱域名": "Введите доменное имя электронной почты для добавления", "输入认证器应用显示的6位数字验证码": "Введите 6-значный код подтверждения, отображаемый в приложении аутентификатора", "输入邮箱地址": "Введите адрес электронной почты", + "输入金额": "Введите сумму", "输入项目名称,按回车添加": "Введите имя проекта, нажмите Enter для добавления", + "输入额度": "Введите квоту", "输入验证码": "Введите код подтверждения", "输入验证码完成设置": "Введите код подтверждения для вывода настройки", "输出": "Вывод", @@ -2365,6 +2921,9 @@ "输出价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "Цена вывода: {{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M токенов (коэффициент вывода: {{completionRatio}})", "输出倍率 {{completionRatio}}": "Коэффициент вывода {{completionRatio}}", "边栏设置": "Настройки боковой панели", + "迁移失败: ": "Migration failed: ", + "迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。": "Data format conversion is handled automatically during migration. Old config will be cleared after migration, please backup in database before migrating.", + "过期于": "Истекает", "过期时间": "Время истечения", "过期时间不能早于当前时间!": "Время истечения не может быть раньше текущего времени!", "过期时间快捷设置": "Быстрая настройка времени истечения", @@ -2374,15 +2933,18 @@ "运行命令 (Command)": "Command", "运行时长": "Runtime Duration", "运行时长(小时)": "Runtime Duration (hours)", + "近 30 天": "Last 30 Days", + "近 7 天": "Last 7 Days", "返回修改": "Вернуться и исправить", "返回登录": "Вернуться к входу", - "违规扣费金额": "Сумма удержания за нарушение", - "这是重复键中的最后一个,其值将被使用": "Это последний ключ в повторяющихся, его значение будет использовано", - "这是基础金额,实际扣费 = 基础金额 x 系统分组倍率。": "Это базовая сумма. Фактическое удержание = базовая сумма × коэффициент системной группы.", "这将删除超过 10 分钟未使用的临时缓存文件": "Это удалит временные файлы кэша, которые не использовались более 10 минут", + "这是基础金额,实际扣费 = 基础金额 x 系统分组倍率。": "Это базовая сумма. Фактическое удержание = базовая сумма × коэффициент системной группы.", + "这是重复键中的最后一个,其值将被使用": "Это последний ключ в повторяющихся, его значение будет использовано", "进度": "Прогресс", "进行中": "В процессе", "进行该操作时,可能导致渠道访问错误,请仅在数据库出现问题时使用": "При выполнении этой операции могут возникнуть ошибки доступа к каналам, используйте только при проблемах с базой данных", + "违规扣费": "Violation Charge", + "违规扣费金额": "Сумма удержания за нарушение", "连接保活设置": "Настройки поддержания соединения", "连接已断开": "Соединение разорвано", "连接测试中...": "Testing connection...", @@ -2390,6 +2952,7 @@ "追加模式:将新密钥添加到现有密钥列表末尾": "Режим добавления: добавление новых ключей в конец списка существующих ключей", "追加模式:新密钥将添加到现有密钥列表的末尾": "Режим добавления: новые ключи будут добавлены в конец списка существующих ключей", "退出": "Выход", + "退款": "Возврат", "适用于个人使用的场景,不需要设置模型价格": "Подходит для сценариев личного использования, не требует установки цен на модели", "适用于为多个用户提供服务的场景": "Подходит для сценариев предоставления услуг нескольким пользователям", "适用于展示系统功能的场景,提供基础功能演示": "Подходит для сценариев демонстрации системных функций, предоставляет демонстрацию базовых функций", @@ -2400,6 +2963,7 @@ "选择同步渠道": "Выберите канал синхронизации", "选择同步语言": "Выберите язык синхронизации", "选择容器": "Select Container", + "选择您的首选界面语言,设置将自动保存并同步到所有设备": "Select your preferred interface language. Settings will be saved automatically and synced across all devices", "选择成功": "Выбрано успешно", "选择支付方式": "Выберите способ оплаты", "选择支持的认证设备类型": "Выберите поддерживаемые типы устройств аутентификации", @@ -2415,9 +2979,11 @@ "选择系统运行模式": "Выберите режим работы системы", "选择组类型": "Выберите тип группы", "选择要覆盖的冲突项": "Выберите конфликтующие элементы для перезаписи", + "选择订阅套餐": "Выберите план подписки", "选择语言": "Выберите язык", "选择过期时间(可选,留空为永久)": "Выберите время истечения (необязательно, оставьте пустым для постоянного)", "选择部署位置(可多选)": "Select deployment location(s) (multiple selections allowed)", + "选择预设模板(可选)": "Select Preset Template (optional)", "透传请求体": "Прямая передача тела запроса", "通义千问": "Tongyi Qianwen", "通用设置": "Общие настройки", @@ -2454,6 +3020,7 @@ "邮箱地址": "Адрес электронной почты", "邮箱域名格式不正确,请输入有效的域名,如 gmail.com": "Неверный формат домена электронной почты, введите действительный домен, например gmail.com", "邮箱域名白名单格式不正确": "Неверный формат белого списка доменов электронной почты", + "邮箱字段(可选)": "Email Field (optional)", "邮箱账户绑定成功!": "Учётная запись электронной почты успешно привязана!", "部分保存失败": "Частичное сохранение не удалось", "部分保存失败,请重试": "Частичное сохранение не удалось, попробуйте снова", @@ -2484,6 +3051,8 @@ "配置 Turnstile": "Настроить Turnstile", "配置 WeChat Server": "Настроить WeChat Server", "配置和消息已全部重置": "Конфигурация и сообщения полностью сброшены", + "配置套餐的有效时长": "Настроить срок действия плана", + "配置如何从用户信息 API 响应中提取用户数据,支持 JSONPath 语法": "Configure how to extract user data from user info API response, supports JSONPath syntax", "配置完成后刷新页面即可使用模型部署功能": "After configuration is complete, refresh the page to use the model deployment feature", "配置导入成功": "Конфигурация успешно импортирована", "配置已导出到下载文件夹": "Конфигурация экспортирована в папку загрузок", @@ -2494,7 +3063,9 @@ "配置服务器端请求伪造(SSRF)防护,用于保护内网资源安全": "Настроить защиту от подделки запросов на стороне сервера (SSRF) для защиты безопасности внутренних сетевых ресурсов", "配置模型部署服务提供商的API密钥和启用状态": "Configure the API key and enabled status of the model deployment service provider", "配置登录注册": "Настроить вход и регистрацию", + "配置自定义 OAuth 提供商,支持 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 协议的身份提供商": "Configure custom OAuth providers, supports GitHub Enterprise, GitLab, Gitea, Nextcloud, Keycloak, ORY and other OAuth 2.0 compatible identity providers", "配置说明": "Описание конфигурации", + "配置迁移确认": "Config Migration Confirmation", "配置邮箱域名白名单": "Настроить белый список доменов электронной почты", "重启部署失败": "Failed to restart deployment", "重命名部署": "Rename Deployment", @@ -2508,26 +3079,31 @@ "重新生成备用码失败": "Не удалось сгенерировать резервные коды заново", "重新生成备用码将使现有的备用码失效,请确保您已保存了当前的备用码。": "Повторная генерация резервных кодов сделает существующие резервные коды недействительными, убедитесь, что вы сохранили текущие резервные коды.", "重绘": "Перерисовать", + "重置": "Сброс", "重置 2FA": "Сброс 2FA", "重置 Passkey": "Сброс Passkey", "重置为默认": "Сбросить по умолчанию", + "重置周期": "Период сброса", + "重置失败": "Reset failed", + "重置时间:": "Reset time:", "重置模型倍率": "Сбросить коэффициенты моделей", + "重置统计": "Reset Stats", "重置选项": "Сбросить опции", "重置邮件发送成功,请检查邮箱!": "Письмо о сбросе успешно отправлено, проверьте электронную почту!", "重置配置": "Сбросить конфигурацию", "重要提醒": "Important Notice", "重试": "Повторить попытку", "重试连接": "Retry Connection", + "金额": "Сумма", "钱包管理": "Управление кошельком", "链接中的{key}将自动替换为sk-xxxx,{address}将自动替换为系统设置的服务器地址,末尾不带/和/v1": "В ссылке {key} будет автоматически заменен на sk-xxxx, {address} будет автоматически заменен на адрес сервера, установленный в системе, без / и /v1 в конце", "销毁容器": "Destroy Container", "销毁容器失败": "Failed to destroy container", "错误": "Ошибка", - "退款": "Возврат", + "错误:": "Error: ", + "错误:服务器内部错误,请联系管理员!": "Error: Internal server error, please contact administrator!", + "错误:请求次数过多,请稍后再试!": "Error: Too many requests, please try again later!", "错误详情": "Детали ошибки", - "异步任务退款": "Возврат асинхронной задачи", - "任务ID": "ID задачи", - "失败原因": "Причина ошибки", "键为分组名称,值为另一个 JSON 对象,键为分组名称,值为该分组的用户的特殊分组倍率,例如:{\"vip\": {\"default\": 0.5, \"test\": 1}},表示 vip 分组的用户在使用default分组的令牌时倍率为0.5,使用test分组时倍率为1": "Ключ - это имя группы, значение - другой JSON объект, ключ - имя группы, значение - специальный групповой коэффициент для пользователей этой группы, например: {\"vip\": {\"default\": 0.5, \"test\": 1}}, означает, что пользователи группы vip при использовании токенов группы default имеют коэффициент 0.5, при использовании группы test - коэффициент 1", "键为原状态码,值为要复写的状态码,仅影响本地判断": "Ключ - исходный код состояния, значение - код состояния для перезаписи, влияет только на локальную проверку", "键为用户分组名称,值为操作映射对象。内层键以\"+:\"开头表示添加指定分组(键值为分组名称,值为描述),以\"-:\"开头表示移除指定分组(键值为分组名称),不带前缀的键直接添加该分组。例如:{\"vip\": {\"+:premium\": \"高级分组\", \"special\": \"特殊分组\", \"-:default\": \"默认分组\"}},表示 vip 分组的用户可以使用 premium 和 special 分组,同时移除 default 分组的访问权限": "Ключ — это название группы пользователей, значение — объект сопоставления операций. Внутренние ключи с префиксом \"+:\" добавляют указанные группы (ключ — название группы, значение — описание), с префиксом \"-:\" удаляют указанные группы, без префикса — сразу добавляют эту группу. Пример: {\"vip\": {\"+:premium\": \"Продвинутая группа\", \"special\": \"Особая группа\", \"-:default\": \"Группа по умолчанию\"}} означает, что пользователи группы vip могут использовать группы premium и special, одновременно теряя доступ к группе default.", @@ -2540,12 +3116,17 @@ "镜像地址": "Image Address", "镜像选择": "Image Selection", "镜像配置": "Image Configuration", + "问答已删除,请及时点击”保存设置”进行保存": "FAQ deleted, please click \"Save Settings\" to save", + "问答已更新,请及时点击”保存设置”进行保存": "FAQ updated, please click \"Save Settings\" to save", + "问答已添加,请及时点击”保存设置”进行保存": "FAQ added, please click \"Save Settings\" to save", "问题标题": "Заголовок проблемы", "队列中": "В очереди", + "阿里通义千问": "Alibaba Tongyi Qianwen", "降低您账户的安全性": "Снижает безопасность вашего аккаунта", "降级": "Понизить версию", "限制周期": "Период ограничения", "限制周期统一使用上方配置的“限制周期”值。": "Период ограничения равномерно использует значение 'Период ограничения', настроенное выше.", + "限购": "Лимит", "隐私政策": "Политика конфиденциальности", "隐私政策已更新": "Политика конфиденциальности обновлена", "隐私政策更新失败": "Не удалось обновить политику конфиденциальности", @@ -2563,59 +3144,82 @@ "需要重新完整设置才能再次启用": "Требуется повторная полная настройка для повторного включения", "非必要,不建议启用模型限制": "Необязательно, не рекомендуется включать ограничения моделей", "非流": "Без потока", + "音乐预览": "Предварительное прослушивание", "音频倍率(仅部分模型支持该计费)": "Аудиокоэффициент (только некоторые модели поддерживают эту тарификацию)", "音频提示 {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}": "Аудиоввод {{input}} токенов / 1M токенов * {{symbol}}{{audioInputPrice}} + Аудиозавершение {{completion}} токенов / 1M токенов * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}", "音频提示价格:{{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens (音频倍率: {{audioRatio}})": "Цена аудиоввода: {{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M токенов (аудиокоэффициент: {{audioRatio}})", + "音频无法播放": "Не удалось воспроизвести аудио", "音频补全价格:{{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens (音频补全倍率: {{audioCompRatio}})": "Цена аудиовывода: {{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M токенов (коэффициент аудиовывода: {{audioCompRatio}})", "音频补全倍率(仅部分模型支持该计费)": "Коэффициент аудиовывода (только некоторые модели поддерживают эту тарификацию)", "音频输入相关的倍率设置,键为模型名称,值为倍率": "Настройки коэффициентов, связанные с аудиовводом, ключ - имя модели, значение - коэффициент", "音频输出补全相关的倍率设置,键为模型名称,值为倍率": "Настройки коэффициентов, связанные с аудиовыводом и завершением, ключ - имя модели, значение - коэффициент", "页脚": "Подвал", + "页脚内容已更新": "Footer content updated", + "页脚内容更新失败": "Failed to update footer content", "页面未找到,请检查您的浏览器地址是否正确": "Страница не найдена, пожалуйста, проверьте правильность адреса в браузере", "顶栏管理": "Управление верхней панелью", "项目": "Проект", "项目内容": "Содержимое проекта", "项目操作按钮组": "Группа кнопок операций проекта", "预估总费用": "Estimated Total Cost", + "预估总额度": "Расч. общая квота", "预估费用仅供参考,实际费用可能略有差异": "Estimated cost is for reference only, actual cost may vary slightly", "预填组管理": "Управление группами предварительного заполнения", + "预扣": "Pre-charge", "预览失败": "Ошибка предварительного просмотра", "预览更新": "Обновление предварительного просмотра", "预览请求体": "Предварительный просмотр тела запроса", "预计结束": "Estimated End", + "预设模板": "Preset Template", "预警阈值必须为正数": "Порог предупреждения должен быть положительным числом", "频率惩罚,减少重复词汇的出现": "Штраф за частоту, уменьшает повторение слов", "频率限制的周期(分钟)": "Период ограничения частоты (минуты)", "颜色": "Цвет", "额度": "Квота", - "输入额度": "Введите квоту", - "金额": "Сумма", - "输入金额": "Введите сумму", - "仅用于换算,实际保存的是额度": "Только для пересчёта, сохраняется квота", + "额度充值": "Пополнение квоты", "额度必须大于0": "Квота должна быть больше 0", "额度提醒阈值": "Порог напоминания о квоте", "额度查询接口返回令牌额度而非用户额度": "Интерфейс запроса квоты возвращает квоту токенов, а не квоту пользователя", "额度设置": "Настройки квоты", + "额度重置": "Сброс лимита", "额度预警阈值": "Порог предупреждения о квоте", "首尾生视频": "Видео от начала до конца", "首页": "Главная страница", "首页内容": "Содержимое главной страницы", + "首页内容已更新": "Homepage content updated", + "首页内容更新失败": "Failed to update homepage content", "验证": "Проверить", "验证 Passkey": "Проверить Passkey", "验证失败,请重试": "Проверка не удалась, попробуйте еще раз", + "验证并登录": "Verify and Login", "验证成功": "Проверка успешна", "验证数据库连接状态": "Проверить состояние подключения к базе данных", "验证码": "Код подтверждения", + "验证码发送成功,请检查你的邮箱!": "Verification code sent, please check your email!", "验证码发送成功,请检查邮箱!": "Код подтверждения успешно отправлен, проверьте электронную почту!", + "验证码必须是6位数字": "Verification code must be 6 digits", "验证设置": "Настройки проверки", "验证身份": "Подтвердить личность", "验证配置错误": "Ошибка конфигурации проверки", + "高危操作确认": "High-risk operation confirmation", + "高危状态码重试风险告知与免责声明Markdown": "### ⚠️ High-Risk Operation: Risk Notice and Disclaimer for 504/524 Retry\nBy default, this project does not retry for status codes `400` (bad request), `504` (gateway timeout), and `524` (timeout occurred).\n In many cases, 504 and 524 mean the request has reached the upstream AI service and processing has started, but the connection was closed due to long processing time.\n\nEnabling redirection/retry for these timeout status codes is a **high-risk operation**. Before enabling it, you must read and understand the consequences below:\n\n#### 1. Core Risks (Read Carefully)\n1. 💸 Duplicate/multiple billing risk: Most upstream AI providers **still charge** for requests that started processing but got interrupted by network timeout (504/524). If retry is triggered, a new upstream request will be sent, which can lead to **duplicate or multiple charges**.\n2. ⏳ Severe client timeout: If a single request already timed out, adding retries can multiply total latency and cause severe or unacceptable timeout behavior for your final client/caller.\n3. 💥 Request backlog and system crash risk: Forcing retries on timeout requests keeps threads and connections occupied for longer. Under high concurrency, this can cause serious backlog, exhaust system resources, trigger a cascading failure, and crash your proxy service.\n\n#### 2. Risk Acknowledgement\nIf you still choose to enable this feature, you acknowledge all of the following:", + "高危状态码重试风险确认输入文本": "I understand the duplicate billing and crash risks, and confirm enabling it.", + "高危状态码重试风险确认项1": "I have fully read and understood the risks and fully understand the destructive consequences of forcing retries for status codes 504 and 524.", + "高危状态码重试风险确认项2": "I have communicated with the upstream provider and confirmed that the timeout issue is an upstream bottleneck and cannot be resolved upstream at this time.", + "高危状态码重试风险确认项3": "I voluntarily accept all duplicate/multiple billing risks and will not file issues or complaints in this project repository regarding billing anomalies caused by this retry behavior.", + "高危状态码重试风险确认项4": "I voluntarily accept system stability risks, including severe client timeout and possible service crash. Any consequences caused by enabling this feature are my own responsibility.", + "高危状态码重试风险输入不匹配提示": "The input does not match the required text", + "高危状态码重试风险输入框占位文案": "Please type the exact text above", + "高延迟": "High Latency", "高级设置": "Расширенные настройки", + "高级选项": "Advanced Options", "高级配置": "Advanced Configuration", "黑名单": "Черный список", "默认": "По умолчанию", "默认 API 版本": "Версия API по умолчанию", "默认 Responses API 版本,为空则使用上方版本": "Версия Responses API по умолчанию, если пусто, используется версия выше", + "默认 TTL(秒)": "Default TTL (seconds)", + "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)": "По умолчанию используется коэффициент создания кэша 5m; коэффициент создания кэша 1h автоматически вычисляется фиксированным умножением (сейчас 1.6x)", "默认使用系统名称": "Использовать системное имя по умолчанию", "默认助手消息": "Здравствуйте! Чем я могу вам помочь?", "默认区域": "Регион по умолчанию", @@ -2623,134 +3227,6 @@ "默认折叠侧边栏": "Сворачивать боковую панель по умолчанию", "默认测试模型": "Модель для тестирования по умолчанию", "默认用户消息": "Здравствуйте", - "默认补全倍率": "Default completion ratio", - "每日签到": "Ежедневная регистрация", - "今日已签到,累计签到": "Зарегистрирован сегодня, всего регистраций", - "每日签到可获得随机额度奖励": "Ежедневная регистрация награждает случайной квотой", - "今日已签到": "Зарегистрирован сегодня", - "立即签到": "Зарегистрироваться сейчас", - "正在加载签到状态...": "Загрузка статуса регистрации...", - "获取签到状态失败": "Не удалось получить статус регистрации", - "签到成功!获得": "Регистрация успешна! Получено", - "签到失败": "Регистрация не удалась", - "获得": "Получено", - "累计签到": "Всего регистраций", - "本月获得": "В этом месяце", - "累计获得": "Всего получено", - "签到奖励将直接添加到您的账户余额": "Награды за регистрацию будут напрямую добавлены на баланс вашего счета", - "每日仅可签到一次,请勿重复签到": "Только одна регистрация в день, пожалуйста, не регистрируйтесь повторно", - "签到设置": "Настройки регистрации", - "签到功能允许用户每日签到获取随机额度奖励": "Функция регистрации позволяет пользователям регистрироваться ежедневно для получения случайных наград в виде квоты", - "启用签到功能": "Включить функцию регистрации", - "签到最小额度": "Минимальная квота регистрации", - "签到奖励的最小额度": "Минимальная квота для наград за регистрацию", - "签到最大额度": "Максимальная квота регистрации", - "签到奖励的最大额度": "Максимальная квота для наград за регистрацию", - "保存签到设置": "Сохранить настройки регистрации", - "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。": "Примечание: эта настройка влияет только на отображение моделей в «Маркетплейсе моделей» и не влияет на фактический вызов или маршрутизацию. Чтобы настроить реальное поведение вызовов, перейдите в «Управление каналами».", - "确认关闭提示": "Подтвердить закрытие", - "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?": "После закрытия это уведомление больше не будет показываться (только в этом браузере). Закрыть?", - "ChatCompletions→Responses 兼容配置(Beta)": "Совместимость ChatCompletions→Responses (бета)", - "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。": "Примечание: это бета-функция. Структура конфигурации и поведение могут измениться в будущем. Не используйте в продакшене.", - "填充模板(指定渠道)": "Заполнить шаблон (выбранные каналы)", - "填充模板(全渠道)": "Заполнить шаблон (все каналы)", - "格式化 JSON": "Форматировать JSON", - "关闭提示": "Закрыть уведомление", - "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。": "Примечание: тесты на этой странице используют нестриминговые запросы. Если канал поддерживает только стриминговые ответы, тест может завершиться неудачей. Ориентируйтесь на реальное использование.", - "Stripe/Creem 需在第三方平台创建商品并填入 ID": "Товары Stripe/Creem нужно создать на сторонней платформе и указать их ID", - "暂无订阅套餐": "Нет тарифных планов", - "订阅管理": "Управление подписками", - "订阅套餐管理": "Управление тарифами подписки", - "新建套餐": "Создать план", - "套餐": "План", - "支付渠道": "Платежные каналы", - "购买上限": "Лимит покупок", - "有效期": "Срок действия", - "重置": "Сброс", - "禁用后用户端不再展示,但历史订单不受影响。是否继续?": "После отключения план не будет отображаться пользователям, но история заказов не затрагивается. Продолжить?", - "启用后套餐将在用户端展示。是否继续?": "После включения план будет отображаться пользователям. Продолжить?", - "更新套餐信息": "Обновить информацию о плане", - "创建新的订阅套餐": "Создать новый план подписки", - "套餐的基本信息和定价": "Основная информация и цена плана", - "套餐标题": "Название плана", - "请输入套餐标题": "Введите название плана", - "套餐副标题": "Подзаголовок плана", - "例如:适合轻度使用": "Например: для легкого использования", - "请输入金额": "Введите сумму", - "请输入总额度": "Введите общий лимит", - "0 表示不限": "0 означает без лимита", - "原生额度": "Исходный лимит", - "升级分组": "Группа повышения", - "不升级": "Не повышать", - "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。": "Покупка или ручное добавление подписки повысит группу до этой. При истечении/аннулировании/удалении плана произойдет возврат к предыдущей группе. Возврат обычно занимает несколько минут.", - "币种": "Валюта", - "由全站货币展示设置统一控制": "Управляется глобальными настройками отображения валюты", - "排序": "Порядок", - "启用状态": "Статус включения", - "有效期设置": "Настройки срока действия", - "配置套餐的有效时长": "Настроить срок действия плана", - "有效期单位": "Единица срока", - "自定义秒数": "Пользовательские секунды", - "请输入秒数": "Введите количество секунд", - "有效期数值": "Значение срока", - "额度重置": "Сброс лимита", - "支持周期性重置套餐权益额度": "Поддерживает периодический сброс лимита плана", - "重置周期": "Период сброса", - "第三方支付配置": "Настройки сторонних платежей", - "Stripe/Creem 商品ID(可选)": "ID продукта Stripe/Creem (необязательно)", - "生效": "Активно", - "已作废": "Аннулировано", - "用户订阅管理": "Управление подписками пользователей", - "选择订阅套餐": "Выберите план подписки", - "新增订阅": "Добавить подписку", - "暂无订阅记录": "Нет записей подписок", - "来源": "Источник", - "开始": "Начало", - "结束": "Окончание", - "作废": "Аннулировать", - "确认作废": "Подтвердить аннулирование", - "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "После аннулирования подписка сразу станет недействительной. История не изменится. Продолжить?", - "删除会彻底移除该订阅记录(含权益明细)。是否继续?": "Удаление полностью удалит запись подписки (включая детали прав). Продолжить?", - "绑定订阅套餐": "Привязать план подписки", - "绑定后会立即生成用户订阅(无需支付),有效期按套餐配置计算。": "После привязки подписка будет создана сразу (без оплаты); срок действия рассчитывается по настройкам плана.", - "订阅套餐": "Планы подписки", - "额度充值": "Пополнение квоты", - "优先订阅": "Сначала подписка", - "优先钱包": "Сначала кошелек", - "仅用订阅": "Только подписка", - "仅用钱包": "Только кошелек", - "我的订阅": "Мои подписки", - "个生效中": "активных", - "无生效": "Нет активных", - "已保存偏好为": "Сохранённая настройка: ", - ",当前无生效订阅,将自动使用钱包": ", нет активной подписки, автоматически будет использоваться кошелек.", - "个已过期": "истекших", - "订阅": "Подписка", - "至": "до", - "过期于": "Истекает", - "作废于": "Аннулировано", - "购买套餐后即可享受模型权益": "После покупки плана доступны преимущества моделей", - "限购": "Лимит", - "推荐": "Рекомендуется", - "已达到购买上限": "Достигнут лимит покупок", - "已达上限": "Лимит достигнут", - "立即订阅": "Оформить сейчас", - "暂无可购买套餐": "Нет доступных для покупки планов", - "该套餐未配置 Stripe": "Для этого плана не настроен Stripe", - "已打开支付页面": "Страница оплаты открыта", - "支付失败": "Оплата не удалась", - "该套餐未配置 Creem": "Для этого плана не настроен Creem", - "已发起支付": "Оплата инициирована", - "购买订阅套餐": "Купить план подписки", - "套餐名称": "Название плана", - "应付金额": "К оплате", - "支付": "Оплатить", - "管理员未开启在线支付功能,请联系管理员配置。": "Онлайн-оплата не включена администратором. Пожалуйста, свяжитесь с администратором.", - "缓存读": "Чтение кэша", - "缓存写": "Запись в кэш", - "写": "Запись", - "根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。": "Согласно соглашению Anthropic, входные токены /v1/messages учитывают только некэшированный ввод и не включают токены чтения/записи кэша.", - "设计版本": "b80c3466cb6feafeb3990c7820e10e50", - "未匹配到模型,按回车键可将「{{name}}」作为自定义模型名添加": "Совпадающих моделей не найдено. Нажмите Enter, чтобы добавить «{{name}}» как пользовательское имя модели." + "默认补全倍率": "Default completion ratio" } } diff --git a/web/src/i18n/locales/vi.json b/web/src/i18n/locales/vi.json index f78620cff9..1cf53176ac 100644 --- a/web/src/i18n/locales/vi.json +++ b/web/src/i18n/locales/vi.json @@ -8,6 +8,8 @@ " 个模型设置相同的值": " các mô hình có cùng giá trị", " 吗?": " không?", " 秒": " giây", + " 秒。": " seconds.", + ",当前无生效订阅,将自动使用钱包": ", hiện không có gói đăng ký hiệu lực, sẽ tự động dùng ví.", ",时间:": ", thời gian:", ",点击更新": ", nhấn để cập nhật", "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(Hiện tại chỉ hỗ trợ giao diện Epay, địa chỉ máy chủ phía trên được sử dụng làm địa chỉ gọi lại theo mặc định!)", @@ -21,25 +23,33 @@ "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", + "{{name}} ID": "{{name}} ID", "{{ratioType}} {{ratio}}": "{{ratioType}} {{ratio}}", + "• 如果无法获取验证码,请使用备用码": "• If you cannot get the verification code, use a backup code", + "• 每个备用码只能使用一次": "• Each backup code can only be used once", "• 视频服务商的跨域限制": "• Cross-origin limitations from the video provider", "• 防盗链保护机制": "• Hotlink protection mechanisms", "• 需要特定的请求头或认证": "• Specific headers or authentication are required", + "• 验证码每30秒更新一次": "• Verification code updates every 30 seconds", "© {{currentYear}}": "© {{currentYear}}", "| 基于": " | Dựa trên ", "$/1M tokens": "$/1M tokens", "0 - 最低": "0 - Thấp nhất", + "0 表示不限": "0 nghĩa là không giới hạn", "0.002-1之间的小数": "Số thập phân giữa 0.002-1", "0.1以上的小数": "Số thập phân trên 0.1", + "1) 点击「打开授权页面」完成登录;2) 浏览器会跳转到 localhost(页面打不开也没关系);3) 复制地址栏完整 URL 粘贴到下方;4) 点击「生成并填入」。": "1) Click \"Open Authorization Page\" to complete login; 2) Browser will redirect to localhost (it's OK if the page doesn't load); 3) Copy the full URL from the address bar and paste it below; 4) Click \"Generate and Fill In\".", "10 - 最高": "10 - Cao nhất", "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "1h cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", "1h缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (1h缓存创建倍率: {{cacheCreationRatio1h}})": "1h cache creation price: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (1h cache creation ratio: {{cacheCreationRatio1h}})", "2 - 低": "2 - Thấp", "2025年5月10日后添加的渠道,不需要再在部署的时候移除模型名称中的\".\"": "Các kênh được thêm sau ngày 10 tháng 5 năm 2025 không cần xóa dấu chấm trong tên mô hình khi triển khai", + "360 智脑": "360 AI Brain", "360智脑": "360 AI Brain", "5 - 正常(默认)": "5 - Bình thường (mặc định)", "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "5m cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", "5m缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (5m缓存创建倍率: {{cacheCreationRatio5m}})": "5m cache creation price: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (5m cache creation ratio: {{cacheCreationRatio5m}})", + "5小时窗口": "5-hour window", "8 - 高": "8 - Cao", "AGPL v3.0协议": "Giấy phép AGPL v3.0", "AI 对话": "Trò chuyện AI", @@ -57,6 +67,11 @@ "API令牌管理": "Quản lý mã thông báo API", "API使用记录": "Hồ sơ sử dụng API", "API信息": "Thông tin API", + "API信息已删除,请及时点击”保存设置”进行保存": "API info deleted, please click \"Save Settings\" to save", + "API信息已更新": "API info updated", + "API信息已更新,请及时点击”保存设置”进行保存": "API info updated, please click \"Save Settings\" to save", + "API信息已添加,请及时点击”保存设置”进行保存": "API info added, please click \"Save Settings\" to save", + "API信息更新失败": "Failed to update API info", "API信息管理,可以配置多个API地址用于状态展示和负载均衡(最多50个)": "Quản lý thông tin API, bạn có thể cấu hình nhiều địa chỉ API để hiển thị trạng thái và cân bằng tải (tối đa 50)", "API地址": "Base URL", "API渠道配置": "Cấu hình kênh API", @@ -67,13 +82,27 @@ "Bark推送URL": "URL đẩy Bark", "Bark推送URL必须以http://或https://开头": "URL đẩy Bark phải bắt đầu bằng http:// hoặc https://", "Bark通知": "Thông báo Bark", + "Basic Auth 头": "Basic Auth Header", + "Cached tokens": "Cached tokens", + "Cached tokens 占比口径由后端返回:Claude 语义按 cached/(prompt+cached),其余按 cached/prompt。": "Cached token ratio calculated by backend: Claude uses cached/(prompt+cached), others use cached/prompt.", "Changing batch type to:": "Đang thay đổi loại hàng loạt thành:", + "ChatCompletions→Responses 兼容配置": "ChatCompletions→Responses Compatibility Config", + "ChatCompletions→Responses 兼容配置(Beta)": "Tương thích ChatCompletions→Responses (Beta)", + "Claude 强制 beta=true": "Force Claude beta=true", "Claude思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Thích ứng tư duy Claude BudgetTokens = MaxTokens * Tỷ lệ phần trăm BudgetTokens", "Claude设置": "Cài đặt Claude", "Claude请求头覆盖": "Ghi đè tiêu đề yêu cầu Claude", "Client ID": "Client ID", "Client Secret": "Client Secret", + "Codex 授权": "Codex Authorization", + "Codex 渠道不支持批量创建": "Codex channels do not support batch creation", + "Codex 用量": "Codex Usage", "common.changeLanguage": "Thay đổi ngôn ngữ", + "Completion tokens": "Completion tokens", + "Configuration": "Configuration", + "context_int/context_string 从请求上下文读取;gjson 从入口请求的 JSON body 按 gjson path 读取。": "context_int/context_string reads from request context; gjson reads from the entry request JSON body via gjson path.", + "CPU 使用率超过此值时拒绝请求": "Từ chối yêu cầu khi sử dụng CPU vượt quá giá trị này", + "CPU 阈值 (%)": "Ngưỡng CPU (%)", "Creem API 密钥,敏感信息不显示": "Khóa API Creem, thông tin nhạy cảm không được hiển thị", "Creem Setting Tips": "Creem chỉ hỗ trợ các sản phẩm có số tiền cố định được thiết lập sẵn. Các sản phẩm này và giá của chúng cần được tạo và cấu hình trước trên trang web Creem, vì vậy việc nạp tiền số tiền động tùy chỉnh không được hỗ trợ. Cấu hình tên sản phẩm và giá trên Creem, lấy ID sản phẩm, sau đó điền vào sản phẩm bên dưới. Đặt số tiền nạp và giá hiển thị cho sản phẩm này trong API mới.", "Creem 介绍": "Creem là đối tác thanh toán mà bạn luôn xứng đáng có được, chúng tôi phấn đấu cho sự đơn giản và thẳng thắn trên các API của mình.", @@ -86,8 +115,14 @@ "Discord Client ID": "Discord Client ID", "Discord Client Secret": "Discord Client Secret", "Discord ID": "Discord ID", + "Discovery claims": "Discovery claims", + "Discovery scopes": "Discovery scopes", + "Discovery 建议 scopes:": "Suggested Discovery scopes:", "EUR (欧元)": "EUR (Euro)", "false": "sai", + "GC 已执行": "GC executed", + "GC 执行失败": "GC execution failed", + "GC 次数": "GC Count", "Gemini安全设置": "Cài đặt an toàn Gemini", "Gemini思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Thích ứng tư duy Gemini BudgetTokens = MaxTokens * Tỷ lệ phần trăm BudgetTokens", "Gemini思考适配设置": "Cài đặt thích ứng tư duy Gemini", @@ -97,34 +132,53 @@ "GitHub Client ID": "GitHub Client ID", "GitHub Client Secret": "GitHub Client Secret", "GitHub ID": "GitHub ID", + "Goroutine 数": "Goroutine Count", "Gotify应用令牌": "Mã thông báo ứng dụng Gotify", "Gotify服务器地址": "Địa chỉ máy chủ Gotify", "Gotify服务器地址必须以http://或https://开头": "Địa chỉ máy chủ Gotify phải bắt đầu bằng http:// hoặc https://", "Gotify通知": "Thông báo Gotify", - "Grok设置": "Cài đặt Grok", "GPU/容器": "GPU/Container", "GPU数量": "Number of GPUs", + "Grok设置": "Cài đặt Grok", "Homepage URL 填": "Điền URL trang chủ", "ID": "ID", + "id(用户 ID)": "id (User ID)", + "include_obfuscation 用于控制 Responses 流混淆字段。默认关闭以避免客户端关闭该安全保护": "include_obfuscation controls the Responses stream obfuscation field. Disabled by default to prevent clients from disabling this security protection", + "inference_geo 字段用于控制 Claude 数据驻留推理区域。默认关闭以避免未经授权透传地域信息": "inference_geo controls Claude data residency inference region. Disabled by default to prevent unauthorized geo information passthrough", "IP": "IP", "IP白名单": "IP Whitelist", "IP白名单(支持CIDR表达式)": "Danh sách trắng IP (hỗ trợ biểu thức CIDR)", "IP限制": "Hạn chế IP", "IP黑名单": "Danh sách đen IP", "JSON": "JSON", + "JSON 模式": "JSON Mode", "JSON 模式支持手动输入或上传服务账号 JSON": "Chế độ JSON hỗ trợ nhập thủ công hoặc tải lên JSON tài khoản dịch vụ", "JSON格式密钥,请确保格式正确": "Khóa định dạng JSON, vui lòng đảm bảo định dạng chính xác", "JSON格式错误": "Lỗi định dạng JSON", "JSON编辑": "Trình chỉnh sửa JSON", "JSON解析错误:": "Lỗi phân tích cú pháp JSON:", + "Key": "Key", + "Key 或 Path": "Key or Path", + "Key 指纹": "Key Fingerprint", + "Key 摘要": "Key Summary", + "Key 来源": "Key Source", + "Key 来源类型": "Key Source Type", "Linux DO Client ID": "Linux DO Client ID", "Linux DO Client Secret": "Linux DO Client Secret", "LinuxDO": "LinuxDO", "LinuxDO ID": "LinuxDO ID", "Logo 图片地址": "Địa chỉ hình ảnh Logo", + "Logo 已更新": "Logo updated", + "Logo 更新失败": "Failed to update logo", "Midjourney 任务记录": "Hồ sơ tác vụ Midjourney", "MIT许可证": "Giấy phép MIT", "New API项目仓库地址:": "Địa chỉ kho dự án New API: ", + "NewAPI 默认不会将入口请求的 User-Agent 透传到上游渠道;该条件仅用于识别访问本站点的客户端。": "NewAPI does not passthrough the entry request User-Agent to upstream channels by default; this condition is only used to identify clients accessing this site.", + "OAuth Client ID": "OAuth Client ID", + "OAuth Client Secret": "OAuth Client Secret", + "OAuth 登录失败:": "OAuth login failed: ", + "OAuth 端点": "OAuth Endpoints", + "OAuth 配置错误:授权端点必须是完整的 URL(以 http:// 或 https:// 开头)": "OAuth configuration error: Authorization endpoint must be a full URL (starting with http:// or https://)", "OIDC": "OIDC", "OIDC ID": "OIDC ID", "Ollama 模型管理": "Ollama Model Management", @@ -136,13 +190,21 @@ "Passkey 注册失败,请重试": "Đăng ký Passkey thất bại. Vui lòng thử lại.", "Passkey 注册成功": "Đăng ký Passkey thành công", "Passkey 登录": "Đăng nhập Passkey", + "Passkey 登录失败,请重试": "Passkey login failed, please try again", + "Passkey 验证失败,请重试": "Passkey verification failed, please try again", "Ping间隔(秒)": "Khoảng thời gian Ping (giây)", + "POST 参数": "POST Parameters", "price_xxx 的商品价格 ID,新建产品后可获得": "ID giá sản phẩm cho price_xxx, có sẵn sau khi tạo sản phẩm mới", + "Prompt cache hit tokens": "Prompt cache hit tokens", + "Prompt tokens": "Prompt tokens", "Reasoning Effort": "Nỗ lực suy luận", "Recharge Quota": "Hạn ngạch nạp tiền", + "Request ID": "Request ID", "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "Trường safety_identifier giúp OpenAI xác định người dùng ứng dụng có thể vi phạm chính sách sử dụng. Tắt theo mặc định để bảo vệ quyền riêng tư của người dùng", + "Scopes(可选)": "Scopes (optional)", "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "Trường service_tier được sử dụng để chỉ định cấp độ dịch vụ. Cho phép truyền qua có thể dẫn đến việc tính phí thực tế cao hơn dự kiến. Tắt theo mặc định để tránh phí bổ sung", "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "Khóa Stripe cho sk_xxx hoặc rk_xxx, thông tin nhạy cảm không được hiển thị", + "Slug只能包含字母、数字、下划线和连字符": "Slug can only contain letters, numbers, underscores, and hyphens", "SMTP 发送者邮箱": "Email người gửi SMTP", "SMTP 服务器地址": "Địa chỉ máy chủ SMTP", "SMTP 端口": "Cổng SMTP", @@ -154,22 +216,33 @@ "SSRF防护设置": "Cài đặt bảo vệ SSRF", "SSRF防护详细说明": "Bảo vệ SSRF ngăn chặn người dùng độc hại sử dụng máy chủ của bạn để truy cập tài nguyên mạng nội bộ. Cấu hình danh sách trắng cho các tên miền/IP đáng tin cậy và hạn chế các cổng được phép. Áp dụng cho tải xuống tệp, webhook và thông báo.", "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "Trường store ủy quyền cho OpenAI lưu trữ dữ liệu yêu cầu để đánh giá và tối ưu hóa sản phẩm. Tắt theo mặc định. Bật có thể khiến Codex hoạt động không chính xác", - "免责声明:仅限个人使用,请勿分发或共享任何凭证。该渠道存在前置条件与使用门槛,请在充分了解流程与风险后使用,并遵守 OpenAI 的相关条款与政策。相关凭证与配置仅限接入 Codex CLI 使用,不适用于其他客户端、平台或渠道。": "Tuyên bố miễn trừ: Chỉ dùng cho mục đích cá nhân. Không phân phối hoặc chia sẻ bất kỳ thông tin xác thực nào. Kênh này có điều kiện tiên quyết và yêu cầu thiết lập trước; chỉ sử dụng khi bạn hiểu rõ quy trình và rủi ro, và tuân thủ điều khoản và chính sách của OpenAI. Thông tin xác thực và cấu hình chỉ dành cho tích hợp Codex CLI, không áp dụng cho các client, nền tảng hoặc kênh khác.", "Stripe 设置": "Cài đặt Stripe", + "Stripe/Creem 商品ID(可选)": "ID sản phẩm Stripe/Creem (tùy chọn)", + "Stripe/Creem 需在第三方平台创建商品并填入 ID": "Sản phẩm Stripe/Creem phải được tạo trên nền tảng bên thứ ba và điền ID", "Telegram": "Telegram", "Telegram Bot Token": "Telegram Bot Token", "Telegram Bot 名称": "Tên Telegram Bot", "Telegram ID": "Telegram ID", "Token Endpoint": "Token Endpoint", + "token 会按倍率换算成“额度/次数”,请求结束后再做差额结算(补扣/返还)。": "Tokens are converted to quota/count by multiplier. After the request, the difference is settled (charged/refunded).", + "Total tokens": "Total tokens", "true": "đúng", + "TTL(秒,0 表示默认)": "TTL (seconds, 0 for default)", + "TTL(秒)": "TTL (seconds)", "Turnstile Secret Key": "Turnstile Secret Key", "Turnstile Site Key": "Turnstile Site Key", "Unix时间戳": "Dấu thời gian Unix", "Uptime Kuma地址": "Địa chỉ Uptime Kuma", "Uptime Kuma监控分类管理,可以配置多个监控分类用于服务状态展示(最多20个)": "Quản lý danh mục giám sát Uptime Kuma, bạn có thể cấu hình nhiều danh mục giám sát để hiển thị trạng thái dịch vụ (tối đa 20)", + "Uptime Kuma配置已更新": "Uptime Kuma config updated", + "Uptime Kuma配置更新失败": "Failed to update Uptime Kuma config", + "URL 标识,只能包含小写字母、数字和连字符": "URL identifier, can only contain lowercase letters, numbers, and hyphens", "URL链接": "Liên kết URL", "USD (美元)": "USD (Đô la Mỹ)", "User Info Endpoint": "User Info Endpoint", + "User-Agent include": "User-Agent include", + "User-Agent include(每行一个,可不写)": "User-Agent include (one per line, optional)", + "Value 正则": "Value Regex", "Vertex AI 不支持 functionResponse.id 字段,开启后将自动移除该字段": "Vertex AI không hỗ trợ trường functionResponse.id. Khi bật, trường này sẽ tự động bị xóa", "Webhook 密钥": "Khóa Webhook", "Webhook 签名密钥": "Khóa chữ ký Webhook", @@ -196,19 +269,24 @@ "上一步": "Trước", "上次保存: ": "Lần lưu cuối: ", "上游倍率同步": "Đồng bộ hóa tỷ lệ thượng nguồn", + "上游状态码:": "Upstream status code:", "上游返回": "Upstream response", "下一个表单块": "Khối biểu mẫu tiếp theo", "下一步": "Tiếp theo", "下午好": "Chào buổi chiều", "下载日志": "Download Logs", "不再提醒": "Không nhắc lại", + "不升级": "Không nâng cấp", "不同用户分组的价格信息": "Thông tin giá cho các nhóm người dùng khác nhau", "不填则为模型列表第一个": "Mô hình đầu tiên trong danh sách nếu để trống", "不建议使用": "Không khuyến khích sử dụng", "不支持": "Không hỗ trợ", "不是合法的 JSON 字符串": "Không phải là chuỗi JSON hợp lệ", "不更改": "Không thay đổi", + "不重置": "Không đặt lại", + "不限": "Không giới hạn", "不限制": "Không giới hạn", + "不需要在末尾加/v1,New API会自动处理,添加后可能导致请求失败,是否继续?": "No need to add /v1 at the end, New API handles it automatically. Adding it may cause request failures. Continue?", "与本地相同": "Giống như cục bộ", "专属倍率": "Tỷ lệ nhóm độc quyền", "两次输入的密码不一致": "Hai mật khẩu đã nhập không khớp", @@ -225,10 +303,14 @@ "个人信息设置": "Cài đặt thông tin cá nhân", "个人设置": "Cài đặt cá nhân", "个实例": " instances", + "个已过期": "gói đăng ký đã hết hạn", "个性化设置": "Cài đặt cá nhân hóa", "个性化设置左侧边栏的显示内容": "Cá nhân hóa nội dung hiển thị của thanh bên trái", + "个月": "tháng", + "个月前": "months ago", "个未配置模型": "mô hình chưa được cấu hình", "个模型": "mô hình", + "个生效中": "gói đăng ký đang hiệu lực", "个部署吗?此操作不可逆。": " deployments? This operation cannot be undone.", "中午好": "Chào buổi trưa", "为一个 JSON 对象,例如:{\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}": "Là một đối tượng JSON, ví dụ: {\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}", @@ -245,6 +327,7 @@ "为一个 JSON 文本,键为组名称,值为倍率": "Là một văn bản JSON với tên nhóm làm khóa và tỷ lệ làm giá trị", "为了保护账户安全,请验证您的两步验证码。": "Để bảo vệ an toàn tài khoản, vui lòng xác minh mã xác thực hai yếu tố của bạn.", "为了保护账户安全,请验证您的身份。": "Để bảo vệ an toàn tài khoản, vui lòng xác minh danh tính của bạn.", + "为保证匹配准确,请确保客户端直连本站点(避免反向代理/网关改写 User-Agent)。": "To ensure accurate matching, make sure the client connects directly to this site (avoid reverse proxy/gateway rewriting User-Agent).", "为空则默认使用服务器地址,多个 Origin 用逗号分隔,例如 https://newapi.pro,https://newapi.com ,注意不能携带[],需使用https": "Nếu để trống, mặc định sử dụng địa chỉ máy chủ. Nhiều Origin được phân tách bằng dấu phẩy, ví dụ: https://newapi.pro,https://newapi.com. Lưu ý: không được chứa [], phải sử dụng https", "主页链接填": "Nhập liên kết trang chủ", "之前的所有日志": "Tất cả nhật ký trước đó", @@ -263,13 +346,21 @@ "仅对自定义模型有效": "Chỉ hiệu quả đối với các mô hình tùy chỉnh", "仅当自动禁用开启时有效,关闭后不会自动禁用该渠道": "Chỉ hiệu quả khi bật tự động vô hiệu hóa, sau khi đóng, kênh sẽ không bị tự động vô hiệu hóa", "仅支持": "Chỉ hỗ trợ", + "仅支持 JSON 对象,必须包含 access_token 与 account_id": "Only JSON objects are supported, must contain access_token and account_id", "仅支持 JSON 文件": "Chỉ hỗ trợ tệp JSON", "仅支持 JSON 文件,支持多文件": "Chỉ hỗ trợ tệp JSON, hỗ trợ nhiều tệp", "仅支持 OpenAI 接口格式": "Chỉ hỗ trợ định dạng giao diện OpenAI", + "仅显示已绑定": "Show bound only", "仅显示矛盾倍率": "Chỉ hiển thị tỷ lệ mâu thuẫn", "仅用于开发环境,生产环境应使用 HTTPS": "Chỉ dành cho phát triển, sử dụng HTTPS trong sản xuất", + "仅用于换算,实际保存的是额度": "Chỉ dùng để quy đổi, giá trị lưu thực tế là hạn ngạch", + "仅用订阅": "Chỉ dùng đăng ký", + "仅用钱包": "Chỉ dùng ví", "仅重置配置": "Chỉ đặt lại cấu hình", + "今天": "Today", "今日关闭": "Đóng hôm nay", + "今日已签到": "Đã đăng nhập hôm nay", + "今日已签到,累计签到": "Đã đăng nhập hôm nay, tổng số lần đăng nhập", "从官方模型库同步": "Đồng bộ từ thư viện mô hình chính thức", "从认证器应用中获取验证码,或使用备用码": "Lấy mã xác minh từ ứng dụng xác thực, hoặc sử dụng mã dự phòng", "从配置文件同步": "Đồng bộ từ tệp cấu hình", @@ -301,17 +392,28 @@ "价格重新计算中...": "Recalculating price...", "价格预估": "Price Estimate", "任务 ID": "ID tác vụ", + "任务ID": "ID tác vụ", "任务日志": "Nhật ký tác vụ", "任务状态": "Trạng thái", "任务记录": "Hồ sơ tác vụ", "企业账户为特殊返回格式,需要特殊处理,如果非企业账户,请勿勾选": "Tài khoản doanh nghiệp có định dạng trả về đặc biệt và yêu cầu xử lý đặc biệt. Nếu không phải tài khoản doanh nghiệp, vui lòng không chọn tùy chọn này", "优先级": "Ưu tiên", + "优先级必须是整数!": "Priority must be an integer!", + "优先订阅": "Ưu tiên đăng ký", + "优先钱包": "Ưu tiên ví", "优惠": "Giảm giá", "低于此额度时将发送邮件提醒用户": "Email nhắc nhở sẽ được gửi khi hạn ngạch giảm xuống dưới mức này", "余额": "Số dư", "余额充值管理": "Quản lý nạp tiền số dư", + "作废": "Vô hiệu", + "作废于": "Vô hiệu vào", + "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "Sau khi vô hiệu, đăng ký sẽ mất hiệu lực ngay. Lịch sử không bị ảnh hưởng. Tiếp tục?", + "作用域": "Scope", + "作用域:包含分组": "Scope: Include Group", + "作用域:包含规则名称": "Scope: Include Rule Name", "你似乎并没有修改什么": "Bạn dường như không sửa đổi gì cả", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "You can manually add them under “Custom model names”, click Fill and submit, or use the actions below to handle them automatically.", + "使用 {{name}} 继续": "Continue with {{name}}", "使用 Discord 继续": "Continue with Discord", "使用 GitHub 继续": "Tiếp tục với GitHub", "使用 JSON 对象格式,格式为:{\"组名\": [最多请求次数, 最多请求完成次数]}": "Sử dụng định dạng đối tượng JSON, định dạng: {\"group_name\": [max_requests, max_completions]}", @@ -324,13 +426,20 @@ "使用 用户名 注册": "Đăng ký bằng Tên người dùng", "使用 邮箱或用户名 登录": "Đăng nhập bằng Email hoặc Tên người dùng", "使用ID排序": "Sắp xếp theo ID", + "使用备用码": "Use Backup Code", "使用日志": "Nhật ký sử dụng", "使用模式": "Chế độ sử dụng", "使用统计": "Thống kê sử dụng", "使用认证器应用(如 Google Authenticator、Microsoft Authenticator)扫描下方二维码:": "Sử dụng ứng dụng xác thực (như Google Authenticator, Microsoft Authenticator) để quét mã QR bên dưới:", "使用认证器应用扫描二维码": "Quét mã QR bằng ứng dụng xác thực", + "使用认证器验证码": "Use Authenticator Code", + "例如 /var/cache/new-api": "e.g. /var/cache/new-api", "例如 €, £, Rp, ₩, ₹...": "Ví dụ, €, £, Rp, ₩, ₹...", + "例如 100000…": "e.g. 100000...", + "例如 3600…": "e.g. 3600...", + "例如 600…": "e.g. 600...", "例如 https://docs.newapi.pro": "Ví dụ, https://docs.newapi.pro", + "例如 prefer-by-conversation-id…": "e.g. prefer-by-conversation-id...", "例如:": "Ví dụ:", "例如: /bin/bash -c \"python app.py\"": "e.g.: /bin/bash -c \"python app.py\"", "例如: nginx:latest": "e.g.: nginx:latest", @@ -343,13 +452,28 @@ "例如:2,就是最低充值2$": "ví dụ: 2, nghĩa là nạp tối thiểu $2", "例如:2000": "ví dụ: 2000", "例如:4.99": "Ví dụ: 4.99", + "例如:401, 403, 429, 500-599": "e.g. 401,403,429,500-599", "例如:7,就是7元/美金": "ví dụ: 7, nghĩa là 7 tệ mỗi USD", + "例如:email": "e.g.: email", "例如:example.com": "ví dụ: example.com", + "例如:github / si:google / https://example.com/logo.png / 🐱": "e.g.: github / si:google / https://example.com/logo.png / 🐱", + "例如:GitHub Enterprise": "e.g.: GitHub Enterprise", + "例如:github-enterprise": "e.g.: github-enterprise", + "例如:https://example.com/.well-known/openid-configuration": "e.g.: https://example.com/.well-known/openid-configuration", + "例如:https://gitea.example.com": "e.g.: https://gitea.example.com", + "例如:https://workername.yourdomain.workers.dev": "e.g.: https://workername.yourdomain.workers.dev", "例如:https://yourdomain.com": "ví dụ: https://yourdomain.com", + "例如:name、full_name": "e.g.: name, full_name", "例如:nginx:latest": "e.g.: nginx:latest", + "例如:preferred_username、login": "e.g.: preferred_username, login", "例如:preview": "ví dụ: preview", "例如:prod_6I8rBerHpPxyoiU9WK4kot": "Ví dụ: prod_6I8rBerHpPxyoiU9WK4kot", + "例如:sub、id、data.user.id": "e.g.: sub, id, data.user.id", "例如:基础套餐": "Ví dụ: Gói cơ bản", + "例如:适合轻度使用": "Ví dụ: Phù hợp dùng nhẹ", + "例如:需要等级 {{required}},你当前等级 {{current}}": "e.g.: Level {{required}} required, your current level is {{current}}", + "例如(全渠道):": "Example (all channels):", + "例如(指定渠道):": "Example (specific channels):", "例如发卡网站的购买链接": "Ví dụ, liên kết mua hàng từ trang web phát hành thẻ", "供应商": "Nhà cung cấp", "供应商介绍": "Giới thiệu nhà cung cấp", @@ -378,12 +502,14 @@ "保存失败,请重试": "Lưu thất bại, vui lòng thử lại", "保存失败:": "Lưu thất bại:", "保存屏蔽词过滤设置": "Lưu cài đặt lọc từ bị chặn", + "保存性能设置": "Lưu cài đặt hiệu suất", "保存成功": "Lưu thành công", "保存数据看板设置": "Lưu cài đặt bảng dữ liệu", "保存日志设置": "Lưu cài đặt nhật ký", "保存模型倍率设置": "Lưu cài đặt tỷ lệ mô hình", "保存模型速率限制": "Lưu cài đặt giới hạn tốc độ mô hình", "保存监控设置": "Lưu cài đặt giám sát", + "保存签到设置": "Lưu cài đặt đăng nhập", "保存绘图设置": "Lưu cài đặt vẽ", "保存聊天设置": "Lưu cài đặt trò chuyện", "保存设置": "Lưu cài đặt", @@ -402,17 +528,22 @@ "倍率是为了方便换算不同价格的模型": "Độ phóng đại là để tạo điều kiện chuyển đổi các mô hình có giá khác nhau.", "倍率模式": "Chế độ tỷ lệ", "倍率类型": "Loại tỷ lệ", + "偏好设置": "Preferences", + "停止中": "Stopping", "停止测试": "Dừng kiểm tra", "停用": "Vô hiệu hóa", "允许 AccountFilter 参数": "Cho phép tham số AccountFilter", "允许 HTTP 协议图片请求(适用于自部署代理)": "Cho phép yêu cầu hình ảnh giao thức HTTP (đối với proxy tự triển khai)", + "允许 inference_geo 透传": "Allow inference_geo passthrough", "允许 safety_identifier 透传": "Cho phép safety_identifier truyền qua", "允许 service_tier 透传": "Cho phép service_tier truyền qua", + "允许 stream_options.include_obfuscation 透传": "Allow stream_options.include_obfuscation passthrough", "允许 Turnstile 用户校验": "Cho phép xác minh người dùng Turnstile", "允许不安全的 Origin(HTTP)": "Cho phép Origin không an toàn (HTTP)", "允许回调(会泄露服务器 IP 地址)": "Cho phép gọi lại (sẽ làm lộ địa chỉ IP máy chủ)", "允许在 Stripe 支付中输入促销码": "Cho phép nhập mã khuyến mãi khi thanh toán Stripe", "允许新用户注册": "Cho phép đăng ký người dùng mới", + "允许注册的最低信任等级": "Minimum trust level for registration", "允许的 Origins": "Origins được phép", "允许的IP,一行一个,不填写则不限制": "IP được phép, mỗi dòng một IP, không điền nghĩa là không giới hạn", "允许的端口": "Cổng được phép", @@ -443,10 +574,11 @@ "充值金额折扣配置不是合法的 JSON 对象": "Cấu hình giảm giá số tiền nạp không phải là đối tượng JSON hợp lệ", "充值链接": "Liên kết nạp tiền", "充值额度": "Hạn ngạch nạp tiền", + "先填写配置,再自动填充 OAuth 端点,能显著减少手工输入": "Fill in the config first, then auto-fill OAuth endpoints to significantly reduce manual input", + "免责声明:仅限个人使用,请勿分发或共享任何凭证。该渠道存在前置条件与使用门槛,请在充分了解流程与风险后使用,并遵守 OpenAI 的相关条款与政策。相关凭证与配置仅限接入 Codex CLI 使用,不适用于其他客户端、平台或渠道。": "Tuyên bố miễn trừ: Chỉ dùng cho mục đích cá nhân. Không phân phối hoặc chia sẻ bất kỳ thông tin xác thực nào. Kênh này có điều kiện tiên quyết và yêu cầu thiết lập trước; chỉ sử dụng khi bạn hiểu rõ quy trình và rủi ro, và tuân thủ điều khoản và chính sách của OpenAI. Thông tin xác thực và cấu hình chỉ dành cho tích hợp Codex CLI, không áp dụng cho các client, nền tảng hoặc kênh khác.", "兑换人ID": "ID người đổi", "兑换成功!": "Đổi thành công!", "兑换码充值": "Nạp tiền bằng mã đổi thưởng", - "清理不活跃缓存": "Xóa cache không hoạt động", "兑换码创建成功": "Đã tạo mã đổi thưởng", "兑换码创建成功,是否下载兑换码?": "Tạo mã đổi thưởng thành công. Bạn có muốn tải xuống không?", "兑换码创建成功!": "Tạo mã đổi thưởng thành công!", @@ -473,7 +605,10 @@ "全部类型": "Tất cả các loại", "公告": "Thông báo", "公告内容": "Nội dung thông báo", + "公告已删除,请及时点击”保存设置”进行保存": "Announcement deleted, please click \"Save Settings\" to save", "公告已更新": "Đã cập nhật thông báo", + "公告已更新,请及时点击”保存设置”进行保存": "Announcement updated, please click \"Save Settings\" to save", + "公告已添加,请及时点击”保存设置”进行保存": "Announcement added, please click \"Save Settings\" to save", "公告更新失败": "Cập nhật thông báo thất bại", "公告类型": "Loại thông báo", "共": "Tổng", @@ -485,6 +620,8 @@ "共 {{total}} 项,当前显示 {{start}}-{{end}} 项": "Tổng {{total}} mục, đang hiển thị {{start}}-{{end}} mục", "关": "đóng", "关于": "Giới thiệu", + "关于内容已更新": "About content updated", + "关于内容更新失败": "Failed to update about content", "关于我们": "Về chúng tôi", "关于系统的详细信息": "Thông tin chi tiết về hệ thống", "关于项目": "Về dự án", @@ -493,15 +630,22 @@ "关闭侧边栏": "Đóng thanh bên", "关闭公告": "Đóng thông báo", "关闭后,此模型将不会被“同步官方”自动覆盖或创建": "Sau khi đóng, mô hình này sẽ không tự động bị ghi đè hoặc tạo bởi \"Đồng bộ chính thức\"", + "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?": "Sau khi đóng, thông báo này sẽ không còn hiển thị nữa (chỉ với trình duyệt này). Bạn có chắc muốn đóng không?", "关闭弹窗,已停止批量测试": "Đã đóng hộp thoại, đã dừng kiểm tra hàng loạt", + "关闭提示": "Đóng thông báo", "其他": "Khác", "其他注册选项": "Tùy chọn đăng ký khác", "其他登录选项": "Tùy chọn đăng nhập khác", "其他设置": "Cài đặt khác", "其他详情": "Other details", + "内存 阈值 (%)": "Ngưỡng bộ nhớ (%)", + "内存使用率超过此值时拒绝请求": "Từ chối yêu cầu khi sử dụng bộ nhớ vượt quá giá trị này", + "内存命中": "Memory Hits", + "内存缓存最大条目数。0 表示使用后端默认容量:100000。": "Maximum memory cache entries. 0 uses backend default capacity: 100000.", "内容": "Nội dung", "内容较大,已启用性能优化模式": "Nội dung lớn, đã bật chế độ tối ưu hóa hiệu suất", "内容较大,部分功能可能受限": "Nội dung lớn, một số tính năng có thể bị hạn chế", + "内置": "Built-in", "内置 Ollama 镜像": "Built-in Ollama Image", "再次输入部署名称": "Enter Deployment Name Again", "最低": "thấp nhất", @@ -511,10 +655,21 @@ "最后请求": "Yêu cầu cuối cùng", "最大GPU数量": "Max Number of GPUs", "最大可用": "Max Available", + "最大条目数": "Max Entries", + "最终抵扣": "Final Deduction", + "最近一次": "Last", "最近事件": "Recent Events", + "写": "Ghi", + "准入策略": "Access Policy", + "准入策略 JSON(可选)": "Access Policy JSON (optional)", + "准备中": "Preparing", "准备中...": "Preparing...", "准备完成初始化": "Sẵn sàng hoàn tất khởi tạo", + "凭证已刷新": "Credentials refreshed", "分类名称": "Tên danh mục", + "分类已删除,请及时点击”保存设置”进行保存": "Category deleted, please click \"Save Settings\" to save", + "分类已更新,请及时点击”保存设置”进行保存": "Category updated, please click \"Save Settings\" to save", + "分类已添加,请及时点击”保存设置”进行保存": "Category added, please click \"Save Settings\" to save", "分组": "Nhóm", "分组与模型定价设置": "Cài đặt giá nhóm và mô hình", "分组价格": "Giá nhóm", @@ -527,6 +682,7 @@ "分组速率配置优先级高于全局速率限制。": "Ưu tiên cấu hình tốc độ nhóm cao hơn giới hạn tốc độ toàn cầu.", "分组速率限制": "Giới hạn tốc độ nhóm", "分钟": "phút", + "分钟前": "minutes ago", "切换为Assistant角色": "Chuyển sang vai trò Assistant", "切换为System角色": "Chuyển sang vai trò System", "切换为单密钥模式": "Chuyển sang chế độ khóa đơn", @@ -537,6 +693,7 @@ "划转额度": "Số tiền chuyển", "列出的模型将不会自动添加或移除-thinking/-nothinking 后缀": "Các mô hình được liệt kê sẽ không tự động thêm hoặc xóa hậu tố -thinking/-nothinking.", "列设置": "Cài đặt cột", + "刚刚": "just now", "创建": "Create", "创建令牌默认选择auto分组,初始令牌也将设为auto(否则留空,为用户默认分组)": "Tạo mã thông báo với nhóm auto theo mặc định, mã thông báo ban đầu cũng sẽ được đặt thành auto (nếu không để trống cho nhóm mặc định của người dùng)", "创建失败": "Tạo thất bại", @@ -547,12 +704,15 @@ "创建新的兑换码": "Tạo mã đổi thưởng mới", "创建新的模型": "Tạo mô hình mới", "创建新的渠道": "Tạo kênh mới", + "创建新的订阅套餐": "Tạo gói đăng ký mới", "创建新的预填组": "Tạo nhóm điền sẵn mới", "创建时间": "Thời gian tạo", "创建用户": "Tạo người dùng", "初始化失败,请重试": "Khởi tạo thất bại, vui lòng thử lại", "初始化系统": "Khởi tạo hệ thống", "删除": "Xóa", + "删除 Key 来源": "Delete Key Source", + "删除会彻底移除该订阅记录(含权益明细)。是否继续?": "Xóa sẽ loại bỏ hoàn toàn bản ghi đăng ký (bao gồm chi tiết quyền lợi). Tiếp tục?", "删除后无法恢复,确定要删除模型 \"{{name}}\" 吗?": "Cannot be recovered after deletion, are you sure you want to delete model \"{{name}}\"?", "删除失败": "Xóa thất bại", "删除密钥失败": "Xóa khóa thất bại", @@ -563,17 +723,23 @@ "删除禁用密钥失败": "Xóa khóa bị vô hiệu hóa thất bại", "删除禁用通道": "Xóa kênh bị vô hiệu hóa", "删除自动禁用密钥": "Xóa khóa tự động bị vô hiệu hóa", + "删除规则": "Delete Rule", "删除账户": "Xóa tài khoản", "删除账户确认": "Xác nhận xóa tài khoản", "删除部署失败": "Failed to delete deployment", "刷新": "Làm mới", + "刷新凭证": "Refresh Credentials", "刷新失败": "Làm mới thất bại", "刷新容器信息": "Refresh Container Info", "刷新日志": "Refresh Logs", + "刷新统计": "Refresh Stats", + "刷新缓存统计": "Refresh Cache Stats", + "刷新缓存统计失败": "Failed to refresh cache stats", "前往 io.net API Keys": "Go to io.net API Keys", "前往设置": "Go to Settings", "前往设置页面": "Go to Settings Page", "前缀": "Tiền tố", + "前缀名称匹配": "Prefix Name Match", "副本数量": "Number of Replicas", "剩余": "Remaining", "剩余备用码:": "Mã dự phòng còn lại: ", @@ -602,27 +768,39 @@ "加载账单失败": "Tải hóa đơn thất bại", "加载隐私政策内容失败...": "Tải nội dung chính sách bảo mật thất bại...", "包含": "Chứa", + "包含名称匹配": "Contains Name Match", "包含来自未知或未标明供应商的AI模型,这些模型可能来自小型供应商或开源项目。": "Bao gồm các mô hình AI từ các nhà cung cấp không xác định hoặc không được đánh dấu, có thể đến từ các nhà cung cấp nhỏ hoặc các dự án mã nguồn mở.", "包括失败请求的次数,0代表不限制": "Bao gồm số lần yêu cầu thất bại, 0 nghĩa là không giới hạn", "匹配类型": "Loại khớp", "区域": "Khu vực", + "升级分组": "Nhóm nâng cấp", "单GPU小时费率": "Per GPU Hour Rate", + "即梦": "Jimeng", "历史消耗": "Tiêu thụ", "原价": "Giá gốc", "原因:": "Lý do: ", + "原始 JSON": "Raw JSON", "原密码": "Mật khẩu cũ", + "原生格式": "Native format", + "原生额度": "Hạn mức gốc", "去重完成:去重前 {{before}} 个密钥,去重后 {{after}} 个密钥": "Hoàn tất loại bỏ trùng lặp: {{before}} khóa trước khi loại bỏ, {{after}} khóa sau khi loại bỏ", "参与官方同步": "Tham gia đồng bộ chính thức", "参数": "tham số", "参数值": "Giá trị tham số", "参数覆盖": "Ghi đè tham số", + "参数覆盖必须是合法的 JSON 格式!": "Parameter override must be valid JSON format!", + "参数配置": "Parameter Config", "参照生视频": "Tạo video tham chiếu", "友情链接": "Liên kết thân thiện", "发布日期": "Ngày xuất bản", "发布时间": "Thời gian xuất bản", + "发现文档地址(Discovery URL,可选)": "Discovery URL (optional)", + "发行者 URL(Issuer URL)": "Issuer URL", + "发送验证码失败,请重试": "Failed to send verification code, please try again", "取消": "Hủy", "取消全选": "Bỏ chọn tất cả", "取消选择": "Deselect", + "受限": "Restricted", "变换": "Biến đổi", "变焦": "thu phóng", "变量值": "Variable Value", @@ -632,17 +810,29 @@ "只有当用户设置开启IP记录时,才会进行请求和错误类型日志的IP记录": "Chỉ khi người dùng đặt ghi IP, việc ghi IP của nhật ký yêu cầu và loại lỗi mới được thực hiện", "可信": "Đáng tin cậy", "可在设置页面设置关于内容,支持 HTML & Markdown": "Nội dung Giới thiệu có thể được đặt trên trang cài đặt, hỗ trợ HTML & Markdown", + "可手动填写,多个 scope 用空格分隔": "Can be filled manually, separate multiple scopes with spaces", + "可灵": "Kling", + "可用": "Available", "可用令牌分组": "Nhóm mã thông báo khả dụng", "可用分组": "Nhóm khả dụng", + "可用变量:{{provider}} {{field}} {{op}} {{required}} {{current}} 以及 {{current.path}}": "Available variables: {{provider}} {{field}} {{op}} {{required}} {{current}} and {{current.path}}", "可用数量": "Available Quantity", "可用模型": "Mô hình khả dụng", + "可用率": "Availability", + "可用空间: {{free}} / 总空间: {{total}}": "Free: {{free}} / Total: {{total}}", "可用端点类型": "Loại điểm cuối được hỗ trợ", "可用邀请额度": "Hạn ngạch mời khả dụng", + "可留空;留空时会尝试使用 Issuer URL + /.well-known/openid-configuration": "Can be left empty; when empty, will try using Issuer URL + /.well-known/openid-configuration", "可视化": "Trực quan hóa", "可视化倍率设置": "Cài đặt tỷ lệ mô hình trực quan", "可视化编辑": "Chỉnh sửa trực quan", "可选,公告的补充说明": "Tùy chọn, thông tin bổ sung cho thông báo", "可选,用于复现结果": "Tùy chọn, để tái tạo kết quả", + "可选:基于用户信息 JSON 做组合条件准入,条件不满足时返回自定义提示": "Optional: Conditional access based on user info JSON, returns custom message when conditions are not met", + "可选:用于自动生成端点或 Discovery URL": "Optional: Used to auto-generate endpoints or Discovery URL", + "可选。匹配入口请求的 User-Agent;任意一行作为子串匹配(忽略大小写)即命中。": "Optional. Match entry request User-Agent; any line matching as substring (case-insensitive) triggers the rule.", + "可选。对提取到的亲和 Key 做正则校验;不填表示不校验。": "Optional. Regex validation on extracted affinity key; leave empty to skip validation.", + "可选。对请求路径进行匹配;不填表示匹配所有路径。": "Optional. Match request path; leave empty to match all paths.", "可选值": "Giá trị tùy chọn", "同时重置消息": "Đặt lại tin nhắn đồng thời", "同步": "Đồng bộ", @@ -659,19 +849,23 @@ "名称匹配类型": "Loại khớp tên", "后端请求失败": "Yêu cầu phụ trợ thất bại", "后缀": "Hậu tố", + "后缀名称匹配": "Suffix Name Match", "否": "Không", "启动": "Start", "启动参数 (Args)": "Startup Args", "启动命令": "Startup Command", "启动命令 (Entrypoint)": "Entrypoint", + "启动授权失败": "Failed to start authorization", "启动时间": "Thời gian khởi động", "启动部署失败": "Failed to start deployment", "启动配置": "Startup Configuration", "启用": "Bật", + "启用 Creem 支付": "Bật thanh toán Creem", "启用 io.net 部署": "Enable io.net Deployment", "启用 io.net 部署开关": "Enable io.net Deployment Switch", "启用 io.net 部署时必须填写 API Key": "API Key is required when enabling io.net deployment", "启用 Prompt 检查": "Bật kiểm tra Prompt", + "启用 Stripe 支付": "Bật thanh toán Stripe", "启用2FA失败": "Bật xác thực hai yếu tố thất bại", "启用Claude思考适配(-thinking后缀)": "Bật thích ứng tư duy Claude (hậu tố -thinking)", "启用FunctionCall思维签名填充": "Bật điền chữ ký tư duy FunctionCall", @@ -679,36 +873,54 @@ "启用Ping间隔": "Bật khoảng thời gian Ping", "启用SMTP SSL": "Bật SMTP SSL", "启用SSRF防护(推荐开启以保护服务器安全)": "Bật bảo vệ SSRF (Khuyên dùng để bảo mật máy chủ)", + "启用供应商": "Enable Vendor", "启用全部": "Bật tất cả", "启用后可接入 io.net GPU 资源": "After enabling, you can access io.net GPU resources", "启用后可添加图片URL进行多模态对话": "Bật để thêm URL hình ảnh cho cuộc trò chuyện đa phương thức", + "启用后套餐将在用户端展示。是否继续?": "Sau khi bật, gói sẽ hiển thị cho người dùng. Tiếp tục?", + "启用后将优先复用上一次成功的渠道(粘滞选路)。": "When enabled, the last successful channel will be preferred (sticky routing).", "启用后将使用 Creem Test Mode": "Sau khi bật, Chế độ kiểm tra Creem sẽ được sử dụng", "启用密钥失败": "Bật khóa thất bại", "启用屏蔽词过滤功能": "Bật chức năng lọc từ bị chặn", + "启用性能监控": "Bật giám sát hiệu suất", + "启用性能监控后,当系统资源使用率超过设定阈值时,将拒绝新的 Relay 请求 (/v1, /v1beta 等),以保护系统稳定性。": "Khi giám sát hiệu suất được bật và mức sử dụng tài nguyên hệ thống vượt quá ngưỡng đã đặt, các yêu cầu Relay mới (/v1, /v1beta, v.v.) sẽ bị từ chối để bảo vệ sự ổn định của hệ thống.", "启用所有密钥失败": "Bật tất cả khóa thất bại", "启用数据看板(实验性)": "Bật bảng dữ liệu (thử nghiệm)", "启用此模式后,将使用您自定义的请求体发送API请求,模型配置面板的参数设置将被忽略。": "Khi được bật, nội dung yêu cầu tùy chỉnh của bạn sẽ được sử dụng cho các yêu cầu API và cài đặt tham số trong bảng cấu hình mô hình sẽ bị bỏ qua.", + "启用状态": "Trạng thái bật", "启用用户模型请求速率限制(可能会影响高并发性能)": "Bật giới hạn tốc độ yêu cầu mô hình người dùng (có thể ảnh hưởng đến hiệu suất đồng thời cao)", + "启用磁盘缓存": "Enable Disk Cache", + "启用磁盘缓存后,大请求体将临时存储到磁盘而非内存,可显著降低内存占用,适用于处理包含大量图片/文件的请求。建议在 SSD 环境下使用。": "When enabled, large request bodies are temporarily stored on disk instead of memory, significantly reducing memory usage. Suitable for requests with large images/files. SSD recommended.", + "启用签到功能": "Bật tính năng đăng nhập", "启用绘图功能": "Bật chức năng vẽ", "启用请求体透传功能": "Bật chức năng truyền qua thân yêu cầu", "启用请求透传": "Bật truyền qua yêu cầu", + "启用违规扣费": "Bật trừ phí vi phạm", "启用额度消费日志记录": "Bật ghi nhật ký tiêu thụ hạn ngạch", "启用验证": "Bật xác thực", - "启用违规扣费": "Bật trừ phí vi phạm", "周": "tuần", + "周前": "weeks ago", + "周期": "chu kỳ", + "命中判定:usage 中存在 cached tokens(例如 cached_tokens/prompt_cache_hit_tokens)即视为命中。": "Hit criteria: cached tokens present in usage (e.g. cached_tokens/prompt_cache_hit_tokens) counts as a hit.", + "命中率": "Hit Rate", + "命名规则": "Naming Rule", "和": "và", "和Claude不同,默认情况下Gemini的思考模型会自动决定要不要思考,就算不开启适配模型也可以正常使用,如果您需要计费,推荐设置无后缀模型价格按思考价格设置。支持使用 gemini-2.5-pro-preview-06-05-thinking-128 格式来精确传递思考预算。": "Không giống Claude, mô hình tư duy Gemini tự động quyết định có suy nghĩ hay không. Chúng hoạt động bình thường ngay cả khi không bật adapter. Nếu cần tính phí, hãy đặt giá của mô hình không có hậu tố theo giá tư duy. Sử dụng định dạng như gemini-2.5-pro-preview-06-05-thinking-128 để chỉ định ngân sách tư duy chính xác.", "响应": "Phản hồi", "响应时间": "Thời gian phản hồi", + "响应缺少凭据": "Response missing credentials", + "响应缺少授权链接": "Response missing authorization link", "商品价格 ID": "ID giá sản phẩm", "回答内容": "Nội dung trả lời", "回调 URL 填": "Điền URL gọi lại", + "回调 URL 格式": "Callback URL format", "回调地址": "Địa chỉ gọi lại", "固定价格": "Giá cố định", "固定价格(每次)": "Giá cố định (mỗi lần)", "固定价格值": "Giá trị giá cố định", "图像生成": "Tạo hình ảnh", "图标": "Biểu tượng", + "图标使用 react-icons(Simple Icons)或 URL/emoji,例如:github、gitlab、si:google": "Icon uses react-icons (Simple Icons) or URL/emoji, e.g.: github, gitlab, si:google", "图标使用@lobehub/icons库,如:OpenAI、Claude.Color,支持链式参数:OpenAI.Avatar.type={'platform'}、OpenRouter.Avatar.shape={'square'},查询所有可用图标请 ": "Biểu tượng sử dụng thư viện @lobehub/icons, như: OpenAI, Claude.Color, hỗ trợ tham số chuỗi: OpenAI.Avatar.type={'platform'}, OpenRouter.Avatar.shape={'square'}, truy vấn tất cả biểu tượng khả dụng vui lòng ", "图混合": "Pha trộn", "图片功能在自定义请求体模式下不可用": "Chức năng hình ảnh không khả dụng trong chế độ yêu cầu tùy chỉnh", @@ -725,6 +937,7 @@ "在Gotify服务器的应用管理中创建新应用": "Tạo ứng dụng mới trong quản lý ứng dụng của máy chủ Gotify", "在找兑换码?": "Đang tìm mã đổi thưởng? ", "在新标签页中打开": "Open in new tab", + "在模型广场向用户展示的端点": "Endpoint hiển thị cho người dùng trong Chợ mô hình", "在此输入 Logo 图片地址": "Nhập URL hình ảnh Logo tại đây", "在此输入新的公告内容,支持 Markdown & HTML 代码": "Nhập nội dung thông báo mới tại đây, hỗ trợ mã Markdown & HTML", "在此输入新的关于内容,支持 Markdown & HTML 代码。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为关于页面": "Nhập nội dung giới thiệu mới tại đây, hỗ trợ Markdown", @@ -737,13 +950,22 @@ "域名白名单": "Danh sách trắng tên miền", "域名黑名单": "Danh sách đen tên miền", "基本信息": "Thông tin cơ bản", + "填充 Codex / Claude Code 模版": "Fill Codex / Claude Code Template", + "填充模板:等级+激活": "Fill Template: Level + Activation", + "填充模板:等级提示": "Fill Template: Level Prompt", + "填充模板:组织或角色": "Fill Template: Organization or Role", + "填充模板:组织提示": "Fill Template: Organization Prompt", + "填充模板(全渠道)": "Điền mẫu (tất cả kênh)", + "填充模板(指定渠道)": "Điền mẫu (kênh được chọn)", "填入": "Điền", "填入所有模型": "Điền tất cả mô hình", "填入模板": "Điền mẫu", - "填入透传模版": "Điền mẫu truyền qua", - "填入透传完整模版": "Điền mẫu truyền qua đầy đủ", "填入相关模型": "Điền mô hình liên quan", + "填入透传完整模版": "Điền mẫu truyền qua đầy đủ", + "填入透传模版": "Điền mẫu truyền qua", + "填写 Issuer URL 后自动生成:": "Auto-generated after filling Issuer URL:", "填写Gotify服务器的完整URL地址": "Điền địa chỉ URL đầy đủ của máy chủ Gotify", + "填写后会自动拼接预设端点": "Preset endpoints will be auto-appended after filling", "填写带https的域名,逗号分隔": "Điền tên miền có https, phân tách bằng dấu phẩy", "填写用户协议内容后,用户注册时将被要求勾选已阅读用户协议": "Sau khi điền nội dung thỏa thuận người dùng, người dùng sẽ được yêu cầu tích vào đã đọc thỏa thuận người dùng khi đăng ký", "填写隐私政策内容后,用户注册时将被要求勾选已阅读隐私政策": "Sau khi điền nội dung chính sách bảo mật, người dùng sẽ được yêu cầu tích vào đã đọc chính sách bảo mật khi đăng ký", @@ -752,12 +974,15 @@ "备份状态": "Trạng thái sao lưu", "备注": "Ghi chú", "备用恢复代码": "Mã khôi phục dự phòng", + "备用码": "Backup Code", "备用码已复制到剪贴板": "Mã dự phòng đã được sao chép vào khay nhớ tạm", + "备用码必须是8位": "Backup code must be 8 digits", "备用码重新生成成功": "Tạo lại mã dự phòng thành công", "复制": "Sao chép", "复制代码": "Sao chép mã", "复制令牌": "Sao chép mã thông báo", "复制全部": "Sao chép tất cả", + "复制功能需要 HTTPS 环境,请手动复制": "Copy function requires HTTPS, please copy manually", "复制名称": "Sao chép tên", "复制失败": "Sao chép thất bại", "复制失败,请手动复制": "Sao chép thất bại, vui lòng sao chép thủ công", @@ -769,6 +994,7 @@ "复制所有模型": "Sao chép tất cả mô hình", "复制所选令牌": "Sao chép mã thông báo đã chọn", "复制所选兑换码到剪贴板": "Sao chép mã đổi thưởng đã chọn vào khay nhớ tạm", + "复制授权链接": "Copy Authorization Link", "复制日志": "Copy Logs", "复制渠道的所有信息": "Sao chép tất cả thông tin của kênh", "复制版本号": "Copy Version", @@ -783,18 +1009,29 @@ "天": "ngày", "天前": "ngày trước", "失败": "Thất bại", + "失败原因": "Nguyên nhân thất bại", + "失败后不重试": "No retry after failure", "失败时自动禁用通道": "Tự động vô hiệu hóa kênh khi thất bại", "失败重试次数": "Số lần thử lại thất bại", "奖励说明": "Mô tả phần thưởng", + "套餐": "Gói", + "套餐副标题": "Phụ đề gói", + "套餐名称": "Tên gói", + "套餐标题": "Tiêu đề gói", + "套餐标题不能为空": "Plan title cannot be empty", + "套餐的基本信息和定价": "Thông tin cơ bản và giá của gói", "如:大带宽批量分析图片推荐": "ví dụ: Phân tích hàng loạt băng thông lớn đề xuất hình ảnh", "如:香港线路": "ví dụ: Tuyến Hồng Kông", + "如果亲和到的渠道失败,重试到其他渠道成功后,将亲和更新到成功的渠道。": "If the affinity channel fails, after retrying and succeeding with another channel, the affinity will be updated to the successful channel.", "如果你对接的是上游One API或者New API等转发项目,请使用OpenAI类型,不要使用此类型,除非你知道你在做什么。": "Nếu bạn đang kết nối với các dự án chuyển tiếp One API hoặc New API thượng nguồn, vui lòng sử dụng loại OpenAI. Đừng sử dụng loại này trừ khi bạn biết mình đang làm gì.", "如果用户请求中包含系统提示词,则使用此设置拼接到用户的系统提示词前面": "Nếu yêu cầu của người dùng chứa từ nhắc hệ thống, cài đặt này sẽ được nối vào trước từ nhắc hệ thống của người dùng", "如果镜像为私有,请填写密码或Token": "If the image is private, please fill in the password or token", "如果镜像为私有,请填写用户名": "If the image is private, please fill in the username", "始终使用浅色主题": "Luôn sử dụng chủ đề sáng", "始终使用深色主题": "Luôn sử dụng chủ đề tối", + "字段映射": "Field Mapping", "字段透传控制": "Kiểm soát truyền qua trường", + "字节火山方舟、豆包通用": "ByteDance Volcengine / Doubao", "存在惩罚,鼓励讨论新话题": "Phạt sự hiện diện, khuyến khích chủ đề mới", "存在重复的键名:": "Tồn tại tên khóa trùng lặp:", "安全提醒": "Nhắc nhở bảo mật", @@ -810,8 +1047,8 @@ "完整的 Base URL,支持变量{model}": "Base URL đầy đủ, hỗ trợ biến {model}", "官方": "Chính thức", "官方文档": "Tài liệu chính thức", - "官方说明": "Tài liệu chính thức", "官方模型同步": "Đồng bộ mô hình chính thức", + "官方说明": "Tài liệu chính thức", "定价模式": "Chế độ định giá", "定时测试所有通道": "Định kỳ kiểm tra tất cả các kênh", "定期更改密码可以提高账户安全性": "Thường xuyên thay đổi mật khẩu có thể cải thiện bảo mật tài khoản", @@ -848,8 +1085,11 @@ "密码重置": "Đặt lại mật khẩu", "密码重置完成": "Hoàn tất đặt lại mật khẩu", "密码重置确认": "Xác nhận đặt lại mật khẩu", + "密码长度不得小于 8 位!": "Password must be at least 8 characters!", "密码长度至少为8个字符": "Mật khẩu phải dài ít nhất 8 ký tự", "密钥": "Khóa", + "密钥 JSON 必须包含 access_token": "Secret JSON must contain access_token", + "密钥 JSON 必须包含 account_id": "Secret JSON must contain account_id", "密钥(编辑模式下,保存的密钥不会显示)": "Khóa (trong chế độ chỉnh sửa, khóa đã lưu sẽ không hiển thị)", "密钥去重": "Loại bỏ khóa trùng lặp", "密钥将以Bearer方式添加到请求头中,用于验证webhook请求的合法性": "Khóa sẽ được thêm vào tiêu đề yêu cầu dưới dạng Bearer để xác minh tính hợp pháp của yêu cầu webhook", @@ -857,6 +1097,8 @@ "密钥已启用": "Khóa đã được bật", "密钥已复制到剪贴板": "Khóa đã được sao chép vào khay nhớ tạm", "密钥已禁用": "Khóa đã bị vô hiệu hóa", + "密钥必须是 JSON 对象": "Secret must be a JSON object", + "密钥必须是合法的 JSON 格式!": "Secret must be valid JSON format!", "密钥文件 (.json)": "Tệp khóa (.json)", "密钥更新模式": "Chế độ cập nhật khóa", "密钥格式": "Định dạng khóa", @@ -883,9 +1125,13 @@ "将仅保留第一个密钥文件,其余文件将被移除,是否继续?": "Chỉ tệp khóa đầu tiên sẽ được giữ lại, các tệp còn lại sẽ bị xóa. Tiếp tục?", "将删除": "Đang xóa", "将删除已使用、已禁用及过期的兑换码,此操作不可撤销。": "Thao tác này sẽ xóa tất cả các mã đổi thưởng đã sử dụng, bị vô hiệu hóa và hết hạn, thao tác này không thể hoàn tác.", + "将删除所有仍在内存中的渠道亲和性缓存条目。": "All channel affinity cache entries still in memory will be deleted.", + "将大请求体临时存储到磁盘": "Store large request bodies temporarily on disk", "将清除所有保存的配置并恢复默认设置,此操作不可撤销。是否继续?": "Thao tác này sẽ xóa tất cả các cấu hình đã lưu và khôi phục cài đặt mặc định, thao tác này không thể hoàn tác. Tiếp tục?", "将清除选定时间之前的所有日志": "Thao tác này sẽ xóa tất cả nhật ký trước thời gian đã chọn", + "将追加 2 条规则到现有规则列表。": "2 rules will be appended to the existing rule list.", "小时": "Giờ", + "小时前": "hours ago", "小时费率": "Hourly Rate", "尚未使用": "Chưa sử dụng", "局部重绘-提交": "Vary Region", @@ -894,18 +1140,27 @@ "展开": "Mở rộng", "展开更多": "Mở rộng thêm", "展示价格": "Giá hiển thị", + "嵌入模型:MokaAI M3E": "Embedding Model: MokaAI M3E", "左侧边栏个人设置": "Cài đặt cá nhân ở thanh bên trái", "已为 {{count}} 个模型设置{{type}}_one": "Đã đặt {{type}} cho {{count}} mô hình", "已为 {{count}} 个模型设置{{type}}_other": "Đã đặt {{type}} cho {{count}} mô hình", "已为 ${count} 个渠道设置标签!": "Đã đặt thẻ cho ${count} kênh!", + "已从 Discovery 自动填充配置": "Config auto-filled from Discovery", + "已从 Discovery 获取配置,可继续手动修改所有字段。": "Config retrieved from Discovery, you can continue to manually modify all fields.", + "已作废": "Đã vô hiệu", + "已使用": "Used", + "已使用:": "Used:", + "已保存偏好为": "Đã lưu tùy chọn: ", "已修复 ${success} 个通道,失败 ${fails} 个通道。": "Đã sửa ${success} kênh, thất bại ${fails} kênh.", "已停止": "Stopped", "已停止批量测试": "Đã dừng kiểm tra hàng loạt", "已关闭后续提醒": "Đã tắt thông báo tiếp theo", + "已分配内存": "Allocated Memory", "已切换为Assistant角色": "Đã chuyển sang vai trò Assistant", "已切换为System角色": "Đã chuyển sang vai trò System", "已切换至最优倍率视图,每个模型使用其最低倍率分组": "Đã chuyển sang chế độ xem tỷ lệ tối ưu, mỗi mô hình sử dụng nhóm tỷ lệ thấp nhất của nó", "已初始化": "Đã khởi tạo", + "已删除": "Deleted", "已删除 {{count}} 个令牌!": "Đã xóa {{count}} mã thông báo!", "已删除 {{count}} 个令牌!_other": "Deleted {{count}} tokens!", "已删除 {{count}} 条失效兑换码_one": "Đã xóa {{count}} mã đổi thưởng hết hạn", @@ -913,13 +1168,18 @@ "已删除 ${data} 个通道!": "Đã xóa ${data} kênh!", "已删除所有禁用渠道,共计 ${data} 个": "Đã xóa tất cả các kênh bị vô hiệu hóa, tổng cộng ${data}", "已删除消息及其回复": "Đã xóa tin nhắn và các câu trả lời của nó", + "已发起支付": "Đã khởi tạo thanh toán", "已发送到 Fluent": "Đã gửi đến Fluent", "已取消 Passkey 注册": "Đã hủy đăng ký Passkey", + "已取消 Passkey 登录": "Passkey login cancelled", "已同步到渠道": "Synced to Channel", "已启用": "Đã bật", "已启用 Passkey,无需密码即可登录": "Đã bật Passkey, đăng nhập không cần mật khẩu", "已启用所有密钥": "Tất cả các khóa đã được bật", "已在自定义模式中忽略": "Bị bỏ qua trong chế độ tùy chỉnh", + "已填充提示模板": "Prompt template filled", + "已填充模版": "Template filled", + "已填充策略模板": "Policy template filled", "已备份": "Đã sao lưu", "已复制": "Đã sao chép", "已复制 ${count} 个模型": "Đã sao chép ${count} mô hình", @@ -936,6 +1196,8 @@ "已完成": "Completed", "已开启全局请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "Đã bật truyền qua yêu cầu toàn cục. Các tính năng tích hợp của NewAPI như ghi đè tham số, chuyển hướng mô hình và thích ứng kênh sẽ bị vô hiệu hóa. Đây không phải là thực hành tốt nhất. Nếu phát sinh vấn đề, vui lòng không gửi issue.", "已成功开始测试所有已启用通道,请刷新页面查看结果。": "Đã bắt đầu kiểm tra tất cả các kênh đã bật thành công. Vui lòng làm mới trang để xem kết quả.", + "已打开授权页面": "Authorization page opened", + "已打开支付页面": "Đã mở trang thanh toán", "已提交": "Đã gửi", "已支付金额": "Amount Paid", "已新增 {{count}} 个模型:{{list}}_one": "Đã thêm {{count}} mô hình: {{list}}", @@ -949,31 +1211,44 @@ "已注销": "Đã đăng xuất", "已添加": "Đã thêm", "已添加到白名单": "Đã thêm vào danh sách trắng", + "已清空": "Cleared", "已清空测试结果": "Đã xóa kết quả kiểm tra", + "已生成授权凭据": "Authorization credentials generated", "已用": "Used", "已用/剩余": "Đã dùng/Còn lại", "已用额度": "Hạn ngạch đã dùng", "已禁用": "Đã vô hiệu hóa", "已禁用所有密钥": "Đã vô hiệu hóa tất cả các khóa", + "已终止": "Terminated", "已绑定": "Đã liên kết", "已绑定渠道": "Kênh đã liên kết", "已结束": "Ended", "已耗尽": "Đã cạn kiệt", "已解锁豆包自定义 API 地址编辑": "Custom Doubao API address editing unlocked", + "已达上限": "Đã đạt giới hạn", + "已达到购买上限": "Đã đạt giới hạn mua", "已过期": "Đã hết hạn", "已运行时间": "Uptime", "已选择 {{count}} 个模型_one": "Đã chọn {{count}} mô hình", "已选择 {{count}} 个模型_other": "Đã chọn {{count}} mô hình", "已选择 {{selected}} / {{total}}": "Đã chọn {{selected}} / {{total}}", "已选择 ${count} 个渠道": "Đã chọn ${count} kênh", + "已部署": "Deployed", "已重置为默认配置": "Đã đặt lại về cấu hình mặc định", "已销毁": "Destroyed", + "币种": "Tiền tệ", + "常用上下文 Key(用于 context_*)": "Common context keys (for context_*)", "常见问答": "Câu hỏi thường gặp", + "常见问答已更新": "FAQ updated", + "常见问答更新失败": "Failed to update FAQ", "常见问答管理,为用户提供常见问题的答案(最多50个,前端显示最新20条)": "Quản lý câu hỏi thường gặp, cung cấp câu trả lời cho các câu hỏi thường gặp của người dùng (tối đa 50, hiển thị 20 mới nhất ở giao diện người dùng)", "平台": "nền tảng", "平均RPM": "RPM trung bình", "平均TPM": "TPM trung bình", "平移": "Pan", + "年": "năm", + "年前": "years ago", + "应付金额": "Số tiền phải trả", "应用同步": "Áp dụng đồng bộ hóa", "应用更改": "Áp dụng thay đổi", "应用覆盖": "Áp dụng ghi đè", @@ -991,18 +1266,25 @@ "开": "mở", "开启之后会清除用户提示词中的": "Sau khi bật, từ nhắc của người dùng sẽ bị xóa", "开启之后将上游地址替换为服务器地址": "Sau khi bật, địa chỉ thượng nguồn sẽ được thay thế bằng địa chỉ máy chủ", + "开启后,using_group 会参与 cache key(不同分组隔离)。": "When enabled, using_group is included in the cache key (isolated by group).", "开启后,仅\"消费\"和\"错误\"日志将记录您的客户端IP地址": "Sau khi bật, chỉ nhật ký \"tiêu thụ\" và \"lỗi\" sẽ ghi lại địa chỉ IP máy khách của bạn", "开启后,对免费模型(倍率为0,或者价格为0)的模型也会预消耗额度": "After enabling, free models (ratio 0 or price 0) will also pre-consume quota", "开启后,将定期发送ping数据保持连接活跃": "Sau khi bật, dữ liệu ping sẽ được gửi định kỳ để giữ kết nối hoạt động", "开启后,当前分组渠道失败时会按顺序尝试下一个分组的渠道": "Sau khi bật, khi kênh nhóm hiện tại thất bại, nó sẽ thử kênh của nhóm tiếp theo theo thứ tự", "开启后,所有请求将直接透传给上游,不会进行任何处理(重定向和渠道适配也将失效),请谨慎开启": "Khi bật, tất cả các yêu cầu sẽ được chuyển tiếp trực tiếp đến thượng nguồn mà không cần xử lý (chuyển hướng và thích ứng kênh cũng sẽ bị vô hiệu hóa). Vui lòng bật một cách thận trọng.", + "开启后,若该规则命中且请求失败,将不会切换渠道重试。": "When enabled, if this rule matches and the request fails, no channel retry will occur.", + "开启后,规则名称会参与 cache key(不同规则隔离)。": "When enabled, the rule name is included in the cache key (isolated by rule).", + "开启后,该渠道请求 Claude 时将强制追加 ?beta=true(无需客户端手动传参)": "When enabled, requests to Claude through this channel will force append ?beta=true (no need for client to pass it manually)", "开启后,违规请求将额外扣费。": "Khi bật, các yêu cầu vi phạm sẽ bị tính phí bổ sung.", "开启后不限制:必须设置模型倍率": "Sau khi bật, không giới hạn: phải đặt tỷ lệ mô hình", "开启后未登录用户无法访问模型广场": "Khi bật, người dùng chưa xác thực không thể truy cập thị trường mô hình", "开启批量操作": "Bật chọn hàng loạt", + "开始": "Bắt đầu", "开始同步": "Bắt đầu đồng bộ", "开始批量测试 ${count} 个模型,已清空上次结果...": "Bắt đầu kiểm tra hàng loạt ${count} mô hình, đã xóa kết quả trước đó...", "开始时间": "thời gian bắt đầu", + "异常": "Error", + "异步任务退款": "Hoàn tiền tác vụ bất đồng bộ", "张图片": "hình ảnh", "弱变换": "Biến thể cao", "强制将响应格式化为 OpenAI 标准格式(只适用于OpenAI渠道类型)": "Buộc định dạng phản hồi theo định dạng chuẩn OpenAI (Chỉ dành cho các loại kênh OpenAI)", @@ -1012,6 +1294,7 @@ "当上游通道返回错误中包含这些关键词时(不区分大小写),自动禁用通道": "Khi kênh thượng nguồn trả về lỗi chứa các từ khóa này (không phân biệt chữ hoa chữ thường), tự động vô hiệu hóa kênh", "当前 API 密钥已过期,请在设置中更新。": "Current API key has expired, please update it in settings.", "当前 Ollama 版本为 ${version}": "Current Ollama version is ${version}", + "当前仅 OpenAI / Claude 语义支持缓存 token 统计,其他通道将隐藏 token 相关字段。": "Currently only OpenAI / Claude semantics support cached token statistics, other channels will hide token-related fields.", "当前余额": "Số dư hiện tại", "当前值": "Giá trị hiện tại", "当前分组为 auto,会自动选择最优分组,当一个组不可用时自动降级到下一个组(熔断机制)": "Nhóm hiện tại là auto, nó sẽ tự động chọn nhóm tối ưu và tự động hạ cấp xuống nhóm tiếp theo khi một nhóm không khả dụng (cơ chế ngắt mạch)", @@ -1020,23 +1303,29 @@ "当前未开启Midjourney回调,部分项目可能无法获得绘图结果,可在运营设置中开启。": "Gọi lại Midjourney hiện tại chưa được bật, một số dự án có thể không nhận được kết quả vẽ, có thể bật trong cài đặt vận hành.", "当前查看的分组为:{{group}},倍率为:{{ratio}}": "Nhóm hiện tại: {{group}}, tỷ lệ: {{ratio}}", "当前模型列表为该标签下所有渠道模型列表最长的一个,并非所有渠道的并集,请注意可能导致某些渠道模型丢失。": "Danh sách mô hình hiện tại là danh sách dài nhất trong số tất cả các danh sách mô hình kênh dưới thẻ này, không phải là hợp nhất của tất cả các kênh. Xin lưu ý rằng điều này có thể khiến một số mô hình kênh bị mất.", + "当前没有可用的启用令牌,请确认是否有令牌处于启用状态!": "No enabled tokens available, please check if any tokens are in enabled state!", + "当前浏览器不支持 Passkey": "Current browser does not support Passkey", "当前版本": "Phiên bản hiện tại", "当前状态": "Current Status", + "当前环境无法使用 Passkey 登录": "Cannot use Passkey login in current environment", + "当前缓存大小": "Current Cache Size", "当前计费": "Thanh toán hiện tại", "当前设备不支持 Passkey": "Passkey không được hỗ trợ trên thiết bị này", "当前设置类型: ": "Loại cài đặt hiện tại: ", "当前跟随系统": "Hiện đang theo hệ thống", "当前配置无法连接到 io.net。": "Unable to connect to io.net with current configuration.", - "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知": "Khi hạn ngạch còn lại của ví hoặc gói thuê bao thấp hơn giá trị này, hệ thống sẽ gửi thông báo theo phương thức đã chọn", "当模型没有设置价格时仍接受调用,仅当您信任该网站时使用,可能会产生高额费用": "Chấp nhận cuộc gọi ngay cả khi mô hình không có cài đặt giá, chỉ sử dụng khi bạn tin tưởng trang web, điều này có thể phát sinh chi phí cao", "当运行通道全部测试时,超过此时间将自动禁用通道": "Khi chạy tất cả các kiểm tra kênh, kênh sẽ tự động bị vô hiệu hóa khi vượt quá thời gian này", + "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知": "Khi hạn ngạch còn lại của ví hoặc gói thuê bao thấp hơn giá trị này, hệ thống sẽ gửi thông báo theo phương thức đã chọn", "待使用收益": "Tiền thu được để sử dụng", "待部署": "Pending Deployment", "微信": "WeChat", + "微信二维码": "WeChat QR Code", "微信公众号二维码图片链接": "Liên kết hình ảnh mã QR tài khoản công khai WeChat", "微信扫码关注公众号,输入「验证码」获取验证码(三分钟内有效)": "Quét mã QR WeChat để theo dõi tài khoản chính thức, nhập \"mã xác minh\" để lấy mã (có hiệu lực trong 3 phút)", "微信扫码登录": "WeChat quét mã để đăng nhập", "微信账户绑定成功!": "Đã liên kết tài khoản WeChat thành công!", + "必填。对请求的 model 名称进行匹配,任意一条匹配即命中该规则。": "Required. Match the model name in the request, any match triggers the rule.", "必须是有效的 JSON 字符串数组,例如:[\"g1\",\"g2\"]": "Phải là một mảng chuỗi JSON hợp lệ, ví dụ: [\"g1\",\"g2\"]", "忘记密码?": "Quên mật khẩu?", "快速开始": "Bắt đầu nhanh", @@ -1047,8 +1336,11 @@ "思考适配 BudgetTokens 百分比": "Tỷ lệ phần trăm BudgetTokens thích ứng tư duy", "思考预算占比": "Tỷ lệ ngân sách tư duy", "性能指标": "Chỉ số hiệu suất", + "性能监控": "Performance Monitor", + "性能设置": "Performance Settings", "总 GPU 小时": "Total GPU Hours", "总价:文字价格 {{textPrice}} + 音频价格 {{audioPrice}} = {{symbol}}{{total}}": "Tổng giá: giá văn bản {{textPrice}} + giá âm thanh {{audioPrice}} = {{symbol}}{{total}}", + "总分配内存": "Total Allocated Memory", "总密钥数": "Tổng số khóa", "总收益": "tổng doanh thu", "总计": "Tổng cộng", @@ -1059,6 +1351,7 @@ "您正在使用 MySQL 数据库。MySQL 是一个可靠的关系型数据库管理系统,适合生产环境使用。": "Bạn đang sử dụng cơ sở dữ liệu MySQL. MySQL là một hệ thống quản lý cơ sở dữ liệu quan hệ đáng tin cậy, phù hợp cho môi trường sản xuất.", "您正在使用 PostgreSQL 数据库。PostgreSQL 是一个功能强大的开源关系型数据库系统,提供了出色的可靠性和数据完整性,适合生产环境使用。": "Bạn đang sử dụng cơ sở dữ liệu PostgreSQL. PostgreSQL là một hệ thống cơ sở dữ liệu quan hệ mã nguồn mở mạnh mẽ cung cấp độ tin cậy và tính toàn vẹn dữ liệu tuyệt vời, phù hợp cho môi trường sản xuất.", "您正在使用 SQLite 数据库。如果您在容器环境中运行,请确保已正确设置数据库文件的持久化映射,否则容器重启后所有数据将丢失!": "Bạn đang sử dụng cơ sở dữ liệu SQLite. Nếu bạn đang chạy trong môi trường container, vui lòng đảm bảo rằng ánh xạ bền vững tệp cơ sở dữ liệu được đặt chính xác, nếu không tất cả dữ liệu sẽ bị mất sau khi khởi động lại container!", + "您正在使用默认密码!": "You are using the default password!", "您正在删除自己的帐户,将清空所有数据且不可恢复": "Bạn đang xóa tài khoản của mình. Tất cả dữ liệu sẽ bị xóa và không thể khôi phục.", "您的数据将安全地存储在本地计算机上。所有配置、用户信息和使用记录都会自动保存,关闭应用后不会丢失。": "Dữ liệu của bạn sẽ được lưu trữ an toàn trên máy tính cục bộ. Tất cả cấu hình, thông tin người dùng và hồ sơ sử dụng sẽ được lưu tự động và sẽ không bị mất khi đóng ứng dụng.", "您确定要取消密码登录功能吗?这可能会影响用户的登录方式。": "Bạn có chắc chắn muốn tắt tính năng đăng nhập bằng mật khẩu không? Điều này có thể ảnh hưởng đến phương thức đăng nhập của người dùng.", @@ -1067,9 +1360,12 @@ "想起来了?": "Nhớ ra chưa?", "成功": "Thành công", "成功兑换额度:": "Số tiền đổi thành công:", + "成功后切换亲和": "Switch Affinity on Success", "成功时自动启用通道": "Bật kênh khi thành công", "我已了解禁用两步验证将永久删除所有相关设置和备用码,此操作不可撤销": "Tôi đã hiểu rằng việc vô hiệu hóa xác thực hai yếu tố sẽ xóa vĩnh viễn tất cả các cài đặt liên quan và mã dự phòng, thao tác này không thể hoàn tác", "我已阅读并同意": "Tôi đã đọc và đồng ý với", + "我的订阅": "Đăng ký của tôi", + "我确认开启高危重试": "I confirm enabling high-risk retry", "或": "hoặc", "或其兼容new-api-worker格式的其他版本": "hoặc các phiên bản khác tương thích với định dạng new-api-worker", "或手动输入密钥:": "Hoặc nhập khóa thủ công:", @@ -1080,6 +1376,9 @@ "手动编辑": "Chỉnh sửa thủ công", "手动输入": "Nhập thủ công", "打开侧边栏": "Mở thanh bên", + "打开授权页面": "Open Authorization Page", + "扣费": "Charge", + "执行 GC": "Run GC", "执行中": "đang xử lý", "扫描二维码": "Quét mã QR", "批量创建": "Tạo hàng loạt", @@ -1106,6 +1405,8 @@ "拉取新模型": "Pull New Model", "拉取模型": "Pull Model", "拉取进度": "Pull Progress", + "拒绝提示模板(可选)": "Rejection Prompt Template (optional)", + "拦截原因": "Block Reason", "按K显示单位": "Hiển thị theo K", "按价格设置": "Đặt theo giá", "按倍率类型筛选": "Lọc theo loại tỷ lệ", @@ -1117,6 +1418,7 @@ "换脸": "Hoán đổi khuôn mặt", "授权,需在遵守": " và phải được sử dụng tuân thủ ", "授权失败": "Ủy quyền thất bại", + "排序": "Thứ tự", "排队中": "Đang xếp hàng", "接受未设置价格模型": "Chấp nhận các mô hình không có cài đặt giá", "接口凭证": "Thông tin xác thực giao diện", @@ -1125,6 +1427,7 @@ "控制台区域": "Khu vực bảng điều khiển", "控制输出的随机性和创造性": "Kiểm soát tính ngẫu nhiên và sáng tạo của đầu ra", "控制顶栏模块显示状态,全局生效": "Kiểm soát trạng thái hiển thị mô-đun tiêu đề, hiệu ứng toàn cầu", + "推荐": "Đề xuất", "推荐:用户可以选择是否使用指纹等验证": "Khuyên dùng: Người dùng có thể chọn sử dụng xác minh vân tay hay không", "推荐使用(用户可选)": "Khuyên dùng (người dùng tùy chọn)", "描述": "Mô tả", @@ -1136,12 +1439,14 @@ "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "Prompt {{input}} tokens / 1M tokens * {{symbol}}{{price}}", "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Gợi ý {{input}} tokens / 1M tokens * {{symbol}}{{price}} + Hoàn thành {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 缓存创建 {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Gợi ý {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + Bộ nhớ đệm {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + Tạo bộ nhớ đệm {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + Hoàn thành {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "提示:": "Note:", "提示:如需备份数据,只需复制上述目录即可": "Mẹo: Để sao lưu dữ liệu, chỉ cần sao chép thư mục trên", + "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。": "Lưu ý: Cấu hình tại đây chỉ ảnh hưởng đến cách hiển thị trong \"Chợ mô hình\" và không ảnh hưởng đến việc gọi hoặc định tuyến thực tế. Nếu cần cấu hình hành vi gọi thực tế, vui lòng thiết lập trong \"Quản lý kênh\".", + "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。": "Lưu ý: Đây là tính năng beta. Cấu trúc cấu hình và hành vi có thể thay đổi trong tương lai. Không dùng trong môi trường production.", + "提示:语言偏好会同步到您登录的所有设备,并影响API返回的错误消息语言。": "Note: Language preference syncs across all your logged-in devices and affects the language of API error messages.", "提示:链接中的{key}将被替换为API密钥,{address}将被替换为服务器地址": "Mẹo: {key} trong liên kết sẽ được thay thế bằng khóa API, {address} sẽ được thay thế bằng địa chỉ máy chủ", "提示价格:{{symbol}}{{price}} / 1M tokens": "Giá gợi ý: {{symbol}}{{price}} / 1M tokens", "提示缓存倍率": "Tỷ lệ bộ nhớ đệm gợi ý", - "缓存创建倍率": "Tỷ lệ tạo bộ nhớ đệm", - "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)": "Mặc định dùng tỷ lệ tạo bộ nhớ đệm 5m; tỷ lệ tạo bộ nhớ đệm 1h được tự động tính bằng phép nhân cố định (hiện là 1.6x)", "搜索供应商": "Tìm kiếm nhà cung cấp", "搜索关键字": "Từ khóa tìm kiếm", "搜索失败": "Search failed", @@ -1158,13 +1463,18 @@ "操作": "Hành động", "操作失败": "Thao tác thất bại", "操作失败,请重试": "Thao tác thất bại, vui lòng thử lại", + "操作失败: ": "Operation failed: ", "操作成功完成!": "Thao tác hoàn tất thành công!", "操作暂时被禁用": "Thao tác tạm thời bị vô hiệu hóa", + "操作确认": "Operation confirmation", "操练场": "Sân chơi", "操练场和聊天功能": "Chức năng sân chơi và trò chuyện", + "支付": "Thanh toán", "支付地址": "Địa chỉ thanh toán", + "支付失败": "Thanh toán thất bại", "支付宝": "Alipay", "支付方式": "Phương thức thanh toán", + "支付渠道": "Kênh thanh toán", "支付设置": "Cài đặt thanh toán", "支付请求失败": "Yêu cầu thanh toán thất bại", "支付金额": "Số tiền thanh toán", @@ -1176,11 +1486,15 @@ "支持众多的大模型供应商": "Hỗ trợ nhiều nhà cung cấp LLM khác nhau", "支持单个端口和端口范围,如:80, 443, 8000-8999": "Hỗ trợ cổng đơn và phạm vi cổng, ví dụ: 80, 443, 8000-8999", "支持变量:": "Các biến được hỗ trợ:", + "支持周期性重置套餐权益额度": "Hỗ trợ đặt lại định kỳ hạn mức quyền lợi của gói", + "支持填写单个状态码或范围(含首尾),使用逗号分隔": "Supports single status codes or inclusive ranges; separate with commas", + "支持填写单个状态码或范围(含首尾),使用逗号分隔;504 和 524 始终不重试,不受此处配置影响": "Supports single status codes or inclusive ranges; separate with commas. 504 and 524 are never retried and are not affected by this setting", "支持备份": "Được hỗ trợ", "支持拉取 Ollama 官方模型库中的所有模型,拉取过程可能需要几分钟时间": "Supports pulling all models from the Ollama official model library, the pulling process may take a few minutes", "支持搜索用户的 ID、用户名、显示名称和邮箱地址": "Hỗ trợ tìm kiếm ID người dùng, tên người dùng, tên hiển thị và địa chỉ email", "支持的图像模型": "Mô hình hình ảnh được hỗ trợ", "支持通配符格式,如:example.com, *.api.example.com": "Hỗ trợ định dạng ký tự đại diện, ví dụ: example.com, *.api.example.com", + "支持逻辑 and/or 与嵌套 groups;操作符支持 eq/ne/gt/gte/lt/lte/in/not_in/contains/exists": "Supports logical and/or with nested groups; operators: eq/ne/gt/gte/lt/lte/in/not_in/contains/exists", "收益": "Thu nhập", "收益统计": "Thống kê thu nhập", "收起": "Thu gọn", @@ -1211,10 +1525,16 @@ "文档": "Tài liệu", "文档地址": "Liên kết tài liệu", "文生视频": "Văn bản sang video", + "新增 Key 来源": "Add Key Source", "新增供应商": "Thêm nhà cung cấp", + "新增失败": "Failed to add", + "新增成功": "Added successfully", + "新增规则": "Add Rule", + "新增订阅": "Thêm đăng ký", "新密码": "Mật khẩu mới", "新密码需要和原密码不一致!": "Mật khẩu mới phải khác với mật khẩu cũ!", "新建": "Tạo", + "新建套餐": "Tạo gói", "新建容器": "Create Container", "新建容器部署": "Create Container Deployment", "新建数量": "Số lượng mới", @@ -1234,13 +1554,17 @@ "无效的部署信息": "Invalid deployment information", "无效的重置链接,请重新发起密码重置请求": "Liên kết đặt lại không hợp lệ, vui lòng bắt đầu yêu cầu đặt lại mật khẩu mới", "无法发起 Passkey 注册": "Không thể bắt đầu đăng ký Passkey", + "无法发起 Passkey 登录": "Unable to initiate Passkey login", "无法复制到剪贴板,请手动复制": "Không thể sao chép vào khay nhớ tạm, vui lòng sao chép thủ công", + "无法复制此类型的消息内容": "Cannot copy this type of message content", "无法添加图片": "Không thể thêm hình ảnh", "无法获取容器详情": "Unable to get container details", "无法连接 io.net": "Unable to connect to io.net", + "无生效": "Không có gói đăng ký hiệu lực", "无邀请人": "Không có người mời", "无限制": "Không giới hạn", "无限额度": "Hạn ngạch không giới hạn", + "日": "ngày", "日志导出成功": "Logs exported successfully", "日志已下载": "Logs downloaded", "日志已加载": "Logs loaded", @@ -1253,10 +1577,12 @@ "旧格式(直接覆盖):": "Định dạng cũ (ghi đè trực tiếp):", "旧格式模板": "Mẫu định dạng cũ", "旧的备用码已失效,请保存新的备用码": "Mã dự phòng cũ đã bị vô hiệu hóa, vui lòng lưu mã dự phòng mới", + "旧配置迁移完成": "Legacy config migration complete", "早上好": "Chào buổi sáng", "时间": "Thời gian", "时间信息": "Time Information", "时间粒度": "Độ chi tiết thời gian", + "易支付": "Epay", "易支付商户ID": "ID người bán Epay", "易支付商户密钥": "Khóa người bán Epay", "是": "Có", @@ -1269,6 +1595,7 @@ "显示倍率": "Hiển thị tỷ lệ", "显示最新20条": "Hiển thị 20 mới nhất", "显示名称": "Tên hiển thị", + "显示名称字段(可选)": "Display Name Field (optional)", "显示完整内容": "Hiển thị nội dung đầy đủ", "显示操作项": "Hiển thị hành động", "显示更多": "Hiển thị thêm", @@ -1281,6 +1608,8 @@ "智能体ID": "ID tác nhân", "智能熔断": "Dự phòng thông minh", "智谱": "Zhipu AI", + "智谱 ChatGLM(已经弃用,请使用智谱 GLM-4V)": "Zhipu ChatGLM (deprecated, use Zhipu GLM-4V)", + "智谱 GLM-4V": "Zhipu GLM-4V", "暂无": "None", "暂无API信息": "Không có thông tin API", "暂无SSE响应数据": "Không có dữ liệu phản hồi SSE", @@ -1290,12 +1619,15 @@ "暂无公告": "Không có thông báo", "暂无匹配模型": "Không có mô hình phù hợp", "暂无可复制的版本信息": "No version information to copy", + "暂无可展示数据": "No data to display", "暂无可用的支付方式,请联系管理员配置": "Không có phương thức thanh toán khả dụng, vui lòng liên hệ quản trị viên để cấu hình", + "暂无可购买套餐": "Không có gói có thể mua", "暂无响应数据": "Không có dữ liệu phản hồi", "暂无容器信息": "No container information", "暂无容器详情": "No container details", "暂无密钥数据": "Không có dữ liệu khóa", "暂无差异化倍率显示": "Không có hiển thị tỷ lệ khác biệt", + "暂无已绑定项": "No bound items", "暂无常见问答": "Không có câu hỏi thường gặp", "暂无成功模型": "Không có mô hình thành công", "暂无数据": "Không có dữ liệu", @@ -1310,6 +1642,9 @@ "暂无监控数据": "Không có dữ liệu giám sát", "暂无系统公告": "Không có thông báo hệ thống", "暂无缺失模型": "Không có mô hình bị thiếu", + "暂无自定义 OAuth 提供商": "No custom OAuth providers", + "暂无订阅套餐": "Chưa có gói đăng ký", + "暂无订阅记录": "Chưa có bản ghi đăng ký", "暂无请求数据": "Không có dữ liệu yêu cầu", "暂无项目": "Không có dự án", "暂无预填组": "Không có nhóm điền sẵn", @@ -1328,9 +1663,11 @@ "更新名称失败": "Failed to update name", "更新失败": "Cập nhật thất bại", "更新失败,请检查输入信息": "Update failed, please check the input information", + "更新套餐信息": "Cập nhật thông tin gói", "更新容器配置": "Update Container Configuration", "更新容器配置可能会导致容器重启,请确保在合适的时间进行此操作。": "Updating container configuration may cause the container to restart, please ensure you perform this operation at an appropriate time.", "更新成功": "Cập nhật thành công", + "更新成功!": "Updated successfully!", "更新所有已启用通道余额": "Cập nhật số dư cho tất cả các kênh đã bật", "更新支付设置": "Cập nhật cài đặt thanh toán", "更新时间": "Thời gian cập nhật", @@ -1342,16 +1679,25 @@ "更新配置后,容器可能需要重启以应用新的设置。请确保您了解这些更改的影响。": "After updating the configuration, the container may need to restart to apply the new settings. Please ensure you understand the impact of these changes.", "更新配置失败": "Failed to update configuration", "更新预填组": "Cập nhật nhóm điền sẵn", + "月": "tháng", "有 Reasoning": "Có lập luận", + "有异常": "Has Errors", + "有效期": "Thời hạn", + "有效期单位": "Đơn vị thời hạn", + "有效期数值": "Giá trị thời hạn", + "有效期设置": "Cài đặt thời hạn", "服务可用性": "Trạng thái dịch vụ", "服务商": "Service Provider", "服务器地址": "Địa chỉ máy chủ", "服务显示名称": "Tên hiển thị dịch vụ", + "未使用": "Unused", + "未匹配到模型,按回车键可将「{{name}}」作为自定义模型名添加": "Không tìm thấy mô hình khớp. Nhấn Enter để thêm \"{{name}}\" làm tên mô hình tùy chỉnh.", "未发现新增模型": "Không có mô hình mới nào được thêm", "未发现重复密钥": "Không tìm thấy khóa trùng lặp", "未启动": "Chưa bắt đầu", "未启用": "Chưa bật", "未命名": "Chưa đặt tên", + "未在 Discovery 响应中找到可用的 OAuth 端点": "No available OAuth endpoints found in Discovery response", "未备份": "Chưa sao lưu", "未开始": "Chưa bắt đầu", "未找到匹配的模型": "Không tìm thấy mô hình phù hợp", @@ -1378,9 +1724,13 @@ "未设置倍率模型": "Mô hình không có cài đặt tỷ lệ", "未配置模型": "Không có mô hình được cấu hình", "未配置的模型列表": "Mô hình chưa được cấu hình", + "本周": "This Week", "本地": "Cục bộ", "本地数据存储": "Lưu trữ dữ liệu cục bộ", "本地计费": "Local billing", + "本月": "This Month", + "本月获得": "Tháng này", + "本站仅作演示之用,无服务端!": "This site is for demo purposes only, no server!", "本设备:手机指纹/面容,外接:USB安全密钥": "Tích hợp: vân tay/khuôn mặt điện thoại, Bên ngoài: khóa bảo mật USB", "本设备内置": "Thiết bị tích hợp", "本项目根据": "Dự án này được cấp phép theo ", @@ -1388,11 +1738,13 @@ "机密环境变量将被加密存储,适用于存储密码、API密钥等敏感信息。": "Secret environment variables will be stored encrypted, suitable for storing passwords, API keys and other sensitive information.", "机密环境变量说明": "Secret Environment Variables Description", "权重": "Trọng số", + "权重必须是非负整数!": "Weight must be a non-negative integer!", "权限设置": "Cài đặt quyền", "条": "mục", "条 - 第": "đến", "条,共": "của", "条日志已清理!": "nhật ký đã được xóa!", + "来源": "Nguồn", "来源于 IO.NET 部署": "From IO.NET Deployment", "来自模型重定向,尚未加入模型列表": "From model redirect, not yet added to the model list", "某些配置更改可能需要几分钟才能生效。": "Some configuration changes may take a few minutes to take effect.", @@ -1410,20 +1762,26 @@ "标签不能为空!": "Nhãn không được để trống!", "标签信息": "Thông tin thẻ", "标签名称": "Tên thẻ", + "标签更新成功!": "Tag updated successfully!", "标签的基本配置": "Cấu hình cơ bản của thẻ", "标签组": "Nhóm thẻ", "标签聚合": "Tổng hợp thẻ", "标签聚合模式": "Bật chế độ thẻ", "标识颜色": "Màu định danh", "核采样,控制词汇选择的多样性": "Lấy mẫu hạt nhân, kiểm soát sự đa dạng của lựa chọn từ vựng", + "根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。": "Theo quy ước của Anthropic, input tokens của /v1/messages chỉ tính phần đầu vào không dùng cache và không bao gồm tokens đọc/ghi cache.", "根据模型名称和匹配规则查找模型元数据,优先级:精确 > 前缀 > 后缀 > 包含": "Tìm siêu dữ liệu mô hình dựa trên tên mô hình và quy tắc khớp, ưu tiên: chính xác > tiền tố > hậu tố > chứa", "格式化": "Định dạng", + "格式化 JSON": "Định dạng JSON", "格式正确": "Định dạng hợp lệ", "格式示例:": "Ví dụ định dạng:", "格式错误": "Định dạng không hợp lệ", "检查更新": "Kiểm tra cập nhật", + "检查更新失败,请稍后再试": "Failed to check for updates, please try again later", "检测到 FluentRead(流畅阅读)": "Đã phát hiện FluentRead (đọc trôi chảy)", + "检测到以下高危状态码重定向规则": "Detected high-risk status-code redirect rules", "检测到多个密钥,您可以单独复制每个密钥,或点击复制全部获取完整内容。": "Đã phát hiện nhiều khóa, bạn có thể sao chép từng khóa riêng lẻ hoặc nhấp vào Sao chép tất cả để lấy nội dung đầy đủ.", + "检测到旧版本的配置数据,是否要迁移到新的配置格式?": "Legacy config data detected, migrate to the new config format?", "检测到该消息后有AI回复,是否删除后续回复并重新生成?": "Phát hiện trả lời AI sau tin nhắn này, xóa các trả lời tiếp theo và tạo lại?", "检测必须等待绘图成功才能进行放大等操作": "Việc phát hiện phải đợi vẽ thành công trước khi thực hiện phóng to và các thao tác khác", "模型": "Mô hình", @@ -1432,6 +1790,7 @@ "模型价格": "Giá mô hình", "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}": "Giá mô hình {{symbol}}{{price}}, {{ratioType}} {{ratio}}", "模型价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "Giá mô hình: {{symbol}}{{price}} * {{ratioType}}: {{ratio}} = {{symbol}}{{total}}", + "模型价格不能为0": "Model price cannot be 0", "模型倍率": "Tỷ lệ mô hình", "模型倍率 {{modelRatio}}": "Model ratio {{modelRatio}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}}": "Tỷ lệ mô hình {{modelRatio}}, tỷ lệ bộ nhớ đệm {{cacheRatio}}, tỷ lệ hoàn thành {{completionRatio}}, {{ratioType}} {{ratio}}", @@ -1474,6 +1833,9 @@ "模型更新成功!": "Cập nhật mô hình thành công!", "模型未加入列表,可能无法调用": "Model not in the list; requests may fail", "模型权限": "Quyền mô hình", + "模型正则": "Model Regex", + "模型正则(每行一个)": "Model Regex (one per line)", + "模型正则不能为空": "Model regex cannot be empty", "模型消耗分布": "Phân phối tiêu thụ mô hình", "模型消耗趋势": "Xu hướng tiêu thụ mô hình", "模型版本": "Phiên bản mô hình", @@ -1514,6 +1876,7 @@ "正在使用": "Đang sử dụng", "正在加载...": "Đang tải...", "正在加载可用部署位置...": "Loading available deployment locations...", + "正在加载签到状态...": "Đang tải trạng thái đăng nhập...", "正在处理": "Đang xử lý", "正在处理大内容...": "Đang xử lý nội dung lớn...", "正在导出...": "Đang xuất...", @@ -1545,6 +1908,7 @@ "此操作将解绑用户当前的 Passkey,下次登录需要重新注册。": "Thao tác này sẽ hủy liên kết Passkey hiện tại của người dùng. Họ sẽ cần đăng ký lại vào lần đăng nhập tiếp theo.", "此操作将降低用户的权限级别": "Thao tác này sẽ giảm cấp quyền hạn của người dùng", "此支付方式最低充值金额为": "Số tiền nạp tối thiểu cho phương thức thanh toán này là", + "此消息没有可复制的文本内容": "This message has no copyable text content", "此渠道由 IO.NET 自动同步,类型、密钥和 API 地址已锁定。": "This channel is automatically synchronized by IO.NET, type, key and API address are locked.", "此设置用于系统内部计算,默认值500000是为了精确到6位小数点设计,不推荐修改。": "Cài đặt này được sử dụng cho các tính toán nội bộ của hệ thống. Giá trị mặc định 500000 được thiết kế cho độ chính xác 6 chữ số thập phân, không nên sửa đổi.", "此页面仅显示未设置价格或倍率的模型,设置后将自动从列表中移除": "Trang này chỉ hiển thị các mô hình chưa đặt giá hoặc tỷ lệ. Sau khi đặt, chúng sẽ tự động bị xóa khỏi danh sách", @@ -1555,8 +1919,16 @@ "此项可选,用于覆盖请求参数。不支持覆盖 stream 参数": "Tùy chọn, được sử dụng để ghi đè tham số yêu cầu. Không hỗ trợ ghi đè tham số stream.", "此项可选,用于覆盖请求头参数": "Tùy chọn, được sử dụng để ghi đè tham số tiêu đề yêu cầu.", "此项可选,用于通过自定义API地址来进行 API 调用,末尾不要带/v1和/": "Tùy chọn cho các cuộc gọi API thông qua địa chỉ API tùy chỉnh, không thêm /v1 và / ở cuối", + "每个用户最多可创建的令牌数量,默认 1000,设置过大可能会影响性能": "Maximum tokens each user can create, default 1000. Setting too high may impact performance", + "每周": "Hàng tuần", + "每周窗口": "Weekly window", + "每天": "Hàng ngày", "每容器GPU数": "GPUs per Container", + "每日仅可签到一次,请勿重复签到": "Chỉ có thể đăng nhập một lần mỗi ngày, vui lòng không đăng nhập lặp lại", + "每日签到": "Đăng nhập hàng ngày", + "每日签到可获得随机额度奖励": "Đăng nhập hàng ngày để nhận phần thưởng hạn mức ngẫu nhiên", "每日签到获得": "Nhận được từ đăng nhập hàng ngày", + "每月": "Hàng tháng", "每隔多少分钟测试一次所有通道": "Bao nhiêu phút kiểm tra tất cả các kênh một lần", "比率": "Tỷ lệ", "永不过期": "Không bao giờ hết hạn", @@ -1565,6 +1937,7 @@ "永久删除所有备用码(包括未使用的)": "Xóa vĩnh viễn tất cả các mã dự phòng (bao gồm cả mã chưa sử dụng)", "永久有效": "Có hiệu lực vĩnh viễn", "汇率": "Tỷ giá hối đoái", + "没有任何修改!": "No changes made!", "没有匹配的日志条目": "No matching log entries", "没有可用令牌用于填充": "Không có mã thông báo khả dụng để điền", "没有可用模型": "Không có mô hình khả dụng", @@ -1580,7 +1953,9 @@ "注 册": "Đăng ký", "注册": "Đăng ký", "注册 Passkey": "Đăng ký Passkey", + "注册失败,请重试": "Registration failed, please try again", "注册成功,请登录": "Đăng ký thành công, vui lòng đăng nhập", + "注册成功!": "Registration successful!", "注册新用户": "Đăng ký người dùng mới", "注册时间": "Thời gian đăng ký", "注册用户": "Người dùng đã đăng ký", @@ -1594,10 +1969,12 @@ "注意非Chat API,请务必填写正确的API地址,否则可能导致无法使用": "Lưu ý: Đối với API không phải Chat, vui lòng đảm bảo nhập đúng địa chỉ API, nếu không có thể dẫn đến không sử dụng được", "注销": "Đăng xuất", "注销成功!": "Đăng xuất thành công!", + "活跃文件": "Active Files", + "活跃缓存数": "Active Cache Count", "流": "luồng", + "流式": "Streaming", "流式响应完成": "Luồng hoàn tất", "流式输出": "Đầu ra luồng", - "流式": "Streaming", "流量端口": "Traffic Port", "浅色": "Sáng", "浅色模式": "Chế độ sáng", @@ -1616,9 +1993,9 @@ "测试完成": "Kiểm tra hoàn tất", "测试成功": "Kiểm tra thành công", "测试成功,耗时 ": "Kiểm tra thành công, mất ", + "测试所有未手动禁用渠道": "Kiểm tra tất cả các kênh ngoại trừ các kênh bị vô hiệu hóa thủ công", "测试所有渠道的最长响应时间": "Thời gian phản hồi tối đa để kiểm tra tất cả các kênh", "测试所有通道": "Kiểm tra tất cả các kênh", - "测试所有未手动禁用渠道": "Kiểm tra tất cả các kênh ngoại trừ các kênh bị vô hiệu hóa thủ công", "测试模型": "Mô hình kiểm tra", "测试模型耗时": "Thời gian kiểm tra mô hình", "测试模式": "Chế độ kiểm tra", @@ -1629,6 +2006,7 @@ "测试通道": "Kênh kiểm tra", "测速": "Kiểm tra tốc độ", "浏览": "Duyệt", + "浏览器不支持复制功能,请手动复制": "Browser does not support copy, please copy manually", "消息": "Tin nhắn", "消息优先级": "Ưu tiên tin nhắn", "消息优先级,范围0-10,默认为5": "Ưu tiên tin nhắn, phạm vi 0-10, mặc định là 5", @@ -1649,6 +2027,7 @@ "添加 IP": "Thêm IP", "添加 IP 到白名单": "Thêm IP vào danh sách trắng", "添加 IP 到黑名单": "Thêm IP vào danh sách đen", + "添加 OAuth 提供商": "Add OAuth Provider", "添加API": "Thêm API", "添加产品": "Thêm sản phẩm", "添加令牌": "Tạo mã thông báo", @@ -1691,26 +2070,34 @@ "添加问答": "Thêm hỏi đáp", "添加额度": "Thêm hạn ngạch", "清理": "Dọn dẹp", + "清理不活跃缓存": "Xóa cache không hoạt động", "清理历史日志": "Dọn dẹp nhật ký lịch sử", + "清理失败": "Cleanup failed", "清理成功": "Dọn dẹp thành công", "清理数据": "Dọn dẹp dữ liệu", "清理日志": "Dọn dẹp nhật ký", "清理未使用的模型": "Dọn dẹp các mô hình không sử dụng", "清空": "Xóa", + "清空全部缓存": "Clear All Cache", "清空历史记录": "Xóa lịch sử", "清空对话": "Xóa cuộc trò chuyện", "清空对话记录": "Xóa hồ sơ cuộc trò chuyện", "清空所有数据": "Xóa tất cả dữ liệu", "清空日志": "Xóa nhật ký", "清空测试结果": "Xóa kết quả kiểm tra", + "清空该规则缓存": "Clear Rule Cache", "清空重定向": "Xóa chuyển hướng", "清除历史日志": "Xóa nhật ký lịch sử", "清除失效兑换码": "Xóa mã đổi thưởng không hợp lệ", "清除所有模型": "Xóa tất cả các mô hình", "渠道": "Kênh", "渠道 ID": "ID kênh", + "渠道:": "Channel:", "渠道ID": "ID kênh", "渠道ID,名称,密钥,API地址": "ID kênh, tên, khóa, Base URL", + "渠道亲和性": "Channel Affinity", + "渠道亲和性:上游缓存命中": "Channel Affinity: Upstream Cache Hit", + "渠道亲和性会基于从请求上下文或 JSON Body 提取的 Key,优先复用上一次成功的渠道。": "Channel affinity prioritizes reusing the last successful channel based on keys extracted from request context or JSON body.", "渠道优先级": "Ưu tiên kênh", "渠道信息": "Thông tin kênh", "渠道列表": "Danh sách kênh", @@ -1774,8 +2161,6 @@ "点击阅读": "Nhấp để đọc", "点击预览视频": "Nhấp để xem trước video", "点击预览音乐": "Nhấp để nghe nhạc", - "音乐预览": "Xem trước nhạc", - "音频无法播放": "Không thể phát âm thanh", "点击验证按钮,使用您的生物特征或安全密钥": "Nhấp vào nút xác minh và sử dụng sinh trắc học hoặc khóa bảo mật của bạn", "版": "Phiên bản", "版本": "Phiên bản", @@ -1794,6 +2179,7 @@ "生成令牌": "Tạo mã thông báo", "生成兑换码": "Tạo mã đổi thưởng", "生成失败": "Tạo thất bại", + "生成并填入": "Generate and Fill", "生成成功": "Tạo thành công", "生成数量": "Số lượng tạo", "生成数量必须大于0": "Số lượng tạo phải lớn hơn 0", @@ -1803,12 +2189,14 @@ "生成歌词": "Tạo lời bài hát", "生成访问令牌": "Tạo mã thông báo truy cập", "生成音乐": "tạo nhạc", + "生效": "Có hiệu lực", "生效时间": "Thời gian hiệu lực", "用于 Claude 3 预测输出,请前往": "Đối với đầu ra dự đoán Claude 3, vui lòng truy cập", "用于 DALL-E 2 图片生成,请前往": "Đối với việc tạo hình ảnh DALL-E 2, vui lòng truy cập", "用于 DALL-E 3 图片生成,请前往": "Đối với việc tạo hình ảnh DALL-E 3, vui lòng truy cập", "用于 UI 显示": "Dùng cho hiển thị UI", "用于API调用的身份验证令牌,请妥善保管": "Mã thông báo xác thực cho các cuộc gọi API, vui lòng giữ an toàn", + "用于唯一标识用户的字段路径": "Field path for uniquely identifying users", "用于配置网络代理,支持 socks5 协议": "Được sử dụng để cấu hình proxy mạng, hỗ trợ giao thức socks5", "用于非 OpenAI 格式的 Gemini/Vertex 渠道": "Dành cho các kênh Gemini/Vertex không phải định dạng OpenAI", "用于验证回调 new-api 的 webhook 请求的密钥,敏感信息不显示": "Khóa được sử dụng để xác minh các yêu cầu webhook gọi lại new-api, thông tin nhạy cảm không được hiển thị.", @@ -1824,6 +2212,7 @@ "用以防止恶意用户利用临时邮箱批量注册": "Để ngăn chặn người dùng độc hại đăng ký hàng loạt bằng địa chỉ email tạm thời", "用户": "Người dùng", "用户 ID": "ID người dùng", + "用户 ID 字段(可选)": "User ID Field (optional)", "用户 ID 或用户名": "ID người dùng hoặc tên người dùng", "用户ID": "ID người dùng", "用户个人功能": "Chức năng cá nhân người dùng", @@ -1833,6 +2222,8 @@ "用户优先:如果用户在请求中指定了系统提示词,将优先使用用户的设置": "Ưu tiên người dùng: Nếu người dùng chỉ định từ nhắc hệ thống trong yêu cầu, cài đặt của người dùng sẽ được sử dụng trước", "用户信息": "Thông tin người dùng", "用户信息更新成功!": "Cập nhật thông tin người dùng thành công!", + "用户信息缺失": "User info missing", + "用户最大令牌数量": "Max Tokens Per User", "用户分组": "Nhóm người dùng", "用户分组和额度管理": "Quản lý nhóm người dùng và hạn ngạch", "用户分组设置": "Cài đặt nhóm người dùng", @@ -1844,6 +2235,7 @@ "用户协议更新失败": "Cập nhật thỏa thuận người dùng thất bại", "用户可选分组": "Nhóm người dùng có thể chọn", "用户名": "Tên người dùng", + "用户名字段(可选)": "Username Field (optional)", "用户名或邮箱": "Tên người dùng hoặc email", "用户名称": "Tên người dùng", "用户在线": "Người dùng trực tuyến", @@ -1865,6 +2257,7 @@ "用户的基本账户信息": "Thông tin tài khoản cơ bản của người dùng", "用户管理": "Quản lý người dùng", "用户组": "Nhóm người dùng", + "用户订阅管理": "Quản lý đăng ký người dùng", "用户设置": "Cài đặt người dùng", "用户详情": "Chi tiết người dùng", "用户账户创建成功!": "Tạo tài khoản người dùng thành công!", @@ -1874,17 +2267,22 @@ "用户额度设置": "Cài đặt hạn ngạch người dùng", "用时/首字": "Thời gian/từ đầu tiên", "用途": "Mục đích", + "由全站货币展示设置统一控制": "Được điều khiển bởi cài đặt hiển thị tiền tệ toàn site", + "由订阅抵扣": "Deducted from subscription", "申请": "Đăng ký", "申请时间": "Thời gian đăng ký", "电子邮箱": "Email", "画图": "Vẽ", "画图接口": "Giao diện vẽ", + "界面语言和其他个人偏好": "Interface language and other personal preferences", + "留空使用系统临时目录": "Leave empty to use system temp directory", "留空则不修改": "Để trống để không sửa đổi", "留空则不修改密码": "Để trống để không thay đổi mật khẩu", "留空则使用账号绑定的邮箱": "Nếu để trống, địa chỉ email liên kết với tài khoản sẽ được sử dụng", "留空则使用默认值": "Để trống để sử dụng giá trị mặc định", "留空则使用默认端点;支持 {path, method}": "Để trống để sử dụng điểm cuối mặc định; hỗ trợ {path, method}", "留空则使用默认设置": "Để trống để sử dụng cài đặt mặc định", + "留空则保持原有密钥": "Leave empty to keep existing secret", "留空则禁用": "Để trống để vô hiệu hóa", "留空则自动生成": "Để trống để tự động tạo", "留空则默认使用服务器地址,注意不能携带http://或者https://": "Nếu để trống, địa chỉ máy chủ sẽ được sử dụng theo mặc định. Lưu ý rằng không được bao gồm http:// hoặc https://", @@ -1903,6 +2301,8 @@ "登录过期,请重新登录!": "Đăng nhập hết hạn, vui lòng đăng nhập lại!", "登录验证": "Xác minh đăng nhập", "白名单": "Danh sách trắng", + "百度文心千帆": "Baidu ERNIE", + "百度文心千帆V2": "Baidu ERNIE V2", "的前提下使用。": "để sử dụng trong các điều kiện sau:", "监听端口": "Cổng lắng nghe", "监控": "Giám sát", @@ -1912,6 +2312,8 @@ "目前仅支持": "Hiện tại chỉ hỗ trợ", "目前支持": "Hiện tại hỗ trợ", "目前支持的变量": "Các biến hiện được hỗ trợ", + "目录总大小": "Directory Total Size", + "目录文件数": "Directory File Count", "目标": "Mục tiêu", "目标 URL": "URL mục tiêu", "目标地址": "Địa chỉ mục tiêu", @@ -1924,6 +2326,8 @@ "真实请求时间": "Thời gian yêu cầu thực", "矛盾": "Xung đột", "知识库 ID": "ID cơ sở kiến thức", + "知识库:AI Proxy": "Knowledge Base: AI Proxy", + "知识库:FastGPT": "Knowledge Base: FastGPT", "硬件": "Hardware", "硬件与性能": "Hardware & Performance", "硬件类型": "Hardware Type", @@ -1962,6 +2366,7 @@ "确定要删除所选的 {{count}} 个令牌吗?_other": "Bạn có chắc chắn muốn xóa {{count}} mã thông báo đã chọn không?", "确定要删除所选的 {{count}} 个模型吗?_one": "Bạn có chắc chắn muốn xóa {{count}} mô hình đã chọn không?", "确定要删除所选的 {{count}} 个模型吗?_other": "Bạn có chắc chắn muốn xóa {{count}} mô hình đã chọn không?", + "确定要删除此 OAuth 提供商吗?": "Are you sure you want to delete this OAuth provider?", "确定要删除此API信息吗?": "Bạn có chắc chắn muốn xóa thông tin API này không?", "确定要删除此公告吗?": "Bạn có chắc chắn muốn xóa thông báo này không?", "确定要删除此分类吗?": "Bạn có chắc chắn muốn xóa danh mục này không?", @@ -1973,19 +2378,23 @@ "确定要启用此用户吗?": "Bạn có chắc chắn muốn bật người dùng này không?", "确定要提升此用户吗?": "Bạn có chắc chắn muốn thăng cấp người dùng này không?", "确定要更新所有已启用通道余额吗?": "Bạn có chắc chắn muốn cập nhật số dư của tất cả các kênh đã bật không?", - "确定要测试所有通道吗?": "Bạn có chắc chắn muốn kiểm tra tất cả các kênh không?", "确定要测试所有未手动禁用渠道吗?": "Bạn có chắc chắn muốn kiểm tra tất cả các kênh ngoại trừ các kênh bị vô hiệu hóa thủ công không?", + "确定要测试所有通道吗?": "Bạn có chắc chắn muốn kiểm tra tất cả các kênh không?", "确定要禁用所有的密钥吗?": "Bạn có chắc chắn muốn vô hiệu hóa tất cả các khóa không?", "确定要禁用此用户吗?": "Bạn có chắc chắn muốn vô hiệu hóa người dùng này không?", + "确定要解绑 {{name}} 吗?": "Are you sure you want to unbind {{name}}?", "确定要降级此用户吗?": "Bạn có chắc chắn muốn hạ cấp người dùng này không?", "确定重置": "Xác nhận đặt lại", "确定重置模型倍率吗?": "Xác nhận đặt lại tỷ lệ mô hình?", "确认": "Xác nhận", + "确认作废": "Xác nhận vô hiệu", "确认修改": "Xác nhận sửa đổi", + "确认关闭提示": "Xác nhận đóng", "确认冲突项修改": "Xác nhận sửa đổi mục xung đột", "确认删除": "Xác nhận xóa", "确认删除模型": "Confirm Delete Model", "确认取消密码登录": "Xác nhận hủy đăng nhập mật khẩu", + "确认启用": "Confirm Enable", "确认密码": "Xác nhận mật khẩu", "确认导入配置": "Xác nhận nhập cấu hình", "确认延长": "Confirm Extension", @@ -1994,19 +2403,31 @@ "确认操作": "Confirm Operation", "确认支付": "Xác nhận thanh toán", "确认新密码": "Xác nhận mật khẩu mới", + "确认清理不活跃的磁盘缓存?": "Xác nhận xóa cache đĩa không hoạt động?", + "确认清空全部渠道亲和性缓存": "Confirm clear all channel affinity cache", + "确认清空该规则缓存": "Confirm clear rule cache", "确认清除": "Xác nhận xóa", "确认清除历史日志": "Xác nhận xóa nhật ký lịch sử", - "确认清理不活跃的磁盘缓存?": "Xác nhận xóa cache đĩa không hoạt động?", "确认禁用": "Xác nhận vô hiệu hóa", "确认补单": "Xác nhận hoàn thành đơn hàng", "确认解绑": "Xác nhận hủy liên kết", "确认解绑 Passkey": "Xác nhận hủy liên kết Passkey", "确认设置并完成初始化": "Xác nhận cài đặt và hoàn tất khởi tạo", + "确认迁移": "Confirm Migration", "确认重置": "Xác nhận đặt lại", "确认重置 Passkey": "Xác nhận đặt lại Passkey", "确认重置两步验证": "Xác nhận đặt lại xác thực hai yếu tố", "确认重置密码": "Xác nhận đặt lại mật khẩu", "确认重置密钥?": "Xác nhận đặt lại khóa?", + "磁盘 阈值 (%)": "Ngưỡng đĩa (%)", + "磁盘使用率超过此值时拒绝请求": "Từ chối yêu cầu khi sử dụng đĩa vượt quá giá trị này", + "磁盘可用空间小于缓存最大总量设置": "Disk free space is less than max cache size setting", + "磁盘命中": "Disk Hits", + "磁盘缓存最大总量 (MB)": "Max Disk Cache Size (MB)", + "磁盘缓存占用的最大空间": "Maximum space occupied by disk cache", + "磁盘缓存已清理": "Disk cache cleared", + "磁盘缓存设置(磁盘换内存)": "Disk Cache Settings (Disk Swap Memory)", + "磁盘缓存阈值 (MB)": "Disk Cache Threshold (MB)", "示例": "Ví dụ", "示例:": "Ví dụ: ", "示例:{\"default\": [200, 100], \"vip\": [0, 1000]}。": "Ví dụ: {\"default\": [200, 100], \"vip\": [0, 1000]}.", @@ -2022,6 +2443,7 @@ "禁用两步验证(2FA)": "Vô hiệu hóa xác thực hai yếu tố (2FA)", "禁用全部": "Vô hiệu hóa tất cả", "禁用原因": "Lý do vô hiệu hóa", + "禁用后用户端不再展示,但历史订单不受影响。是否继续?": "Sau khi tắt, gói sẽ không hiển thị cho người dùng nhưng lịch sử đơn hàng không bị ảnh hưởng. Tiếp tục?", "禁用后的影响:": "Tác động sau khi vô hiệu hóa:", "禁用密钥失败": "Vô hiệu hóa khóa thất bại", "禁用思考处理的模型列表": "Danh sách mô hình bỏ qua xử lý tư duy", @@ -2044,11 +2466,14 @@ "积分记录": "Hồ sơ điểm", "移除 functionResponse.id 字段": "Xóa trường functionResponse.id", "移除 One API 的版权标识必须首先获得授权,项目维护需要花费大量精力,如果本项目对你有意义,请主动支持本项目": "Việc xóa dấu bản quyền One API trước tiên phải được ủy quyền. Việc bảo trì dự án đòi hỏi rất nhiều nỗ lực. Nếu dự án này có ý nghĩa với bạn, vui lòng chủ động ủng hộ dự án này.", + "窗口:": "Window:", "窗口处理": "xử lý cửa sổ", "窗口等待": "chờ cửa sổ", "立即充值": "Nạp tiền ngay", "立即注册": "Đăng ký ngay", "立即登录": "Đăng nhập ngay", + "立即签到": "Đăng nhập ngay", + "立即订阅": "Đăng ký ngay", "立即验证": "Xác minh ngay", "站点名称": "Tên trang web", "站点图标": "Biểu tượng trang web", @@ -2058,10 +2483,11 @@ "端口号必须在1-65535之间": "Port number must be between 1-65535", "端口配置详细说明": "Hạn chế các yêu cầu bên ngoài đến các cổng cụ thể. Sử dụng cổng đơn (80, 443) hoặc phạm vi (8000-8999). Danh sách trống cho phép tất cả các cổng. Mặc định bao gồm các cổng web phổ biến.", "端点": "Điểm cuối", + "端点 URL 必须是完整地址(以 http:// 或 https:// 开头)": "Endpoint URL must be a full address (starting with http:// or https://)", "端点映射": "Ánh xạ điểm cuối", - "在模型广场向用户展示的端点": "Endpoint hiển thị cho người dùng trong Chợ mô hình", "端点类型": "Loại điểm cuối", "端点组": "Nhóm điểm cuối", + "第三方支付配置": "Cấu hình thanh toán bên thứ ba", "第三方登录": "Đăng nhập bên thứ ba", "第三方账户绑定状态(只读)": "Trạng thái liên kết tài khoản bên thứ ba (chỉ đọc)", "等价金额:": "Số tiền tương đương: ", @@ -2069,6 +2495,15 @@ "等待获取邮箱信息...": "Đang chờ lấy thông tin email...", "策略": "Chiến lược", "筛选": "Lọc", + "签到最大额度": "Hạn mức đăng nhập tối đa", + "签到最小额度": "Hạn mức đăng nhập tối thiểu", + "签到功能允许用户每日签到获取随机额度奖励": "Tính năng đăng nhập cho phép người dùng đăng nhập hàng ngày để nhận phần thưởng hạn mức ngẫu nhiên", + "签到失败": "Đăng nhập thất bại", + "签到奖励将直接添加到您的账户余额": "Phần thưởng đăng nhập sẽ được thêm trực tiếp vào số dư tài khoản của bạn", + "签到奖励的最大额度": "Hạn mức tối đa cho phần thưởng đăng nhập", + "签到奖励的最小额度": "Hạn mức tối thiểu cho phần thưởng đăng nhập", + "签到成功!获得": "Đăng nhập thành công! Đã nhận", + "签到设置": "Cài đặt đăng nhập", "简介": "Giới thiệu", "简单模式": "Chế độ đơn giản", "管理": "Quản lý", @@ -2083,6 +2518,7 @@ "管理员未开启Stripe充值!": "Quản trị viên chưa bật nạp tiền Stripe!", "管理员未开启在线充值!": "Quản trị viên chưa bật nạp tiền trực tuyến!", "管理员未开启在线充值功能,请联系管理员开启或使用兑换码充值。": "Quản trị viên chưa bật chức năng nạp tiền trực tuyến, vui lòng liên hệ quản trị viên để bật hoặc nạp tiền bằng mã đổi thưởng.", + "管理员未开启在线支付功能,请联系管理员配置。": "Quản trị viên chưa bật thanh toán trực tuyến, vui lòng liên hệ quản trị viên.", "管理员未设置用户可选分组": "Quản trị viên chưa đặt nhóm người dùng có thể chọn", "管理员设置": "Cài đặt quản trị viên", "管理员设置了外部链接,点击下方按钮访问": "Quản trị viên đã thiết lập các liên kết bên ngoài, nhấp vào nút bên dưới để truy cập", @@ -2096,17 +2532,23 @@ "管理控制台": "Bảng điều khiển quản lý", "管理模型、标签、端点等预填组": "Quản lý các nhóm điền sẵn như mô hình, thẻ, điểm cuối, v.v.", "管理用户": "Quản lý người dùng", + "管理用户已绑定的第三方账户,支持筛选与解绑": "Manage third-party accounts bound to users, with filtering and unbinding support", + "管理绑定": "Manage Bindings", "管理面板": "Bảng quản lý", "类": "Lớp", "类型": "Loại", "粘贴图片失败": "Dán hình ảnh thất bại", "精确": "Chính xác", + "精确名称匹配": "Exact Name Match", "系统": "Hệ thống", "系统令牌已复制到剪切板": "Mã thông báo hệ thống đã được sao chép vào khay nhớ tạm", "系统任务记录": "Hồ sơ tác vụ hệ thống", "系统信息": "Thông tin hệ thống", "系统公告": "Thông báo hệ thống", + "系统公告已更新": "System announcement updated", + "系统公告更新失败": "Failed to update system announcement", "系统公告管理,可以发布系统通知和重要消息(最多100个,前端显示最新20条)": "Quản lý thông báo hệ thống, bạn có thể xuất bản thông báo hệ thống và tin nhắn quan trọng (tối đa 100, hiển thị 20 tin mới nhất ở giao diện người dùng)", + "系统内存": "System Memory", "系统初始化": "Khởi tạo hệ thống", "系统初始化失败,请重试": "Khởi tạo hệ thống thất bại, vui lòng thử lại", "系统初始化成功,正在跳转...": "Khởi tạo hệ thống thành công, đang chuyển hướng...", @@ -2115,6 +2557,7 @@ "系统名称已更新": "Tên hệ thống đã được cập nhật", "系统名称更新失败": "Cập nhật tên hệ thống thất bại", "系统已为该部署准备 Ollama 镜像与随机 API Key": "System has prepared Ollama image and random API Key for this deployment", + "系统性能监控": "Giám sát hiệu suất hệ thống", "系统提示": "Gợi ý hệ thống", "系统提示覆盖": "Ghi đè lời nhắc hệ thống", "系统提示词": "Từ nhắc hệ thống", @@ -2127,17 +2570,6 @@ "系统监控": "Giám sát hệ thống", "系统管理": "Quản lý hệ thống", "系统管理功能": "Chức năng quản lý hệ thống", - "系统性能监控": "Giám sát hiệu suất hệ thống", - "启用性能监控后,当系统资源使用率超过设定阈值时,将拒绝新的 Relay 请求 (/v1, /v1beta 等),以保护系统稳定性。": "Khi giám sát hiệu suất được bật và mức sử dụng tài nguyên hệ thống vượt quá ngưỡng đã đặt, các yêu cầu Relay mới (/v1, /v1beta, v.v.) sẽ bị từ chối để bảo vệ sự ổn định của hệ thống.", - "启用性能监控": "Bật giám sát hiệu suất", - "超过阈值时拒绝新请求": "Từ chối yêu cầu mới khi vượt ngưỡng", - "CPU 阈值 (%)": "Ngưỡng CPU (%)", - "CPU 使用率超过此值时拒绝请求": "Từ chối yêu cầu khi sử dụng CPU vượt quá giá trị này", - "内存 阈值 (%)": "Ngưỡng bộ nhớ (%)", - "内存使用率超过此值时拒绝请求": "Từ chối yêu cầu khi sử dụng bộ nhớ vượt quá giá trị này", - "磁盘 阈值 (%)": "Ngưỡng đĩa (%)", - "磁盘使用率超过此值时拒绝请求": "Từ chối yêu cầu khi sử dụng đĩa vượt quá giá trị này", - "保存性能设置": "Lưu cài đặt hiệu suất", "系统设置": "Cài đặt hệ thống", "系统访问令牌": "Mã thông báo truy cập hệ thống", "系统负载": "Tải hệ thống", @@ -2150,6 +2582,8 @@ "紧凑列表": "Danh sách thu gọn", "纯文本": "Văn bản thuần túy", "累计消耗": "Tiêu thụ tích lũy", + "累计签到": "Tổng số lần đăng nhập", + "累计获得": "Tổng đã nhận", "线路": "Tuyến", "线路描述": "Mô tả tuyến", "组": "Nhóm", @@ -2169,16 +2603,20 @@ "绑定 Telegram 账户": "Liên kết tài khoản Telegram", "绑定 微信 账户": "Liên kết tài khoản WeChat", "绑定信息": "Thông tin liên kết", + "绑定后会立即生成用户订阅(无需支付),有效期按套餐配置计算。": "Sau khi liên kết, sẽ tạo đăng ký cho người dùng ngay (không cần thanh toán); thời hạn theo cấu hình gói.", "绑定失败": "Liên kết thất bại", "绑定微信账户": "Liên kết tài khoản WeChat", "绑定成功": "Liên kết thành công", "绑定成功!": "Liên kết thành công!", "绑定手机": "Liên kết điện thoại", + "绑定订阅套餐": "Liên kết gói đăng ký", "绑定邮箱": "Liên kết email", "绑定邮箱地址": "Liên kết địa chỉ email", + "结束": "Kết thúc", "结束时间": "Thời gian kết thúc", "结果图片": "Hình ảnh kết quả", "结算": "Thanh toán", + "结算差额": "Settlement Difference", "绘图": "Vẽ", "绘图 ID": "ID vẽ", "绘图任务": "Tác vụ vẽ", @@ -2190,9 +2628,11 @@ "统计": "Thống kê", "统计Tokens": "Thống kê Tokens", "统计信息": "Thông tin thống kê", + "统计已重置": "Statistics reset", "统计次数": "Thống kê số lần", "统计额度": "Thống kê hạn ngạch", "继续": "Tiếp tục", + "维护中": "Maintenance", "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Cache {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", "缓存 Tokens": "Tokens bộ nhớ đệm", "缓存: {{cacheRatio}}": "Bộ nhớ đệm: {{cacheRatio}}", @@ -2200,6 +2640,7 @@ "缓存价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存倍率: {{cacheRatio}})": "Giá bộ nhớ đệm: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (Tỷ lệ bộ nhớ đệm: {{cacheRatio}})", "缓存倍率": "Tỷ lệ bộ nhớ đệm", "缓存倍率 {{cacheRatio}}": "Cache ratio {{cacheRatio}}", + "缓存写": "Ghi bộ nhớ đệm", "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", "缓存创建 Tokens": "Tokens tạo bộ nhớ đệm", "缓存创建: {{cacheCreationRatio}}": "Tạo bộ nhớ đệm: {{cacheCreationRatio}}", @@ -2208,11 +2649,18 @@ "缓存创建: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Cache creation: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", "缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存创建倍率: {{cacheCreationRatio}})": "Giá tạo bộ nhớ đệm: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (Tỷ lệ tạo bộ nhớ đệm: {{cacheCreationRatio}})", "缓存创建价格合计:5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens": "Cache creation price total: 5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens", + "缓存创建倍率": "Tỷ lệ tạo bộ nhớ đệm", "缓存创建倍率 {{cacheCreationRatio}}": "Cache creation ratio {{cacheCreationRatio}}", "缓存创建倍率 1h {{cacheCreationRatio1h}}": "Tỷ lệ tạo bộ nhớ đệm 1h {{cacheCreationRatio1h}}", "缓存创建倍率 5m {{cacheCreationRatio5m}}": "Tỷ lệ tạo bộ nhớ đệm 5m {{cacheCreationRatio5m}}", "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Cache creation ratio 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", + "缓存条目数": "Cache Entries", + "缓存目录": "Cache Directory", + "缓存目录磁盘空间": "Cache Directory Disk Space", + "缓存读": "Đọc bộ nhớ đệm", + "编号:": "ID:", "编辑": "Chỉnh sửa", + "编辑 OAuth 提供商": "Edit OAuth Provider", "编辑API": "Chỉnh sửa API", "编辑产品": "Chỉnh sửa sản phẩm", "编辑供应商": "Chỉnh sửa nhà cung cấp", @@ -2229,6 +2677,7 @@ "编辑渠道": "Chỉnh sửa kênh", "编辑用户": "Chỉnh sửa người dùng", "编辑聊天配置": "Chỉnh sửa cấu hình trò chuyện", + "编辑规则": "Edit Rule", "编辑通道": "Chỉnh sửa kênh", "编辑问答": "Chỉnh sửa hỏi đáp", "缩词": "Rút gọn", @@ -2237,6 +2686,7 @@ "网站域名标识": "Định danh tên miền trang web", "网络": "Mạng", "网络连接失败,请检查网络设置或稍后重试": "Network connection failed, please check network settings or try again later", + "网络连接失败或服务器无响应": "Network connection failed or server not responding", "网络配置": "Network Configuration", "网络错误": "Lỗi mạng", "置信度": "Độ tin cậy", @@ -2252,6 +2702,7 @@ "聊天区域": "Khu vực trò chuyện", "聊天应用名称": "Tên ứng dụng trò chuyện", "聊天应用名称已存在,请使用其他名称": "Tên ứng dụng trò chuyện đã tồn tại, vui lòng sử dụng tên khác", + "聊天数据解析失败": "Failed to parse chat data", "聊天设置": "Cài đặt trò chuyện", "聊天配置": "Cấu hình trò chuyện", "聊天链接配置错误,请联系管理员": "Lỗi cấu hình liên kết trò chuyện, vui lòng liên hệ quản trị viên", @@ -2266,17 +2717,25 @@ "自动刷新中": "Auto refreshing", "自动去重": "Tự động loại bỏ trùng lặp", "自动去重模式": "Chế độ tự động loại bỏ trùng lặp", + "自动填充字段": "Auto-fill Fields", "自动检测": "Tự động phát hiện", "自动模式": "Chế độ tự động", "自动测试所有通道间隔时间": "Khoảng thời gian tự động kiểm tra tất cả các kênh", "自动生成": "Tự động tạo", + "自动生成:": "Auto-generated: ", "自动禁用": "Tự động vô hiệu hóa", "自动禁用关键字": "Từ khóa tự động vô hiệu hóa", "自动禁用关键词": "Từ khóa tự động vô hiệu hóa", "自动禁用开启": "Bật tự động vô hiệu hóa", + "自动禁用状态码": "Auto-disable status codes", + "自动禁用状态码格式不正确": "Invalid auto-disable status code format", "自动续费": "Tự động gia hạn", "自动选择": "Tự động chọn", + "自动重试状态码": "Auto-retry status codes", + "自动重试状态码格式不正确": "Invalid auto-retry status code format", "自定义": "Tùy chỉnh", + "自定义 OAuth 提供商": "Custom OAuth Providers", + "自定义(秒)": "Tùy chỉnh (giây)", "自定义充值数量选项": "Tùy chọn số lượng nạp tiền tùy chỉnh", "自定义充值数量选项不是合法的 JSON 数组": "Tùy chọn số lượng nạp tiền tùy chỉnh không phải là mảng JSON hợp lệ", "自定义变焦-提交": "Custom Zoom-Submit", @@ -2286,8 +2745,10 @@ "自定义模型名称": "Tên mô hình tùy chỉnh", "自定义模式下不可用": "Không khả dụng trong chế độ tùy chỉnh", "自定义渠道": "Kênh tùy chỉnh", + "自定义秒数": "Số giây tùy chỉnh", "自定义规则": "Quy tắc tùy chỉnh", "自定义设置": "Cài đặt tùy chỉnh", + "自定义请求体格式错误,请检查JSON格式": "Custom request body format error, please check JSON format", "自定义请求体模式": "Chế độ nội dung yêu cầu tùy chỉnh", "自定义货币": "Tiền tệ tùy chỉnh", "自定义货币符号": "Ký hiệu tiền tệ tùy chỉnh", @@ -2306,6 +2767,8 @@ "范围": "Phạm vi", "草稿": "Bản nháp", "获取": "Lấy", + "获取 Discovery 配置": "Fetch Discovery Config", + "获取 Discovery 配置失败:": "Failed to fetch Discovery config: ", "获取 io.net API Key": "Get io.net API Key", "获取 OIDC 配置失败,请检查网络状况和 Well-Known URL 是否正确": "Lấy cấu hình OIDC thất bại, vui lòng kiểm tra trạng thái mạng và Well-Known URL có chính xác không", "获取 OIDC 配置成功!": "Lấy cấu hình OIDC thành công!", @@ -2331,12 +2794,17 @@ "获取模型列表": "Lấy danh sách mô hình", "获取模型列表失败": "Lấy danh sách mô hình thất bại", "获取渠道失败:": "Lấy kênh thất bại: ", + "获取用量失败": "Failed to get usage", "获取硬件类型失败: ": "Failed to get hardware types: ", + "获取签到状态失败": "Không thể lấy trạng thái đăng nhập", "获取组列表失败": "Lấy danh sách nhóm thất bại", + "获取绑定信息失败": "Failed to get binding info", + "获取自定义 OAuth 提供商列表失败": "Failed to get custom OAuth provider list", "获取详情失败": "Failed to get details", "获取部署列表失败": "Failed to get deployment list", "获取金额失败": "Lấy số tiền thất bại", "获取验证码": "Lấy mã xác minh", + "获得": "Đã nhận", "菜单": "Menu", "蓝": "Xanh dương", "蓝色": "Màu xanh dương", @@ -2359,6 +2827,13 @@ "覆盖模式": "Chế độ ghi đè", "覆盖模式:将完全替换现有的所有密钥": "Chế độ ghi đè: sẽ thay thế hoàn toàn tất cả các khóa hiện có", "覆盖现有密钥": "Ghi đè khóa hiện có", + "规则": "Rule", + "规则 JSON": "Rule JSON", + "规则 JSON 格式不正确": "Rule JSON format is incorrect", + "规则 ttl_seconds 为 0 时使用。0 表示使用后端默认 TTL:3600 秒。": "Used when rule ttl_seconds is 0. 0 means using backend default TTL: 3600 seconds.", + "规则为 JSON 数组;可视化与 JSON 模式共用同一份数据。": "Rules are JSON arrays; visual and JSON modes share the same data.", + "规则名称(可读性更好,也会出现在管理侧日志中)。": "Rule name (for better readability, also appears in admin logs).", + "规则未找到,请刷新后重试": "Rule not found, please refresh and try again", "角色": "Vai trò", "解析响应数据时发生错误": "Đã xảy ra lỗi khi phân tích dữ liệu phản hồi", "解析密钥文件失败: {{msg}}": "Phân tích tệp khóa thất bại: {{msg}}", @@ -2381,11 +2856,22 @@ "计费规则": "Quy tắc thanh toán", "计费过程": "Quá trình thanh toán", "订单号": "Số đơn hàng", + "订阅": "Đăng ký", + "订阅剩余": "Subscription Remaining", + "订阅套餐": "Gói đăng ký", + "订阅套餐管理": "Quản lý gói đăng ký", + "订阅实例": "Subscription Instance", + "订阅抵扣": "Subscription Deduction", + "订阅管理": "Quản lý đăng ký", + "订阅结算": "Subscription Settlement", + "订阅说明": "Subscription Description", "认证": "Xác thực", "认证失败": "Xác thực thất bại", "认证成功": "Xác thực thành công", + "认证方式": "Auth Style", "认证设置": "Cài đặt xác thực", "讯飞星火": "iFLYTEK Spark", + "讯飞星火认知": "iFlytek Spark", "记录请求与错误日志IP": "Ghi lại IP nhật ký yêu cầu và lỗi", "设备": "Device", "设备类型偏好": "Tùy chọn loại thiết bị", @@ -2417,6 +2903,7 @@ "设置首页内容": "Cài đặt nội dung trang chủ", "设置默认地区和特定模型的专用地区": "Đặt khu vực mặc định và khu vực dành riêng cho các mô hình cụ thể", "设计与开发由": "Thiết kế và phát triển bởi", + "设计版本": "b80c3466cb6feafeb3990c7820e10e50", "访问 io.net 控制台的 API Keys 页面": "Visit the API Keys page of the io.net console", "访问容器": "Access Container", "访问模型部署功能需要先启用 io.net 部署服务": "Accessing model deployment features requires enabling the io.net deployment service first", @@ -2427,20 +2914,29 @@ "该供应商提供多种AI模型,适用于不同的应用场景。": "Nhà cung cấp này cung cấp nhiều mô hình AI, phù hợp với các kịch bản ứng dụng khác nhau.", "该分类下没有可用模型": "Không có mô hình khả dụng trong danh mục này", "该域名已存在于白名单中": "Tên miền đã tồn tại trong danh sách trắng", + "该套餐未配置 Creem": "Gói này chưa cấu hình Creem", + "该套餐未配置 Stripe": "Gói này chưa cấu hình Stripe", "该数据可能不可信,请谨慎使用": "Dữ liệu này có thể không đáng tin cậy, vui lòng sử dụng thận trọng", "该服务器地址将影响支付回调地址以及默认首页展示的地址,请确保正确配置": "Địa chỉ máy chủ này sẽ ảnh hưởng đến địa chỉ gọi lại thanh toán và địa chỉ hiển thị trang chủ mặc định, vui lòng đảm bảo cấu hình chính xác", "该模型存在固定价格与倍率计费方式冲突,请确认选择": "Mô hình này có xung đột giữa giá cố định và phương thức tính phí theo tỷ lệ, vui lòng xác nhận lựa chọn", "该渠道已开启请求透传,参数覆写、模型重定向等 NewAPI 内置功能将失效,非最佳实践。": "Kênh này đã bật truyền qua yêu cầu; các tính năng tích hợp của NewAPI như ghi đè tham số và chuyển hướng mô hình sẽ bị vô hiệu hóa. Đây không phải là thực hành tốt nhất.", "该渠道已开启请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "Kênh này đã bật truyền qua yêu cầu. Các tính năng tích hợp của NewAPI như ghi đè tham số, chuyển hướng mô hình và thích ứng kênh sẽ bị vô hiệu hóa. Đây không phải là thực hành tốt nhất. Nếu phát sinh vấn đề, vui lòng không gửi issue.", + "该规则未启用“作用域:包含规则名称”,无法按规则清空缓存。": "This rule has not enabled \"Scope: Include Rule Name\", cannot clear cache by rule.", + "该规则的缓存保留时长;0 表示使用默认 TTL:": "Cache retention duration for this rule; 0 uses the default TTL:", + "该记录不包含可用的 token 统计口径。": "This record does not contain available token statistics.", "详情": "Chi tiết", "详细信息": "Thông tin chi tiết", "语言": "Ngôn ngữ", + "语言偏好": "Language Preference", + "语言偏好已保存": "Language preference saved", "语言模型": "Mô hình ngôn ngữ", "语言设置": "Cài đặt ngôn ngữ", "语音输入": "Đầu vào giọng nói", "语音输出": "Đầu ra giọng nói", "说明": "Mô tả", "说明:": "Mô tả: ", + "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。": "Lưu ý: Bài kiểm tra trên trang này sử dụng yêu cầu không streaming. Nếu kênh chỉ hỗ trợ phản hồi streaming, bài kiểm tra có thể thất bại. Vui lòng dựa vào sử dụng thực tế.", + "说明:生成结果是可直接粘贴到渠道密钥里的 JSON(包含 access_token / refresh_token / account_id)。": "Note: The generated result is a JSON that can be directly pasted into the channel secret (contains access_token / refresh_token / account_id).", "说明信息": "Thông tin mô tả", "请上传": "Vui lòng tải lên", "请上传图片": "Vui lòng tải lên hình ảnh", @@ -2451,15 +2947,22 @@ "请使用 Project 为 io.cloud 的密钥": "Please use a key with Project set to io.cloud", "请先在设置中启用图片功能": "Vui lòng bật chức năng hình ảnh trong cài đặt trước", "请先填写 API Key": "Please fill in API Key first", + "请先填写 Discovery URL 或 Issuer URL": "Please fill in Discovery URL or Issuer URL first", + "请先填写 Issuer URL,以自动生成完整的端点 URL": "Please fill in Issuer URL first to auto-generate full endpoint URLs", "请先填写 Ollama API 地址": "Please fill in Ollama API address first", "请先填写服务器地址": "Vui lòng điền địa chỉ máy chủ trước", "请先登录": "Vui lòng đăng nhập trước", "请先登录!": "Vui lòng đăng nhập trước!", + "请先粘贴回调 URL": "Please paste callback URL first", "请先输入密钥": "Vui lòng nhập khóa trước", "请先选择同步渠道": "Vui lòng chọn kênh đồng bộ trước", "请先选择模型!": "Vui lòng chọn mô hình trước!", "请先选择硬件类型": "Please select hardware type first", + "请先选择要删除的API信息": "Please select the API info to delete first", "请先选择要删除的令牌!": "Vui lòng chọn mã thông báo để xóa trước!", + "请先选择要删除的分类": "Please select the category to delete first", + "请先选择要删除的常见问答": "Please select the FAQ to delete first", + "请先选择要删除的系统公告": "Please select the announcement to delete first", "请先选择要删除的通道!": "Vui lòng chọn kênh để xóa trước!", "请先选择要设置标签的渠道!": "Vui lòng chọn kênh để đặt thẻ trước!", "请先选择需要批量设置的模型": "Vui lòng chọn các mô hình cần cài đặt hàng loạt trước", @@ -2473,8 +2976,12 @@ "请勿重复提交": "Vui lòng không gửi lại", "请在系统设置页面编辑分组倍率以添加新的分组:": "Vui lòng chỉnh sửa tỷ lệ nhóm trên trang cài đặt hệ thống để thêm nhóm mới:", "请填写": "Vui lòng điền", + "请填写完整的API信息": "Please fill in complete API info", "请填写完整的产品信息": "Vui lòng điền đầy đủ thông tin sản phẩm", + "请填写完整的公告信息": "Please fill in complete announcement info", + "请填写完整的分类信息": "Please fill in complete category info", "请填写完整的管理员账号信息": "Vui lòng điền đầy đủ thông tin tài khoản quản trị viên", + "请填写完整的问答信息": "Please fill in complete FAQ info", "请填写密钥": "Vui lòng điền khóa", "请填写正确的邮箱地址": "Vui lòng điền địa chỉ email chính xác", "请填写渠道名称和渠道密钥!": "Vui lòng điền tên kênh và khóa kênh!", @@ -2495,6 +3002,9 @@ "请求 URL": "URL yêu cầu", "请求体": "Thân yêu cầu", "请求体 JSON": "Nội dung yêu cầu JSON", + "请求体内存缓存": "Request Body Memory Cache", + "请求体磁盘缓存": "Request Body Disk Cache", + "请求体超过此大小时使用磁盘缓存": "Use disk cache when request body exceeds this size", "请求内容": "Nội dung yêu cầu", "请求列表": "Danh sách yêu cầu", "请求参数": "Tham số yêu cầu", @@ -2506,6 +3016,7 @@ "请求失败,请重试": "Yêu cầu thất bại, vui lòng thử lại", "请求头": "Tiêu đề yêu cầu", "请求头覆盖": "Ghi đè tiêu đề yêu cầu", + "请求头覆盖必须是合法的 JSON 格式!": "Header override must be valid JSON format!", "请求并计费模型": "Mô hình yêu cầu và tính phí", "请求成功": "Yêu cầu thành công", "请求成功!": "Yêu cầu thành công!", @@ -2519,6 +3030,7 @@ "请求超时": "Yêu cầu hết thời gian", "请求超时,请刷新页面后重新发起 GitHub 登录": "Hết thời gian chờ, vui lòng làm mới trang và đăng nhập GitHub lại", "请求路径": "Đường dẫn yêu cầu", + "请求转换": "Request conversion", "请求量": "Khối lượng yêu cầu", "请求预扣费额度": "Hạn ngạch khấu trừ trước yêu cầu", "请求频率": "Tần suất yêu cầu", @@ -2532,6 +3044,8 @@ "请确认管理员密码": "Vui lòng xác nhận mật khẩu quản trị viên", "请稍候...": "Vui lòng đợi...", "请稍后几秒重试,Turnstile 正在检查用户环境!": "Vui lòng thử lại sau vài giây, Turnstile đang kiểm tra môi trường người dùng!", + "请立刻修改默认密码!": "Please change the default password immediately!", + "请粘贴完整回调 URL(包含 code 与 state)": "Please paste the full callback URL (containing code and state)", "请联系管理员在系统设置中配置API信息": "Vui lòng liên hệ quản trị viên để cấu hình thông tin API trong cài đặt hệ thống", "请联系管理员在系统设置中配置Uptime": "Vui lòng liên hệ quản trị viên để cấu hình Uptime trong cài đặt hệ thống", "请联系管理员在系统设置中配置公告信息": "Vui lòng liên hệ quản trị viên để cấu hình thông tin thông báo trong cài đặt hệ thống", @@ -2545,14 +3059,24 @@ "请输入": "Vui lòng nhập", "请输入 API Key,一行一个,格式:APIKey|Region": "Enter API Key, one per line, format: APIKey|Region", "请输入 API Key,格式:APIKey|Region": "Enter API Key, format: APIKey|Region", + "请输入 Authorization Endpoint": "Please enter Authorization Endpoint", "请输入 AZURE_OPENAI_ENDPOINT,例如:https://docs-test-001.openai.azure.com": "Vui lòng nhập AZURE_OPENAI_ENDPOINT, ví dụ: https://docs-test-001.openai.azure.com", + "请输入 Client ID": "Please enter Client ID", + "请输入 Client Secret": "Please enter Client Secret", "请输入 ID": "Vui lòng nhập ID", "请输入 io.net API Key": "Please enter io.net API Key", "请输入 io.net API Key(敏感信息不显示)": "Please enter io.net API Key (sensitive information not displayed)", + "请输入 JSON 格式的 OAuth 凭据,例如:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}": "Please enter OAuth credentials in JSON format, e.g.:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}", "请输入 JSON 格式的密钥内容,例如:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}": "Vui lòng nhập nội dung khóa ở định dạng JSON, ví dụ:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}", "请输入 OIDC 的 Well-Known URL": "Vui lòng nhập Well-Known URL của OIDC", + "请输入 Slug": "Please enter Slug", + "请输入 Token Endpoint": "Please enter Token Endpoint", "请输入 URL": "Vui lòng nhập URL", + "请输入 User Info Endpoint": "Please enter User Info Endpoint", + "请输入6位验证码": "Please enter 6-digit verification code", "请输入6位验证码或8位备用码": "Vui lòng nhập mã xác minh 6 chữ số hoặc mã dự phòng 8 chữ số", + "请输入8位备用码": "Please enter 8-digit backup code", + "请输入Account ID,例如:d6b5da8hk1awo8nap34ube6gh": "Please enter Account ID, e.g.: d6b5da8hk1awo8nap34ube6gh", "请输入API地址": "Vui lòng nhập địa chỉ API", "请输入API地址!": "Vui lòng nhập địa chỉ API!", "请输入Bark推送URL": "Vui lòng nhập URL đẩy Bark", @@ -2594,6 +3118,7 @@ "请输入域名": "Vui lòng nhập tên miền", "请输入填充值": "Vui lòng nhập giá trị điền", "请输入备注(仅管理员可见)": "Vui lòng nhập ghi chú (chỉ quản trị viên mới thấy)", + "请输入套餐标题": "Vui lòng nhập tiêu đề gói", "请输入完整的 JSON 格式密钥内容": "Vui lòng nhập nội dung khóa định dạng JSON đầy đủ", "请输入完整的URL,例如:https://api.openai.com/v1/chat/completions": "Vui lòng nhập URL đầy đủ, ví dụ: https://api.openai.com/v1/chat/completions", "请输入完整的URL链接": "Vui lòng nhập liên kết URL đầy đủ", @@ -2604,6 +3129,7 @@ "请输入密钥,一行一个,格式:AccessKey|SecretAccessKey|Region": "Enter keys one per line, format: AccessKey|SecretAccessKey|Region", "请输入密钥!": "Vui lòng nhập khóa!", "请输入延长时长": "Please enter extension duration", + "请输入总额度": "Vui lòng nhập tổng hạn mức", "请输入您的密码": "Vui lòng nhập mật khẩu của bạn", "请输入您的用户名以确认删除": "Vui lòng nhập tên người dùng của bạn để xác nhận xóa", "请输入您的用户名或邮箱地址": "Vui lòng nhập tên người dùng hoặc địa chỉ email của bạn", @@ -2626,7 +3152,9 @@ "请输入新的部署名称": "Please enter new deployment name", "请输入旧密码": "Vui lòng nhập mật khẩu cũ", "请输入显示名称": "Vui lòng nhập tên hiển thị", + "请输入智能体ID,例如:7342866812345": "Please enter Agent ID, e.g.: 7342866812345", "请输入有效的JSON格式的请求体。您可以参考预览面板中的默认请求体格式。": "Vui lòng nhập nội dung yêu cầu có định dạng JSON hợp lệ. Bạn có thể tham khảo định dạng nội dung yêu cầu mặc định trong bảng xem trước.", + "请输入有效的URL地址": "Please enter a valid URL", "请输入有效的数字": "Vui lòng nhập số hợp lệ", "请输入有效的镜像地址": "Please enter a valid image address", "请输入标签名称": "Vui lòng nhập tên thẻ", @@ -2644,11 +3172,14 @@ "请输入生成数量": "Vui lòng nhập số lượng tạo", "请输入用户 ID": "Vui lòng nhập ID người dùng", "请输入用户名": "Vui lòng nhập tên người dùng", + "请输入用户名和密码!": "Please enter username and password!", "请输入用户名或邮箱": "Vui lòng nhập tên người dùng hoặc email", "请输入登录密码": "Vui lòng nhập mật khẩu đăng nhập", + "请输入知识库 ID,例如:123456": "Please enter Knowledge Base ID, e.g.: 123456", "请输入确认密码": "Vui lòng nhập mật khẩu xác nhận", "请输入私有令牌": "Vui lòng nhập mã thông báo riêng tư", "请输入私有部署地址,格式为:https://fastgpt.run/api/openapi": "Vui lòng nhập địa chỉ triển khai riêng, định dạng: https://fastgpt.run/api/openapi", + "请输入秒数": "Vui lòng nhập số giây", "请输入简介": "Vui lòng nhập phần giới thiệu", "请输入管理员密码": "Vui lòng nhập mật khẩu quản trị viên", "请输入管理员用户名": "Vui lòng nhập tên người dùng quản trị viên", @@ -2660,6 +3191,7 @@ "请输入补全倍率": "Vui lòng nhập tỷ lệ hoàn thành", "请输入要延长的小时数": "Please enter the number of hours to extend", "请输入要设置的标签名称": "Vui lòng nhập tên thẻ cần đặt", + "请输入认证器应用显示的验证码完成登录": "Enter the verification code from your authenticator app to complete login", "请输入认证器验证码": "Vui lòng nhập mã xác minh trình xác thực", "请输入认证器验证码或备用码": "Vui lòng nhập mã xác minh trình xác thực hoặc mã dự phòng", "请输入说明": "Vui lòng nhập mô tả", @@ -2700,6 +3232,7 @@ "请选择多密钥使用策略": "Vui lòng chọn chính sách sử dụng đa khóa", "请选择密钥更新模式": "Vui lòng chọn chế độ cập nhật khóa", "请选择密钥格式": "Vui lòng chọn định dạng khóa", + "请选择支付方式": "Please select a payment method", "请选择文件": "Vui lòng chọn tệp", "请选择日志记录时间": "Vui lòng chọn thời gian ghi nhật ký", "请选择日期": "Vui lòng chọn ngày", @@ -2717,6 +3250,7 @@ "请选择要上传的文件": "Vui lòng chọn tệp để tải lên", "请选择要删除的记录": "Vui lòng chọn hồ sơ để xóa", "请选择要导出的数据": "Vui lòng chọn dữ liệu để xuất", + "请选择订阅套餐": "Please select a subscription plan", "请选择该令牌支持的模型,留空支持所有模型": "Vui lòng chọn các mô hình được mã thông báo này hỗ trợ, để trống để hỗ trợ tất cả các mô hình", "请选择该渠道所支持的模型": "Vui lòng chọn mô hình được kênh này hỗ trợ", "请选择该渠道所支持的模型,留空则不更改": "Vui lòng chọn mô hình được kênh này hỗ trợ, để trống sẽ không thay đổi", @@ -2735,6 +3269,7 @@ "警告:启用保活后,如果已经写入保活数据后渠道出错,系统无法重试,如果必须开启,推荐设置尽可能大的Ping间隔": "Cảnh báo: Sau khi bật giữ kết nối, nếu kênh bị lỗi sau khi dữ liệu giữ kết nối đã được ghi, hệ thống không thể thử lại. Nếu bắt buộc phải bật, nên đặt khoảng thời gian Ping càng lớn càng tốt", "警告:禁用两步验证将永久删除您的验证设置和所有备用码,此操作不可撤销!": "Cảnh báo: Vô hiệu hóa xác thực hai yếu tố sẽ xóa vĩnh viễn cài đặt xác minh và tất cả mã dự phòng của bạn, thao tác này không thể hoàn tác!", "豆包": "Doubao", + "豆包视频": "Doubao Video", "财务": "Tài chính", "账单": "Hóa đơn", "账号": "Tài khoản", @@ -2755,12 +3290,17 @@ "账户类型": "Loại tài khoản", "账户绑定": "Liên kết tài khoản", "账户绑定、安全设置和身份验证": "Liên kết tài khoản, cài đặt bảo mật và xác minh danh tính", + "账户绑定管理": "Account Binding Management", "账户统计": "Thống kê tài khoản", "账户设置": "Cài đặt tài khoản", "账户详情": "Chi tiết tài khoản", "货币": "Tiền tệ", "货币单位": "Đơn vị tiền tệ", + "购买上限": "Giới hạn mua", "购买兑换码": "Mua mã đổi thưởng", + "购买套餐后即可享受模型权益": "Mua gói để nhận quyền lợi mô hình", + "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。": "Mua hoặc thêm thủ công đăng ký sẽ nâng cấp lên nhóm này. Khi gói hết hạn/vô hiệu/xóa, sẽ quay lại nhóm trước. Việc quay lại không áp dụng ngay và thường mất vài phút.", + "购买订阅套餐": "Mua gói đăng ký", "费率": "Tỷ lệ", "费用信息": "Cost Information", "费用预估": "Cost Estimate", @@ -2771,10 +3311,14 @@ "起始时间": "Thời gian bắt đầu", "超级管理员": "Siêu quản trị viên", "超级管理员未设置充值链接!": "Siêu quản trị viên chưa đặt liên kết nạp tiền!", + "超过阈值时拒绝新请求": "Từ chối yêu cầu mới khi vượt ngưỡng", + "距离重置:": "Time until reset:", "跟随日志": "Follow Logs", "跟随系统主题设置": "Theo cài đặt chủ đề hệ thống", "跨分组": "Giữa các nhóm", "跨分组重试": "Thử lại giữa các nhóm", + "路径正则": "Path Regex", + "路径正则(每行一个)": "Path Regex (one per line)", "跳转": "Nhảy", "转账": "Chuyển tiền", "转账成功": "Chuyển tiền thành công", @@ -2814,7 +3358,9 @@ "输入要添加的邮箱域名": "Nhập tên miền email cần thêm", "输入认证器应用显示的6位数字验证码": "Nhập mã xác minh 6 chữ số hiển thị trên ứng dụng xác thực", "输入邮箱地址": "Nhập địa chỉ email", + "输入金额": "Nhập số tiền", "输入项目名称,按回车添加": "Nhập tên dự án, nhấn Enter để thêm", + "输入额度": "Nhập hạn ngạch", "输入验证码": "Nhập mã xác minh", "输入验证码完成设置": "Nhập mã xác minh để hoàn tất cài đặt", "输出": "Đầu ra", @@ -2823,6 +3369,9 @@ "输出价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "Giá đầu ra: {{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (Tỷ lệ hoàn thành: {{completionRatio}})", "输出倍率 {{completionRatio}}": "Output ratio {{completionRatio}}", "边栏设置": "Cài đặt thanh bên", + "迁移失败: ": "Migration failed: ", + "迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。": "Data format conversion is handled automatically during migration. Old config will be cleared after migration, please backup in database before migrating.", + "过期于": "Hết hạn vào", "过期时间": "Thời gian hết hạn", "过期时间不能早于当前时间!": "Thời gian hết hạn không thể sớm hơn thời gian hiện tại!", "过期时间快捷设置": "Cài đặt nhanh thời gian hết hạn", @@ -2834,20 +3383,23 @@ "运行时长(小时)": "Runtime Duration (hours)", "运行状态": "Trạng thái chạy", "运行环境": "Môi trường chạy", + "近 30 天": "Last 30 Days", + "近 7 天": "Last 7 Days", "返回": "Quay lại", "返回上级": "Quay lại cấp trên", "返回修改": "Go back and edit", "返回列表": "Quay lại danh sách", "返回登录": "Quay lại đăng nhập", "返回首页": "Quay lại trang chủ", - "违规扣费金额": "Số tiền trừ phí vi phạm", - "这是重复键中的最后一个,其值将被使用": "Đây là khóa cuối cùng trong số các khóa trùng lặp và giá trị của nó sẽ được sử dụng", - "这是基础金额,实际扣费 = 基础金额 x 系统分组倍率。": "Đây là số tiền cơ bản. Số tiền trừ thực tế = số tiền cơ bản × tỷ lệ nhóm hệ thống.", "这将删除超过 10 分钟未使用的临时缓存文件": "Điều này sẽ xóa các tệp cache tạm thời không được sử dụng trong hơn 10 phút", + "这是基础金额,实际扣费 = 基础金额 x 系统分组倍率。": "Đây là số tiền cơ bản. Số tiền trừ thực tế = số tiền cơ bản × tỷ lệ nhóm hệ thống.", + "这是重复键中的最后一个,其值将被使用": "Đây là khóa cuối cùng trong số các khóa trùng lặp và giá trị của nó sẽ được sử dụng", "进入": "Nhập", "进度": "Tiến độ", "进行中": "Đang tiến hành", "进行该操作时,可能导致渠道访问错误,请仅在数据库出现问题时使用": "Khi thực hiện thao tác này, có thể gây ra lỗi truy cập kênh. Vui lòng chỉ sử dụng khi có vấn đề với cơ sở dữ liệu.", + "违规扣费": "Violation Charge", + "违规扣费金额": "Số tiền trừ phí vi phạm", "连接保活设置": "Cài đặt giữ kết nối", "连接已断开": "Kết nối đã ngắt", "连接测试中...": "Testing connection...", @@ -2857,6 +3409,7 @@ "退出": "Thoát", "退出全屏": "Thoát toàn màn hình", "退出登录": "Đăng xuất", + "退款": "Hoàn tiền", "适用于个人使用的场景,不需要设置模型价格": "Phù hợp cho mục đích sử dụng cá nhân, không cần đặt giá mô hình.", "适用于为多个用户提供服务的场景": "Phù hợp cho các kịch bản cung cấp dịch vụ cho nhiều người dùng.", "适用于展示系统功能的场景,提供基础功能演示": "Phù hợp cho các kịch bản hiển thị chức năng hệ thống, cung cấp bản demo chức năng cơ bản.", @@ -2874,6 +3427,7 @@ "选择图片": "Chọn hình ảnh", "选择头像": "Chọn ảnh đại diện", "选择容器": "Select Container", + "选择您的首选界面语言,设置将自动保存并同步到所有设备": "Select your preferred interface language. Settings will be saved automatically and synced across all devices", "选择成功": "Chọn thành công", "选择支付方式": "Chọn phương thức thanh toán", "选择支持的认证设备类型": "Chọn loại thiết bị xác thực được hỗ trợ", @@ -2895,9 +3449,11 @@ "选择组类型": "Vui lòng chọn loại nhóm", "选择要覆盖的冲突项": "Chọn các mục xung đột để ghi đè", "选择角色": "Chọn vai trò", + "选择订阅套餐": "Chọn gói đăng ký", "选择语言": "Chọn ngôn ngữ", "选择过期时间(可选,留空为永久)": "Chọn thời gian hết hạn (tùy chọn, để trống là vĩnh viễn)", "选择部署位置(可多选)": "Select deployment location(s) (multiple selections allowed)", + "选择预设模板(可选)": "Select Preset Template (optional)", "选项": "Tùy chọn", "透传请求体": "Truyền qua thân yêu cầu", "通义千问": "Qwen", @@ -2953,6 +3509,7 @@ "邮箱域名格式不正确,请输入有效的域名,如 gmail.com": "Định dạng tên miền email không chính xác, vui lòng nhập tên miền hợp lệ như gmail.com", "邮箱域名白名单": "Danh sách trắng tên miền email", "邮箱域名白名单格式不正确": "Định dạng danh sách trắng tên miền email không chính xác", + "邮箱字段(可选)": "Email Field (optional)", "邮箱已激活": "Email đã được kích hoạt", "邮箱已绑定": "Email đã được liên kết", "邮箱已验证": "Email đã được xác minh", @@ -2995,6 +3552,8 @@ "配置列表": "Danh sách cấu hình", "配置名称": "Tên cấu hình", "配置和消息已全部重置": "Cấu hình và tin nhắn đã được đặt lại hoàn toàn", + "配置套餐的有效时长": "Cấu hình thời lượng hiệu lực của gói", + "配置如何从用户信息 API 响应中提取用户数据,支持 JSONPath 语法": "Configure how to extract user data from user info API response, supports JSONPath syntax", "配置完成后刷新页面即可使用模型部署功能": "After configuration is complete, refresh the page to use the model deployment feature", "配置导入成功": "Nhập cấu hình thành công", "配置已保存": "Cấu hình đã lưu", @@ -3009,9 +3568,11 @@ "配置模型部署服务提供商的API密钥和启用状态": "Configure the API key and enabled status of the model deployment service provider", "配置登录注册": "Cấu hình Đăng nhập/Đăng ký", "配置管理": "Quản lý cấu hình", + "配置自定义 OAuth 提供商,支持 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 协议的身份提供商": "Configure custom OAuth providers, supports GitHub Enterprise, GitLab, Gitea, Nextcloud, Keycloak, ORY and other OAuth 2.0 compatible identity providers", "配置设置": "Cài đặt cấu hình", "配置详情": "Chi tiết cấu hình", "配置说明": "Hướng dẫn cấu hình", + "配置迁移确认": "Config Migration Confirmation", "配置邮箱域名白名单": "Cấu hình danh sách trắng tên miền email", "重发": "Gửi lại", "重发验证码": "Gửi lại mã xác minh", @@ -3035,15 +3596,19 @@ "重置 2FA": "Đặt lại 2FA", "重置 Passkey": "Đặt lại Passkey", "重置为默认": "Đặt lại về mặc định", + "重置周期": "Chu kỳ đặt lại", + "重置失败": "Reset failed", "重置密码": "Đặt lại mật khẩu", "重置密码链接已发送到您的邮箱": "Liên kết đặt lại mật khẩu đã được gửi đến email của bạn", "重置密钥": "Đặt lại khóa", "重置成功": "Đặt lại thành công", "重置所有": "Đặt lại tất cả", "重置数据库": "Đặt lại cơ sở dữ liệu", + "重置时间:": "Reset time:", "重置模型倍率": "Đặt lại tỷ lệ mô hình", "重置用户密码": "Đặt lại mật khẩu người dùng", "重置系统": "Đặt lại hệ thống", + "重置统计": "Reset Stats", "重置设置": "Đặt lại cài đặt", "重置选项": "Đặt lại tùy chọn", "重置邮件发送成功,请检查邮箱!": "Email đặt lại đã được gửi thành công, vui lòng kiểm tra email!", @@ -3062,14 +3627,13 @@ "销毁容器失败": "Failed to destroy container", "锁定": "Khóa", "错误": "Lỗi", - "退款": "Hoàn tiền", + "错误:": "Error: ", + "错误:服务器内部错误,请联系管理员!": "Error: Internal server error, please contact administrator!", + "错误:请求次数过多,请稍后再试!": "Error: Too many requests, please try again later!", "错误信息": "Thông tin lỗi", "错误日志": "Nhật ký lỗi", "错误码": "Mã lỗi", "错误详情": "Chi tiết lỗi", - "异步任务退款": "Hoàn tiền tác vụ bất đồng bộ", - "任务ID": "ID tác vụ", - "失败原因": "Nguyên nhân thất bại", "键为分组名称,值为另一个 JSON 对象,键为分组名称,值为该分组的用户的特殊分组倍率,例如:{\"vip\": {\"default\": 0.5, \"test\": 1}},表示 vip 分组的用户在使用default分组的令牌时倍率为0.5,使用test分组时倍率为1": "Khóa là tên nhóm và giá trị là một đối tượng JSON khác. Khóa là tên nhóm và giá trị là tỷ lệ nhóm đặc biệt cho người dùng trong nhóm đó. Ví dụ: {\"vip\": {\"default\": 0.5, \"test\": 1}} có nghĩa là người dùng trong nhóm vip có tỷ lệ 0.5 khi sử dụng mã thông báo từ nhóm default và tỷ lệ 1 khi sử dụng mã thông báo từ nhóm test.", "键为原状态码,值为要复写的状态码,仅影响本地判断": "Khóa là mã trạng thái gốc và giá trị là mã trạng thái cần ghi đè, chỉ ảnh hưởng đến phán đoán cục bộ", "键为用户分组名称,值为操作映射对象。内层键以\"+:\"开头表示添加指定分组(键值为分组名称,值为描述),以\"-:\"开头表示移除指定分组(键值为分组名称),不带前缀的键直接添加该分组。例如:{\"vip\": {\"+:premium\": \"高级分组\", \"special\": \"特殊分组\", \"-:default\": \"默认分组\"}},表示 vip 分组的用户可以使用 premium 和 special 分组,同时移除 default 分组的访问权限": "Keys are user group names and values are operation mappings. Inner keys prefixed with \"+:\" add the specified group (key is the group name, value is the description); keys prefixed with \"-:\" remove the specified group; keys without a prefix add that group directly. Example: {\"vip\": {\"+:premium\": \"Advanced group\", \"special\": \"Special group\", \"-:default\": \"Default group\"}} means vip users can access the premium and special groups while removing access to the default group.", @@ -3088,14 +3652,19 @@ "长按": "Nhấn và giữ", "门槛": "Ngưỡng", "闪购": "Flash Sale", + "问答已删除,请及时点击”保存设置”进行保存": "FAQ deleted, please click \"Save Settings\" to save", + "问答已更新,请及时点击”保存设置”进行保存": "FAQ updated, please click \"Save Settings\" to save", + "问答已添加,请及时点击”保存设置”进行保存": "FAQ added, please click \"Save Settings\" to save", "问题标题": "Tiêu đề câu hỏi", "阅读": "Đọc", "阅读更多": "Đọc thêm", "队列中": "Trong hàng đợi", + "阿里通义千问": "Alibaba Tongyi Qianwen", "降低您账户的安全性": "Giảm bảo mật tài khoản của bạn", "降级": "Hạ cấp", "限制周期": "Chu kỳ giới hạn", "限制周期统一使用上方配置的“限制周期”值。": "Chu kỳ giới hạn sử dụng thống nhất giá trị \"Chu kỳ giới hạn\" được cấu hình ở trên.", + "限购": "Giới hạn mua", "隐私政策": "Chính sách bảo mật", "隐私政策已更新": "Chính sách bảo mật đã được cập nhật", "隐私政策更新失败": "Cập nhật chính sách bảo mật thất bại", @@ -3113,58 +3682,82 @@ "需要重新完整设置才能再次启用": "Cần thiết lập lại hoàn toàn để bật lại", "非必要,不建议启用模型限制": "Không cần thiết, không nên bật giới hạn mô hình", "非流": "không luồng", + "音乐预览": "Xem trước nhạc", "音频倍率(仅部分模型支持该计费)": "Tỷ lệ âm thanh (chỉ được hỗ trợ bởi một số mô hình để tính phí)", "音频提示 {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}": "Gợi ý âm thanh {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + Hoàn thành âm thanh {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}", "音频提示价格:{{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens (音频倍率: {{audioRatio}})": "Giá gợi ý âm thanh: {{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens (Tỷ lệ âm thanh: {{audioRatio}})", + "音频无法播放": "Không thể phát âm thanh", "音频补全价格:{{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens (音频补全倍率: {{audioCompRatio}})": "Giá hoàn thành âm thanh: {{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens (Tỷ lệ hoàn thành âm thanh: {{audioCompRatio}})", "音频补全倍率(仅部分模型支持该计费)": "Tỷ lệ hoàn thành âm thanh (chỉ được hỗ trợ bởi một số mô hình để tính phí)", "音频输入相关的倍率设置,键为模型名称,值为倍率": "Cài đặt tỷ lệ liên quan đến đầu vào âm thanh, khóa là tên mô hình, giá trị là tỷ lệ", "音频输出补全相关的倍率设置,键为模型名称,值为倍率": "Cài đặt tỷ lệ liên quan đến hoàn thành đầu ra âm thanh, khóa là tên mô hình, giá trị là tỷ lệ", "页脚": "Chân trang", + "页脚内容已更新": "Footer content updated", + "页脚内容更新失败": "Failed to update footer content", "页面未找到,请检查您的浏览器地址是否正确": "Không tìm thấy trang, vui lòng kiểm tra xem địa chỉ trình duyệt của bạn có chính xác không", "顶栏管理": "Quản lý thanh tiêu đề", "项目": "Dự án", "项目内容": "Nội dung dự án", "项目操作按钮组": "Nhóm nút hành động dự án", "预估总费用": "Estimated Total Cost", + "预估总额度": "Tổng hạn mức ước tính", "预估费用仅供参考,实际费用可能略有差异": "Estimated cost is for reference only, actual cost may vary slightly", "预填组管理": "Quản lý nhóm điền sẵn", + "预扣": "Pre-charge", "预览失败": "Xem trước thất bại", "预览更新": "Xem trước cập nhật", "预览请求体": "Xem trước thân yêu cầu", "预计结束": "Estimated End", + "预设模板": "Preset Template", "预警阈值必须为正数": "Ngưỡng cảnh báo phải là số dương", "频率惩罚,减少重复词汇的出现": "Phạt tần suất, giảm sự lặp lại của từ", "频率限制的周期(分钟)": "Chu kỳ giới hạn tần suất (phút)", "颜色": "Màu sắc", "额度": "Hạn ngạch", - "输入额度": "Nhập hạn ngạch", - "输入金额": "Nhập số tiền", - "仅用于换算,实际保存的是额度": "Chỉ dùng để quy đổi, giá trị lưu thực tế là hạn ngạch", + "额度充值": "Nạp hạn mức", "额度必须大于0": "Hạn ngạch phải lớn hơn 0", "额度提醒阈值": "Ngưỡng nhắc nhở hạn ngạch", "额度查询接口返回令牌额度而非用户额度": "Giao diện truy vấn hạn ngạch trả về hạn ngạch mã thông báo thay vì hạn ngạch người dùng", "额度设置": "Cài đặt hạn ngạch", + "额度重置": "Đặt lại hạn mức", "额度预警阈值": "Ngưỡng cảnh báo hạn ngạch", "首尾生视频": "Video tạo đầu-đuôi", "首页": "Trang chủ", "首页内容": "Nội dung trang chủ", + "首页内容已更新": "Homepage content updated", + "首页内容更新失败": "Failed to update homepage content", "验证": "Xác minh", "验证 Passkey": "Xác minh Passkey", "验证失败,请重试": "Xác minh thất bại, vui lòng thử lại", + "验证并登录": "Verify and Login", "验证成功": "Xác minh thành công", "验证数据库连接状态": "Xác minh trạng thái kết nối cơ sở dữ liệu", "验证码": "Mã xác minh", + "验证码发送成功,请检查你的邮箱!": "Verification code sent, please check your email!", "验证码发送成功,请检查邮箱!": "Mã xác minh đã được gửi thành công, vui lòng kiểm tra email!", + "验证码必须是6位数字": "Verification code must be 6 digits", "验证设置": "Cài đặt xác minh", "验证身份": "Xác minh danh tính", "验证配置错误": "Lỗi cấu hình xác minh", + "高危操作确认": "High-risk operation confirmation", + "高危状态码重试风险告知与免责声明Markdown": "### ⚠️ High-Risk Operation: Risk Notice and Disclaimer for 504/524 Retry\nBy default, this project does not retry for status codes `400` (bad request), `504` (gateway timeout), and `524` (timeout occurred).\n In many cases, 504 and 524 mean the request has reached the upstream AI service and processing has started, but the connection was closed due to long processing time.\n\nEnabling redirection/retry for these timeout status codes is a **high-risk operation**. Before enabling it, you must read and understand the consequences below:\n\n#### 1. Core Risks (Read Carefully)\n1. 💸 Duplicate/multiple billing risk: Most upstream AI providers **still charge** for requests that started processing but got interrupted by network timeout (504/524). If retry is triggered, a new upstream request will be sent, which can lead to **duplicate or multiple charges**.\n2. ⏳ Severe client timeout: If a single request already timed out, adding retries can multiply total latency and cause severe or unacceptable timeout behavior for your final client/caller.\n3. 💥 Request backlog and system crash risk: Forcing retries on timeout requests keeps threads and connections occupied for longer. Under high concurrency, this can cause serious backlog, exhaust system resources, trigger a cascading failure, and crash your proxy service.\n\n#### 2. Risk Acknowledgement\nIf you still choose to enable this feature, you acknowledge all of the following:", + "高危状态码重试风险确认输入文本": "I understand the duplicate billing and crash risks, and confirm enabling it.", + "高危状态码重试风险确认项1": "I have fully read and understood the risks and fully understand the destructive consequences of forcing retries for status codes 504 and 524.", + "高危状态码重试风险确认项2": "I have communicated with the upstream provider and confirmed that the timeout issue is an upstream bottleneck and cannot be resolved upstream at this time.", + "高危状态码重试风险确认项3": "I voluntarily accept all duplicate/multiple billing risks and will not file issues or complaints in this project repository regarding billing anomalies caused by this retry behavior.", + "高危状态码重试风险确认项4": "I voluntarily accept system stability risks, including severe client timeout and possible service crash. Any consequences caused by enabling this feature are my own responsibility.", + "高危状态码重试风险输入不匹配提示": "The input does not match the required text", + "高危状态码重试风险输入框占位文案": "Please type the exact text above", + "高延迟": "High Latency", "高级设置": "Cài đặt nâng cao", + "高级选项": "Advanced Options", "高级配置": "Advanced Configuration", "黑名单": "Danh sách đen", "默认": "Mặc định", "默认 API 版本": "Phiên bản API mặc định", "默认 Responses API 版本,为空则使用上方版本": "Phiên bản Responses API mặc định, nếu để trống sẽ sử dụng phiên bản ở trên", + "默认 TTL(秒)": "Default TTL (seconds)", + "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)": "Mặc định dùng tỷ lệ tạo bộ nhớ đệm 5m; tỷ lệ tạo bộ nhớ đệm 1h được tự động tính bằng phép nhân cố định (hiện là 1.6x)", "默认使用系统名称": "Mặc định sử dụng tên hệ thống", "默认助手消息": "Xin chào! Tôi có thể giúp gì cho bạn?", "默认区域": "Khu vực mặc định", @@ -3172,131 +3765,6 @@ "默认折叠侧边栏": "Mặc định thu gọn thanh bên", "默认测试模型": "Mô hình kiểm tra mặc định", "默认用户消息": "Xin chào", - "默认补全倍率": "Tỷ lệ hoàn thành mặc định", - "每日签到": "Đăng nhập hàng ngày", - "今日已签到,累计签到": "Đã đăng nhập hôm nay, tổng số lần đăng nhập", - "每日签到可获得随机额度奖励": "Đăng nhập hàng ngày để nhận phần thưởng hạn mức ngẫu nhiên", - "今日已签到": "Đã đăng nhập hôm nay", - "立即签到": "Đăng nhập ngay", - "正在加载签到状态...": "Đang tải trạng thái đăng nhập...", - "获取签到状态失败": "Không thể lấy trạng thái đăng nhập", - "签到成功!获得": "Đăng nhập thành công! Đã nhận", - "签到失败": "Đăng nhập thất bại", - "获得": "Đã nhận", - "累计签到": "Tổng số lần đăng nhập", - "本月获得": "Tháng này", - "累计获得": "Tổng đã nhận", - "签到奖励将直接添加到您的账户余额": "Phần thưởng đăng nhập sẽ được thêm trực tiếp vào số dư tài khoản của bạn", - "每日仅可签到一次,请勿重复签到": "Chỉ có thể đăng nhập một lần mỗi ngày, vui lòng không đăng nhập lặp lại", - "签到设置": "Cài đặt đăng nhập", - "签到功能允许用户每日签到获取随机额度奖励": "Tính năng đăng nhập cho phép người dùng đăng nhập hàng ngày để nhận phần thưởng hạn mức ngẫu nhiên", - "启用签到功能": "Bật tính năng đăng nhập", - "签到最小额度": "Hạn mức đăng nhập tối thiểu", - "签到奖励的最小额度": "Hạn mức tối thiểu cho phần thưởng đăng nhập", - "签到最大额度": "Hạn mức đăng nhập tối đa", - "签到奖励的最大额度": "Hạn mức tối đa cho phần thưởng đăng nhập", - "保存签到设置": "Lưu cài đặt đăng nhập", - "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。": "Lưu ý: Cấu hình tại đây chỉ ảnh hưởng đến cách hiển thị trong \"Chợ mô hình\" và không ảnh hưởng đến việc gọi hoặc định tuyến thực tế. Nếu cần cấu hình hành vi gọi thực tế, vui lòng thiết lập trong \"Quản lý kênh\".", - "确认关闭提示": "Xác nhận đóng", - "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?": "Sau khi đóng, thông báo này sẽ không còn hiển thị nữa (chỉ với trình duyệt này). Bạn có chắc muốn đóng không?", - "ChatCompletions→Responses 兼容配置(Beta)": "Tương thích ChatCompletions→Responses (Beta)", - "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。": "Lưu ý: Đây là tính năng beta. Cấu trúc cấu hình và hành vi có thể thay đổi trong tương lai. Không dùng trong môi trường production.", - "填充模板(指定渠道)": "Điền mẫu (kênh được chọn)", - "填充模板(全渠道)": "Điền mẫu (tất cả kênh)", - "格式化 JSON": "Định dạng JSON", - "关闭提示": "Đóng thông báo", - "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。": "Lưu ý: Bài kiểm tra trên trang này sử dụng yêu cầu không streaming. Nếu kênh chỉ hỗ trợ phản hồi streaming, bài kiểm tra có thể thất bại. Vui lòng dựa vào sử dụng thực tế.", - "Stripe/Creem 需在第三方平台创建商品并填入 ID": "Sản phẩm Stripe/Creem phải được tạo trên nền tảng bên thứ ba và điền ID", - "暂无订阅套餐": "Chưa có gói đăng ký", - "订阅管理": "Quản lý đăng ký", - "订阅套餐管理": "Quản lý gói đăng ký", - "新建套餐": "Tạo gói", - "套餐": "Gói", - "支付渠道": "Kênh thanh toán", - "购买上限": "Giới hạn mua", - "有效期": "Thời hạn", - "禁用后用户端不再展示,但历史订单不受影响。是否继续?": "Sau khi tắt, gói sẽ không hiển thị cho người dùng nhưng lịch sử đơn hàng không bị ảnh hưởng. Tiếp tục?", - "启用后套餐将在用户端展示。是否继续?": "Sau khi bật, gói sẽ hiển thị cho người dùng. Tiếp tục?", - "更新套餐信息": "Cập nhật thông tin gói", - "创建新的订阅套餐": "Tạo gói đăng ký mới", - "套餐的基本信息和定价": "Thông tin cơ bản và giá của gói", - "套餐标题": "Tiêu đề gói", - "请输入套餐标题": "Vui lòng nhập tiêu đề gói", - "套餐副标题": "Phụ đề gói", - "例如:适合轻度使用": "Ví dụ: Phù hợp dùng nhẹ", - "请输入总额度": "Vui lòng nhập tổng hạn mức", - "0 表示不限": "0 nghĩa là không giới hạn", - "原生额度": "Hạn mức gốc", - "升级分组": "Nhóm nâng cấp", - "不升级": "Không nâng cấp", - "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。": "Mua hoặc thêm thủ công đăng ký sẽ nâng cấp lên nhóm này. Khi gói hết hạn/vô hiệu/xóa, sẽ quay lại nhóm trước. Việc quay lại không áp dụng ngay và thường mất vài phút.", - "币种": "Tiền tệ", - "由全站货币展示设置统一控制": "Được điều khiển bởi cài đặt hiển thị tiền tệ toàn site", - "排序": "Thứ tự", - "启用状态": "Trạng thái bật", - "有效期设置": "Cài đặt thời hạn", - "配置套餐的有效时长": "Cấu hình thời lượng hiệu lực của gói", - "有效期单位": "Đơn vị thời hạn", - "自定义秒数": "Số giây tùy chỉnh", - "请输入秒数": "Vui lòng nhập số giây", - "有效期数值": "Giá trị thời hạn", - "额度重置": "Đặt lại hạn mức", - "支持周期性重置套餐权益额度": "Hỗ trợ đặt lại định kỳ hạn mức quyền lợi của gói", - "重置周期": "Chu kỳ đặt lại", - "第三方支付配置": "Cấu hình thanh toán bên thứ ba", - "Stripe/Creem 商品ID(可选)": "ID sản phẩm Stripe/Creem (tùy chọn)", - "生效": "Có hiệu lực", - "已作废": "Đã vô hiệu", - "用户订阅管理": "Quản lý đăng ký người dùng", - "选择订阅套餐": "Chọn gói đăng ký", - "新增订阅": "Thêm đăng ký", - "暂无订阅记录": "Chưa có bản ghi đăng ký", - "来源": "Nguồn", - "开始": "Bắt đầu", - "结束": "Kết thúc", - "作废": "Vô hiệu", - "确认作废": "Xác nhận vô hiệu", - "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "Sau khi vô hiệu, đăng ký sẽ mất hiệu lực ngay. Lịch sử không bị ảnh hưởng. Tiếp tục?", - "删除会彻底移除该订阅记录(含权益明细)。是否继续?": "Xóa sẽ loại bỏ hoàn toàn bản ghi đăng ký (bao gồm chi tiết quyền lợi). Tiếp tục?", - "绑定订阅套餐": "Liên kết gói đăng ký", - "绑定后会立即生成用户订阅(无需支付),有效期按套餐配置计算。": "Sau khi liên kết, sẽ tạo đăng ký cho người dùng ngay (không cần thanh toán); thời hạn theo cấu hình gói.", - "订阅套餐": "Gói đăng ký", - "额度充值": "Nạp hạn mức", - "优先订阅": "Ưu tiên đăng ký", - "优先钱包": "Ưu tiên ví", - "仅用订阅": "Chỉ dùng đăng ký", - "仅用钱包": "Chỉ dùng ví", - "我的订阅": "Đăng ký của tôi", - "个生效中": "gói đăng ký đang hiệu lực", - "无生效": "Không có gói đăng ký hiệu lực", - "已保存偏好为": "Đã lưu tùy chọn: ", - ",当前无生效订阅,将自动使用钱包": ", hiện không có gói đăng ký hiệu lực, sẽ tự động dùng ví.", - "个已过期": "gói đăng ký đã hết hạn", - "订阅": "Đăng ký", - "过期于": "Hết hạn vào", - "作废于": "Vô hiệu vào", - "购买套餐后即可享受模型权益": "Mua gói để nhận quyền lợi mô hình", - "限购": "Giới hạn mua", - "推荐": "Đề xuất", - "已达到购买上限": "Đã đạt giới hạn mua", - "已达上限": "Đã đạt giới hạn", - "立即订阅": "Đăng ký ngay", - "暂无可购买套餐": "Không có gói có thể mua", - "该套餐未配置 Stripe": "Gói này chưa cấu hình Stripe", - "已打开支付页面": "Đã mở trang thanh toán", - "支付失败": "Thanh toán thất bại", - "该套餐未配置 Creem": "Gói này chưa cấu hình Creem", - "已发起支付": "Đã khởi tạo thanh toán", - "购买订阅套餐": "Mua gói đăng ký", - "套餐名称": "Tên gói", - "应付金额": "Số tiền phải trả", - "支付": "Thanh toán", - "管理员未开启在线支付功能,请联系管理员配置。": "Quản trị viên chưa bật thanh toán trực tuyến, vui lòng liên hệ quản trị viên.", - "缓存读": "Đọc bộ nhớ đệm", - "缓存写": "Ghi bộ nhớ đệm", - "写": "Ghi", - "根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。": "Theo quy ước của Anthropic, input tokens của /v1/messages chỉ tính phần đầu vào không dùng cache và không bao gồm tokens đọc/ghi cache.", - "设计版本": "b80c3466cb6feafeb3990c7820e10e50", - "未匹配到模型,按回车键可将「{{name}}」作为自定义模型名添加": "Không tìm thấy mô hình khớp. Nhấn Enter để thêm \"{{name}}\" làm tên mô hình tùy chỉnh." + "默认补全倍率": "Tỷ lệ hoàn thành mặc định" } } diff --git a/web/src/i18n/locales/zh-CN.json b/web/src/i18n/locales/zh-CN.json index fb135f6fb6..f4cb92365a 100644 --- a/web/src/i18n/locales/zh-CN.json +++ b/web/src/i18n/locales/zh-CN.json @@ -6,6 +6,8 @@ " 个模型设置相同的值": " 个模型设置相同的值", " 吗?": " 吗?", " 秒": " 秒", + " 秒。": " 秒。", + ",当前无生效订阅,将自动使用钱包": ",当前无生效订阅,将自动使用钱包", ",时间:": ",时间:", ",点击更新": ",点击更新", "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)", @@ -19,25 +21,33 @@ "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", + "{{name}} ID": "{{name}} ID", "{{ratioType}} {{ratio}}": "{{ratioType}} {{ratio}}", + "• 如果无法获取验证码,请使用备用码": "• 如果无法获取验证码,请使用备用码", + "• 每个备用码只能使用一次": "• 每个备用码只能使用一次", "• 视频服务商的跨域限制": "• 视频服务商的跨域限制", "• 防盗链保护机制": "• 防盗链保护机制", "• 需要特定的请求头或认证": "• 需要特定的请求头或认证", + "• 验证码每30秒更新一次": "• 验证码每30秒更新一次", "© {{currentYear}}": "© {{currentYear}}", "| 基于": "| 基于", "$/1M tokens": "$/1M tokens", "0 - 最低": "0 - 最低", + "0 表示不限": "0 表示不限", "0.002-1之间的小数": "0.002-1之间的小数", "0.1以上的小数": "0.1以上的小数", + "1) 点击「打开授权页面」完成登录;2) 浏览器会跳转到 localhost(页面打不开也没关系);3) 复制地址栏完整 URL 粘贴到下方;4) 点击「生成并填入」。": "1) 点击「打开授权页面」完成登录;2) 浏览器会跳转到 localhost(页面打不开也没关系);3) 复制地址栏完整 URL 粘贴到下方;4) 点击「生成并填入」。", "10 - 最高": "10 - 最高", "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})", "1h缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (1h缓存创建倍率: {{cacheCreationRatio1h}})": "1h缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (1h缓存创建倍率: {{cacheCreationRatio1h}})", "2 - 低": "2 - 低", "2025年5月10日后添加的渠道,不需要再在部署的时候移除模型名称中的\".\"": "2025年5月10日后添加的渠道,不需要再在部署的时候移除模型名称中的\".\"", + "360 智脑": "360 智脑", "360智脑": "360智脑", "5 - 正常(默认)": "5 - 正常(默认)", "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})", "5m缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (5m缓存创建倍率: {{cacheCreationRatio5m}})": "5m缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (5m缓存创建倍率: {{cacheCreationRatio5m}})", + "5小时窗口": "5小时窗口", "8 - 高": "8 - 高", "AGPL v3.0协议": "AGPL v3.0协议", "AI 对话": "AI 对话", @@ -55,6 +65,11 @@ "API令牌管理": "API令牌管理", "API使用记录": "API使用记录", "API信息": "API信息", + "API信息已删除,请及时点击”保存设置”进行保存": "API信息已删除,请及时点击”保存设置”进行保存", + "API信息已更新": "API信息已更新", + "API信息已更新,请及时点击”保存设置”进行保存": "API信息已更新,请及时点击”保存设置”进行保存", + "API信息已添加,请及时点击”保存设置”进行保存": "API信息已添加,请及时点击”保存设置”进行保存", + "API信息更新失败": "API信息更新失败", "API信息管理,可以配置多个API地址用于状态展示和负载均衡(最多50个)": "API信息管理,可以配置多个API地址用于状态展示和负载均衡(最多50个)", "API地址": "API地址", "API渠道配置": "API渠道配置", @@ -65,13 +80,27 @@ "Bark推送URL": "Bark推送URL", "Bark推送URL必须以http://或https://开头": "Bark推送URL必须以http://或https://开头", "Bark通知": "Bark通知", + "Basic Auth 头": "Basic Auth 头", + "Cached tokens": "Cached tokens", + "Cached tokens 占比口径由后端返回:Claude 语义按 cached/(prompt+cached),其余按 cached/prompt。": "Cached tokens 占比口径由后端返回:Claude 语义按 cached/(prompt+cached),其余按 cached/prompt。", "Changing batch type to:": "Changing batch type to:", + "ChatCompletions→Responses 兼容配置": "ChatCompletions→Responses 兼容配置", + "ChatCompletions→Responses 兼容配置(Beta)": "ChatCompletions→Responses 兼容配置(Beta)", + "Claude 强制 beta=true": "Claude 强制 beta=true", "Claude思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Claude思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比", "Claude设置": "Claude设置", "Claude请求头覆盖": "Claude请求头覆盖", "Client ID": "Client ID", "Client Secret": "Client Secret", + "Codex 授权": "Codex 授权", + "Codex 渠道不支持批量创建": "Codex 渠道不支持批量创建", + "Codex 用量": "Codex 用量", "common.changeLanguage": "common.changeLanguage", + "Completion tokens": "Completion tokens", + "Configuration": "Configuration", + "context_int/context_string 从请求上下文读取;gjson 从入口请求的 JSON body 按 gjson path 读取。": "context_int/context_string 从请求上下文读取;gjson 从入口请求的 JSON body 按 gjson path 读取。", + "CPU 使用率超过此值时拒绝请求": "CPU 使用率超过此值时拒绝请求", + "CPU 阈值 (%)": "CPU 阈值 (%)", "Creem API 密钥,敏感信息不显示": "Creem API 密钥,敏感信息不显示", "Creem Setting Tips": "Creem 只支持预设的固定金额产品,这产品以及价格需要提前在Creem网站内创建配置,所以不支持自定义动态金额充值。在Creem端配置产品的名字以及价格,获取Product Id 后填到下面的产品,在new-api为该产品设置充值额度,以及展示价格。", "Creem 介绍": "Creem 是一个简单的支付处理平台,支持固定金额产品销售,以及订阅销售。", @@ -84,8 +113,14 @@ "Discord Client ID": "Discord Client ID", "Discord Client Secret": "Discord Client Secret", "Discord ID": "Discord ID", + "Discovery claims": "Discovery claims", + "Discovery scopes": "Discovery scopes", + "Discovery 建议 scopes:": "Discovery 建议 scopes:", "EUR (欧元)": "EUR (欧元)", "false": "false", + "GC 已执行": "GC 已执行", + "GC 执行失败": "GC 执行失败", + "GC 次数": "GC 次数", "Gemini安全设置": "Gemini安全设置", "Gemini思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Gemini思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比", "Gemini思考适配设置": "Gemini思考适配设置", @@ -95,34 +130,53 @@ "GitHub Client ID": "GitHub Client ID", "GitHub Client Secret": "GitHub Client Secret", "GitHub ID": "GitHub ID", + "Goroutine 数": "Goroutine 数", "Gotify应用令牌": "Gotify应用令牌", "Gotify服务器地址": "Gotify服务器地址", "Gotify服务器地址必须以http://或https://开头": "Gotify服务器地址必须以http://或https://开头", "Gotify通知": "Gotify通知", - "Grok设置": "Grok设置", "GPU/容器": "GPU/容器", "GPU数量": "GPU数量", + "Grok设置": "Grok设置", "Homepage URL 填": "Homepage URL 填", "ID": "ID", + "id(用户 ID)": "id(用户 ID)", + "include_obfuscation 用于控制 Responses 流混淆字段。默认关闭以避免客户端关闭该安全保护": "include_obfuscation 用于控制 Responses 流混淆字段。默认关闭以避免客户端关闭该安全保护", + "inference_geo 字段用于控制 Claude 数据驻留推理区域。默认关闭以避免未经授权透传地域信息": "inference_geo 字段用于控制 Claude 数据驻留推理区域。默认关闭以避免未经授权透传地域信息", "IP": "IP", "IP白名单": "IP白名单", "IP白名单(支持CIDR表达式)": "IP白名单(支持CIDR表达式)", "IP限制": "IP限制", "IP黑名单": "IP黑名单", "JSON": "JSON", + "JSON 模式": "JSON 模式", "JSON 模式支持手动输入或上传服务账号 JSON": "JSON 模式支持手动输入或上传服务账号 JSON", "JSON格式密钥,请确保格式正确": "JSON格式密钥,请确保格式正确", "JSON格式错误": "JSON格式错误", "JSON编辑": "JSON编辑", "JSON解析错误:": "JSON解析错误:", + "Key": "Key", + "Key 或 Path": "Key 或 Path", + "Key 指纹": "Key 指纹", + "Key 摘要": "Key 摘要", + "Key 来源": "Key 来源", + "Key 来源类型": "Key 来源类型", "Linux DO Client ID": "Linux DO Client ID", "Linux DO Client Secret": "Linux DO Client Secret", "LinuxDO": "LinuxDO", "LinuxDO ID": "LinuxDO ID", "Logo 图片地址": "Logo 图片地址", + "Logo 已更新": "Logo 已更新", + "Logo 更新失败": "Logo 更新失败", "Midjourney 任务记录": "Midjourney 任务记录", "MIT许可证": "MIT许可证", "New API项目仓库地址:": "New API项目仓库地址:", + "NewAPI 默认不会将入口请求的 User-Agent 透传到上游渠道;该条件仅用于识别访问本站点的客户端。": "NewAPI 默认不会将入口请求的 User-Agent 透传到上游渠道;该条件仅用于识别访问本站点的客户端。", + "OAuth Client ID": "OAuth Client ID", + "OAuth Client Secret": "OAuth Client Secret", + "OAuth 登录失败:": "OAuth 登录失败:", + "OAuth 端点": "OAuth 端点", + "OAuth 配置错误:授权端点必须是完整的 URL(以 http:// 或 https:// 开头)": "OAuth 配置错误:授权端点必须是完整的 URL(以 http:// 或 https:// 开头)", "OIDC": "OIDC", "OIDC ID": "OIDC ID", "Ollama 模型管理": "Ollama 模型管理", @@ -134,12 +188,20 @@ "Passkey 注册失败,请重试": "Passkey 注册失败,请重试", "Passkey 注册成功": "Passkey 注册成功", "Passkey 登录": "Passkey 登录", + "Passkey 登录失败,请重试": "Passkey 登录失败,请重试", + "Passkey 验证失败,请重试": "Passkey 验证失败,请重试", "Ping间隔(秒)": "Ping间隔(秒)", + "POST 参数": "POST 参数", "price_xxx 的商品价格 ID,新建产品后可获得": "price_xxx 的商品价格 ID,新建产品后可获得", + "Prompt cache hit tokens": "Prompt cache hit tokens", + "Prompt tokens": "Prompt tokens", "Reasoning Effort": "Reasoning Effort", + "Request ID": "Request ID", "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私", + "Scopes(可选)": "Scopes(可选)", "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用", "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示", + "Slug只能包含字母、数字、下划线和连字符": "Slug只能包含字母、数字、下划线和连字符", "SMTP 发送者邮箱": "SMTP 发送者邮箱", "SMTP 服务器地址": "SMTP 服务器地址", "SMTP 端口": "SMTP 端口", @@ -151,22 +213,33 @@ "SSRF防护设置": "SSRF防护设置", "SSRF防护详细说明": "SSRF防护可防止恶意用户利用您的服务器访问内网资源。您可以配置受信任域名/IP的白名单,并限制允许的端口。适用于文件下载、Webhook回调和通知功能。", "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用", - "免责声明:仅限个人使用,请勿分发或共享任何凭证。该渠道存在前置条件与使用门槛,请在充分了解流程与风险后使用,并遵守 OpenAI 的相关条款与政策。相关凭证与配置仅限接入 Codex CLI 使用,不适用于其他客户端、平台或渠道。": "免责声明:仅限个人使用,请勿分发或共享任何凭证。该渠道存在前置条件与使用门槛,请在充分了解流程与风险后使用,并遵守 OpenAI 的相关条款与政策。相关凭证与配置仅限接入 Codex CLI 使用,不适用于其他客户端、平台或渠道。", "Stripe 设置": "Stripe 设置", + "Stripe/Creem 商品ID(可选)": "Stripe/Creem 商品ID(可选)", + "Stripe/Creem 需在第三方平台创建商品并填入 ID": "Stripe/Creem 需在第三方平台创建商品并填入 ID", "Telegram": "Telegram", "Telegram Bot Token": "Telegram Bot Token", "Telegram Bot 名称": "Telegram Bot 名称", "Telegram ID": "Telegram ID", "Token Endpoint": "Token Endpoint", + "token 会按倍率换算成“额度/次数”,请求结束后再做差额结算(补扣/返还)。": "token 会按倍率换算成“额度/次数”,请求结束后再做差额结算(补扣/返还)。", + "Total tokens": "Total tokens", "true": "true", + "TTL(秒,0 表示默认)": "TTL(秒,0 表示默认)", + "TTL(秒)": "TTL(秒)", "Turnstile Secret Key": "Turnstile Secret Key", "Turnstile Site Key": "Turnstile Site Key", "Unix时间戳": "Unix时间戳", "Uptime Kuma地址": "Uptime Kuma地址", "Uptime Kuma监控分类管理,可以配置多个监控分类用于服务状态展示(最多20个)": "Uptime Kuma监控分类管理,可以配置多个监控分类用于服务状态展示(最多20个)", + "Uptime Kuma配置已更新": "Uptime Kuma配置已更新", + "Uptime Kuma配置更新失败": "Uptime Kuma配置更新失败", + "URL 标识,只能包含小写字母、数字和连字符": "URL 标识,只能包含小写字母、数字和连字符", "URL链接": "URL链接", "USD (美元)": "USD (美元)", "User Info Endpoint": "User Info Endpoint", + "User-Agent include": "User-Agent include", + "User-Agent include(每行一个,可不写)": "User-Agent include(每行一个,可不写)", + "Value 正则": "Value 正则", "Vertex AI 不支持 functionResponse.id 字段,开启后将自动移除该字段": "Vertex AI 不支持 functionResponse.id 字段,开启后将自动移除该字段", "Webhook 密钥": "Webhook 密钥", "Webhook 签名密钥": "Webhook 签名密钥", @@ -193,19 +266,24 @@ "上一步": "上一步", "上次保存: ": "上次保存: ", "上游倍率同步": "上游倍率同步", + "上游状态码:": "上游状态码:", "上游返回": "上游返回", "下一个表单块": "下一个表单块", "下一步": "下一步", "下午好": "下午好", "下载日志": "下载日志", "不再提醒": "不再提醒", + "不升级": "不升级", "不同用户分组的价格信息": "不同用户分组的价格信息", "不填则为模型列表第一个": "不填则为模型列表第一个", "不建议使用": "不建议使用", "不支持": "不支持", "不是合法的 JSON 字符串": "不是合法的 JSON 字符串", "不更改": "不更改", + "不重置": "不重置", + "不限": "不限", "不限制": "不限制", + "不需要在末尾加/v1,New API会自动处理,添加后可能导致请求失败,是否继续?": "不需要在末尾加/v1,New API会自动处理,添加后可能导致请求失败,是否继续?", "与本地相同": "与本地相同", "专属倍率": "专属倍率", "两次输入的密码不一致": "两次输入的密码不一致", @@ -222,10 +300,14 @@ "个人信息设置": "个人信息设置", "个人设置": "个人设置", "个实例": "个实例", + "个已过期": "个已过期", "个性化设置": "个性化设置", "个性化设置左侧边栏的显示内容": "个性化设置左侧边栏的显示内容", + "个月": "个月", + "个月前": "个月前", "个未配置模型": "个未配置模型", "个模型": "个模型", + "个生效中": "个生效中", "个部署吗?此操作不可逆。": "个部署吗?此操作不可逆。", "中午好": "中午好", "为一个 JSON 对象,例如:{\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}": "为一个 JSON 对象,例如:{\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}", @@ -242,6 +324,7 @@ "为一个 JSON 文本,键为组名称,值为倍率": "为一个 JSON 文本,键为组名称,值为倍率", "为了保护账户安全,请验证您的两步验证码。": "为了保护账户安全,请验证您的两步验证码。", "为了保护账户安全,请验证您的身份。": "为了保护账户安全,请验证您的身份。", + "为保证匹配准确,请确保客户端直连本站点(避免反向代理/网关改写 User-Agent)。": "为保证匹配准确,请确保客户端直连本站点(避免反向代理/网关改写 User-Agent)。", "为空则默认使用服务器地址,多个 Origin 用逗号分隔,例如 https://newapi.pro,https://newapi.com ,注意不能携带[],需使用https": "为空则默认使用服务器地址,多个 Origin 用逗号分隔,例如 https://newapi.pro,https://newapi.com ,注意不能携带[],需使用https", "主页链接填": "主页链接填", "之前的所有日志": "之前的所有日志", @@ -260,13 +343,21 @@ "仅对自定义模型有效": "仅对自定义模型有效", "仅当自动禁用开启时有效,关闭后不会自动禁用该渠道": "仅当自动禁用开启时有效,关闭后不会自动禁用该渠道", "仅支持": "仅支持", + "仅支持 JSON 对象,必须包含 access_token 与 account_id": "仅支持 JSON 对象,必须包含 access_token 与 account_id", "仅支持 JSON 文件": "仅支持 JSON 文件", "仅支持 JSON 文件,支持多文件": "仅支持 JSON 文件,支持多文件", "仅支持 OpenAI 接口格式": "仅支持 OpenAI 接口格式", + "仅显示已绑定": "仅显示已绑定", "仅显示矛盾倍率": "仅显示矛盾倍率", "仅用于开发环境,生产环境应使用 HTTPS": "仅用于开发环境,生产环境应使用 HTTPS", + "仅用于换算,实际保存的是额度": "仅用于换算,实际保存的是额度", + "仅用订阅": "仅用订阅", + "仅用钱包": "仅用钱包", "仅重置配置": "仅重置配置", + "今天": "今天", "今日关闭": "今日关闭", + "今日已签到": "今日已签到", + "今日已签到,累计签到": "今日已签到,累计签到", "从官方模型库同步": "从官方模型库同步", "从认证器应用中获取验证码,或使用备用码": "从认证器应用中获取验证码,或使用备用码", "从配置文件同步": "从配置文件同步", @@ -281,6 +372,7 @@ "令牌已重置并已复制到剪贴板": "令牌已重置并已复制到剪贴板", "令牌更新成功!": "令牌更新成功!", "令牌的额度仅用于限制令牌本身的最大额度使用量,实际的使用受到账户的剩余额度限制": "令牌的额度仅用于限制令牌本身的最大额度使用量,实际的使用受到账户的剩余额度限制", + "令牌端点": "令牌端点", "令牌管理": "令牌管理", "以下上游数据可能不可信:": "以下上游数据可能不可信:", "以下文件解析失败,已忽略:{{list}}": "以下文件解析失败,已忽略:{{list}}", @@ -298,17 +390,28 @@ "价格重新计算中...": "价格重新计算中...", "价格预估": "价格预估", "任务 ID": "任务 ID", + "任务ID": "任务ID", "任务日志": "任务日志", "任务状态": "任务状态", "任务记录": "任务记录", "企业账户为特殊返回格式,需要特殊处理,如果非企业账户,请勿勾选": "企业账户为特殊返回格式,需要特殊处理,如果非企业账户,请勿勾选", "优先级": "优先级", + "优先级必须是整数!": "优先级必须是整数!", + "优先订阅": "优先订阅", + "优先钱包": "优先钱包", "优惠": "优惠", "低于此额度时将发送邮件提醒用户": "低于此额度时将发送邮件提醒用户", "余额": "余额", "余额充值管理": "余额充值管理", + "作废": "作废", + "作废于": "作废于", + "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "作废后该订阅将立即失效,历史记录不受影响。是否继续?", + "作用域": "作用域", + "作用域:包含分组": "作用域:包含分组", + "作用域:包含规则名称": "作用域:包含规则名称", "你似乎并没有修改什么": "你似乎并没有修改什么", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。", + "使用 {{name}} 继续": "使用 {{name}} 继续", "使用 Discord 继续": "使用 Discord 继续", "使用 GitHub 继续": "使用 GitHub 继续", "使用 JSON 对象格式,格式为:{\"组名\": [最多请求次数, 最多请求完成次数]}": "使用 JSON 对象格式,格式为:{\"组名\": [最多请求次数, 最多请求完成次数]}", @@ -321,13 +424,21 @@ "使用 用户名 注册": "使用 用户名 注册", "使用 邮箱或用户名 登录": "使用 邮箱或用户名 登录", "使用ID排序": "使用ID排序", + "使用备用码": "使用备用码", "使用日志": "使用日志", "使用模式": "使用模式", "使用统计": "使用统计", "使用认证器应用(如 Google Authenticator、Microsoft Authenticator)扫描下方二维码:": "使用认证器应用(如 Google Authenticator、Microsoft Authenticator)扫描下方二维码:", "使用认证器应用扫描二维码": "使用认证器应用扫描二维码", + "使用认证器验证码": "使用认证器验证码", + "例如": "例如", + "例如 /var/cache/new-api": "例如 /var/cache/new-api", "例如 €, £, Rp, ₩, ₹...": "例如 €, £, Rp, ₩, ₹...", + "例如 100000…": "例如 100000…", + "例如 3600…": "例如 3600…", + "例如 600…": "例如 600…", "例如 https://docs.newapi.pro": "例如 https://docs.newapi.pro", + "例如 prefer-by-conversation-id…": "例如 prefer-by-conversation-id…", "例如:": "例如:", "例如: /bin/bash -c \"python app.py\"": "例如: /bin/bash -c \"python app.py\"", "例如: nginx:latest": "例如: nginx:latest", @@ -340,13 +451,28 @@ "例如:2,就是最低充值2$": "例如:2,就是最低充值2$", "例如:2000": "例如:2000", "例如:4.99": "例如:4.99", + "例如:401, 403, 429, 500-599": "例如:401,403,429,500-599", "例如:7,就是7元/美金": "例如:7,就是7元/美金", + "例如:email": "例如:email", "例如:example.com": "例如:example.com", + "例如:github / si:google / https://example.com/logo.png / 🐱": "例如:github / si:google / https://example.com/logo.png / 🐱", + "例如:GitHub Enterprise": "例如:GitHub Enterprise", + "例如:github-enterprise": "例如:github-enterprise", + "例如:https://example.com/.well-known/openid-configuration": "例如:https://example.com/.well-known/openid-configuration", + "例如:https://gitea.example.com": "例如:https://gitea.example.com", + "例如:https://workername.yourdomain.workers.dev": "例如:https://workername.yourdomain.workers.dev", "例如:https://yourdomain.com": "例如:https://yourdomain.com", + "例如:name、full_name": "例如:name、full_name", "例如:nginx:latest": "例如:nginx:latest", + "例如:preferred_username、login": "例如:preferred_username、login", "例如:preview": "例如:preview", "例如:prod_6I8rBerHpPxyoiU9WK4kot": "例如:prod_6I8rBerHpPxyoiU9WK4kot", + "例如:sub、id、data.user.id": "例如:sub、id、data.user.id", "例如:基础套餐": "例如:基础套餐", + "例如:适合轻度使用": "例如:适合轻度使用", + "例如:需要等级 {{required}},你当前等级 {{current}}": "例如:需要等级 {{required}},你当前等级 {{current}}", + "例如(全渠道):": "例如(全渠道):", + "例如(指定渠道):": "例如(指定渠道):", "例如发卡网站的购买链接": "例如发卡网站的购买链接", "供应商": "供应商", "供应商介绍": "供应商介绍", @@ -375,12 +501,14 @@ "保存失败,请重试": "保存失败,请重试", "保存失败:": "保存失败:", "保存屏蔽词过滤设置": "保存屏蔽词过滤设置", + "保存性能设置": "保存性能设置", "保存成功": "保存成功", "保存数据看板设置": "保存数据看板设置", "保存日志设置": "保存日志设置", "保存模型倍率设置": "保存模型倍率设置", "保存模型速率限制": "保存模型速率限制", "保存监控设置": "保存监控设置", + "保存签到设置": "保存签到设置", "保存绘图设置": "保存绘图设置", "保存聊天设置": "保存聊天设置", "保存设置": "保存设置", @@ -399,17 +527,22 @@ "倍率是为了方便换算不同价格的模型": "倍率是为了方便换算不同价格的模型", "倍率模式": "倍率模式", "倍率类型": "倍率类型", + "偏好设置": "偏好设置", + "停止中": "停止中", "停止测试": "停止测试", "停用": "停用", "允许 AccountFilter 参数": "允许 AccountFilter 参数", "允许 HTTP 协议图片请求(适用于自部署代理)": "允许 HTTP 协议图片请求(适用于自部署代理)", + "允许 inference_geo 透传": "允许 inference_geo 透传", "允许 safety_identifier 透传": "允许 safety_identifier 透传", "允许 service_tier 透传": "允许 service_tier 透传", + "允许 stream_options.include_obfuscation 透传": "允许 stream_options.include_obfuscation 透传", "允许 Turnstile 用户校验": "允许 Turnstile 用户校验", "允许不安全的 Origin(HTTP)": "允许不安全的 Origin(HTTP)", "允许回调(会泄露服务器 IP 地址)": "允许回调(会泄露服务器 IP 地址)", "允许在 Stripe 支付中输入促销码": "允许在 Stripe 支付中输入促销码", "允许新用户注册": "允许新用户注册", + "允许注册的最低信任等级": "允许注册的最低信任等级", "允许的 Origins": "允许的 Origins", "允许的IP,一行一个,不填写则不限制": "允许的IP,一行一个,不填写则不限制", "允许的端口": "允许的端口", @@ -440,12 +573,11 @@ "充值金额折扣配置不是合法的 JSON 对象": "充值金额折扣配置不是合法的 JSON 对象", "充值链接": "充值链接", "充值额度": "充值额度", + "先填写配置,再自动填充 OAuth 端点,能显著减少手工输入": "先填写配置,再自动填充 OAuth 端点,能显著减少手工输入", + "免责声明:仅限个人使用,请勿分发或共享任何凭证。该渠道存在前置条件与使用门槛,请在充分了解流程与风险后使用,并遵守 OpenAI 的相关条款与政策。相关凭证与配置仅限接入 Codex CLI 使用,不适用于其他客户端、平台或渠道。": "免责声明:仅限个人使用,请勿分发或共享任何凭证。该渠道存在前置条件与使用门槛,请在充分了解流程与风险后使用,并遵守 OpenAI 的相关条款与政策。相关凭证与配置仅限接入 Codex CLI 使用,不适用于其他客户端、平台或渠道。", "兑换人ID": "兑换人ID", "兑换成功!": "兑换成功!", "兑换码充值": "兑换码充值", - "确认清理不活跃的磁盘缓存?": "确认清理不活跃的磁盘缓存?", - "这将删除超过 10 分钟未使用的临时缓存文件": "这将删除超过 10 分钟未使用的临时缓存文件", - "清理不活跃缓存": "清理不活跃缓存", "兑换码创建成功": "兑换码创建成功", "兑换码创建成功,是否下载兑换码?": "兑换码创建成功,是否下载兑换码?", "兑换码创建成功!": "兑换码创建成功!", @@ -472,7 +604,10 @@ "全部类型": "全部类型", "公告": "公告", "公告内容": "公告内容", + "公告已删除,请及时点击”保存设置”进行保存": "公告已删除,请及时点击”保存设置”进行保存", "公告已更新": "公告已更新", + "公告已更新,请及时点击”保存设置”进行保存": "公告已更新,请及时点击”保存设置”进行保存", + "公告已添加,请及时点击”保存设置”进行保存": "公告已添加,请及时点击”保存设置”进行保存", "公告更新失败": "公告更新失败", "公告类型": "公告类型", "共": "共", @@ -483,6 +618,8 @@ "共 {{total}} 项,当前显示 {{start}}-{{end}} 项": "共 {{total}} 项,当前显示 {{start}}-{{end}} 项", "关": "关", "关于": "关于", + "关于内容已更新": "关于内容已更新", + "关于内容更新失败": "关于内容更新失败", "关于我们": "关于我们", "关于系统的详细信息": "关于系统的详细信息", "关于项目": "关于项目", @@ -491,15 +628,22 @@ "关闭侧边栏": "关闭侧边栏", "关闭公告": "关闭公告", "关闭后,此模型将不会被“同步官方”自动覆盖或创建": "关闭后,此模型将不会被“同步官方”自动覆盖或创建", + "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?": "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?", "关闭弹窗,已停止批量测试": "关闭弹窗,已停止批量测试", + "关闭提示": "关闭提示", "其他": "其他", "其他注册选项": "其他注册选项", "其他登录选项": "其他登录选项", "其他设置": "其他设置", "其他详情": "其他详情", + "内存 阈值 (%)": "内存 阈值 (%)", + "内存使用率超过此值时拒绝请求": "内存使用率超过此值时拒绝请求", + "内存命中": "内存命中", + "内存缓存最大条目数。0 表示使用后端默认容量:100000。": "内存缓存最大条目数。0 表示使用后端默认容量:100000。", "内容": "内容", "内容较大,已启用性能优化模式": "内容较大,已启用性能优化模式", "内容较大,部分功能可能受限": "内容较大,部分功能可能受限", + "内置": "内置", "内置 Ollama 镜像": "内置 Ollama 镜像", "再次输入部署名称": "再次输入部署名称", "最低": "最低", @@ -509,10 +653,21 @@ "最后请求": "最后请求", "最大GPU数量": "最大GPU数量", "最大可用": "最大可用", + "最大条目数": "最大条目数", + "最终抵扣": "最终抵扣", + "最近一次": "最近一次", "最近事件": "最近事件", + "写": "写", + "准入策略": "准入策略", + "准入策略 JSON(可选)": "准入策略 JSON(可选)", + "准备中": "准备中", "准备中...": "准备中...", "准备完成初始化": "准备完成初始化", + "凭证已刷新": "凭证已刷新", "分类名称": "分类名称", + "分类已删除,请及时点击”保存设置”进行保存": "分类已删除,请及时点击”保存设置”进行保存", + "分类已更新,请及时点击”保存设置”进行保存": "分类已更新,请及时点击”保存设置”进行保存", + "分类已添加,请及时点击”保存设置”进行保存": "分类已添加,请及时点击”保存设置”进行保存", "分组": "分组", "分组与模型定价设置": "分组与模型定价设置", "分组价格": "分组价格", @@ -525,6 +680,7 @@ "分组速率配置优先级高于全局速率限制。": "分组速率配置优先级高于全局速率限制。", "分组速率限制": "分组速率限制", "分钟": "分钟", + "分钟前": "分钟前", "切换为Assistant角色": "切换为Assistant角色", "切换为System角色": "切换为System角色", "切换为单密钥模式": "切换为单密钥模式", @@ -535,21 +691,26 @@ "划转额度": "划转额度", "列出的模型将不会自动添加或移除-thinking/-nothinking 后缀": "列出的模型将不会自动添加或移除-thinking/-nothinking 后缀", "列设置": "列设置", + "刚刚": "刚刚", "创建": "创建", "创建令牌默认选择auto分组,初始令牌也将设为auto(否则留空,为用户默认分组)": "创建令牌默认选择auto分组,初始令牌也将设为auto(否则留空,为用户默认分组)", "创建失败": "创建失败", + "创建成功": "创建成功", "创建或选择密钥时,将 Project 设置为 io.cloud": "创建或选择密钥时,将 Project 设置为 io.cloud", "创建新用户账户": "创建新用户账户", "创建新的令牌": "创建新的令牌", "创建新的兑换码": "创建新的兑换码", "创建新的模型": "创建新的模型", "创建新的渠道": "创建新的渠道", + "创建新的订阅套餐": "创建新的订阅套餐", "创建新的预填组": "创建新的预填组", "创建时间": "创建时间", "创建用户": "创建用户", "初始化失败,请重试": "初始化失败,请重试", "初始化系统": "初始化系统", "删除": "删除", + "删除 Key 来源": "删除 Key 来源", + "删除会彻底移除该订阅记录(含权益明细)。是否继续?": "删除会彻底移除该订阅记录(含权益明细)。是否继续?", "删除后无法恢复,确定要删除模型 \"{{name}}\" 吗?": "删除后无法恢复,确定要删除模型 \"{{name}}\" 吗?", "删除失败": "删除失败", "删除密钥失败": "删除密钥失败", @@ -560,17 +721,23 @@ "删除禁用密钥失败": "删除禁用密钥失败", "删除禁用通道": "删除禁用通道", "删除自动禁用密钥": "删除自动禁用密钥", + "删除规则": "删除规则", "删除账户": "删除账户", "删除账户确认": "删除账户确认", "删除部署失败": "删除部署失败", "刷新": "刷新", + "刷新凭证": "刷新凭证", "刷新失败": "刷新失败", "刷新容器信息": "刷新容器信息", "刷新日志": "刷新日志", + "刷新统计": "刷新统计", + "刷新缓存统计": "刷新缓存统计", + "刷新缓存统计失败": "刷新缓存统计失败", "前往 io.net API Keys": "前往 io.net API Keys", "前往设置": "前往设置", "前往设置页面": "前往设置页面", "前缀": "前缀", + "前缀名称匹配": "前缀名称匹配", "副本数量": "副本数量", "剩余": "剩余", "剩余备用码:": "剩余备用码:", @@ -599,27 +766,40 @@ "加载账单失败": "加载账单失败", "加载隐私政策内容失败...": "加载隐私政策内容失败...", "包含": "包含", + "包含名称匹配": "包含名称匹配", "包含来自未知或未标明供应商的AI模型,这些模型可能来自小型供应商或开源项目。": "包含来自未知或未标明供应商的AI模型,这些模型可能来自小型供应商或开源项目。", "包括失败请求的次数,0代表不限制": "包括失败请求的次数,0代表不限制", "匹配类型": "匹配类型", "区域": "区域", + "升级分组": "升级分组", "单GPU小时费率": "单GPU小时费率", + "即梦": "即梦", "历史消耗": "历史消耗", "原价": "原价", "原因:": "原因:", + "原始 JSON": "原始 JSON", "原密码": "原密码", + "原生格式": "原生格式", + "原生额度": "原生额度", "去重完成:去重前 {{before}} 个密钥,去重后 {{after}} 个密钥": "去重完成:去重前 {{before}} 个密钥,去重后 {{after}} 个密钥", "参与官方同步": "参与官方同步", "参数": "参数", + "参数传递": "参数传递", "参数值": "参数值", "参数覆盖": "参数覆盖", + "参数覆盖必须是合法的 JSON 格式!": "参数覆盖必须是合法的 JSON 格式!", + "参数配置": "参数配置", "参照生视频": "参照生视频", "友情链接": "友情链接", "发布日期": "发布日期", "发布时间": "发布时间", + "发现文档地址(Discovery URL,可选)": "发现文档地址(Discovery URL,可选)", + "发行者 URL(Issuer URL)": "发行者 URL(Issuer URL)", + "发送验证码失败,请重试": "发送验证码失败,请重试", "取消": "取消", "取消全选": "取消全选", "取消选择": "取消选择", + "受限": "受限", "变换": "变换", "变焦": "变焦", "变量值": "变量值", @@ -629,17 +809,29 @@ "只有当用户设置开启IP记录时,才会进行请求和错误类型日志的IP记录": "只有当用户设置开启IP记录时,才会进行请求和错误类型日志的IP记录", "可信": "可信", "可在设置页面设置关于内容,支持 HTML & Markdown": "可在设置页面设置关于内容,支持 HTML & Markdown", + "可手动填写,多个 scope 用空格分隔": "可手动填写,多个 scope 用空格分隔", + "可灵": "可灵", + "可用": "可用", "可用令牌分组": "可用令牌分组", "可用分组": "可用分组", + "可用变量:{{provider}} {{field}} {{op}} {{required}} {{current}} 以及 {{current.path}}": "可用变量:{{provider}} {{field}} {{op}} {{required}} {{current}} 以及 {{current.path}}", "可用数量": "可用数量", "可用模型": "可用模型", + "可用率": "可用率", + "可用空间: {{free}} / 总空间: {{total}}": "可用空间: {{free}} / 总空间: {{total}}", "可用端点类型": "可用端点类型", "可用邀请额度": "可用邀请额度", + "可留空;留空时会尝试使用 Issuer URL + /.well-known/openid-configuration": "可留空;留空时会尝试使用 Issuer URL + /.well-known/openid-configuration", "可视化": "可视化", "可视化倍率设置": "可视化倍率设置", "可视化编辑": "可视化编辑", "可选,公告的补充说明": "可选,公告的补充说明", "可选,用于复现结果": "可选,用于复现结果", + "可选:基于用户信息 JSON 做组合条件准入,条件不满足时返回自定义提示": "可选:基于用户信息 JSON 做组合条件准入,条件不满足时返回自定义提示", + "可选:用于自动生成端点或 Discovery URL": "可选:用于自动生成端点或 Discovery URL", + "可选。匹配入口请求的 User-Agent;任意一行作为子串匹配(忽略大小写)即命中。": "可选。匹配入口请求的 User-Agent;任意一行作为子串匹配(忽略大小写)即命中。", + "可选。对提取到的亲和 Key 做正则校验;不填表示不校验。": "可选。对提取到的亲和 Key 做正则校验;不填表示不校验。", + "可选。对请求路径进行匹配;不填表示匹配所有路径。": "可选。对请求路径进行匹配;不填表示匹配所有路径。", "可选值": "可选值", "同时重置消息": "同时重置消息", "同步": "同步", @@ -656,19 +848,23 @@ "名称匹配类型": "名称匹配类型", "后端请求失败": "后端请求失败", "后缀": "后缀", + "后缀名称匹配": "后缀名称匹配", "否": "否", "启动": "启动", "启动参数 (Args)": "启动参数 (Args)", "启动命令": "启动命令", "启动命令 (Entrypoint)": "启动命令 (Entrypoint)", + "启动授权失败": "启动授权失败", "启动时间": "启动时间", "启动部署失败": "启动部署失败", "启动配置": "启动配置", "启用": "启用", + "启用 Creem 支付": "启用 Creem 支付", "启用 io.net 部署": "启用 io.net 部署", "启用 io.net 部署开关": "启用 io.net 部署开关", "启用 io.net 部署时必须填写 API Key": "启用 io.net 部署时必须填写 API Key", "启用 Prompt 检查": "启用 Prompt 检查", + "启用 Stripe 支付": "启用 Stripe 支付", "启用2FA失败": "启用2FA失败", "启用Claude思考适配(-thinking后缀)": "启用Claude思考适配(-thinking后缀)", "启用FunctionCall思维签名填充": "启用FunctionCall思维签名填充", @@ -676,36 +872,54 @@ "启用Ping间隔": "启用Ping间隔", "启用SMTP SSL": "启用SMTP SSL", "启用SSRF防护(推荐开启以保护服务器安全)": "启用SSRF防护(推荐开启以保护服务器安全)", + "启用供应商": "启用供应商", "启用全部": "启用全部", "启用后可接入 io.net GPU 资源": "启用后可接入 io.net GPU 资源", "启用后可添加图片URL进行多模态对话": "启用后可添加图片URL进行多模态对话", + "启用后套餐将在用户端展示。是否继续?": "启用后套餐将在用户端展示。是否继续?", + "启用后将优先复用上一次成功的渠道(粘滞选路)。": "启用后将优先复用上一次成功的渠道(粘滞选路)。", "启用后将使用 Creem Test Mode": "启用后将使用 Creem Test Mode", "启用密钥失败": "启用密钥失败", "启用屏蔽词过滤功能": "启用屏蔽词过滤功能", + "启用性能监控": "启用性能监控", + "启用性能监控后,当系统资源使用率超过设定阈值时,将拒绝新的 Relay 请求 (/v1, /v1beta 等),以保护系统稳定性。": "启用性能监控后,当系统资源使用率超过设定阈值时,将拒绝新的 Relay 请求 (/v1, /v1beta 等),以保护系统稳定性。", "启用所有密钥失败": "启用所有密钥失败", "启用数据看板(实验性)": "启用数据看板(实验性)", "启用此模式后,将使用您自定义的请求体发送API请求,模型配置面板的参数设置将被忽略。": "启用此模式后,将使用您自定义的请求体发送API请求,模型配置面板的参数设置将被忽略。", + "启用状态": "启用状态", "启用用户模型请求速率限制(可能会影响高并发性能)": "启用用户模型请求速率限制(可能会影响高并发性能)", + "启用磁盘缓存": "启用磁盘缓存", + "启用磁盘缓存后,大请求体将临时存储到磁盘而非内存,可显著降低内存占用,适用于处理包含大量图片/文件的请求。建议在 SSD 环境下使用。": "启用磁盘缓存后,大请求体将临时存储到磁盘而非内存,可显著降低内存占用,适用于处理包含大量图片/文件的请求。建议在 SSD 环境下使用。", + "启用签到功能": "启用签到功能", "启用绘图功能": "启用绘图功能", "启用请求体透传功能": "启用请求体透传功能", "启用请求透传": "启用请求透传", + "启用违规扣费": "启用违规扣费", "启用额度消费日志记录": "启用额度消费日志记录", "启用验证": "启用验证", - "启用违规扣费": "启用违规扣费", "周": "周", + "周前": "周前", + "周期": "周期", + "命中判定:usage 中存在 cached tokens(例如 cached_tokens/prompt_cache_hit_tokens)即视为命中。": "命中判定:usage 中存在 cached tokens(例如 cached_tokens/prompt_cache_hit_tokens)即视为命中。", + "命中率": "命中率", + "命名规则": "命名规则", "和": "和", "和Claude不同,默认情况下Gemini的思考模型会自动决定要不要思考,就算不开启适配模型也可以正常使用,如果您需要计费,推荐设置无后缀模型价格按思考价格设置。支持使用 gemini-2.5-pro-preview-06-05-thinking-128 格式来精确传递思考预算。": "和Claude不同,默认情况下Gemini的思考模型会自动决定要不要思考,就算不开启适配模型也可以正常使用,如果您需要计费,推荐设置无后缀模型价格按思考价格设置。支持使用 gemini-2.5-pro-preview-06-05-thinking-128 格式来精确传递思考预算。", "响应": "响应", "响应时间": "响应时间", + "响应缺少凭据": "响应缺少凭据", + "响应缺少授权链接": "响应缺少授权链接", "商品价格 ID": "商品价格 ID", "回答内容": "回答内容", "回调 URL 填": "回调 URL 填", + "回调 URL 格式": "回调 URL 格式", "回调地址": "回调地址", "固定价格": "固定价格", "固定价格(每次)": "固定价格(每次)", "固定价格值": "固定价格值", "图像生成": "图像生成", "图标": "图标", + "图标使用 react-icons(Simple Icons)或 URL/emoji,例如:github、gitlab、si:google": "图标使用 react-icons(Simple Icons)或 URL/emoji,例如:github、gitlab、si:google", "图标使用@lobehub/icons库,如:OpenAI、Claude.Color,支持链式参数:OpenAI.Avatar.type={'platform'}、OpenRouter.Avatar.shape={'square'},查询所有可用图标请 ": "图标使用@lobehub/icons库,如:OpenAI、Claude.Color,支持链式参数:OpenAI.Avatar.type={'platform'}、OpenRouter.Avatar.shape={'square'},查询所有可用图标请 ", "图混合": "图混合", "图片功能在自定义请求体模式下不可用": "图片功能在自定义请求体模式下不可用", @@ -722,6 +936,7 @@ "在Gotify服务器的应用管理中创建新应用": "在Gotify服务器的应用管理中创建新应用", "在找兑换码?": "在找兑换码?", "在新标签页中打开": "在新标签页中打开", + "在模型广场向用户展示的端点": "在模型广场向用户展示的端点", "在此输入 Logo 图片地址": "在此输入 Logo 图片地址", "在此输入新的公告内容,支持 Markdown & HTML 代码": "在此输入新的公告内容,支持 Markdown & HTML 代码", "在此输入新的关于内容,支持 Markdown & HTML 代码。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为关于页面": "在此输入新的关于内容,支持 Markdown & HTML 代码。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为关于页面", @@ -734,14 +949,24 @@ "域名白名单": "域名白名单", "域名黑名单": "域名黑名单", "基本信息": "基本信息", + "填充 Codex / Claude Code 模版": "填充 Codex / Claude Code 模版", + "填充模板:等级+激活": "填充模板:等级+激活", + "填充模板:等级提示": "填充模板:等级提示", + "填充模板:组织或角色": "填充模板:组织或角色", + "填充模板:组织提示": "填充模板:组织提示", + "填充模板(全渠道)": "填充模板(全渠道)", + "填充模板(指定渠道)": "填充模板(指定渠道)", "填入": "填入", "填入所有模型": "填入所有模型", "填入模板": "填入模板", - "填入透传模版": "填入透传模版", - "填入透传完整模版": "填入透传完整模版", "填入相关模型": "填入相关模型", + "填入透传完整模版": "填入透传完整模版", + "填入透传模版": "填入透传模版", + "填写 Issuer URL 后自动生成:": "填写 Issuer URL 后自动生成:", "填写Gotify服务器的完整URL地址": "填写Gotify服务器的完整URL地址", + "填写后会自动拼接预设端点": "填写后会自动拼接预设端点", "填写带https的域名,逗号分隔": "填写带https的域名,逗号分隔", + "填写服务器地址后自动生成:": "填写服务器地址后自动生成:", "填写用户协议内容后,用户注册时将被要求勾选已阅读用户协议": "填写用户协议内容后,用户注册时将被要求勾选已阅读用户协议", "填写隐私政策内容后,用户注册时将被要求勾选已阅读隐私政策": "填写隐私政策内容后,用户注册时将被要求勾选已阅读隐私政策", "处理中": "处理中", @@ -749,12 +974,15 @@ "备份状态": "备份状态", "备注": "备注", "备用恢复代码": "备用恢复代码", + "备用码": "备用码", "备用码已复制到剪贴板": "备用码已复制到剪贴板", + "备用码必须是8位": "备用码必须是8位", "备用码重新生成成功": "备用码重新生成成功", "复制": "复制", "复制代码": "复制代码", "复制令牌": "复制令牌", "复制全部": "复制全部", + "复制功能需要 HTTPS 环境,请手动复制": "复制功能需要 HTTPS 环境,请手动复制", "复制名称": "复制名称", "复制失败": "复制失败", "复制失败,请手动复制": "复制失败,请手动复制", @@ -766,6 +994,7 @@ "复制所有模型": "复制所有模型", "复制所选令牌": "复制所选令牌", "复制所选兑换码到剪贴板": "复制所选兑换码到剪贴板", + "复制授权链接": "复制授权链接", "复制日志": "复制日志", "复制渠道的所有信息": "复制渠道的所有信息", "复制版本号": "复制版本号", @@ -780,18 +1009,29 @@ "天": "天", "天前": "天前", "失败": "失败", + "失败原因": "失败原因", + "失败后不重试": "失败后不重试", "失败时自动禁用通道": "失败时自动禁用通道", "失败重试次数": "失败重试次数", "奖励说明": "奖励说明", + "套餐": "套餐", + "套餐副标题": "套餐副标题", + "套餐名称": "套餐名称", + "套餐标题": "套餐标题", + "套餐标题不能为空": "套餐标题不能为空", + "套餐的基本信息和定价": "套餐的基本信息和定价", "如:大带宽批量分析图片推荐": "如:大带宽批量分析图片推荐", "如:香港线路": "如:香港线路", + "如果亲和到的渠道失败,重试到其他渠道成功后,将亲和更新到成功的渠道。": "如果亲和到的渠道失败,重试到其他渠道成功后,将亲和更新到成功的渠道。", "如果你对接的是上游One API或者New API等转发项目,请使用OpenAI类型,不要使用此类型,除非你知道你在做什么。": "如果你对接的是上游One API或者New API等转发项目,请使用OpenAI类型,不要使用此类型,除非你知道你在做什么。", "如果用户请求中包含系统提示词,则使用此设置拼接到用户的系统提示词前面": "如果用户请求中包含系统提示词,则使用此设置拼接到用户的系统提示词前面", "如果镜像为私有,请填写密码或Token": "如果镜像为私有,请填写密码或Token", "如果镜像为私有,请填写用户名": "如果镜像为私有,请填写用户名", "始终使用浅色主题": "始终使用浅色主题", "始终使用深色主题": "始终使用深色主题", + "字段映射": "字段映射", "字段透传控制": "字段透传控制", + "字节火山方舟、豆包通用": "字节火山方舟、豆包通用", "存在惩罚,鼓励讨论新话题": "存在惩罚,鼓励讨论新话题", "存在重复的键名:": "存在重复的键名:", "安全提醒": "安全提醒", @@ -807,8 +1047,8 @@ "完整的 Base URL,支持变量{model}": "完整的 Base URL,支持变量{model}", "官方": "官方", "官方文档": "官方文档", - "官方说明": "官方说明", "官方模型同步": "官方模型同步", + "官方说明": "官方说明", "定价模式": "定价模式", "定时测试所有通道": "定时测试所有通道", "定期更改密码可以提高账户安全性": "定期更改密码可以提高账户安全性", @@ -845,8 +1085,11 @@ "密码重置": "密码重置", "密码重置完成": "密码重置完成", "密码重置确认": "密码重置确认", + "密码长度不得小于 8 位!": "密码长度不得小于 8 位!", "密码长度至少为8个字符": "密码长度至少为8个字符", "密钥": "密钥", + "密钥 JSON 必须包含 access_token": "密钥 JSON 必须包含 access_token", + "密钥 JSON 必须包含 account_id": "密钥 JSON 必须包含 account_id", "密钥(编辑模式下,保存的密钥不会显示)": "密钥(编辑模式下,保存的密钥不会显示)", "密钥去重": "密钥去重", "密钥将以Bearer方式添加到请求头中,用于验证webhook请求的合法性": "密钥将以Bearer方式添加到请求头中,用于验证webhook请求的合法性", @@ -854,6 +1097,8 @@ "密钥已启用": "密钥已启用", "密钥已复制到剪贴板": "密钥已复制到剪贴板", "密钥已禁用": "密钥已禁用", + "密钥必须是 JSON 对象": "密钥必须是 JSON 对象", + "密钥必须是合法的 JSON 格式!": "密钥必须是合法的 JSON 格式!", "密钥文件 (.json)": "密钥文件 (.json)", "密钥更新模式": "密钥更新模式", "密钥格式": "密钥格式", @@ -880,9 +1125,13 @@ "将仅保留第一个密钥文件,其余文件将被移除,是否继续?": "将仅保留第一个密钥文件,其余文件将被移除,是否继续?", "将删除": "将删除", "将删除已使用、已禁用及过期的兑换码,此操作不可撤销。": "将删除已使用、已禁用及过期的兑换码,此操作不可撤销。", + "将删除所有仍在内存中的渠道亲和性缓存条目。": "将删除所有仍在内存中的渠道亲和性缓存条目。", + "将大请求体临时存储到磁盘": "将大请求体临时存储到磁盘", "将清除所有保存的配置并恢复默认设置,此操作不可撤销。是否继续?": "将清除所有保存的配置并恢复默认设置,此操作不可撤销。是否继续?", "将清除选定时间之前的所有日志": "将清除选定时间之前的所有日志", + "将追加 2 条规则到现有规则列表。": "将追加 2 条规则到现有规则列表。", "小时": "小时", + "小时前": "小时前", "小时费率": "小时费率", "尚未使用": "尚未使用", "局部重绘-提交": "局部重绘-提交", @@ -891,30 +1140,44 @@ "展开": "展开", "展开更多": "展开更多", "展示价格": "展示价格", + "嵌入模型:MokaAI M3E": "嵌入模型:MokaAI M3E", "左侧边栏个人设置": "左侧边栏个人设置", "已为 {{count}} 个模型设置{{type}}_other": "已为 {{count}} 个模型设置{{type}}", "已为 ${count} 个渠道设置标签!": "已为 ${count} 个渠道设置标签!", + "已从 Discovery 自动填充配置": "已从 Discovery 自动填充配置", + "已从 Discovery 获取配置,可继续手动修改所有字段。": "已从 Discovery 获取配置,可继续手动修改所有字段。", + "已作废": "已作废", + "已使用": "已使用", + "已使用:": "已使用:", + "已保存偏好为": "已保存偏好为", "已修复 ${success} 个通道,失败 ${fails} 个通道。": "已修复 ${success} 个通道,失败 ${fails} 个通道。", "已停止": "已停止", "已停止批量测试": "已停止批量测试", "已关闭后续提醒": "已关闭后续提醒", + "已分配内存": "已分配内存", "已切换为Assistant角色": "已切换为Assistant角色", "已切换为System角色": "已切换为System角色", "已切换至最优倍率视图,每个模型使用其最低倍率分组": "已切换至最优倍率视图,每个模型使用其最低倍率分组", "已初始化": "已初始化", + "已删除": "已删除", "已删除 {{count}} 个令牌!": "已删除 {{count}} 个令牌!", "已删除 {{count}} 个令牌!_other": "已删除 {{count}} 个令牌!", "已删除 {{count}} 条失效兑换码_other": "已删除 {{count}} 条失效兑换码", "已删除 ${data} 个通道!": "已删除 ${data} 个通道!", "已删除所有禁用渠道,共计 ${data} 个": "已删除所有禁用渠道,共计 ${data} 个", "已删除消息及其回复": "已删除消息及其回复", + "已发起支付": "已发起支付", "已发送到 Fluent": "已发送到 Fluent", "已取消 Passkey 注册": "已取消 Passkey 注册", + "已取消 Passkey 登录": "已取消 Passkey 登录", "已同步到渠道": "已同步到渠道", "已启用": "已启用", "已启用 Passkey,无需密码即可登录": "已启用 Passkey,无需密码即可登录", "已启用所有密钥": "已启用所有密钥", "已在自定义模式中忽略": "已在自定义模式中忽略", + "已填充提示模板": "已填充提示模板", + "已填充模版": "已填充模版", + "已填充策略模板": "已填充策略模板", "已备份": "已备份", "已复制": "已复制", "已复制 ${count} 个模型": "已复制 ${count} 个模型", @@ -931,6 +1194,8 @@ "已完成": "已完成", "已开启全局请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "已开启全局请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。", "已成功开始测试所有已启用通道,请刷新页面查看结果。": "已成功开始测试所有已启用通道,请刷新页面查看结果。", + "已打开授权页面": "已打开授权页面", + "已打开支付页面": "已打开支付页面", "已提交": "已提交", "已支付金额": "已支付金额", "已新增 {{count}} 个模型:{{list}}_other": "已新增 {{count}} 个模型:{{list}}", @@ -943,30 +1208,43 @@ "已注销": "已注销", "已添加": "已添加", "已添加到白名单": "已添加到白名单", + "已清空": "已清空", "已清空测试结果": "已清空测试结果", + "已生成授权凭据": "已生成授权凭据", "已用": "已用", "已用/剩余": "已用/剩余", "已用额度": "已用额度", "已禁用": "已禁用", "已禁用所有密钥": "已禁用所有密钥", + "已终止": "已终止", "已绑定": "已绑定", "已绑定渠道": "已绑定渠道", "已结束": "已结束", "已耗尽": "已耗尽", "已解锁豆包自定义 API 地址编辑": "已解锁豆包自定义 API 地址编辑", + "已达上限": "已达上限", + "已达到购买上限": "已达到购买上限", "已过期": "已过期", "已运行时间": "已运行时间", "已选择 {{count}} 个模型_other": "已选择 {{count}} 个模型", "已选择 {{selected}} / {{total}}": "已选择 {{selected}} / {{total}}", "已选择 ${count} 个渠道": "已选择 ${count} 个渠道", + "已部署": "已部署", "已重置为默认配置": "已重置为默认配置", "已销毁": "已销毁", + "币种": "币种", + "常用上下文 Key(用于 context_*)": "常用上下文 Key(用于 context_*)", "常见问答": "常见问答", + "常见问答已更新": "常见问答已更新", + "常见问答更新失败": "常见问答更新失败", "常见问答管理,为用户提供常见问题的答案(最多50个,前端显示最新20条)": "常见问答管理,为用户提供常见问题的答案(最多50个,前端显示最新20条)", "平台": "平台", "平均RPM": "平均RPM", "平均TPM": "平均TPM", "平移": "平移", + "年": "年", + "年前": "年前", + "应付金额": "应付金额", "应用同步": "应用同步", "应用更改": "应用更改", "应用覆盖": "应用覆盖", @@ -984,18 +1262,25 @@ "开": "开", "开启之后会清除用户提示词中的": "开启之后会清除用户提示词中的", "开启之后将上游地址替换为服务器地址": "开启之后将上游地址替换为服务器地址", + "开启后,using_group 会参与 cache key(不同分组隔离)。": "开启后,using_group 会参与 cache key(不同分组隔离)。", "开启后,仅\"消费\"和\"错误\"日志将记录您的客户端IP地址": "开启后,仅\"消费\"和\"错误\"日志将记录您的客户端IP地址", "开启后,对免费模型(倍率为0,或者价格为0)的模型也会预消耗额度": "开启后,对免费模型(倍率为0,或者价格为0)的模型也会预消耗额度", "开启后,将定期发送ping数据保持连接活跃": "开启后,将定期发送ping数据保持连接活跃", "开启后,当前分组渠道失败时会按顺序尝试下一个分组的渠道": "开启后,当前分组渠道失败时会按顺序尝试下一个分组的渠道", "开启后,所有请求将直接透传给上游,不会进行任何处理(重定向和渠道适配也将失效),请谨慎开启": "开启后,所有请求将直接透传给上游,不会进行任何处理(重定向和渠道适配也将失效),请谨慎开启", + "开启后,若该规则命中且请求失败,将不会切换渠道重试。": "开启后,若该规则命中且请求失败,将不会切换渠道重试。", + "开启后,规则名称会参与 cache key(不同规则隔离)。": "开启后,规则名称会参与 cache key(不同规则隔离)。", + "开启后,该渠道请求 Claude 时将强制追加 ?beta=true(无需客户端手动传参)": "开启后,该渠道请求 Claude 时将强制追加 ?beta=true(无需客户端手动传参)", "开启后,违规请求将额外扣费。": "开启后,违规请求将额外扣费。", "开启后不限制:必须设置模型倍率": "开启后不限制:必须设置模型倍率", "开启后未登录用户无法访问模型广场": "开启后未登录用户无法访问模型广场", "开启批量操作": "开启批量操作", + "开始": "开始", "开始同步": "开始同步", "开始批量测试 ${count} 个模型,已清空上次结果...": "开始批量测试 ${count} 个模型,已清空上次结果...", "开始时间": "开始时间", + "异常": "异常", + "异步任务退款": "异步任务退款", "张图片": "张图片", "弱变换": "弱变换", "强制将响应格式化为 OpenAI 标准格式(只适用于OpenAI渠道类型)": "强制将响应格式化为 OpenAI 标准格式(只适用于OpenAI渠道类型)", @@ -1005,6 +1290,7 @@ "当上游通道返回错误中包含这些关键词时(不区分大小写),自动禁用通道": "当上游通道返回错误中包含这些关键词时(不区分大小写),自动禁用通道", "当前 API 密钥已过期,请在设置中更新。": "当前 API 密钥已过期,请在设置中更新。", "当前 Ollama 版本为 ${version}": "当前 Ollama 版本为 ${version}", + "当前仅 OpenAI / Claude 语义支持缓存 token 统计,其他通道将隐藏 token 相关字段。": "当前仅 OpenAI / Claude 语义支持缓存 token 统计,其他通道将隐藏 token 相关字段。", "当前余额": "当前余额", "当前值": "当前值", "当前分组为 auto,会自动选择最优分组,当一个组不可用时自动降级到下一个组(熔断机制)": "当前分组为 auto,会自动选择最优分组,当一个组不可用时自动降级到下一个组(熔断机制)", @@ -1013,23 +1299,30 @@ "当前未开启Midjourney回调,部分项目可能无法获得绘图结果,可在运营设置中开启。": "当前未开启Midjourney回调,部分项目可能无法获得绘图结果,可在运营设置中开启。", "当前查看的分组为:{{group}},倍率为:{{ratio}}": "当前查看的分组为:{{group}},倍率为:{{ratio}}", "当前模型列表为该标签下所有渠道模型列表最长的一个,并非所有渠道的并集,请注意可能导致某些渠道模型丢失。": "当前模型列表为该标签下所有渠道模型列表最长的一个,并非所有渠道的并集,请注意可能导致某些渠道模型丢失。", + "当前没有可用的启用令牌,请确认是否有令牌处于启用状态!": "当前没有可用的启用令牌,请确认是否有令牌处于启用状态!", + "当前浏览器不支持 Passkey": "当前浏览器不支持 Passkey", "当前版本": "当前版本", "当前状态": "当前状态", + "当前环境无法使用 Passkey 登录": "当前环境无法使用 Passkey 登录", + "当前缓存大小": "当前缓存大小", "当前计费": "当前计费", "当前设备不支持 Passkey": "当前设备不支持 Passkey", "当前设置类型: ": "当前设置类型: ", "当前跟随系统": "当前跟随系统", "当前配置无法连接到 io.net。": "当前配置无法连接到 io.net。", - "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知": "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知", "当模型没有设置价格时仍接受调用,仅当您信任该网站时使用,可能会产生高额费用": "当模型没有设置价格时仍接受调用,仅当您信任该网站时使用,可能会产生高额费用", "当运行通道全部测试时,超过此时间将自动禁用通道": "当运行通道全部测试时,超过此时间将自动禁用通道", + "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知": "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知", "待使用收益": "待使用收益", "待部署": "待部署", "微信": "微信", + "微信二维码": "微信二维码", "微信公众号二维码图片链接": "微信公众号二维码图片链接", "微信扫码关注公众号,输入「验证码」获取验证码(三分钟内有效)": "微信扫码关注公众号,输入「验证码」获取验证码(三分钟内有效)", "微信扫码登录": "微信扫码登录", "微信账户绑定成功!": "微信账户绑定成功!", + "必填:请输入服务器地址以自动生成完整端点 URL": "必填:请输入服务器地址以自动生成完整端点 URL", + "必填。对请求的 model 名称进行匹配,任意一条匹配即命中该规则。": "必填。对请求的 model 名称进行匹配,任意一条匹配即命中该规则。", "必须是有效的 JSON 字符串数组,例如:[\"g1\",\"g2\"]": "必须是有效的 JSON 字符串数组,例如:[\"g1\",\"g2\"]", "忘记密码?": "忘记密码?", "快速开始": "快速开始", @@ -1040,8 +1333,11 @@ "思考适配 BudgetTokens 百分比": "思考适配 BudgetTokens 百分比", "思考预算占比": "思考预算占比", "性能指标": "性能指标", + "性能监控": "性能监控", + "性能设置": "性能设置", "总 GPU 小时": "总 GPU 小时", "总价:文字价格 {{textPrice}} + 音频价格 {{audioPrice}} = {{symbol}}{{total}}": "总价:文字价格 {{textPrice}} + 音频价格 {{audioPrice}} = {{symbol}}{{total}}", + "总分配内存": "总分配内存", "总密钥数": "总密钥数", "总收益": "总收益", "总计": "总计", @@ -1052,6 +1348,7 @@ "您正在使用 MySQL 数据库。MySQL 是一个可靠的关系型数据库管理系统,适合生产环境使用。": "您正在使用 MySQL 数据库。MySQL 是一个可靠的关系型数据库管理系统,适合生产环境使用。", "您正在使用 PostgreSQL 数据库。PostgreSQL 是一个功能强大的开源关系型数据库系统,提供了出色的可靠性和数据完整性,适合生产环境使用。": "您正在使用 PostgreSQL 数据库。PostgreSQL 是一个功能强大的开源关系型数据库系统,提供了出色的可靠性和数据完整性,适合生产环境使用。", "您正在使用 SQLite 数据库。如果您在容器环境中运行,请确保已正确设置数据库文件的持久化映射,否则容器重启后所有数据将丢失!": "您正在使用 SQLite 数据库。如果您在容器环境中运行,请确保已正确设置数据库文件的持久化映射,否则容器重启后所有数据将丢失!", + "您正在使用默认密码!": "您正在使用默认密码!", "您正在删除自己的帐户,将清空所有数据且不可恢复": "您正在删除自己的帐户,将清空所有数据且不可恢复", "您的数据将安全地存储在本地计算机上。所有配置、用户信息和使用记录都会自动保存,关闭应用后不会丢失。": "您的数据将安全地存储在本地计算机上。所有配置、用户信息和使用记录都会自动保存,关闭应用后不会丢失。", "您确定要取消密码登录功能吗?这可能会影响用户的登录方式。": "您确定要取消密码登录功能吗?这可能会影响用户的登录方式。", @@ -1060,9 +1357,12 @@ "想起来了?": "想起来了?", "成功": "成功", "成功兑换额度:": "成功兑换额度:", + "成功后切换亲和": "成功后切换亲和", "成功时自动启用通道": "成功时自动启用通道", "我已了解禁用两步验证将永久删除所有相关设置和备用码,此操作不可撤销": "我已了解禁用两步验证将永久删除所有相关设置和备用码,此操作不可撤销", "我已阅读并同意": "我已阅读并同意", + "我的订阅": "我的订阅", + "我确认开启高危重试": "我确认开启高危重试", "或": "或", "或其兼容new-api-worker格式的其他版本": "或其兼容new-api-worker格式的其他版本", "或手动输入密钥:": "或手动输入密钥:", @@ -1073,6 +1373,9 @@ "手动编辑": "手动编辑", "手动输入": "手动输入", "打开侧边栏": "打开侧边栏", + "打开授权页面": "打开授权页面", + "扣费": "扣费", + "执行 GC": "执行 GC", "执行中": "执行中", "扫描二维码": "扫描二维码", "批量创建": "批量创建", @@ -1099,6 +1402,8 @@ "拉取新模型": "拉取新模型", "拉取模型": "拉取模型", "拉取进度": "拉取进度", + "拒绝提示模板(可选)": "拒绝提示模板(可选)", + "拦截原因": "拦截原因", "按K显示单位": "按K显示单位", "按价格设置": "按价格设置", "按倍率类型筛选": "按倍率类型筛选", @@ -1110,6 +1415,9 @@ "换脸": "换脸", "授权,需在遵守": "授权,需在遵守", "授权失败": "授权失败", + "授权端点": "授权端点", + "授权范围 (Scopes)": "授权范围 (Scopes)", + "排序": "排序", "排队中": "排队中", "接受未设置价格模型": "接受未设置价格模型", "接口凭证": "接口凭证", @@ -1118,23 +1426,27 @@ "控制台区域": "控制台区域", "控制输出的随机性和创造性": "控制输出的随机性和创造性", "控制顶栏模块显示状态,全局生效": "控制顶栏模块显示状态,全局生效", + "推荐": "推荐", "推荐:用户可以选择是否使用指纹等验证": "推荐:用户可以选择是否使用指纹等验证", "推荐使用(用户可选)": "推荐使用(用户可选)", "描述": "描述", "提交": "提交", "提交时间": "提交时间", "提交结果": "提交结果", + "提供商名称": "提供商名称", "提升": "提升", "提示": "提示", "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}}", "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 缓存创建 {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 缓存创建 {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "提示:": "提示:", "提示:如需备份数据,只需复制上述目录即可": "提示:如需备份数据,只需复制上述目录即可", + "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。": "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。", + "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。": "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。", + "提示:语言偏好会同步到您登录的所有设备,并影响API返回的错误消息语言。": "提示:语言偏好会同步到您登录的所有设备,并影响API返回的错误消息语言。", "提示:链接中的{key}将被替换为API密钥,{address}将被替换为服务器地址": "提示:链接中的{key}将被替换为API密钥,{address}将被替换为服务器地址", "提示价格:{{symbol}}{{price}} / 1M tokens": "提示价格:{{symbol}}{{price}} / 1M tokens", "提示缓存倍率": "提示缓存倍率", - "缓存创建倍率": "缓存创建倍率", - "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)": "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)", "搜索供应商": "搜索供应商", "搜索关键字": "搜索关键字", "搜索失败": "搜索失败", @@ -1151,17 +1463,26 @@ "操作": "操作", "操作失败": "操作失败", "操作失败,请重试": "操作失败,请重试", + "操作失败: ": "操作失败: ", "操作成功完成!": "操作成功完成!", "操作暂时被禁用": "操作暂时被禁用", + "操作确认": "操作确认", "操练场": "操练场", "操练场和聊天功能": "操练场和聊天功能", + "支付": "支付", "支付地址": "支付地址", + "支付失败": "支付失败", "支付宝": "支付宝", "支付方式": "支付方式", + "支付渠道": "支付渠道", "支付设置": "支付设置", "支付请求失败": "支付请求失败", "支付金额": "支付金额", "支持 Ctrl+V 粘贴图片": "支持 Ctrl+V 粘贴图片", + "支持 JSONPath,如 email, data.user.email": "支持 JSONPath,如 email, data.user.email", + "支持 JSONPath,如 name, display_name, data.user.name": "支持 JSONPath,如 name, display_name, data.user.name", + "支持 JSONPath,如 preferred_username, login, data.user.username": "支持 JSONPath,如 preferred_username, login, data.user.username", + "支持 JSONPath,如 sub, id, data.user.id": "支持 JSONPath,如 sub, id, data.user.id", "支持6位TOTP验证码或8位备用码,可到`个人设置-安全设置-两步验证设置`配置或查看。": "支持6位TOTP验证码或8位备用码,可到`个人设置-安全设置-两步验证设置`配置或查看。", "支持CIDR格式,如:8.8.8.8, 192.168.1.0/24": "支持CIDR格式,如:8.8.8.8, 192.168.1.0/24", "支持HTTP和HTTPS,填写Gotify服务器的完整URL地址": "支持HTTP和HTTPS,填写Gotify服务器的完整URL地址", @@ -1169,11 +1490,15 @@ "支持众多的大模型供应商": "支持众多的大模型供应商", "支持单个端口和端口范围,如:80, 443, 8000-8999": "支持单个端口和端口范围,如:80, 443, 8000-8999", "支持变量:": "支持变量:", + "支持周期性重置套餐权益额度": "支持周期性重置套餐权益额度", + "支持填写单个状态码或范围(含首尾),使用逗号分隔": "支持填写单个状态码或范围(含首尾),使用逗号分隔", + "支持填写单个状态码或范围(含首尾),使用逗号分隔;504 和 524 始终不重试,不受此处配置影响": "支持填写单个状态码或范围(含首尾),使用逗号分隔;504 和 524 始终不重试,不受此处配置影响", "支持备份": "支持备份", "支持拉取 Ollama 官方模型库中的所有模型,拉取过程可能需要几分钟时间": "支持拉取 Ollama 官方模型库中的所有模型,拉取过程可能需要几分钟时间", "支持搜索用户的 ID、用户名、显示名称和邮箱地址": "支持搜索用户的 ID、用户名、显示名称和邮箱地址", "支持的图像模型": "支持的图像模型", "支持通配符格式,如:example.com, *.api.example.com": "支持通配符格式,如:example.com, *.api.example.com", + "支持逻辑 and/or 与嵌套 groups;操作符支持 eq/ne/gt/gte/lt/lte/in/not_in/contains/exists": "支持逻辑 and/or 与嵌套 groups;操作符支持 eq/ne/gt/gte/lt/lte/in/not_in/contains/exists", "收益": "收益", "收益统计": "收益统计", "收起": "收起", @@ -1204,10 +1529,16 @@ "文档": "文档", "文档地址": "文档地址", "文生视频": "文生视频", + "新增 Key 来源": "新增 Key 来源", "新增供应商": "新增供应商", + "新增失败": "新增失败", + "新增成功": "新增成功", + "新增规则": "新增规则", + "新增订阅": "新增订阅", "新密码": "新密码", "新密码需要和原密码不一致!": "新密码需要和原密码不一致!", "新建": "新建", + "新建套餐": "新建套餐", "新建容器": "新建容器", "新建容器部署": "新建容器部署", "新建数量": "新建数量", @@ -1227,13 +1558,17 @@ "无效的部署信息": "无效的部署信息", "无效的重置链接,请重新发起密码重置请求": "无效的重置链接,请重新发起密码重置请求", "无法发起 Passkey 注册": "无法发起 Passkey 注册", + "无法发起 Passkey 登录": "无法发起 Passkey 登录", "无法复制到剪贴板,请手动复制": "无法复制到剪贴板,请手动复制", + "无法复制此类型的消息内容": "无法复制此类型的消息内容", "无法添加图片": "无法添加图片", "无法获取容器详情": "无法获取容器详情", "无法连接 io.net": "无法连接 io.net", + "无生效": "无生效", "无邀请人": "无邀请人", "无限制": "无限制", "无限额度": "无限额度", + "日": "日", "日志导出成功": "日志导出成功", "日志已下载": "日志已下载", "日志已加载": "日志已加载", @@ -1246,10 +1581,12 @@ "旧格式(直接覆盖):": "旧格式(直接覆盖):", "旧格式模板": "旧格式模板", "旧的备用码已失效,请保存新的备用码": "旧的备用码已失效,请保存新的备用码", + "旧配置迁移完成": "旧配置迁移完成", "早上好": "早上好", "时间": "时间", "时间信息": "时间信息", "时间粒度": "时间粒度", + "易支付": "易支付", "易支付商户ID": "易支付商户ID", "易支付商户密钥": "易支付商户密钥", "是": "是", @@ -1262,6 +1599,8 @@ "显示倍率": "显示倍率", "显示最新20条": "显示最新20条", "显示名称": "显示名称", + "显示名称字段": "显示名称字段", + "显示名称字段(可选)": "显示名称字段(可选)", "显示完整内容": "显示完整内容", "显示操作项": "显示操作项", "显示更多": "显示更多", @@ -1274,6 +1613,8 @@ "智能体ID": "智能体ID", "智能熔断": "智能熔断", "智谱": "智谱", + "智谱 ChatGLM(已经弃用,请使用智谱 GLM-4V)": "智谱 ChatGLM(已经弃用,请使用智谱 GLM-4V)", + "智谱 GLM-4V": "智谱 GLM-4V", "暂无": "暂无", "暂无API信息": "暂无API信息", "暂无SSE响应数据": "暂无SSE响应数据", @@ -1283,12 +1624,15 @@ "暂无公告": "暂无公告", "暂无匹配模型": "暂无匹配模型", "暂无可复制的版本信息": "暂无可复制的版本信息", + "暂无可展示数据": "暂无可展示数据", "暂无可用的支付方式,请联系管理员配置": "暂无可用的支付方式,请联系管理员配置", + "暂无可购买套餐": "暂无可购买套餐", "暂无响应数据": "暂无响应数据", "暂无容器信息": "暂无容器信息", "暂无容器详情": "暂无容器详情", "暂无密钥数据": "暂无密钥数据", "暂无差异化倍率显示": "暂无差异化倍率显示", + "暂无已绑定项": "暂无已绑定项", "暂无常见问答": "暂无常见问答", "暂无成功模型": "暂无成功模型", "暂无数据": "暂无数据", @@ -1303,6 +1647,9 @@ "暂无监控数据": "暂无监控数据", "暂无系统公告": "暂无系统公告", "暂无缺失模型": "暂无缺失模型", + "暂无自定义 OAuth 提供商": "暂无自定义 OAuth 提供商", + "暂无订阅套餐": "暂无订阅套餐", + "暂无订阅记录": "暂无订阅记录", "暂无请求数据": "暂无请求数据", "暂无项目": "暂无项目", "暂无预填组": "暂无预填组", @@ -1321,8 +1668,11 @@ "更新名称失败": "更新名称失败", "更新失败": "更新失败", "更新失败,请检查输入信息": "更新失败,请检查输入信息", + "更新套餐信息": "更新套餐信息", "更新容器配置": "更新容器配置", "更新容器配置可能会导致容器重启,请确保在合适的时间进行此操作。": "更新容器配置可能会导致容器重启,请确保在合适的时间进行此操作。", + "更新成功": "更新成功", + "更新成功!": "更新成功!", "更新所有已启用通道余额": "更新所有已启用通道余额", "更新支付设置": "更新支付设置", "更新时间": "更新时间", @@ -1334,16 +1684,25 @@ "更新配置后,容器可能需要重启以应用新的设置。请确保您了解这些更改的影响。": "更新配置后,容器可能需要重启以应用新的设置。请确保您了解这些更改的影响。", "更新配置失败": "更新配置失败", "更新预填组": "更新预填组", + "月": "月", "有 Reasoning": "有 Reasoning", + "有异常": "有异常", + "有效期": "有效期", + "有效期单位": "有效期单位", + "有效期数值": "有效期数值", + "有效期设置": "有效期设置", "服务可用性": "服务可用性", "服务商": "服务商", "服务器地址": "服务器地址", "服务显示名称": "服务显示名称", + "未使用": "未使用", + "未匹配到模型,按回车键可将「{{name}}」作为自定义模型名添加": "未匹配到模型,按回车键可将「{{name}}」作为自定义模型名添加", "未发现新增模型": "未发现新增模型", "未发现重复密钥": "未发现重复密钥", "未启动": "未启动", "未启用": "未启用", "未命名": "未命名", + "未在 Discovery 响应中找到可用的 OAuth 端点": "未在 Discovery 响应中找到可用的 OAuth 端点", "未备份": "未备份", "未开始": "未开始", "未找到匹配的模型": "未找到匹配的模型", @@ -1370,9 +1729,13 @@ "未设置倍率模型": "未设置倍率模型", "未配置模型": "未配置模型", "未配置的模型列表": "未配置的模型列表", + "本周": "本周", "本地": "本地", "本地数据存储": "本地数据存储", "本地计费": "本地计费", + "本月": "本月", + "本月获得": "本月获得", + "本站仅作演示之用,无服务端!": "本站仅作演示之用,无服务端!", "本设备:手机指纹/面容,外接:USB安全密钥": "本设备:手机指纹/面容,外接:USB安全密钥", "本设备内置": "本设备内置", "本项目根据": "本项目根据", @@ -1380,11 +1743,13 @@ "机密环境变量将被加密存储,适用于存储密码、API密钥等敏感信息。": "机密环境变量将被加密存储,适用于存储密码、API密钥等敏感信息。", "机密环境变量说明": "机密环境变量说明", "权重": "权重", + "权重必须是非负整数!": "权重必须是非负整数!", "权限设置": "权限设置", "条": "条", "条 - 第": "条 - 第", "条,共": "条,共", "条日志已清理!": "条日志已清理!", + "来源": "来源", "来源于 IO.NET 部署": "来源于 IO.NET 部署", "来自模型重定向,尚未加入模型列表": "来自模型重定向,尚未加入模型列表", "某些配置更改可能需要几分钟才能生效。": "某些配置更改可能需要几分钟才能生效。", @@ -1402,20 +1767,27 @@ "标签不能为空!": "标签不能为空!", "标签信息": "标签信息", "标签名称": "标签名称", + "标签更新成功!": "标签更新成功!", "标签的基本配置": "标签的基本配置", "标签组": "标签组", "标签聚合": "标签聚合", "标签聚合模式": "标签聚合模式", + "标识符 (Slug)": "标识符 (Slug)", "标识颜色": "标识颜色", "核采样,控制词汇选择的多样性": "核采样,控制词汇选择的多样性", + "根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。": "根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。", "根据模型名称和匹配规则查找模型元数据,优先级:精确 > 前缀 > 后缀 > 包含": "根据模型名称和匹配规则查找模型元数据,优先级:精确 > 前缀 > 后缀 > 包含", "格式化": "格式化", + "格式化 JSON": "格式化 JSON", "格式正确": "格式正确", "格式示例:": "格式示例:", "格式错误": "格式错误", "检查更新": "检查更新", + "检查更新失败,请稍后再试": "检查更新失败,请稍后再试", "检测到 FluentRead(流畅阅读)": "检测到 FluentRead(流畅阅读)", + "检测到以下高危状态码重定向规则": "检测到以下高危状态码重定向规则", "检测到多个密钥,您可以单独复制每个密钥,或点击复制全部获取完整内容。": "检测到多个密钥,您可以单独复制每个密钥,或点击复制全部获取完整内容。", + "检测到旧版本的配置数据,是否要迁移到新的配置格式?": "检测到旧版本的配置数据,是否要迁移到新的配置格式?", "检测到该消息后有AI回复,是否删除后续回复并重新生成?": "检测到该消息后有AI回复,是否删除后续回复并重新生成?", "检测必须等待绘图成功才能进行放大等操作": "检测必须等待绘图成功才能进行放大等操作", "模型": "模型", @@ -1424,6 +1796,7 @@ "模型价格": "模型价格", "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}": "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}", "模型价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "模型价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}", + "模型价格不能为0": "模型价格不能为0", "模型倍率": "模型倍率", "模型倍率 {{modelRatio}}": "模型倍率 {{modelRatio}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}}": "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}}", @@ -1454,6 +1827,9 @@ "模型映射必须是合法的 JSON 格式!": "模型映射必须是合法的 JSON 格式!", "模型更新成功!": "模型更新成功!", "模型未加入列表,可能无法调用": "模型未加入列表,可能无法调用", + "模型正则": "模型正则", + "模型正则(每行一个)": "模型正则(每行一个)", + "模型正则不能为空": "模型正则不能为空", "模型消耗分布": "模型消耗分布", "模型消耗趋势": "模型消耗趋势", "模型版本": "模型版本", @@ -1481,6 +1857,7 @@ "欢迎使用,请完成以下设置以开始使用系统": "欢迎使用,请完成以下设置以开始使用系统", "欧元": "欧元", "正在加载可用部署位置...": "正在加载可用部署位置...", + "正在加载签到状态...": "正在加载签到状态...", "正在处理大内容...": "正在处理大内容...", "正在提交": "正在提交", "正在构造请求体预览...": "正在构造请求体预览...", @@ -1489,6 +1866,7 @@ "正在跟随最新日志": "正在跟随最新日志", "正在跳转 GitHub...": "正在跳转 GitHub...", "正在跳转...": "正在跳转...", + "正常": "正常", "此代理仅用于图片请求转发,Webhook通知发送等,AI API请求仍然由服务器直接发出,可在渠道设置中单独配置代理": "此代理仅用于图片请求转发,Webhook通知发送等,AI API请求仍然由服务器直接发出,可在渠道设置中单独配置代理", "此修改将不可逆": "此修改将不可逆", "此操作不可恢复,请仔细确认时间后再操作!": "此操作不可恢复,请仔细确认时间后再操作!", @@ -1503,6 +1881,7 @@ "此操作将解绑用户当前的 Passkey,下次登录需要重新注册。": "此操作将解绑用户当前的 Passkey,下次登录需要重新注册。", "此操作将降低用户的权限级别": "此操作将降低用户的权限级别", "此支付方式最低充值金额为": "此支付方式最低充值金额为", + "此消息没有可复制的文本内容": "此消息没有可复制的文本内容", "此渠道由 IO.NET 自动同步,类型、密钥和 API 地址已锁定。": "此渠道由 IO.NET 自动同步,类型、密钥和 API 地址已锁定。", "此设置用于系统内部计算,默认值500000是为了精确到6位小数点设计,不推荐修改。": "此设置用于系统内部计算,默认值500000是为了精确到6位小数点设计,不推荐修改。", "此页面仅显示未设置价格或倍率的模型,设置后将自动从列表中移除": "此页面仅显示未设置价格或倍率的模型,设置后将自动从列表中移除", @@ -1513,11 +1892,20 @@ "此项可选,用于覆盖请求参数。不支持覆盖 stream 参数": "此项可选,用于覆盖请求参数。不支持覆盖 stream 参数", "此项可选,用于覆盖请求头参数": "此项可选,用于覆盖请求头参数", "此项可选,用于通过自定义API地址来进行 API 调用,末尾不要带/v1和/": "此项可选,用于通过自定义API地址来进行 API 调用,末尾不要带/v1和/", + "每个用户最多可创建的令牌数量,默认 1000,设置过大可能会影响性能": "每个用户最多可创建的令牌数量,默认 1000,设置过大可能会影响性能", + "每周": "每周", + "每周窗口": "每周窗口", + "每天": "每天", "每容器GPU数": "每容器GPU数", + "每日仅可签到一次,请勿重复签到": "每日仅可签到一次,请勿重复签到", + "每日签到": "每日签到", + "每日签到可获得随机额度奖励": "每日签到可获得随机额度奖励", + "每月": "每月", "每隔多少分钟测试一次所有通道": "每隔多少分钟测试一次所有通道", "永不过期": "永不过期", "永久删除您的两步验证设置": "永久删除您的两步验证设置", "永久删除所有备用码(包括未使用的)": "永久删除所有备用码(包括未使用的)", + "没有任何修改!": "没有任何修改!", "没有匹配的日志条目": "没有匹配的日志条目", "没有可用令牌用于填充": "没有可用令牌用于填充", "没有可用模型": "没有可用模型", @@ -1528,15 +1916,20 @@ "注 册": "注 册", "注册": "注册", "注册 Passkey": "注册 Passkey", + "注册失败,请重试": "注册失败,请重试", + "注册成功!": "注册成功!", "注意": "注意", + "注意:": "注意:", "注意:JSON中重复的键只会保留最后一个同名键的值": "注意:JSON中重复的键只会保留最后一个同名键的值", "注意非Chat API,请务必填写正确的API地址,否则可能导致无法使用": "注意非Chat API,请务必填写正确的API地址,否则可能导致无法使用", "注销": "注销", "注销成功!": "注销成功!", + "活跃文件": "活跃文件", + "活跃缓存数": "活跃缓存数", "流": "流", + "流式": "流式", "流式响应完成": "流式响应完成", "流式输出": "流式输出", - "流式": "流式", "流量端口": "流量端口", "浅色": "浅色", "浅色模式": "浅色模式", @@ -1547,12 +1940,13 @@ "测试单个渠道操作项目组": "测试单个渠道操作项目组", "测试失败": "测试失败", "测试失败:": "测试失败:", + "测试所有未手动禁用渠道": "测试所有未手动禁用渠道", "测试所有渠道的最长响应时间": "测试所有渠道的最长响应时间", "测试所有通道": "测试所有通道", - "测试所有未手动禁用渠道": "测试所有未手动禁用渠道", "测试模式": "测试模式", "测试连接": "测试连接", "测速": "测速", + "浏览器不支持复制功能,请手动复制": "浏览器不支持复制功能,请手动复制", "消息优先级": "消息优先级", "消息优先级,范围0-10,默认为5": "消息优先级,范围0-10,默认为5", "消息已删除": "消息已删除", @@ -1566,6 +1960,7 @@ "深色": "深色", "深色模式": "深色模式", "添加": "添加", + "添加 OAuth 提供商": "添加 OAuth 提供商", "添加API": "添加API", "添加产品": "添加产品", "添加令牌": "添加令牌", @@ -1577,6 +1972,7 @@ "添加启动命令": "添加启动命令", "添加密钥环境变量": "添加密钥环境变量", "添加成功": "添加成功", + "添加提供商": "添加提供商", "添加模型": "添加模型", "添加模型区域": "添加模型区域", "添加渠道": "添加渠道", @@ -1586,14 +1982,22 @@ "添加键值对": "添加键值对", "添加问答": "添加问答", "添加额度": "添加额度", + "清理不活跃缓存": "清理不活跃缓存", + "清理失败": "清理失败", "清空": "清空", + "清空全部缓存": "清空全部缓存", + "清空该规则缓存": "清空该规则缓存", "清空重定向": "清空重定向", "清除历史日志": "清除历史日志", "清除失效兑换码": "清除失效兑换码", "清除所有模型": "清除所有模型", "渠道": "渠道", "渠道 ID": "渠道 ID", + "渠道:": "渠道:", "渠道ID,名称,密钥,API地址": "渠道ID,名称,密钥,API地址", + "渠道亲和性": "渠道亲和性", + "渠道亲和性:上游缓存命中": "渠道亲和性:上游缓存命中", + "渠道亲和性会基于从请求上下文或 JSON Body 提取的 Key,优先复用上一次成功的渠道。": "渠道亲和性会基于从请求上下文或 JSON Body 提取的 Key,优先复用上一次成功的渠道。", "渠道优先级": "渠道优先级", "渠道信息": "渠道信息", "渠道创建成功!": "渠道创建成功!", @@ -1625,8 +2029,6 @@ "点击此处": "点击此处", "点击预览视频": "点击预览视频", "点击预览音乐": "点击预览音乐", - "音乐预览": "音乐预览", - "音频无法播放": "音频无法播放", "点击验证按钮,使用您的生物特征或安全密钥": "点击验证按钮,使用您的生物特征或安全密钥", "版权所有": "版权所有", "状态": "状态", @@ -1636,12 +2038,15 @@ "状态页面Slug": "状态页面Slug", "环境变量": "环境变量", "生成令牌": "生成令牌", + "生成并填入": "生成并填入", "生成数量": "生成数量", "生成数量必须大于0": "生成数量必须大于0", "生成新的备用码": "生成新的备用码", "生成歌词": "生成歌词", "生成音乐": "生成音乐", + "生效": "生效", "用于API调用的身份验证令牌,请妥善保管": "用于API调用的身份验证令牌,请妥善保管", + "用于唯一标识用户的字段路径": "用于唯一标识用户的字段路径", "用于配置网络代理,支持 socks5 协议": "用于配置网络代理,支持 socks5 协议", "用于验证回调 new-api 的 webhook 请求的密钥,敏感信息不显示": "用于验证回调 new-api 的 webhook 请求的密钥,敏感信息不显示", "用以支持基于 WebAuthn 的无密码登录注册": "用以支持基于 WebAuthn 的无密码登录注册", @@ -1655,11 +2060,16 @@ "用以支持通过微信进行登录注册": "用以支持通过微信进行登录注册", "用以防止恶意用户利用临时邮箱批量注册": "用以防止恶意用户利用临时邮箱批量注册", "用户": "用户", + "用户 ID 字段": "用户 ID 字段", + "用户 ID 字段(可选)": "用户 ID 字段(可选)", "用户个人功能": "用户个人功能", "用户主页,展示系统信息": "用户主页,展示系统信息", "用户优先:如果用户在请求中指定了系统提示词,将优先使用用户的设置": "用户优先:如果用户在请求中指定了系统提示词,将优先使用用户的设置", "用户信息": "用户信息", "用户信息更新成功!": "用户信息更新成功!", + "用户信息端点": "用户信息端点", + "用户信息缺失": "用户信息缺失", + "用户最大令牌数量": "用户最大令牌数量", "用户分组": "用户分组", "用户分组和额度管理": "用户分组和额度管理", "用户分组配置": "用户分组配置", @@ -1668,6 +2078,8 @@ "用户协议更新失败": "用户协议更新失败", "用户可选分组": "用户可选分组", "用户名": "用户名", + "用户名字段": "用户名字段", + "用户名字段(可选)": "用户名字段(可选)", "用户名或邮箱": "用户名或邮箱", "用户名称": "用户名称", "用户控制面板,管理账户": "用户控制面板,管理账户", @@ -1678,25 +2090,39 @@ "用户的基本账户信息": "用户的基本账户信息", "用户管理": "用户管理", "用户组": "用户组", + "用户订阅管理": "用户订阅管理", "用户账户创建成功!": "用户账户创建成功!", "用户账户管理": "用户账户管理", "用时/首字": "用时/首字", + "由全站货币展示设置统一控制": "由全站货币展示设置统一控制", + "由订阅抵扣": "由订阅抵扣", + "界面语言和其他个人偏好": "界面语言和其他个人偏好", + "留空使用系统临时目录": "留空使用系统临时目录", "留空则使用账号绑定的邮箱": "留空则使用账号绑定的邮箱", "留空则使用默认端点;支持 {path, method}": "留空则使用默认端点;支持 {path, method}", + "留空则保持原有密钥": "留空则保持原有密钥", "留空则默认使用服务器地址,注意不能携带http://或者https://": "留空则默认使用服务器地址,注意不能携带http://或者https://", "登 录": "登 录", "登录": "登录", + "登录失败,请重试": "登录失败,请重试", + "登录成功": "登录成功", "登录成功!": "登录成功!", "登录过期,请重新登录!": "登录过期,请重新登录!", "白名单": "白名单", + "百度文心千帆": "百度文心千帆", + "百度文心千帆V2": "百度文心千帆V2", "的前提下使用。": "的前提下使用。", "监控设置": "监控设置", + "目录总大小": "目录总大小", + "目录文件数": "目录文件数", "目标用户:{{username}}": "目标用户:{{username}}", "直接提交": "直接提交", "相关项目": "相关项目", "相当于删除用户,此修改将不可逆": "相当于删除用户,此修改将不可逆", "矛盾": "矛盾", "知识库 ID": "知识库 ID", + "知识库:AI Proxy": "知识库:AI Proxy", + "知识库:FastGPT": "知识库:FastGPT", "硬件": "硬件", "硬件与性能": "硬件与性能", "硬件类型": "硬件类型", @@ -1722,43 +2148,63 @@ "确定要删除所有已自动禁用的密钥吗?": "确定要删除所有已自动禁用的密钥吗?", "确定要删除所选的 {{count}} 个令牌吗?_other": "确定要删除所选的 {{count}} 个令牌吗?", "确定要删除所选的 {{count}} 个模型吗?_other": "确定要删除所选的 {{count}} 个模型吗?", + "确定要删除此 OAuth 提供商吗?": "确定要删除此 OAuth 提供商吗?", "确定要删除此API信息吗?": "确定要删除此API信息吗?", "确定要删除此公告吗?": "确定要删除此公告吗?", "确定要删除此分类吗?": "确定要删除此分类吗?", "确定要删除此密钥吗?": "确定要删除此密钥吗?", "确定要删除此问答吗?": "确定要删除此问答吗?", + "确定要删除该提供商吗?": "确定要删除该提供商吗?", "确定要删除这条消息吗?": "确定要删除这条消息吗?", "确定要删除选中的": "确定要删除选中的", "确定要启用所有密钥吗?": "确定要启用所有密钥吗?", "确定要启用此用户吗?": "确定要启用此用户吗?", "确定要提升此用户吗?": "确定要提升此用户吗?", "确定要更新所有已启用通道余额吗?": "确定要更新所有已启用通道余额吗?", - "确定要测试所有通道吗?": "确定要测试所有通道吗?", "确定要测试所有未手动禁用渠道吗?": "确定要测试所有未手动禁用渠道吗?", + "确定要测试所有通道吗?": "确定要测试所有通道吗?", "确定要禁用所有的密钥吗?": "确定要禁用所有的密钥吗?", "确定要禁用此用户吗?": "确定要禁用此用户吗?", + "确定要解绑 {{name}} 吗?": "确定要解绑 {{name}} 吗?", "确定要降级此用户吗?": "确定要降级此用户吗?", "确定重置": "确定重置", "确定重置模型倍率吗?": "确定重置模型倍率吗?", "确认": "确认", + "确认作废": "确认作废", + "确认关闭提示": "确认关闭提示", "确认冲突项修改": "确认冲突项修改", "确认删除": "确认删除", "确认删除模型": "确认删除模型", "确认取消密码登录": "确认取消密码登录", + "确认启用": "确认启用", "确认密码": "确认密码", "确认导入配置": "确认导入配置", "确认延长": "确认延长", "确认延长容器时长": "确认延长容器时长", "确认操作": "确认操作", "确认新密码": "确认新密码", + "确认清理不活跃的磁盘缓存?": "确认清理不活跃的磁盘缓存?", + "确认清空全部渠道亲和性缓存": "确认清空全部渠道亲和性缓存", + "确认清空该规则缓存": "确认清空该规则缓存", "确认清除历史日志": "确认清除历史日志", "确认禁用": "确认禁用", "确认补单": "确认补单", + "确认解绑": "确认解绑", "确认解绑 Passkey": "确认解绑 Passkey", "确认设置并完成初始化": "确认设置并完成初始化", + "确认迁移": "确认迁移", "确认重置 Passkey": "确认重置 Passkey", "确认重置两步验证": "确认重置两步验证", "确认重置密码": "确认重置密码", + "磁盘 阈值 (%)": "磁盘 阈值 (%)", + "磁盘使用率超过此值时拒绝请求": "磁盘使用率超过此值时拒绝请求", + "磁盘可用空间小于缓存最大总量设置": "磁盘可用空间小于缓存最大总量设置", + "磁盘命中": "磁盘命中", + "磁盘缓存最大总量 (MB)": "磁盘缓存最大总量 (MB)", + "磁盘缓存占用的最大空间": "磁盘缓存占用的最大空间", + "磁盘缓存已清理": "磁盘缓存已清理", + "磁盘缓存设置(磁盘换内存)": "磁盘缓存设置(磁盘换内存)", + "磁盘缓存阈值 (MB)": "磁盘缓存阈值 (MB)", "示例": "示例", "示例:{\"default\": [200, 100], \"vip\": [0, 1000]}。": "示例:{\"default\": [200, 100], \"vip\": [0, 1000]}。", "视频": "视频", @@ -1770,6 +2216,7 @@ "禁用两步验证": "禁用两步验证", "禁用全部": "禁用全部", "禁用原因": "禁用原因", + "禁用后用户端不再展示,但历史订单不受影响。是否继续?": "禁用后用户端不再展示,但历史订单不受影响。是否继续?", "禁用后的影响:": "禁用后的影响:", "禁用密钥失败": "禁用密钥失败", "禁用思考处理的模型列表": "禁用思考处理的模型列表", @@ -1782,21 +2229,35 @@ "秒": "秒", "移除 functionResponse.id 字段": "移除 functionResponse.id 字段", "移除 One API 的版权标识必须首先获得授权,项目维护需要花费大量精力,如果本项目对你有意义,请主动支持本项目": "移除 One API 的版权标识必须首先获得授权,项目维护需要花费大量精力,如果本项目对你有意义,请主动支持本项目", + "窗口:": "窗口:", "窗口处理": "窗口处理", "窗口等待": "窗口等待", + "立即签到": "立即签到", + "立即订阅": "立即订阅", "站点额度展示类型及汇率": "站点额度展示类型及汇率", "端口号必须在1-65535之间": "端口号必须在1-65535之间", "端口配置详细说明": "限制外部请求只能访问指定端口。支持单个端口(80, 443)或端口范围(8000-8999)。空列表允许所有端口。默认包含常用Web端口。", "端点": "端点", + "端点 URL 必须以 http:// 或 https:// 开头:": "端点 URL 必须以 http:// 或 https:// 开头:", + "端点 URL 必须是完整地址(以 http:// 或 https:// 开头)": "端点 URL 必须是完整地址(以 http:// 或 https:// 开头)", "端点映射": "端点映射", - "在模型广场向用户展示的端点": "在模型广场向用户展示的端点", "端点类型": "端点类型", "端点组": "端点组", + "第三方支付配置": "第三方支付配置", "第三方账户绑定状态(只读)": "第三方账户绑定状态(只读)", "等价金额:": "等价金额:", "等待中": "等待中", "等待获取邮箱信息...": "等待获取邮箱信息...", "筛选": "筛选", + "签到最大额度": "签到最大额度", + "签到最小额度": "签到最小额度", + "签到功能允许用户每日签到获取随机额度奖励": "签到功能允许用户每日签到获取随机额度奖励", + "签到失败": "签到失败", + "签到奖励将直接添加到您的账户余额": "签到奖励将直接添加到您的账户余额", + "签到奖励的最大额度": "签到奖励的最大额度", + "签到奖励的最小额度": "签到奖励的最小额度", + "签到成功!获得": "签到成功!获得", + "签到设置": "签到设置", "管理": "管理", "管理 Ollama 模型的拉取和删除": "管理 Ollama 模型的拉取和删除", "管理你的 LinuxDO OAuth App": "管理你的 LinuxDO OAuth App", @@ -1807,20 +2268,27 @@ "管理员未开启Stripe充值!": "管理员未开启Stripe充值!", "管理员未开启在线充值!": "管理员未开启在线充值!", "管理员未开启在线充值功能,请联系管理员开启或使用兑换码充值。": "管理员未开启在线充值功能,请联系管理员开启或使用兑换码充值。", + "管理员未开启在线支付功能,请联系管理员配置。": "管理员未开启在线支付功能,请联系管理员配置。", "管理员未设置用户可选分组": "管理员未设置用户可选分组", "管理员设置了外部链接,点击下方按钮访问": "管理员设置了外部链接,点击下方按钮访问", "管理员账号": "管理员账号", "管理员账号已经初始化过,请继续设置其他参数": "管理员账号已经初始化过,请继续设置其他参数", "管理模型、标签、端点等预填组": "管理模型、标签、端点等预填组", + "管理用户已绑定的第三方账户,支持筛选与解绑": "管理用户已绑定的第三方账户,支持筛选与解绑", + "管理绑定": "管理绑定", "类型": "类型", "粘贴图片失败": "粘贴图片失败", "精确": "精确", + "精确名称匹配": "精确名称匹配", "系统": "系统", "系统令牌已复制到剪切板": "系统令牌已复制到剪切板", "系统任务记录": "系统任务记录", "系统信息": "系统信息", "系统公告": "系统公告", + "系统公告已更新": "系统公告已更新", + "系统公告更新失败": "系统公告更新失败", "系统公告管理,可以发布系统通知和重要消息(最多100个,前端显示最新20条)": "系统公告管理,可以发布系统通知和重要消息(最多100个,前端显示最新20条)", + "系统内存": "系统内存", "系统初始化": "系统初始化", "系统初始化失败,请重试": "系统初始化失败,请重试", "系统初始化成功,正在跳转...": "系统初始化成功,正在跳转...", @@ -1829,6 +2297,7 @@ "系统名称已更新": "系统名称已更新", "系统名称更新失败": "系统名称更新失败", "系统已为该部署准备 Ollama 镜像与随机 API Key": "系统已为该部署准备 Ollama 镜像与随机 API Key", + "系统性能监控": "系统性能监控", "系统提示覆盖": "系统提示覆盖", "系统提示词": "系统提示词", "系统提示词拼接": "系统提示词拼接", @@ -1836,22 +2305,13 @@ "系统文档和帮助信息": "系统文档和帮助信息", "系统消息": "系统消息", "系统管理功能": "系统管理功能", - "系统性能监控": "系统性能监控", - "启用性能监控后,当系统资源使用率超过设定阈值时,将拒绝新的 Relay 请求 (/v1, /v1beta 等),以保护系统稳定性。": "启用性能监控后,当系统资源使用率超过设定阈值时,将拒绝新的 Relay 请求 (/v1, /v1beta 等),以保护系统稳定性。", - "启用性能监控": "启用性能监控", - "超过阈值时拒绝新请求": "超过阈值时拒绝新请求", - "CPU 阈值 (%)": "CPU 阈值 (%)", - "CPU 使用率超过此值时拒绝请求": "CPU 使用率超过此值时拒绝请求", - "内存 阈值 (%)": "内存 阈值 (%)", - "内存使用率超过此值时拒绝请求": "内存使用率超过此值时拒绝请求", - "磁盘 阈值 (%)": "磁盘 阈值 (%)", - "磁盘使用率超过此值时拒绝请求": "磁盘使用率超过此值时拒绝请求", - "保存性能设置": "保存性能设置", "系统设置": "系统设置", "系统访问令牌": "系统访问令牌", "约": "约", "索引": "索引", "紧凑列表": "紧凑列表", + "累计签到": "累计签到", + "累计获得": "累计获得", "线路描述": "线路描述", "组列表": "组列表", "组名": "组名", @@ -1862,20 +2322,26 @@ "绑定": "绑定", "绑定 Telegram": "绑定 Telegram", "绑定信息": "绑定信息", + "绑定后会立即生成用户订阅(无需支付),有效期按套餐配置计算。": "绑定后会立即生成用户订阅(无需支付),有效期按套餐配置计算。", "绑定微信账户": "绑定微信账户", "绑定成功!": "绑定成功!", + "绑定订阅套餐": "绑定订阅套餐", "绑定邮箱地址": "绑定邮箱地址", + "结束": "结束", "结束时间": "结束时间", "结果图片": "结果图片", + "结算差额": "结算差额", "绘图": "绘图", "绘图任务记录": "绘图任务记录", "绘图日志": "绘图日志", "绘图设置": "绘图设置", "统一的": "统一的", "统计Tokens": "统计Tokens", + "统计已重置": "统计已重置", "统计次数": "统计次数", "统计额度": "统计额度", "继续": "继续", + "维护中": "维护中", "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})", "缓存 Tokens": "缓存 Tokens", "缓存: {{cacheRatio}}": "缓存: {{cacheRatio}}", @@ -1883,6 +2349,7 @@ "缓存价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存倍率: {{cacheRatio}})": "缓存价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存倍率: {{cacheRatio}})", "缓存倍率": "缓存倍率", "缓存倍率 {{cacheRatio}}": "缓存倍率 {{cacheRatio}}", + "缓存写": "缓存写", "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})", "缓存创建 Tokens": "缓存创建 Tokens", "缓存创建: {{cacheCreationRatio}}": "缓存创建: {{cacheCreationRatio}}", @@ -1891,11 +2358,18 @@ "缓存创建: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "缓存创建: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", "缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存创建倍率: {{cacheCreationRatio}})": "缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存创建倍率: {{cacheCreationRatio}})", "缓存创建价格合计:5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens": "缓存创建价格合计:5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens", + "缓存创建倍率": "缓存创建倍率", "缓存创建倍率 {{cacheCreationRatio}}": "缓存创建倍率 {{cacheCreationRatio}}", "缓存创建倍率 1h {{cacheCreationRatio1h}}": "缓存创建倍率 1h {{cacheCreationRatio1h}}", "缓存创建倍率 5m {{cacheCreationRatio5m}}": "缓存创建倍率 5m {{cacheCreationRatio5m}}", "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", + "缓存条目数": "缓存条目数", + "缓存目录": "缓存目录", + "缓存目录磁盘空间": "缓存目录磁盘空间", + "缓存读": "缓存读", + "编号:": "编号:", "编辑": "编辑", + "编辑 OAuth 提供商": "编辑 OAuth 提供商", "编辑API": "编辑API", "编辑产品": "编辑产品", "编辑供应商": "编辑供应商", @@ -1903,17 +2377,20 @@ "编辑公告内容": "编辑公告内容", "编辑分类": "编辑分类", "编辑成功": "编辑成功", + "编辑提供商": "编辑提供商", "编辑标签": "编辑标签", "编辑模型": "编辑模型", "编辑模式": "编辑模式", "编辑用户": "编辑用户", "编辑聊天配置": "编辑聊天配置", + "编辑规则": "编辑规则", "编辑问答": "编辑问答", "缩词": "缩词", "缺省 MaxTokens": "缺省 MaxTokens", "网站地址": "网站地址", "网站域名标识": "网站域名标识", "网络连接失败,请检查网络设置或稍后重试": "网络连接失败,请检查网络设置或稍后重试", + "网络连接失败或服务器无响应": "网络连接失败或服务器无响应", "网络配置": "网络配置", "网络错误": "网络错误", "置信度": "置信度", @@ -1923,6 +2400,7 @@ "聊天区域": "聊天区域", "聊天应用名称": "聊天应用名称", "聊天应用名称已存在,请使用其他名称": "聊天应用名称已存在,请使用其他名称", + "聊天数据解析失败": "聊天数据解析失败", "聊天设置": "聊天设置", "聊天配置": "聊天配置", "聊天链接配置错误,请联系管理员": "聊天链接配置错误,请联系管理员", @@ -1931,45 +2409,42 @@ "自动分组auto,从第一个开始选择": "自动分组auto,从第一个开始选择", "自动刷新": "自动刷新", "自动刷新中": "自动刷新中", + "自动填充字段": "自动填充字段", + "自动检测": "自动检测", "自动模式": "自动模式", "自动测试所有通道间隔时间": "自动测试所有通道间隔时间", + "自动生成:": "自动生成:", "自动禁用": "自动禁用", "自动禁用关键词": "自动禁用关键词", "自动禁用状态码": "自动禁用状态码", "自动禁用状态码格式不正确": "自动禁用状态码格式不正确", + "自动选择": "自动选择", "自动重试状态码": "自动重试状态码", "自动重试状态码格式不正确": "自动重试状态码格式不正确", - "支持填写单个状态码或范围(含首尾),使用逗号分隔": "支持填写单个状态码或范围(含首尾),使用逗号分隔", - "支持填写单个状态码或范围(含首尾),使用逗号分隔;504 和 524 始终不重试,不受此处配置影响": "支持填写单个状态码或范围(含首尾),使用逗号分隔;504 和 524 始终不重试,不受此处配置影响", - "高危操作确认": "高危操作确认", - "检测到以下高危状态码重定向规则": "检测到以下高危状态码重定向规则", - "操作确认": "操作确认", - "我确认开启高危重试": "我确认开启高危重试", - "高危状态码重试风险告知与免责声明Markdown": "### ⚠️ 高危操作:504/524 状态码重试风险告知与免责声明\n本项目默认对 `400 (请求错误)`、`504 (网关超时)`和 `524 (cdn发生超时)`状态码不进行重试。\n504 和 524 错误通常意味着**请求已成功送达上游 AI 服务,且上游正在处理,但因处理时间过长导致连接断开**。\n\n开启对此类超时状态码的重定向/重试属于**极高风险操作**。作为本开源项目的使用者,在开启该功能前,您必须仔细阅读并知悉以下严重后果:\n\n#### 一、 核心风险告知(请仔细阅读)\n1. 💸 双重/多重计费风险: 绝大多数 AI 上游厂商对于已经开始处理但因网络原因中断(504/524)的请求**依然会进行扣费**。此时若触发重试,将会向上游发起全新请求,导致您被**双重甚至多重计费**。\n2. ⏳ 客户端严重超时: 单次请求已经触发超时,叠加重试机制将会使总请求耗时成倍增加,导致您的最终客户端(或调用方)出现严重甚至完全无法接受的超时现象。\n3. 💥 请求积压与系统崩溃风险: 强制重试超时请求会长时间占用系统线程和连接数。在高并发场景下,这会导致严重的**请求积压**,进而耗尽系统资源,引发雪崩效应,导致您的整个代理服务崩溃。\n\n#### 二、 风险确认声明\n如果您坚持开启该功能,即代表您作出以下确认:", - "高危状态码重试风险确认输入文本": "我已了解多重计费与崩溃风险,确认开启", - "高危状态码重试风险确认项1": "我已充分阅读并理解:本人已完整阅读上述全部风险提示,完全理解强制重试 504 和 524 状态码可能带来的破坏性后果。", - "高危状态码重试风险确认项2": "我已与上游沟通并确认:本人确认,当前出现的超时问题属于上游服务的瓶颈。本人已与上游提供商进行过沟通,确认上游无法解决该超时问题,因此才采取强制重试方案作为妥协手段。", - "高危状态码重试风险确认项3": "我自愿承担计费损失:本人知晓并接受由此产生的全部双重/多重计费风险,承诺不会因重试导致的账单异常在本项目仓库中提交 Issue 或抱怨。", - "高危状态码重试风险确认项4": "我自愿承担系统稳定性风险:本人知晓该操作可能导致客户端严重超时及服务崩溃。若因本人开启此功能导致请求积压或服务不可用,后果由本人自行承担。", - "高危状态码重试风险输入框占位文案": "请完整输入上方文字", - "高危状态码重试风险输入不匹配提示": "输入内容与要求不一致", - "例如:401, 403, 429, 500-599": "例如:401,403,429,500-599", - "自动选择": "自动选择", + "自定义": "自定义", + "自定义 OAuth 提供商": "自定义 OAuth 提供商", + "自定义(秒)": "自定义(秒)", "自定义充值数量选项": "自定义充值数量选项", "自定义充值数量选项不是合法的 JSON 数组": "自定义充值数量选项不是合法的 JSON 数组", "自定义变焦-提交": "自定义变焦-提交", "自定义模型名称": "自定义模型名称", "自定义模式下不可用": "自定义模式下不可用", + "自定义渠道": "自定义渠道", + "自定义秒数": "自定义秒数", + "自定义请求体格式错误,请检查JSON格式": "自定义请求体格式错误,请检查JSON格式", "自定义请求体模式": "自定义请求体模式", "自定义货币": "自定义货币", "自定义货币符号": "自定义货币符号", "自定义镜像": "自定义镜像", "自用模式": "自用模式", "自适应列表": "自适应列表", + "至": "至", "节省": "节省", "花费": "花费", "花费时间": "花费时间", "若你的 OIDC Provider 支持 Discovery Endpoint,你可以仅填写 OIDC Well-Known URL,系统会自动获取 OIDC 配置": "若你的 OIDC Provider 支持 Discovery Endpoint,你可以仅填写 OIDC Well-Known URL,系统会自动获取 OIDC 配置", + "获取 Discovery 配置": "获取 Discovery 配置", + "获取 Discovery 配置失败:": "获取 Discovery 配置失败:", "获取 io.net API Key": "获取 io.net API Key", "获取 OIDC 配置失败,请检查网络状况和 Well-Known URL 是否正确": "获取 OIDC 配置失败,请检查网络状况和 Well-Known URL 是否正确", "获取 OIDC 配置成功!": "获取 OIDC 配置成功!", @@ -1990,12 +2465,17 @@ "获取模型列表": "获取模型列表", "获取模型列表失败": "获取模型列表失败", "获取渠道失败:": "获取渠道失败:", + "获取用量失败": "获取用量失败", "获取硬件类型失败: ": "获取硬件类型失败: ", + "获取签到状态失败": "获取签到状态失败", "获取组列表失败": "获取组列表失败", + "获取绑定信息失败": "获取绑定信息失败", + "获取自定义 OAuth 提供商列表失败": "获取自定义 OAuth 提供商列表失败", "获取详情失败": "获取详情失败", "获取部署列表失败": "获取部署列表失败", "获取金额失败": "获取金额失败", "获取验证码": "获取验证码", + "获得": "获得", "补全": "补全", "补全 {{completion}} tokens / 1M tokens * {{symbol}}{{price}}": "补全 {{completion}} tokens / 1M tokens * {{symbol}}{{price}}", "补全价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "补全价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})", @@ -2009,12 +2489,21 @@ "表格视图": "表格视图", "覆盖模式:将完全替换现有的所有密钥": "覆盖模式:将完全替换现有的所有密钥", "覆盖现有密钥": "覆盖现有密钥", + "规则": "规则", + "规则 JSON": "规则 JSON", + "规则 JSON 格式不正确": "规则 JSON 格式不正确", + "规则 ttl_seconds 为 0 时使用。0 表示使用后端默认 TTL:3600 秒。": "规则 ttl_seconds 为 0 时使用。0 表示使用后端默认 TTL:3600 秒。", + "规则为 JSON 数组;可视化与 JSON 模式共用同一份数据。": "规则为 JSON 数组;可视化与 JSON 模式共用同一份数据。", + "规则名称(可读性更好,也会出现在管理侧日志中)。": "规则名称(可读性更好,也会出现在管理侧日志中)。", + "规则未找到,请刷新后重试": "规则未找到,请刷新后重试", "角色": "角色", "解析响应数据时发生错误": "解析响应数据时发生错误", "解析密钥文件失败: {{msg}}": "解析密钥文件失败: {{msg}}", "解析错误": "解析错误", + "解绑": "解绑", "解绑 Passkey": "解绑 Passkey", "解绑后将无法使用 Passkey 登录,确定要继续吗?": "解绑后将无法使用 Passkey 登录,确定要继续吗?", + "解绑成功": "解绑成功", "计价币种": "计价币种", "计算中": "计算中", "计算成本": "计算成本", @@ -2024,7 +2513,18 @@ "计费类型": "计费类型", "计费过程": "计费过程", "订单号": "订单号", + "订阅": "订阅", + "订阅剩余": "订阅剩余", + "订阅套餐": "订阅套餐", + "订阅套餐管理": "订阅套餐管理", + "订阅实例": "订阅实例", + "订阅抵扣": "订阅抵扣", + "订阅管理": "订阅管理", + "订阅结算": "订阅结算", + "订阅说明": "订阅说明", + "认证方式": "认证方式", "讯飞星火": "讯飞星火", + "讯飞星火认知": "讯飞星火认知", "记录请求与错误日志IP": "记录请求与错误日志IP", "设备": "设备", "设备类型偏好": "设备类型偏好", @@ -2063,16 +2563,25 @@ "该供应商提供多种AI模型,适用于不同的应用场景。": "该供应商提供多种AI模型,适用于不同的应用场景。", "该分类下没有可用模型": "该分类下没有可用模型", "该域名已存在于白名单中": "该域名已存在于白名单中", + "该套餐未配置 Creem": "该套餐未配置 Creem", + "该套餐未配置 Stripe": "该套餐未配置 Stripe", "该数据可能不可信,请谨慎使用": "该数据可能不可信,请谨慎使用", "该服务器地址将影响支付回调地址以及默认首页展示的地址,请确保正确配置": "该服务器地址将影响支付回调地址以及默认首页展示的地址,请确保正确配置", "该模型存在固定价格与倍率计费方式冲突,请确认选择": "该模型存在固定价格与倍率计费方式冲突,请确认选择", "该渠道已开启请求透传,参数覆写、模型重定向等 NewAPI 内置功能将失效,非最佳实践。": "该渠道已开启请求透传,参数覆写、模型重定向等 NewAPI 内置功能将失效,非最佳实践。", "该渠道已开启请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "该渠道已开启请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。", + "该规则未启用“作用域:包含规则名称”,无法按规则清空缓存。": "该规则未启用“作用域:包含规则名称”,无法按规则清空缓存。", + "该规则的缓存保留时长;0 表示使用默认 TTL:": "该规则的缓存保留时长;0 表示使用默认 TTL:", + "该记录不包含可用的 token 统计口径。": "该记录不包含可用的 token 统计口径。", "详情": "详情", + "语言偏好": "语言偏好", + "语言偏好已保存": "语言偏好已保存", "语音输入": "语音输入", "语音输出": "语音输出", "说明": "说明", "说明:": "说明:", + "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。": "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。", + "说明:生成结果是可直接粘贴到渠道密钥里的 JSON(包含 access_token / refresh_token / account_id)。": "说明:生成结果是可直接粘贴到渠道密钥里的 JSON(包含 access_token / refresh_token / account_id)。", "说明信息": "说明信息", "请上传密钥文件": "请上传密钥文件", "请上传密钥文件!": "请上传密钥文件!", @@ -2080,13 +2589,21 @@ "请使用 Project 为 io.cloud 的密钥": "请使用 Project 为 io.cloud 的密钥", "请先在设置中启用图片功能": "请先在设置中启用图片功能", "请先填写 API Key": "请先填写 API Key", + "请先填写 Discovery URL 或 Issuer URL": "请先填写 Discovery URL 或 Issuer URL", + "请先填写 Issuer URL,以自动生成完整的端点 URL": "请先填写 Issuer URL,以自动生成完整的端点 URL", "请先填写 Ollama API 地址": "请先填写 Ollama API 地址", "请先填写服务器地址": "请先填写服务器地址", + "请先填写服务器地址,以自动生成完整的端点 URL": "请先填写服务器地址,以自动生成完整的端点 URL", + "请先粘贴回调 URL": "请先粘贴回调 URL", "请先输入密钥": "请先输入密钥", "请先选择同步渠道": "请先选择同步渠道", "请先选择模型!": "请先选择模型!", "请先选择硬件类型": "请先选择硬件类型", + "请先选择要删除的API信息": "请先选择要删除的API信息", "请先选择要删除的令牌!": "请先选择要删除的令牌!", + "请先选择要删除的分类": "请先选择要删除的分类", + "请先选择要删除的常见问答": "请先选择要删除的常见问答", + "请先选择要删除的系统公告": "请先选择要删除的系统公告", "请先选择要删除的通道!": "请先选择要删除的通道!", "请先选择要设置标签的渠道!": "请先选择要设置标签的渠道!", "请先选择需要批量设置的模型": "请先选择需要批量设置的模型", @@ -2095,8 +2612,12 @@ "请前往个人设置 → 安全设置进行配置。": "请前往个人设置 → 安全设置进行配置。", "请勿过度信任此功能,IP可能被伪造,请配合nginx和cdn等网关使用": "请勿过度信任此功能,IP可能被伪造,请配合nginx和cdn等网关使用", "请在系统设置页面编辑分组倍率以添加新的分组:": "请在系统设置页面编辑分组倍率以添加新的分组:", + "请填写完整的API信息": "请填写完整的API信息", "请填写完整的产品信息": "请填写完整的产品信息", + "请填写完整的公告信息": "请填写完整的公告信息", + "请填写完整的分类信息": "请填写完整的分类信息", "请填写完整的管理员账号信息": "请填写完整的管理员账号信息", + "请填写完整的问答信息": "请填写完整的问答信息", "请填写密钥": "请填写密钥", "请填写渠道名称和渠道密钥!": "请填写渠道名称和渠道密钥!", "请填写部署地区": "请填写部署地区", @@ -2106,12 +2627,16 @@ "请检查表单填写是否正确": "请检查表单填写是否正确", "请检查输入": "请检查输入", "请求体 JSON": "请求体 JSON", + "请求体内存缓存": "请求体内存缓存", + "请求体磁盘缓存": "请求体磁盘缓存", + "请求体超过此大小时使用磁盘缓存": "请求体超过此大小时使用磁盘缓存", "请求参数无效": "请求参数无效", "请求发生错误": "请求发生错误", "请求发生错误: ": "请求发生错误: ", "请求后端接口失败:": "请求后端接口失败:", "请求失败": "请求失败", "请求头覆盖": "请求头覆盖", + "请求头覆盖必须是合法的 JSON 格式!": "请求头覆盖必须是合法的 JSON 格式!", "请求并计费模型": "请求并计费模型", "请求时长: ${time}s": "请求时长: ${time}s", "请求次数": "请求次数", @@ -2119,14 +2644,14 @@ "请求超时,请刷新页面后重新发起 GitHub 登录": "请求超时,请刷新页面后重新发起 GitHub 登录", "请求路径": "请求路径", "请求转换": "请求转换", - "原生格式": "原生格式", - "转换": "转换", "请求预扣费额度": "请求预扣费额度", "请点击我": "请点击我", "请确认以下设置信息,点击\"初始化系统\"开始配置": "请确认以下设置信息,点击\"初始化系统\"开始配置", "请确认您已了解禁用两步验证的后果": "请确认您已了解禁用两步验证的后果", "请确认管理员密码": "请确认管理员密码", "请稍后几秒重试,Turnstile 正在检查用户环境!": "请稍后几秒重试,Turnstile 正在检查用户环境!", + "请立刻修改默认密码!": "请立刻修改默认密码!", + "请粘贴完整回调 URL(包含 code 与 state)": "请粘贴完整回调 URL(包含 code 与 state)", "请联系管理员在系统设置中配置API信息": "请联系管理员在系统设置中配置API信息", "请联系管理员在系统设置中配置Uptime": "请联系管理员在系统设置中配置Uptime", "请联系管理员在系统设置中配置公告信息": "请联系管理员在系统设置中配置公告信息", @@ -2139,12 +2664,22 @@ "请至少选择一个渠道": "请至少选择一个渠道", "请输入 API Key,一行一个,格式:APIKey|Region": "请输入 API Key,一行一个,格式:APIKey|Region", "请输入 API Key,格式:APIKey|Region": "请输入 API Key,格式:APIKey|Region", + "请输入 Authorization Endpoint": "请输入 Authorization Endpoint", "请输入 AZURE_OPENAI_ENDPOINT,例如:https://docs-test-001.openai.azure.com": "请输入 AZURE_OPENAI_ENDPOINT,例如:https://docs-test-001.openai.azure.com", + "请输入 Client ID": "请输入 Client ID", + "请输入 Client Secret": "请输入 Client Secret", "请输入 io.net API Key": "请输入 io.net API Key", "请输入 io.net API Key(敏感信息不显示)": "请输入 io.net API Key(敏感信息不显示)", + "请输入 JSON 格式的 OAuth 凭据,例如:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}": "请输入 JSON 格式的 OAuth 凭据,例如:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}", "请输入 JSON 格式的密钥内容,例如:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}": "请输入 JSON 格式的密钥内容,例如:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}", "请输入 OIDC 的 Well-Known URL": "请输入 OIDC 的 Well-Known URL", + "请输入 Slug": "请输入 Slug", + "请输入 Token Endpoint": "请输入 Token Endpoint", + "请输入 User Info Endpoint": "请输入 User Info Endpoint", + "请输入6位验证码": "请输入6位验证码", "请输入6位验证码或8位备用码": "请输入6位验证码或8位备用码", + "请输入8位备用码": "请输入8位备用码", + "请输入Account ID,例如:d6b5da8hk1awo8nap34ube6gh": "请输入Account ID,例如:d6b5da8hk1awo8nap34ube6gh", "请输入API地址": "请输入API地址", "请输入API地址!": "请输入API地址!", "请输入Bark推送URL": "请输入Bark推送URL", @@ -2178,6 +2713,7 @@ "请输入图标名称": "请输入图标名称", "请输入填充值": "请输入填充值", "请输入备注(仅管理员可见)": "请输入备注(仅管理员可见)", + "请输入套餐标题": "请输入套餐标题", "请输入完整的 JSON 格式密钥内容": "请输入完整的 JSON 格式密钥内容", "请输入完整的URL,例如:https://api.openai.com/v1/chat/completions": "请输入完整的URL,例如:https://api.openai.com/v1/chat/completions", "请输入完整的URL链接": "请输入完整的URL链接", @@ -2188,6 +2724,7 @@ "请输入密钥,一行一个,格式:AccessKey|SecretAccessKey|Region": "请输入密钥,一行一个,格式:AccessKey|SecretAccessKey|Region", "请输入密钥!": "请输入密钥!", "请输入延长时长": "请输入延长时长", + "请输入总额度": "请输入总额度", "请输入您的密码": "请输入您的密码", "请输入您的用户名以确认删除": "请输入您的用户名以确认删除", "请输入您的用户名或邮箱地址": "请输入您的用户名或邮箱地址", @@ -2205,7 +2742,9 @@ "请输入新的用户名": "请输入新的用户名", "请输入新的部署名称": "请输入新的部署名称", "请输入显示名称": "请输入显示名称", + "请输入智能体ID,例如:7342866812345": "请输入智能体ID,例如:7342866812345", "请输入有效的JSON格式的请求体。您可以参考预览面板中的默认请求体格式。": "请输入有效的JSON格式的请求体。您可以参考预览面板中的默认请求体格式。", + "请输入有效的URL地址": "请输入有效的URL地址", "请输入有效的数字": "请输入有效的数字", "请输入有效的镜像地址": "请输入有效的镜像地址", "请输入标签名称": "请输入标签名称", @@ -2220,7 +2759,10 @@ "请输入状态页面的Slug,如:my-status": "请输入状态页面的Slug,如:my-status", "请输入生成数量": "请输入生成数量", "请输入用户名": "请输入用户名", + "请输入用户名和密码!": "请输入用户名和密码!", + "请输入知识库 ID,例如:123456": "请输入知识库 ID,例如:123456", "请输入私有部署地址,格式为:https://fastgpt.run/api/openapi": "请输入私有部署地址,格式为:https://fastgpt.run/api/openapi", + "请输入秒数": "请输入秒数", "请输入管理员密码": "请输入管理员密码", "请输入管理员用户名": "请输入管理员用户名", "请输入线路描述": "请输入线路描述", @@ -2231,6 +2773,7 @@ "请输入补全倍率": "请输入补全倍率", "请输入要延长的小时数": "请输入要延长的小时数", "请输入要设置的标签名称": "请输入要设置的标签名称", + "请输入认证器应用显示的验证码完成登录": "请输入认证器应用显示的验证码完成登录", "请输入认证器验证码": "请输入认证器验证码", "请输入认证器验证码或备用码": "请输入认证器验证码或备用码", "请输入说明": "请输入说明", @@ -2241,6 +2784,7 @@ "请输入部署名称": "请输入部署名称", "请输入部署名称以完成二次确认": "请输入部署名称以完成二次确认", "请输入部署地区,例如:us-central1\n支持使用模型映射格式\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}": "请输入部署地区,例如:us-central1\n支持使用模型映射格式\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}", + "请输入金额": "请输入金额", "请输入镜像地址": "请输入镜像地址", "请输入问题标题": "请输入问题标题", "请输入预警阈值": "请输入预警阈值", @@ -2262,6 +2806,7 @@ "请选择多密钥使用策略": "请选择多密钥使用策略", "请选择密钥更新模式": "请选择密钥更新模式", "请选择密钥格式": "请选择密钥格式", + "请选择支付方式": "请选择支付方式", "请选择日志记录时间": "请选择日志记录时间", "请选择模型": "请选择模型", "请选择模型。": "请选择模型。", @@ -2270,6 +2815,7 @@ "请选择硬件类型": "请选择硬件类型", "请选择组类型": "请选择组类型", "请选择至少一个部署位置": "请选择至少一个部署位置", + "请选择订阅套餐": "请选择订阅套餐", "请选择该令牌支持的模型,留空支持所有模型": "请选择该令牌支持的模型,留空支持所有模型", "请选择该渠道所支持的模型": "请选择该渠道所支持的模型", "请选择该渠道所支持的模型,留空则不更改": "请选择该渠道所支持的模型,留空则不更改", @@ -2284,6 +2830,7 @@ "警告:启用保活后,如果已经写入保活数据后渠道出错,系统无法重试,如果必须开启,推荐设置尽可能大的Ping间隔": "警告:启用保活后,如果已经写入保活数据后渠道出错,系统无法重试,如果必须开启,推荐设置尽可能大的Ping间隔", "警告:禁用两步验证将永久删除您的验证设置和所有备用码,此操作不可撤销!": "警告:禁用两步验证将永久删除您的验证设置和所有备用码,此操作不可撤销!", "豆包": "豆包", + "豆包视频": "豆包视频", "账单": "账单", "账户充值": "账户充值", "账户已删除!": "账户已删除!", @@ -2292,21 +2839,31 @@ "账户管理": "账户管理", "账户绑定": "账户绑定", "账户绑定、安全设置和身份验证": "账户绑定、安全设置和身份验证", + "账户绑定管理": "账户绑定管理", "账户统计": "账户统计", "货币": "货币", "货币单位": "货币单位", + "购买上限": "购买上限", "购买兑换码": "购买兑换码", + "购买套餐后即可享受模型权益": "购买套餐后即可享受模型权益", + "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。": "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。", + "购买订阅套餐": "购买订阅套餐", "费用信息": "费用信息", "费用预估": "费用预估", "资源消耗": "资源消耗", "起始时间": "起始时间", "超级管理员": "超级管理员", "超级管理员未设置充值链接!": "超级管理员未设置充值链接!", + "超过阈值时拒绝新请求": "超过阈值时拒绝新请求", + "距离重置:": "距离重置:", "跟随日志": "跟随日志", "跟随系统主题设置": "跟随系统主题设置", "跨分组": "跨分组", "跨分组重试": "跨分组重试", + "路径正则": "路径正则", + "路径正则(每行一个)": "路径正则(每行一个)", "跳转": "跳转", + "转换": "转换", "轮询": "轮询", "轮询模式": "轮询模式", "轮询模式必须搭配Redis和内存缓存功能使用,否则性能将大幅降低,并且无法实现轮询功能": "轮询模式必须搭配Redis和内存缓存功能使用,否则性能将大幅降低,并且无法实现轮询功能", @@ -2323,6 +2880,7 @@ "输入你的账户名{{username}}以确认删除": "输入你的账户名{{username}}以确认删除", "输入域名后回车": "输入域名后回车", "输入域名后回车,如:example.com": "输入域名后回车,如:example.com", + "输入基础 URL": "输入基础 URL", "输入密码,最短 8 位,最长 20 位": "输入密码,最短 8 位,最长 20 位", "输入数字": "输入数字", "输入标签或使用\",\"分隔多个标签": "输入标签或使用\",\"分隔多个标签", @@ -2336,54 +2894,20 @@ "输入要添加的邮箱域名": "输入要添加的邮箱域名", "输入认证器应用显示的6位数字验证码": "输入认证器应用显示的6位数字验证码", "输入邮箱地址": "输入邮箱地址", + "输入金额": "输入金额", "输入项目名称,按回车添加": "输入项目名称,按回车添加", + "输入额度": "输入额度", "输入验证码": "输入验证码", "输入验证码完成设置": "输入验证码完成设置", "输出": "输出", "输出 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}}) * {{ratioType}} {{ratio}}": "输出 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}}) * {{ratioType}} {{ratio}}", - "磁盘缓存设置(磁盘换内存)": "磁盘缓存设置(磁盘换内存)", - "启用磁盘缓存后,大请求体将临时存储到磁盘而非内存,可显著降低内存占用,适用于处理包含大量图片/文件的请求。建议在 SSD 环境下使用。": "启用磁盘缓存后,大请求体将临时存储到磁盘而非内存,可显著降低内存占用,适用于处理包含大量图片/文件的请求。建议在 SSD 环境下使用。", - "启用磁盘缓存": "启用磁盘缓存", - "将大请求体临时存储到磁盘": "将大请求体临时存储到磁盘", - "磁盘缓存阈值 (MB)": "磁盘缓存阈值 (MB)", - "请求体超过此大小时使用磁盘缓存": "请求体超过此大小时使用磁盘缓存", - "磁盘缓存最大总量 (MB)": "磁盘缓存最大总量 (MB)", - "可用空间: {{free}} / 总空间: {{total}}": "可用空间: {{free}} / 总空间: {{total}}", - "磁盘缓存占用的最大空间": "磁盘缓存占用的最大空间", - "留空使用系统临时目录": "留空使用系统临时目录", - "例如 /var/cache/new-api": "例如 /var/cache/new-api", - "性能监控": "性能监控", - "刷新统计": "刷新统计", - "重置统计": "重置统计", - "执行 GC": "执行 GC", - "请求体磁盘缓存": "请求体磁盘缓存", - "活跃文件": "活跃文件", - "磁盘命中": "磁盘命中", - "请求体内存缓存": "请求体内存缓存", - "当前缓存大小": "当前缓存大小", - "活跃缓存数": "活跃缓存数", - "内存命中": "内存命中", - "缓存目录磁盘空间": "缓存目录磁盘空间", - "磁盘可用空间小于缓存最大总量设置": "磁盘可用空间小于缓存最大总量设置", - "已分配内存": "已分配内存", - "总分配内存": "总分配内存", - "系统内存": "系统内存", - "GC 次数": "GC 次数", - "Goroutine 数": "Goroutine 数", - "目录文件数": "目录文件数", - "目录总大小": "目录总大小", - "磁盘缓存已清理": "磁盘缓存已清理", - "清理失败": "清理失败", - "统计已重置": "统计已重置", - "重置失败": "重置失败", - "GC 已执行": "GC 已执行", - "GC 执行失败": "GC 执行失败", - "缓存目录": "缓存目录", - "可用": "可用", "输出价格": "输出价格", "输出价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "输出价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})", "输出倍率 {{completionRatio}}": "输出倍率 {{completionRatio}}", "边栏设置": "边栏设置", + "迁移失败: ": "迁移失败: ", + "迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。": "迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。", + "过期于": "过期于", "过期时间": "过期时间", "过期时间不能早于当前时间!": "过期时间不能早于当前时间!", "过期时间快捷设置": "过期时间快捷设置", @@ -2393,14 +2917,18 @@ "运行命令 (Command)": "运行命令 (Command)", "运行时长": "运行时长", "运行时长(小时)": "运行时长(小时)", + "近 30 天": "近 30 天", + "近 7 天": "近 7 天", "返回修改": "返回修改", "返回登录": "返回登录", - "违规扣费金额": "违规扣费金额", - "这是重复键中的最后一个,其值将被使用": "这是重复键中的最后一个,其值将被使用", + "这将删除超过 10 分钟未使用的临时缓存文件": "这将删除超过 10 分钟未使用的临时缓存文件", "这是基础金额,实际扣费 = 基础金额 x 系统分组倍率。": "这是基础金额,实际扣费 = 基础金额 x 系统分组倍率。", + "这是重复键中的最后一个,其值将被使用": "这是重复键中的最后一个,其值将被使用", "进度": "进度", "进行中": "进行中", "进行该操作时,可能导致渠道访问错误,请仅在数据库出现问题时使用": "进行该操作时,可能导致渠道访问错误,请仅在数据库出现问题时使用", + "违规扣费": "违规扣费", + "违规扣费金额": "违规扣费金额", "连接保活设置": "连接保活设置", "连接已断开": "连接已断开", "连接测试中...": "连接测试中...", @@ -2408,6 +2936,7 @@ "追加模式:将新密钥添加到现有密钥列表末尾": "追加模式:将新密钥添加到现有密钥列表末尾", "追加模式:新密钥将添加到现有密钥列表的末尾": "追加模式:新密钥将添加到现有密钥列表的末尾", "退出": "退出", + "退款": "退款", "适用于个人使用的场景,不需要设置模型价格": "适用于个人使用的场景,不需要设置模型价格", "适用于为多个用户提供服务的场景": "适用于为多个用户提供服务的场景", "适用于展示系统功能的场景,提供基础功能演示": "适用于展示系统功能的场景,提供基础功能演示", @@ -2418,6 +2947,7 @@ "选择同步渠道": "选择同步渠道", "选择同步语言": "选择同步语言", "选择容器": "选择容器", + "选择您的首选界面语言,设置将自动保存并同步到所有设备": "选择您的首选界面语言,设置将自动保存并同步到所有设备", "选择成功": "选择成功", "选择支付方式": "选择支付方式", "选择支持的认证设备类型": "选择支持的认证设备类型", @@ -2433,9 +2963,12 @@ "选择系统运行模式": "选择系统运行模式", "选择组类型": "请选择组类型", "选择要覆盖的冲突项": "选择要覆盖的冲突项", + "选择订阅套餐": "选择订阅套餐", "选择语言": "选择语言", "选择过期时间(可选,留空为永久)": "选择过期时间(可选,留空为永久)", "选择部署位置(可多选)": "选择部署位置(可多选)", + "选择预设...": "选择预设...", + "选择预设模板(可选)": "选择预设模板(可选)", "透传请求体": "透传请求体", "通义千问": "通义千问", "通用设置": "通用设置", @@ -2472,6 +3005,8 @@ "邮箱地址": "邮箱地址", "邮箱域名格式不正确,请输入有效的域名,如 gmail.com": "邮箱域名格式不正确,请输入有效的域名,如 gmail.com", "邮箱域名白名单格式不正确": "邮箱域名白名单格式不正确", + "邮箱字段": "邮箱字段", + "邮箱字段(可选)": "邮箱字段(可选)", "邮箱账户绑定成功!": "邮箱账户绑定成功!", "部分保存失败": "部分保存失败", "部分保存失败,请重试": "部分保存失败,请重试", @@ -2502,6 +3037,8 @@ "配置 Turnstile": "配置 Turnstile", "配置 WeChat Server": "配置 WeChat Server", "配置和消息已全部重置": "配置和消息已全部重置", + "配置套餐的有效时长": "配置套餐的有效时长", + "配置如何从用户信息 API 响应中提取用户数据,支持 JSONPath 语法": "配置如何从用户信息 API 响应中提取用户数据,支持 JSONPath 语法", "配置完成后刷新页面即可使用模型部署功能": "配置完成后刷新页面即可使用模型部署功能", "配置导入成功": "配置导入成功", "配置已导出到下载文件夹": "配置已导出到下载文件夹", @@ -2512,7 +3049,9 @@ "配置服务器端请求伪造(SSRF)防护,用于保护内网资源安全": "配置服务器端请求伪造(SSRF)防护,用于保护内网资源安全", "配置模型部署服务提供商的API密钥和启用状态": "配置模型部署服务提供商的API密钥和启用状态", "配置登录注册": "配置登录注册", + "配置自定义 OAuth 提供商,支持 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 协议的身份提供商": "配置自定义 OAuth 提供商,支持 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 协议的身份提供商", "配置说明": "配置说明", + "配置迁移确认": "配置迁移确认", "配置邮箱域名白名单": "配置邮箱域名白名单", "重启部署失败": "重启部署失败", "重命名部署": "重命名部署", @@ -2530,23 +3069,27 @@ "重置 2FA": "重置 2FA", "重置 Passkey": "重置 Passkey", "重置为默认": "重置为默认", + "重置周期": "重置周期", + "重置失败": "重置失败", + "重置时间:": "重置时间:", "重置模型倍率": "重置模型倍率", + "重置统计": "重置统计", "重置选项": "重置选项", "重置邮件发送成功,请检查邮箱!": "重置邮件发送成功,请检查邮箱!", "重置配置": "重置配置", "重要提醒": "重要提醒", "重试": "重试", "重试连接": "重试连接", + "金额": "金额", "钱包管理": "钱包管理", "链接中的{key}将自动替换为sk-xxxx,{address}将自动替换为系统设置的服务器地址,末尾不带/和/v1": "链接中的{key}将自动替换为sk-xxxx,{address}将自动替换为系统设置的服务器地址,末尾不带/和/v1", "销毁容器": "销毁容器", "销毁容器失败": "销毁容器失败", "错误": "错误", - "退款": "退款", + "错误:": "错误:", + "错误:服务器内部错误,请联系管理员!": "错误:服务器内部错误,请联系管理员!", + "错误:请求次数过多,请稍后再试!": "错误:请求次数过多,请稍后再试!", "错误详情": "错误详情", - "异步任务退款": "异步任务退款", - "任务ID": "任务ID", - "失败原因": "失败原因", "键为分组名称,值为另一个 JSON 对象,键为分组名称,值为该分组的用户的特殊分组倍率,例如:{\"vip\": {\"default\": 0.5, \"test\": 1}},表示 vip 分组的用户在使用default分组的令牌时倍率为0.5,使用test分组时倍率为1": "键为分组名称,值为另一个 JSON 对象,键为分组名称,值为该分组的用户的特殊分组倍率,例如:{\"vip\": {\"default\": 0.5, \"test\": 1}},表示 vip 分组的用户在使用default分组的令牌时倍率为0.5,使用test分组时倍率为1", "键为原状态码,值为要复写的状态码,仅影响本地判断": "键为原状态码,值为要复写的状态码,仅影响本地判断", "键为用户分组名称,值为操作映射对象。内层键以\"+:\"开头表示添加指定分组(键值为分组名称,值为描述),以\"-:\"开头表示移除指定分组(键值为分组名称),不带前缀的键直接添加该分组。例如:{\"vip\": {\"+:premium\": \"高级分组\", \"special\": \"特殊分组\", \"-:default\": \"默认分组\"}},表示 vip 分组的用户可以使用 premium 和 special 分组,同时移除 default 分组的访问权限": "键为用户分组名称,值为操作映射对象。内层键以\"+:\"开头表示添加指定分组(键值为分组名称,值为描述),以\"-:\"开头表示移除指定分组(键值为分组名称),不带前缀的键直接添加该分组。例如:{\"vip\": {\"+:premium\": \"高级分组\", \"special\": \"特殊分组\", \"-:default\": \"默认分组\"}},表示 vip 分组的用户可以使用 premium 和 special 分组,同时移除 default 分组的访问权限", @@ -2559,12 +3102,17 @@ "镜像地址": "镜像地址", "镜像选择": "镜像选择", "镜像配置": "镜像配置", + "问答已删除,请及时点击”保存设置”进行保存": "问答已删除,请及时点击”保存设置”进行保存", + "问答已更新,请及时点击”保存设置”进行保存": "问答已更新,请及时点击”保存设置”进行保存", + "问答已添加,请及时点击”保存设置”进行保存": "问答已添加,请及时点击”保存设置”进行保存", "问题标题": "问题标题", "队列中": "队列中", + "阿里通义千问": "阿里通义千问", "降低您账户的安全性": "降低您账户的安全性", "降级": "降级", "限制周期": "限制周期", "限制周期统一使用上方配置的“限制周期”值。": "限制周期统一使用上方配置的“限制周期”值。", + "限购": "限购", "隐私政策": "隐私政策", "隐私政策已更新": "隐私政策已更新", "隐私政策更新失败": "隐私政策更新失败", @@ -2582,55 +3130,82 @@ "需要重新完整设置才能再次启用": "需要重新完整设置才能再次启用", "非必要,不建议启用模型限制": "非必要,不建议启用模型限制", "非流": "非流", + "音乐预览": "音乐预览", "音频倍率(仅部分模型支持该计费)": "音频倍率(仅部分模型支持该计费)", "音频提示 {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}": "音频提示 {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}", "音频提示价格:{{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens (音频倍率: {{audioRatio}})": "音频提示价格:{{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens (音频倍率: {{audioRatio}})", + "音频无法播放": "音频无法播放", "音频补全价格:{{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens (音频补全倍率: {{audioCompRatio}})": "音频补全价格:{{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens (音频补全倍率: {{audioCompRatio}})", "音频补全倍率(仅部分模型支持该计费)": "音频补全倍率(仅部分模型支持该计费)", "音频输入相关的倍率设置,键为模型名称,值为倍率": "音频输入相关的倍率设置,键为模型名称,值为倍率", "音频输出补全相关的倍率设置,键为模型名称,值为倍率": "音频输出补全相关的倍率设置,键为模型名称,值为倍率", "页脚": "页脚", + "页脚内容已更新": "页脚内容已更新", + "页脚内容更新失败": "页脚内容更新失败", "页面未找到,请检查您的浏览器地址是否正确": "页面未找到,请检查您的浏览器地址是否正确", "顶栏管理": "顶栏管理", "项目": "项目", "项目内容": "项目内容", "项目操作按钮组": "项目操作按钮组", "预估总费用": "预估总费用", + "预估总额度": "预估总额度", "预估费用仅供参考,实际费用可能略有差异": "预估费用仅供参考,实际费用可能略有差异", "预填组管理": "预填组管理", + "预扣": "预扣", "预览失败": "预览失败", "预览更新": "预览更新", "预览请求体": "预览请求体", "预计结束": "预计结束", + "预设模板": "预设模板", "预警阈值必须为正数": "预警阈值必须为正数", "频率惩罚,减少重复词汇的出现": "频率惩罚,减少重复词汇的出现", "频率限制的周期(分钟)": "频率限制的周期(分钟)", "颜色": "颜色", "额度": "额度", + "额度充值": "额度充值", "额度必须大于0": "额度必须大于0", "额度提醒阈值": "额度提醒阈值", "额度查询接口返回令牌额度而非用户额度": "额度查询接口返回令牌额度而非用户额度", "额度设置": "额度设置", + "额度重置": "额度重置", "额度预警阈值": "额度预警阈值", "首尾生视频": "首尾生视频", "首页": "首页", "首页内容": "首页内容", + "首页内容已更新": "首页内容已更新", + "首页内容更新失败": "首页内容更新失败", "验证": "验证", "验证 Passkey": "验证 Passkey", "验证失败,请重试": "验证失败,请重试", + "验证并登录": "验证并登录", "验证成功": "验证成功", "验证数据库连接状态": "验证数据库连接状态", "验证码": "验证码", + "验证码发送成功,请检查你的邮箱!": "验证码发送成功,请检查你的邮箱!", "验证码发送成功,请检查邮箱!": "验证码发送成功,请检查邮箱!", + "验证码必须是6位数字": "验证码必须是6位数字", "验证设置": "验证设置", "验证身份": "验证身份", "验证配置错误": "验证配置错误", + "高危操作确认": "高危操作确认", + "高危状态码重试风险告知与免责声明Markdown": "### ⚠️ 高危操作:504/524 状态码重试风险告知与免责声明\n本项目默认对 `400 (请求错误)`、`504 (网关超时)`和 `524 (cdn发生超时)`状态码不进行重试。\n504 和 524 错误通常意味着**请求已成功送达上游 AI 服务,且上游正在处理,但因处理时间过长导致连接断开**。\n\n开启对此类超时状态码的重定向/重试属于**极高风险操作**。作为本开源项目的使用者,在开启该功能前,您必须仔细阅读并知悉以下严重后果:\n\n#### 一、 核心风险告知(请仔细阅读)\n1. 💸 双重/多重计费风险: 绝大多数 AI 上游厂商对于已经开始处理但因网络原因中断(504/524)的请求**依然会进行扣费**。此时若触发重试,将会向上游发起全新请求,导致您被**双重甚至多重计费**。\n2. ⏳ 客户端严重超时: 单次请求已经触发超时,叠加重试机制将会使总请求耗时成倍增加,导致您的最终客户端(或调用方)出现严重甚至完全无法接受的超时现象。\n3. 💥 请求积压与系统崩溃风险: 强制重试超时请求会长时间占用系统线程和连接数。在高并发场景下,这会导致严重的**请求积压**,进而耗尽系统资源,引发雪崩效应,导致您的整个代理服务崩溃。\n\n#### 二、 风险确认声明\n如果您坚持开启该功能,即代表您作出以下确认:", + "高危状态码重试风险确认输入文本": "我已了解多重计费与崩溃风险,确认开启", + "高危状态码重试风险确认项1": "我已充分阅读并理解:本人已完整阅读上述全部风险提示,完全理解强制重试 504 和 524 状态码可能带来的破坏性后果。", + "高危状态码重试风险确认项2": "我已与上游沟通并确认:本人确认,当前出现的超时问题属于上游服务的瓶颈。本人已与上游提供商进行过沟通,确认上游无法解决该超时问题,因此才采取强制重试方案作为妥协手段。", + "高危状态码重试风险确认项3": "我自愿承担计费损失:本人知晓并接受由此产生的全部双重/多重计费风险,承诺不会因重试导致的账单异常在本项目仓库中提交 Issue 或抱怨。", + "高危状态码重试风险确认项4": "我自愿承担系统稳定性风险:本人知晓该操作可能导致客户端严重超时及服务崩溃。若因本人开启此功能导致请求积压或服务不可用,后果由本人自行承担。", + "高危状态码重试风险输入不匹配提示": "输入内容与要求不一致", + "高危状态码重试风险输入框占位文案": "请完整输入上方文字", + "高延迟": "高延迟", "高级设置": "高级设置", + "高级选项": "高级选项", "高级配置": "高级配置", "黑名单": "黑名单", "默认": "默认", "默认 API 版本": "默认 API 版本", "默认 Responses API 版本,为空则使用上方版本": "默认 Responses API 版本,为空则使用上方版本", + "默认 TTL(秒)": "默认 TTL(秒)", + "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)": "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)", "默认使用系统名称": "默认使用系统名称", "默认助手消息": "你好!有什么我可以帮助你的吗?", "默认区域": "默认区域", @@ -2638,181 +3213,6 @@ "默认折叠侧边栏": "默认折叠侧边栏", "默认测试模型": "默认测试模型", "默认用户消息": "你好", - "默认补全倍率": "默认补全倍率", - "每日签到": "每日签到", - "今日已签到,累计签到": "今日已签到,累计签到", - "每日签到可获得随机额度奖励": "每日签到可获得随机额度奖励", - "今日已签到": "今日已签到", - "立即签到": "立即签到", - "正在加载签到状态...": "正在加载签到状态...", - "获取签到状态失败": "获取签到状态失败", - "签到成功!获得": "签到成功!获得", - "签到失败": "签到失败", - "获得": "获得", - "累计签到": "累计签到", - "本月获得": "本月获得", - "累计获得": "累计获得", - "签到奖励将直接添加到您的账户余额": "签到奖励将直接添加到您的账户余额", - "每日仅可签到一次,请勿重复签到": "每日仅可签到一次,请勿重复签到", - "签到设置": "签到设置", - "签到功能允许用户每日签到获取随机额度奖励": "签到功能允许用户每日签到获取随机额度奖励", - "启用签到功能": "启用签到功能", - "签到最小额度": "签到最小额度", - "签到奖励的最小额度": "签到奖励的最小额度", - "签到最大额度": "签到最大额度", - "签到奖励的最大额度": "签到奖励的最大额度", - "保存签到设置": "保存签到设置", - "ChatCompletions→Responses 兼容配置(Beta)": "ChatCompletions→Responses 兼容配置(Beta)", - "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。": "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。", - "填充模板(指定渠道)": "填充模板(指定渠道)", - "填充模板(全渠道)": "填充模板(全渠道)", - "格式化 JSON": "格式化 JSON", - "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。": "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。", - "确认关闭提示": "确认关闭提示", - "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?": "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?", - "关闭提示": "关闭提示", - "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。": "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。", - "Stripe/Creem 需在第三方平台创建商品并填入 ID": "Stripe/Creem 需在第三方平台创建商品并填入 ID", - "暂无订阅套餐": "暂无订阅套餐", - "订阅管理": "订阅管理", - "订阅套餐管理": "订阅套餐管理", - "新建套餐": "新建套餐", - "套餐": "套餐", - "支付渠道": "支付渠道", - "购买上限": "购买上限", - "有效期": "有效期", - "禁用后用户端不再展示,但历史订单不受影响。是否继续?": "禁用后用户端不再展示,但历史订单不受影响。是否继续?", - "启用后套餐将在用户端展示。是否继续?": "启用后套餐将在用户端展示。是否继续?", - "更新套餐信息": "更新套餐信息", - "创建新的订阅套餐": "创建新的订阅套餐", - "套餐的基本信息和定价": "套餐的基本信息和定价", - "套餐标题": "套餐标题", - "请输入套餐标题": "请输入套餐标题", - "套餐副标题": "套餐副标题", - "例如:适合轻度使用": "例如:适合轻度使用", - "请输入金额": "请输入金额", - "请输入总额度": "请输入总额度", - "0 表示不限": "0 表示不限", - "原生额度": "原生额度", - "升级分组": "升级分组", - "不升级": "不升级", - "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。": "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。", - "币种": "币种", - "由全站货币展示设置统一控制": "由全站货币展示设置统一控制", - "排序": "排序", - "启用状态": "启用状态", - "有效期设置": "有效期设置", - "配置套餐的有效时长": "配置套餐的有效时长", - "有效期单位": "有效期单位", - "自定义秒数": "自定义秒数", - "请输入秒数": "请输入秒数", - "有效期数值": "有效期数值", - "额度重置": "额度重置", - "支持周期性重置套餐权益额度": "支持周期性重置套餐权益额度", - "重置周期": "重置周期", - "第三方支付配置": "第三方支付配置", - "Stripe/Creem 商品ID(可选)": "Stripe/Creem 商品ID(可选)", - "生效": "生效", - "已作废": "已作废", - "用户订阅管理": "用户订阅管理", - "选择订阅套餐": "选择订阅套餐", - "新增订阅": "新增订阅", - "暂无订阅记录": "暂无订阅记录", - "来源": "来源", - "开始": "开始", - "结束": "结束", - "作废": "作废", - "确认作废": "确认作废", - "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "作废后该订阅将立即失效,历史记录不受影响。是否继续?", - "删除会彻底移除该订阅记录(含权益明细)。是否继续?": "删除会彻底移除该订阅记录(含权益明细)。是否继续?", - "绑定订阅套餐": "绑定订阅套餐", - "绑定后会立即生成用户订阅(无需支付),有效期按套餐配置计算。": "绑定后会立即生成用户订阅(无需支付),有效期按套餐配置计算。", - "订阅套餐": "订阅套餐", - "额度充值": "额度充值", - "优先订阅": "优先订阅", - "优先钱包": "优先钱包", - "仅用订阅": "仅用订阅", - "仅用钱包": "仅用钱包", - "我的订阅": "我的订阅", - "个生效中": "个生效中", - "无生效": "无生效", - "已保存偏好为": "已保存偏好为", - ",当前无生效订阅,将自动使用钱包": ",当前无生效订阅,将自动使用钱包", - "个已过期": "个已过期", - "订阅": "订阅", - "至": "至", - "过期于": "过期于", - "作废于": "作废于", - "购买套餐后即可享受模型权益": "购买套餐后即可享受模型权益", - "限购": "限购", - "推荐": "推荐", - "已达到购买上限": "已达到购买上限", - "已达上限": "已达上限", - "立即订阅": "立即订阅", - "暂无可购买套餐": "暂无可购买套餐", - "该套餐未配置 Stripe": "该套餐未配置 Stripe", - "已打开支付页面": "已打开支付页面", - "支付失败": "支付失败", - "该套餐未配置 Creem": "该套餐未配置 Creem", - "已发起支付": "已发起支付", - "购买订阅套餐": "购买订阅套餐", - "套餐名称": "套餐名称", - "应付金额": "应付金额", - "支付": "支付", - "管理员未开启在线支付功能,请联系管理员配置。": "管理员未开启在线支付功能,请联系管理员配置。", - "偏好设置": "偏好设置", - "界面语言和其他个人偏好": "界面语言和其他个人偏好", - "语言偏好": "语言偏好", - "选择您的首选界面语言,设置将自动保存并同步到所有设备": "选择您的首选界面语言,设置将自动保存并同步到所有设备", - "语言偏好已保存": "语言偏好已保存", - "提示:语言偏好会同步到您登录的所有设备,并影响API返回的错误消息语言。": "提示:语言偏好会同步到您登录的所有设备,并影响API返回的错误消息语言。", - "自定义 OAuth 提供商": "自定义 OAuth 提供商", - "配置自定义 OAuth 提供商,支持 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 协议的身份提供商": "配置自定义 OAuth 提供商,支持 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 协议的身份提供商", - "回调 URL 格式": "回调 URL 格式", - "添加提供商": "添加提供商", - "编辑提供商": "编辑提供商", - "选择预设...": "选择预设...", - "输入基础 URL": "输入基础 URL", - "例如": "例如", - "提供商名称": "提供商名称", - "标识符 (Slug)": "标识符 (Slug)", - "授权端点": "授权端点", - "令牌端点": "令牌端点", - "用户信息端点": "用户信息端点", - "用户 ID 字段": "用户 ID 字段", - "支持 JSONPath,如 sub, id, data.user.id": "支持 JSONPath,如 sub, id, data.user.id", - "用户名字段": "用户名字段", - "支持 JSONPath,如 preferred_username, login, data.user.username": "支持 JSONPath,如 preferred_username, login, data.user.username", - "显示名称字段": "显示名称字段", - "支持 JSONPath,如 name, display_name, data.user.name": "支持 JSONPath,如 name, display_name, data.user.name", - "邮箱字段": "邮箱字段", - "支持 JSONPath,如 email, data.user.email": "支持 JSONPath,如 email, data.user.email", - "授权范围 (Scopes)": "授权范围 (Scopes)", - "认证方式": "认证方式", - "自动检测": "自动检测", - "参数传递": "参数传递", - "Basic Auth 头": "Basic Auth 头", - "暂无自定义 OAuth 提供商": "暂无自定义 OAuth 提供商", - "确定要删除该提供商吗?": "确定要删除该提供商吗?", - "创建成功": "创建成功", - "更新成功": "更新成功", - "确认解绑": "确认解绑", - "确定要解绑 {{name}} 吗?": "确定要解绑 {{name}} 吗?", - "解绑成功": "解绑成功", - "{{name}} ID": "{{name}} ID", - "使用 {{name}} 继续": "使用 {{name}} 继续", - "端点 URL 必须以 http:// 或 https:// 开头:": "端点 URL 必须以 http:// 或 https:// 开头:", - "OAuth 配置错误:授权端点必须是完整的 URL(以 http:// 或 https:// 开头)": "OAuth 配置错误:授权端点必须是完整的 URL(以 http:// 或 https:// 开头)", - "OAuth 登录失败:": "OAuth 登录失败:", - "必填:请输入服务器地址以自动生成完整端点 URL": "必填:请输入服务器地址以自动生成完整端点 URL", - "填写服务器地址后自动生成:": "填写服务器地址后自动生成:", - "自动生成:": "自动生成:", - "请先填写服务器地址,以自动生成完整的端点 URL": "请先填写服务器地址,以自动生成完整的端点 URL", - "端点 URL 必须是完整地址(以 http:// 或 https:// 开头)": "端点 URL 必须是完整地址(以 http:// 或 https:// 开头)", - "缓存读": "缓存读", - "缓存写": "缓存写", - "写": "写", - "根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。": "根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。", - "未匹配到模型,按回车键可将「{{name}}」作为自定义模型名添加": "未匹配到模型,按回车键可将「{{name}}」作为自定义模型名添加" + "默认补全倍率": "默认补全倍率" } } diff --git a/web/src/i18n/locales/zh-TW.json b/web/src/i18n/locales/zh-TW.json index 85be3f9f75..91a79a8e48 100644 --- a/web/src/i18n/locales/zh-TW.json +++ b/web/src/i18n/locales/zh-TW.json @@ -6,6 +6,8 @@ " 个模型设置相同的值": " 個模型設定相同的值", " 吗?": " 嗎?", " 秒": " 秒", + " 秒。": " 秒。", + ",当前无生效订阅,将自动使用钱包": ",當前無生效訂閱,將自動使用錢包", ",时间:": ",時間:", ",点击更新": ",點擊更新", "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(當前僅支援易支付接口,預設使用上方伺服器位址作為回調位址!)", @@ -19,25 +21,33 @@ "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", + "{{name}} ID": "{{name}} ID", "{{ratioType}} {{ratio}}": "{{ratioType}} {{ratio}}", + "• 如果无法获取验证码,请使用备用码": "• 如果無法獲取驗證碼,請使用備用碼", + "• 每个备用码只能使用一次": "• 每個備用碼只能使用一次", "• 视频服务商的跨域限制": "• 影片服務商的跨域限制", "• 防盗链保护机制": "• 防盜鏈保護機制", "• 需要特定的请求头或认证": "• 需要特定的請求頭或認證", + "• 验证码每30秒更新一次": "• 驗證碼每30秒更新一次", "© {{currentYear}}": "© {{currentYear}}", "| 基于": "| 基於", "$/1M tokens": "$/1M tokens", "0 - 最低": "0 - 最低", + "0 表示不限": "0 表示不限", "0.002-1之间的小数": "0.002-1之間的小數", "0.1以上的小数": "0.1以上的小數", + "1) 点击「打开授权页面」完成登录;2) 浏览器会跳转到 localhost(页面打不开也没关系);3) 复制地址栏完整 URL 粘贴到下方;4) 点击「生成并填入」。": "1) 點選「開啟授權頁面」完成登入;2) 瀏覽器會跳轉到 localhost(頁面打不開也沒關係);3) 複製位址列完整 URL 貼上到下方;4) 點選「生成並填入」。", "10 - 最高": "10 - 最高", "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "1h快取建立 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})", "1h缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (1h缓存创建倍率: {{cacheCreationRatio1h}})": "1h快取建立價格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (1h快取建立倍率: {{cacheCreationRatio1h}})", "2 - 低": "2 - 低", "2025年5月10日后添加的渠道,不需要再在部署的时候移除模型名称中的\".\"": "2025年5月10日後添加的管道,不需要再在部署的時候移除模型名稱中的\".\"", + "360 智脑": "360 智腦", "360智脑": "360智腦", "5 - 正常(默认)": "5 - 正常(預設)", "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "5m快取建立 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})", "5m缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (5m缓存创建倍率: {{cacheCreationRatio5m}})": "5m快取建立價格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (5m快取建立倍率: {{cacheCreationRatio5m}})", + "5小时窗口": "5小時視窗", "8 - 高": "8 - 高", "AGPL v3.0协议": "AGPL v3.0協議", "AI 对话": "AI 對話", @@ -55,6 +65,11 @@ "API令牌管理": "API令牌管理", "API使用记录": "API使用記錄", "API信息": "API資訊", + "API信息已删除,请及时点击”保存设置”进行保存": "API資訊已刪除,請及時點選”儲存設定”進行儲存", + "API信息已更新": "API資訊已更新", + "API信息已更新,请及时点击”保存设置”进行保存": "API資訊已更新,請及時點選”儲存設定”進行儲存", + "API信息已添加,请及时点击”保存设置”进行保存": "API資訊已新增,請及時點選”儲存設定”進行儲存", + "API信息更新失败": "API資訊更新失敗", "API信息管理,可以配置多个API地址用于状态展示和负载均衡(最多50个)": "API資訊管理,可以設定多個API位址用於狀態展示和負載均衡(最多50個)", "API地址": "API位址", "API渠道配置": "API管道設定", @@ -65,13 +80,27 @@ "Bark推送URL": "Bark推送URL", "Bark推送URL必须以http://或https://开头": "Bark推送URL必須以http://或https://開頭", "Bark通知": "Bark通知", + "Basic Auth 头": "Basic Auth 頭", + "Cached tokens": "Cached tokens", + "Cached tokens 占比口径由后端返回:Claude 语义按 cached/(prompt+cached),其余按 cached/prompt。": "Cached tokens 佔比口徑由後端返回:Claude 語義按 cached/(prompt+cached),其餘按 cached/prompt。", "Changing batch type to:": "Changing batch type to:", + "ChatCompletions→Responses 兼容配置": "ChatCompletions→Responses 相容配置", + "ChatCompletions→Responses 兼容配置(Beta)": "ChatCompletions→Responses 兼容設定(Beta)", + "Claude 强制 beta=true": "Claude 強制 beta=true", "Claude思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Claude思考相容 BudgetTokens = MaxTokens * BudgetTokens 百分比", "Claude设置": "Claude設定", "Claude请求头覆盖": "Claude請求頭覆蓋", "Client ID": "Client ID", "Client Secret": "Client Secret", + "Codex 授权": "Codex 授權", + "Codex 渠道不支持批量创建": "Codex 渠道不支援批次建立", + "Codex 用量": "Codex 用量", "common.changeLanguage": "common.changeLanguage", + "Completion tokens": "Completion tokens", + "Configuration": "Configuration", + "context_int/context_string 从请求上下文读取;gjson 从入口请求的 JSON body 按 gjson path 读取。": "context_int/context_string 從請求上下文讀取;gjson 從入口請求的 JSON body 按 gjson path 讀取。", + "CPU 使用率超过此值时拒绝请求": "CPU 使用率超過此值時拒絕請求", + "CPU 阈值 (%)": "CPU 閾值 (%)", "Creem API 密钥,敏感信息不显示": "Creem API 密鑰,敏感資訊不顯示", "Creem Setting Tips": "Creem 只支援預設的固定金額產品,這產品以及價格需要提前在Creem網站內建立設定,所以不支援自訂動態金額儲值。在Creem端設定產品的名字以及價格,獲取Product Id 後填到下面的產品,在new-api為該產品設定儲值額度,以及展示價格。", "Creem 介绍": "Creem 是一個簡單的支付處理平臺,支援固定金額產品銷售,以及訂閱銷售。", @@ -84,8 +113,14 @@ "Discord Client ID": "Discord Client ID", "Discord Client Secret": "Discord Client Secret", "Discord ID": "Discord ID", + "Discovery claims": "Discovery claims", + "Discovery scopes": "Discovery scopes", + "Discovery 建议 scopes:": "Discovery 建議 scopes:", "EUR (欧元)": "EUR (歐元)", "false": "false", + "GC 已执行": "GC 已執行", + "GC 执行失败": "GC 執行失敗", + "GC 次数": "GC 次數", "Gemini安全设置": "Gemini安全設定", "Gemini思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Gemini思考相容 BudgetTokens = MaxTokens * BudgetTokens 百分比", "Gemini思考适配设置": "Gemini思考相容設定", @@ -95,34 +130,53 @@ "GitHub Client ID": "GitHub Client ID", "GitHub Client Secret": "GitHub Client Secret", "GitHub ID": "GitHub ID", + "Goroutine 数": "Goroutine 數", "Gotify应用令牌": "Gotify應用令牌", "Gotify服务器地址": "Gotify伺服器位址", "Gotify服务器地址必须以http://或https://开头": "Gotify伺服器位址必須以http://或https://開頭", "Gotify通知": "Gotify通知", - "Grok设置": "Grok設定", "GPU/容器": "GPU/容器", "GPU数量": "GPU數量", + "Grok设置": "Grok設定", "Homepage URL 填": "Homepage URL 填", "ID": "ID", + "id(用户 ID)": "id(使用者 ID)", + "include_obfuscation 用于控制 Responses 流混淆字段。默认关闭以避免客户端关闭该安全保护": "include_obfuscation 用於控制 Responses 流混淆欄位。預設關閉以避免客戶端關閉該安全保護", + "inference_geo 字段用于控制 Claude 数据驻留推理区域。默认关闭以避免未经授权透传地域信息": "inference_geo 欄位用於控制 Claude 資料駐留推理區域。預設關閉以避免未經授權透傳地域資訊", "IP": "IP", "IP白名单": "IP白名單", "IP白名单(支持CIDR表达式)": "IP白名單(支援CIDR表達式)", "IP限制": "IP限制", "IP黑名单": "IP黑名單", "JSON": "JSON", + "JSON 模式": "JSON 模式", "JSON 模式支持手动输入或上传服务账号 JSON": "JSON 模式支援手動輸入或上傳服務帳號 JSON", "JSON格式密钥,请确保格式正确": "JSON格式密鑰,請確保格式正確", "JSON格式错误": "JSON格式錯誤", "JSON编辑": "JSON編輯", "JSON解析错误:": "JSON解析錯誤:", + "Key": "Key", + "Key 或 Path": "Key 或 Path", + "Key 指纹": "Key 指紋", + "Key 摘要": "Key 摘要", + "Key 来源": "Key 來源", + "Key 来源类型": "Key 來源型別", "Linux DO Client ID": "Linux DO Client ID", "Linux DO Client Secret": "Linux DO Client Secret", "LinuxDO": "LinuxDO", "LinuxDO ID": "LinuxDO ID", "Logo 图片地址": "Logo 圖片位址", + "Logo 已更新": "Logo 已更新", + "Logo 更新失败": "Logo 更新失敗", "Midjourney 任务记录": "Midjourney 任務記錄", "MIT许可证": "MIT許可證", "New API项目仓库地址:": "New API項目倉庫位址:", + "NewAPI 默认不会将入口请求的 User-Agent 透传到上游渠道;该条件仅用于识别访问本站点的客户端。": "NewAPI 預設不會將入口請求的 User-Agent 透傳到上游渠道;該條件僅用於識別訪問本站點的客戶端。", + "OAuth Client ID": "OAuth Client ID", + "OAuth Client Secret": "OAuth Client Secret", + "OAuth 登录失败:": "OAuth 登錄失敗:", + "OAuth 端点": "OAuth 端點", + "OAuth 配置错误:授权端点必须是完整的 URL(以 http:// 或 https:// 开头)": "OAuth 設定錯誤:授權端點必須是完整的 URL(以 http:// 或 https:// 開頭)", "OIDC": "OIDC", "OIDC ID": "OIDC ID", "Ollama 模型管理": "Ollama 模型管理", @@ -134,12 +188,20 @@ "Passkey 注册失败,请重试": "Passkey 註冊失敗,請重試", "Passkey 注册成功": "Passkey 註冊成功", "Passkey 登录": "Passkey 登錄", + "Passkey 登录失败,请重试": "Passkey 登入失敗,請重試", + "Passkey 验证失败,请重试": "Passkey 驗證失敗,請重試", "Ping间隔(秒)": "Ping間隔(秒)", + "POST 参数": "POST 引數", "price_xxx 的商品价格 ID,新建产品后可获得": "price_xxx 的商品價格 ID,新建產品後可獲得", + "Prompt cache hit tokens": "Prompt cache hit tokens", + "Prompt tokens": "Prompt tokens", "Reasoning Effort": "Reasoning Effort", + "Request ID": "Request ID", "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "safety_identifier 字段用於幫助 OpenAI 識別可能違反使用政策的應用程式使用者。預設關閉以保護使用者隱私", + "Scopes(可选)": "Scopes(可選)", "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "service_tier 字段用於指定服務層級,允許透傳可能導致實際計費高於預期。預設關閉以避免額外費用", "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "sk_xxx 或 rk_xxx 的 Stripe 密鑰,敏感資訊不顯示", + "Slug只能包含字母、数字、下划线和连字符": "Slug只能包含字母、數字、下劃線和連字元", "SMTP 发送者邮箱": "SMTP 發送者信箱", "SMTP 服务器地址": "SMTP 伺服器位址", "SMTP 端口": "SMTP 端口", @@ -151,22 +213,33 @@ "SSRF防护设置": "SSRF防護設定", "SSRF防护详细说明": "SSRF防護可防止惡意使用者利用您的伺服器訪問內網資源。您可以設定受信任域名/IP的白名單,並限制允許的端口。適用於檔案下載、Webhook回調和通知功能。", "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "store 字段用於授權 OpenAI 存儲請求數據以評估和優化產品。預設關閉,開啟後可能導致 Codex 無法正常使用", - "免责声明:仅限个人使用,请勿分发或共享任何凭证。该渠道存在前置条件与使用门槛,请在充分了解流程与风险后使用,并遵守 OpenAI 的相关条款与政策。相关凭证与配置仅限接入 Codex CLI 使用,不适用于其他客户端、平台或渠道。": "免責聲明:僅限個人使用,請勿分發或共享任何憑證。該管道存在前置條件與使用門檻,請在充分了解流程與風險後使用,並遵守 OpenAI 的相關條款與政策。相關憑證與設定僅限接入 Codex CLI 使用,不適用於其他客戶端、平臺或管道。", "Stripe 设置": "Stripe 設定", + "Stripe/Creem 商品ID(可选)": "Stripe/Creem 商品ID(可選)", + "Stripe/Creem 需在第三方平台创建商品并填入 ID": "Stripe/Creem 需在第三方平臺建立商品並填入 ID", "Telegram": "Telegram", "Telegram Bot Token": "Telegram Bot Token", "Telegram Bot 名称": "Telegram Bot 名稱", "Telegram ID": "Telegram ID", "Token Endpoint": "Token Endpoint", + "token 会按倍率换算成“额度/次数”,请求结束后再做差额结算(补扣/返还)。": "token 會按倍率換算成“額度/次數”,請求結束後再做差額結算(補釦/返還)。", + "Total tokens": "Total tokens", "true": "true", + "TTL(秒,0 表示默认)": "TTL(秒,0 表示預設)", + "TTL(秒)": "TTL(秒)", "Turnstile Secret Key": "Turnstile Secret Key", "Turnstile Site Key": "Turnstile Site Key", "Unix时间戳": "Unix時間戳", "Uptime Kuma地址": "Uptime Kuma位址", "Uptime Kuma监控分类管理,可以配置多个监控分类用于服务状态展示(最多20个)": "Uptime Kuma監控分類管理,可以設定多個監控分類用於服務狀態展示(最多20個)", + "Uptime Kuma配置已更新": "Uptime Kuma配置已更新", + "Uptime Kuma配置更新失败": "Uptime Kuma配置更新失敗", + "URL 标识,只能包含小写字母、数字和连字符": "URL 標識,只能包含小寫字母、數字和連字元", "URL链接": "URL連結", "USD (美元)": "USD (美元)", "User Info Endpoint": "User Info Endpoint", + "User-Agent include": "User-Agent include", + "User-Agent include(每行一个,可不写)": "User-Agent include(每行一個,可不寫)", + "Value 正则": "Value 正則", "Vertex AI 不支持 functionResponse.id 字段,开启后将自动移除该字段": "Vertex AI 不支援 functionResponse.id 字段,開啟後將自動移除該字段", "Webhook 密钥": "Webhook 密鑰", "Webhook 签名密钥": "Webhook 簽名密鑰", @@ -193,19 +266,24 @@ "上一步": "上一步", "上次保存: ": "上次儲存: ", "上游倍率同步": "上游倍率同步", + "上游状态码:": "上游狀態碼:", "上游返回": "上游返回", "下一个表单块": "下一個表單塊", "下一步": "下一步", "下午好": "午安", "下载日志": "下載日誌", "不再提醒": "不再提醒", + "不升级": "不升級", "不同用户分组的价格信息": "不同使用者分組的價格資訊", "不填则为模型列表第一个": "不填則為模型列表第一個", "不建议使用": "不建議使用", "不支持": "不支援", "不是合法的 JSON 字符串": "不是合法的 JSON 字符串", "不更改": "不更改", + "不重置": "不重置", + "不限": "不限", "不限制": "不限制", + "不需要在末尾加/v1,New API会自动处理,添加后可能导致请求失败,是否继续?": "不需要在末尾加/v1,New API會自動處理,新增後可能導致請求失敗,是否繼續?", "与本地相同": "與本地相同", "专属倍率": "專屬倍率", "两次输入的密码不一致": "兩次輸入的密碼不一致", @@ -222,10 +300,14 @@ "个人信息设置": "個人資訊設定", "个人设置": "個人設定", "个实例": "個實例", + "个已过期": "個已過期", "个性化设置": "個性化設定", "个性化设置左侧边栏的显示内容": "個性化設定左側邊欄的顯示內容", + "个月": "個月", + "个月前": "個月前", "个未配置模型": "個未設定模型", "个模型": "個模型", + "个生效中": "個生效中", "个部署吗?此操作不可逆。": "個部署嗎?此操作不可逆。", "中午好": "午安", "为一个 JSON 对象,例如:{\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}": "為一個 JSON 對象,例如:{\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}", @@ -242,6 +324,7 @@ "为一个 JSON 文本,键为组名称,值为倍率": "為一個 JSON 文本,鍵為組名稱,值為倍率", "为了保护账户安全,请验证您的两步验证码。": "為了保護帳號安全,請驗證您的兩步驗證碼。", "为了保护账户安全,请验证您的身份。": "為了保護帳號安全,請驗證您的身份。", + "为保证匹配准确,请确保客户端直连本站点(避免反向代理/网关改写 User-Agent)。": "為保證匹配準確,請確保客戶端直連本站點(避免反向代理/閘道器改寫 User-Agent)。", "为空则默认使用服务器地址,多个 Origin 用逗号分隔,例如 https://newapi.pro,https://newapi.com ,注意不能携带[],需使用https": "為空則預設使用伺服器位址,多個 Origin 用逗號分隔,例如 https://newapi.pro,https://newapi.com ,注意不能攜帶[],需使用https", "主页链接填": "首頁連結填", "之前的所有日志": "之前的所有日誌", @@ -260,13 +343,21 @@ "仅对自定义模型有效": "僅對自訂模型有效", "仅当自动禁用开启时有效,关闭后不会自动禁用该渠道": "僅當自動禁用開啟時有效,關閉後不會自動禁用該管道", "仅支持": "僅支援", + "仅支持 JSON 对象,必须包含 access_token 与 account_id": "僅支援 JSON 物件,必須包含 access_token 與 account_id", "仅支持 JSON 文件": "僅支援 JSON 檔案", "仅支持 JSON 文件,支持多文件": "僅支援 JSON 檔案,支援多檔案", "仅支持 OpenAI 接口格式": "僅支援 OpenAI 接口格式", + "仅显示已绑定": "僅顯示已繫結", "仅显示矛盾倍率": "僅顯示矛盾倍率", "仅用于开发环境,生产环境应使用 HTTPS": "僅用於開發環境,生產環境應使用 HTTPS", + "仅用于换算,实际保存的是额度": "僅用於換算,實際儲存的是額度", + "仅用订阅": "僅用訂閱", + "仅用钱包": "僅用錢包", "仅重置配置": "僅重置設定", + "今天": "今天", "今日关闭": "今日關閉", + "今日已签到": "今日已簽到", + "今日已签到,累计签到": "今日已簽到,累計簽到", "从官方模型库同步": "從官方模型庫同步", "从认证器应用中获取验证码,或使用备用码": "從認證器應用中獲取驗證碼,或使用備用碼", "从配置文件同步": "從組態檔同步", @@ -281,6 +372,7 @@ "令牌已重置并已复制到剪贴板": "令牌已重置並已複製到剪貼板", "令牌更新成功!": "令牌更新成功!", "令牌的额度仅用于限制令牌本身的最大额度使用量,实际的使用受到账户的剩余额度限制": "令牌的額度僅用於限制令牌本身的最大額度使用量,實際的使用受到帳號的剩餘額度限制", + "令牌端点": "令牌端點", "令牌管理": "令牌管理", "以下上游数据可能不可信:": "以下上游數據可能不可信:", "以下文件解析失败,已忽略:{{list}}": "以下檔案解析失敗,已忽略:{{list}}", @@ -304,12 +396,22 @@ "任务记录": "任務記錄", "企业账户为特殊返回格式,需要特殊处理,如果非企业账户,请勿勾选": "企業帳號為特殊返回格式,需要特殊處理,如果非企業帳號,請勿勾選", "优先级": "優先級", + "优先级必须是整数!": "優先順序必須是整數!", + "优先订阅": "優先訂閱", + "优先钱包": "優先錢包", "优惠": "優惠", "低于此额度时将发送邮件提醒用户": "低於此額度時將發送郵件提醒使用者", "余额": "餘額", "余额充值管理": "餘額儲值管理", + "作废": "作廢", + "作废于": "作廢於", + "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "作廢後該訂閱將立即失效,歷史記錄不受影響。是否繼續?", + "作用域": "作用域", + "作用域:包含分组": "作用域:包含分組", + "作用域:包含规则名称": "作用域:包含規則名稱", "你似乎并没有修改什么": "你似乎並沒有修改什麼", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "你可以在「自訂模型名稱」處手動添加它們,然後點擊填入後再提交,或者直接使用下方操作自動處理。", + "使用 {{name}} 继续": "使用 {{name}} 繼續", "使用 Discord 继续": "使用 Discord 繼續", "使用 GitHub 继续": "使用 GitHub 繼續", "使用 JSON 对象格式,格式为:{\"组名\": [最多请求次数, 最多请求完成次数]}": "使用 JSON 對象格式,格式為:{\"組名\": [最多請求次數, 最多請求完成次數]}", @@ -322,13 +424,21 @@ "使用 用户名 注册": "使用 使用者名 註冊", "使用 邮箱或用户名 登录": "使用 信箱或使用者名 登錄", "使用ID排序": "使用ID排序", + "使用备用码": "使用備用碼", "使用日志": "使用日誌", "使用模式": "使用模式", "使用统计": "使用統計", "使用认证器应用(如 Google Authenticator、Microsoft Authenticator)扫描下方二维码:": "使用認證器應用(如 Google Authenticator、Microsoft Authenticator)掃描下方QR Code:", "使用认证器应用扫描二维码": "使用認證器應用掃描QR Code", + "使用认证器验证码": "使用認證器驗證碼", + "例如": "例如", + "例如 /var/cache/new-api": "例如 /var/cache/new-api", "例如 €, £, Rp, ₩, ₹...": "例如 €, £, Rp, ₩, ₹...", + "例如 100000…": "例如 100000…", + "例如 3600…": "例如 3600…", + "例如 600…": "例如 600…", "例如 https://docs.newapi.pro": "例如 https://docs.newapi.pro", + "例如 prefer-by-conversation-id…": "例如 prefer-by-conversation-id…", "例如:": "例如:", "例如: /bin/bash -c \"python app.py\"": "例如: /bin/bash -c \"python app.py\"", "例如: nginx:latest": "例如: nginx:latest", @@ -341,13 +451,28 @@ "例如:2,就是最低充值2$": "例如:2,就是最低儲值2$", "例如:2000": "例如:2000", "例如:4.99": "例如:4.99", + "例如:401, 403, 429, 500-599": "例如:401,403,429,500-599", "例如:7,就是7元/美金": "例如:7,就是7元/美金", + "例如:email": "例如:email", "例如:example.com": "例如:example.com", + "例如:github / si:google / https://example.com/logo.png / 🐱": "例如:github / si:google / https://example.com/logo.png / 🐱", + "例如:GitHub Enterprise": "例如:GitHub Enterprise", + "例如:github-enterprise": "例如:github-enterprise", + "例如:https://example.com/.well-known/openid-configuration": "例如:https://example.com/.well-known/openid-configuration", + "例如:https://gitea.example.com": "例如:https://gitea.example.com", + "例如:https://workername.yourdomain.workers.dev": "例如:https://workername.yourdomain.workers.dev", "例如:https://yourdomain.com": "例如:https://yourdomain.com", + "例如:name、full_name": "例如:name、full_name", "例如:nginx:latest": "例如:nginx:latest", + "例如:preferred_username、login": "例如:preferred_username、login", "例如:preview": "例如:preview", "例如:prod_6I8rBerHpPxyoiU9WK4kot": "例如:prod_6I8rBerHpPxyoiU9WK4kot", + "例如:sub、id、data.user.id": "例如:sub、id、data.user.id", "例如:基础套餐": "例如:基礎訂閱", + "例如:适合轻度使用": "例如:適合輕度使用", + "例如:需要等级 {{required}},你当前等级 {{current}}": "例如:需要等級 {{required}},你當前等級 {{current}}", + "例如(全渠道):": "例如(全渠道):", + "例如(指定渠道):": "例如(指定渠道):", "例如发卡网站的购买链接": "例如髮卡網站的購買連結", "供应商": "供應商", "供应商介绍": "供應商介紹", @@ -376,12 +501,14 @@ "保存失败,请重试": "儲存失敗,請重試", "保存失败:": "儲存失敗:", "保存屏蔽词过滤设置": "儲存屏蔽詞過濾設定", + "保存性能设置": "儲存性能設定", "保存成功": "儲存成功", "保存数据看板设置": "儲存數據看板設定", "保存日志设置": "儲存日誌設定", "保存模型倍率设置": "儲存模型倍率設定", "保存模型速率限制": "儲存模型速率限制", "保存监控设置": "儲存監控設定", + "保存签到设置": "儲存簽到設定", "保存绘图设置": "儲存繪圖設定", "保存聊天设置": "儲存聊天設定", "保存设置": "儲存設定", @@ -400,17 +527,22 @@ "倍率是为了方便换算不同价格的模型": "倍率是為了方便換算不同價格的模型", "倍率模式": "倍率模式", "倍率类型": "倍率類型", + "偏好设置": "偏好設定", + "停止中": "停止中", "停止测试": "停止測試", "停用": "停用", "允许 AccountFilter 参数": "允許 AccountFilter 參數", "允许 HTTP 协议图片请求(适用于自部署代理)": "允許 HTTP 協議圖片請求(適用於自部署代理)", + "允许 inference_geo 透传": "允許 inference_geo 透傳", "允许 safety_identifier 透传": "允許 safety_identifier 透傳", "允许 service_tier 透传": "允許 service_tier 透傳", + "允许 stream_options.include_obfuscation 透传": "允許 stream_options.include_obfuscation 透傳", "允许 Turnstile 用户校验": "允許 Turnstile 使用者校驗", "允许不安全的 Origin(HTTP)": "允許不安全的 Origin(HTTP)", "允许回调(会泄露服务器 IP 地址)": "允許回調(會洩露伺服器 IP 位址)", "允许在 Stripe 支付中输入促销码": "允許在 Stripe 支付中輸入促銷碼", "允许新用户注册": "允許新使用者註冊", + "允许注册的最低信任等级": "允許註冊的最低信任等級", "允许的 Origins": "允許的 Origins", "允许的IP,一行一个,不填写则不限制": "允許的IP,一行一個,不填寫則不限制", "允许的端口": "允許的端口", @@ -441,12 +573,11 @@ "充值金额折扣配置不是合法的 JSON 对象": "儲值金額折扣設定不是合法的 JSON 對象", "充值链接": "儲值連結", "充值额度": "儲值額度", + "先填写配置,再自动填充 OAuth 端点,能显著减少手工输入": "先填寫配置,再自動填充 OAuth 端點,能顯著減少手工輸入", + "免责声明:仅限个人使用,请勿分发或共享任何凭证。该渠道存在前置条件与使用门槛,请在充分了解流程与风险后使用,并遵守 OpenAI 的相关条款与政策。相关凭证与配置仅限接入 Codex CLI 使用,不适用于其他客户端、平台或渠道。": "免責聲明:僅限個人使用,請勿分發或共享任何憑證。該管道存在前置條件與使用門檻,請在充分了解流程與風險後使用,並遵守 OpenAI 的相關條款與政策。相關憑證與設定僅限接入 Codex CLI 使用,不適用於其他客戶端、平臺或管道。", "兑换人ID": "兌換人ID", "兑换成功!": "兌換成功!", "兑换码充值": "兌換碼儲值", - "确认清理不活跃的磁盘缓存?": "確認清理不活躍的磁碟快取?", - "这将删除超过 10 分钟未使用的临时缓存文件": "這將刪除超過 10 分鐘未使用的臨時快取檔案", - "清理不活跃缓存": "清理不活躍快取", "兑换码创建成功": "兌換碼建立成功", "兑换码创建成功,是否下载兑换码?": "兌換碼建立成功,是否下載兌換碼?", "兑换码创建成功!": "兌換碼建立成功!", @@ -473,7 +604,10 @@ "全部类型": "全部類型", "公告": "公告", "公告内容": "公告內容", + "公告已删除,请及时点击”保存设置”进行保存": "公告已刪除,請及時點選”儲存設定”進行儲存", "公告已更新": "公告已更新", + "公告已更新,请及时点击”保存设置”进行保存": "公告已更新,請及時點選”儲存設定”進行儲存", + "公告已添加,请及时点击”保存设置”进行保存": "公告已新增,請及時點選”儲存設定”進行儲存", "公告更新失败": "公告更新失敗", "公告类型": "公告類型", "共": "共", @@ -484,6 +618,8 @@ "共 {{total}} 项,当前显示 {{start}}-{{end}} 项": "共 {{total}} 項,當前顯示 {{start}}-{{end}} 項", "关": "關", "关于": "關於", + "关于内容已更新": "關於內容已更新", + "关于内容更新失败": "關於內容更新失敗", "关于我们": "關於我們", "关于系统的详细信息": "關於系統的詳細資訊", "关于项目": "關於項目", @@ -492,15 +628,22 @@ "关闭侧边栏": "關閉側邊欄", "关闭公告": "關閉公告", "关闭后,此模型将不会被“同步官方”自动覆盖或创建": "關閉後,此模型將不會被「同步官方」自動覆蓋或建立", + "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?": "關閉後將不再顯示此提示(僅對當前瀏覽器生效)。確定要關閉嗎?", "关闭弹窗,已停止批量测试": "關閉彈窗,已停止批量測試", + "关闭提示": "關閉提示", "其他": "其他", "其他注册选项": "其他註冊選項", "其他登录选项": "其他登錄選項", "其他设置": "其他設定", "其他详情": "其他詳情", + "内存 阈值 (%)": "記憶體 閾值 (%)", + "内存使用率超过此值时拒绝请求": "記憶體使用率超過此值時拒絕請求", + "内存命中": "記憶體命中", + "内存缓存最大条目数。0 表示使用后端默认容量:100000。": "記憶體快取最大條目數。0 表示使用後端預設容量:100000。", "内容": "內容", "内容较大,已启用性能优化模式": "內容較大,已啟用性能優化模式", "内容较大,部分功能可能受限": "內容較大,部分功能可能受限", + "内置": "內建", "内置 Ollama 镜像": "內置 Ollama 鏡像", "再次输入部署名称": "再次輸入部署名稱", "最低": "最低", @@ -510,10 +653,21 @@ "最后请求": "最後請求", "最大GPU数量": "最大GPU數量", "最大可用": "最大可用", + "最大条目数": "最大條目數", + "最终抵扣": "最終抵扣", + "最近一次": "最近一次", "最近事件": "最近事件", + "写": "寫", + "准入策略": "准入策略", + "准入策略 JSON(可选)": "准入策略 JSON(可選)", + "准备中": "準備中", "准备中...": "準備中...", "准备完成初始化": "準備完成初始化", + "凭证已刷新": "憑證已重新整理", "分类名称": "分類名稱", + "分类已删除,请及时点击”保存设置”进行保存": "分類已刪除,請及時點選”儲存設定”進行儲存", + "分类已更新,请及时点击”保存设置”进行保存": "分類已更新,請及時點選”儲存設定”進行儲存", + "分类已添加,请及时点击”保存设置”进行保存": "分類已新增,請及時點選”儲存設定”進行儲存", "分组": "分組", "分组与模型定价设置": "分組與模型定價設定", "分组价格": "分組價格", @@ -526,6 +680,7 @@ "分组速率配置优先级高于全局速率限制。": "分組速率設定優先級高於全域速率限制。", "分组速率限制": "分組速率限制", "分钟": "分鐘", + "分钟前": "分鐘前", "切换为Assistant角色": "切換為Assistant角色", "切换为System角色": "切換為System角色", "切换为单密钥模式": "切換為單密鑰模式", @@ -536,6 +691,7 @@ "划转额度": "劃轉額度", "列出的模型将不会自动添加或移除-thinking/-nothinking 后缀": "列出的模型將不會自動添加或移除-thinking/-nothinking 後綴", "列设置": "列設定", + "刚刚": "剛剛", "创建": "建立", "创建令牌默认选择auto分组,初始令牌也将设为auto(否则留空,为用户默认分组)": "建立令牌預設選擇auto分組,初始令牌也將設為auto(否則留空,為使用者預設分組)", "创建失败": "建立失敗", @@ -546,12 +702,15 @@ "创建新的兑换码": "建立新的兌換碼", "创建新的模型": "建立新的模型", "创建新的渠道": "建立新的管道", + "创建新的订阅套餐": "建立新的訂閱", "创建新的预填组": "建立新的預填組", "创建时间": "建立時間", "创建用户": "建立使用者", "初始化失败,请重试": "初始化失敗,請重試", "初始化系统": "初始化系統", "删除": "刪除", + "删除 Key 来源": "刪除 Key 來源", + "删除会彻底移除该订阅记录(含权益明细)。是否继续?": "刪除會徹底移除該訂閱記錄(含權益明細)。是否繼續?", "删除后无法恢复,确定要删除模型 \"{{name}}\" 吗?": "刪除後無法恢復,確定要刪除模型 \"{{name}}\" 嗎?", "删除失败": "刪除失敗", "删除密钥失败": "刪除密鑰失敗", @@ -562,17 +721,23 @@ "删除禁用密钥失败": "刪除禁用密鑰失敗", "删除禁用通道": "刪除禁用通道", "删除自动禁用密钥": "刪除自動禁用密鑰", + "删除规则": "刪除規則", "删除账户": "刪除帳號", "删除账户确认": "刪除帳號確認", "删除部署失败": "刪除部署失敗", "刷新": "刷新", + "刷新凭证": "重新整理憑證", "刷新失败": "刷新失敗", "刷新容器信息": "刷新容器資訊", "刷新日志": "刷新日誌", + "刷新统计": "刷新統計", + "刷新缓存统计": "重新整理快取統計", + "刷新缓存统计失败": "重新整理快取統計失敗", "前往 io.net API Keys": "前往 io.net API Keys", "前往设置": "前往設定", "前往设置页面": "前往設定頁面", "前缀": "前綴", + "前缀名称匹配": "字首名稱匹配", "副本数量": "副本數量", "剩余": "剩餘", "剩余备用码:": "剩餘備用碼:", @@ -601,27 +766,40 @@ "加载账单失败": "載入帳單失敗", "加载隐私政策内容失败...": "載入隱私政策內容失敗...", "包含": "包含", + "包含名称匹配": "包含名稱匹配", "包含来自未知或未标明供应商的AI模型,这些模型可能来自小型供应商或开源项目。": "包含來自未知或未標明供應商的AI模型,這些模型可能來自小型供應商或開源項目。", "包括失败请求的次数,0代表不限制": "包括失敗請求的次數,0代表不限制", "匹配类型": "匹配類型", "区域": "區域", + "升级分组": "升級分組", "单GPU小时费率": "單GPU小時費率", + "即梦": "即夢", "历史消耗": "歷史消耗", "原价": "原價", "原因:": "原因:", + "原始 JSON": "原始 JSON", "原密码": "原密碼", + "原生格式": "原生格式", + "原生额度": "原生額度", "去重完成:去重前 {{before}} 个密钥,去重后 {{after}} 个密钥": "去重完成:去重前 {{before}} 個密鑰,去重後 {{after}} 個密鑰", "参与官方同步": "參與官方同步", "参数": "參數", + "参数传递": "參數傳遞", "参数值": "參數值", "参数覆盖": "參數覆蓋", + "参数覆盖必须是合法的 JSON 格式!": "引數覆蓋必須是合法的 JSON 格式!", + "参数配置": "引數配置", "参照生视频": "參照生影片", "友情链接": "友情連結", "发布日期": "發佈日期", "发布时间": "發佈時間", + "发现文档地址(Discovery URL,可选)": "發現文件地址(Discovery URL,可選)", + "发行者 URL(Issuer URL)": "發行者 URL(Issuer URL)", + "发送验证码失败,请重试": "傳送驗證碼失敗,請重試", "取消": "取消", "取消全选": "取消全選", "取消选择": "取消選擇", + "受限": "受限", "变换": "變換", "变焦": "變焦", "变量值": "變數值", @@ -631,17 +809,29 @@ "只有当用户设置开启IP记录时,才会进行请求和错误类型日志的IP记录": "只有當使用者設定開啟IP記錄時,才會進行請求和錯誤類型日誌的IP記錄", "可信": "可信", "可在设置页面设置关于内容,支持 HTML & Markdown": "可在設定頁面設定關於內容,支援 HTML & Markdown", + "可手动填写,多个 scope 用空格分隔": "可手動填寫,多個 scope 用空格分隔", + "可灵": "可靈", + "可用": "可用", "可用令牌分组": "可用令牌分組", "可用分组": "可用分組", + "可用变量:{{provider}} {{field}} {{op}} {{required}} {{current}} 以及 {{current.path}}": "可用變數:{{provider}} {{field}} {{op}} {{required}} {{current}} 以及 {{current.path}}", "可用数量": "可用數量", "可用模型": "可用模型", + "可用率": "可用率", + "可用空间: {{free}} / 总空间: {{total}}": "可用空間: {{free}} / 總空間: {{total}}", "可用端点类型": "可用端點類型", "可用邀请额度": "可用邀請額度", + "可留空;留空时会尝试使用 Issuer URL + /.well-known/openid-configuration": "可留空;留空時會嘗試使用 Issuer URL + /.well-known/openid-configuration", "可视化": "視覺化", "可视化倍率设置": "視覺化倍率設定", "可视化编辑": "視覺化編輯", "可选,公告的补充说明": "可選,公告的補充說明", "可选,用于复现结果": "可選,用於復現結果", + "可选:基于用户信息 JSON 做组合条件准入,条件不满足时返回自定义提示": "可選:基於使用者資訊 JSON 做組合條件准入,條件不滿足時返回自定義提示", + "可选:用于自动生成端点或 Discovery URL": "可選:用於自動生成端點或 Discovery URL", + "可选。匹配入口请求的 User-Agent;任意一行作为子串匹配(忽略大小写)即命中。": "可選。匹配入口請求的 User-Agent;任意一行作為子串匹配(忽略大小寫)即命中。", + "可选。对提取到的亲和 Key 做正则校验;不填表示不校验。": "可選。對提取到的親和 Key 做正則校驗;不填表示不校驗。", + "可选。对请求路径进行匹配;不填表示匹配所有路径。": "可選。對請求路徑進行匹配;不填表示匹配所有路徑。", "可选值": "可選值", "同时重置消息": "同時重置消息", "同步": "同步", @@ -658,19 +848,23 @@ "名称匹配类型": "名稱匹配類型", "后端请求失败": "後端請求失敗", "后缀": "後綴", + "后缀名称匹配": "字尾名稱匹配", "否": "否", "启动": "啟動", "启动参数 (Args)": "啟動參數 (Args)", "启动命令": "啟動命令", "启动命令 (Entrypoint)": "啟動命令 (Entrypoint)", + "启动授权失败": "啟動授權失敗", "启动时间": "啟動時間", "启动部署失败": "啟動部署失敗", "启动配置": "啟動設定", "启用": "啟用", + "启用 Creem 支付": "啟用 Creem 支付", "启用 io.net 部署": "啟用 io.net 部署", "启用 io.net 部署开关": "啟用 io.net 部署開關", "启用 io.net 部署时必须填写 API Key": "啟用 io.net 部署時必須填寫 API Key", "启用 Prompt 检查": "啟用 Prompt 檢查", + "启用 Stripe 支付": "啟用 Stripe 支付", "启用2FA失败": "啟用2FA失敗", "启用Claude思考适配(-thinking后缀)": "啟用Claude思考相容(-thinking後綴)", "启用FunctionCall思维签名填充": "啟用FunctionCall思維簽名填充", @@ -678,36 +872,54 @@ "启用Ping间隔": "啟用Ping間隔", "启用SMTP SSL": "啟用SMTP SSL", "启用SSRF防护(推荐开启以保护服务器安全)": "啟用SSRF防護(推薦開啟以保護伺服器安全)", + "启用供应商": "啟用供應商", "启用全部": "啟用全部", "启用后可接入 io.net GPU 资源": "啟用後可接入 io.net GPU 資源", "启用后可添加图片URL进行多模态对话": "啟用後可添加圖片URL進行多模態對話", + "启用后套餐将在用户端展示。是否继续?": "啟用後訂閱將在使用者端展示。是否繼續?", + "启用后将优先复用上一次成功的渠道(粘滞选路)。": "啟用後將優先複用上一次成功的渠道(粘滯選路)。", "启用后将使用 Creem Test Mode": "啟用後將使用 Creem Test Mode", "启用密钥失败": "啟用密鑰失敗", "启用屏蔽词过滤功能": "啟用屏蔽詞過濾功能", + "启用性能监控": "啟用性能監控", + "启用性能监控后,当系统资源使用率超过设定阈值时,将拒绝新的 Relay 请求 (/v1, /v1beta 等),以保护系统稳定性。": "啟用性能監控後,當系統資源使用率超過設定閾值時,將拒絕新的 Relay 請求 (/v1, /v1beta 等),以保護系統穩定性。", "启用所有密钥失败": "啟用所有密鑰失敗", "启用数据看板(实验性)": "啟用數據看板(實驗性)", "启用此模式后,将使用您自定义的请求体发送API请求,模型配置面板的参数设置将被忽略。": "啟用此模式後,將使用您自訂的請求體發送API請求,模型設定面板的參數設定將被忽略。", + "启用状态": "啟用狀態", "启用用户模型请求速率限制(可能会影响高并发性能)": "啟用使用者模型請求速率限制(可能會影響高併發性能)", + "启用磁盘缓存": "啟用磁碟快取", + "启用磁盘缓存后,大请求体将临时存储到磁盘而非内存,可显著降低内存占用,适用于处理包含大量图片/文件的请求。建议在 SSD 环境下使用。": "啟用磁碟快取後,大請求體將臨時存儲到磁碟而非記憶體,可顯著降低記憶體佔用,適用於處理包含大量圖片/檔案的請求。建議在 SSD 環境下使用。", + "启用签到功能": "啟用簽到功能", "启用绘图功能": "啟用繪圖功能", "启用请求体透传功能": "啟用請求體透傳功能", "启用请求透传": "啟用請求透傳", + "启用违规扣费": "啟用違規扣費", "启用额度消费日志记录": "啟用額度消費日誌記錄", "启用验证": "啟用驗證", - "启用违规扣费": "啟用違規扣費", "周": "周", + "周前": "周前", + "周期": "週期", + "命中判定:usage 中存在 cached tokens(例如 cached_tokens/prompt_cache_hit_tokens)即视为命中。": "命中判定:usage 中存在 cached tokens(例如 cached_tokens/prompt_cache_hit_tokens)即視為命中。", + "命中率": "命中率", + "命名规则": "命名規則", "和": "和", "和Claude不同,默认情况下Gemini的思考模型会自动决定要不要思考,就算不开启适配模型也可以正常使用,如果您需要计费,推荐设置无后缀模型价格按思考价格设置。支持使用 gemini-2.5-pro-preview-06-05-thinking-128 格式来精确传递思考预算。": "和Claude不同,預設情況下Gemini的思考模型會自動決定要不要思考,就算不開啟相容模型也可以正常使用,如果您需要計費,推薦設定無後綴模型價格按思考價格設定。支援使用 gemini-2.5-pro-preview-06-05-thinking-128 格式來精確傳遞思考預算。", "响应": "響應", "响应时间": "響應時間", + "响应缺少凭据": "響應缺少憑據", + "响应缺少授权链接": "響應缺少授權連結", "商品价格 ID": "商品價格 ID", "回答内容": "回答內容", "回调 URL 填": "回調 URL 填", + "回调 URL 格式": "回調 URL 格式", "回调地址": "回調位址", "固定价格": "固定價格", "固定价格(每次)": "固定價格(每次)", "固定价格值": "固定價格值", "图像生成": "圖像生成", "图标": "圖示", + "图标使用 react-icons(Simple Icons)或 URL/emoji,例如:github、gitlab、si:google": "圖示使用 react-icons(Simple Icons)或 URL/emoji,例如:github、gitlab、si:google", "图标使用@lobehub/icons库,如:OpenAI、Claude.Color,支持链式参数:OpenAI.Avatar.type={'platform'}、OpenRouter.Avatar.shape={'square'},查询所有可用图标请 ": "圖示使用@lobehub/icons庫,如:OpenAI、Claude.Color,支援鏈式參數:OpenAI.Avatar.type={'platform'}、OpenRouter.Avatar.shape={'square'},查詢所有可用圖示請 ", "图混合": "圖混合", "图片功能在自定义请求体模式下不可用": "圖片功能在自訂請求體模式下不可用", @@ -724,6 +936,7 @@ "在Gotify服务器的应用管理中创建新应用": "在Gotify伺服器的應用管理中建立新應用", "在找兑换码?": "在找兌換碼?", "在新标签页中打开": "在新標籤頁中打開", + "在模型广场向用户展示的端点": "在模型廣場向使用者展示的端點", "在此输入 Logo 图片地址": "在此輸入 Logo 圖片位址", "在此输入新的公告内容,支持 Markdown & HTML 代码": "在此輸入新的公告內容,支援 Markdown & HTML 程式碼", "在此输入新的关于内容,支持 Markdown & HTML 代码。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为关于页面": "在此輸入新的關於內容,支援 Markdown & HTML 程式碼。如果輸入的是一個連結,則會使用該連結作為 iframe 的 src 屬性,這允許你設定任意網頁作為關於頁面", @@ -736,14 +949,24 @@ "域名白名单": "域名白名單", "域名黑名单": "域名黑名單", "基本信息": "基本資訊", + "填充 Codex / Claude Code 模版": "填充 Codex / Claude Code 模版", + "填充模板:等级+激活": "填充模板:等級+啟用", + "填充模板:等级提示": "填充模板:等級提示", + "填充模板:组织或角色": "填充模板:組織或角色", + "填充模板:组织提示": "填充模板:組織提示", + "填充模板(全渠道)": "填充模板(全管道)", + "填充模板(指定渠道)": "填充模板(指定管道)", "填入": "填入", "填入所有模型": "填入所有模型", "填入模板": "填入模板", - "填入透传模版": "填入透傳模版", - "填入透传完整模版": "填入透傳完整模版", "填入相关模型": "填入相關模型", + "填入透传完整模版": "填入透傳完整模版", + "填入透传模版": "填入透傳模版", + "填写 Issuer URL 后自动生成:": "填寫 Issuer URL 後自動生成:", "填写Gotify服务器的完整URL地址": "填寫Gotify伺服器的完整URL位址", + "填写后会自动拼接预设端点": "填寫後會自動拼接預設端點", "填写带https的域名,逗号分隔": "填寫帶https的域名,逗號分隔", + "填写服务器地址后自动生成:": "填寫伺服器位址後自動生成:", "填写用户协议内容后,用户注册时将被要求勾选已阅读用户协议": "填寫使用者協議內容後,使用者註冊時將被要求勾選已閱讀使用者協議", "填写隐私政策内容后,用户注册时将被要求勾选已阅读隐私政策": "填寫隱私政策內容後,使用者註冊時將被要求勾選已閱讀隱私政策", "处理中": "處理中", @@ -751,12 +974,15 @@ "备份状态": "備份狀態", "备注": "備註", "备用恢复代码": "備用恢復程式碼", + "备用码": "備用碼", "备用码已复制到剪贴板": "備用碼已複製到剪貼板", + "备用码必须是8位": "備用碼必須是8位", "备用码重新生成成功": "備用碼重新生成成功", "复制": "複製", "复制代码": "複製程式碼", "复制令牌": "複製令牌", "复制全部": "複製全部", + "复制功能需要 HTTPS 环境,请手动复制": "複製功能需要 HTTPS 環境,請手動複製", "复制名称": "複製名稱", "复制失败": "複製失敗", "复制失败,请手动复制": "複製失敗,請手動複製", @@ -768,6 +994,7 @@ "复制所有模型": "複製所有模型", "复制所选令牌": "複製所選令牌", "复制所选兑换码到剪贴板": "複製所選兌換碼到剪貼板", + "复制授权链接": "複製授權連結", "复制日志": "複製日誌", "复制渠道的所有信息": "複製管道的所有資訊", "复制版本号": "複製版本號", @@ -783,18 +1010,28 @@ "天前": "天前", "失败": "失敗", "失败原因": "失敗原因", + "失败后不重试": "失敗後不重試", "失败时自动禁用通道": "失敗時自動禁用通道", "失败重试次数": "失敗重試次數", "奖励说明": "獎勵說明", + "套餐": "訂閱", + "套餐副标题": "訂閱副標題", + "套餐名称": "訂閱名稱", + "套餐标题": "訂閱標題", + "套餐标题不能为空": "套餐標題不能為空", + "套餐的基本信息和定价": "訂閱的基本資訊和定價", "如:大带宽批量分析图片推荐": "如:大頻寬批量分析圖片推薦", "如:香港线路": "如:香港線路", + "如果亲和到的渠道失败,重试到其他渠道成功后,将亲和更新到成功的渠道。": "如果親和到的渠道失敗,重試到其他渠道成功後,將親和更新到成功的渠道。", "如果你对接的是上游One API或者New API等转发项目,请使用OpenAI类型,不要使用此类型,除非你知道你在做什么。": "如果你對接的是上游One API或者New API等轉發項目,請使用OpenAI類型,不要使用此類型,除非你知道你在做什麼。", "如果用户请求中包含系统提示词,则使用此设置拼接到用户的系统提示词前面": "如果使用者請求中包含系統提示詞,則使用此設定拼接到使用者的系統提示詞前面", "如果镜像为私有,请填写密码或Token": "如果鏡像為私有,請填寫密碼或Token", "如果镜像为私有,请填写用户名": "如果鏡像為私有,請填寫使用者名", "始终使用浅色主题": "始終使用淺色主題", "始终使用深色主题": "始終使用深色主題", + "字段映射": "欄位對映", "字段透传控制": "字段透傳控制", + "字节火山方舟、豆包通用": "位元組火山方舟、豆包通用", "存在惩罚,鼓励讨论新话题": "存在懲罰,鼓勵討論新話題", "存在重复的键名:": "存在重複的鍵名:", "安全提醒": "安全提醒", @@ -810,8 +1047,8 @@ "完整的 Base URL,支持变量{model}": "完整的 Base URL,支援變數{model}", "官方": "官方", "官方文档": "官方文件", - "官方说明": "官方說明", "官方模型同步": "官方模型同步", + "官方说明": "官方說明", "定价模式": "定價模式", "定时测试所有通道": "定時測試所有通道", "定期更改密码可以提高账户安全性": "定期更改密碼可以提高帳號安全性", @@ -848,8 +1085,11 @@ "密码重置": "密碼重置", "密码重置完成": "密碼重置完成", "密码重置确认": "密碼重置確認", + "密码长度不得小于 8 位!": "密碼長度不得小於 8 位!", "密码长度至少为8个字符": "密碼長度至少為8個字符", "密钥": "密鑰", + "密钥 JSON 必须包含 access_token": "金鑰 JSON 必須包含 access_token", + "密钥 JSON 必须包含 account_id": "金鑰 JSON 必須包含 account_id", "密钥(编辑模式下,保存的密钥不会显示)": "密鑰(編輯模式下,儲存的密鑰不會顯示)", "密钥去重": "密鑰去重", "密钥将以Bearer方式添加到请求头中,用于验证webhook请求的合法性": "密鑰將以Bearer方式添加到請求頭中,用於驗證webhook請求的合法性", @@ -857,6 +1097,8 @@ "密钥已启用": "密鑰已啟用", "密钥已复制到剪贴板": "密鑰已複製到剪貼板", "密钥已禁用": "密鑰已禁用", + "密钥必须是 JSON 对象": "金鑰必須是 JSON 物件", + "密钥必须是合法的 JSON 格式!": "金鑰必須是合法的 JSON 格式!", "密钥文件 (.json)": "密鑰檔案 (.json)", "密钥更新模式": "密鑰更新模式", "密钥格式": "密鑰格式", @@ -883,9 +1125,13 @@ "将仅保留第一个密钥文件,其余文件将被移除,是否继续?": "將僅保留第一個密鑰檔案,其餘檔案將被移除,是否繼續?", "将删除": "將刪除", "将删除已使用、已禁用及过期的兑换码,此操作不可撤销。": "將刪除已使用、已禁用及過期的兌換碼,此操作不可撤銷。", + "将删除所有仍在内存中的渠道亲和性缓存条目。": "將刪除所有仍在記憶體中的渠道親和性快取條目。", + "将大请求体临时存储到磁盘": "將大請求體臨時存儲到磁碟", "将清除所有保存的配置并恢复默认设置,此操作不可撤销。是否继续?": "將清除所有儲存的設定並恢復預設設定,此操作不可撤銷。是否繼續?", "将清除选定时间之前的所有日志": "將清除選定時間之前的所有日誌", + "将追加 2 条规则到现有规则列表。": "將追加 2 條規則到現有規則列表。", "小时": "小時", + "小时前": "小時前", "小时费率": "小時費率", "尚未使用": "尚未使用", "局部重绘-提交": "局部重繪-提交", @@ -894,30 +1140,44 @@ "展开": "展開", "展开更多": "展開更多", "展示价格": "展示價格", + "嵌入模型:MokaAI M3E": "嵌入模型:MokaAI M3E", "左侧边栏个人设置": "左側邊欄個人設定", "已为 {{count}} 个模型设置{{type}}_other": "已為 {{count}} 個模型設定{{type}}", "已为 ${count} 个渠道设置标签!": "已為 ${count} 個管道設定標籤!", + "已从 Discovery 自动填充配置": "已從 Discovery 自動填充配置", + "已从 Discovery 获取配置,可继续手动修改所有字段。": "已從 Discovery 獲取配置,可繼續手動修改所有欄位。", + "已作废": "已作廢", + "已使用": "已使用", + "已使用:": "已使用:", + "已保存偏好为": "已儲存偏好為", "已修复 ${success} 个通道,失败 ${fails} 个通道。": "已修復 ${success} 個通道,失敗 ${fails} 個通道。", "已停止": "已停止", "已停止批量测试": "已停止批量測試", "已关闭后续提醒": "已關閉後續提醒", + "已分配内存": "已分配記憶體", "已切换为Assistant角色": "已切換為Assistant角色", "已切换为System角色": "已切換為System角色", "已切换至最优倍率视图,每个模型使用其最低倍率分组": "已切換至最優倍率視圖,每個模型使用其最低倍率分組", "已初始化": "已初始化", + "已删除": "已刪除", "已删除 {{count}} 个令牌!": "已刪除 {{count}} 個令牌!", "已删除 {{count}} 个令牌!_other": "已刪除 {{count}} 個令牌!", "已删除 {{count}} 条失效兑换码_other": "已刪除 {{count}} 條失效兌換碼", "已删除 ${data} 个通道!": "已刪除 ${data} 個通道!", "已删除所有禁用渠道,共计 ${data} 个": "已刪除所有禁用管道,共計 ${data} 個", "已删除消息及其回复": "已刪除消息及其回覆", + "已发起支付": "已發起支付", "已发送到 Fluent": "已發送到 Fluent", "已取消 Passkey 注册": "已取消 Passkey 註冊", + "已取消 Passkey 登录": "已取消 Passkey 登入", "已同步到渠道": "已同步到管道", "已启用": "已啟用", "已启用 Passkey,无需密码即可登录": "已啟用 Passkey,無需密碼即可登錄", "已启用所有密钥": "已啟用所有密鑰", "已在自定义模式中忽略": "已在自訂模式中忽略", + "已填充提示模板": "已填充提示模板", + "已填充模版": "已填充模版", + "已填充策略模板": "已填充策略模板", "已备份": "已備份", "已复制": "已複製", "已复制 ${count} 个模型": "已複製 ${count} 個模型", @@ -934,6 +1194,8 @@ "已完成": "已完成", "已开启全局请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "已開啟全域請求透傳:參數覆寫、模型重定向、管道相容等 NewAPI 內置功能將失效,非最佳實踐;如因此產生問題,請勿提交 issue 回饋。", "已成功开始测试所有已启用通道,请刷新页面查看结果。": "已成功開始測試所有已啟用通道,請刷新頁面查看結果。", + "已打开授权页面": "已開啟授權頁面", + "已打开支付页面": "已打開支付頁面", "已提交": "已提交", "已支付金额": "已支付金額", "已新增 {{count}} 个模型:{{list}}_other": "已新增 {{count}} 個模型:{{list}}", @@ -946,30 +1208,43 @@ "已注销": "已註銷", "已添加": "已添加", "已添加到白名单": "已添加到白名單", + "已清空": "已清空", "已清空测试结果": "已清空測試結果", + "已生成授权凭据": "已生成授權憑據", "已用": "已用", "已用/剩余": "已用/剩餘", "已用额度": "已用額度", "已禁用": "已禁用", "已禁用所有密钥": "已禁用所有密鑰", + "已终止": "已終止", "已绑定": "已綁定", "已绑定渠道": "已綁定管道", "已结束": "已結束", "已耗尽": "已耗盡", "已解锁豆包自定义 API 地址编辑": "已解鎖豆包自訂 API 位址編輯", + "已达上限": "已達上限", + "已达到购买上限": "已達到購買上限", "已过期": "已過期", "已运行时间": "已運行時間", "已选择 {{count}} 个模型_other": "已選擇 {{count}} 個模型", "已选择 {{selected}} / {{total}}": "已選擇 {{selected}} / {{total}}", "已选择 ${count} 个渠道": "已選擇 ${count} 個管道", + "已部署": "已部署", "已重置为默认配置": "已重置為預設設定", "已销毁": "已銷燬", + "币种": "幣種", + "常用上下文 Key(用于 context_*)": "常用上下文 Key(用於 context_*)", "常见问答": "常見問答", + "常见问答已更新": "常見問答已更新", + "常见问答更新失败": "常見問答更新失敗", "常见问答管理,为用户提供常见问题的答案(最多50个,前端显示最新20条)": "常見問答管理,為使用者提供常見問題的答案(最多50個,前端顯示最新20條)", "平台": "平臺", "平均RPM": "平均RPM", "平均TPM": "平均TPM", "平移": "平移", + "年": "年", + "年前": "年前", + "应付金额": "應付金額", "应用同步": "應用同步", "应用更改": "應用更改", "应用覆盖": "應用覆蓋", @@ -987,18 +1262,25 @@ "开": "開", "开启之后会清除用户提示词中的": "開啟之後會清除使用者提示詞中的", "开启之后将上游地址替换为服务器地址": "開啟之後將上游位址替換為伺服器位址", + "开启后,using_group 会参与 cache key(不同分组隔离)。": "開啟後,using_group 會參與 cache key(不同分組隔離)。", "开启后,仅\"消费\"和\"错误\"日志将记录您的客户端IP地址": "開啟後,僅\"消費\"和\"錯誤\"日誌將記錄您的客戶端IP位址", "开启后,对免费模型(倍率为0,或者价格为0)的模型也会预消耗额度": "開啟後,對免費模型(倍率為0,或者價格為0)的模型也會預消耗額度", "开启后,将定期发送ping数据保持连接活跃": "開啟後,將定期發送ping數據保持連接活躍", "开启后,当前分组渠道失败时会按顺序尝试下一个分组的渠道": "開啟後,當前分組管道失敗時會按順序嘗試下一個分組的管道", "开启后,所有请求将直接透传给上游,不会进行任何处理(重定向和渠道适配也将失效),请谨慎开启": "開啟後,所有請求將直接透傳給上游,不會進行任何處理(重定向和管道相容也將失效),請謹慎開啟", + "开启后,若该规则命中且请求失败,将不会切换渠道重试。": "開啟後,若該規則命中且請求失敗,將不會切換渠道重試。", + "开启后,规则名称会参与 cache key(不同规则隔离)。": "開啟後,規則名稱會參與 cache key(不同規則隔離)。", + "开启后,该渠道请求 Claude 时将强制追加 ?beta=true(无需客户端手动传参)": "開啟後,該渠道請求 Claude 時將強制追加 ?beta=true(無需客戶端手動傳參)", "开启后,违规请求将额外扣费。": "開啟後,違規請求將額外扣費。", "开启后不限制:必须设置模型倍率": "開啟後不限制:必須設定模型倍率", "开启后未登录用户无法访问模型广场": "開啟後未登錄使用者無法訪問模型廣場", "开启批量操作": "開啟批量操作", + "开始": "開始", "开始同步": "開始同步", "开始批量测试 ${count} 个模型,已清空上次结果...": "開始批量測試 ${count} 個模型,已清空上次結果...", "开始时间": "開始時間", + "异常": "異常", + "异步任务退款": "非同步任務退款", "张图片": "張圖片", "弱变换": "弱變換", "强制将响应格式化为 OpenAI 标准格式(只适用于OpenAI渠道类型)": "強制將響應格式化為 OpenAI 標準格式(只適用於OpenAI管道類型)", @@ -1008,6 +1290,7 @@ "当上游通道返回错误中包含这些关键词时(不区分大小写),自动禁用通道": "當上遊通道返回錯誤中包含這些關鍵詞時(不區分大小寫),自動禁用通道", "当前 API 密钥已过期,请在设置中更新。": "當前 API 密鑰已過期,請在設定中更新。", "当前 Ollama 版本为 ${version}": "當前 Ollama 版本為 ${version}", + "当前仅 OpenAI / Claude 语义支持缓存 token 统计,其他通道将隐藏 token 相关字段。": "當前僅 OpenAI / Claude 語義支援快取 token 統計,其他通道將隱藏 token 相關欄位。", "当前余额": "當前餘額", "当前值": "當前值", "当前分组为 auto,会自动选择最优分组,当一个组不可用时自动降级到下一个组(熔断机制)": "當前分組為 auto,會自動選擇最優分組,當一個組不可用時自動降級到下一個組(熔斷機制)", @@ -1016,23 +1299,30 @@ "当前未开启Midjourney回调,部分项目可能无法获得绘图结果,可在运营设置中开启。": "當前未開啟Midjourney回調,部分項目可能無法獲得繪圖結果,可在運營設定中開啟。", "当前查看的分组为:{{group}},倍率为:{{ratio}}": "當前查看的分組為:{{group}},倍率為:{{ratio}}", "当前模型列表为该标签下所有渠道模型列表最长的一个,并非所有渠道的并集,请注意可能导致某些渠道模型丢失。": "當前模型列表為該標籤下所有管道模型列表最長的一個,並非所有管道的並集,請注意可能導致某些管道模型丟失。", + "当前没有可用的启用令牌,请确认是否有令牌处于启用状态!": "當前沒有可用的啟用令牌,請確認是否有令牌處於啟用狀態!", + "当前浏览器不支持 Passkey": "當前瀏覽器不支援 Passkey", "当前版本": "當前版本", "当前状态": "當前狀態", + "当前环境无法使用 Passkey 登录": "當前環境無法使用 Passkey 登入", + "当前缓存大小": "當前快取大小", "当前计费": "當前計費", "当前设备不支持 Passkey": "當前設備不支援 Passkey", "当前设置类型: ": "當前設定類型: ", "当前跟随系统": "當前跟隨系統", "当前配置无法连接到 io.net。": "當前設定無法連接到 io.net。", - "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知": "當錢包或訂閱剩餘額度低於此數值時,系統將透過選擇的方式發送通知", "当模型没有设置价格时仍接受调用,仅当您信任该网站时使用,可能会产生高额费用": "當模型沒有設定價格時仍接受調用,僅當您信任該網站時使用,可能會產生高額費用", "当运行通道全部测试时,超过此时间将自动禁用通道": "當運行通道全部測試時,超過此時間將自動禁用通道", + "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知": "當錢包或訂閱剩餘額度低於此數值時,系統將透過選擇的方式發送通知", "待使用收益": "待使用收益", "待部署": "待部署", "微信": "微信", + "微信二维码": "微信二維碼", "微信公众号二维码图片链接": "微信公眾號QR Code圖片連結", "微信扫码关注公众号,输入「验证码」获取验证码(三分钟内有效)": "微信掃碼關注公眾號,輸入「驗證碼」獲取驗證碼(三分鐘內有效)", "微信扫码登录": "微信掃碼登錄", "微信账户绑定成功!": "微信帳號綁定成功!", + "必填:请输入服务器地址以自动生成完整端点 URL": "必填:請輸入伺服器位址以自動生成完整端點 URL", + "必填。对请求的 model 名称进行匹配,任意一条匹配即命中该规则。": "必填。對請求的 model 名稱進行匹配,任意一條匹配即命中該規則。", "必须是有效的 JSON 字符串数组,例如:[\"g1\",\"g2\"]": "必須是有效的 JSON 字符串陣列,例如:[\"g1\",\"g2\"]", "忘记密码?": "忘記密碼?", "快速开始": "快速開始", @@ -1043,8 +1333,11 @@ "思考适配 BudgetTokens 百分比": "思考相容 BudgetTokens 百分比", "思考预算占比": "思考預算佔比", "性能指标": "性能指標", + "性能监控": "性能監控", + "性能设置": "效能設定", "总 GPU 小时": "總 GPU 小時", "总价:文字价格 {{textPrice}} + 音频价格 {{audioPrice}} = {{symbol}}{{total}}": "總價:文字價格 {{textPrice}} + 音訊價格 {{audioPrice}} = {{symbol}}{{total}}", + "总分配内存": "總分配記憶體", "总密钥数": "總密鑰數", "总收益": "總收益", "总计": "總計", @@ -1055,6 +1348,7 @@ "您正在使用 MySQL 数据库。MySQL 是一个可靠的关系型数据库管理系统,适合生产环境使用。": "您正在使用 MySQL 資料庫。MySQL 是一個可靠的關係型資料庫管理系統,適合生產環境使用。", "您正在使用 PostgreSQL 数据库。PostgreSQL 是一个功能强大的开源关系型数据库系统,提供了出色的可靠性和数据完整性,适合生产环境使用。": "您正在使用 PostgreSQL 資料庫。PostgreSQL 是一個功能強大的開源關係型資料庫系統,提供了出色的可靠性和數據完整性,適合生產環境使用。", "您正在使用 SQLite 数据库。如果您在容器环境中运行,请确保已正确设置数据库文件的持久化映射,否则容器重启后所有数据将丢失!": "您正在使用 SQLite 資料庫。如果您在容器環境中運行,請確保已正確設定資料庫檔案的持久化映射,否則容器重啟後所有數據將丟失!", + "您正在使用默认密码!": "您正在使用預設密碼!", "您正在删除自己的帐户,将清空所有数据且不可恢复": "您正在刪除自己的帳戶,將清空所有數據且不可恢復", "您的数据将安全地存储在本地计算机上。所有配置、用户信息和使用记录都会自动保存,关闭应用后不会丢失。": "您的數據將安全地存儲在本地計算機上。所有設定、使用者資訊和使用記錄都會自動儲存,關閉應用後不會丟失。", "您确定要取消密码登录功能吗?这可能会影响用户的登录方式。": "您確定要取消密碼登錄功能嗎?這可能會影響使用者的登錄方式。", @@ -1063,9 +1357,12 @@ "想起来了?": "想起來了?", "成功": "成功", "成功兑换额度:": "成功兌換額度:", + "成功后切换亲和": "成功後切換親和", "成功时自动启用通道": "成功時自動啟用通道", "我已了解禁用两步验证将永久删除所有相关设置和备用码,此操作不可撤销": "我已瞭解禁用兩步驗證將永久刪除所有相關設定和備用碼,此操作不可撤銷", "我已阅读并同意": "我已閱讀並同意", + "我的订阅": "我的訂閱", + "我确认开启高危重试": "我確認開啟高風險重試", "或": "或", "或其兼容new-api-worker格式的其他版本": "或其兼容new-api-worker格式的其他版本", "或手动输入密钥:": "或手動輸入密鑰:", @@ -1076,6 +1373,9 @@ "手动编辑": "手動編輯", "手动输入": "手動輸入", "打开侧边栏": "打開側邊欄", + "打开授权页面": "開啟授權頁面", + "扣费": "扣費", + "执行 GC": "執行 GC", "执行中": "執行中", "扫描二维码": "掃描QR Code", "批量创建": "批量建立", @@ -1102,6 +1402,8 @@ "拉取新模型": "拉取新模型", "拉取模型": "拉取模型", "拉取进度": "拉取進度", + "拒绝提示模板(可选)": "拒絕提示模板(可選)", + "拦截原因": "攔截原因", "按K显示单位": "按K顯示單位", "按价格设置": "按價格設定", "按倍率类型筛选": "按倍率類型篩選", @@ -1113,6 +1415,9 @@ "换脸": "換臉", "授权,需在遵守": "授權,需在遵守", "授权失败": "授權失敗", + "授权端点": "授權端點", + "授权范围 (Scopes)": "授權範圍 (Scopes)", + "排序": "排序", "排队中": "排隊中", "接受未设置价格模型": "接受未設定價格模型", "接口凭证": "接口憑證", @@ -1121,23 +1426,27 @@ "控制台区域": "控制檯區域", "控制输出的随机性和创造性": "控制輸出的隨機性和創造性", "控制顶栏模块显示状态,全局生效": "控制頂欄模組顯示狀態,全域生效", + "推荐": "推薦", "推荐:用户可以选择是否使用指纹等验证": "推薦:使用者可以選擇是否使用指紋等驗證", "推荐使用(用户可选)": "推薦使用(使用者可選)", "描述": "描述", "提交": "提交", "提交时间": "提交時間", "提交结果": "提交結果", + "提供商名称": "提供商名稱", "提升": "提升", "提示": "提示", "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}}", "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 補全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 缓存创建 {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 快取 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 快取建立 {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + 補全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "提示:": "提示:", "提示:如需备份数据,只需复制上述目录即可": "提示:如需備份數據,只需複製上述目錄即可", + "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。": "提示:此處設定僅用於控制「模型廣場」對使用者的展示效果,不會影響模型的實際調用與路由。若需設定真實調用行為,請前往「管道管理」進行設定。", + "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。": "提示:該功能為測試版,未來設定結構與功能行為可能發生變更,請勿在生產環境使用。", + "提示:语言偏好会同步到您登录的所有设备,并影响API返回的错误消息语言。": "提示:語言偏好會同步到您登錄的所有設備,並影響API返回的錯誤消息語言。", "提示:链接中的{key}将被替换为API密钥,{address}将被替换为服务器地址": "提示:連結中的{key}將被替換為API密鑰,{address}將被替換為伺服器位址", "提示价格:{{symbol}}{{price}} / 1M tokens": "提示價格:{{symbol}}{{price}} / 1M tokens", "提示缓存倍率": "提示快取倍率", - "缓存创建倍率": "快取建立倍率", - "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)": "預設為 5m 快取建立倍率;1h 快取建立倍率按固定乘法自動計算(當前為 1.6x)", "搜索供应商": "搜尋供應商", "搜索关键字": "搜尋關鍵字", "搜索失败": "搜尋失敗", @@ -1154,17 +1463,26 @@ "操作": "操作", "操作失败": "操作失敗", "操作失败,请重试": "操作失敗,請重試", + "操作失败: ": "操作失敗: ", "操作成功完成!": "操作成功完成!", "操作暂时被禁用": "操作暫時被禁用", + "操作确认": "操作確認", "操练场": "操練場", "操练场和聊天功能": "操練場和聊天功能", + "支付": "支付", "支付地址": "支付位址", + "支付失败": "支付失敗", "支付宝": "支付寶", "支付方式": "支付方式", + "支付渠道": "支付管道", "支付设置": "支付設定", "支付请求失败": "支付請求失敗", "支付金额": "支付金額", "支持 Ctrl+V 粘贴图片": "支援 Ctrl+V 貼上圖片", + "支持 JSONPath,如 email, data.user.email": "支援 JSONPath,如 email, data.user.email", + "支持 JSONPath,如 name, display_name, data.user.name": "支援 JSONPath,如 name, display_name, data.user.name", + "支持 JSONPath,如 preferred_username, login, data.user.username": "支援 JSONPath,如 preferred_username, login, data.user.username", + "支持 JSONPath,如 sub, id, data.user.id": "支援 JSONPath,如 sub, id, data.user.id", "支持6位TOTP验证码或8位备用码,可到`个人设置-安全设置-两步验证设置`配置或查看。": "支援6位TOTP驗證碼或8位備用碼,可到`個人設定-安全設定-兩步驗證設定`設定或查看。", "支持CIDR格式,如:8.8.8.8, 192.168.1.0/24": "支援CIDR格式,如:8.8.8.8, 192.168.1.0/24", "支持HTTP和HTTPS,填写Gotify服务器的完整URL地址": "支援HTTP和HTTPS,填寫Gotify伺服器的完整URL位址", @@ -1172,11 +1490,15 @@ "支持众多的大模型供应商": "支援眾多的大模型供應商", "支持单个端口和端口范围,如:80, 443, 8000-8999": "支援單個端口和端口範圍,如:80, 443, 8000-8999", "支持变量:": "支援變數:", + "支持周期性重置套餐权益额度": "支援週期性重置訂閱權益額度", + "支持填写单个状态码或范围(含首尾),使用逗号分隔": "支援填寫單個狀態碼或範圍(含首尾),使用逗號分隔", + "支持填写单个状态码或范围(含首尾),使用逗号分隔;504 和 524 始终不重试,不受此处配置影响": "支援填寫單個狀態碼或範圍(含首尾),使用逗號分隔;504 和 524 一律不重試,不受此處設定影響", "支持备份": "支援備份", "支持拉取 Ollama 官方模型库中的所有模型,拉取过程可能需要几分钟时间": "支援拉取 Ollama 官方模型庫中的所有模型,拉取過程可能需要幾分鐘時間", "支持搜索用户的 ID、用户名、显示名称和邮箱地址": "支援搜尋使用者的 ID、使用者名、顯示名稱和信箱位址", "支持的图像模型": "支援的圖像模型", "支持通配符格式,如:example.com, *.api.example.com": "支援通配符格式,如:example.com, *.api.example.com", + "支持逻辑 and/or 与嵌套 groups;操作符支持 eq/ne/gt/gte/lt/lte/in/not_in/contains/exists": "支援邏輯 and/or 與巢狀 groups;運算子支援 eq/ne/gt/gte/lt/lte/in/not_in/contains/exists", "收益": "收益", "收益统计": "收益統計", "收起": "收起", @@ -1207,10 +1529,16 @@ "文档": "文件", "文档地址": "文件位址", "文生视频": "文生影片", + "新增 Key 来源": "新增 Key 來源", "新增供应商": "新增供應商", + "新增失败": "新增失敗", + "新增成功": "新增成功", + "新增规则": "新增規則", + "新增订阅": "新增訂閱", "新密码": "新密碼", "新密码需要和原密码不一致!": "新密碼需要和原密碼不一致!", "新建": "新建", + "新建套餐": "新建訂閱", "新建容器": "新建容器", "新建容器部署": "新建容器部署", "新建数量": "新建數量", @@ -1230,13 +1558,17 @@ "无效的部署信息": "無效的部署資訊", "无效的重置链接,请重新发起密码重置请求": "無效的重置連結,請重新發起密碼重置請求", "无法发起 Passkey 注册": "無法發起 Passkey 註冊", + "无法发起 Passkey 登录": "無法發起 Passkey 登入", "无法复制到剪贴板,请手动复制": "無法複製到剪貼板,請手動複製", + "无法复制此类型的消息内容": "無法複製此型別的訊息內容", "无法添加图片": "無法添加圖片", "无法获取容器详情": "無法獲取容器詳情", "无法连接 io.net": "無法連接 io.net", + "无生效": "無生效", "无邀请人": "無邀請人", "无限制": "無限制", "无限额度": "無限額度", + "日": "日", "日志导出成功": "日誌導出成功", "日志已下载": "日誌已下載", "日志已加载": "日誌已載入", @@ -1249,10 +1581,12 @@ "旧格式(直接覆盖):": "舊格式(直接覆蓋):", "旧格式模板": "舊格式模板", "旧的备用码已失效,请保存新的备用码": "舊的備用碼已失效,請儲存新的備用碼", + "旧配置迁移完成": "舊配置遷移完成", "早上好": "早安", "时间": "時間", "时间信息": "時間資訊", "时间粒度": "時間粒度", + "易支付": "易支付", "易支付商户ID": "易支付商戶ID", "易支付商户密钥": "易支付商戶密鑰", "是": "是", @@ -1265,6 +1599,8 @@ "显示倍率": "顯示倍率", "显示最新20条": "顯示最新20條", "显示名称": "顯示名稱", + "显示名称字段": "顯示名稱字段", + "显示名称字段(可选)": "顯示名稱欄位(可選)", "显示完整内容": "顯示完整內容", "显示操作项": "顯示操作項", "显示更多": "顯示更多", @@ -1277,6 +1613,8 @@ "智能体ID": "智慧體ID", "智能熔断": "智慧熔斷", "智谱": "智譜", + "智谱 ChatGLM(已经弃用,请使用智谱 GLM-4V)": "智譜 ChatGLM(已經棄用,請使用智譜 GLM-4V)", + "智谱 GLM-4V": "智譜 GLM-4V", "暂无": "暫無", "暂无API信息": "暫無API資訊", "暂无SSE响应数据": "暫無SSE響應數據", @@ -1286,12 +1624,15 @@ "暂无公告": "暫無公告", "暂无匹配模型": "暫無匹配模型", "暂无可复制的版本信息": "暫無可複製的版本資訊", + "暂无可展示数据": "暫無可展示資料", "暂无可用的支付方式,请联系管理员配置": "暫無可用的支付方式,請聯繫管理員設定", + "暂无可购买套餐": "暫無可購買訂閱", "暂无响应数据": "暫無響應數據", "暂无容器信息": "暫無容器資訊", "暂无容器详情": "暫無容器詳情", "暂无密钥数据": "暫無密鑰數據", "暂无差异化倍率显示": "暫無差異化倍率顯示", + "暂无已绑定项": "暫無已繫結項", "暂无常见问答": "暫無常見問答", "暂无成功模型": "暫無成功模型", "暂无数据": "暫無數據", @@ -1306,6 +1647,9 @@ "暂无监控数据": "暫無監控數據", "暂无系统公告": "暫無系統公告", "暂无缺失模型": "暫無缺失模型", + "暂无自定义 OAuth 提供商": "暫無自訂 OAuth 提供商", + "暂无订阅套餐": "暫無訂閱", + "暂无订阅记录": "暫無訂閱記錄", "暂无请求数据": "暫無請求數據", "暂无项目": "暫無項目", "暂无预填组": "暫無預填組", @@ -1324,9 +1668,11 @@ "更新名称失败": "更新名稱失敗", "更新失败": "更新失敗", "更新失败,请检查输入信息": "更新失敗,請檢查輸入資訊", + "更新套餐信息": "更新訂閱資訊", "更新容器配置": "更新容器設定", "更新容器配置可能会导致容器重启,请确保在合适的时间进行此操作。": "更新容器設定可能會導致容器重啟,請確保在合適的時間進行此操作。", "更新成功": "更新成功", + "更新成功!": "更新成功!", "更新所有已启用通道余额": "更新所有已啟用通道餘額", "更新支付设置": "更新支付設定", "更新时间": "更新時間", @@ -1338,16 +1684,25 @@ "更新配置后,容器可能需要重启以应用新的设置。请确保您了解这些更改的影响。": "更新設定後,容器可能需要重啟以應用新的設定。請確保您瞭解這些更改的影響。", "更新配置失败": "更新設定失敗", "更新预填组": "更新預填組", + "月": "月", "有 Reasoning": "有 Reasoning", + "有异常": "有異常", + "有效期": "有效期", + "有效期单位": "有效期單位", + "有效期数值": "有效期數值", + "有效期设置": "有效期設定", "服务可用性": "服務可用性", "服务商": "服務商", "服务器地址": "伺服器位址", "服务显示名称": "服務顯示名稱", + "未使用": "未使用", + "未匹配到模型,按回车键可将「{{name}}」作为自定义模型名添加": "未匹配到模型,按下 Enter 鍵可將「{{name}}」作為自訂模型名稱新增", "未发现新增模型": "未發現新增模型", "未发现重复密钥": "未發現重複密鑰", "未启动": "未啟動", "未启用": "未啟用", "未命名": "未命名", + "未在 Discovery 响应中找到可用的 OAuth 端点": "未在 Discovery 響應中找到可用的 OAuth 端點", "未备份": "未備份", "未开始": "未開始", "未找到匹配的模型": "未找到匹配的模型", @@ -1374,9 +1729,13 @@ "未设置倍率模型": "未設定倍率模型", "未配置模型": "未設定模型", "未配置的模型列表": "未設定的模型列表", + "本周": "本週", "本地": "本地", "本地数据存储": "本地數據存儲", "本地计费": "本地計費", + "本月": "本月", + "本月获得": "本月獲得", + "本站仅作演示之用,无服务端!": "本站僅作演示之用,無服務端!", "本设备:手机指纹/面容,外接:USB安全密钥": "本設備:手機指紋/面容,外接:USB安全密鑰", "本设备内置": "本設備內置", "本项目根据": "本項目根據", @@ -1384,11 +1743,13 @@ "机密环境变量将被加密存储,适用于存储密码、API密钥等敏感信息。": "機密環境變數將被加密存儲,適用於存儲密碼、API密鑰等敏感資訊。", "机密环境变量说明": "機密環境變數說明", "权重": "權重", + "权重必须是非负整数!": "權重必須是非負整數!", "权限设置": "權限設定", "条": "條", "条 - 第": "條 - 第", "条,共": "條,共", "条日志已清理!": "條日誌已清理!", + "来源": "來源", "来源于 IO.NET 部署": "來源於 IO.NET 部署", "来自模型重定向,尚未加入模型列表": "來自模型重定向,尚未加入模型列表", "某些配置更改可能需要几分钟才能生效。": "某些設定更改可能需要幾分鐘才能生效。", @@ -1406,20 +1767,27 @@ "标签不能为空!": "標籤不能為空!", "标签信息": "標籤資訊", "标签名称": "標籤名稱", + "标签更新成功!": "標籤更新成功!", "标签的基本配置": "標籤的基本設定", "标签组": "標籤組", "标签聚合": "標籤聚合", "标签聚合模式": "標籤聚合模式", + "标识符 (Slug)": "標識符 (Slug)", "标识颜色": "標識顏色", "核采样,控制词汇选择的多样性": "核採樣,控制詞彙選擇的多樣性", + "根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。": "根據 Anthropic 協定,/v1/messages 的輸入 tokens 僅統計非快取輸入,不包含快取讀取與快取寫入 tokens。", "根据模型名称和匹配规则查找模型元数据,优先级:精确 > 前缀 > 后缀 > 包含": "根據模型名稱和匹配規則查找模型元數據,優先級:精確 > 前綴 > 後綴 > 包含", "格式化": "格式化", + "格式化 JSON": "格式化 JSON", "格式正确": "格式正確", "格式示例:": "格式示例:", "格式错误": "格式錯誤", "检查更新": "檢查更新", + "检查更新失败,请稍后再试": "檢查更新失敗,請稍後再試", "检测到 FluentRead(流畅阅读)": "檢測到 FluentRead(流暢閱讀)", + "检测到以下高危状态码重定向规则": "檢測到以下高風險狀態碼重定向規則", "检测到多个密钥,您可以单独复制每个密钥,或点击复制全部获取完整内容。": "檢測到多個密鑰,您可以單獨複製每個密鑰,或點擊複製全部獲取完整內容。", + "检测到旧版本的配置数据,是否要迁移到新的配置格式?": "檢測到舊版本的配置資料,是否要遷移到新的配置格式?", "检测到该消息后有AI回复,是否删除后续回复并重新生成?": "檢測到該消息後有AI回覆,是否刪除後續回覆並重新生成?", "检测必须等待绘图成功才能进行放大等操作": "檢測必須等待繪圖成功才能進行放大等操作", "模型": "模型", @@ -1428,6 +1796,7 @@ "模型价格": "模型價格", "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}": "模型價格 {{symbol}}{{price}},{{ratioType}} {{ratio}}", "模型价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "模型價格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}", + "模型价格不能为0": "模型價格不能為0", "模型倍率": "模型倍率", "模型倍率 {{modelRatio}}": "模型倍率 {{modelRatio}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}}": "模型倍率 {{modelRatio}},快取倍率 {{cacheRatio}},輸出倍率 {{completionRatio}},{{ratioType}} {{ratio}}", @@ -1458,6 +1827,9 @@ "模型映射必须是合法的 JSON 格式!": "模型映射必須是合法的 JSON 格式!", "模型更新成功!": "模型更新成功!", "模型未加入列表,可能无法调用": "模型未加入列表,可能無法調用", + "模型正则": "模型正則", + "模型正则(每行一个)": "模型正則(每行一個)", + "模型正则不能为空": "模型正則不能為空", "模型消耗分布": "模型消耗分佈", "模型消耗趋势": "模型消耗趨勢", "模型版本": "模型版本", @@ -1485,6 +1857,7 @@ "欢迎使用,请完成以下设置以开始使用系统": "歡迎使用,請完成以下設定以開始使用系統", "欧元": "歐元", "正在加载可用部署位置...": "正在載入可用部署位置...", + "正在加载签到状态...": "正在載入簽到狀態...", "正在处理大内容...": "正在處理大內容...", "正在提交": "正在提交", "正在构造请求体预览...": "正在構造請求體預覽...", @@ -1493,6 +1866,7 @@ "正在跟随最新日志": "正在跟隨最新日誌", "正在跳转 GitHub...": "正在跳轉 GitHub...", "正在跳转...": "正在跳轉...", + "正常": "正常", "此代理仅用于图片请求转发,Webhook通知发送等,AI API请求仍然由服务器直接发出,可在渠道设置中单独配置代理": "此代理僅用於圖片請求轉發,Webhook通知發送等,AI API請求仍然由伺服器直接發出,可在管道設定中單獨設定代理", "此修改将不可逆": "此修改將不可逆", "此操作不可恢复,请仔细确认时间后再操作!": "此操作不可恢復,請仔細確認時間後再操作!", @@ -1507,6 +1881,7 @@ "此操作将解绑用户当前的 Passkey,下次登录需要重新注册。": "此操作將解綁使用者當前的 Passkey,下次登錄需要重新註冊。", "此操作将降低用户的权限级别": "此操作將降低使用者的權限級別", "此支付方式最低充值金额为": "此支付方式最低儲值金額為", + "此消息没有可复制的文本内容": "此訊息沒有可複製的文字內容", "此渠道由 IO.NET 自动同步,类型、密钥和 API 地址已锁定。": "此管道由 IO.NET 自動同步,類型、密鑰和 API 位址已鎖定。", "此设置用于系统内部计算,默认值500000是为了精确到6位小数点设计,不推荐修改。": "此設定用於系統內部計算,預設值500000是為了精確到6位小數點設計,不推薦修改。", "此页面仅显示未设置价格或倍率的模型,设置后将自动从列表中移除": "此頁面僅顯示未設定價格或倍率的模型,設定後將自動從列表中移除", @@ -1517,11 +1892,20 @@ "此项可选,用于覆盖请求参数。不支持覆盖 stream 参数": "此項可選,用於覆蓋請求參數。不支援覆蓋 stream 參數", "此项可选,用于覆盖请求头参数": "此項可選,用於覆蓋請求頭參數", "此项可选,用于通过自定义API地址来进行 API 调用,末尾不要带/v1和/": "此項可選,用於透過自訂API位址來進行 API 調用,末尾不要帶/v1和/", + "每个用户最多可创建的令牌数量,默认 1000,设置过大可能会影响性能": "每個使用者最多可建立的令牌數量,預設 1000,設定過大可能會影響效能", + "每周": "每週", + "每周窗口": "每週視窗", + "每天": "每天", "每容器GPU数": "每容器GPU數", + "每日仅可签到一次,请勿重复签到": "每日僅可簽到一次,請勿重複簽到", + "每日签到": "每日簽到", + "每日签到可获得随机额度奖励": "每日簽到可獲得隨機額度獎勵", + "每月": "每月", "每隔多少分钟测试一次所有通道": "每隔多少分鐘測試一次所有通道", "永不过期": "永不過期", "永久删除您的两步验证设置": "永久刪除您的兩步驗證設定", "永久删除所有备用码(包括未使用的)": "永久刪除所有備用碼(包括未使用的)", + "没有任何修改!": "沒有任何修改!", "没有匹配的日志条目": "沒有匹配的日誌條目", "没有可用令牌用于填充": "沒有可用令牌用於填充", "没有可用模型": "沒有可用模型", @@ -1532,15 +1916,20 @@ "注 册": "注 冊", "注册": "註冊", "注册 Passkey": "註冊 Passkey", + "注册失败,请重试": "註冊失敗,請重試", + "注册成功!": "註冊成功!", "注意": "注意", + "注意:": "注意:", "注意:JSON中重复的键只会保留最后一个同名键的值": "注意:JSON中重複的鍵只會保留最後一個同名鍵的值", "注意非Chat API,请务必填写正确的API地址,否则可能导致无法使用": "注意非Chat API,請務必填寫正確的API位址,否則可能導致無法使用", "注销": "註銷", "注销成功!": "註銷成功!", + "活跃文件": "活躍檔案", + "活跃缓存数": "活躍快取數", "流": "流", + "流式": "流式", "流式响应完成": "流式響應完成", "流式输出": "流式輸出", - "流式": "流式", "流量端口": "流量端口", "浅色": "淺色", "浅色模式": "淺色模式", @@ -1551,12 +1940,13 @@ "测试单个渠道操作项目组": "測試單個管道操作項目組", "测试失败": "測試失敗", "测试失败:": "測試失敗:", + "测试所有未手动禁用渠道": "測試所有未手動停用通道", "测试所有渠道的最长响应时间": "測試所有管道的最長響應時間", "测试所有通道": "測試所有通道", - "测试所有未手动禁用渠道": "測試所有未手動停用通道", "测试模式": "測試模式", "测试连接": "測試連接", "测速": "測速", + "浏览器不支持复制功能,请手动复制": "瀏覽器不支援複製功能,請手動複製", "消息优先级": "消息優先級", "消息优先级,范围0-10,默认为5": "消息優先級,範圍0-10,預設為5", "消息已删除": "消息已刪除", @@ -1570,6 +1960,7 @@ "深色": "深色", "深色模式": "深色模式", "添加": "添加", + "添加 OAuth 提供商": "新增 OAuth 提供商", "添加API": "添加API", "添加产品": "添加產品", "添加令牌": "添加令牌", @@ -1581,6 +1972,7 @@ "添加启动命令": "添加啟動命令", "添加密钥环境变量": "添加密鑰環境變數", "添加成功": "添加成功", + "添加提供商": "添加提供商", "添加模型": "添加模型", "添加模型区域": "添加模型區域", "添加渠道": "添加管道", @@ -1590,14 +1982,22 @@ "添加键值对": "添加鍵值對", "添加问答": "添加問答", "添加额度": "添加額度", + "清理不活跃缓存": "清理不活躍快取", + "清理失败": "清理失敗", "清空": "清空", + "清空全部缓存": "清空全部快取", + "清空该规则缓存": "清空該規則快取", "清空重定向": "清空重定向", "清除历史日志": "清除歷史日誌", "清除失效兑换码": "清除失效兌換碼", "清除所有模型": "清除所有模型", "渠道": "管道", "渠道 ID": "管道 ID", + "渠道:": "渠道:", "渠道ID,名称,密钥,API地址": "管道ID,名稱,密鑰,API位址", + "渠道亲和性": "渠道親和性", + "渠道亲和性:上游缓存命中": "渠道親和性:上游快取命中", + "渠道亲和性会基于从请求上下文或 JSON Body 提取的 Key,优先复用上一次成功的渠道。": "渠道親和性會基於從請求上下文或 JSON Body 提取的 Key,優先複用上一次成功的渠道。", "渠道优先级": "管道優先級", "渠道信息": "管道資訊", "渠道创建成功!": "管道建立成功!", @@ -1629,8 +2029,6 @@ "点击此处": "點擊此處", "点击预览视频": "點擊預覽影片", "点击预览音乐": "點擊預覽音樂", - "音乐预览": "音樂預覽", - "音频无法播放": "音訊無法播放", "点击验证按钮,使用您的生物特征或安全密钥": "點擊驗證按鈕,使用您的生物特徵或安全密鑰", "版权所有": "版權所有", "状态": "狀態", @@ -1640,12 +2038,15 @@ "状态页面Slug": "狀態頁面Slug", "环境变量": "環境變數", "生成令牌": "生成令牌", + "生成并填入": "生成並填入", "生成数量": "生成數量", "生成数量必须大于0": "生成數量必須大於0", "生成新的备用码": "生成新的備用碼", "生成歌词": "生成歌詞", "生成音乐": "生成音樂", + "生效": "生效", "用于API调用的身份验证令牌,请妥善保管": "用於API調用的身份驗證令牌,請妥善保管", + "用于唯一标识用户的字段路径": "用於唯一標識使用者的欄位路徑", "用于配置网络代理,支持 socks5 协议": "用於設定網路代理,支援 socks5 協議", "用于验证回调 new-api 的 webhook 请求的密钥,敏感信息不显示": "用於驗證回調 new-api 的 webhook 請求的密鑰,敏感資訊不顯示", "用以支持基于 WebAuthn 的无密码登录注册": "用以支援基於 WebAuthn 的無密碼登錄註冊", @@ -1659,11 +2060,16 @@ "用以支持通过微信进行登录注册": "用以支援透過微信進行登錄註冊", "用以防止恶意用户利用临时邮箱批量注册": "用以防止惡意使用者利用臨時信箱批量註冊", "用户": "使用者", + "用户 ID 字段": "使用者 ID 字段", + "用户 ID 字段(可选)": "使用者 ID 欄位(可選)", "用户个人功能": "使用者個人功能", "用户主页,展示系统信息": "使用者首頁,展示系統訊息", "用户优先:如果用户在请求中指定了系统提示词,将优先使用用户的设置": "使用者優先:如果使用者在請求中指定了系統提示詞,將優先使用使用者的設定", "用户信息": "使用者資訊", "用户信息更新成功!": "使用者資訊更新成功!", + "用户信息端点": "使用者資訊端點", + "用户信息缺失": "使用者資訊缺失", + "用户最大令牌数量": "使用者最大令牌數量", "用户分组": "使用者分組", "用户分组和额度管理": "使用者分組和額度管理", "用户分组配置": "使用者分組設定", @@ -1672,6 +2078,8 @@ "用户协议更新失败": "使用者協議更新失敗", "用户可选分组": "使用者可選分組", "用户名": "使用者名", + "用户名字段": "使用者名字段", + "用户名字段(可选)": "使用者名稱欄位(可選)", "用户名或邮箱": "使用者名或信箱", "用户名称": "使用者名稱", "用户控制面板,管理账户": "使用者控制面板,管理帳號", @@ -1682,25 +2090,39 @@ "用户的基本账户信息": "使用者的基本帳號資訊", "用户管理": "使用者管理", "用户组": "使用者組", + "用户订阅管理": "使用者訂閱管理", "用户账户创建成功!": "使用者帳號建立成功!", "用户账户管理": "使用者帳號管理", "用时/首字": "用時/首字", + "由全站货币展示设置统一控制": "由全站貨幣展示設定統一控制", + "由订阅抵扣": "由訂閱抵扣", + "界面语言和其他个人偏好": "界面語言和其他個人偏好", + "留空使用系统临时目录": "留空使用系統臨時目錄", "留空则使用账号绑定的邮箱": "留空則使用帳號綁定的信箱", "留空则使用默认端点;支持 {path, method}": "留空則使用預設端點;支援 {path, method}", + "留空则保持原有密钥": "留空則保持原有金鑰", "留空则默认使用服务器地址,注意不能携带http://或者https://": "留空則預設使用伺服器位址,注意不能攜帶http://或者https://", "登 录": "登 錄", "登录": "登錄", + "登录失败,请重试": "登入失敗,請重試", + "登录成功": "登入成功", "登录成功!": "登錄成功!", "登录过期,请重新登录!": "登錄過期,請重新登錄!", "白名单": "白名單", + "百度文心千帆": "百度文心千帆", + "百度文心千帆V2": "百度文心千帆V2", "的前提下使用。": "的前提下使用。", "监控设置": "監控設定", + "目录总大小": "目錄總大小", + "目录文件数": "目錄檔案數", "目标用户:{{username}}": "目標使用者:{{username}}", "直接提交": "直接提交", "相关项目": "相關項目", "相当于删除用户,此修改将不可逆": "相當於刪除使用者,此修改將不可逆", "矛盾": "矛盾", "知识库 ID": "知識庫 ID", + "知识库:AI Proxy": "知識庫:AI Proxy", + "知识库:FastGPT": "知識庫:FastGPT", "硬件": "硬體", "硬件与性能": "硬體與性能", "硬件类型": "硬體類型", @@ -1726,44 +2148,63 @@ "确定要删除所有已自动禁用的密钥吗?": "確定要刪除所有已自動禁用的密鑰嗎?", "确定要删除所选的 {{count}} 个令牌吗?_other": "確定要刪除所選的 {{count}} 個令牌嗎?", "确定要删除所选的 {{count}} 个模型吗?_other": "確定要刪除所選的 {{count}} 個模型嗎?", + "确定要删除此 OAuth 提供商吗?": "確定要刪除此 OAuth 提供商嗎?", "确定要删除此API信息吗?": "確定要刪除此API資訊嗎?", "确定要删除此公告吗?": "確定要刪除此公告嗎?", "确定要删除此分类吗?": "確定要刪除此分類嗎?", "确定要删除此密钥吗?": "確定要刪除此密鑰嗎?", "确定要删除此问答吗?": "確定要刪除此問答嗎?", + "确定要删除该提供商吗?": "確定要刪除該提供商嗎?", "确定要删除这条消息吗?": "確定要刪除這條消息嗎?", "确定要删除选中的": "確定要刪除選中的", "确定要启用所有密钥吗?": "確定要啟用所有密鑰嗎?", "确定要启用此用户吗?": "確定要啟用此使用者嗎?", "确定要提升此用户吗?": "確定要提升此使用者嗎?", "确定要更新所有已启用通道余额吗?": "確定要更新所有已啟用通道餘額嗎?", - "确定要测试所有通道吗?": "確定要測試所有通道嗎?", "确定要测试所有未手动禁用渠道吗?": "確定要測試所有未手動停用通道嗎?", + "确定要测试所有通道吗?": "確定要測試所有通道嗎?", "确定要禁用所有的密钥吗?": "確定要禁用所有的密鑰嗎?", "确定要禁用此用户吗?": "確定要禁用此使用者嗎?", + "确定要解绑 {{name}} 吗?": "確定要解綁 {{name}} 嗎?", "确定要降级此用户吗?": "確定要降級此使用者嗎?", "确定重置": "確定重置", "确定重置模型倍率吗?": "確定重置模型倍率嗎?", "确认": "確認", + "确认作废": "確認作廢", + "确认关闭提示": "確認關閉提示", "确认冲突项修改": "確認衝突項修改", "确认删除": "確認刪除", "确认删除模型": "確認刪除模型", "确认取消密码登录": "確認取消密碼登錄", + "确认启用": "確認啟用", "确认密码": "確認密碼", "确认导入配置": "確認導入設定", "确认延长": "確認延長", "确认延长容器时长": "確認延長容器時長", "确认操作": "確認操作", "确认新密码": "確認新密碼", + "确认清理不活跃的磁盘缓存?": "確認清理不活躍的磁碟快取?", + "确认清空全部渠道亲和性缓存": "確認清空全部渠道親和性快取", + "确认清空该规则缓存": "確認清空該規則快取", "确认清除历史日志": "確認清除歷史日誌", "确认禁用": "確認禁用", "确认补单": "確認補單", "确认解绑": "確認解綁", "确认解绑 Passkey": "確認解綁 Passkey", "确认设置并完成初始化": "確認設定並完成初始化", + "确认迁移": "確認遷移", "确认重置 Passkey": "確認重置 Passkey", "确认重置两步验证": "確認重置兩步驗證", "确认重置密码": "確認重置密碼", + "磁盘 阈值 (%)": "磁碟 閾值 (%)", + "磁盘使用率超过此值时拒绝请求": "磁碟使用率超過此值時拒絕請求", + "磁盘可用空间小于缓存最大总量设置": "磁碟可用空間小於快取最大總量設定", + "磁盘命中": "磁碟命中", + "磁盘缓存最大总量 (MB)": "磁碟快取最大總量 (MB)", + "磁盘缓存占用的最大空间": "磁碟快取佔用的最大空間", + "磁盘缓存已清理": "磁碟快取已清理", + "磁盘缓存设置(磁盘换内存)": "磁碟快取設定(磁碟換記憶體)", + "磁盘缓存阈值 (MB)": "磁碟快取閾值 (MB)", "示例": "示例", "示例:{\"default\": [200, 100], \"vip\": [0, 1000]}。": "示例:{\"default\": [200, 100], \"vip\": [0, 1000]}。", "视频": "影片", @@ -1775,6 +2216,7 @@ "禁用两步验证": "禁用兩步驗證", "禁用全部": "禁用全部", "禁用原因": "禁用原因", + "禁用后用户端不再展示,但历史订单不受影响。是否继续?": "禁用後使用者端不再展示,但歷史訂單不受影響。是否繼續?", "禁用后的影响:": "禁用後的影響:", "禁用密钥失败": "禁用密鑰失敗", "禁用思考处理的模型列表": "禁用思考處理的模型列表", @@ -1787,21 +2229,35 @@ "秒": "秒", "移除 functionResponse.id 字段": "移除 functionResponse.id 字段", "移除 One API 的版权标识必须首先获得授权,项目维护需要花费大量精力,如果本项目对你有意义,请主动支持本项目": "移除 One API 的版權標識必須首先獲得授權,項目維護需要花費大量精力,如果本項目對你有意義,請主動支援本項目", + "窗口:": "視窗:", "窗口处理": "窗口處理", "窗口等待": "窗口等待", + "立即签到": "立即簽到", + "立即订阅": "立即訂閱", "站点额度展示类型及汇率": "站點額度展示類型及匯率", "端口号必须在1-65535之间": "端口號必須在1-65535之間", "端口配置详细说明": "限制外部請求只能訪問指定端口。支援單個端口(80, 443)或端口範圍(8000-8999)。空列表允許所有端口。預設包含常用Web端口。", "端点": "端點", + "端点 URL 必须以 http:// 或 https:// 开头:": "端點 URL 必須以 http:// 或 https:// 開頭:", + "端点 URL 必须是完整地址(以 http:// 或 https:// 开头)": "端點 URL 必須是完整位址(以 http:// 或 https:// 開頭)", "端点映射": "端點映射", - "在模型广场向用户展示的端点": "在模型廣場向使用者展示的端點", "端点类型": "端點類型", "端点组": "端點組", + "第三方支付配置": "第三方支付設定", "第三方账户绑定状态(只读)": "第三方帳號綁定狀態(唯讀)", "等价金额:": "等價金額:", "等待中": "等待中", "等待获取邮箱信息...": "等待獲取信箱資訊...", "筛选": "篩選", + "签到最大额度": "簽到最大額度", + "签到最小额度": "簽到最小額度", + "签到功能允许用户每日签到获取随机额度奖励": "簽到功能允許使用者每日簽到獲取隨機額度獎勵", + "签到失败": "簽到失敗", + "签到奖励将直接添加到您的账户余额": "簽到獎勵將直接添加到您的帳號餘額", + "签到奖励的最大额度": "簽到獎勵的最大額度", + "签到奖励的最小额度": "簽到獎勵的最小額度", + "签到成功!获得": "簽到成功!獲得", + "签到设置": "簽到設定", "管理": "管理", "管理 Ollama 模型的拉取和删除": "管理 Ollama 模型的拉取和刪除", "管理你的 LinuxDO OAuth App": "管理你的 LinuxDO OAuth App", @@ -1812,20 +2268,27 @@ "管理员未开启Stripe充值!": "管理員未開啟Stripe儲值!", "管理员未开启在线充值!": "管理員未開啟在線儲值!", "管理员未开启在线充值功能,请联系管理员开启或使用兑换码充值。": "管理員未開啟在線儲值功能,請聯繫管理員開啟或使用兌換碼儲值。", + "管理员未开启在线支付功能,请联系管理员配置。": "管理員未開啟在線支付功能,請聯繫管理員設定。", "管理员未设置用户可选分组": "管理員未設定使用者可選分組", "管理员设置了外部链接,点击下方按钮访问": "管理員設定了外部連結,點擊下方按鈕訪問", "管理员账号": "管理員帳號", "管理员账号已经初始化过,请继续设置其他参数": "管理員帳號已經初始化過,請繼續設定其他參數", "管理模型、标签、端点等预填组": "管理模型、標籤、端點等預填組", + "管理用户已绑定的第三方账户,支持筛选与解绑": "管理使用者已繫結的第三方賬戶,支援篩選與解綁", + "管理绑定": "管理繫結", "类型": "類型", "粘贴图片失败": "貼上圖片失敗", "精确": "精確", + "精确名称匹配": "精確名稱匹配", "系统": "系統", "系统令牌已复制到剪切板": "系統令牌已複製到剪切板", "系统任务记录": "系統任務記錄", "系统信息": "系統訊息", "系统公告": "系統公告", + "系统公告已更新": "系統公告已更新", + "系统公告更新失败": "系統公告更新失敗", "系统公告管理,可以发布系统通知和重要消息(最多100个,前端显示最新20条)": "系統公告管理,可以發佈系統通知和重要消息(最多100個,前端顯示最新20條)", + "系统内存": "系統記憶體", "系统初始化": "系統初始化", "系统初始化失败,请重试": "系統初始化失敗,請重試", "系统初始化成功,正在跳转...": "系統初始化成功,正在跳轉...", @@ -1834,6 +2297,7 @@ "系统名称已更新": "系統名稱已更新", "系统名称更新失败": "系統名稱更新失敗", "系统已为该部署准备 Ollama 镜像与随机 API Key": "系統已為該部署準備 Ollama 鏡像與隨機 API Key", + "系统性能监控": "系統性能監控", "系统提示覆盖": "系統提示覆蓋", "系统提示词": "系統提示詞", "系统提示词拼接": "系統提示詞拼接", @@ -1841,22 +2305,13 @@ "系统文档和帮助信息": "系統文件和幫助資訊", "系统消息": "系統消息", "系统管理功能": "系統管理功能", - "系统性能监控": "系統性能監控", - "启用性能监控后,当系统资源使用率超过设定阈值时,将拒绝新的 Relay 请求 (/v1, /v1beta 等),以保护系统稳定性。": "啟用性能監控後,當系統資源使用率超過設定閾值時,將拒絕新的 Relay 請求 (/v1, /v1beta 等),以保護系統穩定性。", - "启用性能监控": "啟用性能監控", - "超过阈值时拒绝新请求": "超過閾值時拒絕新請求", - "CPU 阈值 (%)": "CPU 閾值 (%)", - "CPU 使用率超过此值时拒绝请求": "CPU 使用率超過此值時拒絕請求", - "内存 阈值 (%)": "記憶體 閾值 (%)", - "内存使用率超过此值时拒绝请求": "記憶體使用率超過此值時拒絕請求", - "磁盘 阈值 (%)": "磁碟 閾值 (%)", - "磁盘使用率超过此值时拒绝请求": "磁碟使用率超過此值時拒絕請求", - "保存性能设置": "儲存性能設定", "系统设置": "系統設定", "系统访问令牌": "系統訪問令牌", "约": "約", "索引": "索引", "紧凑列表": "緊湊列表", + "累计签到": "累計簽到", + "累计获得": "累計獲得", "线路描述": "線路描述", "组列表": "組列表", "组名": "組名", @@ -1867,20 +2322,26 @@ "绑定": "綁定", "绑定 Telegram": "綁定 Telegram", "绑定信息": "綁定資訊", + "绑定后会立即生成用户订阅(无需支付),有效期按套餐配置计算。": "綁定後會立即生成使用者訂閱(無需支付),有效期按訂閱設定計算。", "绑定微信账户": "綁定微信帳號", "绑定成功!": "綁定成功!", + "绑定订阅套餐": "綁定訂閱", "绑定邮箱地址": "綁定信箱位址", + "结束": "結束", "结束时间": "結束時間", "结果图片": "結果圖片", + "结算差额": "結算差額", "绘图": "繪圖", "绘图任务记录": "繪圖任務記錄", "绘图日志": "繪圖日誌", "绘图设置": "繪圖設定", "统一的": "統一的", "统计Tokens": "統計Tokens", + "统计已重置": "統計已重置", "统计次数": "統計次數", "统计额度": "統計額度", "继续": "繼續", + "维护中": "維護中", "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "快取 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})", "缓存 Tokens": "快取 Tokens", "缓存: {{cacheRatio}}": "快取: {{cacheRatio}}", @@ -1888,6 +2349,7 @@ "缓存价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存倍率: {{cacheRatio}})": "快取價格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (快取倍率: {{cacheRatio}})", "缓存倍率": "快取倍率", "缓存倍率 {{cacheRatio}}": "快取倍率 {{cacheRatio}}", + "缓存写": "快取寫", "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "快取建立 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})", "缓存创建 Tokens": "快取建立 Tokens", "缓存创建: {{cacheCreationRatio}}": "快取建立: {{cacheCreationRatio}}", @@ -1896,11 +2358,18 @@ "缓存创建: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "快取建立: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", "缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存创建倍率: {{cacheCreationRatio}})": "快取建立價格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (快取建立倍率: {{cacheCreationRatio}})", "缓存创建价格合计:5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens": "快取建立價格合計:5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens", + "缓存创建倍率": "快取建立倍率", "缓存创建倍率 {{cacheCreationRatio}}": "快取建立倍率 {{cacheCreationRatio}}", "缓存创建倍率 1h {{cacheCreationRatio1h}}": "快取建立倍率 1h {{cacheCreationRatio1h}}", "缓存创建倍率 5m {{cacheCreationRatio5m}}": "快取建立倍率 5m {{cacheCreationRatio5m}}", "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "快取建立倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", + "缓存条目数": "快取條目數", + "缓存目录": "快取目錄", + "缓存目录磁盘空间": "快取目錄磁碟空間", + "缓存读": "快取讀", + "编号:": "編號:", "编辑": "編輯", + "编辑 OAuth 提供商": "編輯 OAuth 提供商", "编辑API": "編輯API", "编辑产品": "編輯產品", "编辑供应商": "編輯供應商", @@ -1908,17 +2377,20 @@ "编辑公告内容": "編輯公告內容", "编辑分类": "編輯分類", "编辑成功": "編輯成功", + "编辑提供商": "編輯提供商", "编辑标签": "編輯標籤", "编辑模型": "編輯模型", "编辑模式": "編輯模式", "编辑用户": "編輯使用者", "编辑聊天配置": "編輯聊天設定", + "编辑规则": "編輯規則", "编辑问答": "編輯問答", "缩词": "縮詞", "缺省 MaxTokens": "缺省 MaxTokens", "网站地址": "網站位址", "网站域名标识": "網站域名標識", "网络连接失败,请检查网络设置或稍后重试": "網路連接失敗,請檢查網路設定或稍後重試", + "网络连接失败或服务器无响应": "網路連線失敗或伺服器無響應", "网络配置": "網路設定", "网络错误": "網路錯誤", "置信度": "置信度", @@ -1928,6 +2400,7 @@ "聊天区域": "聊天區域", "聊天应用名称": "聊天應用名稱", "聊天应用名称已存在,请使用其他名称": "聊天應用名稱已存在,請使用其他名稱", + "聊天数据解析失败": "聊天資料解析失敗", "聊天设置": "聊天設定", "聊天配置": "聊天設定", "聊天链接配置错误,请联系管理员": "聊天連結設定錯誤,請聯繫管理員", @@ -1936,46 +2409,42 @@ "自动分组auto,从第一个开始选择": "自動分組auto,從第一個開始選擇", "自动刷新": "自動刷新", "自动刷新中": "自動刷新中", + "自动填充字段": "自動填充欄位", "自动检测": "自動檢測", "自动模式": "自動模式", "自动测试所有通道间隔时间": "自動測試所有通道間隔時間", + "自动生成:": "自動生成:", "自动禁用": "自動禁用", "自动禁用关键词": "自動禁用關鍵詞", "自动禁用状态码": "自動禁用狀態碼", "自动禁用状态码格式不正确": "自動禁用狀態碼格式不正確", + "自动选择": "自動選擇", "自动重试状态码": "自動重試狀態碼", "自动重试状态码格式不正确": "自動重試狀態碼格式不正確", - "支持填写单个状态码或范围(含首尾),使用逗号分隔": "支援填寫單個狀態碼或範圍(含首尾),使用逗號分隔", - "支持填写单个状态码或范围(含首尾),使用逗号分隔;504 和 524 始终不重试,不受此处配置影响": "支援填寫單個狀態碼或範圍(含首尾),使用逗號分隔;504 和 524 一律不重試,不受此處設定影響", - "高危操作确认": "高風險操作確認", - "检测到以下高危状态码重定向规则": "檢測到以下高風險狀態碼重定向規則", - "操作确认": "操作確認", - "我确认开启高危重试": "我確認開啟高風險重試", - "高危状态码重试风险告知与免责声明Markdown": "### ⚠️ 高風險操作:504/524 狀態碼重試風險告知與免責聲明\n\n【背景提示】\n本專案預設對 `400`(請求錯誤)、`504`(閘道逾時)與 `524`(發生逾時)狀態碼不進行重試。504 與 524 錯誤通常代表**請求已成功送達上游 AI 服務,且上游正在處理,但因處理時間過長導致連線中斷**。\n\n開啟此類逾時狀態碼的重定向/重試屬於**極高風險操作**。作為本開源專案使用者,在開啟該功能前,您必須仔細閱讀並知悉以下嚴重後果:\n\n#### 一、 核心風險告知(請仔細閱讀)\n1. 💸 雙重/多重計費風險:多數 AI 上游廠商對於已開始處理但因網路原因中斷(504/524)的請求**仍然會扣費**。此時若觸發重試,將會向上游發起全新請求,導致您被**雙重甚至多重計費**。\n2. ⏳ 用戶端嚴重逾時:單次請求已觸發逾時,疊加重試機制會使總請求耗時成倍增加,導致最終用戶端(或呼叫方)出現嚴重甚至無法接受的逾時現象。\n3. 💥 請求積壓與系統崩潰風險:強制重試逾時請求會長時間占用系統執行緒與連線數。在高併發場景下,這將導致嚴重**請求積壓**,進而耗盡系統資源,引發雪崩效應,造成整個代理服務崩潰。\n\n#### 二、 風險確認聲明\n若您堅持開啟該功能,即代表您作出以下確認:", - "高危状态码重试风险确认输入文本": "我已了解多重計費與崩潰風險,確認開啟", - "高危状态码重试风险确认项1": "我已充分閱讀並理解:本人已完整閱讀上述全部風險提示,完全理解強制重試 504 與 524 狀態碼可能帶來的破壞性後果。", - "高危状态码重试风险确认项2": "我已與上游溝通並確認:本人確認,當前逾時問題屬於上游服務瓶頸。本人已與上游供應商溝通,確認上游無法解決該逾時問題,因此才採取強制重試方案作為妥協手段。", - "高危状态码重试风险确认项3": "我自願承擔計費損失:本人知悉並接受由此產生的全部雙重/多重計費風險,承諾不會因重試導致的帳單異常在本專案倉庫提交 Issue 或抱怨。", - "高危状态码重试风险确认项4": "我自願承擔系統穩定性風險:本人知悉該操作可能導致用戶端嚴重逾時及服務崩潰。若因本人開啟此功能導致請求積壓或服務不可用,後果由本人自行承擔。", - "高危状态码重试风险输入框占位文案": "請完整輸入上方文字", - "高危状态码重试风险输入不匹配提示": "輸入內容與要求不一致", - "例如:401, 403, 429, 500-599": "例如:401,403,429,500-599", - "自动选择": "自動選擇", + "自定义": "自訂", + "自定义 OAuth 提供商": "自訂 OAuth 提供商", + "自定义(秒)": "自訂(秒)", "自定义充值数量选项": "自訂儲值數量選項", "自定义充值数量选项不是合法的 JSON 数组": "自訂儲值數量選項不是合法的 JSON 陣列", "自定义变焦-提交": "自訂變焦-提交", "自定义模型名称": "自訂模型名稱", "自定义模式下不可用": "自訂模式下不可用", + "自定义渠道": "自定義渠道", + "自定义秒数": "自訂秒數", + "自定义请求体格式错误,请检查JSON格式": "自定義請求體格式錯誤,請檢查JSON格式", "自定义请求体模式": "自訂請求體模式", "自定义货币": "自訂貨幣", "自定义货币符号": "自訂貨幣符號", "自定义镜像": "自訂鏡像", "自用模式": "自用模式", "自适应列表": "動態列表", + "至": "至", "节省": "節省", "花费": "花費", "花费时间": "花費時間", "若你的 OIDC Provider 支持 Discovery Endpoint,你可以仅填写 OIDC Well-Known URL,系统会自动获取 OIDC 配置": "若你的 OIDC Provider 支援 Discovery Endpoint,你可以僅填寫 OIDC Well-Known URL,系統會自動獲取 OIDC 設定", + "获取 Discovery 配置": "獲取 Discovery 配置", + "获取 Discovery 配置失败:": "獲取 Discovery 配置失敗:", "获取 io.net API Key": "獲取 io.net API Key", "获取 OIDC 配置失败,请检查网络状况和 Well-Known URL 是否正确": "獲取 OIDC 設定失敗,請檢查網路狀況和 Well-Known URL 是否正確", "获取 OIDC 配置成功!": "獲取 OIDC 設定成功!", @@ -1996,12 +2465,17 @@ "获取模型列表": "獲取模型列表", "获取模型列表失败": "獲取模型列表失敗", "获取渠道失败:": "獲取管道失敗:", + "获取用量失败": "獲取用量失敗", "获取硬件类型失败: ": "獲取硬體類型失敗: ", + "获取签到状态失败": "獲取簽到狀態失敗", "获取组列表失败": "獲取組列表失敗", + "获取绑定信息失败": "獲取繫結資訊失敗", + "获取自定义 OAuth 提供商列表失败": "獲取自定義 OAuth 提供商列表失敗", "获取详情失败": "獲取詳情失敗", "获取部署列表失败": "獲取部署列表失敗", "获取金额失败": "獲取金額失敗", "获取验证码": "獲取驗證碼", + "获得": "獲得", "补全": "補全", "补全 {{completion}} tokens / 1M tokens * {{symbol}}{{price}}": "補全 {{completion}} tokens / 1M tokens * {{symbol}}{{price}}", "补全价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "補全價格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (補全倍率: {{completionRatio}})", @@ -2015,12 +2489,21 @@ "表格视图": "表格視圖", "覆盖模式:将完全替换现有的所有密钥": "覆蓋模式:將完全替換現有的所有密鑰", "覆盖现有密钥": "覆蓋現有密鑰", + "规则": "規則", + "规则 JSON": "規則 JSON", + "规则 JSON 格式不正确": "規則 JSON 格式不正確", + "规则 ttl_seconds 为 0 时使用。0 表示使用后端默认 TTL:3600 秒。": "規則 ttl_seconds 為 0 時使用。0 表示使用後端預設 TTL:3600 秒。", + "规则为 JSON 数组;可视化与 JSON 模式共用同一份数据。": "規則為 JSON 陣列;視覺化與 JSON 模式共用同一份資料。", + "规则名称(可读性更好,也会出现在管理侧日志中)。": "規則名稱(可讀性更好,也會出現在管理側日誌中)。", + "规则未找到,请刷新后重试": "規則未找到,請重新整理後重試", "角色": "角色", "解析响应数据时发生错误": "解析響應數據時發生錯誤", "解析密钥文件失败: {{msg}}": "解析密鑰檔案失敗: {{msg}}", "解析错误": "解析錯誤", + "解绑": "解綁", "解绑 Passkey": "解綁 Passkey", "解绑后将无法使用 Passkey 登录,确定要继续吗?": "解綁後將無法使用 Passkey 登錄,確定要繼續嗎?", + "解绑成功": "解綁成功", "计价币种": "計價幣種", "计算中": "計算中", "计算成本": "計算成本", @@ -2030,7 +2513,18 @@ "计费类型": "計費類型", "计费过程": "計費過程", "订单号": "訂單號", + "订阅": "訂閱", + "订阅剩余": "訂閱剩餘", + "订阅套餐": "訂閱", + "订阅套餐管理": "訂閱管理", + "订阅实例": "訂閱例項", + "订阅抵扣": "訂閱抵扣", + "订阅管理": "訂閱管理", + "订阅结算": "訂閱結算", + "订阅说明": "訂閱說明", + "认证方式": "認證方式", "讯飞星火": "訊飛星火", + "讯飞星火认知": "訊飛星火認知", "记录请求与错误日志IP": "記錄請求與錯誤日誌IP", "设备": "設備", "设备类型偏好": "設備類型偏好", @@ -2069,16 +2563,25 @@ "该供应商提供多种AI模型,适用于不同的应用场景。": "該供應商提供多種AI模型,適用於不同的應用場景。", "该分类下没有可用模型": "該分類下沒有可用模型", "该域名已存在于白名单中": "該域名已存在於白名單中", + "该套餐未配置 Creem": "該訂閱未設定 Creem", + "该套餐未配置 Stripe": "該訂閱未設定 Stripe", "该数据可能不可信,请谨慎使用": "該數據可能不可信,請謹慎使用", "该服务器地址将影响支付回调地址以及默认首页展示的地址,请确保正确配置": "該伺服器位址將影響支付回調位址以及預設首頁展示的位址,請確保正確設定", "该模型存在固定价格与倍率计费方式冲突,请确认选择": "該模型存在固定價格與倍率計費方式衝突,請確認選擇", "该渠道已开启请求透传,参数覆写、模型重定向等 NewAPI 内置功能将失效,非最佳实践。": "該管道已開啟請求透傳,參數覆寫、模型重定向等 NewAPI 內置功能將失效,非最佳實踐。", "该渠道已开启请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "該管道已開啟請求透傳:參數覆寫、模型重定向、管道相容等 NewAPI 內置功能將失效,非最佳實踐;如因此產生問題,請勿提交 issue 回饋。", + "该规则未启用“作用域:包含规则名称”,无法按规则清空缓存。": "該規則未啟用“作用域:包含規則名稱”,無法按規則清空快取。", + "该规则的缓存保留时长;0 表示使用默认 TTL:": "該規則的快取保留時長;0 表示使用預設 TTL:", + "该记录不包含可用的 token 统计口径。": "該記錄不包含可用的 token 統計口徑。", "详情": "詳情", + "语言偏好": "語言偏好", + "语言偏好已保存": "語言偏好已儲存", "语音输入": "語音輸入", "语音输出": "語音輸出", "说明": "說明", "说明:": "說明:", + "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。": "說明:本頁測試為非流式請求;若管道僅支援流式返回,可能出現測試失敗,請以實際使用為準。", + "说明:生成结果是可直接粘贴到渠道密钥里的 JSON(包含 access_token / refresh_token / account_id)。": "說明:生成結果是可直接貼上到渠道金鑰裡的 JSON(包含 access_token / refresh_token / account_id)。", "说明信息": "說明資訊", "请上传密钥文件": "請上傳密鑰檔案", "请上传密钥文件!": "請上傳密鑰檔案!", @@ -2086,13 +2589,21 @@ "请使用 Project 为 io.cloud 的密钥": "請使用 Project 為 io.cloud 的密鑰", "请先在设置中启用图片功能": "請先在設定中啟用圖片功能", "请先填写 API Key": "請先填寫 API Key", + "请先填写 Discovery URL 或 Issuer URL": "請先填寫 Discovery URL 或 Issuer URL", + "请先填写 Issuer URL,以自动生成完整的端点 URL": "請先填寫 Issuer URL,以自動生成完整的端點 URL", "请先填写 Ollama API 地址": "請先填寫 Ollama API 位址", "请先填写服务器地址": "請先填寫伺服器位址", + "请先填写服务器地址,以自动生成完整的端点 URL": "請先填寫伺服器位址,以自動生成完整的端點 URL", + "请先粘贴回调 URL": "請先貼上回撥 URL", "请先输入密钥": "請先輸入密鑰", "请先选择同步渠道": "請先選擇同步管道", "请先选择模型!": "請先選擇模型!", "请先选择硬件类型": "請先選擇硬體類型", + "请先选择要删除的API信息": "請先選擇要刪除的API資訊", "请先选择要删除的令牌!": "請先選擇要刪除的令牌!", + "请先选择要删除的分类": "請先選擇要刪除的分類", + "请先选择要删除的常见问答": "請先選擇要刪除的常見問答", + "请先选择要删除的系统公告": "請先選擇要刪除的系統公告", "请先选择要删除的通道!": "請先選擇要刪除的通道!", "请先选择要设置标签的渠道!": "請先選擇要設定標籤的管道!", "请先选择需要批量设置的模型": "請先選擇需要批量設定的模型", @@ -2101,8 +2612,12 @@ "请前往个人设置 → 安全设置进行配置。": "請前往個人設定 → 安全設定進行設定。", "请勿过度信任此功能,IP可能被伪造,请配合nginx和cdn等网关使用": "請勿過度信任此功能,IP可能被偽造,請配合nginx和cdn等網關使用", "请在系统设置页面编辑分组倍率以添加新的分组:": "請在系統設定頁面編輯分組倍率以添加新的分組:", + "请填写完整的API信息": "請填寫完整的API資訊", "请填写完整的产品信息": "請填寫完整的產品資訊", + "请填写完整的公告信息": "請填寫完整的公告資訊", + "请填写完整的分类信息": "請填寫完整的分類資訊", "请填写完整的管理员账号信息": "請填寫完整的管理員帳號資訊", + "请填写完整的问答信息": "請填寫完整的問答資訊", "请填写密钥": "請填寫密鑰", "请填写渠道名称和渠道密钥!": "請填寫管道名稱和管道密鑰!", "请填写部署地区": "請填寫部署地區", @@ -2112,12 +2627,16 @@ "请检查表单填写是否正确": "請檢查表單填寫是否正確", "请检查输入": "請檢查輸入", "请求体 JSON": "請求體 JSON", + "请求体内存缓存": "請求體記憶體快取", + "请求体磁盘缓存": "請求體磁碟快取", + "请求体超过此大小时使用磁盘缓存": "請求體超過此大小時使用磁碟快取", "请求参数无效": "請求參數無效", "请求发生错误": "請求發生錯誤", "请求发生错误: ": "請求發生錯誤: ", "请求后端接口失败:": "請求後端接口失敗:", "请求失败": "請求失敗", "请求头覆盖": "請求頭覆蓋", + "请求头覆盖必须是合法的 JSON 格式!": "請求頭覆蓋必須是合法的 JSON 格式!", "请求并计费模型": "請求並計費模型", "请求时长: ${time}s": "請求時長: ${time}s", "请求次数": "請求次數", @@ -2125,14 +2644,14 @@ "请求超时,请刷新页面后重新发起 GitHub 登录": "請求超時,請刷新頁面後重新發起 GitHub 登錄", "请求路径": "請求路徑", "请求转换": "請求轉換", - "原生格式": "原生格式", - "转换": "轉換", "请求预扣费额度": "請求預扣費額度", "请点击我": "請點擊我", "请确认以下设置信息,点击\"初始化系统\"开始配置": "請確認以下設定資訊,點擊\"初始化系統\"開始設定", "请确认您已了解禁用两步验证的后果": "請確認您已瞭解禁用兩步驗證的後果", "请确认管理员密码": "請確認管理員密碼", "请稍后几秒重试,Turnstile 正在检查用户环境!": "請稍後幾秒重試,Turnstile 正在檢查使用者環境!", + "请立刻修改默认密码!": "請立刻修改預設密碼!", + "请粘贴完整回调 URL(包含 code 与 state)": "請貼上完整回撥 URL(包含 code 與 state)", "请联系管理员在系统设置中配置API信息": "請聯繫管理員在系統設定中設定API資訊", "请联系管理员在系统设置中配置Uptime": "請聯繫管理員在系統設定中設定Uptime", "请联系管理员在系统设置中配置公告信息": "請聯繫管理員在系統設定中設定公告資訊", @@ -2145,12 +2664,22 @@ "请至少选择一个渠道": "請至少選擇一個管道", "请输入 API Key,一行一个,格式:APIKey|Region": "請輸入 API Key,一行一個,格式:APIKey|Region", "请输入 API Key,格式:APIKey|Region": "請輸入 API Key,格式:APIKey|Region", + "请输入 Authorization Endpoint": "請輸入 Authorization Endpoint", "请输入 AZURE_OPENAI_ENDPOINT,例如:https://docs-test-001.openai.azure.com": "請輸入 AZURE_OPENAI_ENDPOINT,例如:https://docs-test-001.openai.azure.com", + "请输入 Client ID": "請輸入 Client ID", + "请输入 Client Secret": "請輸入 Client Secret", "请输入 io.net API Key": "請輸入 io.net API Key", "请输入 io.net API Key(敏感信息不显示)": "請輸入 io.net API Key(敏感資訊不顯示)", + "请输入 JSON 格式的 OAuth 凭据,例如:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}": "請輸入 JSON 格式的 OAuth 憑據,例如:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}", "请输入 JSON 格式的密钥内容,例如:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}": "請輸入 JSON 格式的密鑰內容,例如:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}", "请输入 OIDC 的 Well-Known URL": "請輸入 OIDC 的 Well-Known URL", + "请输入 Slug": "請輸入 Slug", + "请输入 Token Endpoint": "請輸入 Token Endpoint", + "请输入 User Info Endpoint": "請輸入 User Info Endpoint", + "请输入6位验证码": "請輸入6位驗證碼", "请输入6位验证码或8位备用码": "請輸入6位驗證碼或8位備用碼", + "请输入8位备用码": "請輸入8位備用碼", + "请输入Account ID,例如:d6b5da8hk1awo8nap34ube6gh": "請輸入Account ID,例如:d6b5da8hk1awo8nap34ube6gh", "请输入API地址": "請輸入API位址", "请输入API地址!": "請輸入API位址!", "请输入Bark推送URL": "請輸入Bark推送URL", @@ -2184,6 +2713,7 @@ "请输入图标名称": "請輸入圖示名稱", "请输入填充值": "請輸入填儲值", "请输入备注(仅管理员可见)": "請輸入備註(僅管理員可見)", + "请输入套餐标题": "請輸入訂閱標題", "请输入完整的 JSON 格式密钥内容": "請輸入完整的 JSON 格式密鑰內容", "请输入完整的URL,例如:https://api.openai.com/v1/chat/completions": "請輸入完整的URL,例如:https://api.openai.com/v1/chat/completions", "请输入完整的URL链接": "請輸入完整的URL連結", @@ -2194,6 +2724,7 @@ "请输入密钥,一行一个,格式:AccessKey|SecretAccessKey|Region": "請輸入密鑰,一行一個,格式:AccessKey|SecretAccessKey|Region", "请输入密钥!": "請輸入密鑰!", "请输入延长时长": "請輸入延長時長", + "请输入总额度": "請輸入總額度", "请输入您的密码": "請輸入您的密碼", "请输入您的用户名以确认删除": "請輸入您的使用者名以確認刪除", "请输入您的用户名或邮箱地址": "請輸入您的使用者名或信箱位址", @@ -2211,7 +2742,9 @@ "请输入新的用户名": "請輸入新的使用者名", "请输入新的部署名称": "請輸入新的部署名稱", "请输入显示名称": "請輸入顯示名稱", + "请输入智能体ID,例如:7342866812345": "請輸入智慧體ID,例如:7342866812345", "请输入有效的JSON格式的请求体。您可以参考预览面板中的默认请求体格式。": "請輸入有效的JSON格式的請求體。您可以參考預覽面板中的預設請求體格式。", + "请输入有效的URL地址": "請輸入有效的URL地址", "请输入有效的数字": "請輸入有效的數位", "请输入有效的镜像地址": "請輸入有效的鏡像位址", "请输入标签名称": "請輸入標籤名稱", @@ -2226,7 +2759,10 @@ "请输入状态页面的Slug,如:my-status": "請輸入狀態頁面的Slug,如:my-status", "请输入生成数量": "請輸入生成數量", "请输入用户名": "請輸入使用者名", + "请输入用户名和密码!": "請輸入使用者名稱和密碼!", + "请输入知识库 ID,例如:123456": "請輸入知識庫 ID,例如:123456", "请输入私有部署地址,格式为:https://fastgpt.run/api/openapi": "請輸入私有部署位址,格式為:https://fastgpt.run/api/openapi", + "请输入秒数": "請輸入秒數", "请输入管理员密码": "請輸入管理員密碼", "请输入管理员用户名": "請輸入管理員使用者名", "请输入线路描述": "請輸入線路描述", @@ -2237,6 +2773,7 @@ "请输入补全倍率": "請輸入補全倍率", "请输入要延长的小时数": "請輸入要延長的小時數", "请输入要设置的标签名称": "請輸入要設定的標籤名稱", + "请输入认证器应用显示的验证码完成登录": "請輸入認證器應用顯示的驗證碼完成登入", "请输入认证器验证码": "請輸入認證器驗證碼", "请输入认证器验证码或备用码": "請輸入認證器驗證碼或備用碼", "请输入说明": "請輸入說明", @@ -2247,6 +2784,7 @@ "请输入部署名称": "請輸入部署名稱", "请输入部署名称以完成二次确认": "請輸入部署名稱以完成二次確認", "请输入部署地区,例如:us-central1\n支持使用模型映射格式\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}": "請輸入部署地區,例如:us-central1\n支援使用模型映射格式\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}", + "请输入金额": "請輸入金額", "请输入镜像地址": "請輸入鏡像位址", "请输入问题标题": "請輸入問題標題", "请输入预警阈值": "請輸入預警閾值", @@ -2268,6 +2806,7 @@ "请选择多密钥使用策略": "請選擇多密鑰使用策略", "请选择密钥更新模式": "請選擇密鑰更新模式", "请选择密钥格式": "請選擇密鑰格式", + "请选择支付方式": "請選擇支付方式", "请选择日志记录时间": "請選擇日誌記錄時間", "请选择模型": "請選擇模型", "请选择模型。": "請選擇模型。", @@ -2276,6 +2815,7 @@ "请选择硬件类型": "請選擇硬體類型", "请选择组类型": "請選擇組類型", "请选择至少一个部署位置": "請選擇至少一個部署位置", + "请选择订阅套餐": "請選擇訂閱套餐", "请选择该令牌支持的模型,留空支持所有模型": "請選擇該令牌支援的模型,留空支援所有模型", "请选择该渠道所支持的模型": "請選擇該管道所支援的模型", "请选择该渠道所支持的模型,留空则不更改": "請選擇該管道所支援的模型,留空則不更改", @@ -2290,6 +2830,7 @@ "警告:启用保活后,如果已经写入保活数据后渠道出错,系统无法重试,如果必须开启,推荐设置尽可能大的Ping间隔": "警告:啟用保活後,如果已經寫入保活數據後管道出錯,系統無法重試,如果必須開啟,推薦設定儘可能大的Ping間隔", "警告:禁用两步验证将永久删除您的验证设置和所有备用码,此操作不可撤销!": "警告:禁用兩步驗證將永久刪除您的驗證設定和所有備用碼,此操作不可撤銷!", "豆包": "豆包", + "豆包视频": "豆包影片", "账单": "帳單", "账户充值": "帳號儲值", "账户已删除!": "帳號已刪除!", @@ -2298,21 +2839,31 @@ "账户管理": "帳號管理", "账户绑定": "帳號綁定", "账户绑定、安全设置和身份验证": "帳號綁定、安全設定和身份驗證", + "账户绑定管理": "賬戶繫結管理", "账户统计": "帳號統計", "货币": "貨幣", "货币单位": "貨幣單位", + "购买上限": "購買上限", "购买兑换码": "購買兌換碼", + "购买套餐后即可享受模型权益": "購買訂閱後即可享受模型權益", + "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。": "購買或手動新增訂閱會升級到該分組;當訂閱失效/過期或手動作廢/刪除後,將回退到升級前分組。回退不會立即生效,通常會有幾分鐘延遲。", + "购买订阅套餐": "購買訂閱", "费用信息": "費用資訊", "费用预估": "費用預估", "资源消耗": "資源消耗", "起始时间": "起始時間", "超级管理员": "超級管理員", "超级管理员未设置充值链接!": "超級管理員未設定儲值連結!", + "超过阈值时拒绝新请求": "超過閾值時拒絕新請求", + "距离重置:": "距離重置:", "跟随日志": "跟隨日誌", "跟随系统主题设置": "跟隨系統主題設定", "跨分组": "跨分組", "跨分组重试": "跨分組重試", + "路径正则": "路徑正則", + "路径正则(每行一个)": "路徑正則(每行一個)", "跳转": "跳轉", + "转换": "轉換", "轮询": "輪詢", "轮询模式": "輪詢模式", "轮询模式必须搭配Redis和内存缓存功能使用,否则性能将大幅降低,并且无法实现轮询功能": "輪詢模式必須搭配Redis和記憶體快取功能使用,否則性能將大幅降低,並且無法實現輪詢功能", @@ -2329,6 +2880,7 @@ "输入你的账户名{{username}}以确认删除": "輸入你的帳號名{{username}}以確認刪除", "输入域名后回车": "輸入域名後回車", "输入域名后回车,如:example.com": "輸入域名後回車,如:example.com", + "输入基础 URL": "輸入基礎 URL", "输入密码,最短 8 位,最长 20 位": "輸入密碼,最短 8 位,最長 20 位", "输入数字": "輸入數位", "输入标签或使用\",\"分隔多个标签": "輸入標籤或使用\",\"分隔多個標籤", @@ -2342,54 +2894,20 @@ "输入要添加的邮箱域名": "輸入要添加的信箱域名", "输入认证器应用显示的6位数字验证码": "輸入認證器應用顯示的6位數位驗證碼", "输入邮箱地址": "輸入信箱位址", + "输入金额": "輸入金額", "输入项目名称,按回车添加": "輸入項目名稱,按回車添加", + "输入额度": "輸入額度", "输入验证码": "輸入驗證碼", "输入验证码完成设置": "輸入驗證碼完成設定", "输出": "輸出", "输出 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}}) * {{ratioType}} {{ratio}}": "輸出 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}}) * {{ratioType}} {{ratio}}", - "磁盘缓存设置(磁盘换内存)": "磁碟快取設定(磁碟換記憶體)", - "启用磁盘缓存后,大请求体将临时存储到磁盘而非内存,可显著降低内存占用,适用于处理包含大量图片/文件的请求。建议在 SSD 环境下使用。": "啟用磁碟快取後,大請求體將臨時存儲到磁碟而非記憶體,可顯著降低記憶體佔用,適用於處理包含大量圖片/檔案的請求。建議在 SSD 環境下使用。", - "启用磁盘缓存": "啟用磁碟快取", - "将大请求体临时存储到磁盘": "將大請求體臨時存儲到磁碟", - "磁盘缓存阈值 (MB)": "磁碟快取閾值 (MB)", - "请求体超过此大小时使用磁盘缓存": "請求體超過此大小時使用磁碟快取", - "磁盘缓存最大总量 (MB)": "磁碟快取最大總量 (MB)", - "可用空间: {{free}} / 总空间: {{total}}": "可用空間: {{free}} / 總空間: {{total}}", - "磁盘缓存占用的最大空间": "磁碟快取佔用的最大空間", - "留空使用系统临时目录": "留空使用系統臨時目錄", - "例如 /var/cache/new-api": "例如 /var/cache/new-api", - "性能监控": "性能監控", - "刷新统计": "刷新統計", - "重置统计": "重置統計", - "执行 GC": "執行 GC", - "请求体磁盘缓存": "請求體磁碟快取", - "活跃文件": "活躍檔案", - "磁盘命中": "磁碟命中", - "请求体内存缓存": "請求體記憶體快取", - "当前缓存大小": "當前快取大小", - "活跃缓存数": "活躍快取數", - "内存命中": "記憶體命中", - "缓存目录磁盘空间": "快取目錄磁碟空間", - "磁盘可用空间小于缓存最大总量设置": "磁碟可用空間小於快取最大總量設定", - "已分配内存": "已分配記憶體", - "总分配内存": "總分配記憶體", - "系统内存": "系統記憶體", - "GC 次数": "GC 次數", - "Goroutine 数": "Goroutine 數", - "目录文件数": "目錄檔案數", - "目录总大小": "目錄總大小", - "磁盘缓存已清理": "磁碟快取已清理", - "清理失败": "清理失敗", - "统计已重置": "統計已重置", - "重置失败": "重置失敗", - "GC 已执行": "GC 已執行", - "GC 执行失败": "GC 執行失敗", - "缓存目录": "快取目錄", - "可用": "可用", "输出价格": "輸出價格", "输出价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "輸出價格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (補全倍率: {{completionRatio}})", "输出倍率 {{completionRatio}}": "輸出倍率 {{completionRatio}}", "边栏设置": "邊欄設定", + "迁移失败: ": "遷移失敗: ", + "迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。": "遷移過程中會自動處理資料格式轉換,遷移完成後舊配置將被清除,請在遷移前在資料庫中備份好舊配置。", + "过期于": "過期於", "过期时间": "過期時間", "过期时间不能早于当前时间!": "過期時間不能早於當前時間!", "过期时间快捷设置": "過期時間快捷設定", @@ -2399,14 +2917,18 @@ "运行命令 (Command)": "運行命令 (Command)", "运行时长": "運行時長", "运行时长(小时)": "運行時長(小時)", + "近 30 天": "近 30 天", + "近 7 天": "近 7 天", "返回修改": "返回修改", "返回登录": "返回登錄", - "违规扣费金额": "違規扣費金額", - "这是重复键中的最后一个,其值将被使用": "這是重複鍵中的最後一個,其值將被使用", + "这将删除超过 10 分钟未使用的临时缓存文件": "這將刪除超過 10 分鐘未使用的臨時快取檔案", "这是基础金额,实际扣费 = 基础金额 x 系统分组倍率。": "這是基礎金額,實際扣費 = 基礎金額 x 系統分組倍率。", + "这是重复键中的最后一个,其值将被使用": "這是重複鍵中的最後一個,其值將被使用", "进度": "進度", "进行中": "進行中", "进行该操作时,可能导致渠道访问错误,请仅在数据库出现问题时使用": "進行該操作時,可能導致管道訪問錯誤,請僅在資料庫出現問題時使用", + "违规扣费": "違規扣費", + "违规扣费金额": "違規扣費金額", "连接保活设置": "連接保活設定", "连接已断开": "連接已斷開", "连接测试中...": "連接測試中...", @@ -2414,6 +2936,7 @@ "追加模式:将新密钥添加到现有密钥列表末尾": "追加模式:將新密鑰添加到現有密鑰列表末尾", "追加模式:新密钥将添加到现有密钥列表的末尾": "追加模式:新密鑰將添加到現有密鑰列表的末尾", "退出": "退出", + "退款": "退款", "适用于个人使用的场景,不需要设置模型价格": "適用於個人使用的場景,不需要設定模型價格", "适用于为多个用户提供服务的场景": "適用於為多個使用者提供服務的場景", "适用于展示系统功能的场景,提供基础功能演示": "適用於展示系統功能的場景,提供基礎功能演示", @@ -2424,6 +2947,7 @@ "选择同步渠道": "選擇同步管道", "选择同步语言": "選擇同步語言", "选择容器": "選擇容器", + "选择您的首选界面语言,设置将自动保存并同步到所有设备": "選擇您的首選界面語言,設定將自動儲存並同步到所有設備", "选择成功": "選擇成功", "选择支付方式": "選擇支付方式", "选择支持的认证设备类型": "選擇支援的認證設備類型", @@ -2439,9 +2963,12 @@ "选择系统运行模式": "選擇系統運行模式", "选择组类型": "請選擇組類型", "选择要覆盖的冲突项": "選擇要覆蓋的衝突項", + "选择订阅套餐": "選擇訂閱", "选择语言": "選擇語言", "选择过期时间(可选,留空为永久)": "選擇過期時間(可選,留空為永久)", "选择部署位置(可多选)": "選擇部署位置(可多選)", + "选择预设...": "選擇設定檔...", + "选择预设模板(可选)": "選擇預設模板(可選)", "透传请求体": "透傳請求體", "通义千问": "通義千問", "通用设置": "通用設定", @@ -2478,6 +3005,8 @@ "邮箱地址": "信箱位址", "邮箱域名格式不正确,请输入有效的域名,如 gmail.com": "信箱域名格式不正確,請輸入有效的域名,如 gmail.com", "邮箱域名白名单格式不正确": "信箱域名白名單格式不正確", + "邮箱字段": "信箱字段", + "邮箱字段(可选)": "郵箱欄位(可選)", "邮箱账户绑定成功!": "信箱帳號綁定成功!", "部分保存失败": "部分儲存失敗", "部分保存失败,请重试": "部分儲存失敗,請重試", @@ -2508,6 +3037,8 @@ "配置 Turnstile": "設定 Turnstile", "配置 WeChat Server": "設定 WeChat Server", "配置和消息已全部重置": "設定和消息已全部重置", + "配置套餐的有效时长": "設定訂閱的有效時長", + "配置如何从用户信息 API 响应中提取用户数据,支持 JSONPath 语法": "配置如何從使用者資訊 API 響應中提取使用者資料,支援 JSONPath 語法", "配置完成后刷新页面即可使用模型部署功能": "設定完成後刷新頁面即可使用模型部署功能", "配置导入成功": "設定導入成功", "配置已导出到下载文件夹": "設定已導出到下載資料夾", @@ -2518,7 +3049,9 @@ "配置服务器端请求伪造(SSRF)防护,用于保护内网资源安全": "設定伺服器端請求偽造(SSRF)防護,用於保護內網資源安全", "配置模型部署服务提供商的API密钥和启用状态": "設定模型部署服務提供商的API密鑰和啟用狀態", "配置登录注册": "設定登錄註冊", + "配置自定义 OAuth 提供商,支持 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 协议的身份提供商": "設定自訂 OAuth 提供商,支援 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 協議的身份提供商", "配置说明": "設定說明", + "配置迁移确认": "配置遷移確認", "配置邮箱域名白名单": "設定信箱域名白名單", "重启部署失败": "重啟部署失敗", "重命名部署": "重命名部署", @@ -2536,18 +3069,26 @@ "重置 2FA": "重置 2FA", "重置 Passkey": "重置 Passkey", "重置为默认": "重置為預設", + "重置周期": "重置週期", + "重置失败": "重置失敗", + "重置时间:": "重置時間:", "重置模型倍率": "重置模型倍率", + "重置统计": "重置統計", "重置选项": "重置選項", "重置邮件发送成功,请检查邮箱!": "重置郵件發送成功,請檢查信箱!", "重置配置": "重置設定", "重要提醒": "重要提醒", "重试": "重試", "重试连接": "重試連接", + "金额": "金額", "钱包管理": "錢包管理", "链接中的{key}将自动替换为sk-xxxx,{address}将自动替换为系统设置的服务器地址,末尾不带/和/v1": "連結中的{key}將自動替換為sk-xxxx,{address}將自動替換為系統設定的伺服器位址,末尾不帶/和/v1", "销毁容器": "銷燬容器", "销毁容器失败": "銷燬容器失敗", "错误": "錯誤", + "错误:": "錯誤:", + "错误:服务器内部错误,请联系管理员!": "錯誤:伺服器內部錯誤,請聯絡管理員!", + "错误:请求次数过多,请稍后再试!": "錯誤:請求次數過多,請稍後再試!", "键为分组名称,值为另一个 JSON 对象,键为分组名称,值为该分组的用户的特殊分组倍率,例如:{\"vip\": {\"default\": 0.5, \"test\": 1}},表示 vip 分组的用户在使用default分组的令牌时倍率为0.5,使用test分组时倍率为1": "鍵為分組名稱,值為另一個 JSON 對象,鍵為分組名稱,值為該分組的使用者的特殊分組倍率,例如:{\"vip\": {\"default\": 0.5, \"test\": 1}},表示 vip 分組的使用者在使用default分組的令牌時倍率為0.5,使用test分組時倍率為1", "键为原状态码,值为要复写的状态码,仅影响本地判断": "鍵為原狀態碼,值為要複寫的狀態碼,僅影響本地判斷", "键为用户分组名称,值为操作映射对象。内层键以\"+:\"开头表示添加指定分组(键值为分组名称,值为描述),以\"-:\"开头表示移除指定分组(键值为分组名称),不带前缀的键直接添加该分组。例如:{\"vip\": {\"+:premium\": \"高级分组\", \"special\": \"特殊分组\", \"-:default\": \"默认分组\"}},表示 vip 分组的用户可以使用 premium 和 special 分组,同时移除 default 分组的访问权限": "鍵為使用者分組名稱,值為操作映射對象。內層鍵以\"+:\"開頭表示添加指定分組(鍵值為分組名稱,值為描述),以\"-:\"開頭表示移除指定分組(鍵值為分組名稱),不帶前綴的鍵直接添加該分組。例如:{\"vip\": {\"+:premium\": \"高級分組\", \"special\": \"特殊分組\", \"-:default\": \"預設分組\"}},表示 vip 分組的使用者可以使用 premium 和 special 分組,同時移除 default 分組的存取權限", @@ -2560,12 +3101,17 @@ "镜像地址": "鏡像位址", "镜像选择": "鏡像選擇", "镜像配置": "鏡像設定", + "问答已删除,请及时点击”保存设置”进行保存": "問答已刪除,請及時點選”儲存設定”進行儲存", + "问答已更新,请及时点击”保存设置”进行保存": "問答已更新,請及時點選”儲存設定”進行儲存", + "问答已添加,请及时点击”保存设置”进行保存": "問答已新增,請及時點選”儲存設定”進行儲存", "问题标题": "問題標題", "队列中": "隊列中", + "阿里通义千问": "阿里通義千問", "降低您账户的安全性": "降低您帳號的安全性", "降级": "降級", "限制周期": "限制週期", "限制周期统一使用上方配置的“限制周期”值。": "限制週期統一使用上方設定的「限制週期」值。", + "限购": "限購", "隐私政策": "隱私政策", "隐私政策已更新": "隱私政策已更新", "隐私政策更新失败": "隱私政策更新失敗", @@ -2583,55 +3129,82 @@ "需要重新完整设置才能再次启用": "需要重新完整設定才能再次啟用", "非必要,不建议启用模型限制": "非必要,不建議啟用模型限制", "非流": "非流", + "音乐预览": "音樂預覽", "音频倍率(仅部分模型支持该计费)": "音訊倍率(僅部分模型支援該計費)", "音频提示 {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}": "音訊提示 {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音訊補全 {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}", "音频提示价格:{{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens (音频倍率: {{audioRatio}})": "音訊提示價格:{{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens (音訊倍率: {{audioRatio}})", + "音频无法播放": "音訊無法播放", "音频补全价格:{{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens (音频补全倍率: {{audioCompRatio}})": "音訊補全價格:{{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens (音訊補全倍率: {{audioCompRatio}})", "音频补全倍率(仅部分模型支持该计费)": "音訊補全倍率(僅部分模型支援該計費)", "音频输入相关的倍率设置,键为模型名称,值为倍率": "音訊輸入相關的倍率設定,鍵為模型名稱,值為倍率", "音频输出补全相关的倍率设置,键为模型名称,值为倍率": "音訊輸出補全相關的倍率設定,鍵為模型名稱,值為倍率", "页脚": "頁腳", + "页脚内容已更新": "頁尾內容已更新", + "页脚内容更新失败": "頁尾內容更新失敗", "页面未找到,请检查您的浏览器地址是否正确": "頁面未找到,請檢查您的瀏覽器位址是否正確", "顶栏管理": "頂欄管理", "项目": "項目", "项目内容": "項目內容", "项目操作按钮组": "項目操作按鈕組", "预估总费用": "預估總費用", + "预估总额度": "預估總額度", "预估费用仅供参考,实际费用可能略有差异": "預估費用僅供參考,實際費用可能略有差異", "预填组管理": "預填組管理", + "预扣": "預扣", "预览失败": "預覽失敗", "预览更新": "預覽更新", "预览请求体": "預覽請求體", "预计结束": "預計結束", + "预设模板": "預設模板", "预警阈值必须为正数": "預警閾值必須為正數", "频率惩罚,减少重复词汇的出现": "頻率懲罰,減少重複詞彙的出現", "频率限制的周期(分钟)": "頻率限制的週期(分鐘)", "颜色": "顏色", "额度": "額度", + "额度充值": "額度儲值", "额度必须大于0": "額度必須大於0", "额度提醒阈值": "額度提醒閾值", "额度查询接口返回令牌额度而非用户额度": "額度查詢接口返回令牌額度而非使用者額度", "额度设置": "額度設定", + "额度重置": "額度重置", "额度预警阈值": "額度預警閾值", "首尾生视频": "首尾生影片", "首页": "首頁", "首页内容": "首頁內容", + "首页内容已更新": "首頁內容已更新", + "首页内容更新失败": "首頁內容更新失敗", "验证": "驗證", "验证 Passkey": "驗證 Passkey", "验证失败,请重试": "驗證失敗,請重試", + "验证并登录": "驗證並登入", "验证成功": "驗證成功", "验证数据库连接状态": "驗證資料庫連接狀態", "验证码": "驗證碼", + "验证码发送成功,请检查你的邮箱!": "驗證碼傳送成功,請檢查你的郵箱!", "验证码发送成功,请检查邮箱!": "驗證碼發送成功,請檢查信箱!", + "验证码必须是6位数字": "驗證碼必須是6位數字", "验证设置": "驗證設定", "验证身份": "驗證身份", "验证配置错误": "驗證設定錯誤", + "高危操作确认": "高風險操作確認", + "高危状态码重试风险告知与免责声明Markdown": "### ⚠️ 高風險操作:504/524 狀態碼重試風險告知與免責聲明\n\n【背景提示】\n本專案預設對 `400`(請求錯誤)、`504`(閘道逾時)與 `524`(發生逾時)狀態碼不進行重試。504 與 524 錯誤通常代表**請求已成功送達上游 AI 服務,且上游正在處理,但因處理時間過長導致連線中斷**。\n\n開啟此類逾時狀態碼的重定向/重試屬於**極高風險操作**。作為本開源專案使用者,在開啟該功能前,您必須仔細閱讀並知悉以下嚴重後果:\n\n#### 一、 核心風險告知(請仔細閱讀)\n1. 💸 雙重/多重計費風險:多數 AI 上游廠商對於已開始處理但因網路原因中斷(504/524)的請求**仍然會扣費**。此時若觸發重試,將會向上游發起全新請求,導致您被**雙重甚至多重計費**。\n2. ⏳ 用戶端嚴重逾時:單次請求已觸發逾時,疊加重試機制會使總請求耗時成倍增加,導致最終用戶端(或呼叫方)出現嚴重甚至無法接受的逾時現象。\n3. 💥 請求積壓與系統崩潰風險:強制重試逾時請求會長時間占用系統執行緒與連線數。在高併發場景下,這將導致嚴重**請求積壓**,進而耗盡系統資源,引發雪崩效應,造成整個代理服務崩潰。\n\n#### 二、 風險確認聲明\n若您堅持開啟該功能,即代表您作出以下確認:", + "高危状态码重试风险确认输入文本": "我已了解多重計費與崩潰風險,確認開啟", + "高危状态码重试风险确认项1": "我已充分閱讀並理解:本人已完整閱讀上述全部風險提示,完全理解強制重試 504 與 524 狀態碼可能帶來的破壞性後果。", + "高危状态码重试风险确认项2": "我已與上游溝通並確認:本人確認,當前逾時問題屬於上游服務瓶頸。本人已與上游供應商溝通,確認上游無法解決該逾時問題,因此才採取強制重試方案作為妥協手段。", + "高危状态码重试风险确认项3": "我自願承擔計費損失:本人知悉並接受由此產生的全部雙重/多重計費風險,承諾不會因重試導致的帳單異常在本專案倉庫提交 Issue 或抱怨。", + "高危状态码重试风险确认项4": "我自願承擔系統穩定性風險:本人知悉該操作可能導致用戶端嚴重逾時及服務崩潰。若因本人開啟此功能導致請求積壓或服務不可用,後果由本人自行承擔。", + "高危状态码重试风险输入不匹配提示": "輸入內容與要求不一致", + "高危状态码重试风险输入框占位文案": "請完整輸入上方文字", + "高延迟": "高延遲", "高级设置": "進階設定", + "高级选项": "高階選項", "高级配置": "進階設定", "黑名单": "黑名單", "默认": "預設", "默认 API 版本": "預設 API 版本", "默认 Responses API 版本,为空则使用上方版本": "預設 Responses API 版本,為空則使用上方版本", + "默认 TTL(秒)": "預設 TTL(秒)", + "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)": "預設為 5m 快取建立倍率;1h 快取建立倍率按固定乘法自動計算(當前為 1.6x)", "默认使用系统名称": "預設使用系統名稱", "默认助手消息": "你好!有什麼我可以幫助你的嗎?", "默认区域": "預設區域", @@ -2639,173 +3212,6 @@ "默认折叠侧边栏": "預設摺疊側邊欄", "默认测试模型": "預設測試模型", "默认用户消息": "你好", - "默认补全倍率": "預設補全倍率", - "每日签到": "每日簽到", - "今日已签到,累计签到": "今日已簽到,累計簽到", - "每日签到可获得随机额度奖励": "每日簽到可獲得隨機額度獎勵", - "今日已签到": "今日已簽到", - "立即签到": "立即簽到", - "正在加载签到状态...": "正在載入簽到狀態...", - "获取签到状态失败": "獲取簽到狀態失敗", - "签到成功!获得": "簽到成功!獲得", - "签到失败": "簽到失敗", - "获得": "獲得", - "累计签到": "累計簽到", - "本月获得": "本月獲得", - "累计获得": "累計獲得", - "签到奖励将直接添加到您的账户余额": "簽到獎勵將直接添加到您的帳號餘額", - "每日仅可签到一次,请勿重复签到": "每日僅可簽到一次,請勿重複簽到", - "签到设置": "簽到設定", - "签到功能允许用户每日签到获取随机额度奖励": "簽到功能允許使用者每日簽到獲取隨機額度獎勵", - "启用签到功能": "啟用簽到功能", - "签到最小额度": "簽到最小額度", - "签到奖励的最小额度": "簽到獎勵的最小額度", - "签到最大额度": "簽到最大額度", - "签到奖励的最大额度": "簽到獎勵的最大額度", - "保存签到设置": "儲存簽到設定", - "ChatCompletions→Responses 兼容配置(Beta)": "ChatCompletions→Responses 兼容設定(Beta)", - "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。": "提示:該功能為測試版,未來設定結構與功能行為可能發生變更,請勿在生產環境使用。", - "填充模板(指定渠道)": "填充模板(指定管道)", - "填充模板(全渠道)": "填充模板(全管道)", - "格式化 JSON": "格式化 JSON", - "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。": "提示:此處設定僅用於控制「模型廣場」對使用者的展示效果,不會影響模型的實際調用與路由。若需設定真實調用行為,請前往「管道管理」進行設定。", - "确认关闭提示": "確認關閉提示", - "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?": "關閉後將不再顯示此提示(僅對當前瀏覽器生效)。確定要關閉嗎?", - "关闭提示": "關閉提示", - "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。": "說明:本頁測試為非流式請求;若管道僅支援流式返回,可能出現測試失敗,請以實際使用為準。", - "Stripe/Creem 需在第三方平台创建商品并填入 ID": "Stripe/Creem 需在第三方平臺建立商品並填入 ID", - "暂无订阅套餐": "暫無訂閱", - "订阅管理": "訂閱管理", - "订阅套餐管理": "訂閱管理", - "新建套餐": "新建訂閱", - "套餐": "訂閱", - "支付渠道": "支付管道", - "购买上限": "購買上限", - "有效期": "有效期", - "禁用后用户端不再展示,但历史订单不受影响。是否继续?": "禁用後使用者端不再展示,但歷史訂單不受影響。是否繼續?", - "启用后套餐将在用户端展示。是否继续?": "啟用後訂閱將在使用者端展示。是否繼續?", - "更新套餐信息": "更新訂閱資訊", - "创建新的订阅套餐": "建立新的訂閱", - "套餐的基本信息和定价": "訂閱的基本資訊和定價", - "套餐标题": "訂閱標題", - "请输入套餐标题": "請輸入訂閱標題", - "套餐副标题": "訂閱副標題", - "例如:适合轻度使用": "例如:適合輕度使用", - "请输入金额": "請輸入金額", - "请输入总额度": "請輸入總額度", - "0 表示不限": "0 表示不限", - "原生额度": "原生額度", - "升级分组": "升級分組", - "不升级": "不升級", - "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。": "購買或手動新增訂閱會升級到該分組;當訂閱失效/過期或手動作廢/刪除後,將回退到升級前分組。回退不會立即生效,通常會有幾分鐘延遲。", - "币种": "幣種", - "由全站货币展示设置统一控制": "由全站貨幣展示設定統一控制", - "排序": "排序", - "启用状态": "啟用狀態", - "有效期设置": "有效期設定", - "配置套餐的有效时长": "設定訂閱的有效時長", - "有效期单位": "有效期單位", - "自定义秒数": "自訂秒數", - "请输入秒数": "請輸入秒數", - "有效期数值": "有效期數值", - "额度重置": "額度重置", - "支持周期性重置套餐权益额度": "支援週期性重置訂閱權益額度", - "重置周期": "重置週期", - "第三方支付配置": "第三方支付設定", - "Stripe/Creem 商品ID(可选)": "Stripe/Creem 商品ID(可選)", - "生效": "生效", - "已作废": "已作廢", - "用户订阅管理": "使用者訂閱管理", - "选择订阅套餐": "選擇訂閱", - "新增订阅": "新增訂閱", - "暂无订阅记录": "暫無訂閱記錄", - "来源": "來源", - "开始": "開始", - "结束": "結束", - "作废": "作廢", - "确认作废": "確認作廢", - "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "作廢後該訂閱將立即失效,歷史記錄不受影響。是否繼續?", - "删除会彻底移除该订阅记录(含权益明细)。是否继续?": "刪除會徹底移除該訂閱記錄(含權益明細)。是否繼續?", - "绑定订阅套餐": "綁定訂閱", - "绑定后会立即生成用户订阅(无需支付),有效期按套餐配置计算。": "綁定後會立即生成使用者訂閱(無需支付),有效期按訂閱設定計算。", - "订阅套餐": "訂閱", - "额度充值": "額度儲值", - "优先订阅": "優先訂閱", - "优先钱包": "優先錢包", - "仅用订阅": "僅用訂閱", - "仅用钱包": "僅用錢包", - "我的订阅": "我的訂閱", - "个生效中": "個生效中", - "无生效": "無生效", - "已保存偏好为": "已儲存偏好為", - ",当前无生效订阅,将自动使用钱包": ",當前無生效訂閱,將自動使用錢包", - "个已过期": "個已過期", - "订阅": "訂閱", - "至": "至", - "过期于": "過期於", - "作废于": "作廢於", - "购买套餐后即可享受模型权益": "購買訂閱後即可享受模型權益", - "限购": "限購", - "推荐": "推薦", - "已达到购买上限": "已達到購買上限", - "已达上限": "已達上限", - "立即订阅": "立即訂閱", - "暂无可购买套餐": "暫無可購買訂閱", - "该套餐未配置 Stripe": "該訂閱未設定 Stripe", - "已打开支付页面": "已打開支付頁面", - "支付失败": "支付失敗", - "该套餐未配置 Creem": "該訂閱未設定 Creem", - "已发起支付": "已發起支付", - "购买订阅套餐": "購買訂閱", - "套餐名称": "訂閱名稱", - "应付金额": "應付金額", - "支付": "支付", - "管理员未开启在线支付功能,请联系管理员配置。": "管理員未開啟在線支付功能,請聯繫管理員設定。", - "偏好设置": "偏好設定", - "界面语言和其他个人偏好": "界面語言和其他個人偏好", - "语言偏好": "語言偏好", - "选择您的首选界面语言,设置将自动保存并同步到所有设备": "選擇您的首選界面語言,設定將自動儲存並同步到所有設備", - "语言偏好已保存": "語言偏好已儲存", - "提示:语言偏好会同步到您登录的所有设备,并影响API返回的错误消息语言。": "提示:語言偏好會同步到您登錄的所有設備,並影響API返回的錯誤消息語言。", - "自定义 OAuth 提供商": "自訂 OAuth 提供商", - "配置自定义 OAuth 提供商,支持 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 协议的身份提供商": "設定自訂 OAuth 提供商,支援 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 協議的身份提供商", - "回调 URL 格式": "回調 URL 格式", - "添加提供商": "添加提供商", - "编辑提供商": "編輯提供商", - "选择预设...": "選擇設定檔...", - "输入基础 URL": "輸入基礎 URL", - "例如": "例如", - "提供商名称": "提供商名稱", - "标识符 (Slug)": "標識符 (Slug)", - "授权端点": "授權端點", - "令牌端点": "令牌端點", - "用户信息端点": "使用者資訊端點", - "用户 ID 字段": "使用者 ID 字段", - "支持 JSONPath,如 sub, id, data.user.id": "支援 JSONPath,如 sub, id, data.user.id", - "用户名字段": "使用者名字段", - "支持 JSONPath,如 preferred_username, login, data.user.username": "支援 JSONPath,如 preferred_username, login, data.user.username", - "显示名称字段": "顯示名稱字段", - "支持 JSONPath,如 name, display_name, data.user.name": "支援 JSONPath,如 name, display_name, data.user.name", - "邮箱字段": "信箱字段", - "支持 JSONPath,如 email, data.user.email": "支援 JSONPath,如 email, data.user.email", - "授权范围 (Scopes)": "授權範圍 (Scopes)", - "认证方式": "認證方式", - "参数传递": "參數傳遞", - "Basic Auth 头": "Basic Auth 頭", - "暂无自定义 OAuth 提供商": "暫無自訂 OAuth 提供商", - "确定要删除该提供商吗?": "確定要刪除該提供商嗎?", - "确定要解绑 {{name}} 吗?": "確定要解綁 {{name}} 嗎?", - "解绑成功": "解綁成功", - "{{name}} ID": "{{name}} ID", - "使用 {{name}} 继续": "使用 {{name}} 繼續", - "端点 URL 必须以 http:// 或 https:// 开头:": "端點 URL 必須以 http:// 或 https:// 開頭:", - "OAuth 配置错误:授权端点必须是完整的 URL(以 http:// 或 https:// 开头)": "OAuth 設定錯誤:授權端點必須是完整的 URL(以 http:// 或 https:// 開頭)", - "OAuth 登录失败:": "OAuth 登錄失敗:", - "必填:请输入服务器地址以自动生成完整端点 URL": "必填:請輸入伺服器位址以自動生成完整端點 URL", - "填写服务器地址后自动生成:": "填寫伺服器位址後自動生成:", - "自动生成:": "自動生成:", - "请先填写服务器地址,以自动生成完整的端点 URL": "請先填寫伺服器位址,以自動生成完整的端點 URL", - "端点 URL 必须是完整地址(以 http:// 或 https:// 开头)": "端點 URL 必須是完整位址(以 http:// 或 https:// 開頭)", - "未匹配到模型,按回车键可将「{{name}}」作为自定义模型名添加": "未匹配到模型,按下 Enter 鍵可將「{{name}}」作為自訂模型名稱新增" + "默认补全倍率": "預設補全倍率" } } diff --git a/web/src/index.jsx b/web/src/index.jsx index 5162b0cbdd..95299c065d 100644 --- a/web/src/index.jsx +++ b/web/src/index.jsx @@ -31,7 +31,12 @@ import './index.css'; import { LocaleProvider } from '@douyinfe/semi-ui'; import { useTranslation } from 'react-i18next'; import zh_CN from '@douyinfe/semi-ui/lib/es/locale/source/zh_CN'; +import zh_TW from '@douyinfe/semi-ui/lib/es/locale/source/zh_TW'; import en_GB from '@douyinfe/semi-ui/lib/es/locale/source/en_GB'; +import fr from '@douyinfe/semi-ui/lib/es/locale/source/fr'; +import ru_RU from '@douyinfe/semi-ui/lib/es/locale/source/ru_RU'; +import ja_JP from '@douyinfe/semi-ui/lib/es/locale/source/ja_JP'; +import vi_VN from '@douyinfe/semi-ui/lib/es/locale/source/vi_VN'; // 欢迎信息(二次开发者未经允许不准将此移除) // Welcome message (Do not remove this without permission from the original developer) @@ -46,7 +51,16 @@ if (typeof window !== 'undefined') { function SemiLocaleWrapper({ children }) { const { i18n } = useTranslation(); const semiLocale = React.useMemo( - () => ({ zh: zh_CN, en: en_GB })[i18n.language] || zh_CN, + () => + ({ + 'zh-CN': zh_CN, + 'zh-TW': zh_TW, + en: en_GB, + fr: fr, + ru: ru_RU, + ja: ja_JP, + vi: vi_VN, + })[i18n.language] || en_GB, [i18n.language], ); return {children}; diff --git a/web/src/pages/Setting/Dashboard/SettingsAPIInfo.jsx b/web/src/pages/Setting/Dashboard/SettingsAPIInfo.jsx index 8116cfc0fa..605dcde985 100644 --- a/web/src/pages/Setting/Dashboard/SettingsAPIInfo.jsx +++ b/web/src/pages/Setting/Dashboard/SettingsAPIInfo.jsx @@ -91,7 +91,7 @@ const SettingsAPIInfo = ({ options, refresh }) => { }); const { success, message } = res.data; if (success) { - showSuccess('API信息已更新'); + showSuccess(t('API信息已更新')); if (refresh) refresh(); } else { showError(message); @@ -106,7 +106,7 @@ const SettingsAPIInfo = ({ options, refresh }) => { setHasChanges(false); } catch (error) { console.error('API信息更新失败', error); - showError('API信息更新失败'); + showError(t('API信息更新失败')); } finally { setLoading(false); } @@ -144,7 +144,7 @@ const SettingsAPIInfo = ({ options, refresh }) => { const newList = apiInfoList.filter((api) => api.id !== deletingApi.id); setApiInfoList(newList); setHasChanges(true); - showSuccess('API信息已删除,请及时点击“保存设置”进行保存'); + showSuccess(t('API信息已删除,请及时点击”保存设置”进行保存')); } setShowDeleteModal(false); setDeletingApi(null); @@ -152,7 +152,7 @@ const SettingsAPIInfo = ({ options, refresh }) => { const handleSaveApi = async () => { if (!apiForm.url || !apiForm.route || !apiForm.description) { - showError('请填写完整的API信息'); + showError(t('请填写完整的API信息')); return; } @@ -178,11 +178,11 @@ const SettingsAPIInfo = ({ options, refresh }) => { setShowApiModal(false); showSuccess( editingApi - ? 'API信息已更新,请及时点击“保存设置”进行保存' - : 'API信息已添加,请及时点击“保存设置”进行保存', + ? t('API信息已更新,请及时点击”保存设置”进行保存') + : t('API信息已添加,请及时点击”保存设置”进行保存'), ); } catch (error) { - showError('操作失败: ' + error.message); + showError(t('操作失败: ') + error.message); } finally { setModalLoading(false); } @@ -299,7 +299,7 @@ const SettingsAPIInfo = ({ options, refresh }) => { const handleBatchDelete = () => { if (selectedRowKeys.length === 0) { - showError('请先选择要删除的API信息'); + showError(t('请先选择要删除的API信息')); return; } diff --git a/web/src/pages/Setting/Dashboard/SettingsAnnouncements.jsx b/web/src/pages/Setting/Dashboard/SettingsAnnouncements.jsx index c61102f150..2cef315b46 100644 --- a/web/src/pages/Setting/Dashboard/SettingsAnnouncements.jsx +++ b/web/src/pages/Setting/Dashboard/SettingsAnnouncements.jsx @@ -204,7 +204,7 @@ const SettingsAnnouncements = ({ options, refresh }) => { }); const { success, message } = res.data; if (success) { - showSuccess('系统公告已更新'); + showSuccess(t('系统公告已更新')); if (refresh) refresh(); } else { showError(message); @@ -219,7 +219,7 @@ const SettingsAnnouncements = ({ options, refresh }) => { setHasChanges(false); } catch (error) { console.error('系统公告更新失败', error); - showError('系统公告更新失败'); + showError(t('系统公告更新失败')); } finally { setLoading(false); } @@ -261,7 +261,7 @@ const SettingsAnnouncements = ({ options, refresh }) => { ); setAnnouncementsList(newList); setHasChanges(true); - showSuccess('公告已删除,请及时点击“保存设置”进行保存'); + showSuccess(t('公告已删除,请及时点击”保存设置”进行保存')); } setShowDeleteModal(false); setDeletingAnnouncement(null); @@ -269,7 +269,7 @@ const SettingsAnnouncements = ({ options, refresh }) => { const handleSaveAnnouncement = async () => { if (!announcementForm.content || !announcementForm.publishDate) { - showError('请填写完整的公告信息'); + showError(t('请填写完整的公告信息')); return; } @@ -302,11 +302,11 @@ const SettingsAnnouncements = ({ options, refresh }) => { setShowAnnouncementModal(false); showSuccess( editingAnnouncement - ? '公告已更新,请及时点击“保存设置”进行保存' - : '公告已添加,请及时点击“保存设置”进行保存', + ? t('公告已更新,请及时点击”保存设置”进行保存') + : t('公告已添加,请及时点击”保存设置”进行保存'), ); } catch (error) { - showError('操作失败: ' + error.message); + showError(t('操作失败: ') + error.message); } finally { setModalLoading(false); } @@ -371,7 +371,7 @@ const SettingsAnnouncements = ({ options, refresh }) => { const handleBatchDelete = () => { if (selectedRowKeys.length === 0) { - showError('请先选择要删除的系统公告'); + showError(t('请先选择要删除的系统公告')); return; } diff --git a/web/src/pages/Setting/Dashboard/SettingsFAQ.jsx b/web/src/pages/Setting/Dashboard/SettingsFAQ.jsx index 3c6f696962..156100439d 100644 --- a/web/src/pages/Setting/Dashboard/SettingsFAQ.jsx +++ b/web/src/pages/Setting/Dashboard/SettingsFAQ.jsx @@ -140,7 +140,7 @@ const SettingsFAQ = ({ options, refresh }) => { }); const { success, message } = res.data; if (success) { - showSuccess('常见问答已更新'); + showSuccess(t('常见问答已更新')); if (refresh) refresh(); } else { showError(message); @@ -155,7 +155,7 @@ const SettingsFAQ = ({ options, refresh }) => { setHasChanges(false); } catch (error) { console.error('常见问答更新失败', error); - showError('常见问答更新失败'); + showError(t('常见问答更新失败')); } finally { setLoading(false); } @@ -189,7 +189,7 @@ const SettingsFAQ = ({ options, refresh }) => { const newList = faqList.filter((item) => item.id !== deletingFaq.id); setFaqList(newList); setHasChanges(true); - showSuccess('问答已删除,请及时点击“保存设置”进行保存'); + showSuccess(t('问答已删除,请及时点击”保存设置”进行保存')); } setShowDeleteModal(false); setDeletingFaq(null); @@ -197,7 +197,7 @@ const SettingsFAQ = ({ options, refresh }) => { const handleSaveFaq = async () => { if (!faqForm.question || !faqForm.answer) { - showError('请填写完整的问答信息'); + showError(t('请填写完整的问答信息')); return; } @@ -223,11 +223,11 @@ const SettingsFAQ = ({ options, refresh }) => { setShowFaqModal(false); showSuccess( editingFaq - ? '问答已更新,请及时点击“保存设置”进行保存' - : '问答已添加,请及时点击“保存设置”进行保存', + ? t('问答已更新,请及时点击”保存设置”进行保存') + : t('问答已添加,请及时点击”保存设置”进行保存'), ); } catch (error) { - showError('操作失败: ' + error.message); + showError(t('操作失败: ') + error.message); } finally { setModalLoading(false); } @@ -290,7 +290,7 @@ const SettingsFAQ = ({ options, refresh }) => { const handleBatchDelete = () => { if (selectedRowKeys.length === 0) { - showError('请先选择要删除的常见问答'); + showError(t('请先选择要删除的常见问答')); return; } diff --git a/web/src/pages/Setting/Dashboard/SettingsUptimeKuma.jsx b/web/src/pages/Setting/Dashboard/SettingsUptimeKuma.jsx index 3f3d5dd8ef..c7d0c66c92 100644 --- a/web/src/pages/Setting/Dashboard/SettingsUptimeKuma.jsx +++ b/web/src/pages/Setting/Dashboard/SettingsUptimeKuma.jsx @@ -145,7 +145,7 @@ const SettingsUptimeKuma = ({ options, refresh }) => { }); const { success, message } = res.data; if (success) { - showSuccess('Uptime Kuma配置已更新'); + showSuccess(t('Uptime Kuma配置已更新')); if (refresh) refresh(); } else { showError(message); @@ -160,7 +160,7 @@ const SettingsUptimeKuma = ({ options, refresh }) => { setHasChanges(false); } catch (error) { console.error('Uptime Kuma配置更新失败', error); - showError('Uptime Kuma配置更新失败'); + showError(t('Uptime Kuma配置更新失败')); } finally { setLoading(false); } @@ -198,7 +198,7 @@ const SettingsUptimeKuma = ({ options, refresh }) => { ); setUptimeGroupsList(newList); setHasChanges(true); - showSuccess('分类已删除,请及时点击“保存设置”进行保存'); + showSuccess(t('分类已删除,请及时点击”保存设置”进行保存')); } setShowDeleteModal(false); setDeletingGroup(null); @@ -206,19 +206,19 @@ const SettingsUptimeKuma = ({ options, refresh }) => { const handleSaveGroup = async () => { if (!uptimeForm.categoryName || !uptimeForm.url || !uptimeForm.slug) { - showError('请填写完整的分类信息'); + showError(t('请填写完整的分类信息')); return; } try { new URL(uptimeForm.url); } catch (error) { - showError('请输入有效的URL地址'); + showError(t('请输入有效的URL地址')); return; } if (!/^[a-zA-Z0-9_-]+$/.test(uptimeForm.slug)) { - showError('Slug只能包含字母、数字、下划线和连字符'); + showError(t('Slug只能包含字母、数字、下划线和连字符')); return; } @@ -245,11 +245,11 @@ const SettingsUptimeKuma = ({ options, refresh }) => { setShowUptimeModal(false); showSuccess( editingGroup - ? '分类已更新,请及时点击“保存设置”进行保存' - : '分类已添加,请及时点击“保存设置”进行保存', + ? t('分类已更新,请及时点击”保存设置”进行保存') + : t('分类已添加,请及时点击”保存设置”进行保存'), ); } catch (error) { - showError('操作失败: ' + error.message); + showError(t('操作失败: ') + error.message); } finally { setModalLoading(false); } @@ -312,7 +312,7 @@ const SettingsUptimeKuma = ({ options, refresh }) => { const handleBatchDelete = () => { if (selectedRowKeys.length === 0) { - showError('请先选择要删除的分类'); + showError(t('请先选择要删除的分类')); return; } diff --git a/web/src/pages/Setting/Operation/SettingsChannelAffinity.jsx b/web/src/pages/Setting/Operation/SettingsChannelAffinity.jsx index 18e2cfbdc5..eef73d9c71 100644 --- a/web/src/pages/Setting/Operation/SettingsChannelAffinity.jsx +++ b/web/src/pages/Setting/Operation/SettingsChannelAffinity.jsx @@ -52,6 +52,7 @@ import { verifyJSON, } from '../../../helpers'; import { useTranslation } from 'react-i18next'; +import i18next from 'i18next'; const KEY_ENABLED = 'channel_affinity_setting.enabled'; const KEY_SWITCH_ON_SUCCESS = 'channel_affinity_setting.switch_on_success'; @@ -91,7 +92,7 @@ const RULE_TEMPLATES = { }; const CONTEXT_KEY_PRESETS = [ - { key: 'id', label: 'id(用户 ID)' }, + { key: 'id', label: i18next.t('id(用户 ID)') }, { key: 'token_id', label: 'token_id' }, { key: 'token_key', label: 'token_key' }, { key: 'token_group', label: 'token_group' }, @@ -785,7 +786,7 @@ export default function SettingsChannelAffinity(props) { field={KEY_MAX_ENTRIES} label={t('最大条目数')} min={0} - placeholder='例如 100000…' + placeholder={t('例如 100000…')} extraText={ {t( @@ -806,7 +807,7 @@ export default function SettingsChannelAffinity(props) { field={KEY_DEFAULT_TTL} label={t('默认 TTL(秒)')} min={0} - placeholder='例如 3600…' + placeholder={t('例如 3600…')} extraText={ {t( @@ -936,7 +937,7 @@ export default function SettingsChannelAffinity(props) { field='name' label={t('名称')} extraText={t('规则名称(可读性更好,也会出现在管理侧日志中)。')} - placeholder='例如 prefer-by-conversation-id…' + placeholder={t('例如 prefer-by-conversation-id…')} rules={[{ required: true }]} onChange={(value) => setEditingRule((prev) => ({ ...(prev || {}), name: value })) @@ -1019,7 +1020,7 @@ export default function SettingsChannelAffinity(props) { diff --git a/web/src/pages/Setting/Operation/SettingsGeneral.jsx b/web/src/pages/Setting/Operation/SettingsGeneral.jsx index 8b9a621da1..74a09026ae 100644 --- a/web/src/pages/Setting/Operation/SettingsGeneral.jsx +++ b/web/src/pages/Setting/Operation/SettingsGeneral.jsx @@ -295,7 +295,9 @@ export default function GeneralSettings(props) { field={'token_setting.max_user_tokens'} step={1} min={1} - extraText={t('每个用户最多可创建的令牌数量,默认 1000,设置过大可能会影响性能')} + extraText={t( + '每个用户最多可创建的令牌数量,默认 1000,设置过大可能会影响性能', + )} placeholder={'1000'} onChange={handleFieldChange('token_setting.max_user_tokens')} /> diff --git a/web/src/pages/Setting/Ratio/ModelSettingsVisualEditor.jsx b/web/src/pages/Setting/Ratio/ModelSettingsVisualEditor.jsx index b5ad3e58d5..5fd17e2126 100644 --- a/web/src/pages/Setting/Ratio/ModelSettingsVisualEditor.jsx +++ b/web/src/pages/Setting/Ratio/ModelSettingsVisualEditor.jsx @@ -155,7 +155,7 @@ export default function ModelSettingsVisualEditor(props) { if (results.includes(undefined)) return; } else if (requestQueue.length > 1) { if (results.includes(undefined)) { - return showError('部分保存失败,请重试'); + return showError(t('部分保存失败,请重试')); } } @@ -166,11 +166,11 @@ export default function ModelSettingsVisualEditor(props) { } } - showSuccess('保存成功'); + showSuccess(t('保存成功')); props.refresh(); } catch (error) { console.error('保存失败:', error); - showError('保存失败,请重试'); + showError(t('保存失败,请重试')); } finally { setLoading(false); } @@ -254,7 +254,7 @@ export default function ModelSettingsVisualEditor(props) { const updateModel = (name, field, value) => { if (isNaN(value)) { - showError('请输入数字'); + showError(t('请输入数字')); return; } setModels((prev) => @@ -282,7 +282,7 @@ export default function ModelSettingsVisualEditor(props) { completionTokenPrice, ) => { if (!modelTokenPrice || modelTokenPrice === '0') { - showError('模型价格不能为0'); + showError(t('模型价格不能为0')); return ''; } return completionTokenPrice / modelTokenPrice; diff --git a/web/src/pages/Setting/Ratio/UpstreamRatioSync.jsx b/web/src/pages/Setting/Ratio/UpstreamRatioSync.jsx index 20ea45e9eb..6c27776fa4 100644 --- a/web/src/pages/Setting/Ratio/UpstreamRatioSync.jsx +++ b/web/src/pages/Setting/Ratio/UpstreamRatioSync.jsx @@ -63,7 +63,8 @@ const MODELS_DEV_PRESET_NAME = 'models.dev 价格预设'; const MODELS_DEV_PRESET_BASE_URL = 'https://models.dev'; const MODELS_DEV_PRESET_ENDPOINT = 'https://models.dev/api.json'; -function ConflictConfirmModal({ t, visible, items, onOk, onCancel }) { +function ConflictConfirmModal({ visible, items, onOk, onCancel }) { + const { t } = useTranslation(); const isMobile = useIsMobile(); const columns = [ { title: t('渠道'), dataIndex: 'channel' }, @@ -859,7 +860,6 @@ export default function UpstreamRatioSync(props) { {