From 87dcb3fccff551ff67a0013a79fc8b30c6b80791 Mon Sep 17 00:00:00 2001 From: octo-patch Date: Fri, 24 Apr 2026 09:50:17 +0800 Subject: [PATCH] fix(billing): add parentheses around breakdown in billing formula display (fixes #4406) The billing formula template was missing parentheses around the breakdown expression, causing visual ambiguity about operator precedence. Users reading the formula literally would compute a value ~10x off from the actual charge, since the group ratio should apply to the entire (prompt + completion) sum, not just the completion portion. Before: prompt_tokens * $5 + completion_tokens * $25 * groupRatio 0.1 = total After: (prompt_tokens * $5 + completion_tokens * $25) * groupRatio 0.1 = total Updated the i18n key in all locale files (en, zh-CN, zh-TW, fr, ja, ru, vi) to match the corrected template. The backend billing logic is unchanged and was already correct. --- web/src/helpers/render.jsx | 2 +- web/src/i18n/locales/en.json | 2 +- web/src/i18n/locales/fr.json | 2 +- web/src/i18n/locales/ja.json | 2 +- web/src/i18n/locales/ru.json | 2 +- web/src/i18n/locales/vi.json | 2 +- web/src/i18n/locales/zh-CN.json | 2 +- web/src/i18n/locales/zh-TW.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/web/src/helpers/render.jsx b/web/src/helpers/render.jsx index d7ba654648b7..e4ddb9dd2dfe 100644 --- a/web/src/helpers/render.jsx +++ b/web/src/helpers/render.jsx @@ -2887,7 +2887,7 @@ export function renderClaudeModelPrice(opts) { ) : null, buildBillingText( - '{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}', + '({{breakdown}}) * {{ratioType}} {{ratio}} = {{symbol}}{{total}}', { breakdown: breakdownText, ratioType: ratioLabel, diff --git a/web/src/i18n/locales/en.json b/web/src/i18n/locales/en.json index dc8ad6cb9464..935af2ea8ba3 100644 --- a/web/src/i18n/locales/en.json +++ b/web/src/i18n/locales/en.json @@ -26,7 +26,7 @@ "[最多请求次数]和[最多请求完成次数]的最大值为2147483647。": "The maximum value of [Maximum request count] and [Maximum request completion count] is 2147483647.", "[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。": "[Maximum request count] must be greater than or equal to 0, [Maximum request completion count] must be greater than or equal to 1.", "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", - "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "({{breakdown}}) * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "({{breakdown}}) * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "{{count}} 项操作_one": "", "{{count}} 项操作_other": "", "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", diff --git a/web/src/i18n/locales/fr.json b/web/src/i18n/locales/fr.json index 8e7d143d0954..9bc67bf2abf6 100644 --- a/web/src/i18n/locales/fr.json +++ b/web/src/i18n/locales/fr.json @@ -29,7 +29,7 @@ "[最多请求次数]和[最多请求完成次数]的最大值为2147483647。": "La valeur maximale de [Nombre maximal de requêtes] et [Nombre maximal d'achèvements de requêtes] est 2147483647.", "[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。": "[Nombre maximal de requêtes] doit être supérieur ou égal à 0, [Nombre maximal d'achèvements de requêtes] doit être supérieur ou égal à 1.", "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", - "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "({{breakdown}}) * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "({{breakdown}}) * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "{{count}} 项操作_one": "", "{{count}} 项操作_many": "", "{{count}} 项操作_other": "", diff --git a/web/src/i18n/locales/ja.json b/web/src/i18n/locales/ja.json index 88d2899e17c6..058d88b36069 100644 --- a/web/src/i18n/locales/ja.json +++ b/web/src/i18n/locales/ja.json @@ -25,7 +25,7 @@ "[最多请求次数]和[最多请求完成次数]的最大值为2147483647。": "[最大リクエスト数]と[最大成功リクエスト数]の最大値は2147483647です", "[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。": "[最大リクエスト数]は0以上、[最大成功リクエスト数]は1以上である必要があります", "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", - "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "({{breakdown}}) * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "({{breakdown}}) * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "{{count}} 项操作_other": "", "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", "{{name}} ID": "{{name}} ID", diff --git a/web/src/i18n/locales/ru.json b/web/src/i18n/locales/ru.json index 2980af179f6f..62492b74afb8 100644 --- a/web/src/i18n/locales/ru.json +++ b/web/src/i18n/locales/ru.json @@ -32,7 +32,7 @@ "[最多请求次数]和[最多请求完成次数]的最大值为2147483647。": "[Максимальное количество запросов] и [Максимальное количество выполненных запросов] имеют максимальное значение 2147483647.", "[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。": "[Максимальное количество запросов] должно быть больше или равно 0, [Максимальное количество выполненных запросов] должно быть больше или равно 1.", "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", - "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "({{breakdown}}) * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "({{breakdown}}) * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "{{count}} 项操作_one": "", "{{count}} 项操作_few": "", "{{count}} 项操作_many": "", diff --git a/web/src/i18n/locales/vi.json b/web/src/i18n/locales/vi.json index 4ca1a77f3122..ddcc15d46843 100644 --- a/web/src/i18n/locales/vi.json +++ b/web/src/i18n/locales/vi.json @@ -25,7 +25,7 @@ "[最多请求次数]和[最多请求完成次数]的最大值为2147483647。": "Giá trị tối đa của [Số lần yêu cầu tối đa] và [Số lần hoàn thành yêu cầu tối đa] là 2147483647.", "[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。": "[Số lần yêu cầu tối đa] phải lớn hơn hoặc bằng 0, [Số lần hoàn thành yêu cầu tối đa] phải lớn hơn hoặc bằng 1.", "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", - "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "({{breakdown}}) * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "({{breakdown}}) * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "{{count}} 项操作_other": "", "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", "{{name}} ID": "{{name}} ID", diff --git a/web/src/i18n/locales/zh-CN.json b/web/src/i18n/locales/zh-CN.json index e54a1c0f9114..d0a8ed2d45bd 100644 --- a/web/src/i18n/locales/zh-CN.json +++ b/web/src/i18n/locales/zh-CN.json @@ -23,7 +23,7 @@ "[最多请求次数]和[最多请求完成次数]的最大值为2147483647。": "[最多请求次数]和[最多请求完成次数]的最大值为2147483647。", "[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。": "[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。", "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", - "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "({{breakdown}}) * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "({{breakdown}}) * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "{{count}} 项操作_other": "{{count}} 项操作", "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", "{{name}} ID": "{{name}} ID", diff --git a/web/src/i18n/locales/zh-TW.json b/web/src/i18n/locales/zh-TW.json index b31c9e1e0eac..1a2cf4304020 100644 --- a/web/src/i18n/locales/zh-TW.json +++ b/web/src/i18n/locales/zh-TW.json @@ -23,7 +23,7 @@ "[最多请求次数]和[最多请求完成次数]的最大值为2147483647。": "[最多請求次數]和[最多請求完成次數]的最大值為2147483647。", "[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。": "[最多請求次數]必須大於等於0,[最多請求完成次數]必須大於等於1。", "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", - "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "({{breakdown}}) * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "({{breakdown}}) * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "{{count}} 项操作_other": "", "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", "{{name}} ID": "{{name}} ID",