Преглед изворни кода

feat(i18n): 全面国际化前端硬编码中文文本

将 14 个源码文件中的硬编码中文 UI 文本统一包裹到 t()/i18n.t() 调用,
覆盖登录注册、首页、设置页、工具函数等核心模块,并为 7 个语言文件
补充约 80+ 翻译键;修复 zh-CN.json 值误用繁体问题。

Co-Authored-By: Claude <noreply@anthropic.com>
feat/alipay-payment
fengsilin пре 3 недеља
родитељ
комит
befde35afa
25 измењених фајлова са 797 додато и 211 уклоњено
  1. +21
    -21
      web/src/components/auth/LoginForm.jsx
  2. +11
    -11
      web/src/components/auth/RegisterForm.jsx
  3. +28
    -26
      web/src/components/auth/TwoFAVerification.jsx
  4. +1
    -1
      web/src/components/layout/SiderBar.jsx
  5. +3
    -1
      web/src/components/settings/ChatsSetting.jsx
  6. +11
    -9
      web/src/components/settings/DashboardSetting.jsx
  7. +3
    -1
      web/src/components/settings/DrawingSetting.jsx
  8. +3
    -1
      web/src/components/settings/OperationSetting.jsx
  9. +10
    -10
      web/src/components/settings/OtherSetting.jsx
  10. +3
    -1
      web/src/components/settings/PerformanceSetting.jsx
  11. +1
    -1
      web/src/components/topup/index.jsx
  12. +15
    -14
      web/src/helpers/utils.jsx
  13. +2
    -2
      web/src/hooks/redemptions/useRedemptionsData.jsx
  14. +1
    -1
      web/src/hooks/usage-logs/useUsageLogsData.jsx
  15. +94
    -24
      web/src/i18n/locales/en.json
  16. +88
    -1
      web/src/i18n/locales/fr.json
  17. +88
    -1
      web/src/i18n/locales/ja.json
  18. +88
    -1
      web/src/i18n/locales/ru.json
  19. +85
    -2
      web/src/i18n/locales/vi.json
  20. +131
    -61
      web/src/i18n/locales/zh-CN.json
  21. +88
    -1
      web/src/i18n/locales/zh-TW.json
  22. +3
    -1
      web/src/pages/Chat2Link/index.jsx
  23. +6
    -6
      web/src/pages/Home/components/ToolsSection.jsx
  24. +3
    -3
      web/src/pages/Home/index.jsx
  25. +10
    -10
      web/src/pages/Setting/Dashboard/SettingsUptimeKuma.jsx

+ 21
- 21
web/src/components/auth/LoginForm.jsx Прегледај датотеку

@@ -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);
@@ -885,7 +885,7 @@ const LoginForm = () => {
}}
>
<div className='flex flex-col items-center'>
<img src={status.wechat_qrcode} alt='微信二维码' className='mb-4' />
<img src={status.wechat_qrcode} alt={t('微信二维码')} className='mb-4' />
</div>

<div className='text-center mb-4'>
@@ -928,7 +928,7 @@ const LoginForm = () => {
/>
</svg>
</div>
两步验证
{t('两步验证')}
</div>
}
visible={showTwoFA}


+ 11
- 11
web/src/components/auth/RegisterForm.jsx Прегледај датотеку

@@ -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);
}
@@ -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('登录失败,请重试'));
}
};



+ 28
- 26
web/src/components/auth/TwoFAVerification.jsx Прегледај датотеку

@@ -26,25 +26,27 @@ import {
Typography,
} from '@douyinfe/semi-ui';
import React, { useState } from 'react';
import { useTranslation } from 'react-i18next';

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,14 @@ const TwoFAVerification = ({ onSuccess, onBack, isModal = false }) => {
return (
<div className='space-y-4'>
<Paragraph className='text-gray-600 dark:text-gray-300'>
请输入认证器应用显示的验证码完成登录
{t('请输入认证器应用显示的验证码完成登录')}
</Paragraph>

<Form onSubmit={handleSubmit}>
<Form.Input
field='code'
label={useBackupCode ? '备用码' : '验证码'}
placeholder={useBackupCode ? '请输入8位备用码' : '请输入6位验证码'}
label={useBackupCode ? t('备用码') : t('验证码')}
placeholder={useBackupCode ? t('请输入8位备用码') : t('请输入6位验证码')}
value={verificationCode}
onChange={setVerificationCode}
onKeyPress={handleKeyPress}
@@ -105,7 +107,7 @@ const TwoFAVerification = ({ onSuccess, onBack, isModal = false }) => {
size='large'
style={{ marginBottom: 16 }}
>
验证并登录
{t('验证并登录')}
</Button>
</Form>

@@ -121,7 +123,7 @@ const TwoFAVerification = ({ onSuccess, onBack, isModal = false }) => {
}}
style={{ marginRight: 16, color: '#1890ff', padding: 0 }}
>
{useBackupCode ? '使用认证器验证码' : '使用备用码'}
{useBackupCode ? t('使用认证器验证码') : t('使用备用码')}
</Button>

{onBack && (
@@ -131,19 +133,19 @@ const TwoFAVerification = ({ onSuccess, onBack, isModal = false }) => {
onClick={onBack}
style={{ color: '#1890ff', padding: 0 }}
>
返回登录
{t('返回登录')}
</Button>
)}
</div>

<div className='bg-gray-50 dark:bg-gray-800 rounded-lg p-3'>
<Text size='small' type='secondary'>
<strong>提示:</strong>
<strong>{t('提示:')}</strong>
<br />
• 验证码每30秒更新一次
{t('• 验证码每30秒更新一次')}
<br />
• 如果无法获取验证码,请使用备用码
<br />• 每个备用码只能使用一次
{t('• 如果无法获取验证码,请使用备用码')}
<br />{t('• 每个备用码只能使用一次')}
</Text>
</div>
</div>
@@ -161,17 +163,17 @@ const TwoFAVerification = ({ onSuccess, onBack, isModal = false }) => {
>
<Card style={{ width: 400, padding: 24 }}>
<div style={{ textAlign: 'center', marginBottom: 24 }}>
<Title heading={3}>两步验证</Title>
<Title heading={3}>{t('两步验证')}</Title>
<Paragraph type='secondary'>
请输入认证器应用显示的验证码完成登录
{t('请输入认证器应用显示的验证码完成登录')}
</Paragraph>
</div>

<Form onSubmit={handleSubmit}>
<Form.Input
field='code'
label={useBackupCode ? '备用码' : '验证码'}
placeholder={useBackupCode ? '请输入8位备用码' : '请输入6位验证码'}
label={useBackupCode ? t('备用码') : t('验证码')}
placeholder={useBackupCode ? t('请输入8位备用码') : t('请输入6位验证码')}
value={verificationCode}
onChange={setVerificationCode}
onKeyPress={handleKeyPress}
@@ -188,7 +190,7 @@ const TwoFAVerification = ({ onSuccess, onBack, isModal = false }) => {
size='large'
style={{ marginBottom: 16 }}
>
验证并登录
{t('验证并登录')}
</Button>
</Form>

@@ -204,7 +206,7 @@ const TwoFAVerification = ({ onSuccess, onBack, isModal = false }) => {
}}
style={{ marginRight: 16, color: '#1890ff', padding: 0 }}
>
{useBackupCode ? '使用认证器验证码' : '使用备用码'}
{useBackupCode ? t('使用认证器验证码') : t('使用备用码')}
</Button>

{onBack && (
@@ -214,7 +216,7 @@ const TwoFAVerification = ({ onSuccess, onBack, isModal = false }) => {
onClick={onBack}
style={{ color: '#1890ff', padding: 0 }}
>
返回登录
{t('返回登录')}
</Button>
)}
</div>
@@ -228,12 +230,12 @@ const TwoFAVerification = ({ onSuccess, onBack, isModal = false }) => {
}}
>
<Text size='small' type='secondary'>
<strong>提示:</strong>
<strong>{t('提示:')}</strong>
<br />
• 验证码每30秒更新一次
{t('• 验证码每30秒更新一次')}
<br />
• 如果无法获取验证码,请使用备用码
<br />• 每个备用码只能使用一次
{t('• 如果无法获取验证码,请使用备用码')}
<br />{t('• 每个备用码只能使用一次')}
</Text>
</div>
</Card>


+ 1
- 1
web/src/components/layout/SiderBar.jsx Прегледај датотеку

@@ -266,7 +266,7 @@ const SiderBar = ({ onNavigate = () => {} }) => {
updateRouterMapWithChats(chats);
}
} catch (e) {
showError('聊天数据解析失败');
showError(t('聊天数据解析失败'));
}
}
}, []);


+ 3
- 1
web/src/components/settings/ChatsSetting.jsx Прегледај датотеку

@@ -19,10 +19,12 @@ For commercial licensing, please contact support@quantumnous.com

import React, { useEffect, useState } from 'react';
import { Card, Spin } from '@douyinfe/semi-ui';
import { useTranslation } from 'react-i18next';
import SettingsChats from '../../pages/Setting/Chat/SettingsChats';
import { API, showError, toBoolean } from '../../helpers';

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);
}


+ 11
- 9
web/src/components/settings/DashboardSetting.jsx Прегледај датотеку

@@ -19,6 +19,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 { useTranslation } from 'react-i18next';
import { API, showError, showSuccess, toBoolean } from '../../helpers';
import SettingsAPIInfo from '../../pages/Setting/Dashboard/SettingsAPIInfo';
import SettingsAnnouncements from '../../pages/Setting/Dashboard/SettingsAnnouncements';
@@ -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,18 @@ const DashboardSetting = () => {
<Spin spinning={loading} size='large'>
{/* 用于迁移检测的旧键模态框,下个版本会删除 */}
<Modal
title='配置迁移确认'
title={t('配置迁移确认')}
visible={showMigrateModal}
onOk={handleMigrate}
onCancel={() => setShowMigrateModal(false)}
confirmLoading={loading}
okText='确认迁移'
cancelText='取消'
okText={t('确认迁移')}
cancelText={t('取消')}
>
<p>检测到旧版本的配置数据,是否要迁移到新的配置格式?</p>
<p>{t('检测到旧版本的配置数据,是否要迁移到新的配置格式?')}</p>
<p style={{ color: '#f57c00', marginTop: '10px' }}>
<strong>注意:</strong>
迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。
<strong>{t('注意:')}</strong>
{t('迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。')}
</p>
</Modal>



+ 3
- 1
web/src/components/settings/DrawingSetting.jsx Прегледај датотеку

@@ -19,10 +19,12 @@ For commercial licensing, please contact support@quantumnous.com

import React, { useEffect, useState } from 'react';
import { Card, Spin } from '@douyinfe/semi-ui';
import { useTranslation } from 'react-i18next';
import SettingsDrawing from '../../pages/Setting/Drawing/SettingsDrawing';
import { API, showError, toBoolean } from '../../helpers';

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);
}


+ 3
- 1
web/src/components/settings/OperationSetting.jsx Прегледај датотеку

@@ -19,6 +19,7 @@ For commercial licensing, please contact support@quantumnous.com

