diff --git a/.env.example b/.env.example index ea2464270695..76868ff6ab8c 100644 --- a/.env.example +++ b/.env.example @@ -1,75 +1,75 @@ -# 端口号 -# PORT=3000 -# 前端基础URL -# FRONTEND_BASE_URL=https://your-frontend-url.com +# Port number (Số cổng) +PORT=3000 +# Frontend base URL (URL cơ sở giao diện người dùng) +FRONTEND_BASE_URL=https://your-frontend-url.com -# 调试相关配置 -# 启用pprof -# ENABLE_PPROF=true -# 启用调试模式 -# DEBUG=true +# Debug related configuration (Cấu hình liên quan đến gỡ lỗi) +# Enable pprof (Bật pprof) +ENABLE_PPROF=true +# Enable debug mode (Bật chế độ gỡ lỗi) +DEBUG=true -# 数据库相关配置 -# 数据库连接字符串 -# SQL_DSN=user:password@tcp(127.0.0.1:3306)/dbname?parseTime=true -# 日志数据库连接字符串 -# LOG_SQL_DSN=user:password@tcp(127.0.0.1:3306)/logdb?parseTime=true -# SQLite数据库路径 -# SQLITE_PATH=/path/to/sqlite.db -# 数据库最大空闲连接数 -# SQL_MAX_IDLE_CONNS=100 -# 数据库最大打开连接数 -# SQL_MAX_OPEN_CONNS=1000 -# 数据库连接最大生命周期(秒) -# SQL_MAX_LIFETIME=60 +# # Database related configuration (Cấu hình liên quan đến cơ sở dữ liệu) +# Database connection string (Chuỗi kết nối cơ sở dữ liệu) +SQL_DSN=user:password@tcp(127.0.0.1:3306)/dbname?parseTime=true +# Log database connection string (Chuỗi kết nối cơ sở dữ liệu log) +LOG_SQL_DSN=user:password@tcp(127.0.0.1:3306)/logdb?parseTime=true +# SQLite database path (Đường dẫn cơ sở dữ liệu SQLite) +SQLITE_PATH=/path/to/sqlite.db +# Database maximum idle connections (Số kết nối rảnh tối đa của cơ sở dữ liệu) +SQL_MAX_IDLE_CONNS=100 +# Database maximum open connections (Số kết nối mở tối đa của cơ sở dữ liệu) +SQL_MAX_OPEN_CONNS=1000 +# Database connection maximum lifetime in seconds (Thời gian sống tối đa của kết nối cơ sở dữ liệu tính bằng giây) +SQL_MAX_LIFETIME=60 -# 缓存相关配置 -# Redis连接字符串 -# REDIS_CONN_STRING=redis://user:password@localhost:6379/0 -# 同步频率(单位:秒) -# SYNC_FREQUENCY=60 -# 内存缓存启用 -# MEMORY_CACHE_ENABLED=true -# 渠道更新频率(单位:秒) -# CHANNEL_UPDATE_FREQUENCY=30 -# 批量更新启用 -# BATCH_UPDATE_ENABLED=true -# 批量更新间隔(单位:秒) -# BATCH_UPDATE_INTERVAL=5 +# Cache related configuration (Cấu hình liên quan đến bộ nhớ đệm) +# Redis connection string (Chuỗi kết nối Redis) +REDIS_CONN_STRING=redis://user:password@localhost:6379/0 +# Sync frequency in seconds (Tần suất đồng bộ tính bằng giây) +SYNC_FREQUENCY=60 +# Memory cache enabled (Bật bộ nhớ đệm) +MEMORY_CACHE_ENABLED=true +# Channel update frequency in seconds (Tần suất cập nhật kênh tính bằng giây) +CHANNEL_UPDATE_FREQUENCY=30 +# Batch update enabled (Bật cập nhật hàng loạt) +BATCH_UPDATE_ENABLED=true +# Batch update interval in seconds (Khoảng thời gian cập nhật hàng loạt tính bằng giây) +BATCH_UPDATE_INTERVAL=5 -# 任务和功能配置 -# 更新任务启用 -# UPDATE_TASK=true +# # Task and function configuration (Cấu hình tác vụ và chức năng) +# Update task enabled (Bật tác vụ cập nhật) +UPDATE_TASK=true -# 对话超时设置 -# 所有请求超时时间,单位秒,默认为0,表示不限制 -# RELAY_TIMEOUT=0 -# 流模式无响应超时时间,单位秒,如果出现空补全可以尝试改为更大值 -# STREAMING_TIMEOUT=120 +# Conversation timeout settings (Cài đặt thời gian chờ cuộc hội thoại) +# All request timeout in seconds, default is 0 means no limit (Thời gian chờ tất cả yêu cầu tính bằng giây, mặc định là 0 có nghĩa là không giới hạn) +RELAY_TIMEOUT=0 +# Stream mode no response timeout in seconds, try larger value if empty completion occurs (Thời gian chờ không phản hồi trong chế độ stream tính bằng giây, thử giá trị lớn hơn nếu xảy ra hoàn thành trống) +STREAMING_TIMEOUT=120 -# Gemini 识别图片 最大图片数量 -# GEMINI_VISION_MAX_IMAGE_NUM=16 +# Gemini image recognition maximum image count (Số lượng hình ảnh tối đa cho nhận dạng hình ảnh Gemini) +GEMINI_VISION_MAX_IMAGE_NUM=16 -# 会话密钥 -# SESSION_SECRET=random_string +# # Session secret (Khóa phiên) +SESSION_SECRET=random_string -# 其他配置 -# 渠道测试频率(单位:秒) -# CHANNEL_TEST_FREQUENCY=10 -# 生成默认token -# GENERATE_DEFAULT_TOKEN=false -# Cohere 安全设置 -# COHERE_SAFETY_SETTING=NONE -# 是否统计图片token -# GET_MEDIA_TOKEN=true -# 是否在非流(stream=false)情况下统计图片token -# GET_MEDIA_TOKEN_NOT_STREAM=true -# 设置 Dify 渠道是否输出工作流和节点信息到客户端 -# DIFY_DEBUG=true +# Other configuration (Cấu hình khác) +# Channel test frequency in seconds (Tần suất kiểm tra kênh tính bằng giây) +CHANNEL_TEST_FREQUENCY=10 +# Generate default token (Tạo token mặc định) +GENERATE_DEFAULT_TOKEN=false +# Cohere safety setting (Cài đặt bảo mật Cohere) +COHERE_SAFETY_SETTING=NONE +# Whether to count image tokens (Có đếm token hình ảnh hay không) +GET_MEDIA_TOKEN=true +# Whether to count image tokens in non-stream mode (stream=false) (Có đếm token hình ảnh trong chế độ không stream (stream=false) hay không) +GET_MEDIA_TOKEN_NOT_STREAM=true +# Set whether Dify channel outputs workflow and node information to client (Thiết lập kênh Dify có xuất thông tin quy trình làm việc và nút tới client hay không) +DIFY_DEBUG=true -# 节点类型 -# 如果是主节点则为master -# NODE_TYPE=master +# Node type (Loại nút) +# If master node then set to master (Nếu là nút chính thì đặt thành master) +NODE_TYPE=master diff --git a/docker-compose.yml b/docker-compose.yml index 57ad0b30a652..91cf2cc47fca 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,8 +1,9 @@ -version: '3.4' - services: new-api: - image: calciumion/new-api:latest + build: + context: . + dockerfile: Dockerfile + image: new-api:latest container_name: new-api restart: always command: --log-dir /app/logs @@ -15,9 +16,9 @@ services: - SQL_DSN=root:123456@tcp(mysql:3306)/new-api # Point to the mysql service - REDIS_CONN_STRING=redis://redis - TZ=Asia/Shanghai - - ERROR_LOG_ENABLED=true # 是否启用错误日志记录 - # - STREAMING_TIMEOUT=120 # 流模式无响应超时时间,单位秒,默认120秒,如果出现空补全可以尝试改为更大值 - # - SESSION_SECRET=random_string # 多机部署时设置,必须修改这个随机字符串!!!!!!! + - ERROR_LOG_ENABLED=true # Whether to enable error log recording (Có bật ghi log lỗi hay không) + # - STREAMING_TIMEOUT=120 # Stream mode no response timeout in seconds, default 120 seconds, try larger value if empty completion occurs (Thời gian chờ không phản hồi trong chế độ stream tính bằng giây, mặc định 120 giây, thử giá trị lớn hơn nếu xảy ra hoàn thành trống) + # - SESSION_SECRET=random_string # Set for multi-machine deployment, must modify this random string!!! (Thiết lập cho triển khai đa máy, phải sửa đổi chuỗi ngẫu nhiên này!!!) # - NODE_TYPE=slave # Uncomment for slave node in multi-node deployment # - SYNC_FREQUENCY=60 # Uncomment if regular database syncing is needed # - FRONTEND_BASE_URL=https://openai.justsong.cn # Uncomment for multi-node deployment with front-end URL diff --git a/main.go b/main.go index ca3da6012d32..d8f37f4baf1e 100644 --- a/main.go +++ b/main.go @@ -80,10 +80,10 @@ func main() { go model.SyncChannelCache(common.SyncFrequency) } - // 热更新配置 + // Hot reload configuration (Cập nhật cấu hình nóng) go model.SyncOptions(common.SyncFrequency) - // 数据看板 + // Data dashboard (Bảng điều khiển dữ liệu) go model.UpdateQuotaData() if os.Getenv("CHANNEL_UPDATE_FREQUENCY") != "" { @@ -164,11 +164,11 @@ func InitResources() error { // This is a placeholder function for future resource initialization err := godotenv.Load(".env") if err != nil { - common.SysLog("未找到 .env 文件,使用默认环境变量,如果需要,请创建 .env 文件并设置相关变量") + common.SysLog("No .env file found, using default environment variables. If needed, please create a .env file and set the relevant variables. (.env file không tìm thấy, sử dụng biến môi trường mặc định. Nếu cần, vui lòng tạo file .env và thiết lập các biến liên quan.)") common.SysLog("No .env file found, using default environment variables. If needed, please create a .env file and set the relevant variables.") } - // 加载环境变量 + // Load environment variables (Tải biến môi trường) common.InitEnv() common.SetupLogger() @@ -192,7 +192,7 @@ func InitResources() error { // Initialize options, should after model.InitDB() model.InitOptionMap() - // 初始化模型 + // Initialize models (Khởi tạo các mô hình) model.GetPricing() // Initialize SQL Database diff --git a/setting/chat.go b/setting/chat.go index 53cb655a2910..17d19a4353a8 100644 --- a/setting/chat.go +++ b/setting/chat.go @@ -13,13 +13,13 @@ var Chats = []map[string]string{ "Cherry Studio": "cherrystudio://providers/api-keys?v=1&data={cherryConfig}", }, { - "Lobe Chat 官方示例": "https://chat-preview.lobehub.com/?settings={\"keyVaults\":{\"openai\":{\"apiKey\":\"{key}\",\"baseURL\":\"{address}/v1\"}}}", + "Lobe Chat": "https://chat-preview.lobehub.com/?settings={\"keyVaults\":{\"openai\":{\"apiKey\":\"{key}\",\"baseURL\":\"{address}/v1\"}}}", }, { "AI as Workspace": "https://aiaw.app/set-provider?provider={\"type\":\"openai\",\"settings\":{\"apiKey\":\"{key}\",\"baseURL\":\"{address}/v1\",\"compatibility\":\"strict\"}}", }, { - "AMA 问天": "ama://set-api-key?server={address}&key={key}", + "AMA": "ama://set-api-key?server={address}&key={key}", }, { "OpenCat": "opencat://team/join?domain={address}&token={key}", diff --git a/setting/payment.go b/setting/payment.go index 7fc5ad3fd358..807aaba21ff8 100644 --- a/setting/payment.go +++ b/setting/payment.go @@ -12,12 +12,12 @@ var USDExchangeRate = 7.3 var PayMethods = []map[string]string{ { - "name": "支付宝", + "name": "Alipay", "color": "rgba(var(--semi-blue-5), 1)", "type": "alipay", }, { - "name": "微信", + "name": "WeChat Pay", "color": "rgba(var(--semi-green-5), 1)", "type": "wxpay", }, diff --git a/setting/user_usable_group.go b/setting/user_usable_group.go index 0ae132d0e4c6..e4eda824cad4 100644 --- a/setting/user_usable_group.go +++ b/setting/user_usable_group.go @@ -7,8 +7,8 @@ import ( ) var userUsableGroups = map[string]string{ - "default": "默认分组", - "vip": "vip分组", + "default": "Default", + "vip": "VIP", } var userUsableGroupsMutex sync.RWMutex diff --git a/web/index.html b/web/index.html index 1e75f3d746cb..0991aa71cbb5 100644 --- a/web/index.html +++ b/web/index.html @@ -1,13 +1,14 @@ - + + New API diff --git a/web/src/App.js b/web/src/App.js index 2d715767d1b4..151a090aa434 100644 --- a/web/src/App.js +++ b/web/src/App.js @@ -277,7 +277,7 @@ function App() { } /> - {/* 方便使用chat2link直接跳转聊天... */} + {/* Convenient for using chat2link to directly jump to chat (Thuận tiện để sử dụng chat2link nhảy trực tiếp đến trò chuyện) */} { setUserData(data); updateAPI(); navigate('/'); - showSuccess('登录成功!'); + showSuccess(t('登录成功!')); setShowWeChatLoginModal(false); } else { showError(message); @@ -146,7 +146,7 @@ const LoginForm = () => { userDispatch({ type: 'login', payload: data }); setUserData(data); updateAPI(); - showSuccess('登录成功!'); + showSuccess(t('登录成功!')); if (username === 'root' && password === '123456') { Modal.error({ title: '您正在使用默认密码!', @@ -192,7 +192,7 @@ const LoginForm = () => { if (success) { userDispatch({ type: 'login', payload: data }); localStorage.setItem('user', JSON.stringify(data)); - showSuccess('登录成功!'); + showSuccess(t('登录成功!')); setUserData(data); updateAPI(); navigate('/'); diff --git a/web/src/components/auth/RegisterForm.js b/web/src/components/auth/RegisterForm.js index 9d213a6001dc..4519b5a16148 100644 --- a/web/src/components/auth/RegisterForm.js +++ b/web/src/components/auth/RegisterForm.js @@ -110,7 +110,7 @@ const RegisterForm = () => { setUserData(data); updateAPI(); navigate('/'); - showSuccess('登录成功!'); + showSuccess(t('登录成功!')); setShowWeChatLoginModal(false); } else { showError(message); @@ -254,7 +254,7 @@ const RegisterForm = () => { if (success) { userDispatch({ type: 'login', payload: data }); localStorage.setItem('user', JSON.stringify(data)); - showSuccess('登录成功!'); + showSuccess(t('登录成功!')); setUserData(data); updateAPI(); navigate('/'); diff --git a/web/src/components/layout/HeaderBar.js b/web/src/components/layout/HeaderBar.js index 4d83d48bf115..78028e7e30eb 100644 --- a/web/src/components/layout/HeaderBar.js +++ b/web/src/components/layout/HeaderBar.js @@ -5,7 +5,7 @@ import { useSetTheme, useTheme } from '../../context/Theme/index.js'; import { useTranslation } from 'react-i18next'; import { API, getLogo, getSystemName, showSuccess, stringToColor } from '../../helpers/index.js'; import fireworks from 'react-fireworks'; -import { CN, GB } from 'country-flag-icons/react/3x2'; +import { CN, GB, VN } from 'country-flag-icons/react/3x2'; import NoticeModal from './NoticeModal.js'; import { @@ -608,6 +608,13 @@ const HeaderBar = ({ onMobileMenuToggle, drawerOpen }) => { English + handleLanguageChange('vn')} + className={`!flex !items-center !gap-2 !px-3 !py-1.5 !text-sm !text-semi-color-text-0 dark:!text-gray-200 ${currentLang === 'vn' ? '!bg-semi-color-primary-light-default dark:!bg-blue-600 !font-semibold' : 'hover:!bg-semi-color-fill-1 dark:hover:!bg-gray-600'}`} + > + + Tiếng Việt + } > diff --git a/web/src/components/settings/DashboardSetting.js b/web/src/components/settings/DashboardSetting.js index ac1a73ed52e5..11ba4873faab 100644 --- a/web/src/components/settings/DashboardSetting.js +++ b/web/src/components/settings/DashboardSetting.js @@ -59,7 +59,7 @@ const DashboardSetting = () => { setLoading(true); await getOptions(); } catch (error) { - showError('刷新失败'); + showError(t('刷新失败')); console.error(error); } finally { setLoading(false); @@ -86,12 +86,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); } @@ -101,22 +101,22 @@ const DashboardSetting = () => { <> {/* 用于迁移检测的旧键模态框,下个版本会删除 */} - setShowMigrateModal(false)} - confirmLoading={loading} - okText="确认迁移" - cancelText="取消" - > -

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

-

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

-
- - {/* 数据看板设置 */} + setShowMigrateModal(false)} + confirmLoading={loading} + okText={t('确认迁移')} + cancelText={t('取消')} + > +

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

+

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

