Kaynağa Gözat

feat: 用户创建同步到从节点及 i18n 翻译

新建用户时异步同步到海外 slave 节点,确保跨区域用户数据一致。
补充前两个 commit 全部新功能的中英文翻译字符串。

Co-Authored-By: Claude <noreply@anthropic.com>
master
fengsilin 2 hafta önce
ebeveyn
işleme
c9988af52b
3 değiştirilmiş dosya ile 157 ekleme ve 2 silme
  1. +7
    -0
      controller/user.go
  2. +75
    -1
      web/src/i18n/locales/en.json
  3. +75
    -1
      web/src/i18n/locales/zh-CN.json

+ 7
- 0
controller/user.go Dosyayı Görüntüle

@@ -843,12 +843,19 @@ func CreateUser(c *gin.Context) {
Password: user.Password,
DisplayName: user.DisplayName,
Role: user.Role, // 保持管理员设置的角色
Email: user.Email,
Quota: user.Quota,
Group: user.Group,
AffCode: user.AffCode,
}
if err := cleanUser.Insert(0); err != nil {
common.ApiError(c, err)
return
}

// 同步用户到海外节点(异步执行,不阻塞创建流程)
region_sync.PushUserCreateToSlave(&cleanUser)

c.JSON(http.StatusOK, gin.H{
"success": true,
"message": "",


+ 75
- 1
web/src/i18n/locales/en.json Dosyayı Görüntüle

@@ -3133,7 +3133,81 @@
"?? JSON": "Apply JSON",
"??? {{count}} ?????{{sample}}": "Will generate {{count}} rows. Sample: {{sample}}",
"JSON ????": "JSON format error",
"Key": "Key"
"Key": "Key",
"最终价格": "Final price",
"保留手动行": "Preserve manual rows",
"全部替换": "Replace all",
"添加倍率项": "Add ratio item",
"候选值": "Candidate value",
"默认值": "Default value",
"生成价格表": "Generate pricing table",
"应用生成结果": "Apply generated rows",
"每 1M tokens": "per 1M tokens",
"价格({{unit}})": "Price ({{unit}})",
"展示价格({{unit}})": "Display price ({{unit}})",
"保存价格 USD({{unit}})": "Saved price USD ({{unit}})",
"保存价格 USD": "Saved price USD",
"按完成 tokens 重算": "Settle by completed tokens",
"固定按次": "Fixed per call",
"旧日志字段": "Legacy log field",
"价格计算": "Price calculation",
"基础单价": "Base unit price",
"实际单价": "Effective unit price",
"实际用量": "Actual usage",
"计算扣费": "Calculated cost",
"命中维度": "Matched dimensions",
"结算信息": "Settlement",
"日志扣费": "Logged cost",
"预扣": "Pre-consumed",
"实际": "Actual",
"等待实际 tokens": "Waiting for actual tokens",
"等待完成后重算": "Waiting for settlement",
"单次计费": "Single call",
"待结算": "Pending settlement",
"已结算": "Settled",
"已退还": "Refunded",
"补扣": "Additional charge",
"退还": "Refund",
"任务账单状态": "Task billing status",
"预扣金额": "Pre-consumed amount",
"实际消费": "Actual cost",
"结算差额": "Settlement delta",
"退还金额": "Refund amount",
"基础信息": "Basic info",
"计费信息": "Billing info",
"矩阵计费": "Matrix billing",
"请求上下文": "Request context",
"状态与原因": "Status and reason",
"更多信息": "More info",
"原始字段": "Raw fields",
"时间": "Time",
"模型": "Model",
"令牌": "Token",
"分组": "Group",
"用户": "User",
"渠道": "Channel",
"任务ID": "Task ID",
"请求路径": "Request path",
"花费": "Cost",
"模型价格": "Model price",
"Token 单价 USD": "Token unit price USD",
"分组倍率": "Group ratio",
"用户分组倍率": "User group ratio",
"计费模式": "Billing mode",
"计费单位": "Billing unit",
"计费阶段": "Billing phase",
"总 Tokens": "Total tokens",
"命中价格 USD": "Matched price USD",
"命中模式": "Matched mode",
"请求转换": "Request conversion",
"请求并计费模型": "Requested and billed model",
"实际模型": "Actual model",
"原因": "Reason",
"拦截原因": "Reject reason",
"Other JSON": "Other JSON",
"基础价格是所有倍率计算的起点,当前单位为 {{unitLabel}}。最终价格 = 基础价格 × 各维度倍率。": "The base price is the starting point for all ratio calculations. Current unit: {{unitLabel}}. Final price = base price × each dimension ratio.",
"当前按 {{symbol}} 展示和输入,应用时会按汇率换算为 USD 保存到 table[].price。当前输入 {{symbol}}{{displayPrice}} = ${{usdPrice}}。": "Values are displayed and entered in {{symbol}}. They will be converted to USD and saved in table[].price when applied. Current input {{symbol}}{{displayPrice}} = ${{usdPrice}}.",
"线性倍率项 {{linearCount}} 项,最终展开 {{expandedCount}} 行。任一维度没有候选值时不会生成结果。预览最多展示前 50 行。": "{{linearCount}} linear ratio items, expanding to {{expandedCount}} rows. No rows are generated if any dimension has no candidate values. Preview shows up to 50 rows."
},
"邮箱后缀": "Email Suffix",
"邮箱后缀必须以 @ 开头": "Email suffix must start with @",


+ 75
- 1
web/src/i18n/locales/zh-CN.json Dosyayı Görüntüle

@@ -3104,7 +3104,81 @@
"?? JSON": "?? JSON",
"??? {{count}} ?????{{sample}}": "??? {{count}} ?????{{sample}}",
"JSON ????": "JSON ????",
"Key": "Key"
"Key": "Key",
"最终价格": "最终价格",
"保留手动行": "保留手动行",
"全部替换": "全部替换",
"添加倍率项": "添加倍率项",
"候选值": "候选值",
"默认值": "默认值",
"生成价格表": "生成价格表",
"应用生成结果": "应用生成结果",
"每 1M tokens": "每 1M tokens",
"价格({{unit}})": "价格({{unit}})",
"展示价格({{unit}})": "展示价格({{unit}})",
"保存价格 USD({{unit}})": "保存价格 USD({{unit}})",
"保存价格 USD": "保存价格 USD",
"按完成 tokens 重算": "按完成 tokens 重算",
"固定按次": "固定按次",
"旧日志字段": "旧日志字段",
"价格计算": "价格计算",
"基础单价": "基础单价",
"实际单价": "实际单价",
"实际用量": "实际用量",
"计算扣费": "计算扣费",
"命中维度": "命中维度",
"结算信息": "结算信息",
"日志扣费": "日志扣费",
"预扣": "预扣",
"实际": "实际",
"等待实际 tokens": "等待实际 tokens",
"等待完成后重算": "等待完成后重算",
"单次计费": "单次计费",
"待结算": "待结算",
"已结算": "已结算",
"已退还": "已退还",
"补扣": "补扣",
"退还": "退还",
"任务账单状态": "任务账单状态",
"预扣金额": "预扣金额",
"实际消费": "实际消费",
"结算差额": "结算差额",
"退还金额": "退还金额",
"基础信息": "基础信息",
"计费信息": "计费信息",
"矩阵计费": "矩阵计费",
"请求上下文": "请求上下文",
"状态与原因": "状态与原因",
"更多信息": "更多信息",
"原始字段": "原始字段",
"时间": "时间",
"模型": "模型",
"令牌": "令牌",
"分组": "分组",
"用户": "用户",
"渠道": "渠道",
"任务ID": "任务ID",
"请求路径": "请求路径",
"花费": "花费",
"模型价格": "模型价格",
"Token 单价 USD": "Token 单价 USD",
"分组倍率": "分组倍率",
"用户分组倍率": "用户分组倍率",
"计费模式": "计费模式",
"计费单位": "计费单位",
"计费阶段": "计费阶段",
"总 Tokens": "总 Tokens",
"命中价格 USD": "命中价格 USD",
"命中模式": "命中模式",
"请求转换": "请求转换",
"请求并计费模型": "请求并计费模型",
"实际模型": "实际模型",
"原因": "原因",
"拦截原因": "拦截原因",
"Other JSON": "Other JSON",
"基础价格是所有倍率计算的起点,当前单位为 {{unitLabel}}。最终价格 = 基础价格 × 各维度倍率。": "基础价格是所有倍率计算的起点,当前单位为 {{unitLabel}}。最终价格 = 基础价格 × 各维度倍率。",
"当前按 {{symbol}} 展示和输入,应用时会按汇率换算为 USD 保存到 table[].price。当前输入 {{symbol}}{{displayPrice}} = ${{usdPrice}}。": "当前按 {{symbol}} 展示和输入,应用时会按汇率换算为 USD 保存到 table[].price。当前输入 {{symbol}}{{displayPrice}} = ${{usdPrice}}。",
"线性倍率项 {{linearCount}} 项,最终展开 {{expandedCount}} 行。任一维度没有候选值时不会生成结果。预览最多展示前 50 行。": "线性倍率项 {{linearCount}} 项,最终展开 {{expandedCount}} 行。任一维度没有候选值时不会生成结果。预览最多展示前 50 行。"
},
"邮箱后缀": "邮箱后缀",
"邮箱后缀必须以 @ 开头": "邮箱后缀必须以 @ 开头",


Yükleniyor…
İptal
Kaydet