import React, { useEffect, useState } from 'react';
import { Card, Spin } from '@douyinfe/semi-ui';
import { useTranslation } from 'react-i18next';
import SettingsGeneral from '../../pages/Setting/Operation/SettingsGeneral';
import SettingsHeaderNavModules from '../../pages/Setting/Operation/SettingsHeaderNavModules';
import SettingsSidebarModulesAdmin from '../../pages/Setting/Operation/SettingsSidebarModulesAdmin';
@@ -31,6 +32,7 @@ import SettingsRegionSync from '../../pages/Setting/Operation/SettingsRegionSync
import { API, showError, toBoolean } from '../../helpers';

const OperationSetting = () => {
const { t } = useTranslation();
let [inputs, setInputs] = useState({
/* 额度相关 */
QuotaForNewUser: 0,
@@ -130,7 +132,7 @@ const OperationSetting = () => {
await getOptions();
// showSuccess('刷新成功');
} catch (error) {
showError('刷新失败');
showError(t('刷新失败'));
} finally {
setLoading(false);
}


+ 10
- 10
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 }));
}
@@ -260,7 +260,7 @@ const OtherSetting = () => {

const { tag_name, body } = res;
if (tag_name === statusState?.status?.version) {
showSuccess(`已是最新版本:${tag_name}`);
showSuccess(t('已是最新版本') + `:${tag_name}`);
} else {
setUpdateData({
tag_name: tag_name,
@@ -270,7 +270,7 @@ const OtherSetting = () => {
}
} catch (error) {
console.error('Failed to check for updates:', error);
showError('检查更新失败,请稍后再试');
showError(t('检查更新失败,请稍后再试'));
} finally {
setLoadingInput((loadingInput) => ({
...loadingInput,


+ 3
- 1
web/src/components/settings/PerformanceSetting.jsx Прегледај датотеку

@@ -19,10 +19,12 @@ For commercial licensing, please contact support@quantumnous.com

import React, { useEffect, useState } from 'react';
import { Card, Spin } from '@douyinfe/semi-ui';
import { useTranslation } from 'react-i18next';
import SettingsPerformance from '../../pages/Setting/Performance/SettingsPerformance';
import { API, showError, toBoolean } from '../../helpers';

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);
}


+ 1
- 1
web/src/components/topup/index.jsx Прегледај датотеку

@@ -234,7 +234,7 @@ const TopUp = () => {
}

if (topUpCount < minTopUp) {
showError('充值数量不能小于' + minTopUp);
showError(t('充值数量不能小于') + minTopUp);
return;
}
setConfirmLoading(true);


+ 15
- 14
web/src/helpers/utils.jsx Прегледај датотеку

@@ -27,6 +27,7 @@ import {
} from '../constants/playground.constants';
import { TABLE_COMPACT_MODES_KEY } from '../constants';
import { MOBILE_BREAKPOINT } from '../hooks/common/useIsMobile';
import i18n from '../i18n/i18n';

const HTMLToastContent = ({ htmlContent }) => {
return <div dangerouslySetInnerHTML={{ __html: htmlContent }} />;
@@ -131,22 +132,22 @@ export function showError(error) {
window.location.href = '/login?expired=true';
break;
case 429:
Toast.error('错误:请求次数过多,请稍后再试!');
Toast.error(i18n.t('错误:请求次数过多,请稍后再试!'));
break;
case 500:
Toast.error('错误:服务器内部错误,请联系管理员!');
Toast.error(i18n.t('错误:服务器内部错误,请联系管理员!'));
break;
case 405:
Toast.info('本站仅作演示之用,无服务端!');
Toast.info(i18n.t('本站仅作演示之用,无服务端!'));
break;
default:
Toast.error('错误:' + error.message);
Toast.error(i18n.t('错误:') + error.message);
}
return;
}
Toast.error('错误:' + error.message);
Toast.error(i18n.t('错误:') + error.message);
} else {
Toast.error('错误:' + error);
Toast.error(i18n.t('错误:') + error);
}
}

@@ -292,7 +293,7 @@ export function verifyJSONPromise(value) {
JSON.parse(value);
return Promise.resolve();
} catch (e) {
return Promise.reject('不是合法的 JSON 字符串');
return Promise.reject(i18n.t('不是合法的 JSON 字符串'));
}
}

@@ -527,19 +528,19 @@ export const getRelativeTime = (publishDate) => {

// 根据时间差返回相应的描述
if (diffSeconds < 60) {
return '刚刚';
return i18n.t('刚刚');
} else if (diffMinutes < 60) {
return `${diffMinutes} 分钟前`;
return `${diffMinutes} ${i18n.t('分钟前')}`;
} else if (diffHours < 24) {
return `${diffHours} 小时前`;
return `${diffHours} ${i18n.t('小时前')}`;
} else if (diffDays < 7) {
return `${diffDays} 天前`;
return `${diffDays} ${i18n.t('天前')}`;
} else if (diffWeeks < 4) {
return `${diffWeeks} 周前`;
return `${diffWeeks} ${i18n.t('周前')}`;
} else if (diffMonths < 12) {
return `${diffMonths} 个月前`;
return `${diffMonths} ${i18n.t('个月前')}`;
} else if (diffYears < 2) {
return '1 年前';
return i18n.t('1 年前');
} else {
// 超过2年显示具体日期
return formatDateString(pubDate);


+ 2
- 2
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',
});


+ 1
- 1
web/src/hooks/usage-logs/useUsageLogsData.jsx Прегледај датотеку

@@ -708,7 +708,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 });
}


+ 94
- 24
web/src/i18n/locales/en.json Прегледај датотеку

@@ -1113,9 +1113,9 @@
"按价格设置": "Set by price",
"按倍率类型筛选": "Filter by ratio type",
"按倍率设置": "Set by ratio",
"按次计费": "Pay per view",
"按次计费": "By Call",
"按照如下格式输入:AccessKey|SecretAccessKey|Region": "Enter in the format: AccessKey|SecretAccessKey|Region",
"按量计费": "Pay as you go",
"按量计费": "By Tokens",
"按顺序替换content中的变量占位符": "Replace variable placeholders in content in order",
"换脸": "Face swap",
"授权,需在遵守": " and must be used in compliance with the ",
@@ -1211,7 +1211,7 @@
"文字输入": "Text input",
"文字输出": "text output",
"文心一言": "ERNIE Bot",
"文档": "Documentation",
"文档": "Docs",
"文档地址": "Document Link",
"文生视频": "Text-to-video",
"新增供应商": "Add vendor",
@@ -1408,7 +1408,7 @@
"查看渠道密钥": "View channel key",
"查看详情": "View Details",
"查询": "Query",
"标签": "Label",
"标签": "Tags",
"标签不能为空!": "Label cannot be empty!",
"标签信息": "Tag Information",
"标签名称": "Tag Name",
@@ -2034,7 +2034,7 @@
"计算费用中...": "Calculating fees...",
"计费开始": "Billing Start",
"计费模式": "Billing mode",
"计费类型": "Billing type",
"计费类型": "Billing Type",
"计费过程": "Billing process",
"订单号": "Order No.",
"讯飞星火": "Spark Desk",
@@ -2221,7 +2221,7 @@
"请输入有效的JSON格式的请求体。您可以参考预览面板中的默认请求体格式。": "Please enter a valid JSON format request body. You can refer to the default request body format in the preview panel.",
"请输入有效的数字": "Please enter a valid number",
"请输入有效的镜像地址": "Please enter a valid image address",
"请输入标签名称": "Please enter the tag name",
"请输入标签名称": "Please enter tag name",
"请输入模型倍率": "Enter model ratio",
"请输入模型倍率和补全倍率": "Please enter model ratio and completion ratio",
"请输入模型名称": "Please enter the model name",
@@ -2840,25 +2840,11 @@
"渠道定价": "Channel Pricing",
"标签管理": "Tag Management",
"添加标签": "Add Tag",
"编辑标签": "Edit Tag",
"标签名称": "Tag Name",
"颜色": "Color",
"描述": "Description",
"排序": "Sort Order",
"确定删除此标签?": "Are you sure to delete this tag?",
"请输入标签名称": "Please enter tag name",
"计费类型": "Billing Type",
"按量计费": "By Tokens",
"按次计费": "By Call",
"输入倍率": "Input Ratio",
"输出倍率": "Output Ratio",
"固定价格": "Fixed Price",
"标签": "Tags",
"已配置": "Configured",
"渠道数量": "Channel Count",
"收起": "Collapse",
"展开": "Expand",
"渠道": "Channel",
"按量": "Tokens",
"按次": "Call",
"编辑渠道定价": "Edit Channel Pricing",
@@ -2908,17 +2894,101 @@
"立即接入,统一控制访问策略与调用成本,为产品带来稳定、可扩展的智能体验。": "Start now. Unified access control and cost management for stable, scalable AI experiences.",
"立即开始": "Get Started",
"查看文档": "Documentation",
"文档": "Docs",
"关于": "About",
"服务条款": "Terms of Service",
"使用政策": "Usage Policy",
"版权所有": "All rights reserved",
"实时调度": "Real-time Scheduling",
"健康度与延迟权重动态切换,保证最优响应。": "Dynamic health and latency switching for optimal response.",
"统一监控": "Unified Monitoring",
"调用、费用、异常一站式可视化,随时掌握运行状态。": "One-stop visualization for calls, costs, and anomalies.",
"智能限流": "Smart Rate Limiting",
"多维策略保障核心业务优先级,避免突发拥堵。": "Multi-dimensional policies ensure core business priority and prevent congestion.",
"设计版本": "b80c3466cb6feafeb3990c7820e10e50"
"设计版本": "b80c3466cb6feafeb3990c7820e10e50",
"备用码必须是8位": "Backup code must be 8 characters",
"验证码必须是6位数字": "Verification code must be 6 digits",
"请输入认证器应用显示的验证码完成登录": "Please enter the verification code shown in your authenticator app to complete login",
"备用码": "Backup code",
"请输入8位备用码": "Please enter the 8-digit backup code",
"请输入6位验证码": "Please enter the 6-digit verification code",
"验证并登录": "Verify and login",
"使用认证器验证码": "Use authenticator code",
"使用备用码": "Use backup code",
"提示:": "Tip:",
"• 验证码每30秒更新一次": "• Verification code updates every 30 seconds",
"• 如果无法获取验证码,请使用备用码": "• If you cannot get the verification code, please use the backup code",
"• 每个备用码只能使用一次": "• Each backup code can only be used once",
"正在加载,请稍候...": "Loading, please wait...",
"配置迁移确认": "Configuration Migration Confirmation",
"确认迁移": "Confirm Migration",
"检测到旧版本的配置数据,是否要迁移到新的配置格式?": "Legacy configuration data detected. Do you want to migrate to the new configuration format?",
"注意:": "Note:",
"迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。": "The migration process will automatically handle data format conversion. After migration, the old configuration will be cleared. Please back up the old configuration in the database before migrating.",
"旧配置迁移完成": "Legacy configuration migration completed",
"迁移失败": "Migration failed",
"加载首页内容失败...": "Failed to load homepage content...",
"AI编程": "AI Coding",
"无缝支持AI编程工具,涵盖顶级模型。": "Seamlessly supports AI coding tools, covering top-tier models.",
"创作": "Creation",
"顶级多模态模型,统一API使用。天然支持业务出海,跨境电商。": "Top-tier multimodal models with unified API usage. Naturally supports global business expansion and cross-border e-commerce.",
"龙虾": "OpenClaw",
"无缝接入龙虾,顶级模型构建聪明大脑。": "Seamlessly connect to OpenClaw and build smart brains with top-tier models.",
"文本": "Text",
"图像": "Image",
"音频": "Audio",
"嵌入": "Embedding",
"重排序": "Rerank",
"视觉": "Vision",
"模型类型": "Model Type",
"安全可控": "Secure and Controllable",
"可覆盖模型": "Models Covered",
"SLA 可用性": "SLA Availability",
"多区域节点": "Multi-Region Nodes",
"原生支持\n极致工具链": "Native Support\nUltimate Toolchain",
"深度优化 API 路由,确保在 CLI 环境下依然拥有流畅的流式交互体验。": "Deeply optimized API routing ensures a smooth streaming interaction experience even in CLI environments.",
"错误:请求次数过多,请稍后再试!": "Error: Too many requests, please try again later!",
"错误:服务器内部错误,请联系管理员!": "Error: Internal server error, please contact the administrator!",
"本站仅作演示之用,无服务端!": "This site is for demonstration purposes only, no backend server!",
"错误:": "Error: ",
"刚刚": "Just now",
"分钟前": "minutes ago",
"小时前": "hours ago",
"周前": "weeks ago",
"个月前": "months ago",
"1 年前": "1 year ago",
"登录失败,请重试": "Login failed, please try again",
"请输入用户名和密码!": "Please enter username and password!",
"您正在使用默认密码!": "You are using the default password!",
"请立刻修改默认密码!": "Please change the default password immediately!",
"当前环境无法使用 Passkey 登录": "Passkey login is not available in this environment",
"当前浏览器不支持 Passkey": "Your browser does not support Passkey",
"无法发起 Passkey 登录": "Unable to initiate Passkey login",
"Passkey 验证失败,请重试": "Passkey verification failed, please try again",
"Passkey 登录失败,请重试": "Passkey login failed, please try again",
"已取消 Passkey 登录": "Passkey login cancelled",
"微信二维码": "WeChat QR Code",
"密码长度不得小于 8 位!": "Password must be at least 8 characters!",
"注册成功!": "Registration successful!",
"注册失败,请重试": "Registration failed, please try again",
"验证码发送成功,请检查你的邮箱!": "Verification code sent successfully, please check your email!",
"发送验证码失败,请重试": "Failed to send verification code, please try again",
"聊天数据解析失败": "Chat data parsing failed",
"Uptime Kuma配置已更新": "Uptime Kuma configuration updated",
"Uptime Kuma配置更新失败": "Uptime Kuma configuration update failed",
"分类已删除,请及时点击\"保存设置\"进行保存": "Category deleted, please click \"Save Settings\" to save",
"请填写完整的分类信息": "Please fill in complete category information",
"请输入有效的URL地址": "Please enter a valid URL",
"Slug只能包含字母、数字、下划线和连字符": "Slug can only contain letters, numbers, underscores and hyphens",
"分类已更新,请及时点击\"保存设置\"进行保存": "Category updated, please click \"Save Settings\" to save",
"分类已添加,请及时点击\"保存设置\"进行保存": "Category added, please click \"Save Settings\" to save",
"请先选择要删除的分类": "Please select a category to delete first",
"Logo 已更新": "Logo updated",
"Logo 更新失败": "Logo update failed",
"首页内容已更新": "Homepage content updated",
"首页内容更新失败": "Homepage content update failed",
"关于内容已更新": "About content updated",
"关于内容更新失败": "About content update failed",
"页脚内容已更新": "Footer content updated",
"页脚内容更新失败": "Footer content update failed",
"已是最新版本": "Already the latest version",
"检查更新失败,请稍后再试": "Update check failed, please try again later"
}
}

