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 @@ - +
+检测到旧版本的配置数据,是否要迁移到新的配置格式?
-- 注意:迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。 -
-{t('检测到旧版本的配置数据,是否要迁移到新的配置格式?')}
++ {t('注意:')}{t('迁移过程中会自动处理数据格式转换,迁移完成后旧配置将被清除,请在迁移前在数据库中备份好旧配置。')} +
+
{`{
- "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
+ }`}
您好,你正在进行%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,为了不影响您的使用,请及时充值。{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) {