+
+ + {/* 数据看板设置 */} diff --git a/web/src/components/settings/OtherSetting.js b/web/src/components/settings/OtherSetting.js index a054e0da266a..784195de93aa 100644 --- a/web/src/components/settings/OtherSetting.js +++ b/web/src/components/settings/OtherSetting.js @@ -104,10 +104,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 更新失败'); + console.error(t('Logo 更新失败'), error); + showError(t('Logo 更新失败')); } finally { setLoadingInput((loadingInput) => ({ ...loadingInput, Logo: false })); } @@ -120,10 +120,10 @@ const OtherSetting = () => { HomePageContent: true, })); await updateOption(key, inputs[key]); - showSuccess('首页内容已更新'); + showSuccess(t('首页内容已更新')); } catch (error) { - console.error('首页内容更新失败', error); - showError('首页内容更新失败'); + console.error(t('首页内容更新失败'), error); + showError(t('首页内容更新失败')); } finally { setLoadingInput((loadingInput) => ({ ...loadingInput, @@ -136,10 +136,10 @@ const OtherSetting = () => { try { setLoadingInput((loadingInput) => ({ ...loadingInput, About: true })); await updateOption('About', inputs.About); - showSuccess('关于内容已更新'); + showSuccess(t('关于内容已更新')); } catch (error) { - console.error('关于内容更新失败', error); - showError('关于内容更新失败'); + console.error(t('关于内容更新失败'), error); + showError(t('关于内容更新失败')); } finally { setLoadingInput((loadingInput) => ({ ...loadingInput, About: false })); } @@ -149,10 +149,10 @@ const OtherSetting = () => { try { setLoadingInput((loadingInput) => ({ ...loadingInput, Footer: true })); await updateOption('Footer', inputs.Footer); - showSuccess('页脚内容已更新'); + showSuccess(t('页脚内容已更新')); } catch (error) { - console.error('页脚内容更新失败', error); - showError('页脚内容更新失败'); + console.error(t('页脚内容更新失败'), error); + showError(t('页脚内容更新失败')); } finally { setLoadingInput((loadingInput) => ({ ...loadingInput, Footer: false })); } @@ -190,7 +190,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, @@ -200,7 +200,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/PersonalSetting.js b/web/src/components/settings/PersonalSetting.js index 7e2b85fd48d8..27ec54b9f5f4 100644 --- a/web/src/components/settings/PersonalSetting.js +++ b/web/src/components/settings/PersonalSetting.js @@ -1106,40 +1106,40 @@ const PersonalSetting = () => { - {/* Webhook设置 */} + /* Webhook Settings */ {notificationSettings.warningType === 'webhook' && (
- {t('Webhook地址')} + {t('Webhook URL')} handleNotificationSettingChange('webhookUrl', val) } - placeholder={t('请输入Webhook地址,例如: https://example.com/webhook')} + placeholder={t('Please enter Webhook URL, e.g., https://example.com/webhook')} size="large" className="!rounded-lg" prefix={} />
- {t('只支持https,系统将以 POST 方式发送通知,请确保地址可以接收 POST 请求')} + {t('Only HTTPS is supported. The system will send notifications via POST method. Please ensure the URL can receive POST requests')}
- {t('接口凭证(可选)')} + {t('Interface Credentials (Optional)')} handleNotificationSettingChange('webhookSecret', val) } - placeholder={t('请输入密钥')} + placeholder={t('Please enter secret key')} size="large" className="!rounded-lg" prefix={} />
- {t('密钥将以 Bearer 方式添加到请求头中,用于验证webhook请求的合法性')} + {t('The secret key will be added to the request header as Bearer token to verify the legitimacy of webhook requests')}
@@ -1148,7 +1148,7 @@ const PersonalSetting = () => {
- {t('Webhook请求结构')} + {t('Webhook Request Structure')}
{showWebhookDocs ? : } @@ -1156,28 +1156,28 @@ const PersonalSetting = () => {
                                     {`{
-  "type": "quota_exceed",      // 通知类型
-  "title": "标题",             // 通知标题
-  "content": "通知内容",       // 通知内容,支持 {{value}} 变量占位符
-  "values": ["值1", "值2"],    // 按顺序替换content中的 {{value}} 占位符
-  "timestamp": 1739950503      // 时间戳
-}
-
-示例:
-{
-  "type": "quota_exceed",
-  "title": "额度预警通知",
-  "content": "您的额度即将用尽,当前剩余额度为 {{value}}",
-  "values": ["$0.99"],
-  "timestamp": 1739950503
-}`}
+                            "type": "quota_exceed",      // Notification type
+                            "title": "Title",           // Notification title
+                            "content": "Notification content",  // Notification content, supports {{value}} variable placeholders
+                            "values": ["value1", "value2"],     // Replace {{value}} placeholders in content in order
+                            "timestamp": 1739950503     // Timestamp
+                          }
+
+                          Example:
+                          {
+                            "type": "quota_exceed",
+                            "title": "Quota Warning Notification",
+                            "content": "Your quota is running low, current remaining quota is {{value}}",
+                            "values": ["$0.99"],
+                            "timestamp": 1739950503
+                          }`}
                                   
)} - {/* 邮件设置 */} + {/* Email Settings */} {notificationSettings.warningType === 'email' && (
{t('通知邮箱')} diff --git a/web/src/components/table/ChannelsTable.js b/web/src/components/table/ChannelsTable.js index fba5db791d6e..550d341a807b 100644 --- a/web/src/components/table/ChannelsTable.js +++ b/web/src/components/table/ChannelsTable.js @@ -459,6 +459,8 @@ const ChannelsTable = () => { Modal.warning({ title: t('修改子渠道优先级'), content: t('确定要修改所有子渠道优先级为 ') + e.target.value + t(' 吗?'), + okText: t('确定'), + cancelText: t('取消'), onOk: () => { if (e.target.value === '') { return; @@ -511,6 +513,8 @@ const ChannelsTable = () => { Modal.warning({ title: t('修改子渠道权重'), content: t('确定要修改所有子渠道权重为 ') + e.target.value + t(' 吗?'), + okText: t('确定'), + cancelText: t('取消'), onOk: () => { if (e.target.value === '') { return; @@ -548,6 +552,8 @@ const ChannelsTable = () => { Modal.confirm({ title: t('确定是否要删除此渠道?'), content: t('此修改将不可逆'), + okText: t('确定'), + cancelText: t('取消'), onOk: () => { (async () => { await manageChannel(record.id, 'delete', record); @@ -570,6 +576,8 @@ const ChannelsTable = () => { Modal.confirm({ title: t('确定是否要复制此渠道?'), content: t('复制渠道的所有信息'), + okText: t('确定'), + cancelText: t('取消'), onOk: () => copySelectedChannel(record), }); }, @@ -1579,6 +1587,8 @@ const ChannelsTable = () => { Modal.confirm({ title: t('确定是否要删除所选通道?'), content: t('此修改将不可逆'), + okText: t('确定'), + cancelText: t('取消'), onOk: () => batchDeleteChannels(), }); }} @@ -1610,6 +1620,8 @@ const ChannelsTable = () => { Modal.confirm({ title: t('确定?'), content: t('确定要测试所有通道吗?'), + okText: t('确定'), + cancelText: t('取消'), onOk: () => testAllChannels(), size: 'small', centered: true, @@ -1627,6 +1639,8 @@ const ChannelsTable = () => { Modal.confirm({ title: t('确定是否要修复数据库一致性?'), content: t('进行该操作时,可能导致渠道访问错误,请仅在数据库出现问题时使用'), + okText: t('确定'), + cancelText: t('取消'), onOk: () => fixChannelsAbilities(), size: 'sm', centered: true, @@ -1645,6 +1659,8 @@ const ChannelsTable = () => { Modal.confirm({ title: t('确定?'), content: t('确定要更新所有已启用通道余额吗?'), + okText: t('确定'), + cancelText: t('取消'), onOk: () => updateAllChannelsBalance(), size: 'sm', centered: true, @@ -1663,6 +1679,8 @@ const ChannelsTable = () => { Modal.confirm({ title: t('确定是否要删除禁用通道?'), content: t('此修改将不可逆'), + okText: t('确定'), + cancelText: t('取消'), onOk: () => deleteAllDisabledChannels(), size: 'sm', centered: true, @@ -2200,6 +2218,7 @@ const ChannelsTable = () => { showSizeChanger: false, onPageChange: (page) => setModelTablePage(page), }} + emptyText={t('暂无数据')} />
)} diff --git a/web/src/components/table/RedemptionsTable.js b/web/src/components/table/RedemptionsTable.js index b463294e83cd..8a4d3dc1c485 100644 --- a/web/src/components/table/RedemptionsTable.js +++ b/web/src/components/table/RedemptionsTable.js @@ -151,6 +151,8 @@ const RedemptionsTable = () => { Modal.confirm({ title: t('确定是否要删除此兑换码?'), content: t('此修改将不可逆'), + okText: t('确定'), + cancelText: t('取消'), onOk: () => { (async () => { await manageRedemption(record.id, 'delete', record); @@ -486,6 +488,8 @@ const RedemptionsTable = () => { Modal.confirm({ title: t('确定清除所有失效兑换码?'), content: t('将删除已使用、已禁用及过期的兑换码,此操作不可撤销。'), + okText: t('确定'), + cancelText: t('取消'), onOk: async () => { setLoading(true); const res = await API.delete('/api/redemption/invalid'); diff --git a/web/src/components/table/TokensTable.js b/web/src/components/table/TokensTable.js index ac7fca9271d2..59a8f45398c3 100644 --- a/web/src/components/table/TokensTable.js +++ b/web/src/components/table/TokensTable.js @@ -419,6 +419,8 @@ const TokensTable = () => { Modal.confirm({ title: t('确定是否要删除此令牌?'), content: t('此修改将不可逆'), + okText: t('确定'), + cancelText: t('取消'), onOk: () => { (async () => { await manageToken(record.id, 'delete', record); @@ -788,6 +790,8 @@ const TokensTable = () => { {t('确定要删除所选的 {{count}} 个令牌吗?', { count: selectedKeys.length })} ), + okText: t('确定'), + cancelText: t('取消'), onOk: () => batchDeleteTokens(), }); }} diff --git a/web/src/components/table/UsersTable.js b/web/src/components/table/UsersTable.js index 193e1d657165..7c3ba5b1e070 100644 --- a/web/src/components/table/UsersTable.js +++ b/web/src/components/table/UsersTable.js @@ -218,6 +218,8 @@ const UsersTable = () => { Modal.confirm({ title: t('确定要提升此用户吗?'), content: t('此操作将提升用户的权限级别'), + okText: t('确定'), + cancelText: t('取消'), onOk: () => { manageUser(record.id, 'promote', record); }, @@ -232,6 +234,8 @@ const UsersTable = () => { Modal.confirm({ title: t('确定要降级此用户吗?'), content: t('此操作将降低用户的权限级别'), + okText: t('确定'), + cancelText: t('取消'), onOk: () => { manageUser(record.id, 'demote', record); }, @@ -246,6 +250,8 @@ const UsersTable = () => { Modal.confirm({ title: t('确定是否要注销此用户?'), content: t('相当于删除用户,此修改将不可逆'), + okText: t('确定'), + cancelText: t('取消'), onOk: () => { (async () => { await manageUser(record.id, 'delete', record); diff --git a/web/src/helpers/utils.js b/web/src/helpers/utils.js index 6c4f127590ac..8ddfa79b8b37 100644 --- a/web/src/helpers/utils.js +++ b/web/src/helpers/utils.js @@ -103,22 +103,22 @@ export function showError(error) { window.location.href = '/login?expired=true'; break; case 429: - Toast.error('错误:请求次数过多,请稍后再试!'); + Toast.error(t('错误:请求次数过多,请稍后再试!')); break; case 500: - Toast.error('错误:服务器内部错误,请联系管理员!'); + Toast.error(t('错误:服务器内部错误,请联系管理员!' )); break; case 405: - Toast.info('本站仅作演示之用,无服务端!'); + Toast.info(t('本站仅作演示之用,无服务端!')); break; default: - Toast.error('错误:' + error.message); + Toast.error(t('错误:') + error.message); } return; } - Toast.error('错误:' + error.message); + Toast.error(t('错误:') + error.message); } else { - Toast.error('错误:' + error); + Toast.error(t('错误:') + error); } } diff --git a/web/src/i18n/i18n.js b/web/src/i18n/i18n.js index c1bf5860b4d4..40844824b692 100644 --- a/web/src/i18n/i18n.js +++ b/web/src/i18n/i18n.js @@ -4,6 +4,7 @@ import LanguageDetector from 'i18next-browser-languagedetector'; import enTranslation from './locales/en.json'; import zhTranslation from './locales/zh.json'; +import vnTranslation from './locales/vn.json'; i18n .use(LanguageDetector) @@ -16,6 +17,9 @@ i18n zh: { translation: zhTranslation, }, + vn: { + translation: vnTranslation, + }, }, fallbackLng: 'zh', interpolation: { diff --git a/web/src/i18n/locales/en.json b/web/src/i18n/locales/en.json index 1ff11e1f67d0..95c204cc3e70 100644 --- a/web/src/i18n/locales/en.json +++ b/web/src/i18n/locales/en.json @@ -1005,7 +1005,7 @@ "防失联-定期通知": "Prevent loss of contact - regular notifications", "订阅事件后,当事件触发时,您将会收到相应的通知": "After subscribing to the event, you will receive the corresponding notification when the event is triggered.", "当余额低于 ": "When the balance is lower than", - "保存": "save", + "保存": "Save", "计费说明": "Billing instructions", "高稳定性": "High stability", "没有账号请先": "If you don't have an account, please", @@ -1781,5 +1781,95 @@ "启用全部密钥": "Enable all keys", "以充值价格显示": "Show with recharge price", "美元汇率(非充值汇率,仅用于定价页面换算)": "USD exchange rate (not recharge rate, only used for pricing page conversion)", - "美元汇率": "USD exchange rate" + "美元汇率": "USD exchange rate", + "加载关于内容失败...": "Failed to load about content...", + "密钥输入方式": "Key input method", + "批量创建模式下仅支持文件上传,不支持手动输入": "Batch creation mode only supports file upload, manual input is not supported", + "密钥(编辑模式下,保存的密钥不会显示)": "Key (in edit mode, saved keys are not displayed)", + "请输入完整的 JSON 格式密钥内容": "Please enter complete JSON format key content", + "不需要在末尾加/v1,New API会自动处理,添加后可能导致请求失败,是否继续?": "No need to add /v1 at the end, New API will handle it automatically, adding it may cause request failure, continue?", + "例如:0001": "For example: 0001", + "Stripe 设置": "Stripe Settings", + "更新 Stripe 设置": "Update Stripe Settings", + "Stripe 密钥、Webhook 等设置请": "For Stripe key, Webhook and other settings, please", + "测试环境": "Test environment", + "进行设置,最好先在": "set up in the", + "进行测试。": "for testing.", + "网站地址": "Website URL", + "Webhook 填": "Webhook fill in", + "需要包含事件": "needs to include event", + "和": "and", + "API 密钥": "API key", + "Webhook 签名密钥": "Webhook signature key", + "商品价格 ID": "Product price ID", + "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "Stripe key with sk_xxx or rk_xxx, sensitive information is not displayed", + "whsec_xxx 的 Webhook 签名密钥,敏感信息不显示": "Webhook signature key with whsec_xxx, sensitive information is not displayed", + "price_xxx 的商品价格 ID,新建产品后可获得": "Product price ID with price_xxx, can be obtained after creating a new product", + "分组倍率设置,可以在此处新增分组或修改现有分组的倍率,格式为 JSON 字符串,例如:{\"vip\": 0.5, \"test\": 1},表示 vip 分组的倍率为 0.5,test 分组的倍率为 1": "Group multiplier settings, you can add new groups or modify the multipliers of existing groups here, the format is JSON string, for example: {\"vip\": 0.5, \"test\": 1}, indicating that the multiplier of the vip group is 0.5 and the multiplier of the test group is 1", + "用户新建令牌时可选的分组,格式为 JSON 字符串,例如:{\"vip\": \"VIP 用户\", \"test\": \"测试\"},表示用户可以选择 vip 分组和 test 分组": "User selectable groups when creating a new token, format is JSON string, for example: {\"vip\": \"VIP User\", \"test\": \"Test\"}, indicating that the user can choose the vip group and the test group", + "键为分组名称,值为另一个 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 multiplier for users in that group. For example: {\"vip\": {\"default\": 0.5, \"test\": 1}}, indicating that users in the vip group have a multiplier of 0.5 when using tokens from the default group and a multiplier of 1 when using tokens from the test group.", + "分组特殊倍率": "Group special multiplier", + "自动分组auto,从第一个开始选择": "Auto group auto, starting from the first selection", + "必须是有效的 JSON 字符串数组,例如:[\"g1\",\"g2\"]": "Must be a valid JSON string array, for example: [\"g1\",\"g2\"]", + "创建令牌默认选择auto分组,初始令牌也将设为auto(否则留空,为用户默认分组)": "Create token default select auto group, initial token will also be set to auto (otherwise leave blank, for user's default group)", + "编辑模型": "Edit Model", + "按倍率设置": "Set by ratio", + "价格设置方式": "Price setting method", + "按价格设置": "Set by price", + "输出价格": "Output price", + "输入价格": "Input price", + "模型价格不能为0": "Model price cannot be 0", + "倍率模式": "Ratio mode", + "输入补全价格": "Input completion price", +"暂无数据": "No data available", +"暂无响应数据": "No response data available", +"暂无请求数据": "No request data available", +"正在构造请求体预览...": "Constructing request body preview...", +"确认导入配置": "Confirm import configuration", +"导入的配置将覆盖当前设置,是否继续?": "The imported configuration will overwrite the current settings, continue?", +"确定导入": "Confirm import", +"配置导入成功": "Configuration imported successfully", +"导入配置失败": "Failed to import configuration", +"配置迁移确认": "Configuration migration confirmation", +"确认迁移": "Confirm migration", +"检测到旧版本的配置数据,是否要迁移到新的配置格式?": "Old version configuration data detected, do you want to migrate to the new configuration format?", +"注意:": "Note:", +"迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。": "During the migration process, data format conversion will be automatically handled. After the migration is completed, the old configuration will be cleared. Please back up the old configuration in the database before migration.", +"旧配置迁移完成": "Old configuration migration completed", +"迁移失败": "Migration failed", +"未知错误": "Unknown error", +"分组速率限制": "Group rate limit", +"说明:": "Description:", +"使用 JSON 对象格式,格式为:{\"组名\": [最多请求次数, 最多请求完成次数]}": "Use JSON object format, the format is: {\"group name\": [maximum request count, maximum completion count]}", +"示例:{\"default\": [200, 100], \"vip\": [0, 1000]}。": "Example: {\"default\": [200, 100], \"vip\": [0, 1000]}.", +"[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。": "[maximum request count] must be greater than or equal to 0, [maximum completion count] must be greater than or equal to 1.", +"分组速率配置优先级高于全局速率限制。": "Group rate configuration has higher priority than global rate limit.", +"限制周期统一使用上方配置的“限制周期”值。": "The limit cycle uniformly uses the \"limit cycle\" value configured above.", +"全局设置": "Global Settings", +"启用请求透传": "Enable request passthrough", +"开启后,所有请求将直接透传给上游,不会进行任何处理(重定向和渠道适配也将失效),请谨慎开启": "After enabling, all requests will be directly passed through to the upstream without any processing (redirection and channel adaptation will also be invalid), please enable with caution", +"连接保活设置": "Connection keep-alive settings", +"警告:启用保活后,如果已经写入保活数据后渠道出错,系统无法重试,如果必须开启,推荐设置尽可能大的Ping间隔": "Warning: After enabling keep-alive, if the channel fails after keep-alive data has been written, the system cannot retry. If it must be enabled, it is recommended to set the Ping interval as large as possible", +"启用Ping间隔": "Enable Ping interval", +"开启后,将定期发送ping数据保持连接活跃": "After enabling, ping data will be sent periodically to keep the connection alive", +"Ping间隔(秒)": "Ping interval (seconds)", +"支持的图像模型": "Supported image models", +"Gemini思考适配设置": "Gemini Think adaptation settings", +"和Claude不同,默认情况下Gemini的思考模型会自动决定要不要思考,就算不开启适配模型也可以正常使用,如果您需要计费,推荐设置无后缀模型价格按思考价格设置。支持使用 gemini-2.5-pro-preview-06-05-thinking-128 格式来精确传递思考预算。": "Unlike Claude, by default Gemini's thinking model will automatically decide whether to think or not, even if the adaptation model is not enabled, it can be used normally. If you need to charge, it is recommended to set the price of the model without suffix according to the thinking price. Supports using gemini-2.5-pro-preview-06-05-thinking-128 format to accurately pass the thinking budget.", +"适配 -thinking、-thinking-预算数字 和 -nothinking 后缀": "Adapt -thinking, -thinking-budget number and -nothinking suffix", +"Gemini思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Gemini thinking adaptation BudgetTokens = MaxTokens * BudgetTokens percentage", +"0.002-1之间的小数": "Decimal between 0.002-1", +"Logo 更新失败":" Logo update failed", +"首页内容更新失败":" Homepage content update failed", +"系统名称更新失败":" System name update failed", +"公告更新失败":" Notice update failed", +"关于内容更新失败":" About content update failed", +"关于内容已更新":" About content updated", +"已是最新版本:${tag_name}":" Already the latest version: ${tag_name}", +"检查更新失败,请稍后再试":" Check for updates failed, please try again later", +"共 {{total}} 条": "Total {{total}} items", +"10 条/页": "10 items/page", +"20 条/页": "20 items/page", +"50 条/页": "50 items/page", +"100 条/页": "100 items/page" } \ No newline at end of file diff --git a/web/src/i18n/locales/vn.json b/web/src/i18n/locales/vn.json new file mode 100644 index 000000000000..42a82e7c0bce --- /dev/null +++ b/web/src/i18n/locales/vn.json @@ -0,0 +1,2190 @@ +{ + "主页": "Trang chủ", + "控制台": "Bảng điều khiển", + "$%.6f 额度": "$%.6f hạn mức", + "或": "hoặc", + "登 录": "Đăng nhập", + "注 册": "Đăng ký", + "使用 邮箱或用户名 登录": "Đăng nhập bằng email hoặc tên người dùng", + "使用 GitHub 继续": "Tiếp tục với GitHub", + "使用 OIDC 继续": "Tiếp tục với OIDC", + "使用 微信 继续": "Tiếp tục với WeChat", + "使用 LinuxDO 继续": "Tiếp tục với LinuxDO", + "使用 用户名 注册": "Đăng ký bằng tên người dùng", + "其他登录选项": "Các tùy chọn đăng nhập khác", + "其他注册选项": "Các tùy chọn đăng ký khác", + "请输入您的用户名或邮箱地址": "Vui lòng nhập tên người dùng hoặc địa chỉ email của bạn", + "请输入您的邮箱地址": "Vui lòng nhập địa chỉ email của bạn", + "请输入您的密码": "Vui lòng nhập mật khẩu của bạn", + "继续": "Tiếp tục", + "%d 点额度": "%d điểm hạn mức", + "尚未实现": "Chưa được triển khai", + "余额不足": "Hạn mức không đủ", + "危险操作": "Thao tác nguy hiểm", + "输入你的账户名": "Nhập tên tài khoản của bạn", + "确认删除": "Xác nhận xóa", + "确认绑定": "Xác nhận liên kết", + "您正在删除自己的帐户,将清空所有数据且不可恢复": "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.", + "通道「%s」(#%d)已被禁用": "Kênh %s (#%d) đã bị vô hiệu hóa", + "通道「%s」(#%d)已被禁用,原因:%s": "Kênh %s (#%d) đã bị vô hiệu hóa, lý do: %s", + "测试已在运行中": "Kiểm tra đang được tiến hành", + "响应时间 %.2fs 超过阈值 %.2fs": "Thời gian phản hồi %.2fs vượt quá ngưỡng %.2fs", + "通道测试完成": "Kiểm tra kênh hoàn tất", + "通道测试完成,如果没有收到禁用通知,说明所有通道都正常": "Kiểm tra kênh hoàn tất. Nếu không nhận được thông báo vô hiệu hóa, tất cả các kênh đều hoạt động bình thường", + "无法连接至 GitHub 服务器,请稍后重试!": "Không thể kết nối với máy chủ GitHub. Vui lòng thử lại sau!", + "返回值非法,用户字段为空,请稍后重试!": "Giá trị trả về không hợp lệ, trường người dùng trống. Vui lòng thử lại sau!", + "管理员未开启通过 GitHub 登录以及注册": "Quản trị viên chưa kích hoạt đăng nhập và đăng ký qua GitHub", + "管理员关闭了新用户注册": "Quản trị viên đã tắt đăng ký người dùng mới", + "用户已被封禁": "Người dùng đã bị cấm", + "该 GitHub 账户已被绑定": "Tài khoản GitHub này đã được liên kết", + "邮箱地址已被占用": "Địa chỉ email đã được sử dụng", + "%s邮箱验证邮件": "Email xác minh %s", + "

您好,你正在进行%s邮箱验证。

": "

Xin chào, bạn đang thực hiện xác minh email %s.

", + "

您的验证码为: %s

": "

Mã xác minh của bạn là: %s

", + "

验证码 %d 分钟内有效,如果不是本人操作,请忽略。

": "

Mã xác minh có hiệu lực trong %d phút. Nếu không phải bạn thực hiện, vui lòng bỏ qua.

", + "无效的参数": "Tham số không hợp lệ", + "该邮箱地址未注册": "Địa chỉ email này chưa được đăng ký", + "%s密码重置": "Đặt lại mật khẩu %s", + "

您好,你正在进行%s密码重置。

": "

Xin chào, bạn đang thực hiện đặt lại mật khẩu %s.

", + "

点击此处进行密码重置。

": "

Nhấp vào đây để đặt lại mật khẩu.

", + "

重置链接 %d 分钟内有效,如果不是本人操作,请忽略。

": "

Liên kết đặt lại có hiệu lực trong %d phút. Nếu không phải bạn thực hiện, vui lòng bỏ qua.

", + "重置链接非法或已过期": "Liên kết đặt lại không hợp lệ hoặc đã hết hạn", + "无法启用 GitHub OAuth,请先填入 GitHub Client ID 以及 GitHub Client Secret!": "Không thể kích hoạt GitHub OAuth. Vui lòng nhập GitHub Client ID và GitHub Client Secret trước!", + "无法启用微信登录,请先填入微信登录相关配置信息!": "Không thể kích hoạt đăng nhập WeChat. Vui lòng nhập thông tin cấu hình đăng nhập WeChat trước!", + "无法启用 Turnstile 校验,请先填入 Turnstile 校验相关配置信息!": "Không thể kích hoạt xác minh Turnstile. Vui lòng nhập thông tin cấu hình xác minh Turnstile trước!", + "兑换码名称长度必须在1-20之间": "Tên mã đổi thưởng phải có độ dài từ 1 đến 20 ký tự", + "兑换码个数必须大于0": "Số lượng mã đổi thưởng phải lớn hơn 0", + "一次兑换码批量生成的个数不能大于 100": "Số lượng mã đổi thưởng được tạo hàng loạt không được vượt quá 100", + "当前分组上游负载已饱和,请稍后再试": "Tải trọng thượng nguồn của nhóm hiện tại đã bão hòa. Vui lòng thử lại sau", + "令牌名称过长": "Tên mã thông báo quá dài", + "令牌已过期,无法启用,请先修改令牌过期时间,或者设置为永不过期": "Mã thông báo đã hết hạn và không thể kích hoạt. Vui lòng sửa đổi thời gian hết hạn của mã hoặc đặt thành không bao giờ hết hạn", + "令牌可用额度已用尽,无法启用,请先修改令牌剩余额度,或者设置为无限额度": "Hạn mức khả dụng của mã thông báo đã hết và không thể kích hoạt. Vui lòng sửa đổi hạn mức còn lại hoặc đặt thành không giới hạn", + "管理员关闭了密码登录": "Quản trị viên đã tắt đăng nhập bằng mật khẩu", + "无法保存会话信息,请重试": "Không thể lưu thông tin phiên. Vui lòng thử lại", + "管理员关闭了通过密码进行注册,请使用第三方账户验证的形式进行注册": "Quản trị viên đã tắt đăng ký bằng mật khẩu. Vui lòng đăng ký bằng cách xác minh tài khoản bên thứ ba", + "输入不合法 ": "Đầu vào không hợp lệ ", + "管理员开启了邮箱验证,请输入邮箱地址和验证码": "Quản trị viên đã kích hoạt xác minh email. Vui lòng nhập địa chỉ email và mã xác minh", + "验证码错误或已过期": "Mã xác minh không đúng hoặc đã hết hạn", + "无权获取同级或更高等级用户的信息": "Không có quyền truy cập thông tin của người dùng cùng cấp hoặc cấp cao hơn", + "请重试,系统生成的 UUID 竟然重复了!": "Vui lòng thử lại, UUID do hệ thống tạo ra bị trùng lặp!", + "输入不合法": "Đầu vào không hợp lệ", + "无权更新同权限等级或更高权限等级的用户信息": "Không có quyền cập nhật thông tin của người dùng cùng cấp hoặc cấp cao hơn", + "管理员将用户额度从 %s修改为 %s": "Quản trị viên đã sửa đổi hạn mức người dùng từ %s thành %s", + "无权删除同权限等级或更高权限等级的用户": "Không có quyền xóa người dùng cùng cấp hoặc cấp cao hơn", + "无法创建权限大于等于自己的用户": "Không thể tạo người dùng có quyền hạn lớn hơn hoặc bằng chính bạn", + "用户不存在": "Người dùng không tồn tại", + "无法禁用超级管理员用户": "Không thể vô hiệu hóa người dùng quản trị viên cấp cao", + "无法删除超级管理员用户": "Không thể xóa người dùng quản trị viên cấp cao", + "普通管理员用户无法提升其他用户为管理员": "Quản trị viên thông thường không thể nâng cấp người dùng khác thành quản trị viên", + "该用户已经是管理员": "Người dùng này đã là quản trị viên", + "无法降级超级管理员用户": "Không thể hạ cấp người dùng quản trị viên cấp cao", + "该用户已经是普通用户": "Người dùng này đã là người dùng thông thường", + "管理员未开启通过微信登录以及注册": "Quản trị viên chưa kích hoạt đăng nhập và đăng ký qua WeChat", + "该微信账号已被绑定": "Tài khoản WeChat này đã được liên kết", + "无权进行此操作,未登录且未提供 access token": "Không có quyền thực hiện thao tác này: chưa đăng nhập và không cung cấp mã truy cập", + "无权进行此操作,access token 无效": "Không có quyền thực hiện thao tác này: mã truy cập không hợp lệ", + "无权进行此操作,权限不足": "Không có quyền thực hiện thao tác này: quyền hạn không đủ", + "普通用户不支持指定渠道": "Người dùng thông thường không hỗ trợ chỉ định kênh", + "无效的渠道 ID": "ID kênh không hợp lệ", + "该渠道已被禁用": "Kênh này đã bị vô hiệu hóa", + "无效的请求": "Yêu cầu không hợp lệ", + "无可用渠道": "Không có kênh nào khả dụng", + "Turnstile token 为空": "Mã Turnstile trống", + "Turnstile 校验失败,请刷新重试!": "Xác minh Turnstile thất bại. Vui lòng làm mới và thử lại!", + "id 为空!": "ID trống!", + "未提供兑换码": "Không cung cấp mã đổi thưởng", + "无效的 user id": "ID người dùng không hợp lệ", + "无效的兑换码": "Mã đổi thưởng không hợp lệ", + "该兑换码已被使用": "Mã đổi thưởng này đã được sử dụng", + "通过兑换码充值 %s": "Nạp hạn mức %s qua mã đổi thưởng", + "未提供令牌": "Không cung cấp mã thông báo", + "该令牌状态不可用": "Trạng thái mã thông báo không khả dụng", + "该令牌已过期": "Mã thông báo đã hết hạn", + "该令牌额度已用尽": "Hạn mức mã thông báo đã cạn kiệt", + "无效的令牌": "Mã thông báo không hợp lệ", + "id 或 userId 为空!": "ID hoặc userID trống!", + "quota 不能为负数!": "Hạn mức không được âm!", + "令牌额度不足": "Hạn mức mã thông báo không đủ", + "用户额度不足": "Hạn mức người dùng không đủ", + "您的额度即将用尽": "Hạn mức của bạn sắp cạn", + "您的额度已用尽": "Hạn mức của bạn đã cạn", + "%s,当前剩余额度为 %d,为了不影响您的使用,请及时充值。
充值链接:%s": "%s, hạn mức còn lại hiện tại là %d. Để không ảnh hưởng đến việc sử dụng, vui lòng nạp thêm kịp thời.
Liên kết nạp tiền: %s", + "affCode 为空!": "Mã liên kết trống!", + "新用户注册赠送 %s": "Tặng %s cho người dùng mới đăng ký", + "使用邀请码赠送 %s": "Tặng %s khi sử dụng mã mời", + "邀请用户赠送 %s": "Tặng %s khi mời người dùng", + "用户名或密码为空": "Tên người dùng hoặc mật khẩu trống", + "用户名或密码错误,或用户已被封禁": "Tên người dùng hoặc mật khẩu sai, hoặc người dùng đã bị cấm", + "email 为空!": "Email trống!", + "GitHub id 为空!": "ID GitHub trống!", + "WeChat id 为空!": "ID WeChat trống!", + "username 为空!": "Tên người dùng trống!", + "邮箱地址或密码为空!": "Địa chỉ email hoặc mật khẩu trống!", + "OpenAI 接口聚合管理,支持多种渠道包括 Azure,可用于二次分发管理 key,仅单可执行文件,已打包好 Docker 镜像,一键部署,开箱即用": "Hệ thống quản lý tổng hợp giao diện OpenAI, hỗ trợ nhiều kênh bao gồm Azure, có thể được sử dụng để quản lý và phân phối lại khóa, chỉ với một tệp thực thi duy nhất, đã được đóng gói thành hình ảnh Docker, triển khai một cú nhấp chuột, sẵn sàng sử dụng", + "未知类型": "Loại không xác định", + "不支持": "Không được hỗ trợ", + "操作成功完成!": "Thao tác hoàn tất thành công!", + "已启用": "Đã kích hoạt", + "已禁用": "Đã vô hiệu hóa", + "未知状态": "Trạng thái không xác định", + " 秒": " giây", + " 分钟 ": " phút ", + " 小时 ": " giờ ", + " 天 ": " ngày ", + " 个月 ": " tháng ", + " 年 ": " năm ", + "未测试": "Chưa kiểm tra", + "通道 ${name} 测试成功,耗时 ${time.toFixed(2)} 秒。": "Kênh ${name} kiểm tra thành công, mất ${time.toFixed(2)} giây.", + "已成功开始测试所有已启用通道,请刷新页面查看结果。": "Đã bắt đầu kiểm tra tất cả các kênh đã kích hoạt thành công. Vui lòng làm mới trang để xem kết quả.", + "通道 ${name} 余额更新成功!": "Hạn mức kênh ${name} cập nhật thành công!", + "已更新完毕所有已启用通道余额!": "Đã cập nhật xong hạn mức tất cả các kênh đã kích hoạt!", + "渠道ID,名称,密钥,API地址": "ID kênh, tên, khóa, địa chỉ API", + "名称": "Tên", + "分组": "Nhóm", + "类型": "Loại", + "状态": "Trạng thái", + "响应时间": "Thời gian phản hồi", + "余额": "Hạn mức", + "操作": "Thao tác", + "未更新": "Chưa cập nhật", + "测试": "Kiểm tra", + "更新余额": "Cập nhật hạn mức", + "删除": "Xóa", + "删除渠道 {channel.name}": "Xóa kênh {channel.name}", + "禁用": "Vô hiệu hóa", + "启用": "Kích hoạt", + "编辑": "Chỉnh sửa", + "添加新的渠道": "Thêm kênh mới", + "测试所有已启用通道": "Kiểm tra tất cả các kênh đã kích hoạt", + "更新所有已启用通道余额": "Cập nhật hạn mức tất cả các kênh đã kích hoạt", + "刷新": "Làm mới", + "绑定成功!": "Liên kết thành công!", + "登录成功!": "Đăng nhập thành công!", + "操作失败,重定向至登录界面中...": "Thao tác thất bại, đang chuyển hướng đến trang đăng nhập...", + "出现错误,第 ${count} 次重试中...": "Xảy ra lỗi, đang thử lại lần thứ ${count}...", + "首页": "Trang chủ", + "渠道": "Kênh", + "令牌": "Mã thông báo", + "兑换额度": "Đổi thưởng", + "充值": "Nạp tiền", + "用户": "Người dùng", + "日志": "Nhật ký", + "设置": "Cài đặt", + "关于": "Giới thiệu", + "价格": "Giá cả", + "注销成功!": "Đăng xuất thành công!", + "注销": "Đăng xuất", + "登录": "Đăng nhập", + "注册": "Đăng ký", + "未登录或登录已过期,请重新登录!": "Chưa đăng nhập hoặc phiên đăng nhập đã hết hạn. Vui lòng đăng nhập lại!", + "用户登录": "Đăng nhập người dùng", + "密码": "Mật khẩu", + "忘记密码?": "Quên mật khẩu?", + "点击重置": "Nhấp để đặt lại", + "; 没有账户?": "; Không có tài khoản?", + "点击注册": "Nhấp để đăng ký", + "微信扫码关注公众号,输入「验证码」获取验证码(三分钟内有效)": "Quét mã QR WeChat để theo dõi tài khoản chính thức, nhập \"mã xác minh\" để nhận mã (có hiệu lực trong 3 phút)", + "全部用户": "Tất cả người dùng", + "当前用户": "Người dùng hiện tại", + "全部'": "Tất cả'", + "充值'": "Nạp tiền'", + "消费'": "Tiêu thụ'", + "管理'": "Quản lý'", + "系统'": "Hệ thống'", + " 充值 ": " Nạp tiền ", + " 消费 ": " Tiêu thụ ", + " 管理 ": " Quản lý ", + " 系统 ": " Hệ thống ", + " 未知 ": " Không xác định ", + "时间": "Thời gian", + "详情": "Chi tiết", + "选择模式": "Chọn chế độ", + "选择明细分类": "Chọn danh mục chi tiết", + "模型倍率不是合法的 JSON 字符串": "Tỷ lệ mô hình không phải là chuỗi JSON hợp lệ", + "通用设置": "Cài đặt chung", + "充值链接": "Liên kết nạp tiền", + "例如发卡网站的购买链接": "Ví dụ: liên kết mua từ trang web phát hành thẻ", + "文档地址": "Địa chỉ tài liệu", + "例如 https://docs.newapi.pro": "Ví dụ: https://docs.newapi.pro", + "聊天页面链接": "Liên kết trang trò chuyện", + "例如 ChatGPT Next Web 的部署地址": "Ví dụ: địa chỉ triển khai của ChatGPT Next Web", + "单位美元额度": "Hạn mức mỗi đô la", + "一单位货币能兑换的额度": "Hạn mức có thể đổi được cho mỗi đơn vị tiền tệ", + "启用额度消费日志记录": "Kích hoạt ghi nhật ký tiêu thụ hạn mức", + "以货币形式显示额度": "Hiển thị hạn mức dưới dạng tiền tệ", + "相关 API 显示令牌额度而非用户额度": "API liên quan hiển thị hạn mức mã thông báo thay vì hạn mức người dùng", + "保存通用设置": "Lưu cài đặt chung", + "监控设置": "Cài đặt giám sát", + "测试所有渠道的最长响应时间": "Thời gian phản hồi tối đa khi kiểm tra tất cả các kênh", + "单位秒": "Đơn vị: giây", + "当运行通道全部测试时": "Khi chạy kiểm tra tất cả các kênh", + "超过此时间将自动禁用通道": "Kênh vượt quá thời gian này sẽ tự động bị vô hiệu hóa", + "额度提醒阈值": "Ngưỡng nhắc nhở hạn mức", + "低于此额度时将发送邮件提醒用户": "Email nhắc nhở sẽ được gửi khi hạn mức giảm xuống dưới mức này", + "失败时自动禁用通道": "Tự động vô hiệu hóa kênh khi thất bại", + "保存监控设置": "Lưu cài đặt giám sát", + "额度设置": "Cài đặt hạn mức", + "新用户初始额度": "Hạn mức ban đầu cho người dùng mới", + "例如": "Ví dụ", + "请求预扣费额度": "Hạn mức khấu trừ trước cho yêu cầu", + "请求结束后多退少补": "Điều chỉnh sau khi yêu cầu hoàn tất", + "邀请新用户奖励额度": "Hạn mức thưởng khi mời người dùng mới", + "新用户使用邀请码奖励额度": "Hạn mức thưởng cho người dùng mới sử dụng mã mời", + "保存额度设置": "Lưu cài đặt hạn mức", + "倍率设置": "Cài đặt tỷ lệ", + "模型倍率": "Tỷ lệ mô hình", + "为一个 JSON 文本": "Là một văn bản JSON", + "键为模型名称": "Khóa là tên mô hình", + "值为倍率": "Giá trị là tỷ lệ", + "分组倍率": "Tỷ lệ nhóm", + "键为分组名称": "Khóa là tên nhóm", + "保存倍率设置": "Lưu cài đặt tỷ lệ", + "已是最新版本": "Đã là phiên bản mới nhất", + "检查更新": "Kiểm tra cập nhật", + "公告": "Thông báo", + "在此输入新的公告内容,支持 Markdown & HTML 代码": "Nhập nội dung thông báo mới tại đây, hỗ trợ mã Markdown & HTML", + "保存公告": "Lưu thông báo", + "个性化设置": "Cài đặt cá nhân hóa", + "系统名称": "Tên hệ thống", + "在此输入系统名称": "Nhập tên hệ thống tại đây", + "设置系统名称": "Cài đặt tên hệ thống", + "图片地址": "Địa chỉ hình ảnh", + "在此输入 Logo 图片地址": "Nhập địa chỉ hình ảnh Logo tại đây", + "首页内容": "Nội dung trang chủ", + "在此输入首页内容,支持 Markdown & HTML 代码,设置后首页的状态信息将不再显示。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为首页": "Nhập nội dung trang chủ tại đây, hỗ trợ mã Markdown & HTML, sau khi cài đặt, thông tin trạng thái trang chủ sẽ không còn hiển thị. Nếu nhập một liên kết, liên kết đó sẽ được sử dụng làm thuộc tính src của iframe, cho phép bạn đặt bất kỳ trang web nào làm trang chủ", + "保存首页内容": "Lưu nội dung trang chủ", + "在此输入新的关于内容,支持 Markdown & HTML 代码。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为关于页面": "Nhập nội dung giới thiệu mới tại đây, hỗ trợ mã Markdown & HTML. Nếu nhập một liên kết, liên kết đó sẽ được sử dụng làm thuộc tính src của iframe, cho phép bạn đặt bất kỳ trang web nào làm trang giới thiệu", + "保存关于": "Lưu giới thiệu", + "移除 One API 的版权标识必须首先获得授权,项目维护需要花费大量精力,如果本项目对你有意义,请主动支持本项目": "Việc xóa nhãn bản quyền của One API phải được ủy quyền trước. Việc duy trì dự án đòi hỏi rất nhiều công sức. Nếu dự án này có ý nghĩa với bạn, vui lòng chủ động hỗ trợ dự án", + "页脚": "Chân trang", + "在此输入新的页脚,留空则使用默认页脚,支持 HTML 代码": "Nhập chân trang mới tại đây, để trống sẽ sử dụng chân trang mặc định, hỗ trợ mã HTML", + "设置页脚": "Cài đặt chân trang", + "新版本": "Phiên bản mới", + "关闭": "Đóng", + "密码已重置并已复制到剪贴板:": "Mật khẩu đã được đặt lại và sao chép vào khay nhớ tạm: ", + "密码已复制到剪贴板:": "Mật khẩu đã được sao chép vào khay nhớ tạm: ", + "密码重置确认": "Xác nhận đặt lại mật khẩu", + "邮箱地址": "Địa chỉ email", + "提交": "Gửi", + "等待获取邮箱信息...": "Đang chờ lấy thông tin email...", + "确认重置密码": "Xác nhận đặt lại mật khẩu", + "无效的重置链接,请重新发起密码重置请求": "Liên kết đặt lại không hợp lệ, vui lòng gửi lại yêu cầu đặt lại mật khẩu", + "请输入邮箱地址": "Vui lòng nhập địa chỉ email", + "请稍后几秒重试": "Vui lòng thử lại sau vài giây", + "正在检查用户环境": "Đang kiểm tra môi trường người dùng", + "重置邮件发送成功": "Email đặt lại đã được gửi thành công", + "请检查邮箱": "Vui lòng kiểm tra email của bạn", + "密码重置": "Đặt lại mật khẩu", + "令牌已重置并已复制到剪贴板": "Mã thông báo đã được đặt lại và sao chép vào khay nhớ tạm", + "邀请链接已复制到剪切板": "Liên kết mời đã được sao chép vào khay nhớ tạm", + "微信账户绑定成功": "Liên kết tài khoản WeChat thành công", + "验证码发送成功": "Mã xác minh đã được gửi thành công", + "邮箱账户绑定成功": "Liên kết tài khoản email thành công", + "注意": "Lưu ý", + "此处生成的令牌用于系统管理": "Mã thông báo được tạo tại đây dùng cho quản lý hệ thống", + "而非用于请求 OpenAI 相关的服务": "Không phải để yêu cầu các dịch vụ liên quan đến OpenAI", + "请知悉": "Vui lòng lưu ý", + "更新个人信息": "Cập nhật thông tin cá nhân", + "生成系统访问令牌": "Tạo mã thông báo truy cập hệ thống", + "复制邀请链接": "Sao chép liên kết mời", + "账号绑定": "Liên kết tài khoản", + "绑定微信账号": "Liên kết tài khoản WeChat", + "微信扫码关注公众号": "Quét mã QR WeChat để theo dõi tài khoản chính thức", + "输入": "Nhập", + "输出": "Đầu ra", + "验证码": "Mã xác minh", + "获取验证码": "Lấy mã xác minh", + "三分钟内有效": "Hiệu lực trong ba phút", + "绑定": "Liên kết", + "绑定 GitHub 账号": "Liên kết tài khoản GitHub", + "绑定邮箱地址": "Liên kết địa chỉ email", + "输入邮箱地址": "Nhập địa chỉ email", + "未使用": "Chưa sử dụng", + "已使用": "Đã sử dụng", + "操作成功完成": "Thao tác hoàn tất thành công", + "搜索兑换码的 ID 和名称": "Tìm kiếm ID và tên của mã đổi thưởng", + "额度": "Hạn mức", + "创建时间": "Thời gian tạo", + "兑换时间": "Thời gian đổi thưởng", + "尚未兑换": "Chưa được đổi thưởng", + "已复制到剪贴板": "Đã sao chép vào khay nhớ tạm", + "无法复制到剪贴板": "Không thể sao chép vào khay nhớ tạm", + "请手动复制": "Vui lòng sao chép thủ công", + "已将兑换码填入搜索框": "Mã đổi thưởng đã được điền vào ô tìm kiếm", + "复制": "Sao chép", + "添加新的兑换码": "Thêm mã đổi thưởng mới", + "密码长度不得小于 8 位": "Độ dài mật khẩu không được nhỏ hơn 8 ký tự", + "两次输入的密码不一致": "Hai mật khẩu nhập vào không khớp", + "注册成功": "Đăng ký thành công", + "请稍后几秒重试,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", + "验证码发送成功,请检查你的邮箱": "Mã xác minh đã được gửi thành công, vui lòng kiểm tra email của bạn", + "新用户注册": "Đăng ký người dùng mới", + "输入用户名,最长 12 位": "Nhập tên người dùng, tối đa 12 ký tự", + "输入密码,最短 8 位,最长 20 位": "Nhập mật khẩu, tối thiểu 8 ký tự, tối đa 20 ký tự", + "输入验证码": "Nhập mã xác minh", + "已有账户": "Đã có tài khoản", + "点击登录": "Nhấp để đăng nhập", + "服务器地址": "Địa chỉ máy chủ", + "更新服务器地址": "Cập nhật địa chỉ máy chủ", + "配置登录注册": "Cấu hình đăng nhập/đăng ký", + "允许通过密码进行登录": "Cho phép đăng nhập bằng mật khẩu", + "允许通过密码进行注册": "Cho phép đăng ký bằng mật khẩu", + "通过密码注册时需要进行邮箱验证": "Yêu cầu xác minh email khi đăng ký bằng mật khẩu", + "允许通过 GitHub 账户登录 & 注册": "Cho phép đăng nhập & đăng ký qua tài khoản GitHub", + "允许通过微信登录 & 注册": "Cho phép đăng nhập & đăng ký qua WeChat", + "允许新用户注册(此项为否时,新用户将无法以任何方式进行注册": "Cho phép đăng ký người dùng mới (nếu tùy chọn này tắt, người dùng mới sẽ không thể đăng ký bằng bất kỳ cách nào)", + "启用 Turnstile 用户校验": "Kích hoạt xác minh người dùng Turnstile", + "配置 SMTP": "Cấu hình SMTP", + "用以支持系统的邮件发送": "Để hỗ trợ gửi email của hệ thống", + "SMTP 服务器地址": "Địa chỉ máy chủ SMTP", + "例如:smtp.qq.com": "Ví dụ: smtp.qq.com", + "SMTP 端口": "Cổng SMTP", + "默认: 587": "Mặc định: 587", + "SMTP 账户": "Tài khoản SMTP", + "通常是邮箱地址": "Thường là địa chỉ email", + "发送者邮箱": "Email người gửi", + "通常和邮箱地址保持一致": "Thường nhất quán với địa chỉ email", + "SMTP 访问凭证": "Thông tin xác thực truy cập SMTP", + "敏感信息不会发送到前端显示": "Thông tin nhạy cảm sẽ không được hiển thị ở giao diện người dùng", + "保存 SMTP 设置": "Lưu cài đặt SMTP", + "配置 GitHub OAuth App": "Cấu hình ứng dụng OAuth GitHub", + "用以支持通过 GitHub 进行登录注册": "Để hỗ trợ đăng nhập và đăng ký qua GitHub", + "点击此处": "Nhấp vào đây", + "管理你的 GitHub OAuth App": "Quản lý ứng dụng OAuth GitHub của bạn", + "输入你注册的 GitHub OAuth APP 的 ID": "Nhập ID của ứng dụng OAuth GitHub đã đăng ký", + "保存 GitHub OAuth 设置": "Lưu cài đặt OAuth GitHub", + "配置 WeChat Server": "Cấu hình máy chủ WeChat", + "用以支持通过微信进行登录注册": "Để hỗ trợ đăng nhập và đăng ký qua WeChat", + "了解 WeChat Server": "Tìm hiểu về máy chủ WeChat", + "WeChat Server 访问凭证": "Thông tin xác thực truy cập máy chủ WeChat", + "微信公众号二维码图片链接": "Liên kết hình ảnh mã QR tài khoản chính thức WeChat", + "输入一个图片链接": "Nhập một liên kết hình ảnh", + "保存 WeChat Server 设置": "Lưu cài đặt máy chủ WeChat", + "配置 Turnstile": "Cấu hình Turnstile", + "用以支持用户校验": "Để hỗ trợ xác minh người dùng", + "管理你的 Turnstile Sites,推荐选择 Invisible Widget Type": "Quản lý các trang Turnstile của bạn, khuyến nghị chọn loại Widget Vô hình", + "输入你注册的 Turnstile Site Key": "Nhập Khóa Trang Turnstile đã đăng ký", + "保存 Turnstile 设置": "Lưu cài đặt Turnstile", + "已过期": "Đã hết hạn", + "已耗尽": "Đã cạn kiệt", + "搜索令牌的名称 ...": "Tìm kiếm tên của mã thông báo...", + "已用额度": "Hạn mức đã sử dụng", + "剩余额度": "Hạn mức còn lại", + "总额度": "Tổng hạn mức", + "剩余额度/总额度": "Hạn mức còn lại/Tổng hạn mức", + "智能熔断": "Ngắt mạch thông minh", + "当前分组为 auto,会自动选择最优分组,当一个组不可用时自动降级到下一个组(熔断机制)": "Nhóm hiện tại là auto, sẽ tự động chọn nhóm tối ưu, khi một nhóm không khả dụng, sẽ tự động chuyển xuống nhóm tiếp theo (cơ chế ngắt mạch)", + "过期时间": "Thời gian hết hạn", + "无": "Không", + "无限制": "Không giới hạn", + "永不过期": "Không bao giờ hết hạn", + "无法复制到剪贴板,请手动复制,已将令牌填入搜索框": "Không thể sao chép vào khay nhớ tạm, vui lòng sao chép thủ công, mã thông báo đã được điền vào ô tìm kiếm", + "删除令牌": "Xóa mã thông báo", + "添加新的令牌": "Thêm mã thông báo mới", + "普通用户": "Người dùng thông thường", + "管理员": "Quản trị viên", + "超级管理员": "Quản trị viên cấp cao", + "未知身份": "Danh tính không xác định", + "已激活": "Đã kích hoạt", + "已封禁": "Đã bị cấm", + "搜索用户的 ID,用户名,显示名称,以及邮箱地址 ...": "Tìm kiếm ID người dùng, tên người dùng, tên hiển thị và địa chỉ email...", + "用户名": "Tên người dùng", + "用户角色": "Vai trò người dùng", + "未绑定邮箱地址": "Email chưa được liên kết", + "请求次数": "Số lần yêu cầu", + "提升": "Nâng cấp", + "降级": "Hạ cấp", + "删除用户": "Xóa người dùng", + "添加新的用户": "Thêm người dùng mới", + "自定义": "Tùy chỉnh", + "等价金额:": "Số tiền tương đương: ", + "未登录或登录已过期,请重新登录": "Chưa đăng nhập hoặc phiên đăng nhập đã hết hạn, vui lòng đăng nhập lại", + "请求次数过多,请稍后再试": "Quá nhiều yêu cầu, vui lòng thử lại sau", + "服务器内部错误,请联系管理员": "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 để trình diễn, không có phía máy chủ", + "超级管理员未设置充值链接!": "Quản trị viên cấp cao chưa cài đặt liên kết nạp tiền!", + "错误:": "Lỗi: ", + "新版本可用:${data.version},请使用快捷键 Shift + F5 刷新页面": "Có phiên bản mới: ${data.version}, vui lòng sử dụng phím tắt Shift + F5 để làm mới trang", + "无法正常连接至服务器": "Không thể kết nối bình thường với máy chủ", + "管理渠道": "Quản lý kênh", + "系统状况": "Tình trạng hệ thống", + "系统信息": "Thông tin hệ thống", + "系统信息总览": "Tổng quan thông tin hệ thống", + "版本": "Phiên bản", + "源码": "Mã nguồn", + "启动时间": "Thời gian khởi động", + "系统配置": "Cấu hình hệ thống", + "系统配置总览": "Tổng quan cấu hình hệ thống", + "邮箱验证": "Xác minh email", + "未启用": "Chưa kích hoạt", + "GitHub 身份验证": "Xác thực GitHub", + "微信身份验证": "Xác thực WeChat", + "Turnstile 用户校验": "Xác minh người dùng Turnstile", + "创建新的渠道": "Tạo kênh mới", + "是否自动禁用": "Có tự động vô hiệu hóa không", + "仅当自动禁用开启时有效,关闭后不会自动禁用该渠道": "Chỉ có hiệu lực khi kích hoạt tự động vô hiệu hóa, sau khi tắt, kênh sẽ không bị vô hiệu hóa tự động", + "镜像": "Gương", + "请输入镜像站地址,格式为:https://domain.com,可不填,不填则使用渠道默认值": "Vui lòng nhập địa chỉ trang gương, định dạng là: https://domain.com, có thể để trống, nếu để trống sẽ sử dụng giá trị mặc định của kênh", + "模型": "Mô hình", + "请选择该通道所支持的模型": "Vui lòng chọn mô hình được hỗ trợ bởi kênh này", + "填入基础模型": "Điền mô hình cơ bản", + "填入所有模型": "Điền tất cả các mô hình", + "清除所有模型": "Xóa tất cả các mô hình", + "复制所有模型": "Sao chép tất cả các mô hình", + "密钥": "Khóa", + "请输入密钥": "Vui lòng nhập khóa", + "批量创建": "Tạo hàng loạt", + "更新渠道信息": "Cập nhật thông tin kênh", + "我的令牌": "Mã thông báo của tôi", + "管理兑换码": "Quản lý mã đổi thưởng", + "兑换码": "Mã đổi thưởng", + "管理用户": "Quản lý người dùng", + "额度明细": "Chi tiết hạn mức", + "运营设置": "Cài đặt vận hành", + "其他设置": "Cài đặt khác", + "项目仓库地址": "Địa chỉ kho dự án", + "可在设置页面设置关于内容,支持 HTML & Markdown": "Nội dung giới thiệu có thể được cài đặt trên trang cài đặt, hỗ trợ HTML & Markdown", + "由": "được phát triển bởi", + "开发,基于": "dựa trên", + "MIT 协议": "Giấy phép MIT", + "充值额度": "Nạp hạn mức", + "获取兑换码": "Lấy mã đổi thưởng", + "一个月后过期": "Hết hạn sau một tháng", + "一天后过期": "Hết hạn sau một ngày", + "一小时后过期": "Hết hạn sau một giờ", + "一分钟后过期": "Hết hạn sau một phút", + "创建新的令牌": "Tạo mã thông báo mới", + "令牌分组,默认为用户的分组": "Nhóm mã thông báo, mặc định là nhóm của người dùng", + "IP白名单": "Danh sách trắng IP", + "令牌的额度仅用于限制令牌本身的最大额度使用量,实际的使用受到账户的剩余额度限制": "Hạn mức của mã thông báo chỉ dùng để giới hạn mức sử dụng tối đa của chính mã thông báo, việc sử dụng thực tế bị giới hạn bởi hạn mức còn lại của tài khoản", + "无限额度": "Hạn mức không giới hạn", + "更新令牌信息": "Cập nhật thông tin mã thông báo", + "请输入充值码!": "Vui lòng nhập mã nạp tiền!", + "请输入名称": "Vui lòng nhập tên", + "请输入密钥,一行一个": "Vui lòng nhập khóa, một khóa mỗi dòng", + "请输入额度": "Vui lòng nhập hạn mức", + "令牌创建成功": "Tạo mã thông báo thành công", + "令牌更新成功": "Cập nhật mã thông báo thành công", + "充值成功!": "Nạp tiền thành công!", + "更新用户信息": "Cập nhật thông tin người dùng", + "请输入新的用户名": "Vui lòng nhập tên người dùng mới", + "请输入新的密码": "Vui lòng nhập mật khẩu mới", + "显示名称": "Tên hiển thị", + "请输入新的显示名称": "Vui lòng nhập tên hiển thị mới", + "已绑定的 GITHUB 账户": "Tài khoản GitHub đã liên kết", + "已绑定的 WECHAT 账户": "Tài khoản WeChat đã liên kết", + "已绑定的 EMAIL 账户": "Tài khoản Email đã liên kết", + "已绑定的 TELEGRAM 账户": "Tài khoản Telegram đã liên kết", + "此项只读,要用户通过个人设置页面的相关绑定按钮进行绑定,不可直接修改": "Mục này chỉ đọc, người dùng cần liên kết thông qua nút liên kết tương ứng trên trang cài đặt cá nhân, không thể sửa đổi trực tiếp", + "用户信息更新成功!": "Cập nhật thông tin người dùng thành công!", + "使用明细(总消耗额度:{renderQuota(stat.quota)})": "Chi tiết sử dụng (Tổng hạn mức tiêu thụ: {renderQuota(stat.quota)})", + "用户名称": "Tên người dùng", + "令牌名称": "Tên mã thông báo", + "留空则查询全部用户": "Để trống để tra cứu tất cả người dùng", + "留空则查询全部令牌": "Để trống để tra cứu tất cả mã thông báo", + "模型名称": "Tên mô hình", + "留空则查询全部模型": "Để trống để tra cứu tất cả mô hình", + "起始时间": "Thời gian bắt đầu", + "结束时间": "Thời gian kết thúc", + "查询": "Tra cứu", + "提示": "Gợi ý", + "补全": "Hoàn thành", + "消耗额度": "Hạn mức tiêu thụ", + "渠道不存在:%d": "Kênh không tồn tại: %d", + "数据库一致性已被破坏,请联系管理员": "Tính nhất quán của cơ sở dữ liệu đã bị phá vỡ, vui lòng liên hệ quản trị viên", + "使用近似的方式估算 token 数以减少计算量": "Ước lượng số lượng mã thông báo theo cách gần đúng để giảm tải tính toán", + "请填写ChannelName和ChannelKey!": "Vui lòng điền Tên Kênh và Khóa Kênh!", + "请至少选择一个Model!": "Vui lòng chọn ít nhất một mô hình!", + "加载关于内容失败": "Tải nội dung giới thiệu thất bại", + "用户账户创建成功!": "Tạo tài khoản người dùng thành công!", + "生成数量": "Số lượng tạo", + "请输入生成数量": "Vui lòng nhập số lượng tạo", + "创建新用户账户": "Tạo tài khoản người dùng mới", + "渠道更新成功!": "Cập nhật kênh thành công!", + "渠道创建成功!": "Tạo kênh thành công!", + "请选择分组": "Vui lòng chọn nhóm", + "更新兑换码信息": "Cập nhật thông tin mã đổi thưởng", + "创建新的兑换码": "Tạo mã đổi thưởng mới", + "未找到所请求的页面": "Không tìm thấy trang được yêu cầu", + "过期时间格式错误!": "Định dạng thời gian hết hạn sai!", + "过期时间不能早于当前时间!": "Thời gian hết hạn không được sớm hơn thời gian hiện tại!", + "请输入过期时间,格式为 yyyy-MM-dd HH:mm:ss,-1 表示无限制": "Vui lòng nhập thời gian hết hạn, định dạng là yyyy-MM-dd HH:mm:ss, -1 có nghĩa là không giới hạn", + "此项可选,为一个 JSON 文本,键为用户请求的模型名称,值为要替换的模型名称,例如:": "Mục này tùy chọn, là một văn bản JSON, khóa là tên mô hình được người dùng yêu cầu, giá trị là tên mô hình thay thế, ví dụ:", + "此项可选,输入镜像站地址,格式为:": "Mục này tùy chọn, nhập địa chỉ trang gương, định dạng là:", + "模型映射": "Ánh xạ mô hình", + "请输入默认 API 版本,例如:2023-03-15-preview,该配置可以被实际的请求查询参数所覆盖": "Vui lòng nhập phiên bản API mặc định, ví dụ: 2023-03-15-preview, cấu hình này có thể bị ghi đè bởi các tham số truy vấn yêu cầu thực tế", + "默认": "Mặc định", + "图片演示": "Hình ảnh demo", + "注意,系统请求的时模型名称中的点会被剔除,例如:gpt-4.1会请求为gpt-41,所以在Azure部署的时候,部署模型名称需要手动改为gpt-41": "Lưu ý, dấu chấm trong tên mô hình được yêu cầu bởi hệ thống sẽ bị xóa, ví dụ: gpt-4.1 sẽ được yêu cầu là gpt-41, vì vậy khi triển khai trên Azure, tên mô hình triển khai cần được đổi thủ công thành gpt-41", + "2025年5月10日后添加的渠道,不需要再在部署的时候移除模型名称中的\".\"": "Sau ngày 10 tháng 5 năm 2025, các kênh được thêm vào không cần xóa dấu chấm trong tên mô hình khi triển khai", + "模型映射必须是合法的 JSON 格式!": "Ánh xạ mô hình phải ở định dạng JSON hợp lệ!", + "取消": "Hủy", + "重置": "Đặt lại", + "请输入新的剩余额度": "Vui lòng nhập hạn mức còn lại mới", + "请输入单个兑换码中包含的额度": "Vui lòng nhập hạn mức bao gồm trong một mã đổi thưởng", + "请输入用户名": "Vui lòng nhập tên người dùng", + "请输入显示名称": "Vui lòng nhập tên hiển thị", + "请输入密码": "Vui lòng nhập mật khẩu", + "注意,模型部署名称必须和模型名称保持一致": "Lưu ý, tên triển khai mô hình phải nhất quán với tên mô hình", + "请输入 AZURE_OPENAI_ENDPOINT": "Vui lòng nhập AZURE_OPENAI_ENDPOINT", + "请输入自定义渠道的 Base URL": "Vui lòng nhập URL cơ sở của kênh tùy chỉnh", + "Homepage URL 填": "Điền URL trang chủ", + "Authorization callback URL 填": "Điền URL gọi lại xác thực", + "请为通道命名": "Vui lòng đặt tên cho kênh", + "此项可选,用于修改请求体中的模型名称,为一个 JSON 字符串,键为请求中模型名称,值为要替换的模型名称,例如:": "Mục này tùy chọn, dùng để sửa đổi tên mô hình trong phần thân yêu cầu, là một chuỗi JSON, khóa là tên mô hình trong yêu cầu, giá trị là tên mô hình thay thế, ví dụ:", + "模型重定向": "Chuyển hướng mô hình", + "请输入渠道对应的鉴权密钥": "Vui lòng nhập khóa xác thực tương ứng với kênh", + "注意,": "Lưu ý, ", + ",图片演示。": "hình ảnh demo liên quan.", + "令牌创建成功,请在列表页面点击复制获取令牌!": "Tạo mã thông báo thành công, vui lòng nhấp vào sao chép trên trang danh sách để lấy mã thông báo!", + "代理": "Proxy", + "此项可选,用于通过自定义API地址来进行 API 调用,请输入API地址,格式为:https://domain.com": "Mục này tùy chọn, dùng để thực hiện các cuộc gọi API thông qua địa chỉ API tùy chỉnh, vui lòng nhập địa chỉ API, định dạng là: https://domain.com", + "取消密码登录将导致所有未绑定其他登录方式的用户(包括管理员)无法通过密码登录,确认取消?": "Hủy đăng nhập bằng mật khẩu sẽ khiến tất cả người dùng (bao gồm quản trị viên) chưa liên kết các phương thức đăng nhập khác không thể đăng nhập bằng mật khẩu, xác nhận hủy không?", + "按照如下格式输入:": "Nhập theo định dạng sau:", + "模型版本": "Phiên bản mô hình", + "请输入星火大模型版本,注意是接口地址中的版本号,例如:v2.1": "Vui lòng nhập phiên bản mô hình lớn Starfire, lưu ý là số phiên bản trong địa chỉ giao diện, ví dụ: v2.1", + "点击查看": "Nhấp để xem", + "请确保已在 Azure 上创建了 gpt-35-turbo 模型,并且 apiVersion 已正确填写!": "Vui lòng đảm bảo đã tạo mô hình gpt-35-turbo trên Azure và apiVersion đã được điền chính xác!", + "建议收藏所有地址,以防失联。": "Nên lưu tất cả các địa chỉ để tránh mất liên lạc.", + "无法正常请求API的用户,请联系管理员。": "Người dùng không thể yêu cầu API bình thường, vui lòng liên hệ quản trị viên.", + "温馨提示": "Lời nhắc thân thiện", + "获取API URL列表时发生错误,请稍后重试。": "Đã xảy ra lỗi khi lấy danh sách URL API, vui lòng thử lại sau.", + ",时间:": ", thời gian:", + "已用/剩余": "Đã sử dụng/Còn lại", + ",点击更新": ", nhấp vào Cập nhật", + "确定是否要清空此渠道记录额度?": "Bạn có chắc chắn muốn xóa hạn mức ghi nhận của kênh này không?", + "此修改将不可逆": "Thay đổi này sẽ không thể hoàn tác", + "优先级": "Ưu tiên", + "权重": "Trọng số", + "测试操作项目组": "Nhóm dự án vận hành thử nghiệm", + "确定是否要删除此渠道?": "Bạn có chắc chắn muốn xóa kênh này không?", + "确定是否要复制此渠道?": "Bạn có chắc chắn muốn sao chép kênh này không?", + "复制渠道的所有信息": "Sao chép tất cả thông tin của kênh", + "展开操作": "Mở rộng thao tác", + "_复制": "_sao chép", + "渠道未找到,请刷新页面后重试。": "Không tìm thấy kênh, vui lòng làm mới trang và thử lại.", + "渠道复制成功": "Sao chép kênh thành công", + "渠道复制失败: ": "Sao chép kênh thất bại: ", + "已成功开始测试所有通道,请刷新页面查看结果。": "Đã bắt đầu kiểm tra tất cả các kênh thành công, vui lòng làm mới trang để xem kết quả.", + "请先选择要删除的通道!": "Vui lòng chọn kênh muốn xóa trước!", + "搜索渠道关键词": "Tìm kiếm từ khóa kênh", + "模型关键字": "Từ khóa mô hình", + "选择分组": "Chọn nhóm", + "使用ID排序": "Sắp xếp theo ID", + "是否用ID排序": "Có sắp xếp theo ID không", + "确定?": "Chắc chắn chứ?", + "确定是否要删除禁用通道?": "Bạn có chắc chắn muốn xóa kênh bị vô hiệu hóa không?", + "开启批量操作": "Kích hoạt thao tác hàng loạt", + "是否开启批量操作": "Có kích hoạt thao tác hàng loạt không", + "确定是否要删除所选通道?": "Bạn có chắc chắn muốn xóa các kênh đã chọn không?", + "确定是否要修复数据库一致性?": "Bạn có chắc chắn muốn sửa chữa tính nhất quán của cơ sở dữ liệu không?", + "进行该操作时,可能导致渠道访问错误,请仅在数据库出现问题时使用": "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ơ sở dữ liệu gặp vấn đề.", + "当前没有可用的启用令牌,请确认是否有令牌处于启用状态!": "Hiện tại không có mã thông báo kích hoạt nào khả dụng, vui lòng xác nhận xem có mã thông báo nào đang ở trạng thái kích hoạt không!", + "Midjourney日志": "Nhật ký Midjourney", + "模型列表": "Danh sách mô hình", + "常见问题": "Câu hỏi thường gặp", + "免费体验": "Trải nghiệm miễn phí", + "新用户注册赠送$": "Tặng $ cho người dùng mới đăng ký", + "测试金额": "Số tiền kiểm tra", + "请稍后几秒重试,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!", + "您正在使用默认密码!": "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!", + "请输入用户名和密码!": "Vui lòng nhập tên người dùng và mật khẩu!", + "用户名或邮箱": "Tên người dùng hoặc email", + "微信扫码登录": "Đăng nhập bằng mã quét WeChat", + "刷新成功": "Làm mới thành công", + "刷新失败": "Làm mới thất bại", + "用时/首字": "Thời gian/Từ đầu tiên", + "重试": "Thử lại", + "用户信息": "Thông tin người dùng", + "无法复制到剪贴板,请手动复制": "Không thể sao chép vào khay nhớ tạm, vui lòng sao chép thủ công", + "消费": "Tiêu thụ", + "管理": "Quản lý", + "系统": "Hệ thống", + "用时": "Thời gian", + "首字时间": "Thời gian từ đầu tiên", + "是否流式": "Có phát trực tuyến không", + "非流": "Không phát trực tuyến", + "渠道 ID": "ID kênh", + "用户ID": "ID người dùng", + "花费": "Chi phí", + "列设置": "Cài đặt cột", + "补偿": "Bù đắp", + "错误": "Lỗi", + "未知": "Không xác định", + "全选": "Chọn tất cả", + "组名必须唯一": "Tên nhóm phải là duy nhất", + "解析 JSON 出错:": "Lỗi phân tích JSON:", + "解析 GroupModel 时发生错误: ": "Lỗi xảy ra khi phân tích GroupModel: ", + "GroupModel 未定义,无法更新分组": "GroupModel chưa được định nghĩa, không thể cập nhật nhóm", + "重置成功": "Đặt lại thành công", + "加载数据出错:": "Lỗi tải dữ liệu:", + "加载数据时发生错误: ": "Lỗi xảy ra khi tải dữ liệu: ", + "部分保存失败,请重试": "Lưu một phần thất bại, vui lòng thử lại", + "请检查输入": "Vui lòng kiểm tra đầu vào", + "如何区分不同分组不同模型的价格:供参考的配置方式": "Cách phân biệt giá của các mô hình khác nhau trong các nhóm khác nhau: phương thức cấu hình để tham khảo", + "获取价格顺序": "Lấy thứ tự giá", + "确定同步远程数据吗?": "Bạn có chắc chắn muốn đồng bộ hóa dữ liệu từ xa không?", + "此修改将不可逆!建议同步前先备份自己的设置!": "Thay đổi này sẽ không thể hoàn tác! Nên sao lưu cài đặt của bạn trước khi đồng bộ hóa!", + "模型固定价格(按次计费模型用)": "Giá cố định mô hình (dùng cho mô hình tính phí theo lần)", + "模型倍率(按量计费模型用)": "Tỷ lệ mô hình (dùng cho mô hình tính phí theo lượng)", + "为一个 JSON 文本,键为模型名称,值为倍率": "Là một văn bản JSON, khóa là tên mô hình, giá trị là tỷ lệ", + "隐藏": "Ẩn", + "分组名称": "Tên nhóm", + "提交结果": "Kết quả gửi", + "模式": "Chế độ", + "任务状态": "Trạng thái nhiệm vụ", + "耗时": "Thời gian tiêu tốn", + "结果图片": "Hình ảnh kết quả", + "失败原因": "Lý do thất bại", + "全部": "Tất cả", + "成功": "Thành công", + "未启动": "Chưa bắt đầu", + "队列中": "Trong hàng đợi", + "窗口等待": "Đang chờ cửa sổ", + "失败": "Thất bại", + "绘图": "Vẽ", + "放大": "Phóng to", + "微妙放大": "Phóng to tinh tế", + "创造放大": "Phóng to sáng tạo", + "强变换": "Biến đổi mạnh", + "弱变换": "Biến đổi yếu", + "图生文": "Hình ảnh sinh văn bản", + "图混合": "Hình ảnh hỗn hợp", + "重绘": "Vẽ lại", + "局部重绘-提交": "Vẽ lại cục bộ - Gửi", + "自定义变焦-提交": "Tùy chỉnh thu phóng - Gửi", + "窗口处理": "Xử lý cửa sổ", + "缩词后生图": "Sơ đồ biểu sinh sau khi rút gọn", + "图生文按钮生图": "Nút văn bản sinh hình ảnh", + "任务 ID": "ID nhiệm vụ", + "速度模式": "Chế độ tốc độ", + "错误:未登录或登录已过期,请重新登录!": "Lỗi: Chưa đăng nhập hoặc phiên đăng nhập đã hết hạn, vui lòng đăng nhập lại!", + "错误:请求次数过多,请稍后再试!": "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 để trình diễn, không có phía máy chủ!", + "已用额度:": "Hạn mức đã sử dụng:", + "请求次数:": "Số lần yêu cầu:", + "平移": "Dịch chuyển", + "上传文件": "Tải lên tệp", + "图生文后生图": "Hình ảnh sinh văn bản rồi sinh hình ảnh", + "已提交": "Đã gửi", + "重复提交": "Gửi lại", + "未提交": "Chưa gửi", + "缩词": "Rút gọn", + "变焦": "Thu phóng", + "按次计费": "Tính phí theo lần", + "按量计费": "Tính phí theo lượng", + "标签": "Nhãn", + "人民币": "Nhân dân tệ", + "说明": "Mô tả", + "可用性": "Tính khả dụng", + "数据加载失败": "Tải dữ liệu thất bại", + "发生错误,请重试": "Đã xảy ra lỗi, vui lòng thử lại", + "本站汇率1美金=": "Tỷ giá trang web này là 1 USD =", + "模糊搜索": "Tìm kiếm mờ", + "选择标签": "Chọn nhãn", + "令牌分组": "Nhóm mã thông báo", + "隐": "Ẩn", + "本站当前已启用模型": "Mô hình hiện tại đã được kích hoạt trên trang web này", + "个": " cái", + "倍率是本站的计算方式,不同模型有着不同的倍率,并非官方价格的多少倍,请务必知晓。": "Tỷ lệ là cách tính toán của trang web này. Các mô hình khác nhau có tỷ lệ khác nhau, không phải là bội số của giá chính thức. Vui lòng lưu ý.", + "所有各厂聊天模型请统一使用OpenAI方式请求,支持OpenAI官方库
Claude()Claude官方格式请求": "Tất cả các mô hình trò chuyện từ các nhà sản xuất hãy sử dụng phương thức yêu cầu OpenAI, hỗ trợ thư viện chính thức OpenAI
Claude() yêu cầu định dạng chính thức Claude", + "分组说明": "Mô tả nhóm", + "倍率是为了方便换算不同价格的模型": "Tỷ lệ là để thuận tiện cho việc chuyển đổi các mô hình có giá khác nhau", + "点击查看倍率说明": "Nhấp để xem mô tả tỷ lệ", + "显": "Hiển thị", + "当前分组可用": "Nhóm hiện tại khả dụng", + "当前分组不可用": "Nhóm hiện tại không khả dụng", + "提示:": "Gợi ý:", + "输入:": "Đầu vào:", + "补全:": "Hoàn thành:", + "输出:": "Đầu ra:", + "图片输出:": "Đầu ra hình ảnh:", + "模型价格:": "Giá mô hình:", + "模型:": "Mô hình:", + "分组:": "Nhóm:", + "最终价格": "Giá cuối cùng", + "计费类型": "Loại tính phí", + "美元": "Đô la", + "倍率": "Tỷ lệ", + "常见问题不是合法的 JSON 字符串": "Câu hỏi thường gặp không phải là chuỗi JSON hợp lệ", + "常见问题更新失败": "Cập nhật câu hỏi thường gặp thất bại", + "活动内容已更新": "Nội dung sự kiện đã được cập nhật", + "活动内容更新失败": "Cập nhật nội dung sự kiện 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", + "Logo 图片地址": "Địa chỉ hình ảnh Logo", + "在此输入图片地址": "Nhập địa chỉ hình ảnh tại đây", + "在此输入首页内容,支持 Markdown & HTML 代码,设置后首页的状态信息将不再显示。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为首页。": "Nhập nội dung trang chủ tại đây, hỗ trợ mã Markdown & HTML, sau khi cài đặt, thông tin trạng thái trang chủ sẽ không còn hiển thị. Nếu nhập một liên kết, liên kết đó sẽ được sử dụng làm thuộc tính src của iframe, cho phép bạn đặt bất kỳ trang web nào làm trang chủ.", + "令牌分组说明": "Mô tả nhóm mã thông báo", + "在此输入新的关于内容,支持 Markdown & HTML 代码。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为关于页面。": "Nhập nội dung giới thiệu mới tại đây, hỗ trợ mã Markdown & HTML. Nếu nhập một liên kết, liên kết đó sẽ được sử dụng làm thuộc tính src của iframe, cho phép bạn đặt bất kỳ trang web nào làm trang giới thiệu", + "API地址列表": "Danh sách địa chỉ API", + "在此输入新的常见问题,json格式;键为问题,值为答案。": "Nhập câu hỏi thường gặp mới tại đây, định dạng json; khóa là câu hỏi, giá trị là câu trả lời.", + "活动内容": "Nội dung sự kiện", + "在此输入新的活动内容。": "Nhập nội dung sự kiện mới tại đây.", + "总计": "Tổng cộng", + "无数据": "Không có dữ liệu", + "小时": "Giờ", + "新密码": "Mật khẩu mới", + "重置邮件发送成功,请检查邮箱!": "Email đặt lại đã được gửi thành công, vui lòng kiểm tra email của bạn!", + "输入你的账户名{{username}}以确认删除": "Nhập tên tài khoản của bạn {{username}} để xác nhận xóa", + "账户已删除!": "Tài khoản đã bị xóa!", + "微信账户绑定成功!": "Liên kết tài khoản WeChat thành công!", + "两次输入的密码不一致!": "Hai mật khẩu nhập vào không khớp!", + "密码修改成功!": "Thay đổi mật khẩu thành công!", + "划转金额最低为": "Số tiền chuyển tối thiểu là", + "请输入邮箱!": "Vui lòng nhập email!", + "验证码发送成功,请检查邮箱!": "Mã xác minh đã được gửi thành công, vui lòng kiểm tra email của bạn!", + "请输入邮箱验证码!": "Vui lòng nhập mã xác minh email!", + "请输入要划转的数量": "Vui lòng nhập số lượng cần chuyển", + "当前余额": "Số dư hiện tại", + "单独并发限制": "Giới hạn đồng thời riêng lẻ", + "未设置单独并发限制": "Chưa cài đặt giới hạn đồng thời riêng lẻ", + "无效的用户单独并发限制数据": "Dữ liệu giới hạn đồng thời riêng lẻ của người dùng không hợp lệ", + "未绑定": "Chưa liên kết", + "修改绑定": "Sửa đổi liên kết", + "确认新密码": "Xác nhận mật khẩu mới", + "历史消耗": "Tiêu thụ lịch sử", + "查看": "Kiểm tra", + "修改密码": "Thay đổi mật khẩu", + "删除个人账户": "Xóa tài khoản cá nhân", + "已绑定": "Đã liên kết", + "获取二维码失败": "Không lấy được mã QR", + "获取当前设置失败": "Không lấy được cài đặt hiện tại", + "设置已更新": "Cài đặt đã được cập nhật", + "更新设置失败": "Cập nhật cài đặt thất bại", + "确认解绑": "Xác nhận bỏ liên kết", + "您确定要解绑WxPusher吗?": "Bạn có chắc chắn muốn bỏ liên kết WxPusher không?", + "解绑失败": "Bỏ liên kết thất bại", + "订阅事件": "Đăng ký sự kiện", + "通知方式": "Phương thức thông báo", + "留空将通知到账号邮箱": "Để trống sẽ thông báo đến email tài khoản", + "查看接入文档": "Xem tài liệu truy cập", + "企业微信机器人Key": "Khóa robot WeChat doanh nghiệp", + "您已绑定WxPusher,可以点击下方解绑": "Bạn đã liên kết WxPusher, bạn có thể nhấp vào bên dưới để bỏ liên kết", + "请扫描二维码绑定WxPusher": "Vui lòng quét mã QR để liên kết WxPusher", + "预警额度(需订阅事件)": "Hạn mức cảnh báo (cần đăng ký sự kiện)", + " 时,将收到预警邮件(2小时最多1次)": "Khi đó, bạn sẽ nhận được email cảnh báo (tối đa 1 lần mỗi 2 giờ)", + "兑换人ID": "ID người đổi thưởng", + "确定是否要删除此兑换码?": "Bạn có chắc chắn muốn xóa mã đổi thưởng này không?", + "已复制到剪贴板!": "Đã sao chép vào khay nhớ tạm!", + "搜索关键字": "Tìm kiếm từ khóa", + "关键字(id或者名称)": "Từ khóa (ID hoặc tên)", + "复制所选兑换码": "Sao chép mã đổi thưởng đã chọn", + "请至少选择一个兑换码!": "Vui lòng chọn ít nhất một mã đổi thưởng!", + "密码长度不得小于 8 位!": "Mật khẩu phải dài ít nhất 8 ký tự!", + "注册成功!": "Đăng ký thành công!", + "验证码发送成功,请检查你的邮箱!": "Mã xác minh đã được gửi thành công, vui lòng kiểm tra email của bạn!", + "确认密码": "Xác nhận mật khẩu", + "邀请码": "Mã mời", + "输入邀请码": "Nhập mã mời", + "账户": "Tài khoản", + "邮箱": "Email", + "已有账户?": "Đã có tài khoản?", + "创意任务": "Nhiệm vụ", + "任务ID(点击查看详情)": "ID nhiệm vụ (nhấn để xem chi tiết)", + "进度": "Lịch trình", + "花费时间": "Thời gian sử dụng", + "生成音乐": "Tạo nhạc", + "生成歌词": "Tạo lời bài hát", + "歌曲拼接": "Ghép bài hát", + "上传歌曲": "Tải lên bài hát", + "生成视频": "Tạo video", + "扩展视频": "Mở rộng video", + "获取无水印": "Lấy video không có watermark", + "生成图片": "Tạo hình ảnh", + "可灵": "Kling", + "即梦": "Jimeng", + "正在提交": "Đang gửi", + "执行中": "Đang xử lý", + "平台": "Nền tảng", + "排队中": "Đang xếp hàng", + "已启用:限制模型": "Đã bật: mô hình bị hạn chế", + "AMA 问天": "AMA Wentian", + "项目操作按钮组": "Nhóm nút thao tác dự án", + "AMA 问天(BotGem)": "AMA Wentian (BotGem)", + "确定是否要删除此令牌?": "Bạn có chắc chắn muốn xóa mã thông báo này không?", + "管理员未设置聊天链接": "Quản trị viên chưa thiết lập liên kết trò chuyện", + "复制所选令牌": "Sao chép mã thông báo đã chọn", + "请至少选择一个令牌!": "Vui lòng chọn ít nhất một mã thông báo!", + "管理员未设置查询页链接": "Quản trị viên chưa thiết lập liên kết trang truy vấn", + "批量删除令牌": "Xóa hàng loạt mã thông báo", + "确定要删除所选的 {{count}} 个令牌吗?": "Bạn có chắc chắn muốn xóa {{count}} mã thông báo đã chọn không?", + "删除所选令牌": "Xóa mã thông báo đã chọn", + "请先选择要删除的令牌!": "Vui lòng chọn mã thông báo cần xóa trước!", + "已删除 {{count}} 个令牌!": "Đã xóa {{count}} mã thông báo!", + "删除失败": "Xóa thất bại", + "复制令牌": "Sao chép mã thông báo", + "请选择你的复制方式": "Vui lòng chọn phương thức sao chép của bạn", + "名称+密钥": "Tên + khóa", + "仅密钥": "Chỉ khóa", + "查看API地址": "Xem địa chỉ API", + "打开查询页": "Mở trang truy vấn", + "时间(仅显示近3天)": "Thời gian (chỉ hiển thị 3 ngày gần đây)", + "请输入兑换码!": "Vui lòng nhập mã đổi thưởng!", + "兑换成功!": "Đổi thưởng thành công!", + "成功兑换额度:": "Số tiền đổi thưởng thành công:", + "请求失败": "Yêu cầu thất bại", + "管理员未开启在线充值!": "Quản trị viên chưa kích hoạt nạp tiền trực tuyến!", + "充值数量不能小于": "Số tiền nạp không được nhỏ hơn", + "管理员未开启Stripe在线充值!": "Quản trị viên chưa kích hoạt nạp tiền trực tuyến qua Stripe!", + "当前充值1美金=": "Hiện tại nạp 1 USD =", + "请选择充值方式!": "Vui lòng chọn phương thức nạp tiền!", + "元": "VND", + "充值记录": "Lịch sử nạp tiền", + "返利记录": "Lịch sử hoàn tiền", + "确定要充值 $": "Xác nhận nạp $", + "微信/支付宝 实付金额:": "Số tiền thực tế thanh toán qua WeChat/Alipay:", + "Stripe 实付金额:": "Số tiền thực tế thanh toán qua Stripe:", + "支付中...": "Đang thanh toán...", + "支付宝": "Alipay", + "收益统计": "Thống kê thu nhập", + "待使用收益": "Thu nhập chờ sử dụng", + "邀请人数": "Số người được mời", + "兑换码充值": "Nạp tiền bằng mã đổi thưởng", + "奖励说明": "Mô tả phần thưởng", + "选择支付方式": "Chọn phương thức thanh toán", + "在找兑换码?": "Đang tìm mã đổi thưởng?", + "购买兑换码": "Mua mã đổi thưởng", + "账户统计": "Thống kê tài khoản", + "账户充值": "Nạp tiền tài khoản", + "多种充值方式,安全便捷": "Nhiều phương thức nạp tiền, an toàn và tiện lợi", + "支付方式": "Phương thức thanh toán", + "邀请奖励": "Phần thưởng mời", + "或输入自定义金额": "Hoặc nhập số tiền tùy chỉnh", + "选择充值额度": "Chọn số tiền nạp", + "实付": "Thanh toán thực tế", + "快速方便的充值方式": "Phương thức nạp tiền nhanh chóng và tiện lợi", + "邀请好友获得额外奖励": "Mời bạn bè để nhận thêm phần thưởng", + "邀请好友注册,好友充值后您可获得相应奖励": "Mời bạn bè đăng ký, bạn sẽ nhận được phần thưởng tương ứng sau khi bạn bè nạp tiền", + "通过划转功能将奖励额度转入到您的账户余额中": "Chuyển số tiền phần thưởng vào số dư tài khoản của bạn thông qua chức năng chuyển khoản", + "邀请的好友越多,获得的奖励越多": "Càng mời nhiều bạn bè, bạn càng nhận được nhiều phần thưởng", + "在线充值": "Nạp tiền trực tuyến", + "充值数量,最低 ": "Số tiền nạp, tối thiểu", + "请选择充值金额": "Vui lòng chọn số tiền nạp", + "微信": "WeChat", + "邀请返利": "Hoàn tiền từ lời mời", + "总收益": "Tổng thu nhập", + "邀请信息": "Thông tin mời", + "代理加盟": "Tham gia đại lý", + "代理商信息": "Thông tin đại lý", + "分红记录": "Lịch sử chia cổ tức", + "提现记录": "Lịch sử rút tiền", + "代理商管理": "Quản lý đại lý", + "自定义输入": "Nhập tùy chỉnh", + "加载token失败": "Tải mã thông báo thất bại", + "配置聊天": "Cấu hình trò chuyện", + "模型消耗分布": "Phân phối tiêu thụ mô hình", + "模型调用次数占比": "Tỷ lệ gọi mô hình", + "用户消耗分布": "Phân phối tiêu thụ người dùng", + "时间粒度": "Độ chi tiết thời gian", + "天": "ngày", + "模型概览": "Tổng quan mô hình", + "用户概览": "Tổng quan người dùng", + "正在策划中": "Đang lên kế hoạch", + "请求首页内容失败": "Yêu cầu nội dung trang chủ thất bại", + "返回首页": "Quay lại trang chủ", + "获取用户数据时发生错误,请稍后重试。": "Đã xảy ra lỗi khi lấy dữ liệu người dùng, vui lòng thử lại sau.", + "无额度": "Không có hạn mức", + "累计消费": "Tổng tiêu thụ", + "累计请求": "Tổng số yêu cầu", + "你好,": "Xin chào,", + "线路监控": "Giám sát đường truyền", + "查看全部": "Xem tất cả", + "异常": "Bất thường", + "的未命名令牌": "Mã thông báo chưa đặt tên", + "令牌更新成功!": "Cập nhật mã thông báo thành công!", + "(origin) Discord原链接": "(gốc) Liên kết gốc Discord", + "请选择过期时间": "Vui lòng chọn thời gian hết hạn", + "数量": "Số lượng", + "请选择或输入创建令牌的数量": "Vui lòng chọn hoặc nhập số lượng mã thông báo cần tạo", + "请选择渠道": "Vui lòng chọn kênh", + "允许的IP,一行一个,不填写则不限制": "IP được phép, một dòng một IP, không điền thì không giới hạn", + "IP黑名单": "Danh sách đen IP", + "不允许的IP,一行一个": "IP không được phép, một dòng một IP", + "请选择该渠道所支持的模型": "Vui lòng chọn mô hình được hỗ trợ bởi kênh này", + "次": "lần", + "达到限速报错内容": "Nội dung lỗi khi đạt giới hạn tốc độ", + "不填则使用默认报错": "Nếu không điền, sẽ sử dụng lỗi mặc định.", + "Midjouney 设置 (可选)": "Cài đặt Midjouney (tùy chọn)", + "令牌纬度控制 Midjouney 配置,设置优先级:令牌 {": "Kiểm soát độ trễ mã thông báo cho cấu hình Midjouney, ưu tiên cài đặt: mã thông báo {", + "图片代理地址最好用自己的,本站绘图量大,公用代理地址可能有时网速不佳": "Địa chỉ proxy hình ảnh tốt nhất nên sử dụng của riêng bạn. Trang web này có lượng vẽ lớn, địa chỉ proxy công cộng có thể có tốc độ mạng kém vào một số thời điểm.", + "【突发备用号池】用于应对高强度风控情况,当普通号池全部重试失败,任务进入备用号池执行并额外计费。": "[Hồ sơ dự phòng khẩn cấp] được sử dụng để đối phó với các tình huống kiểm soát rủi ro cao. Khi tất cả các lần thử lại trong hồ sơ thông thường thất bại, nhiệm vụ sẽ được thực hiện trong hồ sơ dự phòng và tính phí bổ sung.", + "绘图模式": "Chế độ vẽ", + "请选择模式": "Vui lòng chọn chế độ", + "图片代理方式": "Phương thức proxy hình ảnh", + "用于替换 https://cdn.discordapp.com 的域名": "Tên miền dùng để thay thế https://cdn.discordapp.com", + "一个月": "Một tháng", + "一天": "Một ngày", + "令牌渠道分组选择": "Lựa chọn nhóm kênh mã thông báo", + "只可使用对应分组包含的模型。": "Chỉ có thể sử dụng các mô hình có trong nhóm tương ứng.", + "渠道分组": "Nhóm kênh", + "安全设置(可选)": "Cài đặt bảo mật (tùy chọn)", + "IP 限制": "Hạn chế IP", + "模型限制": "Hạn chế mô hình", + "秒": "Giây", + "更新令牌后需等待几分钟生效": "Sau khi cập nhật mã thông báo, cần đợi vài phút để có hiệu lực.", + "一小时": "Một giờ", + "新建数量": "Số lượng mới", + "未设置": "Chưa thiết lập", + "API文档": "Tài liệu API", + "不是合法的 JSON 字符串": "Không phải chuỗi JSON hợp lệ", + "个人中心": "Trung tâm cá nhân", + "代理商": "Đại lý", + "备注": "Ghi chú", + "工作台": "Bàn làm việc", + "已复制:": "Đã sao chép:", + "提交时间": "Thời gian gửi", + "无法正常连接至服务器!": "Không thể kết nối bình thường với máy chủ!", + "无记录": "Không có bản ghi", + "日间模式": "Chế độ ban ngày", + "活动福利": "Phúc lợi sự kiện", + "聊天/绘画": "Trò chuyện/Vẽ", + "跟随系统": "Theo hệ thống", + "黑夜模式": "Chế độ ban đêm", + "管理员设置": "Quản trị viên", + "待更新": "Đang chờ cập nhật", + "支付中..": "Đang thanh toán..", + "查看图片": "Xem hình ảnh", + "并发限制": "Giới hạn đồng thời", + "正常": "Bình thường", + "周期": "Chu kỳ", + "同步频率10-20分钟": "Tần suất đồng bộ 10-20 phút", + "模型调用占比": "Tỷ lệ gọi mô hình", + "次,平均每天": "lần, trung bình mỗi ngày", + ",平均每天": ", trung bình mỗi ngày", + "启用突发备用号池(建议勾选,极大降低故障率)": "Kích hoạt hồ sơ dự phòng khẩn cấp (khuyến nghị chọn để giảm đáng kể tỷ lệ lỗi)", + "查看说明": "Xem hướng dẫn", + "添加令牌": "Tạo mã thông báo", + "IP限制": "Hạn chế IP", + "令牌纬度控制 Midjouney 配置,设置优先级:令牌 > 路径参数 > 系统默认": "Kiểm soát độ trễ mã thông báo cho cấu hình Midjouney, ưu tiên cài đặt: mã thông báo > tham số đường dẫn > mặc định hệ thống", + "启用速率限制": "Bật giới hạn tốc độ", + "复制BaseURL": "Sao chép BaseURL", + "总消耗额度": "Tổng số hạn mức tiêu thụ", + "近一分钟内消耗Token数": "Số mã thông báo tiêu thụ trong phút gần đây", + "近一分钟内消耗额度": "Hạn mức tiêu thụ trong phút gần đây", + "近一分钟内请求次数": "Số lần yêu cầu trong phút gần đây", + "预估一天消耗量": "Ước tính tiêu thụ hàng ngày", + "模型固定价格:": "Giá cố định mô hình:", + "仅供参考,以实际扣费为准": "Chỉ để tham khảo, số tiền thực tế sẽ được áp dụng", + "导出CSV": "Xuất CSV", + "流": "Luồng", + "任务ID": "ID nhiệm vụ", + "周": "tuần", + "总计:": "Tổng cộng:", + "划转到余额": "Chuyển vào số dư", + "可用额度": "Hạn mức khả dụng", + "邀请码:": "Mã mời:", + "最低": "thấp nhất", + "划转额度": "Số tiền chuyển", + "邀请链接": "Liên kết mời", + "划转邀请额度": "Chuyển hạn mức mời", + "可用邀请额度": "Hạn mức mời khả dụng", + "更多优惠": "Thêm ưu đãi", + "企业微信": "WeChat doanh nghiệp", + "点击解绑WxPusher": "Nhấn để hủy liên kết WxPusher", + "点击显示二维码": "Nhấn để hiển thị mã QR", + "二维码已过期,点击重新获取": "Mã QR đã hết hạn, nhấn để lấy lại", + "邮件": "Thư", + "个人信息": "Thông tin cá nhân", + "余额不足预警": "Cảnh báo số dư không đủ", + "促销活动通知": "Thông báo sự kiện khuyến mãi", + "修改密码、邮箱、微信等": "Thay đổi mật khẩu, email, WeChat, v.v.", + "更多选项": "Thêm tùy chọn", + "模型调价通知": "Thông báo điều chỉnh giá mô hình", + "系统公告通知": "Thông báo thông báo hệ thống", + "订阅管理": "Quản lý đăng ký", + "防失联-定期通知": "Ngăn mất liên lạc - thông báo định kỳ", + "订阅事件后,当事件触发时,您将会收到相应的通知": "Sau khi đăng ký sự kiện, bạn sẽ nhận được thông báo tương ứng khi sự kiện được kích hoạt.", + "当余额低于 ": "Khi số dư thấp hơn", + "保存": "Lưu", + "计费说明": "Hướng dẫn thanh toán", + "高稳定性": "Độ ổn định cao", + "没有账号请先": "Nếu chưa có tài khoản, vui lòng", + "注册账号": "Đăng ký tài khoản", + "第三方登录": "Đăng nhập bên thứ ba", + "欢迎回来": "Chào mừng trở lại", + "忘记密码": "Quên mật khẩu", + "想起来了?": "Nhớ ra rồi?", + "退出": "Thoát", + "确定": "Xác nhận", + "请输入星火大模型版本,注意是接口地址中的版本号,例如:v2[1]": "Vui lòng nhập phiên bản mô hình Spark, lưu ý là số phiên bản trong địa chỉ giao diện, ví dụ: v2.1", + "等待中": "Đang chờ", + "所有各厂聊天模型请统一使用OpenAI方式请求,支持OpenAI官方库": "Tất cả các mô hình trò chuyện từ các nhà cung cấp hãy sử dụng phương thức OpenAI để yêu cầu, hỗ trợ thư viện chính thức của OpenAI.", + "实付金额:": "Số tiền thực tế thanh toán:", + "金额": "Số tiền", + "充值金额": "Số tiền nạp", + "易支付 实付金额:": "Số tiền thực tế thanh toán qua Easy Pay:", + "微信扫码关注公众号,输入 ": "Quét mã QR WeChat để theo dõi tài khoản chính thức và nhập", + " 获取验证码(三分钟内有效)": "Lấy mã xác minh (có hiệu lực trong ba phút)", + "不可用模型": "Mô hình không khả dụng", + "关": "Đóng", + "加载首页内容失败": "Tải nội dung trang chủ thất bại", + "打开聊天": "Mở trò chuyện", + "新窗口打开": "Mở cửa sổ mới", + "禁用(仍可为用户单独开启)": "Vô hiệu hóa (vẫn có thể bật riêng cho người dùng)", + "重新配置": "Cấu hình lại", + "隐藏不可用模型": "Ẩn các mô hình không khả dụng", + " 时,将收到预警通知(2小时最多1次)": "Khi, bạn sẽ nhận được thông báo cảnh báo (tối đa mỗi 2 giờ một lần)", + "在iframe中加载": "Tải trong iframe", + "补全倍率": "Tỷ lệ hoàn thành", + "保存分组数据失败": "Lưu dữ liệu nhóm thất bại", + "没有可用的使用信息": "Không có thông tin sử dụng khả dụng", + "使用详情": "Chi tiết sử dụng", + "收起": "Thu gọn", + "计费详情": "Chi tiết thanh toán", + "提示Token": "Mã thông báo gợi ý", + "补全Token": "Mã thông báo hoàn thành", + "提示Token详情": "Chi tiết mã thông báo gợi ý", + "补全Token详情": "Chi tiết mã thông báo hoàn thành", + "输出Token详情": "Chi tiết mã thông báo đầu ra", + "缓存Token": "Mã thông báo bộ nhớ cache", + "内部缓存Token": "Mã thông báo bộ nhớ cache nội bộ", + "图像Token": "Mã thông báo hình ảnh", + "音频Token": "Mã thông báo âm thanh", + "开": "Mở", + "推理Token": "Mã thông báo suy luận", + "文本Token": "Mã thông báo văn bản", + "显示禁用渠道": "Hiển thị các kênh bị vô hiệu hóa", + "输入Token详情": "Chi tiết mã thông báo đầu vào", + "输出Token": "Mã thông báo đầu ra", + "隐藏禁用渠道": "Ẩn các kênh bị vô hiệu hóa", + "今日不再提醒": "Không nhắc lại hôm nay", + "平台/类型": "Nền tảng/Loại", + "平台和类型": "Nền tảng và loại", + "当前选择分组": "Nhóm hiện tại được chọn", + "表情迁移": "Chuyển biểu cảm", + "音频输入:": "Đầu vào âm thanh:", + "音频输出:": "Đầu ra âm thanh:", + "风格重绘": "Vẽ lại phong cách", + "发送测试通知失败": "Gửi thông báo thử nghiệm thất bại", + "开始时间": "Thời gian bắt đầu", + "当前所选分组不可用": "Nhóm hiện tại được chọn không khả dụng", + "接口凭证": "Thông tin giao diện", + "文字输入": "Nhập văn bản", + "文字输出": "Đầu ra văn bản", + "日志详情": "Chi tiết nhật ký", + "未完成": "Chưa hoàn thành", + "测试单个渠道操作项目组": "Kiểm tra nhóm dự án vận hành kênh đơn", + "测试通知": "Thông báo kiểm tra", + "测试通知发送成功": "Thông báo kiểm tra được gửi thành công", + "点击此处查看接入文档": "Nhấn vào đây để xem tài liệu truy cập", + "类型1": "Loại 1", + "类型1 (Imagine)": "Loại 1 (Imagine)", + "类型1价格": "Giá loại 1", + "类型2": "Loại 2", + "类型2 (Upscale)": "Loại 2 (Upscale)", + "类型2价格": "Giá loại 2", + "类型3价格": "Giá loại 3", + "计费过程": "Quy trình thanh toán", + "语音输入": "Đầu vào giọng nói", + "语音输出": "Đầu ra giọng nói", + "请在右侧切换到可用分组": "Vui lòng chuyển sang nhóm khả dụng ở bên phải", + "请联系管理员~": "Vui lòng liên hệ quản trị viên~", + "调用消费": "Tiêu thụ cuộc gọi", + "质量": "Chất lượng", + "速度": "Tốc độ", + "钉钉机器人Key": "Khóa robot DingTalk", + "需要@的用户手机号": "Cần số điện thoại của người dùng @", + "(提示": "(Gợi ý", + "下载文件": "Tải xuống tệp", + "https...xxx.com.webhook": "", + "搜索渠道的 ID,名称和密钥 ": "Tìm kiếm ID, tên và khóa của kênh", + "搜索用户的 ID,用户名,显示名称,以及邮箱地址 ": "Tìm kiếm ID, tên người dùng, tên hiển thị và địa chỉ email của người dùng", + "操作失败,重定向至登录界面中": "Thao tác thất bại, đang chuyển hướng đến giao diện đăng nhập", + "支付中": "Đang thanh toán", + "等级": "Cấp độ", + "钉钉": "DingTalk", + "模型价格:${{price}} * 分组倍率:{{ratio}} = ${{total}}": "Giá mô hình: ${{price}} * Tỷ lệ nhóm: {{ratio}} = ${{total}}", + "输入:${{price}} * {{ratio}} = ${{total}} / 1M tokens": "Gợi ý: ${{price}} * {{ratio}} = ${{total}} / 1M mã thông báo", + "输出:${{price}} * {{ratio}} = ${{total}} / 1M tokens": "Hoàn thành: ${{price}} * {{ratio}} = ${{total}} / 1M mã thông báo", + "图片输入:${{price}} * {{ratio}} = ${{total}} / 1M tokens (图片倍率: {{imageRatio}})": "Hình ảnh đầu vào: ${{price}} * {{ratio}} = ${{total}} / 1M mã thông báo (Tỷ lệ hình ảnh: {{imageRatio}})", + "音频输入:${{price}} * {{ratio}} * {{audioRatio}} = ${{total}} / 1M tokens": "Gợi ý âm thanh: ${{price}} * {{ratio}} * {{audioRatio}} = ${{total}} / 1M mã thông báo", + "音频提示 {{input}} tokens / 1M tokens * ${{price}} * {{audioRatio}} + 音频补全 {{completion}} tokens / 1M tokens * ${{price}} * {{audioRatio}} * {{audioCompRatio}}": "Gợi ý âm thanh {{input}} mã thông báo / 1M mã thông báo * ${{price}} * {{audioRatio}} + Hoàn thành âm thanh {{completion}} mã thông báo / 1M mã thông báo * ${{price}} * {{audioRatio}} * {{audioCompRatio}}", + "音频输出:${{price}} * {{ratio}} * {{audioRatio}} * {{audioCompRatio}} = ${{total}} / 1M tokens": "Hoàn thành âm thanh: ${{price}} * {{ratio}} * {{audioRatio}} * {{audioCompRatio}} = ${{total}} / 1M mã thông báo", + "输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens * {{imageRatio}} / 1M tokens * ${{price}} + 输出 {{completion}} tokens / 1M tokens * ${{compPrice}} * 分组 {{ratio}} = ${{total}}": "Đầu vào {{nonImageInput}} mã thông báo + Hình ảnh đầu vào {{imageInput}} mã thông báo * {{imageRatio}} / 1M mã thông báo * ${{price}} + Đầu ra {{completion}} mã thông báo / 1M mã thông báo * ${{compPrice}} * Nhóm {{ratio}} = ${{total}}", + "(文字 + 音频)* 分组倍率 {{ratio}} = ${{total}}": "(Văn bản + Âm thanh) * Tỷ lệ nhóm {{ratio}} = ${{total}}", + "文字提示 {{input}} tokens / 1M tokens * ${{price}} + 文字补全 {{completion}} tokens / 1M tokens * ${{compPrice}} +": "Gợi ý văn bản {{input}} mã thông báo / 1M mã thông báo * ${{price}} + Hoàn thành văn bản {{completion}} mã thông báo / 1M mã thông báo * ${{compPrice}} +", + "输入 {{input}} tokens / 1M tokens * ${{price}} + 输出 {{completion}} tokens / 1M tokens * ${{compPrice}} * 分组 {{ratio}} = ${{total}}": "Gợi ý {{input}} mã thông báo / 1M mã thông báo * ${{price}} + Hoàn thành {{completion}} mã thông báo / 1M mã thông báo * ${{compPrice}} * Nhóm {{ratio}} = ${{total}}", + "价格:${{price}} * 分组:{{ratio}}": "Giá: ${{price}} * Nhóm: {{ratio}}", + "模型: {{ratio}} * 分组: {{groupRatio}}": "Mô hình: {{ratio}} * Nhóm: {{groupRatio}}", + "统计额度": "Thống kê hạn mức", + "统计Tokens": "Thống kê mã thông báo", + "统计次数": "Thống kê số lần", + "平均RPM": "RPM trung bình", + "平均TPM": "TPM trung bình", + "消耗分布": "Phân phối tiêu thụ", + "调用次数分布": "Phân phối số lần gọi mô hình", + "消耗趋势": "Xu hướng tiêu thụ", + "模型消耗趋势": "Xu hướng tiêu thụ mô hình", + "调用次数排行": "Xếp hạng số lần gọi", + "模型调用次数排行": "Xếp hạng số lần gọi mô hình", + "添加渠道": "Thêm kênh", + "测试所有通道": "Kiểm tra tất cả các kênh", + "删除禁用通道": "Xóa các kênh bị vô hiệu hóa", + "修复数据库一致性": "Sửa chữa tính nhất quán cơ sở dữ liệu", + "删除所选通道": "Xóa các kênh đã chọn", + "标签聚合模式": "Kích hoạt chế độ thẻ", + "没有账户?": "Không có tài khoản?", + "请输入 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", + "默认 API 版本": "Phiên bản API mặc định", + "请输入默认 API 版本,例如:2025-04-01-preview": "Vui lòng nhập phiên bản API mặc định, ví dụ: 2025-04-01-preview.", + "请为渠道命名": "Vui lòng đặt tên cho kênh", + "请选择可以使用该渠道的分组": "Vui lòng chọn các nhóm có thể sử dụng kênh này", + "请在系统设置页面编辑分组倍率以添加新的分组:": "Vui lòng chỉnh sửa tỷ lệ nhóm trong cài đặt hệ thống để thêm nhóm mới:", + "部署地区": "Khu vực triển khai", + "请输入部署地区,例如:us-central1\n支持使用模型映射格式": "Vui lòng nhập khu vực triển khai, ví dụ: us-central1\nHỗ trợ định dạng ánh xạ mô hình", + "填入模板": "Điền mẫu", + "鉴权json": "JSON xác thực", + "请输入鉴权json": "Vui lòng nhập JSON xác thực", + "组织": "Tổ chức", + "组织,不填则为默认组织": "Tổ chức, nếu để trống thì là tổ chức mặc định", + "请输入组织org-xxx": "Vui lòng nhập tổ chức org-xxx", + "默认测试模型": "Mô hình kiểm tra mặc định", + "不填则为模型列表第一个": "Nếu để trống thì là mô hình đầu tiên trong danh sách", + "是否自动禁用(仅当自动禁用开启时有效),关闭后不会自动禁用该渠道": "Tự động vô hiệu hóa (chỉ có hiệu lực khi tự động vô hiệu hóa được bật). Khi tắt, kênh này sẽ không bị vô hiệu hóa tự động", + "状态码复写": "Ghi đè mã trạng thái", + "此项可选,用于复写返回的状态码,仅影响本地判断,不修改返回到上游的状态码,比如将claude渠道的400错误复写为500(用于重试),请勿滥用该功能,例如:": "Tùy chọn, dùng để ghi đè mã trạng thái trả về, chỉ ảnh hưởng đến đánh giá cục bộ, không sửa đổi mã trạng thái trả về phía trên, ví dụ: ghi đè lỗi 400 của kênh Claude thành 500 (để thử lại). Vui lòng không lạm dụng tính năng này. Ví dụ:", + "渠道标签": "Thẻ kênh", + "渠道优先级": "Ưu tiên kênh", + "渠道权重": "Trọng số kênh", + "仅支持 OpenAI 接口格式": "Chỉ hỗ trợ định dạng giao diện OpenAI", + "请填写密钥": "Vui lòng nhập khóa", + "获取模型列表成功": "Lấy danh sách mô hình thành công", + "获取模型列表失败": "Lấy danh sách mô hình thất bại", + "请填写渠道名称和渠道密钥!": "Vui lòng nhập tên kênh và khóa kênh!", + "请至少选择一个模型!": "Vui lòng chọn ít nhất một mô hình!", + "提交失败,请勿重复提交!": "Gửi thất bại, vui lòng không gửi lại!", + "某些模型已存在!": "Một số mô hình đã tồn tại!", + "如果你对接的是上游One API或者New API等转发项目,请使用OpenAI类型,不要使用此类型,除非你知道你在做什么。": "Nếu bạn đang kết nối với các dự án chuyển tiếp như One API hoặc New API, vui lòng sử dụng loại OpenAI. Không sử dụng loại này trừ khi bạn biết mình đang làm gì.", + "完整的 Base URL,支持变量{model}": "URL cơ sở đầy đủ, hỗ trợ biến {model}", + "请输入完整的URL,例如:https://api.openai.com/v1/chat/completions": "Vui lòng nhập URL đầy đủ, ví dụ: https://api.openai.com/v1/chat/completions", + "此项可选,用于通过自定义API地址来进行 API 调用,末尾不要带/v1和/": "Tùy chọn để thực hiện cuộc gọi API qua địa chỉ API tùy chỉnh, không thêm /v1 và / ở cuối", + "私有部署地址": "Địa chỉ triển khai riêng", + "请输入私有部署地址,格式为: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", + "注意非Chat API,请务必填写正确的API地址,否则可能导致无法使用": "Lưu ý: Đối với API không phải Chat, hãy đảm bảo nhập đúng địa chỉ API, nếu không có thể không sử dụng được", + "请输入到 /suno 前的路径,通常就是域名,例如:https://api.example.com": "Vui lòng nhập đường dẫn trước /suno, thường là tên miền, ví dụ: https://api.example.com", + "填入相关模型": "Điền các mô hình liên quan", + "新建渠道时,请求通过当前浏览器发出;编辑已有渠道,请求通过后端服务器发出": "Khi tạo kênh mới, yêu cầu được gửi qua trình duyệt hiện tại; khi chỉnh sửa kênh hiện có, yêu cầu được gửi qua máy chủ backend", + "获取模型列表": "Lấy danh sách mô hình", + "填入": "Điền", + "输入自定义模型名称": "Nhập tên mô hình tùy chỉnh", + "知识库 ID": "ID kho kiến thức", + "请输入知识库 ID,例如:123456": "Vui lòng nhập ID kho kiến thức, ví dụ: 123456", + "可选值": "Giá trị tùy chọn", + "你好": "Xin chào", + "你好,请问有什么可以帮助您的吗?": "Xin chào, tôi có thể giúp gì cho bạn?", + "用户分组": "Nhóm mặc định của bạn", + "每页条数": "Số mục mỗi trang", + "令牌无法精确控制使用额度,只允许自用,请勿直接将令牌分发给他人。": "Mã thông báo không thể kiểm soát chính xác hạn mức sử dụng, chỉ cho phép tự sử dụng, vui lòng không phân phối mã thông báo trực tiếp cho người khác.", + "添加兑换码": "Thêm mã đổi thưởng", + "复制所选兑换码到剪贴板": "Sao chép mã đổi thưởng đã chọn vào bảng tạm", + "新建兑换码": "Mã", + "兑换码更新成功!": "Cập nhật mã đổi thưởng thành công!", + "兑换码创建成功!": "Tạo mã đổi thưởng thành công!", + "兑换码创建成功": "Mã đổi thưởng đã được tạo", + "兑换码创建成功,是否下载兑换码?": "Mã đổi thưởng đã được tạo thành công. Bạn có muốn tải xuống mã đổi thưởng không?", + "兑换码将以文本文件的形式下载,文件名为兑换码的名称。": "Mã đổi thưởng sẽ được tải xuống dưới dạng tệp văn bản, tên tệp là tên của mã đổi thưởng.", + "模型价格": "Giá mô hình", + "按K显示单位": "Hiển thị theo đơn vị K", + "可用分组": "Nhóm khả dụng", + "您的默认分组为:{{group}},分组倍率为:{{ratio}}": "Nhóm mặc định của bạn là: {{group}}, tỷ lệ nhóm: {{ratio}}", + "按量计费费用 = 分组倍率 × 模型倍率 × (提示token数 + 补全token数 × 补全倍率)/ 500000 (单位:美元)": "Chi phí thanh toán theo dung lượng = Tỷ lệ nhóm × Tỷ lệ mô hình × (Số mã thông báo gợi ý + Số mã thông báo hoàn thành × Tỷ lệ hoàn thành) / 500000 (Đơn vị: USD)", + "模糊搜索模型名称": "Tìm kiếm mờ tên mô hình", + "您还未登陆,显示的价格为默认分组倍率: {{ratio}}": "Bạn chưa đăng nhập, giá hiển thị là tỷ lệ nhóm mặc định: {{ratio}}", + "你的分组无权使用该模型": "Nhóm của bạn không có quyền sử dụng mô hình này", + "您的分组可以使用该模型": "Nhóm của bạn có thể sử dụng mô hình này", + "当前查看的分组为:{{group}},倍率为:{{ratio}}": "Nhóm hiện tại: {{group}}, tỷ lệ: {{ratio}}", + "添加用户": "Thêm người dùng", + "角色": "Vai trò", + "已绑定的 Telegram 账户": "Tài khoản Telegram đã liên kết", + "新额度:": "Hạn mức mới:", + "需要添加的额度(支持负数)": "Hạn mức cần thêm (hỗ trợ số âm)", + "此项只读,需要用户通过个人设置页面的相关绑定按钮进行绑定,不可直接修改": "Chỉ đọc, người dùng cần liên kết thông qua nút liên kết liên quan trên trang cài đặt cá nhân, không thể sửa đổi trực tiếp", + "请输入新的密码,最短 8 位": "Vui lòng nhập mật khẩu mới, tối thiểu 8 ký tự", + "添加额度": "Thêm hạn mức", + "以下信息不可修改": "Thông tin sau không thể sửa đổi", + "充值确认": "Xác nhận nạp tiền", + "充值数量": "Số lượng nạp", + "实付金额": "Số tiền thực tế thanh toán", + "是否确认充值?": "Xác nhận nạp tiền?", + "默认聊天页面链接": "Liên kết trang trò chuyện mặc định", + "聊天页面 2 链接": "Liên kết trang trò chuyện 2", + "失败重试次数": "Số lần thử lại thất bại", + "额度查询接口返回令牌额度而非用户额度": "Giao diện truy vấn hạn mức trả về hạn mức mã thông báo thay vì hạn mức người dùng", + "默认折叠侧边栏": "Thu gọn thanh bên mặc định", + "聊天链接功能已经弃用,请使用下方聊天设置功能": "Chức năng liên kết trò chuyện đã bị ngừng sử dụng, vui lòng sử dụng chức năng cài đặt trò chuyện bên dưới", + "你似乎并没有修改什么": "Bạn dường như chưa sửa đổi gì", + "聊天设置": "Cài đặt trò chuyện", + "必须将上方聊天链接全部设置为空,才能使用下方聊天设置功能": "Phải đặt tất cả liên kết trò chuyện phía trên thành trống để sử dụng chức năng cài đặt trò chuyện bên dưới", + "链接中的{key}将自动替换为sk-xxxx,{address}将自动替换为系统设置的服务器地址,末尾不带/和/v1": "{key} trong liên kết sẽ tự động được thay thế bằng sk-xxxx, {address} sẽ tự động được thay thế bằng địa chỉ máy chủ trong cài đặt hệ thống, không có / và /v1 ở cuối", + "聊天配置": "Cấu hình trò chuyện", + "保存聊天设置": "Lưu cài đặt trò chuyện", + "绘图设置": "Cài đặt vẽ", + "启用绘图功能": "Bật chức năng vẽ", + "允许回调(会泄露服务器 IP 地址)": "Cho phép gọi lại (sẽ tiết lộ địa chỉ IP máy chủ)", + "允许 AccountFilter 参数": "Cho phép tham số AccountFilter", + "开启之后将上游地址替换为服务器地址": "Sau khi bật, địa chỉ phía trên sẽ được thay thế bằng địa chỉ máy chủ", + "开启之后会清除用户提示词中的": "Sau khi bật, các từ gợi ý của người dùng sẽ bị xóa", + "检测必须等待绘图成功才能进行放大等操作": "Phải đợi vẽ thành công trước khi thực hiện các thao tác như phóng to", + "保存绘图设置": "Lưu cài đặt vẽ", + "以及": "và", + "参数": "Tham số", + "屏蔽词过滤设置": "Cài đặt lọc từ nhạy cảm", + "启用屏蔽词过滤功能": "Bật chức năng lọc từ nhạy cảm", + "启用 Prompt 检查": "Bật kiểm tra gợi ý", + "屏蔽词列表": "Danh sách từ nhạy cảm", + "一行一个屏蔽词,不需要符号分割": "Một dòng một từ nhạy cảm, không cần ký hiệu phân tách", + "保存屏蔽词过滤设置": "Lưu cài đặt lọc từ nhạy cảm", + "日志设置": "Cài đặt nhật ký", + "日志记录时间": "Thời gian ghi nhật ký", + "请选择日志记录时间": "Vui lòng chọn thời gian ghi nhật ký", + "清除历史日志": "Xóa nhật ký lịch sử", + "条日志已清理!": "Nhật ký đã được xóa!", + "保存日志设置": "Lưu cài đặt nhật ký", + "数据看板设置": "Cài đặt bảng điều khiển dữ liệu", + "启用数据看板(实验性)": "Bật bảng điều khiển dữ liệu (thử nghiệm)", + "数据看板更新间隔": "Khoảng thời gian cập nhật bảng điều khiển dữ liệu", + "数据看板默认时间粒度": "Độ chi tiết thời gian mặc định của bảng điều khiển dữ liệu", + "保存数据看板设置": "Lưu cài đặt bảng điều khiển dữ liệu", + "请选择最长响应时间": "Vui lòng chọn thời gian phản hồi dài nhất", + "成功时自动启用通道": "Tự động kích hoạt kênh khi thành công", + "分钟": "phút", + "设置过短会影响数据库性能": "Cài đặt quá ngắn sẽ ảnh hưởng đến hiệu suất cơ sở dữ liệu", + "仅修改展示粒度,统计精确到小时": "Chỉ sửa đổi độ chi tiết hiển thị, thống kê chính xác đến giờ", + "当运行通道全部测试时,超过此时间将自动禁用通道": "Khi chạy kiểm tra tất cả các kênh, kênh sẽ tự động bị vô hiệu hóa nếu vượt quá thời gian này", + "设置公告": "Thiết lập thông báo", + "设置 Logo": "Thiết lập Logo", + "设置首页内容": "Thiết lập nội dung trang chủ", + "设置关于": "Thiết lập về", + "公告已更新": "Thông báo đã được cập nhật", + "系统名称已更新": "Tên hệ thống đã được cập nhật", + "Logo 已更新": "Logo đã được cập nhật", + "首页内容已更新": "Nội dung trang chủ đã được cập nhật", + "关于已更新": "Thông tin về đã được cập nhật", + "模型测试": "Kiểm tra mô hình", + "当前未开启Midjourney回调,部分项目可能无法获得绘图结果,可在运营设置中开启。": "Hiện tại chưa bật gọi lại Midjourney, một số dự án có thể không lấy được kết quả vẽ, có thể bật trong cài đặt vận hành.", + "Telegram 身份验证": "Xác thực Telegram", + "Linux DO 身份验证": "Xác thực Linux DO", + "协议": "Giấy phép", + "修改子渠道权重": "Sửa đổi trọng số kênh con", + "确定要修改所有子渠道权重为 ": "Xác nhận sửa đổi trọng số tất cả các kênh con thành ", + " 吗?": "?", + "修改子渠道优先级": "Sửa đổi ưu tiên kênh con", + "确定要修改所有子渠道优先级为 ": "Xác nhận sửa đổi ưu tiên tất cả các kênh con thành ", + "分组倍率设置": "Cài đặt tỷ lệ nhóm", + "用户可选分组": "Nhóm người dùng có thể chọn", + "保存分组倍率设置": "Lưu cài đặt tỷ lệ nhóm", + "模型倍率设置": "Cài đặt tỷ lệ mô hình", + "可视化倍率设置": "Cài đặt tỷ lệ mô hình trực quan", + "确定重置模型倍率吗?": "Xác nhận đặt lại tỷ lệ mô hình?", + "模型固定价格": "Giá cố định mỗi lần gọi mô hình", + "模型补全倍率(仅对自定义模型有效)": "Tỷ lệ hoàn thành mô hình (chỉ có hiệu lực với mô hình tùy chỉnh)", + "保存模型倍率设置": "Lưu cài đặt tỷ lệ mô hình", + "重置模型倍率": "Đặt lại tỷ lệ mô hình", + "一次调用消耗多少刀,优先级大于模型倍率": "Một lần gọi tốn bao nhiêu USD, ưu tiên cao hơn tỷ lệ mô hình", + "仅对自定义模型有效": "Chỉ có hiệu lực với mô hình tùy chỉnh", + "添加模型": "Thêm mô hình", + "应用更改": "Áp dụng thay đổi", + "更多": "Mở rộng thêm", + "个模型": "mô hình", + "可用模型": "Mô hình khả dụng", + "时间范围": "Phạm vi thời gian", + "批量设置标签": "Cài đặt thẻ hàng loạt", + "请输入要设置的标签名称": "Vui lòng nhập tên thẻ cần thiết lập", + "请输入标签名称": "Vui lòng nhập tên thẻ", + "支持搜索用户的 ID、用户名、显示名称和邮箱地址": "Hỗ trợ tìm kiếm ID, tên người dùng, tên hiển thị và địa chỉ email của người dùng", + "已注销": "Đã đăng xuất", + "自动禁用关键词": "Từ khóa vô hiệu hóa tự động", + "一行一个,不区分大小写": "Một dòng một từ khóa, không phân biệt hoa thường", + "当上游通道返回错误中包含这些关键词时(不区分大小写),自动禁用通道": "Khi kênh phía trên trả về lỗi chứa các từ khóa này (không phân biệt hoa thường), tự động vô hiệu hóa kênh", + "请求并计费模型": "Yêu cầu và tính phí mô hình", + "实际模型": "Mô hình thực tế", + "渠道信息": "Thông tin kênh", + "通知设置": "Cài đặt thông báo", + "Webhook地址": "Địa chỉ Webhook", + "请输入Webhook地址,例如: https://example.com/webhook": "Vui lòng nhập địa chỉ Webhook, ví dụ: https://example.com/webhook", + "邮件通知": "Thông báo qua email", + "Webhook通知": "Thông báo qua Webhook", + "接口凭证(可选)": "Thông tin giao diện (tùy chọn)", + "密钥将以 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 lệ của yêu cầu webhook", + "Authorization: Bearer your-secret-key": "Authorization: Bearer your-secret-key", + "额度预警阈值": "Ngưỡng cảnh báo hạn mức", + "当剩余额度低于此数值时,系统将通过选择的方式发送通知": "Khi hạn mức còn lại thấp hơn giá trị này, hệ thống sẽ gửi thông báo qua phương thức đã chọn", + "Webhook请求结构": "Cấu trúc yêu cầu Webhook", + "只支持https,系统将以 POST 方式发送通知,请确保地址可以接收 POST 请求": "Chỉ hỗ trợ https, hệ thống sẽ gửi thông báo qua POST, vui lòng đảm bảo địa chỉ có thể nhận yêu cầu POST", + "通知邮箱": "Email thông báo", + "设置用于接收额度预警的邮箱地址,不填则使用账号绑定的邮箱": "Thiết lập địa chỉ email để nhận cảnh báo hạn mức, nếu không điền thì sử dụng email liên kết với tài khoản", + "留空则使用账号绑定的邮箱": "Nếu để trống, sẽ sử dụng email liên kết với tài khoản", + "API地址": "Địa chỉ API", + "对于官方渠道,new-api已经内置地址,除非是第三方代理站点或者Azure的特殊接入地址,否则不需要填写": "Đối với các kênh chính thức, new-api đã có địa chỉ tích hợp. Trừ khi là trang proxy bên thứ ba hoặc địa chỉ truy cập đặc biệt của Azure, nếu không thì không cần điền", + "渠道额外设置": "Cài đặt bổ sung kênh", + "强制格式化": "Định dạng bắt buộc", + "强制将响应格式化为 OpenAI 标准格式(只适用于OpenAI渠道类型)": "Bắt buộc định dạng phản hồi thành định dạng chuẩn OpenAI (chỉ áp dụng cho loại kênh OpenAI)", + "思考内容转换": "Chuyển đổi nội dung suy nghĩ", + "将 reasoning_content 转换为 标签拼接到内容中": "Chuyển đổi reasoning_content thành thẻ và thêm vào nội dung", + "透传请求体": "Chuyển tiếp nội dung yêu cầu", + "启用请求体透传功能": "Bật chức năng chuyển tiếp nội dung yêu cầu", + "代理地址": "Địa chỉ proxy", + "例如: socks5://user:pass@host:port": "Ví dụ: socks5://user:pass@host:port", + "用于配置网络代理,支持 socks5 协议": "Dùng để cấu hình proxy mạng, hỗ trợ giao thức socks5", + "系统提示词": "Gợi ý hệ thống", + "输入系统提示词,用户的系统提示词将优先于此设置": "Nhập gợi ý hệ thống, gợi ý hệ thống của người dùng sẽ được ưu tiên hơn cài đặt này", + "用户优先:如果用户在请求中指定了系统提示词,将优先使用用户的设置": "Ưu tiên người dùng: Nếu người dùng chỉ định gợi ý hệ thống trong yêu cầu, cài đặt của người dùng sẽ được sử dụng trước", + "参数覆盖": "Ghi đè tham số", + "模型请求速率限制": "Giới hạn tốc độ yêu cầu mô hình", + "启用用户模型请求速率限制(可能会影响高并发性能)": "Bật giới hạn tốc độ yêu cầu mô hình của người dùng (có thể ảnh hưởng đến hiệu suất đồng thời cao)", + "限制周期": "Chu kỳ giới hạn", + "用户每周期最多请求次数": "Số lần yêu cầu tối đa của người dùng mỗi chu kỳ", + "用户每周期最多请求完成次数": "Số lần yêu cầu thành công tối đa của người dùng mỗi chu kỳ", + "包括失败请求的次数,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", + "频率限制的周期(分钟)": "Chu kỳ giới hạn tần suất (phút)", + "只包括请求成功的次数": "Chỉ bao gồm số lần yêu cầu thành công", + "保存模型速率限制": "Lưu cài đặt giới hạn tốc độ mô hình", + "速率限制设置": "Cài đặt giới hạn tốc độ", + "获取启用模型失败:": "Lấy mô hình kích hoạt thất bại:", + "获取启用模型失败": "Lấy mô hình kích hoạt thất bại", + "JSON解析错误:": "Lỗi phân tích JSON:", + "保存失败:": "Lưu thất bại:", + "输入模型倍率": "Nhập tỷ lệ mô hình", + "输入补全倍率": "Nhập tỷ lệ hoàn thành", + "请输入数字": "Vui lòng nhập số", + "模型名称已存在": "Tên mô hình đã tồn tại", + "添加成功": "Thêm thành công", + "请先选择需要批量设置的模型": "Vui lòng chọn mô hình cần cài đặt hàng loạt trước", + "请输入模型倍率和补全倍率": "Vui lòng nhập tỷ lệ mô hình và tỷ lệ hoàn thành", + "请输入有效的数字": "Vui lòng nhập số hợp lệ", + "请输入填充值": "Vui lòng nhập giá trị điền", + "批量设置成功": "Cài đặt hàng loạt thành công", + "已为 {{count}} 个模型设置{{type}}": "Đã cài đặt {{type}} cho {{count}} mô hình", + "固定价格": "Giá cố định", + "模型倍率和补全倍率": "Tỷ lệ mô hình và tỷ lệ hoàn thành", + "批量设置": "Cài đặt hàng loạt", + "搜索模型名称": "Tìm kiếm tên mô hình", + "此页面仅显示未设置价格或倍率的模型,设置后将自动从列表中移除": "Trang này chỉ hiển thị các mô hình chưa được cài đặt giá hoặc tỷ lệ, sau khi cài đặt sẽ tự động bị xóa khỏi danh sách", + "没有未设置的模型": "Không có mô hình chưa được cấu hình", + "定价模式": "Chế độ định giá", + "固定价格(每次)": "Giá cố định (mỗi lần sử dụng)", + "输入每次价格": "Nhập giá mỗi lần sử dụng", + "批量设置模型参数": "Cài đặt tham số mô hình hàng loạt", + "设置类型": "Loại cài đặt", + "模型倍率值": "Giá trị tỷ lệ mô hình", + "补全倍率值": "Giá trị tỷ lệ hoàn thành", + "请输入模型倍率": "Vui lòng nhập tỷ lệ mô hình", + "请输入补全倍率": "Vui lòng nhập tỷ lệ hoàn thành", + "请输入数值": "Vui lòng nhập giá trị", + "将为选中的 ": "Sẽ cài đặt cho ", + " 个模型设置相同的值": " mô hình với cùng giá trị", + "当前设置类型: ": "Loại cài đặt hiện tại: ", + "固定价格值": "Giá trị giá cố định", + "未设置倍率模型": "Mô hình chưa cài đặt tỷ lệ", + "模型倍率和补全倍率同时设置": "Tỷ lệ mô hình và tỷ lệ hoàn thành được cài đặt đồng thời", + "自用模式": "Chế độ tự sử dụng", + "开启后不限制:必须设置模型倍率": "Sau khi bật, không giới hạn: phải cài đặt tỷ lệ mô hình", + "演示站点模式": "Chế độ trang demo", + "当前版本": "Phiên bản hiện tại", + "Gemini设置": "Cài đặt Gemini", + "Gemini安全设置": "Cài đặt bảo mật Gemini", + "default为默认设置,可单独设置每个分类的安全等级": "\"default\" là cài đặt mặc định, có thể cài đặt riêng mức bảo mật cho từng danh mục", + "Gemini版本设置": "Cài đặt phiên bản Gemini", + "default为默认设置,可单独设置每个模型的版本": "\"default\" là cài đặt mặc định, có thể cài đặt riêng phiên bản cho từng mô hình", + "Claude设置": "Cài đặt Claude", + "Claude请求头覆盖": "Ghi đè tiêu đề yêu cầu Claude", + "示例": "Ví dụ", + "缺省 MaxTokens": "MaxTokens mặc định", + "启用Claude思考适配(-thinking后缀)": "Bật thích ứng suy nghĩ Claude (hậu tố -thinking)", + "和Claude不同,默认情况下Gemini的思考模型会自动决定要不要思考,就算不开启适配模型也可以正常使用,": "Khác với Claude, mô hình suy nghĩ của Gemini theo mặc định sẽ tự động quyết định có suy nghĩ hay không, ngay cả khi không bật mô hình thích ứng vẫn có thể sử dụng bình thường,", + "如果您需要计费,推荐设置无后缀模型价格按思考价格设置。": "Nếu bạn cần tính phí, khuyến nghị cài đặt giá mô hình không có hậu tố theo giá suy nghĩ.", + "支持使用 gemini-2.5-pro-preview-06-05-thinking-128 格式来精确传递思考预算。": "Hỗ trợ sử dụng định dạng gemini-2.5-pro-preview-06-05-thinking-128 để truyền chính xác ngân sách suy nghĩ.", + "启用Gemini思考后缀适配": "Bật thích ứng hậu tố suy nghĩ Gemini", + "适配-thinking、-thinking-预算数字和-nothinking后缀": "Thích ứng với các hậu tố -thinking, -thinking-budgetNumber và -nothinking", + "思考预算占比": "Tỷ lệ ngân sách suy nghĩ", + "Claude思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Thích ứng suy nghĩ Claude BudgetTokens = MaxTokens * Phần trăm BudgetTokens", + "思考适配 BudgetTokens 百分比": "Phần trăm BudgetTokens thích ứng suy nghĩ", + "0.1-1之间的小数": "Số thập phân từ 0.1 đến 1", + "模型相关设置": "Cài đặt liên quan đến mô hình", + "收起侧边栏": "Thu gọn thanh bên", + "展开侧边栏": "Mở rộng thanh bên", + "提示缓存倍率": "Tỷ lệ bộ nhớ cache gợi ý", + "缓存:${{price}} * {{ratio}} = ${{total}} / 1M tokens (缓存倍率: {{cacheRatio}})": "Bộ nhớ cache: ${{price}} * {{ratio}} = ${{total}} / 1M mã thông báo (tỷ lệ bộ nhớ cache: {{cacheRatio}})", + "提示 {{nonCacheInput}} tokens + 缓存 {{cacheInput}} tokens * {{cacheRatio}} / 1M tokens * ${{price}} + 补全 {{completion}} tokens / 1M tokens * ${{compPrice}} * 分组 {{ratio}} = ${{total}}": "Gợi ý {{nonCacheInput}} mã thông báo + bộ nhớ cache {{cacheInput}} mã thông báo * {{cacheRatio}} / 1M mã thông báo * ${{price}} + hoàn thành {{completion}} mã thông báo / 1M mã thông báo * ${{compPrice}} * nhóm {{ratio}} = ${{total}}", + "缓存 Tokens": "Mã thông báo bộ nhớ cache", + "系统初始化": "Khởi tạo hệ thống", + "管理员账号已经初始化过,请继续设置其他参数": "Tài khoản quản trị viên đã được khởi tạo, vui lòng tiếp tục cài đặt các tham số khác", + "管理员账号": "Tài khoản quản trị viên", + "请输入管理员用户名": "Vui lòng nhập tên người dùng quản trị viên", + "请输入管理员密码": "Vui lòng nhập mật khẩu quản trị viên", + "请确认管理员密码": "Vui lòng xác nhận mật khẩu quản trị viên", + "请选择使用模式": "Vui lòng chọn chế độ sử dụng", + "数据库警告": "Cảnh báo cơ sở dữ liệu", + "您正在使用 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, hãy đảm bảo đã cài đặt đúng ánh xạ bền vững cho tệp cơ sở dữ liệu, nếu không tất cả dữ liệu sẽ bị mất sau khi container khởi động lại!", + "建议在生产环境中使用 MySQL 或 PostgreSQL 数据库,或确保 SQLite 数据库文件已映射到宿主机的持久化存储。": "Khuyến nghị sử dụng cơ sở dữ liệu MySQL hoặc PostgreSQL trong môi trường sản xuất, hoặc đảm bảo tệp cơ sở dữ liệu SQLite đã được ánh xạ đến bộ nhớ bền vững của máy chủ.", + "使用模式": "Chế độ sử dụng", + "对外运营模式": "Chế độ mặc định", + "密码长度至少为8个字符": "Mật khẩu phải dài ít nhất 8 ký tự", + "表单引用错误,请刷新页面重试": "Lỗi tham chiếu biểu mẫu, vui lòng làm mới trang và thử lại", + "初始化系统": "Khởi tạo hệ thống", + "支持众多的大模型供应商": "Hỗ trợ nhiều nhà cung cấp mô hình lớn", + "统一的大模型接口网关": "The Unified LLMs API Gateway", + "更好的价格,更好的稳定性,只需要将模型基址替换为:": "Giá tốt hơn, độ ổn định cao hơn, không cần đăng ký, chỉ cần thay thế URL cơ sở mô hình bằng: ", + "获取密钥": "Lấy khóa", + "关于我们": "Về chúng tôi", + "关于项目": "Về dự án", + "联系我们": "Liên hệ chúng tôi", + "功能特性": "Tính năng", + "快速开始": "Bắt đầu nhanh", + "安装指南": "Hướng dẫn cài đặt", + "API 文档": "Tài liệu API", + "相关项目": "Dự án liên quan", + "基于New API的项目": "Dự án dựa trên New API", + "版权所有": "Bản quyền thuộc về", + "设计与开发由": "Thiết kế và phát triển bởi", + "演示站点": "Trang demo", + "页面未找到,请检查您的浏览器地址是否正确": "Không tìm thấy trang, vui lòng kiểm tra địa chỉ trình duyệt của bạn có đúng không", + "您无权访问此页面,请联系管理员": "Bạn không có quyền truy cập trang này. Vui lòng liên hệ quản trị viên.", + "New API项目仓库地址:": "Địa chỉ kho dự án New API: ", + "© {{currentYear}}": "© {{currentYear}}", + "| 基于": " | Dựa trên ", + "MIT许可证": "Giấy phép MIT", + "AGPL v3.0协议": "Giấy phép AGPL v3.0", + "本项目根据": "Dự án này được cấp phép theo ", + "授权,需在遵守": " và phải được sử dụng tuân theo ", + "的前提下使用。": ".", + "管理员暂时未设置任何关于内容": "Quản trị viên chưa thiết lập bất kỳ nội dung tùy chỉnh nào về thông tin", + "早上好": "Chào buổi sáng", + "中午好": "Chào buổi trưa", + "下午好": "Chào buổi chiều", + "晚上好": "Chào buổi tối", + "更多提示信息": "Thêm thông tin gợi ý", + "新建": "Tạo mới", + "更新": "Cập nhật", + "基本信息": "Thông tin cơ bản", + "设置令牌的基本信息": "Thiết lập thông tin cơ bản của mã thông báo", + "设置令牌可用额度和数量": "Thiết lập hạn mức và số lượng mã thông báo khả dụng", + "访问限制": "Hạn chế truy cập", + "设置令牌的访问限制": "Thiết lập hạn chế truy cập của mã thông báo", + "请勿过度信任此功能,IP可能被伪造": "Không nên tin tưởng quá mức vào tính năng này, IP có thể bị giả mạo", + "模型限制列表": "Danh sách hạn chế mô hình", + "请选择该令牌支持的模型,留空支持所有模型": "Vui lòng chọn các mô hình được mã thông báo hỗ trợ, để trống để hỗ trợ tất cả mô hình", + "非必要,不建议启用模型限制": "Không cần thiết, không khuyến nghị bật hạn chế mô hình", + "分组信息": "Thông tin nhóm", + "设置令牌的分组": "Thiết lập nhóm mã thông báo", + "管理员未设置用户可选分组": "Quản trị viên chưa thiết lập các nhóm người dùng có thể chọn", + "10个": "10 mục", + "20个": "20 mục", + "30个": "30 mục", + "100个": "100 mục", + "Midjourney 任务记录": "Bản ghi nhiệm vụ Midjourney", + "任务记录": "Bản ghi nhiệm vụ", + "剩余": "Còn lại", + "已用": "Đã sử dụng", + "调用": "Cuộc gọi", + "调用次数": "Số lần gọi", + "邀请": "Lời mời", + "收益": "Thu nhập", + "无邀请人": "Không có người mời", + "邀请人": "Người mời", + "设置兑换码的基本信息": "Thiết lập thông tin cơ bản của mã đổi thưởng", + "设置兑换码的额度和数量": "Thiết lập hạn mức và số lượng mã đổi thưởng", + "编辑用户": "Chỉnh sửa người dùng", + "权限设置": "Cài đặt quyền", + "用户的基本账户信息": "Thông tin tài khoản cơ bản của người dùng", + "用户分组和额度管理": "Quản lý nhóm và hạn mức người dùng", + "绑定信息": "Thông tin liên kết", + "第三方账户绑定状态(只读)": "Trạng thái liên kết tài khoản bên thứ ba (chỉ đọc)", + "已绑定的 OIDC 账户": "Tài khoản OIDC đã liên kết", + "使用兑换码充值余额": "Nạp số dư bằng mã đổi thưởng", + "支持多种支付方式": "Hỗ trợ nhiều phương thức thanh toán", + "尊敬的": "Kính gửi", + "请输入兑换码": "Vui lòng nhập mã đổi thưởng", + "在线充值功能未开启": "Chức năng nạp tiền trực tuyến chưa được kích hoạt", + "管理员未开启在线充值功能,请联系管理员开启或使用兑换码充值。": "Quản trị viên chưa kích hoạt chức năng nạp tiền trực tuyến, vui lòng liên hệ quản trị viên để kích hoạt hoặc nạp tiền bằng mã đổi thưởng.", + "点击模型名称可复制": "Nhấn vào tên mô hình để sao chép", + "管理您的邀请链接和收益": "Quản lý liên kết mời và thu nhập của bạn", + "没有可用模型": "Không có mô hình khả dụng", + "账户绑定": "Liên kết tài khoản", + "安全设置": "Cài đặt bảo mật", + "系统访问令牌": "Mã thông báo truy cập hệ thống", + "用于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", + "密码管理": "Quản lý mật khẩu", + "定期更改密码可以提高账户安全性": "Thay đổi mật khẩu định kỳ có thể tăng cường bảo mật tài khoản", + "删除账户": "Xóa tài khoản", + "此操作不可逆,所有数据将被永久删除": "Thao tác này không thể hoàn tác, tất cả dữ liệu sẽ bị xóa vĩnh viễn", + "生成令牌": "Tạo mã thông báo", + "通过邮件接收通知": "Nhận thông báo qua email", + "通过HTTP请求接收通知": "Nhận thông báo qua yêu cầu HTTP", + "价格设置": "Cài đặt giá", + "重新生成": "Tạo lại", + "绑定微信账户": "Liên kết tài khoản WeChat", + "原密码": "Mật khẩu gốc", + "请输入原密码": "Vui lòng nhập mật khẩu gốc", + "请输入新密码": "Vui lòng nhập mật khẩu mới", + "请再次输入新密码": "Vui lòng nhập lại mật khẩu mới", + "删除账户确认": "Xác nhận xóa tài khoản", + "请输入您的用户名以确认删除": "Vui lòng nhập tên người dùng của bạn để xác nhận xóa", + "接受未设置价格模型": "Chấp nhận các mô hình chưa cài đặt giá", + "当模型没有设置价格时仍接受调用,仅当您信任该网站时使用,可能会产生高额费用": "Chấp nhận các cuộc gọi ngay cả khi mô hình chưa cài đặt giá, chỉ sử dụng khi bạn tin tưởng trang web, có thể phát sinh chi phí cao", + "批量操作": "Thao tác hàng loạt", + "未开始": "Chưa bắt đầu", + "测试中": "Đang kiểm tra", + "请求时长: ${time}s": "Thời gian yêu cầu: ${time}s", + "搜索模型...": "Tìm kiếm mô hình...", + "批量测试${count}个模型": "Kiểm tra hàng loạt ${count} mô hình", + "测试中...": "Đang kiểm tra...", + "渠道的模型测试": "Kiểm tra mô hình kênh", + "共": "Tổ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 cập nhật số dư của tất cả các kênh đã kích hoạt không?", + "已选择 ${count} 个渠道": "Đã chọn ${count} kênh", + "渠道的基本配置信息": "Thông tin cấu hình cơ bản của kênh", + "API 配置": "Cấu hình API", + "API 地址和相关配置": "Địa chỉ API và cấu hình liên quan", + "模型配置": "Cấu hình mô hình", + "模型选择和映射设置": "Cài đặt lựa chọn và ánh xạ mô hình", + "高级设置": "Cài đặt nâng cao", + "渠道的高级配置选项": "Tùy chọn cấu hình nâng cao của kênh", + "设置说明": "Mô tả cài đặt", + "此项可选,用于配置渠道特定设置,为一个 JSON 字符串,例如:": "Tùy chọn này dùng để cấu hình cài đặt đặc thù của kênh, dưới dạng chuỗi JSON, ví dụ:", + "此项可选,用于覆盖请求参数。不支持覆盖 stream 参数。为一个 JSON 字符串,例如:": "Tùy chọn này dùng để ghi đè tham số yêu cầu. Không hỗ trợ ghi đè tham số stream. Dưới dạng chuỗi JSON, ví dụ:", + "编辑标签": "Chỉnh sửa thẻ", + "标签信息": "Thông tin thẻ", + "标签的基本配置": "Cấu hình cơ bản của thẻ", + "所有编辑均为覆盖操作,留空则不更改": "Tất cả chỉnh sửa là thao tác ghi đè, để trống sẽ không thay đổi", + "标签名称": "Tên thẻ", + "请选择该渠道所支持的模型,留空则不更改": "Vui lòng chọn các mô hình được kênh hỗ trợ, để trống sẽ không thay đổi", + "此项可选,用于修改请求体中的模型名称,为一个 JSON 字符串,键为请求中模型名称,值为要替换的模型名称,留空则不更改": "Tùy chọn này dùng để sửa đổi tên mô hình trong nội dung yêu cầu, dưới dạng chuỗi JSON, khóa là tên mô hình trong yêu cầu, giá trị là tên mô hình cần thay thế, để trống sẽ không thay đổi", + "清空重定向": "Xóa chuyển hướng", + "不更改": "Không thay đổi", + "用户分组配置": "Cấu hình nhóm người dùng", + "请选择可以使用该渠道的分组,留空则不更改": "Vui lòng chọn các nhóm có thể sử dụng kênh này, để trống sẽ không thay đổi", + "启用全部": "Kích hoạt tất cả", + "禁用全部": "Vô hiệu hóa tất cả", + "模型定价": "Định giá mô hình", + "当前分组": "Nhóm hiện tại", + "全部模型": "Tất cả mô hình", + "智谱": "Zhipu AI", + "通义千问": "Qwen", + "文心一言": "ERNIE Bot", + "讯飞星火": "Spark Desk", + "腾讯混元": "Hunyuan", + "360智脑": "360 AI Brain", + "零一万物": "Yi", + "豆包": "Doubao", + "系统公告": "Thông báo hệ thống", + "今日关闭": "Đóng hôm nay", + "关闭公告": "Đóng thông báo", + "搜索条件": "Điều kiện tìm kiếm", + "加载中...": "Đang tải...", + "正在跳转...": "Đang chuyển hướng...", + "暂无公告": "Không có thông báo", + "欢迎使用,请完成以下设置以开始使用系统": "Chào mừng bạn sử dụng, vui lòng hoàn tất các cài đặt sau để bắt đầu sử dụng hệ thống", + "数据库检查": "Kiểm tra cơ sở dữ liệu", + "验证数据库连接状态": "Xác minh trạng thái kết nối cơ sở dữ liệu", + "设置管理员登录信息": "Thiết lập thông tin đăng nhập quản trị viên", + "选择系统运行模式": "Chọn chế độ vận hành hệ thống", + "完成初始化": "Hoàn tất khởi tạo", + "确认设置并完成初始化": "Xác nhận cài đặt và hoàn tất khởi tạo", + "数据库信息": "Thông tin cơ sở dữ liệu", + "请填写完整的管理员账号信息": "Vui lòng điền đầy đủ thông tin tài khoản quản trị viên", + "准备完成初始化": "Chuẩn bị hoàn tất khởi tạo", + "请确认以下设置信息,点击\"初始化系统\"开始配置": "Vui lòng xác nhận thông tin cài đặt sau, nhấn \"Khởi tạo hệ thống\" để bắt đầu cấu hình", + "数据库类型": "Loại cơ sở dữ liệu", + "您正在使用 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 xuất sắc, phù hợp cho môi trường sản phẩm.", + "选择适合您使用场景的模式": "Chọn chế độ phù hợp với trường hợp sử dụng của bạn", + "适用于为多个用户提供服务的场景": "Phù hợp cho các trường hợp cung cấp dịch vụ cho nhiều người dùng", + "适用于个人使用的场景,不需要设置模型价格": "Phù hợp cho sử dụng cá nhân, không cần thiết lập giá mô hình", + "适用于展示系统功能的场景,提供基础功能演示": "Phù hợp cho các trường hợp thể hiện chức năng hệ thống, cung cấp các bản demo tính năng cơ bản", + "账户数据": "Dữ liệu tài khoản", + "使用统计": "Thống kê sử dụng", + "资源消耗": "Tiêu thụ tài nguyên", + "性能指标": "Chỉ số hiệu suất", + "模型数据分析": "Phân tích dữ liệu mô hình", + "搜索无结果": "Không tìm thấy kết quả", + "仪表盘设置": "Cài đặt bảng điều khiển", + "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)", + "线路描述": "Mô tả đường truyền", + "颜色": "Màu sắc", + "标识颜色": "Màu nhận diện", + "添加API": "Thêm API", + "API信息": "Thông tin API", + "暂无API信息": "Không có thông tin API", + "请输入API地址": "Vui lòng nhập địa chỉ API", + "请输入线路描述": "Vui lòng nhập mô tả đường truyền", + "如:大带宽批量分析图片推荐": "Ví dụ: Phân tích hàng loạt hình ảnh băng thông lớn", + "请输入说明": "Vui lòng nhập mô tả", + "如:香港线路": "Ví dụ: Đường truyền Hồng Kông", + "请联系管理员在系统设置中配置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", + "请联系管理员在系统设置中配置公告信息": "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", + "请联系管理员在系统设置中配置常见问答": "Vui lòng liên hệ quản trị viên để cấu hình thông tin FAQ 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", + "确定要删除此API信息吗?": "Bạn có chắc chắn muốn xóa thông tin API này không?", + "测速": "Kiểm tra tốc độ", + "跳转": "Chuyển hướng", + "批量删除": "Xóa hàng loạt", + "常见问答": "Câu hỏi thường gặp", + "进行中": "Đang tiến hành", + "警告": "Cảnh báo", + "添加公告": "Thêm thông báo", + "编辑公告": "Chỉnh sửa thông báo", + "公告内容": "Nội dung thông báo", + "请输入公告内容": "Vui lòng nhập nội dung thông báo", + "请输入公告内容(支持 Markdown/HTML)": "Vui lòng nhập nội dung thông báo (hỗ trợ Markdown/HTML)", + "发布日期": "Ngày phát hành", + "请选择发布日期": "Vui lòng chọn ngày phát hành", + "发布时间": "Thời gian phát hành", + "公告类型": "Loại thông báo", + "说明信息": "Thông tin mô tả", + "可选,公告的补充说明": "Tùy chọn, thông tin bổ sung cho thông báo", + "确定要删除此公告吗?": "Bạn có chắc chắn muốn xóa thông báo này không?", + "系统公告管理,可以发布系统通知和重要消息": "Quản lý thông báo hệ thống, bạn có thể phát hành thông báo hệ thống và các tin nhắn quan trọng", + "暂无系统公告": "Không có thông báo hệ thống", + "添加问答": "Thêm câu hỏi thường gặp", + "编辑问答": "Chỉnh sửa câu hỏi thường gặp", + "问题标题": "Tiêu đề câu hỏi", + "请输入问题标题": "Vui lòng nhập tiêu đề câu hỏi", + "回答内容": "Nội dung trả lời", + "请输入回答内容": "Vui lòng nhập nội dung trả lời", + "请输入回答内容(支持 Markdown/HTML)": "Vui lòng nhập nội dung trả lời (hỗ trợ Markdown/HTML)", + "确定要删除此问答吗?": "Bạn có chắc chắn muốn xóa câu hỏi thường gặp này không?", + "系统公告管理,可以发布系统通知和重要消息(最多100个,前端显示最新20条)": "Quản lý thông báo hệ thống, bạn có thể phát hành thông báo hệ thống và các tin nhắn quan trọng (tối đa 100, hiển thị 20 thông báo mới nhất ở giao diện người dùng)", + "常见问答管理,为用户提供常见问题的答案(最多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 phổ biến của người dùng (tối đa 50, hiển thị 20 câu hỏi mới nhất ở giao diện người dùng)", + "暂无常见问答": "Không có câu hỏi thường gặp", + "显示最新20条": "Hiển thị 20 mục mới nhất", + "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)", + "添加分类": "Thêm danh mục", + "分类名称": "Tên danh mục", + "Uptime Kuma地址": "Địa chỉ Uptime Kuma", + "状态页面Slug": "Slug trang trạng thái", + "请输入分类名称,如:OpenAI、Claude等": "Vui lòng nhập tên danh mục, ví dụ: OpenAI, Claude, v.v.", + "请输入Uptime Kuma服务地址,如:https://status.example.com": "Vui lòng nhập địa chỉ dịch vụ Uptime Kuma, ví dụ: https://status.example.com", + "请输入状态页面的Slug,如:my-status": "Vui lòng nhập slug của trang trạng thái, ví dụ: my-status", + "确定要删除此分类吗?": "Bạn có chắc chắn muốn xóa danh mục này không?", + "配置": "Cấu hình", + "服务监控地址,用于展示服务状态信息": "Địa chỉ giám sát dịch vụ để hiển thị thông tin trạng thái dịch vụ", + "服务可用性": "Trạng thái dịch vụ", + "可用率": "Tỷ lệ khả dụng", + "有异常": "Có bất thường", + "高延迟": "Độ trễ cao", + "维护中": "Đang bảo trì", + "暂无监控数据": "Không có dữ liệu giám sát", + "IP记录": "Bản ghi IP", + "记录请求与错误日志 IP": "Ghi lại IP của yêu cầu và nhật ký lỗi", + "开启后,仅\"消费\"和\"错误\"日志将记录您的客户端IP地址": "Sau khi bật, chỉ các nhật ký \"tiêu thụ\" và \"lỗi\" sẽ ghi lại địa chỉ IP của máy khách", + "只有当用户设置开启IP记录时,才会进行请求和错误类型日志的IP记录": "Chỉ khi người dùng bật ghi IP, địa chỉ IP của các nhật ký yêu cầu và lỗi mới được ghi lại", + "设置保存成功": "Lưu cài đặt thành công", + "设置保存失败": "Lưu cài đặt thất bại", + "已新增 {{count}} 个模型:{{list}}": "Đã thêm {{count}} mô hình: {{list}}", + "未发现新增模型": "Không tìm thấy mô hình mới nào được thêm", + "清除失效兑换码": "Xóa mã đổi thưởng không hợp lệ", + "确定清除所有失效兑换码?": "Bạn có chắc chắn muốn xóa tất cả mã đổi thưởng không hợp lệ không?", + "将删除已使用、已禁用及过期的兑换码,此操作不可撤销。": "Sẽ xóa tất 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.", + "选择过期时间(可选,留空为永久)": "Chọn thời gian hết hạn (tùy chọn, để trống để vĩnh viễn)", + "请输入备注(仅管理员可见)": "Vui lòng nhập ghi chú (chỉ quản trị viên thấy)", + "上游倍率同步": "Đồng bộ tỷ lệ từ phía trên", + "获取渠道失败:": "Lấy kênh thất bại: ", + "请至少选择一个渠道": "Vui lòng chọn ít nhất một kênh", + "获取倍率失败:": "Lấy tỷ lệ thất bại: ", + "后端请求失败": "Yêu cầu phía sau thất bại", + "部分渠道测试失败:": "Một số kênh kiểm tra thất bại: ", + "未找到差异化倍率,无需同步": "Không tìm thấy tỷ lệ khác biệt, không cần đồng bộ", + "请求后端接口失败:": "Yêu cầu giao diện phía sau thất bại: ", + "同步成功": "Đồng bộ thành công", + "部分保存失败": "Lưu một phần thất bại", + "保存失败": "Lưu thất bại", + "选择同步渠道": "Chọn kênh đồng bộ", + "应用同步": "Áp dụng đồng bộ", + "倍率类型": "Loại tỷ lệ", + "当前值": "Giá trị hiện tại", + "上游值": "Giá trị phía trên", + "差异": "Sự khác biệt", + "搜索渠道名称或地址": "Tìm kiếm tên hoặc địa chỉ kênh", + "缓存倍率": "Tỷ lệ bộ nhớ cache", + "暂无差异化倍率显示": "Không có hiển thị tỷ lệ khác biệt", + "请先选择同步渠道": "Vui lòng chọn kênh đồng bộ trước", + "与本地相同": "Giống với cục bộ", + "未找到匹配的模型": "Không tìm thấy mô hình phù hợp", + "暴露倍率接口": "Hiển thị giao diện tỷ lệ", + "支付设置": "Cài đặt thanh toán", + "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(Hiện tại chỉ hỗ trợ giao diện Easy Pay, sử dụng địa chỉ máy chủ phía trên làm địa chỉ gọi lại mặc định!)", + "支付地址": "Địa chỉ thanh toán", + "易支付商户ID": "ID thương nhân Easy Pay", + "易支付商户密钥": "Khóa thương nhân Easy Pay", + "回调地址": "Địa chỉ gọi lại", + "充值价格(x元/美金)": "Giá nạp tiền (x VNĐ/USD)", + "最低充值美元数量": "Số tiền nạp tối thiểu (USD)", + "充值分组倍率": "Tỷ lệ nhóm nạp tiền", + "充值方式设置": "Cài đặt phương thức nạp tiền", + "更新支付设置": "Cập nhật cài đặt thanh toán", + "通知": "Thông báo", + "源地址": "Địa chỉ nguồn", + "同步接口": "Giao diện đồng bộ", + "置信度": "Độ tin cậy", + "谨慎": "Thận trọng", + "该数据可能不可信,请谨慎使用": "Dữ liệu này có thể không đáng tin, vui lòng sử dụng thận trọng", + "可信": "Đáng tin", + "所有上游数据均可信": "Tất cả dữ liệu phía trên đều đáng tin", + "以下上游数据可能不可信:": "Dữ liệu phía trên sau đây có thể không đáng tin: ", + "按倍率类型筛选": "Lọc theo loại tỷ lệ", + "内容": "Nội dung", + "放大编辑": "Mở rộng chỉnh sửa", + "编辑公告内容": "Chỉnh sửa nội dung thông báo", + "自适应列表": "Danh sách tự thích ứng", + "紧凑列表": "Danh sách gọn", + "仅显示矛盾倍率": "Chỉ hiển thị tỷ lệ xung đột", + "矛盾": "Xung đột", + "确认冲突项修改": "Xác nhận sửa đổi mục xung đột", + "该模型存在固定价格与倍率计费方式冲突,请确认选择": "Mô hình này có xung đột giữa giá cố định và phương thức tính phí tỷ lệ, vui lòng xác nhận lựa chọn", + "当前计费": "Phương thức tính phí hiện tại", + "修改为": "Sửa đổi thành", + "状态筛选": "Lọc trạng thái", + "没有模型可以复制": "Không có mô hình nào để sao chép", + "模型列表已复制到剪贴板": "Danh sách mô hình đã được sao chép vào bảng tạm", + "复制失败": "Sao chép thất bại", + "复制已选": "Sao chép đã chọn", + "选择成功": "Lựa chọn thành công", + "暂无成功模型": "Không có mô hình thành công", + "请先选择模型!": "Vui lòng chọn mô hình trước!", + "已复制 ${count} 个模型": "Đã sao chép ${count} mô hình", + "复制失败,请手动复制": "Sao chép thất bại, vui lòng sao chép thủ công", + "过期时间快捷设置": "Cài đặt nhanh thời gian hết hạn", + "批量创建时会在名称后自动添加随机后缀": "Khi tạo hàng loạt, một hậu tố ngẫu nhiên sẽ tự động được thêm vào sau tên", + "额度必须大于0": "Hạn mức phải lớn hơn 0", + "生成数量必须大于0": "Số lượng tạo phải lớn hơn 0", + "可用端点类型": "Các loại điểm cuối được hỗ trợ", + "未登录,使用默认分组倍率:": "Chưa đăng nhập, sử dụng tỷ lệ nhóm mặc định: ", + "该服务器地址将影响支付回调地址以及默认首页展示的地址,请确保正确配置": "Đị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ị trên trang chủ mặc định, vui lòng đảm bảo cấu hình đúng", + "密钥聚合模式": "Chế độ tổng hợp khóa", + "随机": "Ngẫu nhiên", + "轮询": "Luân phiên", + "密钥文件 (.json)": "Tệp khóa (.json)", + "点击上传文件或拖拽文件到这里": "Nhấn để tải lên tệp hoặc kéo thả tệp vào đây", + "仅支持 JSON 文件": "Chỉ hỗ trợ tệp JSON", + "仅支持 JSON 文件,支持多文件": "Chỉ hỗ trợ tệp JSON, hỗ trợ nhiều tệp", + "请上传密钥文件": "Vui lòng tải lên tệp khóa", + "请填写部署地区": "Vui lòng điền khu vực triển khai", + "请输入部署地区,例如:us-central1\n支持使用模型映射格式\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}": "Vui lòng nhập khu vực triển khai, ví dụ: us-central1\nHỗ trợ sử dụng định dạng ánh xạ mô hình\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}", + "其他": "Khác", + "未知渠道": "Kênh không xác định", + "切换为单密钥模式": "Chuyển sang chế độ khóa đơn", + "将仅保留第一个密钥文件,其余文件将被移除,是否继续?": "Chỉ giữ lại tệp khóa đầu tiên, các tệp còn lại sẽ bị xóa. Tiếp tục?", + "自定义模型名称": "Tên mô hình tùy chỉnh", + "启用全部密钥": "Kích hoạt tất cả khóa", + "充值价格显示": "Hiển thị giá nạp tiền", + "美元汇率(非充值汇率,仅用于定价页面换算)": "Tỷ giá USD (không phải tỷ giá nạp tiền, chỉ dùng để chuyển đổi trên trang định giá)", + "美元汇率": "Tỷ giá USD", + "隐藏操作项": "Ẩn mục thao tác", + "显示操作项": "Hiển thị mục thao tác", + "用户组": "Nhóm người dùng", + "邀请获得额度": "Hạn mức từ lời mời", + "显示第": "Hiển thị từ", + "条 - 第": "đến", + "条,共": "trong tổng số", + "条": "mục", + "选择模型": "Chọn mô hình", + "已选择 {{selected}} / {{total}}": "Đã chọn {{selected}} / {{total}}", + "新获取的模型": "Mô hình mới lấy được", + "已有的模型": "Mô hình hiện có", + "搜索模型": "Tìm kiếm mô hình", + "缓存: {{cacheRatio}}": "Bộ nhớ cache: {{cacheRatio}}", + "缓存创建: {{cacheCreationRatio}}": "Tạo bộ nhớ cache: {{cacheCreationRatio}}", + "图片输入: {{imageRatio}}": "Hình ảnh đầu vào: {{imageRatio}}", + "系统提示覆盖": "Ghi đè gợi ý hệ thống", + "模型: {{ratio}}": "Mô hình: {{ratio}}", + "专属倍率": "Tỷ lệ nhóm độc quyền", + "匹配类型": "Loại khớp", + "描述": "Mô tả", + "供应商": "Nhà cung cấp", + "供应商介绍": "Giới thiệu nhà cung cấp", + "端点": "Điểm cuối", + "已绑定渠道": "Kênh đã liên kết", + "更新时间": "Thời gian cập nhật", + "未配置模型": "Mô hình chưa được cấu hình", + "预填组管理": "Quản lý nhóm điền sẵn", + "搜索供应商": "Tìm kiếm nhà cung cấp", + "新增供应商": "Thêm nhà cung cấp", + "创建新的模型": "Tạo mô hình mới", + "更新模型信息": "Cập nhật thông tin mô hình", + "请输入模型名称,如:gpt-4": "Vui lòng nhập tên mô hình, ví dụ: gpt-4", + "设置模型的基本信息": "Thiết lập thông tin cơ bản của mô hình", + "名称匹配类型": "Loại khớp tên", + "根据模型名称和匹配规则查找模型元数据,优先级:精确 > 前缀 > 后缀 > 包含": "Tìm kiế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", + "请选择名称匹配类型": "Vui lòng chọn loại khớp tên", + "请输入模型描述": "Vui lòng nhập mô tả mô hình", + "输入标签或使用\",\"分隔多个标签": "Nhập thẻ hoặc sử dụng \",\" để phân tách nhiều thẻ", + "选择模型供应商": "Chọn nhà cung cấp mô hình", + "端点映射": "Ánh xạ điểm cuối", + "可视化": "Trực quan hóa", + "手动编辑": "Chỉnh sửa thủ công", + "暂无数据,点击下方按钮添加键值对": "Không có dữ liệu, nhấn nút bên dưới để thêm cặp khóa-giá trị", + "添加键值对": "Thêm cặp khóa-giá trị", + "留空则使用默认端点;支持 {path, method}": "Để trống để sử dụng điểm cuối mặc định; hỗ trợ {path, method}", + "未配置的模型列表": "Danh sách mô hình chưa được cấu hình", + "个未配置模型": "mô hình chưa được cấu hình", + "组列表": "Danh sách nhóm", + "管理模型、标签、端点等预填组": "Quản lý mô hình, thẻ, điểm cuối, v.v. nhóm điền sẵn", + "新建组": "Tạo nhóm mới", + "组名": "Tên nhóm", + "项目内容": "Nội dung mục", + "创建新的预填组": "Tạo nhóm điền sẵn mới", + "更新预填组": "Cập nhật nhóm điền sẵn", + "设置预填组的基本信息": "Thiết lập thông tin cơ bản của nhóm điền sẵn", + "请输入组名": "Vui lòng nhập tên nhóm", + "请输入组描述": "Vui lòng nhập mô tả nhóm", + "项目": "Mục", + "输入项目名称,按回车添加": "Nhập tên mục, nhấn Enter để thêm", + "键为端点类型,值为路径和方法对象": "Khóa là loại điểm cuối, giá trị là đối tượng đường dẫn và phương thức", + "模型组": "Nhóm mô hình", + "标签组": "Nhóm thẻ", + "端点组": "Nhóm điểm cuối", + "供应商名称": "Tên nhà cung cấp", + "请输入供应商名称,如:OpenAI": "Vui lòng nhập tên nhà cung cấp, ví dụ: OpenAI", + "请输入供应商描述": "Vui lòng nhập mô tả nhà cung cấp", + "供应商图标": "Biểu tượng nhà cung cấp", + "请输入图标名称,如:OpenAI、Claude.Color": "Vui lòng nhập tên biểu tượng, ví dụ: OpenAI, Claude.Color", + "图标使用@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, ví dụ: OpenAI, Claude.Color, hỗ trợ tham số chuỗi: OpenAI.Avatar.type={'platform'}, OpenRouter.Avatar.shape={'square'}, để tra cứu tất cả biểu tượng có sẵn, vui lòng ", + "请点击我": "Vui lòng nhấn vào tôi", + "精确": "Chính xác", + "前缀": "Tiền tố", + "后缀": "Hậu tố", + "包含": "Chứa", + "全部供应商": "Tất cả nhà cung cấp", + "筛选": "Lọc", + "显示设置": "Cài đặt hiển thị", + "可用令牌分组": "Nhóm mã thông báo khả dụng", + "端点类型": "Loại điểm cuối", + "全部分组": "Tất cả nhóm", + "全部类型": "Tất cả loại", + "全部端点": "Tất cả điểm cuối", + "全部标签": "Tất cả thẻ", + "显示倍率": "Hiển thị tỷ lệ", + "表格视图": "Chế độ xem bảng", + "模型的详细描述和基本特性": "Mô tả chi tiết và đặc điểm cơ bản của mô hình", + "API端点": "Điểm cuối API", + "模型支持的接口端点信息": "Thông tin điểm cuối API được mô hình hỗ trợ", + "分组价格": "Giá nhóm", + "不同用户分组的价格信息": "Thông tin giá cho các nhóm người dùng khác nhau", + "auto分组调用链路": "Chuỗi gọi nhóm tự động", + "查看所有可用的AI模型供应商,包括众多知名供应商的模型。": "Xem tất cả nhà cung cấp mô hình AI khả dụng, bao gồm các mô hình từ nhiều nhà cung cấp nổi tiếng.", + "包含来自未知或未标明供应商的AI模型,这些模型可能来自小型供应商或开源项目。": "Bao gồm các mô hình AI từ nhà cung cấp không xác định hoặc không được đánh dấu, các mô hình này có thể đến từ nhà cung cấp nhỏ hoặc dự án mã nguồn mở.", + "该供应商提供多种AI模型,适用于不同的应用场景。": "Nhà cung cấp này cung cấp nhiều mô hình AI, phù hợp cho các trường hợp ứng dụng khác nhau.", + "未知供应商": "Không xác định", + "共 {{count}} 个模型": "{{count}} mô hình", + "倍率信息": "Thông tin tỷ lệ", + "多密钥管理": "Quản lý nhiều khóa", + "总密钥数": "Tổng số khóa", + "随机模式": "Chế độ ngẫu nhiên", + "轮询模式": "Chế độ luân phiên", + "手动禁用": "Vô hiệu hóa thủ công", + "自动禁用": "Vô hiệu hóa tự động", + "暂无密钥数据": "Không có dữ liệu khóa", + "请检查渠道配置或刷新重试": "Vui lòng kiểm tra cấu hình kênh hoặc làm mới và thử lại", + "全部状态": "Tất cả trạng thái", + "索引": "Chỉ số", + "禁用原因": "Lý do vô hiệu hóa", + "禁用时间": "Thời gian vô hiệu hóa", + "确定要启用所有密钥吗?": "Bạn có chắc chắn muốn kích hoạt tất cả khóa không?", + "确定要禁用所有的密钥吗?": "Bạn có chắc chắn muốn vô hiệu hóa tất cả khóa không?", + "确定要删除所有已自动禁用的密钥吗?": "Bạn có chắc chắn muốn xóa tất cả khóa tự động vô hiệu hóa không?", + "此操作不可撤销,将永久删除已自动禁用的密钥": "Thao tác này không thể hoàn tác, tất cả khóa tự động vô hiệu hóa sẽ bị xóa vĩnh viễn.", + "删除自动禁用密钥": "Xóa khóa tự động vô hiệu hóa", + "图标": "Biểu tượng", + "模型图标": "Biểu tượng mô hình", + "请输入图标名称": "Vui lòng nhập tên biểu tượng", + "精确名称匹配": "Khớp tên chính xác", + "前缀名称匹配": "Khớp tên tiền tố", + "后缀名称匹配": "Khớp tên hậu tố", + "包含名称匹配": "Khớp tên chứa", + "展开更多": "Mở rộng thêm", + "已切换至最优倍率视图,每个模型使用其最低倍率分组": "Đã 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ài đặt xác thực hai bước", + "两步验证(2FA)为您的账户提供额外的安全保护。启用后,登录时需要输入密码和验证器应用生成的验证码。": "Xác thực hai bước (2FA) cung cấp bảo vệ an toàn bổ sung cho tài khoản của bạn. Sau khi kích hoạt, bạn cần nhập mật khẩu và mã xác minh do ứng dụng xác thực tạo ra khi đăng nhập.", + "启用两步验证": "Kích hoạt xác thực hai bước", + "禁用两步验证": "Vô hiệu hóa xác thực hai bước", + "启用两步验证后,登录时需要输入密码和验证器应用生成的验证码": "Sau khi kích hoạt xác thực hai bước, bạn cần nhập mật khẩu và mã xác minh do ứng dụng xác thực tạo ra khi đăng nhập", + "禁用两步验证后,登录时只需要输入密码": "Sau khi vô hiệu hóa xác thực hai bước, bạn chỉ cần nhập mật khẩu khi đăng nhập", + "验证身份": "Xác minh danh tính", + "为了保护您的账户安全,请输入认证器验证码来确认身份": "Để bảo vệ an toàn tài khoản, vui lòng nhập mã xác minh của ứng dụng xác thực để xác nhận danh tính", + "输入认证器应用显示的6位数字验证码": "Nhập mã xác minh 6 chữ số hiển thị trên ứng dụng xác thực", + "新的备用恢复代码": "Mã khôi phục dự phòng mới", + "新的备用码已生成": "Mã dự phòng mới đã được tạo", + "我已了解禁用两步验证将永久删除所有相关设置和备用码,此操作不可撤销": "Tôi đã hiểu rằng vô hiệu hóa xác thực hai bước sẽ xóa vĩnh viễn tất 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 khoản đã bị khóa", + "剩余备用码:": "Mã dự phòng còn lại: ", + "启用验证": "Kích hoạt xác minh", + "重新生成备用码": "Tạo lại mã dự phòng", + "设置两步验证": "Thiết lập xác thực hai bước", + "扫描二维码": "Quét mã QR", + "使用认证器应用扫描二维码": "Sử dụng ứng dụng xác thực để quét mã QR", + "保存备用码": "Lưu mã dự phòng", + "保存备用码以备不时之需": "Lưu mã dự phòng để sử dụng trong trường hợp khẩn cấp", + "验证设置": "Xác minh cài đặt", + "输入验证码完成设置": "Nhập mã xác minh để hoàn tất cài đặt", + "使用认证器应用(如 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:", + "或手动输入密钥:": "Hoặc nhập khóa thủ công:", + "备用恢复代码": "Mã khôi phục dự phòng", + "复制所有代码": "Sao chép tất cả mã", + "上一步": "Quay lại", + "下一步": "Tiếp theo", + "完成设置并启用两步验证": "Hoàn tất cài đặt và kích hoạt xác thực hai bước", + "确认禁用": "Xác nhận vô hiệu hóa", + "完成": "Hoàn tất", + "生成新的备用码": "Tạo mã dự phòng mới", + "警告:禁用两步验证将永久删除您的验证设置和所有备用码,此操作不可撤销!": "Cảnh báo: Vô hiệu hóa xác thực hai bước 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!", + "禁用后的影响:": "Hậu quả sau khi vô hiệu hóa:", + "降低您账户的安全性": "Giảm độ an toàn của tài khoản", + "需要重新完整设置才能再次启用": "Cần thiết lập lại hoàn toàn để kích hoạt lại", + "永久删除您的两步验证设置": "Xóa vĩnh viễn cài đặt xác thực hai bước của bạn", + "永久删除所有备用码(包括未使用的)": "Xóa vĩnh viễn tất cả mã dự phòng (bao gồm cả mã chưa sử dụng)", + "请输入认证器验证码或备用码": "Vui lòng nhập mã xác minh hoặc mã dự phòng", + "重新生成备用码将使现有的备用码失效,请确保您已保存了当前的备用码。": "Tạo lại mã dự phòng sẽ làm mất hiệu lực các mã dự phòng hiện tại. Vui lòng đảm bảo bạn đã lưu mã dự phòng hiện tại.", + "请输入认证器验证码": "Vui lòng nhập mã xác minh của ứng dụng xác thực", + "旧的备用码已失效,请保存新的备用码": "Mã dự phòng cũ đã mất hiệu lực, vui lòng lưu mã dự phòng mới", + "获取2FA状态失败": "Lấy trạng thái 2FA thất bại", + "设置2FA失败": "Thiết lập 2FA thất bại", + "请输入验证码": "Vui lòng nhập mã xác minh", + "两步验证启用成功!": "Kích hoạt xác thực hai bước thành công!", + "启用2FA失败": "Kích hoạt 2FA thất bại", + "请输入验证码或备用码": "Vui lòng nhập mã xác minh hoặc mã dự phòng", + "请确认您已了解禁用两步验证的后果": "Vui lòng xác nhận bạn đã hiểu hậu quả của việc vô hiệu hóa xác thực hai bước", + "两步验证已禁用": "Xác thực hai bước đã bị vô hiệu hóa", + "禁用2FA失败": "Vô hiệu hóa 2FA thất bại", + "备用码重新生成成功": "Tạo lại mã dự phòng thành công", + "重新生成备用码失败": "Tạo lại mã dự phòng thất bại", + "备用码已复制到剪贴板": "Mã dự phòng đã được sao chép vào bảng tạm", + "账户管理": "Quản lý 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", + "通知、价格和隐私相关设置": "Cài đặt liên quan đến thông báo, giá cả và quyền riêng tư", + "通知配置": "Cấu hình thông báo", + "只支持HTTPS,系统将以POST方式发送通知,请确保地址可以接收POST请求": "Chỉ hỗ trợ HTTPS, hệ thống sẽ gửi thông báo qua phương thức POST, vui lòng đảm bảo địa chỉ có thể nhận yêu cầu POST", + "密钥将以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 lệ của yêu cầu webhook", + "Webhook请求结构说明": "Mô tả cấu trúc yêu cầu Webhook", + "通知类型 (quota_exceed: 额度预警)": "Loại thông báo (quota_exceed: cảnh báo hạn mức)", + "通知标题": "Tiêu đề thông báo", + "通知内容,支持 {{value}} 变量占位符": "Nội dung thông báo, hỗ trợ biến thay thế {{value}}", + "按顺序替换content中的变量占位符": "Thay thế các biến thay thế trong nội dung theo thứ tự", + "Unix时间戳": "Dấu thời gian Unix", + "隐私设置": "Cài đặt quyền riêng tư", + "记录请求与错误日志IP": "Ghi lại IP của yêu cầu và nhật ký lỗi", + "切换主题": "Chuyển đổi giao diện", + "浅色模式": "Chế độ sáng", + "深色模式": "Chế độ tối", + "自动模式": "Chế độ tự động", + "始终使用浅色主题": "Luôn sử dụng giao diện sáng", + "始终使用深色主题": "Luôn sử dụng giao diện tối", + "跟随系统主题设置": "Theo cài đặt giao diện hệ thống", + "当前跟随系统": "Hiện đang theo hệ thống", + "深色": "Tối", + "浅色": "Sáng", + "点击复制模型名称": "Nhấn để sao chép tên mô hình", + "已复制:{{name}}": "Đã sao chép: {{name}}", + "所有密钥已复制到剪贴板": "Tất cả khóa đã được sao chép vào bảng tạm", + "密钥已复制到剪贴板": "Khóa đã được sao chép vào bảng tạm", + "验证成功": "Xác minh thành công", + "渠道密钥列表": "Danh sách khóa kênh", + "渠道密钥": "Khóa kênh", + "共 {{count}} 个密钥": "Tổng cộng {{count}} khóa", + "复制全部": "Sao chép tất cả", + "JSON格式密钥,请确保格式正确": "Khóa định dạng JSON, vui lòng đảm bảo định dạng chính xác", + "检测到多个密钥,您可以单独复制每个密钥,或点击复制全部获取完整内容。": "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ấn Sao chép tất cả để lấy toàn bộ nội dung.", + "安全提醒": "Nhắc nhở bảo mật", + "请妥善保管密钥信息,不要泄露给他人。如有安全疑虑,请及时更换密钥。": "Vui lòng giữ an toàn thông tin khóa, không tiết lộ cho người khác. Nếu có nghi ngờ về bảo mật, hãy thay đổi khóa ngay lập tức.", + "安全验证": "Xác minh bảo mật", + "验证": "Xác minh", + "为了保护账户安全,请验证您的两步验证码。": "Để bảo vệ an toàn tài khoản, vui lòng xác minh mã xác thực hai bước của bạn.", + "支持6位TOTP验证码或8位备用码": "Hỗ trợ mã xác minh TOTP 6 chữ số hoặc mã dự phòng 8 chữ số", + "获取密钥失败": "Lấy khóa thất bại", + "查看密钥": "Xem khóa", + "查看渠道密钥": "Xem khóa kênh", + "渠道密钥信息": "Thông tin khóa kênh", + "密钥获取成功": "Lấy khóa thành công", + "顶栏管理": "Quản lý thanh trên cùng", + "控制顶栏模块显示状态,全局生效": "Kiểm soát trạng thái hiển thị mô-đun thanh trên cùng, có hiệu lực toàn cục", + "用户主页,展示系统信息": "Trang chủ người dùng, hiển thị thông tin hệ thống", + "用户控制面板,管理账户": "Bảng điều khiển người dùng để quản lý tài khoản", + "模型广场": "Quảng trường mô hình", + "模型定价,需要登录访问": "Định giá mô hình, cần đăng nhập để truy cập", + "文档": "Tài liệu", + "系统文档和帮助信息": "Tài liệu hệ thống và thông tin trợ giúp", + "关于系统的详细信息": "Thông tin chi tiết về hệ thống", + "重置为默认": "Đặt lại về mặc định", + "保存设置": "Lưu cài đặt", + "已重置为默认配置": "Đã đặt lại về cấu hình mặc định", + "保存成功": "Lưu thành công", + "保存失败,请重试": "Lưu thất bại, vui lòng thử lại", + "侧边栏管理(全局控制)": "Quản lý thanh bên (Kiểm soát toàn cục)", + "全局控制侧边栏区域和功能显示,管理员隐藏的功能用户无法启用": "Kiểm soát toàn cục khu vực và chức năng thanh bên, người dùng không thể kích hoạt các chức năng bị quản trị viên ẩn", + "聊天区域": "Khu vực trò chuyện", + "操练场和聊天功能": "Sân tập và chức năng trò chuyện", + "操练场": "Sân tập", + "AI模型测试环境": "Môi trường kiểm tra mô hình AI", + "聊天": "Trò chuyện", + "聊天会话管理": "Quản lý phiên trò chuyện", + "控制台区域": "Khu vực bảng điều khiển", + "数据管理和日志查看": "Quản lý dữ liệu và xem nhật ký", + "数据看板": "Bảng điều khiển dữ liệu", + "系统数据统计": "Thống kê dữ liệu hệ thống", + "令牌管理": "Quản lý mã thông báo", + "API令牌管理": "Quản lý mã thông báo API", + "使用日志": "Nhật ký sử dụng", + "API使用记录": "Bản ghi sử dụng API", + "绘图日志": "Nhật ký vẽ", + "绘图任务记录": "Bản ghi nhiệm vụ vẽ", + "任务日志": "Nhật ký nhiệm vụ", + "系统任务记录": "Bản ghi nhiệm vụ hệ thống", + "个人中心区域": "Khu vực trung tâm cá nhân", + "用户个人功能": "Chức năng cá nhân của người dùng", + "钱包管理": "Quản lý ví", + "余额充值管理": "Quản lý nạp số dư", + "个人设置": "Cài đặt cá nhân", + "个人信息设置": "Cài đặt thông tin cá nhân", + "管理员区域": "Khu vực quản trị viên", + "系统管理功能": "Chức năng quản lý hệ thống", + "渠道管理": "Quản lý kênh", + "API渠道配置": "Cấu hình kênh API", + "模型管理": "Quản lý mô hình", + "AI模型配置": "Cấu hình mô hình AI", + "兑换码管理": "Quản lý mã đổi thưởng", + "兑换码生成管理": "Quản lý tạo mã đổi thưởng", + "用户管理": "Quản lý người dùng", + "用户账户管理": "Quản lý tài khoản người dùng", + "系统设置": "Cài đặt hệ thống", + "系统参数配置": "Cấu hình tham số hệ thống", + "边栏设置": "Cài đặt thanh bên", + "您可以个性化设置侧边栏的要显示功能": "Bạn có thể tùy chỉnh các chức năng hiển thị trên thanh bên", + "保存边栏设置": "Lưu cài đặt thanh bên", + "侧边栏设置保存成功": "Lưu cài đặt thanh bên thành công", + "需要登录访问": "Yêu cầu đăng nhập để truy cập", + "开启后未登录用户无法访问模型广场": "Khi bật, người dùng chưa đăng nhập không thể truy cập quảng trường mô hình", + "参与官方同步": "Tham gia đồng bộ chính thức", + "关闭后,此模型将不会被“同步官方”自动覆盖或创建": "Khi tắt, mô hình này sẽ không bị “đồng bộ chính thức” tự động ghi đè hoặc tạo mới", + "同步": "Đồng bộ", + "同步向导": "Hướng dẫn đồng bộ", + "选择方式": "Chọn phương thức", + "选择同步来源": "Chọn nguồn đồng bộ", + "选择语言": "Chọn ngôn ngữ", + "选择同步语言": "Chọn ngôn ngữ đồng bộ", + "请选择同步语言": "Vui lòng chọn ngôn ngữ đồng bộ", + "从官方模型库同步": "Đồng bộ từ thư viện mô hình chính thức", + "官方模型同步": "Đồng bộ mô hình chính thức", + "从配置文件同步": "Đồng bộ từ tệp cấu hình", + "配置文件同步": "Đồng bộ tệp cấu hình", + "开始同步": "Bắt đầu đồng bộ", + "选择要覆盖的冲突项": "Chọn các mục xung đột để ghi đè", + "点击查看差异": "Nhấn để xem sự khác biệt", + "无冲突项": "Không có mục xung đột", + "应用覆盖": "Áp dụng ghi đè", + "仅会覆盖你勾选的字段,未勾选的字段保持本地不变。": "Chỉ ghi đè các trường bạn chọn, các trường không chọn sẽ giữ nguyên cục bộ.", + "本地": "Cục bộ", + "官方": "Chính thức", + "模型社区需要大家的共同维护,如发现数据有误或想贡献新的模型数据,请访问:": "Cộng đồng mô hình cần sự đóng góp của mọi người. Nếu phát hiện dữ liệu sai hoặc muốn đóng góp dữ liệu mô hình mới, vui lòng truy cập:", + "是": "Có", + "否": "Không", + "加载关于内容失败...": "Không thể tải nội dung giới thiệu...", + "密钥输入方式": "Phương thức nhập khóa", + "批量创建模式下仅支持文件上传,不支持手动输入": "Chế độ tạo hàng loạt chỉ hỗ trợ tải lên tệp, không hỗ trợ nhập thủ công", + "密钥(编辑模式下,保存的密钥不会显示)": "Khóa (trong chế độ chỉnh sửa, khóa đã lưu sẽ không hiển thị)", + "请输入完整的 JSON 格式密钥内容": "Vui lòng nhập nội dung khóa định dạng JSON đầy đủ", + "不需要在末尾加/v1,New API会自动处理,添加后可能导致请求失败,是否继续?": "Không cần thêm /v1 ở cuối, New API sẽ tự động xử lý, thêm vào có thể dẫn đến yêu cầu thất bại, có tiếp tục không?", + "设置系统管理员的登录信息": "Thiết lập thông tin đăng nhập của quản trị viên hệ thống", + "定价": "Bảng giá", + "默认模式": "Chế độ mặc định", + "无需计费": "Không tính phí", + "演示体验": "Trải nghiệm demo", + "钱包": "Ví", + "API令牌": "API Token", + "开启后,仅“消费”和“错误”日志将记录您的客户端 IP 地址": "Sau khi bật, chỉ các nhật ký \"tiêu thụ\" và \"lỗi\" sẽ ghi lại địa chỉ IP máy khách của bạn", + "使用兑换码快速充值": "Sử dụng mã đổi thưởng để nạp tiền nhanh chóng", + "兑换": "Đổi", + "第 {{start}} - {{end}} 条,共 {{total}} 条": "Mục {{start}} - {{end}} trong tổng số {{total}} mục", + "例如:0001": "Ví dụ: 0001", + "Stripe 设置": "Cài đặt Stripe", + "更新 Stripe 设置": "Cập nhật cài đặt Stripe", + "Stripe 密钥、Webhook 等设置请": "Cài đặt khóa Stripe, Webhook, v.v. vui lòng", + "进行设置,最好先在": "thiết lập, tốt nhất là trước", + "测试环境": "môi trường thử nghiệm", + "进行测试。": "để thử nghiệm.", + "网站地址": "Địa chỉ trang web", + "Webhook 填": "Điền Webhook", + "和": "và", + "需要包含事件": "cần bao gồm sự kiện", + "API 密钥": "API key", + "Webhook 签名密钥": "Webhook signature key", + "商品价格 ID": "ID giá sản phẩm", + "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "Khóa Stripe sk_xxx hoặc rk_xxx, thông tin nhạy cảm không hiển thị", + "whsec_xxx 的 Webhook 签名密钥,敏感信息不显示": "Khóa chữ ký Webhook whsec_xxx, thông tin nhạy cảm không hiển thị", + "price_xxx 的商品价格 ID,新建产品后可获得": "ID giá sản phẩm price_xxx, có thể lấy được sau khi tạo sản phẩm mới", + "分组倍率设置,可以在此处新增分组或修改现有分组的倍率,格式为 JSON 字符串,例如:{\"vip\": 0.5, \"test\": 1},表示 vip 分组的倍率为 0.5,test 分组的倍率为 1": "Cài đặt tỷ lệ nhóm, bạn có thể thêm nhóm mới hoặc sửa đổi tỷ lệ của nhóm hiện có ở đây, định dạng là chuỗi JSON, ví dụ: {\"vip\": 0.5, \"test\": 1}, biểu thị tỷ lệ của nhóm vip là 0.5, tỷ lệ của nhóm test là 1", + "用户新建令牌时可选的分组,格式为 JSON 字符串,例如:{\"vip\": \"VIP 用户\", \"test\": \"测试\"},表示用户可以选择 vip 分组和 test 分组": "Nhóm có thể chọn khi người dùng tạo mã thông báo mới, định dạng là chuỗi JSON, ví dụ: {\"vip\": \"Người dùng VIP\", \"test\": \"Kiểm tra\"}, cho thấy người dùng có thể chọn nhóm vip và nhóm kiểm tra", + "键为分组名称,值为另一个 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}}, cho thấy 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 mặc định và tỷ lệ 1 khi sử dụng mã thông báo từ nhóm kiểm tra.", + "分组特殊倍率": "Tỷ lệ nhóm đặc biệt", + "自动分组auto,从第一个开始选择": "Nhóm tự động auto, bắt đầu chọn từ cái đầu tiên", + "必须是有效的 JSON 字符串数组,例如:[\"g1\",\"g2\"]": "Phải là mảng chuỗi JSON hợp lệ, ví dụ: [\"g1\",\"g2\"]", + "创建令牌默认选择auto分组,初始令牌也将设为auto(否则留空,为用户默认分组)": "Tạo mã thông báo chọn 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, là nhóm mặc định của người dùng)", + "编辑模型": "Chỉnh sửa mô hình", + "按倍率设置": "Đặt theo tỷ lệ", + "价格设置方式": "Phương thức đặt giá", + "按价格设置": "Đặt theo giá", + "输出价格": "Giá đầu ra", + "输入价格": "Giá đầu vào", + "模型价格不能为0": "Giá mô hình không thể bằng 0", + "倍率模式": "Chế độ tỷ lệ", + "输入补全价格": "Nhập giá hoàn thiện", + "暂无数据": "Không có dữ liệu", + "暂无响应数据": "Không có dữ liệu phản hồi", + "暂无请求数据": "Không có dữ liệu yêu cầu", + "正在构造请求体预览...": "Đang xây dựng bản xem trước khi yêu cầu...", + "确认导入配置": "Xác nhận nhập cấu hình", + "导入的配置将覆盖当前设置,是否继续?": "Cấu hình nhập sẽ ghi đè cài đặt hiện tại, có tiếp tục không?", + "确定导入": "Xác nhận nhập", + "配置导入成功": "Nhập cấu hình thành công", + "导入配置失败": "Nhập cấu hình thất bạ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ũ, có muốn di chuyển sang định dạng cấu hình mới không?", + "注意:": "Lưu ý:", + "迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。": "Quá trình di chuyển sẽ tự động xử lý chuyển đổi định dạng dữ liệu, cấu hình cũ sẽ bị xóa sau khi di chuyển hoàn tất, 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", + "未知错误": "Lỗi không xác định", + "说明:": "Mô tả:", +"使用 JSON 对象格式,格式为:{\"组名\": [最多请求次数, 最多请求完成次数]}": "Sử dụng định dạng đối tượng JSON, định dạng là: {\"tên nhóm\": [số lượng yêu cầu tối đa, số lượng hoàn thành tối đa]}", +"示例:{\"default\": [200, 100], \"vip\": [0, 1000]}。": "Ví dụ: {\"default\": [200, 100], \"vip\": [0, 1000]}.", +"[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。": "[số lượng yêu cầu tối đa] phải lớn hơn hoặc bằng 0, [số lượng hoàn thành tối đa] phải lớn hơn hoặc bằng 1.", +"分组速率配置优先级高于全局速率限制。": "Cấu hình tỷ lệ nhóm có ưu tiên cao hơn giới hạn tỷ lệ toàn cầu.", +"限制周期统一使用上方配置的“限制周期”值。": "Chu kỳ giới hạn đồng nhất sử dụng giá trị \"chu kỳ giới hạn\" được cấu hình ở trên.", +"全局设置": "Cài đặt toàn cầu", +"启用请求透传": "Kích hoạt yêu cầu truyền thẳng", +"开启后,所有请求将直接透传给上游,不会进行任何处理(重定向和渠道适配也将失效),请谨慎开启": "Sau khi kích hoạt, tất cả các yêu cầu sẽ được truyền thẳng đến upstream mà không qua bất kỳ xử lý nào (chuyển hướng và thích ứng kênh cũng sẽ không còn hiệu lực), vui lòng kích hoạt cẩn thận", +"连接保活设置": "Cài đặt giữ kết nối", +"警告:启用保活后,如果已经写入保活数据后渠道出错,系统无法重试,如果必须开启,推荐设置尽可能大的Ping间隔": "Cảnh báo: Sau khi kích hoạt giữ kết nối, nếu kênh gặp lỗi sau khi dữ liệu giữ kết nối đã được ghi, hệ thống sẽ không thể thử lại. Nếu phải kích hoạt, nên đặt khoảng thời gian Ping càng lớn càng tốt", +"启用Ping间隔": "Kích hoạt khoảng thời gian Ping", +"开启后,将定期发送ping数据保持连接活跃": "Sau khi kích hoạt, dữ liệu ping sẽ được gửi định kỳ để giữ kết nối luôn hoạt động", +"Ping间隔(秒)": "Khoảng thời gian Ping (giây)", +"支持的图像模型": "Mô hình hình ảnh được hỗ trợ", +"Gemini思考适配设置": "Cài đặt thích ứng suy nghĩ Gemini", +"和Claude不同,默认情况下Gemini的思考模型会自动决定要不要思考,就算不开启适配模型也可以正常使用,如果您需要计费,推荐设置无后缀模型价格按思考价格设置。支持使用 gemini-2.5-pro-preview-06-05-thinking-128 格式来精确传递思考预算。": "Khác với Claude, theo mặc định, mô hình suy nghĩ của Gemini sẽ tự động quyết định có suy nghĩ hay không, ngay cả khi không bật mô hình thích ứng cũng có thể sử dụng bình thường. Nếu bạn cần tính phí, nên đặt giá mô hình không hậu tố theo giá suy nghĩ. Hỗ trợ sử dụng định dạng gemini-2.5-pro-preview-06-05-thinking-128 để truyền chính xác ngân sách suy nghĩ.", +"适配 -thinking、-thinking-预算数字 和 -nothinking 后缀": "Thích ứng hậu tố -thinking, -thinking-số ngân sách và -nothinking", +"Gemini思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Ngân sách thích ứng suy nghĩ Gemini BudgetTokens = MaxTokens * tỷ lệ phần trăm BudgetTokens", +"0.002-1之间的小数": "Số thập phân giữa 0.002-1", +"Logo 更新失败":" Cập nhật Logo thất bại", +"首页内容更新失败":" Cập nhật nội dung trang chủ thất bại", +"系统名称更新失败":" Cập nhật tên hệ thống thất bại", +"公告更新失败":" Cập nhật thông báo thất bại", +"关于内容更新失败":" Cập nhật nội dung về thất bại", +"关于内容已更新":" Nội dung về đã được cập nhật", +"已是最新版本:${tag_name}":" Đã là phiên bản mới nhất: ${tag_name}", +"检查更新失败,请稍后再试":" Kiểm tra cập nhật thất bại, vui lòng thử lại sau", +"分组速率限制": "Giới hạn tỷ lệ nhóm", +"统计信息": "Thống kê", +"用户管理页面,可以查看和管理所有注册用户的信息、权限和状态。": "Trang quản lý người dùng, bạn có thể xem và quản lý thông tin, quyền và trạng thái của tất cả người dùng đã đăng ký.", +"兑换码可以批量生成和分发,适合用于推广活动或批量充值。": "Mã đổi thưởng có thể được tạo và phân phối hàng loạt, phù hợp để sử dụng trong các hoạt động quảng bá hoặc nạp tiền hàng loạt.", +"令牌用于API访问认证,可以设置额度限制和模型权限。": "Mã thông báo được sử dụng để xác thực truy cập API, bạn có thể đặt giới hạn hạn mức và quyền mô hình.", +"每页显示": "Hiển thị mỗi trang", +"共 {{total}} 条": "Tổng cộng {{total}} mục", +"10 条/页": "10 mục/trang", +"20 条/页": "20 mục/trang", +"50 条/页": "50 mục/trang", +"100 条/页": "100 mục/trang" +} \ No newline at end of file diff --git a/web/src/i18n/locales/zh.json b/web/src/i18n/locales/zh.json index 5c7904fc576a..ca6d5468b4b5 100644 --- a/web/src/i18n/locales/zh.json +++ b/web/src/i18n/locales/zh.json @@ -9,5 +9,6 @@ "语言": "语言", "展开侧边栏": "展开侧边栏", "关闭侧边栏": "关闭侧边栏", - "注销成功!": "注销成功!" + "注销成功!": "注销成功!", + "不需要在末尾加/v1,New API会自动处理,添加后可能导致请求失败,是否继续?": "不需要在末尾加/v1,New API会自动处理,添加后可能导致请求失败,是否继续?" } diff --git a/web/src/index.css b/web/src/index.css index 791b853e3dd1..9cfd013d96d3 100644 --- a/web/src/index.css +++ b/web/src/index.css @@ -1,4 +1,4 @@ -/* ==================== Tailwind CSS 配置 ==================== */ +/* ==================== Tailwind CSS Configuration (Cấu hình Tailwind CSS) ==================== */ @layer tailwind-base, semi, tailwind-components, tailwind-utils; @layer tailwind-base { @@ -13,22 +13,23 @@ @tailwind utilities; } -/* ==================== 全局基础样式 ==================== */ -/* 侧边栏宽度相关的 CSS 变量,配合 .sidebar-collapsed 类和媒体查询实现响应式布局 */ +/* ==================== Global Base Styles (Kiểu dáng cơ sở toàn cục) ==================== */ +/* Sidebar width related CSS variables, works with .sidebar-collapsed class and media queries for responsive layout (Biến CSS liên quan đến chiều rộng thanh bên, hoạt động với class .sidebar-collapsed và media queries cho bố cục responsive) */ :root { --sidebar-width: 180px; - /* 展开时宽度 */ - --sidebar-width-collapsed: 60px; /* 折叠后宽度,显示图标栏 */ - /* 折叠后宽度 */ + /* Expanded width (Chiều rộng khi mở rộng) */ + --sidebar-width-collapsed: 60px; + /* Collapsed width, shows icon bar (Chiều rộng khi thu gọn, hiển thị thanh biểu tượng) */ + /* Collapsed width (Chiều rộng khi thu gọn) */ --sidebar-current-width: var(--sidebar-width); } -/* 当 body 上存在 .sidebar-collapsed 类时,使用折叠宽度 */ +/* When .sidebar-collapsed class exists on body, use collapsed width (Khi class .sidebar-collapsed tồn tại trên body, sử dụng chiều rộng thu gọn) */ body.sidebar-collapsed { --sidebar-current-width: var(--sidebar-width-collapsed); } -/* 移除了在移动端强制设为 0 的限制,改由 React 控制是否渲染侧边栏以实现显示/隐藏 */ +/* Removed the restriction of forcing to 0 on mobile, changed to React control whether to render sidebar for show/hide (Đã xóa hạn chế bắt buộc về 0 trên di động, thay đổi để React kiểm soát việc có render thanh bên để hiển thị/ẩn) */ body { font-family: Lato, 'Helvetica Neue', Arial, Helvetica, 'Microsoft YaHei', sans-serif; @@ -41,7 +42,7 @@ code { source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; } -/* ==================== 布局相关样式 ==================== */ +/* ==================== Layout Related Styles (Kiểu dáng liên quan đến bố cục) ==================== */ .semi-layout::-webkit-scrollbar, .semi-layout-content::-webkit-scrollbar, .semi-sider::-webkit-scrollbar { @@ -57,8 +58,8 @@ code { scrollbar-width: none; } -/* ==================== 导航和侧边栏样式 ==================== */ -/* 导航项样式 */ +/* ==================== Navigation and Sidebar Styles (Kiểu dáng điều hướng và thanh bên) ==================== */ +/* Navigation item styles (Kiểu dáng mục điều hướng) */ .semi-input-textarea-wrapper, .semi-navigation-sub-title, .semi-chat-inputBox-sendButton, @@ -104,7 +105,7 @@ code { font-weight: 600 !important; } -/* 自定义侧边栏样式 */ +/* Custom sidebar styles (Kiểu dáng thanh bên tùy chỉnh) */ .sidebar-container { height: 100%; display: flex; @@ -128,7 +129,7 @@ code { display: none; } -/* 侧边栏导航项样式 */ +/* Sidebar navigation item styles (Kiểu dáng mục điều hướng thanh bên) */ .sidebar-nav-item { border-radius: 6px; margin: 3px 8px; @@ -147,7 +148,7 @@ code { font-weight: 500; } -/* 图标容器样式 */ +/* Icon container styles (Kiểu dáng container biểu tượng) */ .sidebar-icon-container { width: 22px; height: 22px; @@ -169,13 +170,13 @@ code { transition: all 0.2s ease; } -/* 分割线样式 */ +/* Divider styles (Kiểu dáng đường phân cách) */ .sidebar-divider { margin: 4px 8px; opacity: 0.15; } -/* 分组标签样式 */ +/* Group label styles (Kiểu dáng nhãn nhóm) */ .sidebar-group-label { padding: 4px 15px 8px; color: var(--semi-color-text-2); @@ -185,7 +186,7 @@ code { opacity: 0.8; } -/* 底部折叠按钮 */ +/* Bottom collapse button (Nút thu gọn ở dưới cùng) */ .sidebar-collapse-button { display: flex; justify-content: center; @@ -217,12 +218,12 @@ code { transition: transform 0.3s ease; } -/* 侧边栏区域容器 */ +/* Sidebar area container (Container khu vực thanh bên) */ .sidebar-section { padding-top: 12px; } -/* ==================== 聊天界面样式 ==================== */ +/* ==================== Chat Interface Styles (Kiểu dáng giao diện trò chuyện) ==================== */ .semi-chat { padding-top: 0 !important; padding-bottom: 0 !important; @@ -271,7 +272,7 @@ code { font-size: 20px !important; } -/* 隐藏所有聊天相关区域的滚动条 */ +/* Hide all chat-related area scrollbars (Ẩn tất cả thanh cuộn khu vực liên quan đến trò chuyện) */ .semi-chat::-webkit-scrollbar, .semi-chat-chatBox::-webkit-scrollbar, .semi-chat-chatBox-wrap::-webkit-scrollbar, @@ -293,8 +294,8 @@ code { scrollbar-width: none; } -/* ==================== 组件特定样式 ==================== */ -/* Tabs组件样式 */ +/* ==================== Component Specific Styles (Kiểu dáng cụ thể của component) ==================== */ +/* Tabs component styles (Kiểu dáng component Tabs) */ .semi-tabs-content { padding: 0 !important; height: calc(100% - 40px) !important; @@ -310,7 +311,7 @@ code { height: 100% !important; } -/* 表格样式 */ +/* Table styles (Kiểu dáng bảng) */ .tableShow { display: revert; } @@ -319,12 +320,12 @@ code { display: none !important; } -/* 页脚样式 */ +/* Footer styles (Kiểu dáng chân trang) */ .custom-footer { font-size: 1.1em; } -/* 卡片内容容器通用样式 */ +/* Card content container general styles (Kiểu dáng chung container nội dung thẻ) */ .card-content-container { position: relative; } @@ -342,7 +343,7 @@ code { transition: opacity 0.3s ease; } -/* ==================== 调试面板特定样式 ==================== */ +/* ==================== Debug Panel Specific Styles (Kiểu dáng cụ thể của bảng điều khiển debug) ==================== */ .debug-panel .semi-tabs { height: 100% !important; display: flex !important; @@ -358,8 +359,8 @@ code { overflow: hidden !important; } -/* ==================== 滚动条样式统一管理 ==================== */ -/* 表格滚动条样式 */ +/* ==================== Unified Scrollbar Style Management (Quản lý kiểu dáng thanh cuộn thống nhất) ==================== */ +/* Table scrollbar styles (Kiểu dáng thanh cuộn bảng) */ .semi-table-body::-webkit-scrollbar { width: 6px; height: 6px; @@ -378,7 +379,7 @@ code { background: transparent; } -/* 侧边抽屉滚动条样式 */ +/* Side drawer scrollbar styles (Kiểu dáng thanh cuộn ngăn kéo bên) */ .semi-sidesheet-body::-webkit-scrollbar { width: 6px; height: 6px; @@ -397,7 +398,7 @@ code { background: transparent; } -/* 隐藏卡片内容区域的滚动条 */ +/* Hide card content area scrollbars (Ẩn thanh cuộn khu vực nội dung thẻ) */ .model-test-scroll, .card-content-scroll, .model-settings-scroll, @@ -419,7 +420,7 @@ code { display: none; } -/* 图片列表滚动条样式 */ +/* Image list scrollbar styles (Kiểu dáng thanh cuộn danh sách hình ảnh) */ .image-list-scroll::-webkit-scrollbar { width: 6px; height: 6px; @@ -438,10 +439,10 @@ code { background: transparent; } -/* ==================== 响应式/移动端样式 ==================== */ +/* ==================== Responsive/Mobile Styles (Kiểu dáng responsive/di động) ==================== */ @media only screen and (max-width: 767px) { - /* 移动端表格样式调整 */ + /* Mobile table style adjustments (Điều chỉnh kiểu dáng bảng di động) */ .semi-table-tbody, .semi-table-row, .semi-table-row-cell { @@ -459,7 +460,7 @@ code { } } -/* ==================== 同步倍率 - 渠道选择器 ==================== */ +/* ==================== Sync Ratio - Channel Selector (Tỷ lệ đồng bộ - Bộ chọn kênh) ==================== */ .components-transfer-source-item, .components-transfer-selected-item { @@ -527,7 +528,7 @@ code { color: var(--semi-color-text-0); } -/* ==================== 未读通知闪光效果 ==================== */ +/* ==================== Unread Notification Flash Effect (Hiệu ứng nhấp nháy thông báo chưa đọc) ==================== */ @keyframes sweep-shine { 0% { background-position: 200% 0; @@ -555,7 +556,7 @@ code { -webkit-text-fill-color: transparent; } -/* ==================== ScrollList 定制样式 ==================== */ +/* ==================== ScrollList Custom Styles (Kiểu dáng tùy chỉnh ScrollList) ==================== */ .semi-scrolllist, .semi-scrolllist * { -ms-overflow-style: none; @@ -580,7 +581,7 @@ code { padding-right: 0 !important; } -/* ==================== Banner 背景模糊球 ==================== */ +/* ==================== Banner Background Blur Balls (Quả cầu mờ nền Banner) ==================== */ .blur-ball { position: absolute; width: 360px; @@ -608,7 +609,7 @@ code { opacity: 0.4; } -/* 浅色主题下让模糊球更柔和 */ +/* Make blur balls softer in light theme (Làm cho quả cầu mờ mềm mại hơn trong chủ đề sáng) */ html:not(.dark) .blur-ball-indigo { opacity: 0.25; } diff --git a/web/src/index.js b/web/src/index.js index 2a09702378ee..0bd96abc2341 100644 --- a/web/src/index.js +++ b/web/src/index.js @@ -10,7 +10,7 @@ import PageLayout from './components/layout/PageLayout.js'; import './i18n/i18n.js'; import './index.css'; -// 欢迎信息(二次开发者不准将此移除) +// Welcome message - Secondary developers are not allowed to remove this (Thông báo chào mừng - Các nhà phát triển thứ cấp không được phép xóa điều này) // Welcome message (Secondary developers are not allowed to remove this) if (typeof window !== 'undefined') { console.log('%cWe ❤ NewAPI%c Github: https://github.com/QuantumNous/new-api', diff --git a/web/src/pages/About/index.js b/web/src/pages/About/index.js index 5ca96d978256..1abfba772956 100644 --- a/web/src/pages/About/index.js +++ b/web/src/pages/About/index.js @@ -5,12 +5,14 @@ import { Empty } from '@douyinfe/semi-ui'; import { IllustrationConstruction, IllustrationConstructionDark } from '@douyinfe/semi-illustrations'; import { useTranslation } from 'react-i18next'; +// About page component - displays customizable about content or default project information (Component trang giới thiệu - hiển thị nội dung giới thiệu có thể tùy chỉnh hoặc thông tin dự án mặc định) const About = () => { const { t } = useTranslation(); const [about, setAbout] = useState(''); const [aboutLoaded, setAboutLoaded] = useState(false); const currentYear = new Date().getFullYear(); + // Function to fetch and display about content from API or localStorage (Hàm để lấy và hiển thị nội dung giới thiệu từ API hoặc localStorage) const displayAbout = async () => { setAbout(localStorage.getItem('about') || ''); const res = await API.get('/api/about'); diff --git a/web/src/pages/Channel/EditChannel.js b/web/src/pages/Channel/EditChannel.js index 0934d8912029..8c2af4b1b406 100644 --- a/web/src/pages/Channel/EditChannel.js +++ b/web/src/pages/Channel/EditChannel.js @@ -55,7 +55,8 @@ const REGION_EXAMPLE = { }; function type2secretPrompt(type) { - // inputs.type === 15 ? '按照如下格式输入:APIKey|SecretKey' : (inputs.type === 18 ? '按照如下格式输入:APPID|APISecret|APIKey' : '请输入渠道对应的鉴权密钥') + // Get authentication format prompt based on channel type (Lấy prompt định dạng xác thực dựa trên loại kênh) + // Different channel types require different format inputs (Các loại kênh khác nhau yêu cầu đầu vào định dạng khác nhau) switch (type) { case 15: return '按照如下格式输入:APIKey|SecretKey'; @@ -121,10 +122,10 @@ const EditChannel = (props) => { const formApiRef = useRef(null); const [vertexKeys, setVertexKeys] = useState([]); const [vertexFileList, setVertexFileList] = useState([]); - const vertexErroredNames = useRef(new Set()); // 避免重复报错 + const vertexErroredNames = useRef(new Set()); // Avoid duplicate error messages (Tránh thông báo lỗi trùng lặp) const [isMultiKeyChannel, setIsMultiKeyChannel] = useState(false); const [channelSearchValue, setChannelSearchValue] = useState(''); - const [useManualInput, setUseManualInput] = useState(false); // 是否使用手动输入模式 + const [useManualInput, setUseManualInput] = useState(false); // Whether to use manual input mode (Có sử dụng chế độ nhập tay hay không) const getInitValues = () => ({ ...originInputs }); const handleInputChange = (name, value) => { if (formApiRef.current) { @@ -136,12 +137,13 @@ const EditChannel = (props) => { if (name === 'base_url' && value.endsWith('/v1')) { Modal.confirm({ - title: '警告', - content: - '不需要在末尾加/v1,New API会自动处理,添加后可能导致请求失败,是否继续?', - onOk: () => { - setInputs((inputs) => ({ ...inputs, [name]: value })); - }, + title: t('警告'), // Warning (Cảnh báo) + content: t('不需要在末尾加/v1,New API会自动处理,添加后可能导致请求失败,是否继续?'), // No need to add /v1 at the end, New API will handle it automatically, adding it may cause request failure, continue? (Không cần thêm /v1 ở cuối, New API sẽ tự động xử lý, việc thêm vào có thể gây lỗi yêu cầu, có tiếp tục không?) + okText: t('继续'), // Continue (Tiếp tục) + cancelText: t('取消'), // Cancel (Hủy) + onOk: () => { + setInputs((inputs) => ({ ...inputs, [name]: value })); + }, }); return; } @@ -194,7 +196,7 @@ const EditChannel = (props) => { } setBasicModels(localModels); - // 重置手动输入模式状态 + // Reset manual input mode state (Đặt lại trạng thái chế độ nhập thủ công) setUseManualInput(false); } //setAutoBan @@ -257,7 +259,7 @@ const EditChannel = (props) => { const fetchUpstreamModelList = async (name) => { // if (inputs['type'] !== 1) { - // showError(t('仅支持 OpenAI 接口格式')); + // showError(t('Only supports OpenAI interface format (Chỉ hỗ trợ định dạng giao diện OpenAI)')); // return; // } setLoading(true); @@ -265,7 +267,7 @@ const EditChannel = (props) => { let err = false; if (isEdit) { - // 如果是编辑模式,使用已有的 channelId 获取模型列表 + // If in edit mode, use existing channelId to fetch model list (Nếu ở chế độ chỉnh sửa, sử dụng channelId hiện có để lấy danh sách mô hình) const res = await API.get('/api/channel/fetch_models/' + channelId, { skipErrorHandler: true }); if (res && res.data && res.data.success) { models.push(...res.data.data); @@ -273,7 +275,7 @@ const EditChannel = (props) => { err = true; } } else { - // 如果是新建模式,通过后端代理获取模型列表 + // If in create mode, fetch model list through backend proxy (Nếu ở chế độ tạo mới, lấy danh sách mô hình qua proxy backend) if (!inputs?.['key']) { showError(t('请填写密钥')); err = true; @@ -424,7 +426,7 @@ const EditChannel = (props) => { } else { formApiRef.current?.setValues(getInitValues()); } - // 重置手动输入模式状态 + // Reset manual input mode state (Đặt lại trạng thái chế độ nhập thủ công) setUseManualInput(false); } else { formApiRef.current?.reset(); @@ -452,7 +454,7 @@ const EditChannel = (props) => { } } - // 非批量模式下只保留一个文件(最新选择的),避免重复叠加 + // In non-batch mode, keep only one file (the most recently selected) to avoid duplicate accumulation (Trong chế độ không theo lô, chỉ giữ một tệp (được chọn gần đây nhất) để tránh tích lũy trùng lặp) if (!batch && validFiles.length > 1) { validFiles = [validFiles[validFiles.length - 1]]; keys = [keys[keys.length - 1]]; @@ -477,12 +479,12 @@ const EditChannel = (props) => { if (localInputs.type === 41) { if (useManualInput) { - // 手动输入模式 + // Manual input mode (Chế độ nhập thủ công) if (localInputs.key && localInputs.key.trim() !== '') { try { - // 验证 JSON 格式 + // Validate JSON format (Xác thực định dạng JSON) const parsedKey = JSON.parse(localInputs.key); - // 确保是有效的密钥格式 + // Ensure it's a valid key format (Đảm bảo đó là định dạng khóa hợp lệ) localInputs.key = JSON.stringify(parsedKey); } catch (err) { showError(t('密钥格式无效,请输入有效的 JSON 格式密钥')); @@ -493,10 +495,10 @@ const EditChannel = (props) => { return; } } else { - // 文件上传模式 + // File upload mode (Chế độ tải tệp lên) let keys = vertexKeys; - // 若当前未选择文件,尝试从已上传文件列表解析(异步读取) + // If no files are currently selected, try to parse from uploaded file list (async read) (Nếu hiện tại không có tệp nào được chọn, hãy thử phân tích từ danh sách tệp đã tải lên (đọc không đồng bộ)) if (keys.length === 0 && vertexFileList.length > 0) { try { const parsed = await Promise.all( @@ -514,17 +516,17 @@ const EditChannel = (props) => { } } - // 创建模式必须上传密钥;编辑模式可选 + // Create mode requires key upload; edit mode is optional (Chế độ tạo yêu cầu tải lên khóa; chế độ chỉnh sửa là tùy chọn) if (keys.length === 0) { if (!isEdit) { showInfo(t('请上传密钥文件!')); return; } else { - // 编辑模式且未上传新密钥,不修改 key + // Edit mode without new key upload, do not modify key (Chế độ chỉnh sửa mà không tải lên khóa mới, không thay đổi khóa) delete localInputs.key; } } else { - // 有新密钥,则覆盖 + // Have new key, then override (Có khóa mới, sau đó ghi đè) if (batch) { localInputs.key = JSON.stringify(keys); } else { @@ -534,7 +536,7 @@ const EditChannel = (props) => { } } - // 如果是编辑模式且 key 为空字符串,避免提交空值覆盖旧密钥 + // If in edit mode and key is empty string, avoid submitting empty value to overwrite old key (Nếu ở chế độ chỉnh sửa và khóa là chuỗi rỗng, tránh gửi giá trị rỗng để ghi đè khóa cũ) if (isEdit && (!localInputs.key || localInputs.key.trim() === '')) { delete localInputs.key; } @@ -647,6 +649,8 @@ const EditChannel = (props) => { Modal.confirm({ title: t('切换为单密钥模式'), content: t('将仅保留第一个密钥文件,其余文件将被移除,是否继续?'), + okText: t('继续'), + cancelText: t('取消'), onOk: () => { const firstFile = vertexFileList[0]; const firstKey = vertexKeys[0] ? [vertexKeys[0]] : []; @@ -674,10 +678,10 @@ const EditChannel = (props) => { setMultiToSingle(false); setMultiKeyMode('random'); } else { - // 批量模式下禁用手动输入,并清空手动输入的内容 + // Batch mode disables manual input and clears manually entered content (Chế độ hàng loạt tắt nhập thủ công và xóa nội dung được nhập thủ công) setUseManualInput(false); if (inputs.type === 41) { - // 清空手动输入的密钥内容 + // Clear manually entered key content (Xóa nội dung khóa được nhập thủ công) if (formApiRef.current) { formApiRef.current.setValue('key', ''); } @@ -707,7 +711,7 @@ const EditChannel = (props) => { () => CHANNEL_OPTIONS.map((opt) => ({ ...opt, - // 保持 label 为纯文本以支持搜索 + // Keep label as plain text to support search (Giữ nhãn dưới dạng văn bản thuần túy để hỗ trợ tìm kiếm) label: opt.label, })), [], @@ -729,7 +733,7 @@ const EditChannel = (props) => { const searchWords = channelSearchValue ? [channelSearchValue] : []; - // 构建样式类名 + // Build style class names (Xây dựng tên lớp style) const optionClassName = [ 'flex items-center gap-3 px-3 py-2 transition-all duration-200 rounded-lg mx-2 my-1', focused && 'bg-blue-50 shadow-sm', diff --git a/web/src/pages/Channel/EditTagModal.js b/web/src/pages/Channel/EditTagModal.js index 433d4f092f2d..cea38bcdd483 100644 --- a/web/src/pages/Channel/EditTagModal.js +++ b/web/src/pages/Channel/EditTagModal.js @@ -300,7 +300,8 @@ const EditTagModal = (props) => { loading={loading} icon={} > - {t('保存')} + okText={t('确定')} + diff --git a/web/src/pages/Detail/index.js b/web/src/pages/Detail/index.js index b5553cbf9c51..037d050e6ada 100644 --- a/web/src/pages/Detail/index.js +++ b/web/src/pages/Detail/index.js @@ -648,7 +648,7 @@ const Detail = (props) => { if (data.length === 0) { data.push({ count: 0, - model_name: '无数据', + model_name: t('无数据'), quota: 0, created_at: now.getTime() / 1000, }); diff --git a/web/src/pages/Home/index.js b/web/src/pages/Home/index.js index 0cf8dea1401c..cd05341bd58d 100644 --- a/web/src/pages/Home/index.js +++ b/web/src/pages/Home/index.js @@ -119,6 +119,11 @@ const Home = () => { The Unified
LLMs API Gateway + ) : i18n.language === 'vn' ? ( + <> + Cổng API Tập Trung
+ Cho Các Mô Hình

Ngôn Ngữ
+ ) : ( <> 统一的
diff --git a/web/src/pages/Redemption/EditRedemption.js b/web/src/pages/Redemption/EditRedemption.js index 44d17e62506b..b4a83480071b 100644 --- a/web/src/pages/Redemption/EditRedemption.js +++ b/web/src/pages/Redemption/EditRedemption.js @@ -131,6 +131,8 @@ const EditRedemption = (props) => {

{t('兑换码将以文本文件的形式下载,文件名为兑换码的名称。')}

), + okText: t('继续'), + cancelText: t('取消'), onOk: () => { downloadTextAsFile(text, `${localInputs.name}.txt`); }, diff --git a/web/src/pages/Setting/Model/SettingGeminiModel.js b/web/src/pages/Setting/Model/SettingGeminiModel.js index a5daace63bbe..b0a0cecc201f 100644 --- a/web/src/pages/Setting/Model/SettingGeminiModel.js +++ b/web/src/pages/Setting/Model/SettingGeminiModel.js @@ -171,11 +171,7 @@ export default function SettingGeminiModel(props) { - {t( - "和Claude不同,默认情况下Gemini的思考模型会自动决定要不要思考,就算不开启适配模型也可以正常使用," + - "如果您需要计费,推荐设置无后缀模型价格按思考价格设置。" + - "支持使用 gemini-2.5-pro-preview-06-05-thinking-128 格式来精确传递思考预算。" - )} + {t("和Claude不同,默认情况下Gemini的思考模型会自动决定要不要思考,就算不开启适配模型也可以正常使用,如果您需要计费,推荐设置无后缀模型价格按思考价格设置。支持使用 gemini-2.5-pro-preview-06-05-thinking-128 格式来精确传递思考预算。")} diff --git a/web/src/pages/Setting/Model/SettingGlobalModel.js b/web/src/pages/Setting/Model/SettingGlobalModel.js index 837508c739b3..20dc1c27ce9e 100644 --- a/web/src/pages/Setting/Model/SettingGlobalModel.js +++ b/web/src/pages/Setting/Model/SettingGlobalModel.js @@ -86,7 +86,7 @@ export default function SettingGlobalModel(props) { }) } extraText={ - '开启后,所有请求将直接透传给上游,不会进行任何处理(重定向和渠道适配也将失效),请谨慎开启' + t('开启后,所有请求将直接透传给上游,不会进行任何处理(重定向和渠道适配也将失效),请谨慎开启') } /> @@ -97,7 +97,7 @@ export default function SettingGlobalModel(props) { @@ -107,7 +107,7 @@ export default function SettingGlobalModel(props) { label={t('启用Ping间隔')} field={'general_setting.ping_interval_enabled'} onChange={(value) => setInputs({ ...inputs, 'general_setting.ping_interval_enabled': value })} - extraText={'开启后,将定期发送ping数据保持连接活跃'} + extraText={t('开启后,将定期发送ping数据保持连接活跃')} /> diff --git a/web/src/pages/Setting/Payment/SettingsPaymentGatewayStripe.js b/web/src/pages/Setting/Payment/SettingsPaymentGatewayStripe.js index 4c4a1af6d648..578ec499f447 100644 --- a/web/src/pages/Setting/Payment/SettingsPaymentGatewayStripe.js +++ b/web/src/pages/Setting/Payment/SettingsPaymentGatewayStripe.js @@ -112,33 +112,33 @@ export default function SettingsPaymentGateway(props) { > - Stripe 密钥、Webhook 等设置请 + {t('Stripe 密钥、Webhook 等设置请')} - 点击此处 + {' '}{t('点击此处')}{' '} - 进行设置,最好先在 + {t('进行设置,最好先在')} - 测试环境 + {' '}{t('测试环境')}{' '} - 进行测试。 + {t('进行测试。')}
{ try { @@ -419,15 +419,20 @@ export default function ModelRatioNotSetEditor(props) { total: filteredModels.length, onPageChange: (page) => setCurrentPage(page), onPageSizeChange: handlePageSizeChange, - pageSizeOptions: pageSizeOptions, formatPageText: (page) => t('第 {{start}} - {{end}} 条,共 {{total}} 条', { start: page.currentStart, end: page.currentEnd, total: filteredModels.length, }), - showTotal: true, + showTotal: (total) => t('共 {{total}} 条', { total }), showSizeChanger: true, + pageSizeOptions: [ + { value: 10, label: t('10 条/页') }, + { value: 20, label: t('20 条/页') }, + { value: 50, label: t('50 条/页') }, + { value: 100, label: t('100 条/页') } + ] }} empty={
@@ -441,6 +446,8 @@ export default function ModelRatioNotSetEditor(props) { setVisible(false)} onOk={() => { currentModel && addModel(currentModel); @@ -513,6 +520,8 @@ export default function ModelRatioNotSetEditor(props) { setBatchVisible(false)} onOk={handleBatchFill} width={500} diff --git a/web/src/pages/Setting/Ratio/ModelSettingsVisualEditor.js b/web/src/pages/Setting/Ratio/ModelSettingsVisualEditor.js index b897968fc3ab..ec7e135f40e4 100644 --- a/web/src/pages/Setting/Ratio/ModelSettingsVisualEditor.js +++ b/web/src/pages/Setting/Ratio/ModelSettingsVisualEditor.js @@ -137,7 +137,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('部分保存失败,请重试')); } } @@ -148,11 +148,11 @@ export default function ModelSettingsVisualEditor(props) { } } - showSuccess('保存成功'); + showSuccess(t('保存成功')); props.refresh(); } catch (error) { console.error('保存失败:', error); - showError('保存失败,请重试'); + showError(t('保存失败,请重试')); } finally { setLoading(false); } @@ -236,7 +236,7 @@ export default function ModelSettingsVisualEditor(props) { const updateModel = (name, field, value) => { if (isNaN(value)) { - showError('请输入数字'); + showError(t('请输入数字')); return; } setModels((prev) => @@ -263,7 +263,7 @@ export default function ModelSettingsVisualEditor(props) { completionTokenPrice, ) => { if (!modelTokenPrice || modelTokenPrice === '0') { - showError('模型价格不能为0'); + showError(t('模型价格不能为0')); return ''; } return completionTokenPrice / modelTokenPrice; @@ -484,6 +484,11 @@ export default function ModelSettingsVisualEditor(props) { showTotal: true, showSizeChanger: false, }} + empty={ +
+ {t('暂无数据')} +
+ } /> @@ -496,6 +501,8 @@ export default function ModelSettingsVisualEditor(props) { : t('添加模型') } visible={visible} + okText={t('确定')} + cancelText={t('取消')} onCancel={() => { resetModalState(); setVisible(false); diff --git a/web/src/pages/Setting/Ratio/UpstreamRatioSync.js b/web/src/pages/Setting/Ratio/UpstreamRatioSync.js index 647ca75802eb..9b0d35560d02 100644 --- a/web/src/pages/Setting/Ratio/UpstreamRatioSync.js +++ b/web/src/pages/Setting/Ratio/UpstreamRatioSync.js @@ -49,6 +49,8 @@ function ConflictConfirmModal({ t, visible, items, onOk, onCancel }) { { setConfirmVisible(false); const curRatios = {