+ 88
- 1
web/src/i18n/locales/fr.json Прегледај датотеку

@@ -2737,6 +2737,93 @@
"缓存写": "É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"
"设计版本": "b80c3466cb6feafeb3990c7820e10e50",
"备用码必须是8位": "Le code de secours doit contenir 8 caractères",
"验证码必须是6位数字": "Le code de vérification doit être de 6 chiffres",
"请输入认证器应用显示的验证码完成登录": "Veuillez saisir le code de vérification affiché dans votre application d'authentification pour terminer la connexion",
"备用码": "Code de secours",
"请输入8位备用码": "Veuillez saisir le code de secours de 8 caractères",
"请输入6位验证码": "Veuillez saisir le code de vérification de 6 chiffres",
"验证并登录": "Vérifier et se connecter",
"使用认证器验证码": "Utiliser le code de l'authentificateur",
"使用备用码": "Utiliser le code de secours",
"提示:": "Astuce :",
"• 验证码每30秒更新一次": "• Le code de vérification se met à jour toutes les 30 secondes",
"• 如果无法获取验证码,请使用备用码": "• Si vous ne pouvez pas obtenir le code de vérification, veuillez utiliser le code de secours",
"• 每个备用码只能使用一次": "• Chaque code de secours ne peut être utilisé qu'une seule fois",
"正在加载,请稍候...": "Chargement, veuillez patienter...",
"配置迁移确认": "Confirmation de migration de configuration",
"确认迁移": "Confirmer la migration",
"检测到旧版本的配置数据,是否要迁移到新的配置格式?": "Des données de configuration d'ancienne version ont été détectées. Voulez-vous migrer vers le nouveau format de configuration ?",
"注意:": "Remarque :",
"迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。": "Le processus de migration gérera automatiquement la conversion du format de données. Après la migration, l'ancienne configuration sera effacée. Veuillez sauvegarder l'ancienne configuration dans la base de données avant de migrer.",
"旧配置迁移完成": "Migration de l'ancienne configuration terminée",
"迁移失败": "Échec de la migration",
"加载首页内容失败...": "Échec du chargement du contenu de la page d'accueil...",
"AI编程": "Programmation IA",
"无缝支持AI编程工具,涵盖顶级模型。": "Prise en charge transparente des outils de programmation IA, couvrant les meilleurs modèles.",
"创作": "Création",
"顶级多模态模型,统一API使用。天然支持业务出海,跨境电商。": "Modèles multimodaux de premier plan avec une utilisation unifiée de l'API. Supporte naturellement l'expansion commerciale internationale et le commerce électronique transfrontalier.",
"龙虾": "OpenClaw",
"无缝接入龙虾,顶级模型构建聪明大脑。": "Connexion transparente à OpenClaw et construction de cerveaux intelligents avec les meilleurs modèles.",
"文本": "Texte",
"图像": "Image",
"音频": "Audio",
"嵌入": "Intégration",
"重排序": "Re-classement",
"视觉": "Vision",
"模型类型": "Type de modèle",
"安全可控": "Sécurisé et contrôlable",
"可覆盖模型": "Modèles couverts",
"SLA 可用性": "Disponibilité SLA",
"多区域节点": "Nœuds multi-régions",
"原生支持\n极致工具链": "Support natif\nChaîne d'outils ultime",
"深度优化 API 路由,确保在 CLI 环境下依然拥有流畅的流式交互体验。": "Routage API profondément optimisé, garantissant une expérience d'interaction fluide en mode flux même en environnement CLI.",
"错误:请求次数过多,请稍后再试!": "Erreur : Trop de requêtes, veuillez réessayer plus tard !",
"错误:服务器内部错误,请联系管理员!": "Erreur : Erreur interne du serveur, veuillez contacter l'administrateur !",
"本站仅作演示之用,无服务端!": "Ce site est uniquement destiné à la démonstration, aucun serveur backend !",
"错误:": "Erreur : ",
"刚刚": "À l'instant",
"分钟前": "minutes",
"小时前": "heures",
"周前": "semaines",
"个月前": "mois",
"1 年前": "Il y a 1 an",
"登录失败,请重试": "Échec de la connexion, veuillez réessayer",
"请输入用户名和密码!": "Veuillez saisir votre nom d'utilisateur et votre mot de passe !",
"您正在使用默认密码!": "Vous utilisez le mot de passe par défaut !",
"请立刻修改默认密码!": "Veuillez modifier immédiatement le mot de passe par défaut !",
"当前环境无法使用 Passkey 登录": "La connexion Passkey n'est pas disponible dans cet environnement",
"当前浏览器不支持 Passkey": "Votre navigateur ne supporte pas Passkey",
"无法发起 Passkey 登录": "Impossible d'initier la connexion Passkey",
"Passkey 验证失败,请重试": "Échec de la vérification Passkey, veuillez réessayer",
"Passkey 登录失败,请重试": "Échec de la connexion Passkey, veuillez réessayer",
"已取消 Passkey 登录": "Connexion Passkey annulée",
"微信二维码": "QR Code WeChat",
"密码长度不得小于 8 位!": "Le mot de passe doit contenir au moins 8 caractères !",
"注册成功!": "Inscription réussie !",
"注册失败,请重试": "Échec de l'inscription, veuillez réessayer",
"验证码发送成功,请检查你的邮箱!": "Code de vérification envoyé, veuillez vérifier votre e-mail !",
"发送验证码失败,请重试": "Échec de l'envoi du code de vérification, veuillez réessayer",
"聊天数据解析失败": "Échec de l'analyse des données de chat",
"Uptime Kuma配置已更新": "Configuration Uptime Kuma mise à jour",
"Uptime Kuma配置更新失败": "Échec de la mise à jour de la configuration Uptime Kuma",
"分类已删除,请及时点击\"保存设置\"进行保存": "Catégorie supprimée, veuillez cliquer sur \"Enregistrer\" pour sauvegarder",
"请填写完整的分类信息": "Veuillez remplir les informations de catégorie complètes",
"请输入有效的URL地址": "Veuillez saisir une URL valide",
"Slug只能包含字母、数字、下划线和连字符": "Le slug ne peut contenir que des lettres, des chiffres, des tirets bas et des tirets",
"分类已更新,请及时点击\"保存设置\"进行保存": "Catégorie mise à jour, veuillez cliquer sur \"Enregistrer\" pour sauvegarder",
"分类已添加,请及时点击\"保存设置\"进行保存": "Catégorie ajoutée, veuillez cliquer sur \"Enregistrer\" pour sauvegarder",
"请先选择要删除的分类": "Veuillez d'abord sélectionner une catégorie à supprimer",
"Logo 已更新": "Logo mis à jour",
"Logo 更新失败": "Échec de la mise à jour du logo",
"首页内容已更新": "Contenu de la page d'accueil mis à jour",
"首页内容更新失败": "Échec de la mise à jour du contenu de la page d'accueil",
"关于内容已更新": "Contenu À propos mis à jour",
"关于内容更新失败": "Échec de la mise à jour du contenu À propos",
"页脚内容已更新": "Contenu du pied de page mis à jour",
"页脚内容更新失败": "Échec de la mise à jour du contenu du pied de page",
"已是最新版本": "Déjà la dernière version",
"检查更新失败,请稍后再试": "Échec de la vérification des mises à jour, veuillez réessayer plus tard"
}
}

+ 88
- 1
web/src/i18n/locales/ja.json Прегледај датотеку

@@ -2720,6 +2720,93 @@
"缓存写": "キャッシュ書込",
"写": "書込",
"根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。": "Anthropic の仕様により、/v1/messages の入力 tokens は非キャッシュ入力のみを集計し、キャッシュ読み取り/書き込み tokens は含みません。",
"设计版本": "b80c3466cb6feafeb3990c7820e10e50"
"设计版本": "b80c3466cb6feafeb3990c7820e10e50",
"备用码必须是8位": "バックアップコードは8桁である必要があります",
"验证码必须是6位数字": "認証コードは6桁の数字である必要があります",
"请输入认证器应用显示的验证码完成登录": "認証アプリに表示されている認証コードを入力してログインを完了してください",
"备用码": "バックアップコード",
"请输入8位备用码": "8桁のバックアップコードを入力してください",
"请输入6位验证码": "6桁の認証コードを入力してください",
"验证并登录": "確認してログイン",
"使用认证器验证码": "認証アプリのコードを使用",
"使用备用码": "バックアップコードを使用",
"提示:": "ヒント:",
"• 验证码每30秒更新一次": "• 認証コードは30秒ごとに更新されます",
"• 如果无法获取验证码,请使用备用码": "• 認証コードを取得できない場合は、バックアップコードを使用してください",
"• 每个备用码只能使用一次": "• 各バックアップコードは一度のみ使用可能です",
"正在加载,请稍候...": "読み込み中です、しばらくお待ちください...",
"配置迁移确认": "設定移行の確認",
"确认迁移": "移行を確認",
"检测到旧版本的配置数据,是否要迁移到新的配置格式?": "旧バージョンの設定データが検出されました。新しい設定形式に移行しますか?",
"注意:": "注意:",
"迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。": "移行プロセスではデータ形式の変換が自動的に処理されます。移行が完了すると旧設定は削除されます。移行前にデータベースで旧設定をバックアップしてください。",
"旧配置迁移完成": "旧設定の移行が完了しました",
"迁移失败": "移行に失敗しました",
"加载首页内容失败...": "ホームページのコンテンツの読み込みに失敗しました...",
"AI编程": "AIプログラミング",
"无缝支持AI编程工具,涵盖顶级模型。": "AIプログラミングツールをシームレスにサポートし、トップモデルを網羅します。",
"创作": "創作",
"顶级多模态模型,统一API使用。天然支持业务出海,跨境电商。": "トップクラスのマルチモーダルモデルで、統一されたAPIを使用。グローバル展開や越境ECを自然にサポートします。",
"龙虾": "OpenClaw",
"无缝接入龙虾,顶级模型构建聪明大脑。": "OpenClawにシームレスに接続し、トップモデルで賢い脳を構築します。",
"文本": "テキスト",
"图像": "画像",
"音频": "音声",
"嵌入": "埋め込み",
"重排序": "再ランク付け",
"视觉": "ビジョン",
"模型类型": "モデルタイプ",
"安全可控": "安全で管理可能",
"可覆盖模型": "カバー可能モデル",
"SLA 可用性": "SLA 可用性",
"多区域节点": "マルチリージョンノード",
"原生支持\n极致工具链": "ネイティブサポート\n究極のツールチェーン",
"深度优化 API 路由,确保在 CLI 环境下依然拥有流畅的流式交互体验。": "APIルーティングを深く最適化し、CLI環境でも滑らかなストリーミング対話体験を確保します。",
"错误:请求次数过多,请稍后再试!": "エラー:リクエストが多すぎます。しばらくしてからお試しください!",
"错误:服务器内部错误,请联系管理员!": "エラー:サーバー内部エラー、管理者にお問い合わせください!",
"本站仅作演示之用,无服务端!": "このサイトはデモ専用で、バックエンドサーバーはありません!",
"错误:": "エラー:",
"刚刚": "たった今",
"分钟前": "分前",
"小时前": "時間前",
"周前": "週間前",
"个月前": "ヶ月前",
"1 年前": "1 年前",
"登录失败,请重试": "ログイン失敗、もう一度お試しください",
"请输入用户名和密码!": "ユーザー名とパスワードを入力してください!",
"您正在使用默认密码!": "デフォルトのパスワードを使用しています!",
"请立刻修改默认密码!": "デフォルトのパスワードを直ちに変更してください!",
"当前环境无法使用 Passkey 登录": "現在の環境ではPasskeyログインを使用できません",
"当前浏览器不支持 Passkey": "現在のブラウザはPasskeyをサポートしていません",
"无法发起 Passkey 登录": "Passkeyログインを開始できません",
"Passkey 验证失败,请重试": "Passkey認証に失敗しました。もう一度お試しください",
"Passkey 登录失败,请重试": "Passkeyログインに失敗しました。もう一度お試しください",
"已取消 Passkey 登录": "Passkeyログインがキャンセルされました",
"微信二维码": "WeChat QRコード",
"密码长度不得小于 8 位!": "パスワードは8文字以上である必要があります!",
"注册成功!": "登録完了!",
"注册失败,请重试": "登録に失敗しました。もう一度お試しください",
"验证码发送成功,请检查你的邮箱!": "認証コードの送信に成功しました。メールをご確認ください!",
"发送验证码失败,请重试": "認証コードの送信に失敗しました。もう一度お試しください",
"聊天数据解析失败": "チャットデータの解析に失敗しました",
"Uptime Kuma配置已更新": "Uptime Kuma設定が更新されました",
"Uptime Kuma配置更新失败": "Uptime Kuma設定の更新に失敗しました",
"分类已删除,请及时点击\"保存设置\"进行保存": "カテゴリが削除されました。「設定を保存」をクリックして保存してください",
"请填写完整的分类信息": "カテゴリ情報を完全に入力してください",
"请输入有效的URL地址": "有効なURLを入力してください",
"Slug只能包含字母、数字、下划线和连字符": "Slugには英字、数字、アンダースコア、ハイフンのみ使用できます",
"分类已更新,请及时点击\"保存设置\"进行保存": "カテゴリが更新されました。「設定を保存」をクリックして保存してください",
"分类已添加,请及时点击\"保存设置\"进行保存": "カテゴリが追加されました。「設定を保存」をクリックして保存してください",
"请先选择要删除的分类": "削除するカテゴリを先に選択してください",
"Logo 已更新": "ロゴが更新されました",
"Logo 更新失败": "ロゴの更新に失敗しました",
"首页内容已更新": "ホームページのコンテンツが更新されました",
"首页内容更新失败": "ホームページコンテンツの更新に失敗しました",
"关于内容已更新": "概要コンテンツが更新されました",
"关于内容更新失败": "概要コンテンツの更新に失敗しました",
"页脚内容已更新": "フッターコンテンツが更新されました",
"页脚内容更新失败": "フッターコンテンツの更新に失敗しました",
"已是最新版本": "最新バージョンです",
"检查更新失败,请稍后再试": "アップデートの確認に失敗しました。後でもう一度お試しください"
}
}

+ 88
- 1
web/src/i18n/locales/ru.json Прегледај датотеку

@@ -2750,6 +2750,93 @@
"缓存写": "Запись в кэш",
"写": "Запись",
"根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。": "Согласно соглашению Anthropic, входные токены /v1/messages учитывают только некэшированный ввод и не включают токены чтения/записи кэша.",
"设计版本": "b80c3466cb6feafeb3990c7820e10e50"
"设计版本": "b80c3466cb6feafeb3990c7820e10e50",
"备用码必须是8位": "Резервный код должен быть из 8 символов",
"验证码必须是6位数字": "Код подтверждения должен состоять из 6 цифр",
"请输入认证器应用显示的验证码完成登录": "Пожалуйста, введите код подтверждения из приложения-аутентификатора для завершения входа",
"备用码": "Резервный код",
"请输入8位备用码": "Пожалуйста, введите 8-значный резервный код",
"请输入6位验证码": "Пожалуйста, введите 6-значный код подтверждения",
"验证并登录": "Подтвердить и войти",
"使用认证器验证码": "Использовать код аутентификатора",
"使用备用码": "Использовать резервный код",
"提示:": "Подсказка:",
"• 验证码每30秒更新一次": "• Код подтверждения обновляется каждые 30 секунд",
"• 如果无法获取验证码,请使用备用码": "• Если вы не можете получить код подтверждения, пожалуйста, используйте резервный код",
"• 每个备用码只能使用一次": "• Каждый резервный код можно использовать только один раз",
"正在加载,请稍候...": "Загрузка, пожалуйста, подождите...",
"配置迁移确认": "Подтверждение миграции конфигурации",
"确认迁移": "Подтвердить миграцию",
"检测到旧版本的配置数据,是否要迁移到新的配置格式?": "Обнаружены данные конфигурации старой версии. Хотите перейти на новый формат конфигурации?",
"注意:": "Примечание:",
"迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。": "В процессе миграции будет выполнено автоматическое преобразование формата данных. После завершения миграции старая конфигурация будет удалена. Пожалуйста, сделайте резервную копию старой конфигурации в базе данных перед миграцией.",
"旧配置迁移完成": "Миграция старой конфигурации завершена",
"迁移失败": "Миграция не удалась",
"加载首页内容失败...": "Не удалось загрузить содержимое главной страницы...",
"AI编程": "AI-программирование",
"无缝支持AI编程工具,涵盖顶级模型。": "Бесшовная поддержка инструментов AI-программирования, охватывающая топовые модели.",
"创作": "Создание",
"顶级多模态模型,统一API使用。天然支持业务出海,跨境电商。": "Топовые мультимодальные модели с единым использованием API. Естественная поддержка международного бизнеса и трансграничной электронной коммерции.",
"龙虾": "OpenClaw",
"无缝接入龙虾,顶级模型构建聪明大脑。": "Бесшовное подключение к OpenClaw и создание умных мозгов с помощью топовых моделей.",
"文本": "Текст",
"图像": "Изображение",
"音频": "Аудио",
"嵌入": "Встраивание",
"重排序": "Переранжирование",
"视觉": "Зрение",
"模型类型": "Тип модели",
"安全可控": "Безопасность и контроль",
"可覆盖模型": "Моделей охвачено",
"SLA 可用性": "Доступность SLA",
"多区域节点": "Мультирегиональные узлы",
"原生支持\n极致工具链": "Нативная поддержка\nМаксимальный набор инструментов",
"深度优化 API 路由,确保在 CLI 环境下依然拥有流畅的流式交互体验。": "Глубоко оптимизированная маршрутизация API обеспечивает плавный потоковый интерактивный опыт даже в средах CLI.",
"错误:请求次数过多,请稍后再试!": "Ошибка: слишком много запросов, попробуйте позже!",
"错误:服务器内部错误,请联系管理员!": "Ошибка: внутренняя ошибка сервера, обратитесь к администратору!",
"本站仅作演示之用,无服务端!": "Этот сайт предназначен только для демонстрации, нет серверной части!",
"错误:": "Ошибка: ",
"刚刚": "Только что",
"分钟前": "минут назад",
"小时前": "часов назад",
"周前": "недель назад",
"个月前": "месяцев назад",
"1 年前": "1 год назад",
"登录失败,请重试": "Ошибка входа, попробуйте снова",
"请输入用户名和密码!": "Пожалуйста, введите имя пользователя и пароль!",
"您正在使用默认密码!": "Вы используете пароль по умолчанию!",
"请立刻修改默认密码!": "Немедленно измените пароль по умолчанию!",
"当前环境无法使用 Passkey 登录": "Вход через Passkey недоступен в этой среде",
"当前浏览器不支持 Passkey": "Ваш браузер не поддерживает Passkey",
"无法发起 Passkey 登录": "Не удалось инициировать вход через Passkey",
"Passkey 验证失败,请重试": "Ошибка проверки Passkey, попробуйте снова",
"Passkey 登录失败,请重试": "Ошибка входа через Passkey, попробуйте снова",
"已取消 Passkey 登录": "Вход через Passkey отменён",
"微信二维码": "QR-код WeChat",
"密码长度不得小于 8 位!": "Пароль должен быть не менее 8 символов!",
"注册成功!": "Регистрация успешна!",
"注册失败,请重试": "Ошибка регистрации, попробуйте снова",
"验证码发送成功,请检查你的邮箱!": "Код подтверждения отправлен, проверьте вашу почту!",
"发送验证码失败,请重试": "Не удалось отправить код подтверждения, попробуйте снова",
"聊天数据解析失败": "Ошибка разбора данных чата",
"Uptime Kuma配置已更新": "Конфигурация Uptime Kuma обновлена",
"Uptime Kuma配置更新失败": "Ошибка обновления конфигурации Uptime Kuma",
"分类已删除,请及时点击\"保存设置\"进行保存": "Категория удалена, нажмите \"Сохранить настройки\" для сохранения",
"请填写完整的分类信息": "Пожалуйста, заполните полную информацию о категории",
"请输入有效的URL地址": "Пожалуйста, введите корректный URL",
"Slug只能包含字母、数字、下划线和连字符": "Slug может содержать только буквы, цифры, подчёркивания и дефисы",
"分类已更新,请及时点击\"保存设置\"进行保存": "Категория обновлена, нажмите \"Сохранить настройки\" для сохранения",
"分类已添加,请及时点击\"保存设置\"进行保存": "Категория добавлена, нажмите \"Сохранить настройки\" для сохранения",
"请先选择要删除的分类": "Сначала выберите категорию для удаления",
"Logo 已更新": "Логотип обновлён",
"Logo 更新失败": "Ошибка обновления логотипа",
"首页内容已更新": "Содержимое главной страницы обновлено",
"首页内容更新失败": "Ошибка обновления содержимого главной страницы",
"关于内容已更新": "Содержимое страницы \"О нас\" обновлено",
"关于内容更新失败": "Ошибка обновления содержимого \"О нас\"",
"页脚内容已更新": "Содержимое подвала обновлено",
"页脚内容更新失败": "Ошибка обновления содержимого подвала",
"已是最新版本": "Уже последняя версия",
"检查更新失败,请稍后再试": "Не удалось проверить обновления, попробуйте позже"
}
}

+ 85
- 2
web/src/i18n/locales/vi.json Прегледај датотеку

@@ -1893,7 +1893,6 @@
"登录/注册": "Đăng nhập/Đăng ký",
"登录失败": "Đăng nhập thất bại",
"登录失败,请重试": "Đăng nhập thất bại, vui lòng thử lại",
"登录成功": "Đăng nhập thành công",
"登录成功!": "Đăng nhập thành công!",
"登录方式": "Phương thức đăng nhập",
"登录日志": "Nhật ký đăng nhập",
@@ -3296,6 +3295,90 @@
"缓存写": "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"
"设计版本": "b80c3466cb6feafeb3990c7820e10e50",
"备用码必须是8位": "Mã dự phòng phải có 8 ký tự",
"验证码必须是6位数字": "Mã xác minh phải có 6 chữ số",
"请输入认证器应用显示的验证码完成登录": "Vui lòng nhập mã xác minh được hiển thị trong ứng dụng xác thực để hoàn tất đăng nhập",
"备用码": "Mã dự phòng",
"请输入8位备用码": "Vui lòng nhập mã dự phòng 8 ký tự",
"请输入6位验证码": "Vui lòng nhập mã xác minh 6 chữ số",
"验证并登录": "Xác minh và đăng nhập",
"使用认证器验证码": "Sử dụng mã xác thực",
"使用备用码": "Sử dụng mã dự phòng",
"提示:": "Gợi ý:",
"• 验证码每30秒更新一次": "• Mã xác minh được cập nhật mỗi 30 giây",
"• 如果无法获取验证码,请使用备用码": "• Nếu không thể lấy mã xác minh, vui lòng sử dụng mã dự phòng",
"• 每个备用码只能使用一次": "• Mỗi mã dự phòng chỉ có thể sử dụng một lần",
"正在加载,请稍候...": "Đang tải, vui lòng đợi...",
"配置迁移确认": "Xác nhận di chuyển cấu hình",
"确认迁移": "Xác nhận di chuyển",
"检测到旧版本的配置数据,是否要迁移到新的配置格式?": "Phát hiện dữ liệu cấu hình phiên bản cũ. Bạn có muốn di chuyển sang định dạng cấu hình mới không?",
"迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。": "Quá trình di chuyển sẽ tự động xử lý chuyển đổi định dạng dữ liệu. Sau khi di chuyển xong, cấu hình cũ sẽ bị xóa. Vui lòng sao lưu cấu hình cũ trong cơ sở dữ liệu trước khi di chuyển.",
"旧配置迁移完成": "Di chuyển cấu hình cũ đã hoàn tất",
"迁移失败": "Di chuyển thất bại",
"加载首页内容失败...": "Không thể tải nội dung trang chủ...",
"AI编程": "Lập trình AI",
"无缝支持AI编程工具,涵盖顶级模型。": "Hỗ trợ liền mạch các công cụ lập trình AI, bao gồm các mô hình hàng đầu.",
"创作": "Sáng tạo",
"顶级多模态模型,统一API使用。天然支持业务出海,跨境电商。": "Các mô hình đa phương thức hàng đầu với API thống nhất. Hỗ trợ tự nhiên cho việc mở rộng kinh doanh toàn cầu và thương mại điện tử xuyên biên giới.",
"龙虾": "OpenClaw",
"无缝接入龙虾,顶级模型构建聪明大脑。": "Kết nối liền mạch với OpenClaw và xây dựng bộ não thông minh với các mô hình hàng đầu.",
"文本": "Văn bản",
"图像": "Hình ảnh",
"音频": "Âm thanh",
"嵌入": "Embedding",
"重排序": "Xếp hạng lại",
"视觉": "Thị giác",
"安全可控": "An toàn và có thể kiểm soát",
"可覆盖模型": "Mô hình được hỗ trợ",
"SLA 可用性": "Độ sẵn sàng SLA",
"多区域节点": "Nút đa khu vực",
"原生支持\n极致工具链": "Hỗ trợ gốc\nChuỗi công cụ tối ưu",
"深度优化 API 路由,确保在 CLI 环境下依然拥有流畅的流式交互体验。": "Tối ưu hóa định tuyến API sâu, đảm bảo trải nghiệm tương tác phát trực tuyến mượt mà ngay cả trong môi trường CLI.",
"错误:请求次数过多,请稍后再试!": "Lỗi: Quá nhiều yêu cầu, vui lòng thử lại sau!",
"错误:服务器内部错误,请联系管理员!": "Lỗi: Lỗi máy chủ nội bộ, vui lòng liên hệ quản trị viên!",
"本站仅作演示之用,无服务端!": "Trang web này chỉ dùng để demo, không có máy chủ!",
"错误:": "Lỗi: ",
"刚刚": "Vừa xong",
"分钟前": "phút trước",
"小时前": "giờ trước",
"周前": "tuần trước",
"个月前": "tháng trước",
"1 年前": "1 năm trước",
"请输入用户名和密码!": "Vui lòng nhập tên người dùng và mật khẩu!",
"您正在使用默认密码!": "Bạn đang sử dụng mật khẩu mặc định!",
"请立刻修改默认密码!": "Vui lòng thay đổi mật khẩu mặc định ngay lập tức!",
"当前环境无法使用 Passkey 登录": "Môi trường hiện tại không thể đăng nhập bằng Passkey",
"当前浏览器不支持 Passkey": "Trình duyệt hiện tại không hỗ trợ Passkey",
"无法发起 Passkey 登录": "Không thể khởi tạo đăng nhập Passkey",
"Passkey 验证失败,请重试": "Xác minh Passkey thất bại, vui lòng thử lại",
"Passkey 登录失败,请重试": "Đăng nhập Passkey thất bại, vui lòng thử lại",
"已取消 Passkey 登录": "Đã hủy đăng nhập Passkey",
"微信二维码": "Mã QR WeChat",
"密码长度不得小于 8 位!": "Mật khẩu phải dài ít nhất 8 ký tự!",
"注册成功!": "Đăng ký thành công!",
"注册失败,请重试": "Đăng ký thất bại, vui lòng thử lại",
"验证码发送成功,请检查你的邮箱!": "Mã xác minh đã được gửi, vui lòng kiểm tra email!",
"发送验证码失败,请重试": "Gửi mã xác minh thất bại, vui lòng thử lại",
"聊天数据解析失败": "Phân tích dữ liệu trò chuyện thất bại",
"Uptime Kuma配置已更新": "Cấu hình Uptime Kuma đã được cập nhật",
"Uptime Kuma配置更新失败": "Cập nhật cấu hình Uptime Kuma thất bại",
"分类已删除,请及时点击\"保存设置\"进行保存": "Danh mục đã xóa, vui lòng nhấp \"Lưu cài đặt\" để lưu",
"请填写完整的分类信息": "Vui lòng điền đầy đủ thông tin danh mục",
"请输入有效的URL地址": "Vui lòng nhập URL hợp lệ",
"Slug只能包含字母、数字、下划线和连字符": "Slug chỉ có thể chứa chữ cái, số, gạch dưới và gạch ngang",
"分类已更新,请及时点击\"保存设置\"进行保存": "Danh mục đã cập nhật, vui lòng nhấp \"Lưu cài đặt\" để lưu",
"分类已添加,请及时点击\"保存设置\"进行保存": "Danh mục đã thêm, vui lòng nhấp \"Lưu cài đặt\" để lưu",
"请先选择要删除的分类": "Vui lòng chọn danh mục cần xóa trước",
"Logo 已更新": "Logo đã được cập nhật",
"Logo 更新失败": "Cập nhật Logo thất bại",
"首页内容已更新": "Nội dung trang chủ đã được cập nhật",
"首页内容更新失败": "Cập nhật nội dung trang chủ thất bại",
"关于内容已更新": "Nội dung Giới thiệu đã được cập nhật",
"关于内容更新失败": "Cập nhật nội dung Giới thiệu thất bại",
"页脚内容已更新": "Nội dung chân trang đã được cập nhật",
"页脚内容更新失败": "Cập nhật nội dung chân trang thất bại",
"已是最新版本": "Đã là phiên bản mới nhất",
"检查更新失败,请稍后再试": "Kiểm tra cập nhật thất bại, vui lòng thử lại sau"
}
}

+ 131
- 61
web/src/i18n/locales/zh-CN.json Прегледај датотеку

@@ -1,15 +1,15 @@
{
"translation": {
" + Web搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_other": " + Web搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}",
" + Web搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_other": " + Web搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_other",
" + 图片生成调用 {{symbol}}{{price}} / 1次 * {{ratioType}} {{ratio}}": " + 图片生成调用 {{symbol}}{{price}} / 1次 * {{ratioType}} {{ratio}}",
" + 文件搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_other": " + 文件搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}",
" + 文件搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_other": " + 文件搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_other",
" 个模型设置相同的值": " 个模型设置相同的值",
" 吗?": " 吗?",
" 秒": " 秒",
",时间:": ",时间:",
",点击更新": ",点击更新",
"(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)",
"(筛选后显示 {{count}} 条)_other": "(筛选后显示 {{count}} 条)",
"(筛选后显示 {{count}} 条)_other": "(筛选后显示 {{count}} 条)_other",
"(输入 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "(输入 {{input}} tokens / 1M tokens * {{symbol}}{{price}}",
"(输入 {{nonAudioInput}} tokens / 1M tokens * {{symbol}}{{price}} + 音频输入 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioPrice}}": "(输入 {{nonAudioInput}} tokens / 1M tokens * {{symbol}}{{price}} + 音频输入 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioPrice}}",
"(输入 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}}": "(输入 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}}",
@@ -73,8 +73,8 @@
"Client Secret": "Client Secret",
"common.changeLanguage": "common.changeLanguage",
"Creem API 密钥,敏感信息不显示": "Creem API 密钥,敏感信息不显示",
"Creem Setting Tips": "Creem 只支持预设的固定金额产品,这产品以及价格需要提前在Creem网站内创建配置,所以不支持自定义动态金额充值。在Creem端配置产品的名字以及价格,获取Product Id 后填到下面的产品,在new-api为该产品设置充值额度,以及展示价格。",
"Creem 介绍": "Creem 是一个简单的支付处理平台,支持固定金额产品销售,以及订阅销售。",
"Creem Setting Tips": "Creem Setting Tips",
"Creem 介绍": "Creem 介绍",
"Creem 充值": "Creem 充值",
"Creem 设置": "Creem 设置",
"default为默认设置,可单独设置每个分类的安全等级": "default为默认设置,可单独设置每个分类的安全等级",
@@ -147,9 +147,9 @@
"SMTP 账户": "SMTP 账户",
"SSE 事件": "SSE 事件",
"SSE数据流": "SSE数据流",
"SSRF防护开关详细说明": "总开关控制是否启用SSRF防护功能。关闭后将跳过所有SSRF检查,允许访问任意URL。⚠️ 仅在完全信任环境中关闭此功能。",
"SSRF防护开关详细说明": "SSRF防护开关详细说明",
"SSRF防护设置": "SSRF防护设置",
"SSRF防护详细说明": "SSRF防护可防止恶意用户利用您的服务器访问内网资源。您可以配置受信任域名/IP的白名单,并限制允许的端口。适用于文件下载、Webhook回调和通知功能。",
"SSRF防护详细说明": "SSRF防护详细说明",
"store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用",
"免责声明:仅限个人使用,请勿分发或共享任何凭证。该渠道存在前置条件与使用门槛,请在充分了解流程与风险后使用,并遵守 OpenAI 的相关条款与政策。相关凭证与配置仅限接入 Codex CLI 使用,不适用于其他客户端、平台或渠道。": "免责声明:仅限个人使用,请勿分发或共享任何凭证。该渠道存在前置条件与使用门槛,请在充分了解流程与风险后使用,并遵守 OpenAI 的相关条款与政策。相关凭证与配置仅限接入 Codex CLI 使用,不适用于其他客户端、平台或渠道。",
"Stripe 设置": "Stripe 设置",
@@ -476,10 +476,10 @@
"公告更新失败": "公告更新失败",
"公告类型": "公告类型",
"共": "共",
"共 {{count}} 个密钥_other": "共 {{count}} 个密钥",
"共 {{count}} 个密钥_other": "共 {{count}} 个密钥_other",
"共 {{count}} 个模型": "共 {{count}} 个模型",
"共 {{count}} 个模型_other": "共 {{count}} 个模型",
"共 {{count}} 条日志_other": "共 {{count}} 条日志",
"共 {{count}} 个模型_other": "共 {{count}} 个模型_other",
"共 {{count}} 条日志_other": "共 {{count}} 条日志_other",
"共 {{total}} 项,当前显示 {{start}}-{{end}} 项": "共 {{total}} 项,当前显示 {{start}}-{{end}} 项",
"关": "关",
"关于": "关于",
@@ -730,7 +730,7 @@
"在此输入系统名称": "在此输入系统名称",
"在此输入隐私政策内容,支持 Markdown & HTML 代码": "在此输入隐私政策内容,支持 Markdown & HTML 代码",
"在此输入首页内容,支持 Markdown & HTML 代码,设置后首页的状态信息将不再显示。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为首页": "在此输入首页内容,支持 Markdown & HTML 代码,设置后首页的状态信息将不再显示。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为首页",
"域名IP过滤详细说明": "⚠️此功能为实验性选项,域名可能解析到多个 IPv4/IPv6 地址,若开启,请确保 IP 过滤列表覆盖这些地址,否则可能导致访问失败。",
"域名IP过滤详细说明": "域名IP过滤详细说明",
"域名白名单": "域名白名单",
"域名黑名单": "域名黑名单",
"基本信息": "基本信息",
@@ -892,7 +892,7 @@
"展开更多": "展开更多",
"展示价格": "展示价格",
"左侧边栏个人设置": "左侧边栏个人设置",
"已为 {{count}} 个模型设置{{type}}_other": "已为 {{count}} 个模型设置{{type}}",
"已为 {{count}} 个模型设置{{type}}_other": "已为 {{count}} 个模型设置{{type}}_other",
"已为 ${count} 个渠道设置标签!": "已为 ${count} 个渠道设置标签!",
"已修复 ${success} 个通道,失败 ${fails} 个通道。": "已修复 ${success} 个通道,失败 ${fails} 个通道。",
"已停止": "已停止",
@@ -903,8 +903,8 @@
"已切换至最优倍率视图,每个模型使用其最低倍率分组": "已切换至最优倍率视图,每个模型使用其最低倍率分组",
"已初始化": "已初始化",
"已删除 {{count}} 个令牌!": "已删除 {{count}} 个令牌!",
"已删除 {{count}} 个令牌!_other": "已删除 {{count}} 个令牌!",
"已删除 {{count}} 条失效兑换码_other": "已删除 {{count}} 条失效兑换码",
"已删除 {{count}} 个令牌!_other": "已删除 {{count}} 个令牌!_other",
"已删除 {{count}} 条失效兑换码_other": "已删除 {{count}} 条失效兑换码_other",
"已删除 ${data} 个通道!": "已删除 ${data} 个通道!",
"已删除所有禁用渠道,共计 ${data} 个": "已删除所有禁用渠道,共计 ${data} 个",
"已删除消息及其回复": "已删除消息及其回复",
@@ -933,7 +933,7 @@
"已成功开始测试所有已启用通道,请刷新页面查看结果。": "已成功开始测试所有已启用通道,请刷新页面查看结果。",
"已提交": "已提交",
"已支付金额": "已支付金额",
"已新增 {{count}} 个模型:{{list}}_other": "已新增 {{count}} 个模型:{{list}}",
"已新增 {{count}} 个模型:{{list}}_other": "已新增 {{count}} 个模型:{{list}}_other",
"已更新完毕所有已启用通道余额!": "已更新完毕所有已启用通道余额!",
"已有保存的配置": "已有保存的配置",
"已有模型": "已有模型",
@@ -956,7 +956,7 @@
"已解锁豆包自定义 API 地址编辑": "已解锁豆包自定义 API 地址编辑",
"已过期": "已过期",
"已运行时间": "已运行时间",
"已选择 {{count}} 个模型_other": "已选择 {{count}} 个模型",
"已选择 {{count}} 个模型_other": "已选择 {{count}} 个模型_other",
"已选择 {{selected}} / {{total}}": "已选择 {{selected}} / {{total}}",
"已选择 ${count} 个渠道": "已选择 ${count} 个渠道",
"已重置为默认配置": "已重置为默认配置",
@@ -1720,8 +1720,8 @@
"确定要充值 $": "确定要充值 $",
"确定要删除供应商 \"{{name}}\" 吗?此操作不可撤销。": "确定要删除供应商 \"{{name}}\" 吗?此操作不可撤销。",
"确定要删除所有已自动禁用的密钥吗?": "确定要删除所有已自动禁用的密钥吗?",
"确定要删除所选的 {{count}} 个令牌吗?_other": "确定要删除所选的 {{count}} 个令牌吗?",
"确定要删除所选的 {{count}} 个模型吗?_other": "确定要删除所选的 {{count}} 个模型吗?",
"确定要删除所选的 {{count}} 个令牌吗?_other": "确定要删除所选的 {{count}} 个令牌吗?_other",
"确定要删除所选的 {{count}} 个模型吗?_other": "确定要删除所选的 {{count}} 个模型吗?_other",
"确定要删除此API信息吗?": "确定要删除此API信息吗?",
"确定要删除此公告吗?": "确定要删除此公告吗?",
"确定要删除此分类吗?": "确定要删除此分类吗?",
@@ -1762,7 +1762,7 @@
"示例": "示例",
"示例:{\"default\": [200, 100], \"vip\": [0, 1000]}。": "示例:{\"default\": [200, 100], \"vip\": [0, 1000]}。",
"视频": "视频",
"视频Remix": "视频 Remix",
"视频Remix": "视频Remix",
"视频无法在当前浏览器中播放,这可能是由于:": "视频无法在当前浏览器中播放,这可能是由于:",
"禁用": "禁用",
"禁用 store 透传": "禁用 store 透传",
@@ -1775,7 +1775,7 @@
"禁用思考处理的模型列表": "禁用思考处理的模型列表",
"禁用所有密钥失败": "禁用所有密钥失败",
"禁用时间": "禁用时间",
"私有IP访问详细说明": "⚠️ 安全警告:启用此选项将允许访问内网资源(本地主机、私有网络)。仅在需要访问内部服务且了解安全风险的情况下启用。",
"私有IP访问详细说明": "私有IP访问详细说明",
"私有部署地址": "私有部署地址",
"私有镜像仓库的密码": "私有镜像仓库的密码",
"私有镜像仓库的用户名": "私有镜像仓库的用户名",
@@ -1786,7 +1786,7 @@
"窗口等待": "窗口等待",
"站点额度展示类型及汇率": "站点额度展示类型及汇率",
"端口号必须在1-65535之间": "端口号必须在1-65535之间",
"端口配置详细说明": "限制外部请求只能访问指定端口。支持单个端口(80, 443)或端口范围(8000-8999)。空列表允许所有端口。默认包含常用Web端口。",
"端口配置详细说明": "端口配置详细说明",
"端点": "端点",
"端点映射": "端点映射",
"在模型广场向用户展示的端点": "在模型广场向用户展示的端点",
@@ -1945,15 +1945,15 @@
"检测到以下高危状态码重定向规则": "检测到以下高危状态码重定向规则",
"操作确认": "操作确认",
"我确认开启高危重试": "我确认开启高危重试",
"高危状态码重试风险告知与免责声明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",
"高危状态码重试风险告知与免责声明Markdown": "高危状态码重试风险告知与免责声明Markdown",
"高危状态码重试风险确认输入文本": "高危状态码重试风险确认输入文本",
"高危状态码重试风险确认项1": "高危状态码重试风险确认项1",
"高危状态码重试风险确认项2": "高危状态码重试风险确认项2",
"高危状态码重试风险确认项3": "高危状态码重试风险确认项3",
"高危状态码重试风险确认项4": "高危状态码重试风险确认项4",
"高危状态码重试风险输入框占位文案": "高危状态码重试风险输入框占位文案",
"高危状态码重试风险输入不匹配提示": "高危状态码重试风险输入不匹配提示",
"例如:401, 403, 429, 500-599": "例如:401, 403, 429, 500-599",
"自动选择": "自动选择",
"自定义充值数量选项": "自定义充值数量选项",
"自定义充值数量选项不是合法的 JSON 数组": "自定义充值数量选项不是合法的 JSON 数组",
@@ -2411,7 +2411,7 @@
"适用于个人使用的场景,不需要设置模型价格": "适用于个人使用的场景,不需要设置模型价格",
"适用于为多个用户提供服务的场景": "适用于为多个用户提供服务的场景",
"适用于展示系统功能的场景,提供基础功能演示": "适用于展示系统功能的场景,提供基础功能演示",
"适配 -thinking、-thinking-预算数字 和 -nothinking 后缀": "适配 -thinking、-thinking-预算数字、-nothinking 以及 -low/-medium/-high 后缀",
"适配 -thinking、-thinking-预算数字 和 -nothinking 后缀": "适配 -thinking、-thinking-预算数字 和 -nothinking 后缀",
"选择充值额度": "选择充值额度",
"选择分组": "选择分组",
"选择同步来源": "选择同步来源",
@@ -2431,7 +2431,7 @@
"选择硬件类型": "选择硬件类型",
"选择端点类型": "选择端点类型",
"选择系统运行模式": "选择系统运行模式",
"选择组类型": "选择组类型",
"选择组类型": "选择组类型",
"选择要覆盖的冲突项": "选择要覆盖的冲突项",
"选择语言": "选择语言",
"选择过期时间(可选,留空为永久)": "选择过期时间(可选,留空为永久)",
@@ -2633,12 +2633,12 @@
"默认 API 版本": "默认 API 版本",
"默认 Responses API 版本,为空则使用上方版本": "默认 Responses API 版本,为空则使用上方版本",
"默认使用系统名称": "默认使用系统名称",
"默认助手消息": "你好!有什么我可以帮助你的吗?",
"默认助手消息": "默认助手消息",
"默认区域": "默认区域",
"默认区域,如: us-central1": "默认区域,如: us-central1",
"默认折叠侧边栏": "默认折叠侧边栏",
"默认测试模型": "默认测试模型",
"默认用户消息": "你好",
"默认用户消息": "默认用户消息",
"默认补全倍率": "默认补全倍率",
"每日签到": "每日签到",
"今日已签到,累计签到": "今日已签到,累计签到",
@@ -2818,25 +2818,11 @@
"渠道定价": "渠道定价",
"标签管理": "标签管理",
"添加标签": "添加标签",
"编辑标签": "编辑标签",
"标签名称": "标签名称",
"颜色": "颜色",
"描述": "描述",
"排序": "排序",
"确定删除此标签?": "确定删除此标签?",
"请输入标签名称": "请输入标签名称",
"计费类型": "计费类型",
"按量计费": "按量计费",
"按次计费": "按次计费",
"输入倍率": "输入倍率",
"输出倍率": "输出倍率",
"固定价格": "固定价格",
"标签": "标签",
"已配置": "已配置",
"渠道数量": "渠道数量",
"收起": "收起",
"展开": "展开",
"渠道": "渠道",
"按量": "按量",
"按次": "按次",
"编辑渠道定价": "编辑渠道定价",
@@ -2846,15 +2832,15 @@
"绑定渠道": "绑定渠道",
"可选,绑定后该令牌只能使用指定渠道": "可选,绑定后该令牌只能使用指定渠道",
"请选择标签": "请选择标签",
"modelType.unset": "未设置",
"modelType.chat": "对话",
"modelType.image": "图像",
"modelType.audio": "音频",
"modelType.video": "视频",
"modelType.embedding": "嵌入",
"modelType.rerank": "重排序",
"modelType.vision": "视觉",
"modelType.other": "其他",
"modelType.unset": "modelType.unset",
"modelType.chat": "modelType.chat",
"modelType.image": "modelType.image",
"modelType.audio": "modelType.audio",
"modelType.video": "modelType.video",
"modelType.embedding": "modelType.embedding",
"modelType.rerank": "modelType.rerank",
"modelType.vision": "modelType.vision",
"modelType.other": "modelType.other",
"面向企业的 AI 生产力基座": "面向企业的 AI 生产力基座",
"统一的大模型接口网关": "统一的大模型接口网关",
"链接全球 AI 能力": "链接全球 AI 能力",
@@ -2886,16 +2872,100 @@
"立即接入,统一控制访问策略与调用成本,为产品带来稳定、可扩展的智能体验。": "立即接入,统一控制访问策略与调用成本,为产品带来稳定、可扩展的智能体验。",
"立即开始": "立即开始",
"查看文档": "查看文档",
"文档": "文档",
"关于": "关于",
"服务条款": "服务条款",
"使用政策": "使用政策",
"版权所有": "版权所有",
"实时调度": "实时调度",
"健康度与延迟权重动态切换,保证最优响应。": "健康度与延迟权重动态切换,保证最优响应。",
"统一监控": "统一监控",
"调用、费用、异常一站式可视化,随时掌握运行状态。": "调用、费用、异常一站式可视化,随时掌握运行状态。",
"智能限流": "智能限流",
"多维策略保障核心业务优先级,避免突发拥堵。": "多维策略保障核心业务优先级,避免突发拥堵。"
"多维策略保障核心业务优先级,避免突发拥堵。": "多维策略保障核心业务优先级,避免突发拥堵。",
"备用码必须是8位": "备用码必须是8位",
"验证码必须是6位数字": "验证码必须是6位数字",
"请输入认证器应用显示的验证码完成登录": "请输入认证器应用显示的验证码完成登录",
"备用码": "备用码",
"请输入8位备用码": "请输入8位备用码",
"请输入6位验证码": "请输入6位验证码",
"验证并登录": "验证并登录",
"使用认证器验证码": "使用认证器验证码",
"使用备用码": "使用备用码",
"提示:": "提示:",
"• 验证码每30秒更新一次": "• 验证码每30秒更新一次",
"• 如果无法获取验证码,请使用备用码": "• 如果无法获取验证码,请使用备用码",
"• 每个备用码只能使用一次": "• 每个备用码只能使用一次",
"正在加载,请稍候...": "正在加载,请稍候...",
"配置迁移确认": "配置迁移确认",
"确认迁移": "确认迁移",
"检测到旧版本的配置数据,是否要迁移到新的配置格式?": "检测到旧版本的配置数据,是否要迁移到新的配置格式?",
"注意:": "注意:",
"迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。": "迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。",
"旧配置迁移完成": "旧配置迁移完成",
"迁移失败": "迁移失败",
"加载首页内容失败...": "加载首页内容失败...",
"AI编程": "AI编程",
"无缝支持AI编程工具,涵盖顶级模型。": "无缝支持AI编程工具,涵盖顶级模型。",
"创作": "创作",
"顶级多模态模型,统一API使用。天然支持业务出海,跨境电商。": "顶级多模态模型,统一API使用。天然支持业务出海,跨境电商。",
"龙虾": "龙虾",
"无缝接入龙虾,顶级模型构建聪明大脑。": "无缝接入龙虾,顶级模型构建聪明大脑。",
"文本": "文本",
"图像": "图像",
"音频": "音频",
"嵌入": "嵌入",
"重排序": "重排序",
"视觉": "视觉",
"模型类型": "模型类型",
"安全可控": "安全可控",
"可覆盖模型": "可覆盖模型",
"SLA 可用性": "SLA 可用性",
"多区域节点": "多区域节点",
"原生支持\n极致工具链": "原生支持\n极致工具链",
"深度优化 API 路由,确保在 CLI 环境下依然拥有流畅的流式交互体验。": "深度优化 API 路由,确保在 CLI 环境下依然拥有流畅的流式交互体验。",
"错误:请求次数过多,请稍后再试!": "错误:请求次数过多,请稍后再试!",
"错误:服务器内部错误,请联系管理员!": "错误:服务器内部错误,请联系管理员!",
"本站仅作演示之用,无服务端!": "本站仅作演示之用,无服务端!",
"错误:": "错误:",
"刚刚": "刚刚",
"分钟前": "分钟前",
"小时前": "小时前",
"周前": "周前",
"个月前": "个月前",
"1 年前": "1 年前",
"登录失败,请重试": "登录失败,请重试",
"请输入用户名和密码!": "请输入用户名和密码!",
"您正在使用默认密码!": "您正在使用默认密码!",
"请立刻修改默认密码!": "请立刻修改默认密码!",
"当前环境无法使用 Passkey 登录": "当前环境无法使用 Passkey 登录",
"当前浏览器不支持 Passkey": "当前浏览器不支持 Passkey",
"无法发起 Passkey 登录": "无法发起 Passkey 登录",
"Passkey 验证失败,请重试": "Passkey 验证失败,请重试",
"Passkey 登录失败,请重试": "Passkey 登录失败,请重试",
"已取消 Passkey 登录": "已取消 Passkey 登录",
"微信二维码": "微信二维码",
"密码长度不得小于 8 位!": "密码长度不得小于 8 位!",
"注册成功!": "注册成功!",
"注册失败,请重试": "注册失败,请重试",
"验证码发送成功,请检查你的邮箱!": "验证码发送成功,请检查你的邮箱!",
"发送验证码失败,请重试": "发送验证码失败,请重试",
"聊天数据解析失败": "聊天数据解析失败",
"Uptime Kuma配置已更新": "Uptime Kuma配置已更新",
"Uptime Kuma配置更新失败": "Uptime Kuma配置更新失败",
"分类已删除,请及时点击\"保存设置\"进行保存": "分类已删除,请及时点击\"保存设置\"进行保存",
"请填写完整的分类信息": "请填写完整的分类信息",
"请输入有效的URL地址": "请输入有效的URL地址",
"Slug只能包含字母、数字、下划线和连字符": "Slug只能包含字母、数字、下划线和连字符",
"分类已更新,请及时点击\"保存设置\"进行保存": "分类已更新,请及时点击\"保存设置\"进行保存",
"分类已添加,请及时点击\"保存设置\"进行保存": "分类已添加,请及时点击\"保存设置\"进行保存",
"请先选择要删除的分类": "请先选择要删除的分类",
"Logo 已更新": "Logo 已更新",
"Logo 更新失败": "Logo 更新失败",
"首页内容已更新": "首页内容已更新",
"首页内容更新失败": "首页内容更新失败",
"关于内容已更新": "关于内容已更新",
"关于内容更新失败": "关于内容更新失败",
"页脚内容已更新": "页脚内容已更新",
"页脚内容更新失败": "页脚内容更新失败",
"已是最新版本": "已是最新版本",
"检查更新失败,请稍后再试": "检查更新失败,请稍后再试"
}
}

+ 88
- 1
web/src/i18n/locales/zh-TW.json Прегледај датотеку

@@ -2805,6 +2805,93 @@
"填写服务器地址后自动生成:": "填寫伺服器位址後自動生成:",
"自动生成:": "自動生成:",
"请先填写服务器地址,以自动生成完整的端点 URL": "請先填寫伺服器位址,以自動生成完整的端點 URL",
"端点 URL 必须是完整地址(以 http:// 或 https:// 开头)": "端點 URL 必須是完整位址(以 http:// 或 https:// 開頭)"
"端点 URL 必须是完整地址(以 http:// 或 https:// 开头)": "端點 URL 必須是完整位址(以 http:// 或 https:// 開頭)",
"备用码必须是8位": "備用碼必須是8位",
"验证码必须是6位数字": "驗證碼必須是6位數字",
"请输入认证器应用显示的验证码完成登录": "請輸入驗證器應用程式顯示的驗證碼完成登入",
"备用码": "備用碼",
"请输入8位备用码": "請輸入8位備用碼",
"请输入6位验证码": "請輸入6位驗證碼",
"验证并登录": "驗證並登入",
"使用认证器验证码": "使用驗證器驗證碼",
"使用备用码": "使用備用碼",
"提示:": "提示:",
"• 验证码每30秒更新一次": "• 驗證碼每30秒更新一次",
"• 如果无法获取验证码,请使用备用码": "• 如果無法獲取驗證碼,請使用備用碼",
"• 每个备用码只能使用一次": "• 每個備用碼只能使用一次",
"正在加载,请稍候...": "正在載入,請稍候...",
"配置迁移确认": "配置遷移確認",
"确认迁移": "確認遷移",
"检测到旧版本的配置数据,是否要迁移到新的配置格式?": "檢測到舊版本的配置資料,是否要遷移到新的配置格式?",
"注意:": "注意:",
"迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。": "遷移過程中會自動處理資料格式轉換,遷移完成後舊配置將被清除,請在遷移前在資料庫中備份好舊配置。",
"旧配置迁移完成": "舊配置遷移完成",
"迁移失败": "遷移失敗",
"加载首页内容失败...": "載入首頁內容失敗...",
"AI编程": "AI編程",
"无缝支持AI编程工具,涵盖顶级模型。": "無縫支援AI編程工具,涵蓋頂級模型。",
"创作": "創作",
"顶级多模态模型,统一API使用。天然支持业务出海,跨境电商。": "頂級多模態模型,統一API使用。天然支援業務出海,跨境電商。",
"龙虾": "龍蝦",
"无缝接入龙虾,顶级模型构建聪明大脑。": "無縫接入龍蝦,頂級模型構建聰明大腦。",
"文本": "文本",
"图像": "圖像",
"音频": "音訊",
"嵌入": "嵌入",
"重排序": "重排序",
"视觉": "視覺",
"模型类型": "模型類型",
"安全可控": "安全可控",
"可覆盖模型": "可覆蓋模型",
"SLA 可用性": "SLA 可用性",
"多区域节点": "多區域節點",
"原生支持\n极致工具链": "原生支援\n極致工具鏈",
"深度优化 API 路由,确保在 CLI 环境下依然拥有流畅的流式交互体验。": "深度優化 API 路由,確保在 CLI 環境下依然擁有流暢的流式互動體驗。",
"错误:请求次数过多,请稍后再试!": "錯誤:請求次數過多,請稍後再試!",
"错误:服务器内部错误,请联系管理员!": "錯誤:伺服器內部錯誤,請聯絡管理員!",
"本站仅作演示之用,无服务端!": "本站僅作演示之用,無服務端!",
"错误:": "錯誤:",
"刚刚": "剛剛",
"分钟前": "分鐘前",
"小时前": "小時前",
"周前": "週前",
"个月前": "個月前",
"1 年前": "1 年前",
"登录失败,请重试": "登入失敗,請重試",
"请输入用户名和密码!": "請輸入使用者名稱和密碼!",
"您正在使用默认密码!": "您正在使用預設密碼!",
"请立刻修改默认密码!": "請立刻修改預設密碼!",
"当前环境无法使用 Passkey 登录": "當前環境無法使用 Passkey 登入",
"当前浏览器不支持 Passkey": "當前瀏覽器不支援 Passkey",
"无法发起 Passkey 登录": "無法發起 Passkey 登入",
"Passkey 验证失败,请重试": "Passkey 驗證失敗,請重試",
"Passkey 登录失败,请重试": "Passkey 登入失敗,請重試",
"已取消 Passkey 登录": "已取消 Passkey 登入",
"微信二维码": "微信二維碼",
"密码长度不得小于 8 位!": "密碼長度不得小於 8 位!",
"注册成功!": "註冊成功!",
"注册失败,请重试": "註冊失敗,請重試",
"验证码发送成功,请检查你的邮箱!": "驗證碼發送成功,請檢查你的信箱!",
"发送验证码失败,请重试": "發送驗證碼失敗,請重試",
"聊天数据解析失败": "聊天資料解析失敗",
"Uptime Kuma配置已更新": "Uptime Kuma配置已更新",
"Uptime Kuma配置更新失败": "Uptime Kuma配置更新失敗",
"分类已删除,请及时点击\"保存设置\"进行保存": "分類已刪除,請及時點擊\"儲存設定\"進行儲存",
"请填写完整的分类信息": "請填寫完整的分類資訊",
"请输入有效的URL地址": "請輸入有效的URL地址",
"Slug只能包含字母、数字、下划线和连字符": "Slug只能包含字母、數字、底線和連字符",
"分类已更新,请及时点击\"保存设置\"进行保存": "分類已更新,請及時點擊\"儲存設定\"進行儲存",
"分类已添加,请及时点击\"保存设置\"进行保存": "分類已添加,請及時點擊\"儲存設定\"進行儲存",
"请先选择要删除的分类": "請先選擇要刪除的分類",
"Logo 已更新": "Logo 已更新",
"Logo 更新失败": "Logo 更新失敗",
"首页内容已更新": "首頁內容已更新",
"首页内容更新失败": "首頁內容更新失敗",
"关于内容已更新": "關於內容已更新",
"关于内容更新失败": "關於內容更新失敗",
"页脚内容已更新": "頁尾內容已更新",
"页脚内容更新失败": "頁尾內容更新失敗",
"已是最新版本": "已是最新版本",
"检查更新失败,请稍后再试": "檢查更新失敗,請稍後再試"
}
}

+ 3
- 1
web/src/pages/Chat2Link/index.jsx Прегледај датотеку

@@ -18,9 +18,11 @@ For commercial licensing, please contact support@quantumnous.com
*/

import React from 'react';
import { useTranslation } from 'react-i18next';
import { useTokenKeys } from '../../hooks/chat/useTokenKeys';

const chat2page = () => {
const { t } = useTranslation();
const { keys, chatLink, serverAddress, isLoading } = useTokenKeys();

const comLink = (key) => {
@@ -37,7 +39,7 @@ const chat2page = () => {

return (
<div className='mt-[60px] px-2'>
<h3>正在加载,请稍候...</h3>
<h3>{t('正在加载,请稍候...')}</h3>
</div>
);
};


+ 6
- 6
web/src/pages/Home/components/ToolsSection.jsx Прегледај датотеку

@@ -72,8 +72,8 @@ const ToolsSection = () => {
icon: '/images/Anthropic.png',
brand: 'Anthropic',
brandColor: 'amber',
title: 'AI编程',
description: '无缝支持AI编程工具,涵盖顶级模型。',
title: t('AI编程'),
description: t('无缝支持AI编程工具,涵盖顶级模型。'),
link: '/pricing',
glowClass: 'amber',
},
@@ -81,8 +81,8 @@ const ToolsSection = () => {
icon: '/images/create.png',
brand: ' ',
brandColor: 'blue',
title: '创作',
description: '顶级多模态模型,统一API使用。天然支持业务出海,跨境电商。',
title: t('创作'),
description: t('顶级多模态模型,统一API使用。天然支持业务出海,跨境电商。'),
link: '/pricing',
glowClass: 'blue',
},
@@ -90,8 +90,8 @@ const ToolsSection = () => {
icon: '/images/openclaw-3.jpg',
brand: 'OpenClaw',
brandColor: 'purple',
title: '龙虾',
description: '无缝接入龙虾,顶级模型构建聪明大脑。',
title: t('龙虾'),
description: t('无缝接入龙虾,顶级模型构建聪明大脑。'),
link: '/pricing',
glowClass: 'purple',
},


+ 3
- 3
web/src/pages/Home/index.jsx Прегледај датотеку

@@ -39,7 +39,7 @@ import HomePageFooter from './components/HomePageFooter';
import HomePricingFilters from './HomePricingFilters';

const Home = () => {
const { i18n } = useTranslation();
const { t, i18n } = useTranslation();
const [statusState] = useContext(StatusContext);
const actualTheme = useActualTheme();
const [homePageContentLoaded, setHomePageContentLoaded] = useState(false);
@@ -71,7 +71,7 @@ const Home = () => {
}
} else {
showError(message);
setHomePageContent('加载首页内容失败...');
setHomePageContent(t('加载首页内容失败...'));
}
setHomePageContentLoaded(true);
};
@@ -146,7 +146,7 @@ const Home = () => {
{/* 模型广场 Section */}
<section className="home-snap-section home-snap-section-pricing bg-[var(--semi-color-bg-0)]">
<div className="mx-auto w-full max-w-6xl px-5 py-16 md:px-6 lg:px-8">
<HomePricingFilters t={(key) => key} />
<HomePricingFilters t={t} />
</div>
</section>



+ 10
- 10
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;
}



Loading…
Откажи
Сачувај