diff --git a/web/src/components/table/usage-logs/UsageLogsColumnDefs.jsx b/web/src/components/table/usage-logs/UsageLogsColumnDefs.jsx index 8d7141dd..2e80a904 100644 --- a/web/src/components/table/usage-logs/UsageLogsColumnDefs.jsx +++ b/web/src/components/table/usage-logs/UsageLogsColumnDefs.jsx @@ -25,21 +25,14 @@ import { Tooltip, Popover, Typography, - Button } from '@douyinfe/semi-ui'; import { - timestamp2string, renderGroup, renderQuota, stringToColor, getLogOther, renderModelTag, - renderClaudeLogContent, - renderLogContent, renderModelPriceSimple, - renderAudioModelPrice, - renderClaudeModelPrice, - renderModelPrice, } from '../../../helpers'; import { IconHelpCircle } from '@douyinfe/semi-icons'; import { Route, Sparkles } from 'lucide-react'; @@ -330,6 +323,142 @@ function getPromptCacheSummary(other) { }; } +function normalizeDetailText(detail) { + return String(detail || '') + .replace(/\n\r/g, '\n') + .replace(/\r\n/g, '\n'); +} + +function getUsageLogGroupSummary(groupRatio, userGroupRatio, t) { + const parsedUserGroupRatio = Number(userGroupRatio); + const useUserGroupRatio = + Number.isFinite(parsedUserGroupRatio) && parsedUserGroupRatio !== -1; + const ratio = useUserGroupRatio ? userGroupRatio : groupRatio; + if (ratio === undefined || ratio === null || ratio === '') { + return ''; + } + return `${useUserGroupRatio ? t('专属倍率') : t('分组')} ${formatRatio(ratio)}x`; +} + +function renderCompactDetailSummary(summarySegments) { + const segments = Array.isArray(summarySegments) + ? summarySegments.filter((segment) => segment?.text) + : []; + if (!segments.length) { + return null; + } + + return ( +
+ {segments.map((segment, index) => ( + + {segment.text} + + ))} +
+ ); +} + +function getUsageLogDetailSummary(record, text, billingDisplayMode, t) { + const other = getLogOther(record.other); + + if (record.type === 6) { + return { + segments: [{ text: t('异步任务退款'), tone: 'primary' }], + }; + } + + if (other == null || record.type !== 2) { + return null; + } + + if ( + other?.violation_fee === true || + Boolean(other?.violation_fee_code) || + Boolean(other?.violation_fee_marker) + ) { + const feeQuota = other?.fee_quota ?? record?.quota; + const groupText = getUsageLogGroupSummary( + other?.group_ratio, + other?.user_group_ratio, + t, + ); + return { + segments: [ + groupText ? { text: groupText, tone: 'primary' } : null, + { text: t('违规扣费'), tone: 'primary' }, + { + text: `${t('扣费')}:${renderQuota(feeQuota, 6)}`, + tone: 'secondary', + }, + text ? { text: `${t('详情')}:${text}`, tone: 'secondary' } : null, + ].filter(Boolean), + }; + } + + return { + segments: other?.claude + ? renderModelPriceSimple( + other.model_ratio, + other.model_price, + other.group_ratio, + other?.user_group_ratio, + other.cache_tokens || 0, + other.cache_ratio || 1.0, + other.cache_creation_tokens || 0, + other.cache_creation_ratio || 1.0, + other.cache_creation_tokens_5m || 0, + other.cache_creation_ratio_5m || other.cache_creation_ratio || 1.0, + other.cache_creation_tokens_1h || 0, + other.cache_creation_ratio_1h || other.cache_creation_ratio || 1.0, + false, + 1.0, + other?.is_system_prompt_overwritten, + 'claude', + billingDisplayMode, + 'segments', + ) + : renderModelPriceSimple( + other.model_ratio, + other.model_price, + other.group_ratio, + other?.user_group_ratio, + other.cache_tokens || 0, + other.cache_ratio || 1.0, + 0, + 1.0, + 0, + 1.0, + 0, + 1.0, + false, + 1.0, + other?.is_system_prompt_overwritten, + 'openai', + billingDisplayMode, + 'segments', + ), + }; +} + export const getLogsColumns = ({ t, COLUMN_KEYS, @@ -375,7 +504,10 @@ export const getLogsColumns = ({ } return isAdminUser && - (record.type === 0 || record.type === 2 || record.type === 5 || record.type === 6) ? ( + (record.type === 0 || + record.type === 2 || + record.type === 5 || + record.type === 6) ? ( @@ -466,7 +598,10 @@ export const getLogsColumns = ({ title: t('令牌'), dataIndex: 'token_name', render: (text, record, index) => { - return record.type === 0 || record.type === 2 || record.type === 5 || record.type === 6 ? ( + return record.type === 0 || + record.type === 2 || + record.type === 5 || + record.type === 6 ? (
{ - if (record.type === 0 || record.type === 2 || record.type === 5 || record.type === 6) { + if ( + record.type === 0 || + record.type === 2 || + record.type === 5 || + record.type === 6 + ) { if (record.group) { return <>{renderGroup(record.group)}; } else { @@ -529,7 +669,10 @@ export const getLogsColumns = ({ title: t('模型'), dataIndex: 'model_name', render: (text, record, index) => { - return record.type === 0 || record.type === 2 || record.type === 5 || record.type === 6 ? ( + return record.type === 0 || + record.type === 2 || + record.type === 5 || + record.type === 6 ? ( <>{renderModelName(record, copyText, t)} ) : ( <> @@ -596,7 +739,10 @@ export const getLogsColumns = ({ cacheText = `${t('缓存写')} ${formatTokenCount(cacheSummary.cacheWriteTokens)}`; } - return record.type === 0 || record.type === 2 || record.type === 5 || record.type === 6 ? ( + return record.type === 0 || + record.type === 2 || + record.type === 5 || + record.type === 6 ? (
{ return parseInt(text) > 0 && - (record.type === 0 || record.type === 2 || record.type === 5 || record.type === 6) ? ( + (record.type === 0 || + record.type === 2 || + record.type === 5 || + record.type === 6) ? ( <>{ {text} } ) : ( <> @@ -642,7 +791,14 @@ export const getLogsColumns = ({ title: t('花费'), dataIndex: 'quota', render: (text, record, index) => { - if (!(record.type === 0 || record.type === 2 || record.type === 5 || record.type === 6)) { + if ( + !( + record.type === 0 || + record.type === 2 || + record.type === 5 || + record.type === 6 + ) + ) { return <>; } const other = getLogOther(record.other); @@ -709,9 +865,9 @@ export const getLogsColumns = ({ } if (other.admin_info !== undefined) { if ( - other.admin_info.use_channel !== null && - other.admin_info.use_channel !== undefined && - other.admin_info.use_channel !== '' + other.admin_info.use_channel !== null && + other.admin_info.use_channel !== undefined && + other.admin_info.use_channel !== '' ) { let useChannel = other.admin_info.use_channel; let useChannelStr = useChannel.join('->'); @@ -727,118 +883,29 @@ export const getLogsColumns = ({ title: t('详情'), dataIndex: 'content', fixed: 'right', + width: 200, render: (text, record, index) => { - let other = getLogOther(record.other); - if (record.type === 6) { - return ( - - {t('异步任务退款')} - - ); - } - if (other == null || record.type !== 2) { + const detailSummary = getUsageLogDetailSummary( + record, + text, + billingDisplayMode, + t, + ); + + if (!detailSummary) { return ( {text} ); } - if ( - other?.violation_fee === true || - Boolean(other?.violation_fee_code) || - Boolean(other?.violation_fee_marker) - ) { - const feeQuota = other?.fee_quota ?? record?.quota; - const summary = [ - t('违规扣费'), - `${t('扣费')}:${renderQuota(feeQuota, 6)}`, - `${t('分组倍率')}:${formatRatio(other?.group_ratio)}`, - text ? `${t('详情')}:${text}` : null, - ] - .filter(Boolean) - .join('\n'); - return ( - - {summary} - - ); - } - - let content = other?.claude - ? renderModelPriceSimple( - other.model_ratio, - other.model_price, - other.group_ratio, - other?.user_group_ratio, - other.cache_tokens || 0, - other.cache_ratio || 1.0, - other.cache_creation_tokens || 0, - other.cache_creation_ratio || 1.0, - other.cache_creation_tokens_5m || 0, - other.cache_creation_ratio_5m || - other.cache_creation_ratio || - 1.0, - other.cache_creation_tokens_1h || 0, - other.cache_creation_ratio_1h || - other.cache_creation_ratio || - 1.0, - false, - 1.0, - other?.is_system_prompt_overwritten, - 'claude', - billingDisplayMode, - ) - : renderModelPriceSimple( - other.model_ratio, - other.model_price, - other.group_ratio, - other?.user_group_ratio, - other.cache_tokens || 0, - other.cache_ratio || 1.0, - 0, - 1.0, - 0, - 1.0, - 0, - 1.0, - false, - 1.0, - other?.is_system_prompt_overwritten, - 'openai', - billingDisplayMode, - ); - return ( - - {content} - - ); + return renderCompactDetailSummary(detailSummary.segments); }, }, ]; diff --git a/web/src/components/table/usage-logs/UsageLogsTable.jsx b/web/src/components/table/usage-logs/UsageLogsTable.jsx index 733d5347..f99dbfcf 100644 --- a/web/src/components/table/usage-logs/UsageLogsTable.jsx +++ b/web/src/components/table/usage-logs/UsageLogsTable.jsx @@ -102,7 +102,7 @@ const LogsTable = (logsData) => { loading={loading} scroll={compactMode ? undefined : { x: 'max-content' }} className='rounded-xl overflow-hidden' - size='middle' + size='small' empty={ } diff --git a/web/src/helpers/render.jsx b/web/src/helpers/render.jsx index 61810f51..90016606 100644 --- a/web/src/helpers/render.jsx +++ b/web/src/helpers/render.jsx @@ -594,7 +594,9 @@ export function getOAuthProviderIcon(iconName, size = 20) { return ; } - return {raw.charAt(0).toUpperCase()}; + return ( + {raw.charAt(0).toUpperCase()} + ); } // 颜色列表 @@ -1183,7 +1185,7 @@ function getEffectiveRatio(groupRatio, user_group_ratio) { const useUserGroupRatio = isValidGroupRatio(user_group_ratio); const ratioLabel = useUserGroupRatio ? i18next.t('专属倍率') - : i18next.t('分组'); + : i18next.t('分组倍率'); const effectiveRatio = useUserGroupRatio ? user_group_ratio : groupRatio; return { @@ -1234,7 +1236,7 @@ function joinBillingSummary(parts) { function getGroupRatioText(groupRatio, user_group_ratio) { const { ratio, label } = getEffectiveRatio(groupRatio, user_group_ratio); - return i18next.t('{{ratioType}} {{ratio}}', { + return i18next.t('{{ratioType}} {{ratio}}x', { ratioType: label, ratio, }); @@ -1252,6 +1254,41 @@ function renderDisplayAmountFromUsd(usdAmount, digits = 6) { return renderQuotaWithAmount(Number(Number(usdAmount || 0).toFixed(digits))); } +function formatBillingDisplayPrice(usdAmount, rate, digits = 6) { + return (usdAmount * rate).toFixed(digits); +} + +function buildBillingText(key, vars) { + return i18next.t(key, vars); +} + +function buildBillingPriceText( + key, + { symbol, usdAmount, rate, amountKey = 'price', digits = 6, ...vars }, +) { + return buildBillingText(key, { + symbol, + [amountKey]: formatBillingDisplayPrice(usdAmount, rate, digits), + ...vars, + }); +} + +function renderBillingArticle(lines, { showReferenceNote = true } = {}) { + const articleLines = lines.filter(Boolean); + + if (showReferenceNote) { + articleLines.push(buildBillingText('仅供参考,以实际扣费为准')); + } + + return ( +
+ {articleLines.map((line, index) => ( +

{line}

+ ))} +
+ ); +} + // Shared core for simple price rendering (used by OpenAI-like and Claude-like variants) function renderPriceSimpleCore({ modelRatio, @@ -1270,6 +1307,7 @@ function renderPriceSimpleCore({ imageRatio = 1.0, isSystemPromptOverride = false, displayMode = 'price', + outputMode = 'text', }) { const { ratio: effectiveGroupRatio, label: ratioLabel } = getEffectiveRatio( groupRatio, @@ -1278,10 +1316,168 @@ function renderPriceSimpleCore({ const finalGroupRatio = effectiveGroupRatio; const { symbol, rate } = getCurrencyConfig(); + const hasSplitCacheCreation = + cacheCreationTokens5m > 0 || cacheCreationTokens1h > 0; + + const shouldShowLegacyCacheCreation = + !hasSplitCacheCreation && cacheCreationTokens !== 0; + + const shouldShowCache = cacheTokens !== 0; + const shouldShowCacheCreation5m = + hasSplitCacheCreation && cacheCreationTokens5m > 0; + const shouldShowCacheCreation1h = + hasSplitCacheCreation && cacheCreationTokens1h > 0; + + if (outputMode === 'segments') { + const segments = [ + { + tone: 'primary', + text: getGroupRatioText(groupRatio, user_group_ratio), + }, + ]; + + if (modelPrice !== -1) { + segments.push({ + tone: 'secondary', + text: isPriceDisplayMode(displayMode, modelPrice) + ? i18next.t('模型价格 {{price}}', { + price: formatCompactDisplayPrice(modelPrice), + }) + : i18next.t('按次'), + }); + } else if (isPriceDisplayMode(displayMode, modelPrice)) { + segments.push({ + tone: 'secondary', + text: i18next.t('输入 {{price}} / 1M tokens', { + price: formatCompactDisplayPrice(modelRatio * 2.0), + }), + }); + + if (shouldShowCache) { + segments.push({ + tone: 'secondary', + text: i18next.t('缓存读 {{price}} / 1M tokens', { + price: formatCompactDisplayPrice(modelRatio * 2.0 * cacheRatio), + }), + }); + } + + if (hasSplitCacheCreation && shouldShowCacheCreation5m) { + segments.push({ + tone: 'secondary', + text: i18next.t('5m缓存创建 {{price}} / 1M tokens', { + price: formatCompactDisplayPrice( + modelRatio * 2.0 * cacheCreationRatio5m, + ), + }), + }); + } + if (hasSplitCacheCreation && shouldShowCacheCreation1h) { + segments.push({ + tone: 'secondary', + text: i18next.t('1h缓存创建 {{price}} / 1M tokens', { + price: formatCompactDisplayPrice( + modelRatio * 2.0 * cacheCreationRatio1h, + ), + }), + }); + } + if (!hasSplitCacheCreation && shouldShowLegacyCacheCreation) { + segments.push({ + tone: 'secondary', + text: i18next.t('缓存创建 {{price}} / 1M tokens', { + price: formatCompactDisplayPrice( + modelRatio * 2.0 * cacheCreationRatio, + ), + }), + }); + } + + if (image) { + segments.push({ + tone: 'secondary', + text: i18next.t('图片输入 {{price}} / 1M tokens', { + price: formatCompactDisplayPrice(modelRatio * 2.0 * imageRatio), + }), + }); + } + } else { + segments.push({ + tone: 'secondary', + text: i18next.t('模型: {{ratio}}', { + ratio: modelRatio, + }), + }); + + if (shouldShowCache) { + segments.push({ + tone: 'secondary', + text: i18next.t('缓存: {{cacheRatio}}', { + cacheRatio: cacheRatio, + }), + }); + } + + if (hasSplitCacheCreation) { + if (shouldShowCacheCreation5m && shouldShowCacheCreation1h) { + segments.push({ + tone: 'secondary', + text: i18next.t( + '缓存创建: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}', + { + cacheCreationRatio5m: cacheCreationRatio5m, + cacheCreationRatio1h: cacheCreationRatio1h, + }, + ), + }); + } else if (shouldShowCacheCreation5m) { + segments.push({ + tone: 'secondary', + text: i18next.t('缓存创建: 5m {{cacheCreationRatio5m}}', { + cacheCreationRatio5m: cacheCreationRatio5m, + }), + }); + } else if (shouldShowCacheCreation1h) { + segments.push({ + tone: 'secondary', + text: i18next.t('缓存创建: 1h {{cacheCreationRatio1h}}', { + cacheCreationRatio1h: cacheCreationRatio1h, + }), + }); + } + } else if (shouldShowLegacyCacheCreation) { + segments.push({ + tone: 'secondary', + text: i18next.t('缓存创建: {{cacheCreationRatio}}', { + cacheCreationRatio: cacheCreationRatio, + }), + }); + } + + if (image) { + segments.push({ + tone: 'secondary', + text: i18next.t('图片输入: {{imageRatio}}', { + imageRatio: imageRatio, + }), + }); + } + } + + if (isSystemPromptOverride) { + segments.push({ + tone: 'primary', + text: i18next.t('系统提示覆盖'), + }); + } + + return segments; + } + if (modelPrice !== -1) { if (isPriceDisplayMode(displayMode, modelPrice)) { return joinBillingSummary([ - i18next.t('模型价格:{{symbol}}{{price}} / 次', { + i18next.t('模型价格:{{symbol}}{{price}}', { symbol: symbol, price: (modelPrice * rate).toFixed(6), }), @@ -1297,23 +1493,11 @@ function renderPriceSimpleCore({ }); } - const hasSplitCacheCreation = - cacheCreationTokens5m > 0 || cacheCreationTokens1h > 0; - - const shouldShowLegacyCacheCreation = - !hasSplitCacheCreation && cacheCreationTokens !== 0; - - const shouldShowCache = cacheTokens !== 0; - const shouldShowCacheCreation5m = - hasSplitCacheCreation && cacheCreationTokens5m > 0; - const shouldShowCacheCreation1h = - hasSplitCacheCreation && cacheCreationTokens1h > 0; - if (isPriceDisplayMode(displayMode, modelPrice)) { const parts = []; if (modelPrice !== -1) { parts.push( - i18next.t('按次 {{price}} / 次', { + i18next.t('模型价格 {{price}}', { price: formatCompactDisplayPrice(modelPrice), }), ); @@ -1329,7 +1513,7 @@ function renderPriceSimpleCore({ if (shouldShowCache) { parts.push( - i18next.t('缓存读取 {{price}}', { + i18next.t('缓存读 {{price}} / 1M tokens', { price: formatCompactDisplayPrice(modelRatio * 2.0 * cacheRatio), }), ); @@ -1337,29 +1521,35 @@ function renderPriceSimpleCore({ if (hasSplitCacheCreation && shouldShowCacheCreation5m) { parts.push( - i18next.t('5m缓存创建 {{price}}', { - price: formatCompactDisplayPrice(modelRatio * 2.0 * cacheCreationRatio5m), + i18next.t('5m缓存创建 {{price}} / 1M tokens', { + price: formatCompactDisplayPrice( + modelRatio * 2.0 * cacheCreationRatio5m, + ), }), ); } if (hasSplitCacheCreation && shouldShowCacheCreation1h) { parts.push( - i18next.t('1h缓存创建 {{price}}', { - price: formatCompactDisplayPrice(modelRatio * 2.0 * cacheCreationRatio1h), + i18next.t('1h缓存创建 {{price}} / 1M tokens', { + price: formatCompactDisplayPrice( + modelRatio * 2.0 * cacheCreationRatio1h, + ), }), ); } if (!hasSplitCacheCreation && shouldShowLegacyCacheCreation) { parts.push( - i18next.t('缓存创建 {{price}}', { - price: formatCompactDisplayPrice(modelRatio * 2.0 * cacheCreationRatio), + i18next.t('缓存创建 {{price}} / 1M tokens', { + price: formatCompactDisplayPrice( + modelRatio * 2.0 * cacheCreationRatio, + ), }), ); } if (image) { parts.push( - i18next.t('图片输入 {{price}}', { + i18next.t('图片输入 {{price}} / 1M tokens', { price: formatCompactDisplayPrice(modelRatio * 2.0 * imageRatio), }), ); @@ -1460,31 +1650,25 @@ export function renderModelPrice( if (!shouldUseRatioBillingProcess(modelPrice)) { if (modelPrice !== -1) { - return ( - <> -
-

- {i18next.t('模型价格:{{symbol}}{{price}} / 次', { - symbol, - price: (modelPrice * rate).toFixed(6), - })} -

-

- {i18next.t( - '模型价格 {{symbol}}{{price}} / 次 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}', - { - symbol, - price: (modelPrice * rate).toFixed(6), - ratioType: ratioLabel, - ratio: groupRatio, - total: (modelPrice * groupRatio * rate).toFixed(6), - }, - )} -

-

{i18next.t('仅供参考,以实际扣费为准')}

-
- - ); + return renderBillingArticle([ + buildBillingPriceText('按次:{{symbol}}{{price}}', { + symbol, + usdAmount: modelPrice, + rate, + }), + buildBillingPriceText( + '按次 {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}', + { + symbol, + usdAmount: modelPrice, + rate, + ratioType: ratioLabel, + ratio: groupRatio, + amountKey: 'price', + total: formatBillingDisplayPrice(modelPrice * groupRatio, rate), + }, + ), + ]); } if (completionRatio === undefined) { @@ -1511,182 +1695,185 @@ export function renderModelPrice( (fileSearchCallCount / 1000) * fileSearchPrice * groupRatio + imageGenerationCallPrice * groupRatio; - return ( - <> -
-

- {i18next.t('输入价格:{{symbol}}{{price}} / 1M tokens{{audioPrice}}', { - symbol, - price: (inputRatioPrice * rate).toFixed(6), - audioPrice: audioInputSeperatePrice - ? `,${i18next.t('音频输入价格')} ${symbol}${(audioInputPrice * rate).toFixed(6)} / 1M tokens` - : '', - })} -

-

- {i18next.t('补全价格:{{symbol}}{{total}} / 1M tokens', { - symbol, - total: (completionRatioPrice * rate).toFixed(6), - })} -

- {cacheTokens > 0 && ( -

- {i18next.t('缓存读取价格:{{symbol}}{{total}} / 1M tokens', { - symbol, - total: (inputRatioPrice * cacheRatio * rate).toFixed(6), - })} -

- )} - {image && imageOutputTokens > 0 && ( -

- {i18next.t('图片输入价格:{{symbol}}{{total}} / 1M tokens', { - symbol, - total: (imageRatioPrice * rate).toFixed(6), - })} -

- )} - {webSearch && webSearchCallCount > 0 && ( -

- {i18next.t('Web搜索价格:{{symbol}}{{price}} / 1K 次', { - symbol, - price: (webSearchPrice * rate).toFixed(6), - })} -

- )} - {fileSearch && fileSearchCallCount > 0 && ( -

- {i18next.t('文件搜索价格:{{symbol}}{{price}} / 1K 次', { - symbol, - price: (fileSearchPrice * rate).toFixed(6), - })} -

- )} - {imageGenerationCall && imageGenerationCallPrice > 0 && ( -

- {i18next.t('图片生成调用:{{symbol}}{{price}} / 1次', { - symbol, - price: (imageGenerationCallPrice * rate).toFixed(6), - })} -

- )} -

- {(() => { - let inputDesc = ''; - if (image && imageOutputTokens > 0) { - inputDesc = i18next.t( - '(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}', - { - nonImageInput: inputTokens - imageOutputTokens, - imageInput: imageOutputTokens, - symbol: symbol, - price: (inputRatioPrice * rate).toFixed(6), - }, - ); - } else if (cacheTokens > 0) { - inputDesc = i18next.t( - '(输入 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}}', - { - nonCacheInput: inputTokens - cacheTokens, - cacheInput: cacheTokens, - symbol: symbol, - price: (inputRatioPrice * rate).toFixed(6), - cachePrice: (cacheRatioPrice * rate).toFixed(6), - }, - ); - } else if (audioInputSeperatePrice && audioInputTokens > 0) { - inputDesc = i18next.t( - '(输入 {{nonAudioInput}} tokens / 1M tokens * {{symbol}}{{price}} + 音频输入 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioPrice}}', - { - nonAudioInput: inputTokens - audioInputTokens, - audioInput: audioInputTokens, - symbol: symbol, - price: (inputRatioPrice * rate).toFixed(6), - audioPrice: (audioInputPrice * rate).toFixed(6), - }, - ); - } else { - inputDesc = i18next.t( - '(输入 {{input}} tokens / 1M tokens * {{symbol}}{{price}}', - { - input: inputTokens, - symbol: symbol, - price: (inputRatioPrice * rate).toFixed(6), - }, - ); - } + let inputDesc = ''; + if (image && imageOutputTokens > 0) { + inputDesc = buildBillingPriceText( + '(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}', + { + nonImageInput: inputTokens - imageOutputTokens, + imageInput: imageOutputTokens, + symbol, + usdAmount: inputRatioPrice, + rate, + }, + ); + } else if (cacheTokens > 0) { + inputDesc = buildBillingText( + '(输入 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}}', + { + nonCacheInput: inputTokens - cacheTokens, + cacheInput: cacheTokens, + symbol, + price: formatBillingDisplayPrice(inputRatioPrice, rate), + cachePrice: formatBillingDisplayPrice(cacheRatioPrice, rate), + }, + ); + } else if (audioInputSeperatePrice && audioInputTokens > 0) { + inputDesc = buildBillingText( + '(输入 {{nonAudioInput}} tokens / 1M tokens * {{symbol}}{{price}} + 音频输入 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioPrice}}', + { + nonAudioInput: inputTokens - audioInputTokens, + audioInput: audioInputTokens, + symbol, + price: formatBillingDisplayPrice(inputRatioPrice, rate), + audioPrice: formatBillingDisplayPrice(audioInputPrice, rate), + }, + ); + } else { + inputDesc = buildBillingPriceText( + '(输入 {{input}} tokens / 1M tokens * {{symbol}}{{price}}', + { + input: inputTokens, + symbol, + usdAmount: inputRatioPrice, + rate, + }, + ); + } - const outputDesc = i18next.t( - '输出 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}}) * {{ratioType}} {{ratio}}', - { - completion: completionTokens, - symbol: symbol, - compPrice: (completionRatioPrice * rate).toFixed(6), - ratio: groupRatio, - ratioType: ratioLabel, - }, - ); - - const extraServices = [ - webSearch && webSearchCallCount > 0 - ? i18next.t( - ' + Web搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}', - { - count: webSearchCallCount, - symbol: symbol, - price: (webSearchPrice * rate).toFixed(6), - ratio: groupRatio, - ratioType: ratioLabel, - }, - ) - : '', - fileSearch && fileSearchCallCount > 0 - ? i18next.t( - ' + 文件搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}', - { - count: fileSearchCallCount, - symbol: symbol, - price: (fileSearchPrice * rate).toFixed(6), - ratio: groupRatio, - ratioType: ratioLabel, - }, - ) - : '', - imageGenerationCall && imageGenerationCallPrice > 0 - ? i18next.t( - ' + 图片生成调用 {{symbol}}{{price}} / 1次 * {{ratioType}} {{ratio}}', - { - symbol: symbol, - price: (imageGenerationCallPrice * rate).toFixed(6), - ratio: groupRatio, - ratioType: ratioLabel, - }, - ) - : '', - ].join(''); - - return i18next.t( - '{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}', - { - inputDesc, - outputDesc, - extraServices, - symbol, - total: (price * rate).toFixed(6), - }, - ); - })()} -

-

{i18next.t('仅供参考,以实际扣费为准')}

-
- + const outputDesc = buildBillingText( + '输出 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}}) * {{ratioType}} {{ratio}}', + { + completion: completionTokens, + symbol, + compPrice: formatBillingDisplayPrice(completionRatioPrice, rate), + ratio: groupRatio, + ratioType: ratioLabel, + }, ); + + const extraServices = [ + webSearch && webSearchCallCount > 0 + ? buildBillingPriceText( + ' + Web搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}', + { + count: webSearchCallCount, + symbol, + usdAmount: webSearchPrice, + rate, + ratio: groupRatio, + ratioType: ratioLabel, + }, + ) + : '', + fileSearch && fileSearchCallCount > 0 + ? buildBillingPriceText( + ' + 文件搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}', + { + count: fileSearchCallCount, + symbol, + usdAmount: fileSearchPrice, + rate, + ratio: groupRatio, + ratioType: ratioLabel, + }, + ) + : '', + imageGenerationCall && imageGenerationCallPrice > 0 + ? buildBillingPriceText( + ' + 图片生成调用 {{symbol}}{{price}} / 1次 * {{ratioType}} {{ratio}}', + { + symbol, + usdAmount: imageGenerationCallPrice, + rate, + ratio: groupRatio, + ratioType: ratioLabel, + }, + ) + : '', + ].join(''); + + const billingLines = [ + buildBillingPriceText( + '输入价格:{{symbol}}{{price}} / 1M tokens{{audioPrice}}', + { + symbol, + usdAmount: inputRatioPrice, + rate, + audioPrice: audioInputSeperatePrice + ? `,${i18next.t('音频输入价格')} ${symbol}${formatBillingDisplayPrice(audioInputPrice, rate)} / 1M tokens` + : '', + }, + ), + buildBillingPriceText('输出价格:{{symbol}}{{total}} / 1M tokens', { + symbol, + usdAmount: completionRatioPrice, + rate, + amountKey: 'total', + }), + cacheTokens > 0 + ? buildBillingPriceText( + '缓存读取价格:{{symbol}}{{total}} / 1M tokens', + { + symbol, + usdAmount: inputRatioPrice * cacheRatio, + rate, + amountKey: 'total', + }, + ) + : null, + image && imageOutputTokens > 0 + ? buildBillingPriceText( + '图片输入价格:{{symbol}}{{total}} / 1M tokens', + { + symbol, + usdAmount: imageRatioPrice, + rate, + amountKey: 'total', + }, + ) + : null, + webSearch && webSearchCallCount > 0 + ? buildBillingPriceText('Web搜索价格:{{symbol}}{{price}} / 1K 次', { + symbol, + usdAmount: webSearchPrice, + rate, + }) + : null, + fileSearch && fileSearchCallCount > 0 + ? buildBillingPriceText('文件搜索价格:{{symbol}}{{price}} / 1K 次', { + symbol, + usdAmount: fileSearchPrice, + rate, + }) + : null, + imageGenerationCall && imageGenerationCallPrice > 0 + ? buildBillingPriceText('图片生成调用:{{symbol}}{{price}} / 1次', { + symbol, + usdAmount: imageGenerationCallPrice, + rate, + }) + : null, + buildBillingText( + '{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}', + { + inputDesc, + outputDesc, + extraServices, + symbol, + total: formatBillingDisplayPrice(price, rate), + }, + ), + ]; + + return renderBillingArticle(billingLines); } if (modelPrice !== -1) { const displayPrice = (modelPrice * rate).toFixed(6); const displayTotal = (modelPrice * groupRatio * rate).toFixed(6); return i18next.t( - '模型价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}', + '按次:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}', { symbol: symbol, price: displayPrice, @@ -1712,8 +1899,12 @@ export function renderModelPrice( ? formatRatioValue(audioInputPrice / inputRatioPrice) : null; - const textInputTokens = Math.max(inputTokens - cacheTokens - audioInputTokens, 0); - const imageInputTokens = image && imageOutputTokens > 0 ? imageOutputTokens : 0; + const textInputTokens = Math.max( + inputTokens - cacheTokens - audioInputTokens, + 0, + ); + const imageInputTokens = + image && imageOutputTokens > 0 ? imageOutputTokens : 0; const cacheInputTokens = cacheTokens; const textInputAmount = @@ -1732,7 +1923,8 @@ export function renderModelPrice( (audioInputTokens / 1000000) * audioInputPrice * groupRatio; const completionAmount = (completionTokens / 1000000) * completionRatioPrice * groupRatio; - const webSearchAmount = (webSearchCallCount / 1000) * webSearchPrice * groupRatio; + const webSearchAmount = + (webSearchCallCount / 1000) * webSearchPrice * groupRatio; const fileSearchAmount = (fileSearchCallCount / 1000) * fileSearchPrice * groupRatio; const imageGenerationAmount = imageGenerationCallPrice * groupRatio; @@ -1747,162 +1939,137 @@ export function renderModelPrice( fileSearchAmount + imageGenerationAmount; - return ( - <> -
-

- {[ - i18next.t('模型倍率 {{modelRatio}}', { - modelRatio: modelRatioValue, - }), - i18next.t('补全倍率 {{completionRatio}}', { - completionRatio: completionRatioValue, - }), - cacheInputTokens > 0 - ? i18next.t('缓存倍率 {{cacheRatio}}', { - cacheRatio: cacheRatioValue, - }) - : null, - imageInputTokens > 0 - ? i18next.t('图片倍率 {{imageRatio}}', { - imageRatio: imageRatioValue, - }) - : null, - audioRatioValue !== null - ? i18next.t('音频倍率 {{audioRatio}}', { - audioRatio: audioRatioValue, - }) - : null, - i18next.t('{{ratioType}} {{ratio}}', { - ratioType: ratioLabel, - ratio: groupRatio, - }), - ] - .filter(Boolean) - .join(',')} -

- {textInputTokens > 0 && ( -

- {i18next.t( - '普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}', - { - tokens: textInputTokens, - modelRatio: modelRatioValue, - ratioType: ratioLabel, - ratio: groupRatio, - amount: renderDisplayAmountFromUsd(textInputAmount), - }, - )} -

- )} - {cacheInputTokens > 0 && ( -

- {i18next.t( - '缓存输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}', - { - tokens: cacheInputTokens, - modelRatio: modelRatioValue, - cacheRatio: cacheRatioValue, - ratioType: ratioLabel, - ratio: groupRatio, - amount: renderDisplayAmountFromUsd(cacheInputAmount), - }, - )} -

- )} - {imageInputTokens > 0 && ( -

- {i18next.t( - '图片输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 图片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}', - { - tokens: imageInputTokens, - modelRatio: modelRatioValue, - imageRatio: imageRatioValue, - ratioType: ratioLabel, - ratio: groupRatio, - amount: renderDisplayAmountFromUsd(imageInputAmount), - }, - )} -

- )} - {audioInputTokens > 0 && audioRatioValue !== null && ( -

- {i18next.t( - '音频输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}', - { - tokens: audioInputTokens, - modelRatio: modelRatioValue, - audioRatio: audioRatioValue, - ratioType: ratioLabel, - ratio: groupRatio, - amount: renderDisplayAmountFromUsd(audioInputAmount), - }, - )} -

- )} -

- {i18next.t( - '输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}', - { - tokens: completionTokens, - modelRatio: modelRatioValue, - completionRatio: completionRatioValue, - ratioType: ratioLabel, - ratio: groupRatio, - amount: renderDisplayAmountFromUsd(completionAmount), - }, - )} -

- {webSearch && webSearchCallCount > 0 && ( -

- {i18next.t( - 'Web 搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}', - { - count: webSearchCallCount, - price: renderDisplayAmountFromUsd(webSearchPrice), - ratioType: ratioLabel, - ratio: groupRatio, - amount: renderDisplayAmountFromUsd(webSearchAmount), - }, - )} -

- )} - {fileSearch && fileSearchCallCount > 0 && ( -

- {i18next.t( - '文件搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}', - { - count: fileSearchCallCount, - price: renderDisplayAmountFromUsd(fileSearchPrice), - ratioType: ratioLabel, - ratio: groupRatio, - amount: renderDisplayAmountFromUsd(fileSearchAmount), - }, - )} -

- )} - {imageGenerationCall && imageGenerationCallPrice > 0 && ( -

- {i18next.t( - '图片生成:1 次 * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}', - { - price: renderDisplayAmountFromUsd(imageGenerationCallPrice), - ratioType: ratioLabel, - ratio: groupRatio, - amount: renderDisplayAmountFromUsd(imageGenerationAmount), - }, - )} -

- )} -

- {i18next.t('合计:{{total}}', { - total: renderDisplayAmountFromUsd(totalAmount), - })} -

-

{i18next.t('仅供参考,以实际扣费为准')}

-
- - ); + return renderBillingArticle([ + [ + buildBillingText('模型倍率 {{modelRatio}}', { + modelRatio: modelRatioValue, + }), + buildBillingText('补全倍率 {{completionRatio}}', { + completionRatio: completionRatioValue, + }), + cacheInputTokens > 0 + ? buildBillingText('缓存倍率 {{cacheRatio}}', { + cacheRatio: cacheRatioValue, + }) + : null, + imageInputTokens > 0 + ? buildBillingText('图片倍率 {{imageRatio}}', { + imageRatio: imageRatioValue, + }) + : null, + audioRatioValue !== null + ? buildBillingText('音频倍率 {{audioRatio}}', { + audioRatio: audioRatioValue, + }) + : null, + buildBillingText('{{ratioType}} {{ratio}}', { + ratioType: ratioLabel, + ratio: groupRatio, + }), + ] + .filter(Boolean) + .join(','), + textInputTokens > 0 + ? buildBillingText( + '普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}', + { + tokens: textInputTokens, + modelRatio: modelRatioValue, + ratioType: ratioLabel, + ratio: groupRatio, + amount: renderDisplayAmountFromUsd(textInputAmount), + }, + ) + : null, + cacheInputTokens > 0 + ? buildBillingText( + '缓存输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}', + { + tokens: cacheInputTokens, + modelRatio: modelRatioValue, + cacheRatio: cacheRatioValue, + ratioType: ratioLabel, + ratio: groupRatio, + amount: renderDisplayAmountFromUsd(cacheInputAmount), + }, + ) + : null, + imageInputTokens > 0 + ? buildBillingText( + '图片输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 图片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}', + { + tokens: imageInputTokens, + modelRatio: modelRatioValue, + imageRatio: imageRatioValue, + ratioType: ratioLabel, + ratio: groupRatio, + amount: renderDisplayAmountFromUsd(imageInputAmount), + }, + ) + : null, + audioInputTokens > 0 && audioRatioValue !== null + ? buildBillingText( + '音频输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}', + { + tokens: audioInputTokens, + modelRatio: modelRatioValue, + audioRatio: audioRatioValue, + ratioType: ratioLabel, + ratio: groupRatio, + amount: renderDisplayAmountFromUsd(audioInputAmount), + }, + ) + : null, + buildBillingText( + '输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}', + { + tokens: completionTokens, + modelRatio: modelRatioValue, + completionRatio: completionRatioValue, + ratioType: ratioLabel, + ratio: groupRatio, + amount: renderDisplayAmountFromUsd(completionAmount), + }, + ), + webSearch && webSearchCallCount > 0 + ? buildBillingText( + 'Web 搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}', + { + count: webSearchCallCount, + price: renderDisplayAmountFromUsd(webSearchPrice), + ratioType: ratioLabel, + ratio: groupRatio, + amount: renderDisplayAmountFromUsd(webSearchAmount), + }, + ) + : null, + fileSearch && fileSearchCallCount > 0 + ? buildBillingText( + '文件搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}', + { + count: fileSearchCallCount, + price: renderDisplayAmountFromUsd(fileSearchPrice), + ratioType: ratioLabel, + ratio: groupRatio, + amount: renderDisplayAmountFromUsd(fileSearchAmount), + }, + ) + : null, + imageGenerationCall && imageGenerationCallPrice > 0 + ? buildBillingText( + '图片生成:1 次 * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}', + { + price: renderDisplayAmountFromUsd(imageGenerationCallPrice), + ratioType: ratioLabel, + ratio: groupRatio, + amount: renderDisplayAmountFromUsd(imageGenerationAmount), + }, + ) + : null, + buildBillingText('合计:{{total}}', { + total: renderDisplayAmountFromUsd(totalAmount), + }), + ]); } export function renderLogContent( @@ -1945,25 +2112,45 @@ export function renderLogContent( symbol, price: (modelRatio * 2.0 * rate).toFixed(6), }), - i18next.t('补全价格 {{symbol}}{{price}} / 1M tokens', { + i18next.t('输出价格 {{symbol}}{{price}} / 1M tokens', { symbol, price: (modelRatio * 2.0 * completionRatio * rate).toFixed(6), }), ]; - appendPricePart(parts, cacheRatio !== 1.0, '缓存读取价格 {{symbol}}{{price}} / 1M tokens', { - symbol, - price: (modelRatio * 2.0 * cacheRatio * rate).toFixed(6), - }); - appendPricePart(parts, image, '图片输入价格 {{symbol}}{{price}} / 1M tokens', { - symbol, - price: (modelRatio * 2.0 * imageRatio * rate).toFixed(6), - }); - appendPricePart(parts, webSearch, 'Web 搜索调用 {{webSearchCallCount}} 次', { - webSearchCallCount, - }); - appendPricePart(parts, fileSearch, '文件搜索调用 {{fileSearchCallCount}} 次', { - fileSearchCallCount, - }); + appendPricePart( + parts, + cacheRatio !== 1.0, + '缓存读取价格 {{symbol}}{{price}} / 1M tokens', + { + symbol, + price: (modelRatio * 2.0 * cacheRatio * rate).toFixed(6), + }, + ); + appendPricePart( + parts, + image, + '图片输入价格 {{symbol}}{{price}} / 1M tokens', + { + symbol, + price: (modelRatio * 2.0 * imageRatio * rate).toFixed(6), + }, + ); + appendPricePart( + parts, + webSearch, + 'Web 搜索调用 {{webSearchCallCount}} 次', + { + webSearchCallCount, + }, + ); + appendPricePart( + parts, + fileSearch, + '文件搜索调用 {{fileSearchCallCount}} 次', + { + fileSearchCallCount, + }, + ); parts.push(getGroupRatioText(groupRatio, user_group_ratio)); return joinBillingSummary(parts); } @@ -2033,6 +2220,7 @@ export function renderModelPriceSimple( isSystemPromptOverride = false, provider = 'openai', displayMode = 'price', + outputMode = 'text', ) { return renderPriceSimpleCore({ modelRatio, @@ -2051,6 +2239,7 @@ export function renderModelPriceSimple( imageRatio, isSystemPromptOverride, displayMode, + outputMode, }); } @@ -2081,31 +2270,24 @@ export function renderAudioModelPrice( if (!shouldUseRatioBillingProcess(modelPrice)) { if (modelPrice !== -1) { - return ( - <> -
-

- {i18next.t('模型价格:{{symbol}}{{price}} / 次', { - symbol, - price: (modelPrice * rate).toFixed(6), - })} -

-

- {i18next.t( - '模型价格 {{symbol}}{{price}} / 次 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}', - { - symbol, - price: (modelPrice * rate).toFixed(6), - ratioType: ratioLabel, - ratio: groupRatio, - total: (modelPrice * groupRatio * rate).toFixed(6), - }, - )} -

-

{i18next.t('仅供参考,以实际扣费为准')}

-
- - ); + return renderBillingArticle([ + buildBillingPriceText('模型价格:{{symbol}}{{price}} / 次', { + symbol, + usdAmount: modelPrice, + rate, + }), + buildBillingPriceText( + '模型价格 {{symbol}}{{price}} / 次 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}', + { + symbol, + usdAmount: modelPrice, + rate, + ratioType: ratioLabel, + ratio: groupRatio, + total: formatBillingDisplayPrice(modelPrice * groupRatio, rate), + }, + ), + ]); } if (completionRatio === undefined) { @@ -2128,74 +2310,61 @@ export function renderAudioModelPrice( groupRatio; const totalPrice = textPrice + audioPrice; - return ( - <> -
-

- {i18next.t('输入价格:{{symbol}}{{price}} / 1M tokens', { + return renderBillingArticle([ + buildBillingPriceText('输入价格:{{symbol}}{{price}} / 1M tokens', { + symbol, + usdAmount: inputRatioPrice, + rate, + }), + buildBillingPriceText('输出价格:{{symbol}}{{price}} / 1M tokens', { + symbol, + usdAmount: completionRatioPrice, + rate, + }), + cacheTokens > 0 + ? buildBillingPriceText( + '缓存读取价格:{{symbol}}{{price}} / 1M tokens', + { symbol, - price: (inputRatioPrice * rate).toFixed(6), - })} -

-

- {i18next.t('补全价格:{{symbol}}{{price}} / 1M tokens', { - symbol, - price: (completionRatioPrice * rate).toFixed(6), - })} -

- {cacheTokens > 0 && ( -

- {i18next.t('缓存读取价格:{{symbol}}{{price}} / 1M tokens', { - symbol, - price: (inputRatioPrice * cacheRatio * rate).toFixed(6), - })} -

- )} -

- {i18next.t('音频输入价格:{{symbol}}{{price}} / 1M tokens', { - symbol, - price: (inputRatioPrice * audioRatio * rate).toFixed(6), - })} -

-

- {i18next.t('音频补全价格:{{symbol}}{{price}} / 1M tokens', { - symbol, - price: ( - inputRatioPrice * - audioRatio * - audioCompletionRatio * - rate - ).toFixed(6), - })} -

-

- {i18next.t( - '文字提示 {{input}} tokens / 1M tokens * {{symbol}}{{textInputPrice}} + 文字补全 {{completion}} tokens / 1M tokens * {{symbol}}{{textCompPrice}} + 音频提示 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{audioCompletion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}', - { - input: inputTokens, - completion: completionTokens, - audioInput: audioInputTokens, - audioCompletion: audioCompletionTokens, - textInputPrice: (inputRatioPrice * rate).toFixed(6), - textCompPrice: (completionRatioPrice * rate).toFixed(6), - audioInputPrice: (audioRatio * inputRatioPrice * rate).toFixed(6), - audioCompPrice: ( - audioRatio * - audioCompletionRatio * - inputRatioPrice * - rate - ).toFixed(6), - ratioType: ratioLabel, - ratio: groupRatio, - symbol, - total: (totalPrice * rate).toFixed(6), - }, - )} -

-

{i18next.t('仅供参考,以实际扣费为准')}

-
- - ); + usdAmount: inputRatioPrice * cacheRatio, + rate, + }, + ) + : null, + buildBillingPriceText('音频输入价格:{{symbol}}{{price}} / 1M tokens', { + symbol, + usdAmount: inputRatioPrice * audioRatio, + rate, + }), + buildBillingPriceText('音频补全价格:{{symbol}}{{price}} / 1M tokens', { + symbol, + usdAmount: inputRatioPrice * audioRatio * audioCompletionRatio, + rate, + }), + buildBillingText( + '文字提示 {{input}} tokens / 1M tokens * {{symbol}}{{textInputPrice}} + 文字补全 {{completion}} tokens / 1M tokens * {{symbol}}{{textCompPrice}} + 音频提示 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{audioCompletion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}', + { + input: inputTokens, + completion: completionTokens, + audioInput: audioInputTokens, + audioCompletion: audioCompletionTokens, + textInputPrice: formatBillingDisplayPrice(inputRatioPrice, rate), + textCompPrice: formatBillingDisplayPrice(completionRatioPrice, rate), + audioInputPrice: formatBillingDisplayPrice( + audioRatio * inputRatioPrice, + rate, + ), + audioCompPrice: formatBillingDisplayPrice( + audioRatio * audioCompletionRatio * inputRatioPrice, + rate, + ), + ratioType: ratioLabel, + ratio: groupRatio, + symbol, + total: formatBillingDisplayPrice(totalPrice, rate), + }, + ), + ]); } // 1 ratio = $0.002 / 1K tokens @@ -2232,7 +2401,10 @@ export function renderAudioModelPrice( (effectiveInputTokens / 1000000) * inputRatioPrice * groupRatio + (completionTokens / 1000000) * completionRatioPrice * groupRatio; const audioPrice = - (audioInputTokens / 1000000) * inputRatioPrice * audioRatioValue * groupRatio + + (audioInputTokens / 1000000) * + inputRatioPrice * + audioRatioValue * + groupRatio + (audioCompletionTokens / 1000000) * inputRatioPrice * audioRatioValue * @@ -2240,132 +2412,113 @@ export function renderAudioModelPrice( groupRatio; const totalPrice = textPrice + audioPrice; - return ( - <> -
-

- {i18next.t( - '模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},音频倍率 {{audioRatio}},音频补全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}', - { - modelRatio: modelRatioValue, - completionRatio: completionRatioValue, - audioRatio: audioRatioValue, - audioCompletionRatio: audioCompletionRatioValue, - cachePart: - cacheTokens > 0 - ? `${i18next.t('缓存倍率')} ${cacheRatioValue},` - : '', - ratioType: ratioLabel, - ratio: groupRatio, - }, - )} -

-

- {i18next.t( - '普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}', - { - tokens: Math.max(inputTokens - cacheTokens, 0), - modelRatio: modelRatioValue, - ratioType: ratioLabel, - ratio: groupRatio, - amount: renderDisplayAmountFromUsd( - ((Math.max(inputTokens - cacheTokens, 0) / 1000000) * - inputRatioPrice * - groupRatio), - ), - }, - )} -

- {cacheTokens > 0 && ( -

- {i18next.t( - '缓存输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}', - { - tokens: cacheTokens, - modelRatio: modelRatioValue, - cacheRatio: cacheRatioValue, - ratioType: ratioLabel, - ratio: groupRatio, - amount: renderDisplayAmountFromUsd( - ((cacheTokens / 1000000) * - inputRatioPrice * - cacheRatioValue * - groupRatio), - ), - }, - )} -

- )} -

- {i18next.t( - '文字输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}', - { - tokens: completionTokens, - modelRatio: modelRatioValue, - completionRatio: completionRatioValue, - ratioType: ratioLabel, - ratio: groupRatio, - amount: renderDisplayAmountFromUsd( - ((completionTokens / 1000000) * - inputRatioPrice * - completionRatioValue * - groupRatio), - ), - }, - )} -

-

- {i18next.t( - '音频输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}', - { - tokens: audioInputTokens, - modelRatio: modelRatioValue, - audioRatio: audioRatioValue, - ratioType: ratioLabel, - ratio: groupRatio, - amount: renderDisplayAmountFromUsd( - ((audioInputTokens / 1000000) * - inputRatioPrice * - audioRatioValue * - groupRatio), - ), - }, - )} -

-

- {i18next.t( - '音频输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * 音频补全倍率 {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}', - { - tokens: audioCompletionTokens, - modelRatio: modelRatioValue, - audioRatio: audioRatioValue, - audioCompletionRatio: audioCompletionRatioValue, - ratioType: ratioLabel, - ratio: groupRatio, - amount: renderDisplayAmountFromUsd( - ((audioCompletionTokens / 1000000) * - inputRatioPrice * - audioRatioValue * - audioCompletionRatioValue * - groupRatio), - ), - }, - )} -

-

- {i18next.t( - '合计:文字部分 {{textTotal}} + 音频部分 {{audioTotal}} = {{total}}', - { - textTotal: renderDisplayAmountFromUsd(textPrice), - audioTotal: renderDisplayAmountFromUsd(audioPrice), - total: renderDisplayAmountFromUsd(totalPrice), - }, - )} -

-

{i18next.t('仅供参考,以实际扣费为准')}

-
- - ); + return renderBillingArticle([ + buildBillingText( + '模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},音频倍率 {{audioRatio}},音频补全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}', + { + modelRatio: modelRatioValue, + completionRatio: completionRatioValue, + audioRatio: audioRatioValue, + audioCompletionRatio: audioCompletionRatioValue, + cachePart: + cacheTokens > 0 + ? `${i18next.t('缓存倍率')} ${cacheRatioValue},` + : '', + ratioType: ratioLabel, + ratio: groupRatio, + }, + ), + buildBillingText( + '普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}', + { + tokens: Math.max(inputTokens - cacheTokens, 0), + modelRatio: modelRatioValue, + ratioType: ratioLabel, + ratio: groupRatio, + amount: renderDisplayAmountFromUsd( + (Math.max(inputTokens - cacheTokens, 0) / 1000000) * + inputRatioPrice * + groupRatio, + ), + }, + ), + cacheTokens > 0 + ? buildBillingText( + '缓存输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}', + { + tokens: cacheTokens, + modelRatio: modelRatioValue, + cacheRatio: cacheRatioValue, + ratioType: ratioLabel, + ratio: groupRatio, + amount: renderDisplayAmountFromUsd( + (cacheTokens / 1000000) * + inputRatioPrice * + cacheRatioValue * + groupRatio, + ), + }, + ) + : null, + buildBillingText( + '文字输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}', + { + tokens: completionTokens, + modelRatio: modelRatioValue, + completionRatio: completionRatioValue, + ratioType: ratioLabel, + ratio: groupRatio, + amount: renderDisplayAmountFromUsd( + (completionTokens / 1000000) * + inputRatioPrice * + completionRatioValue * + groupRatio, + ), + }, + ), + buildBillingText( + '音频输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}', + { + tokens: audioInputTokens, + modelRatio: modelRatioValue, + audioRatio: audioRatioValue, + ratioType: ratioLabel, + ratio: groupRatio, + amount: renderDisplayAmountFromUsd( + (audioInputTokens / 1000000) * + inputRatioPrice * + audioRatioValue * + groupRatio, + ), + }, + ), + buildBillingText( + '音频输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * 音频补全倍率 {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}', + { + tokens: audioCompletionTokens, + modelRatio: modelRatioValue, + audioRatio: audioRatioValue, + audioCompletionRatio: audioCompletionRatioValue, + ratioType: ratioLabel, + ratio: groupRatio, + amount: renderDisplayAmountFromUsd( + (audioCompletionTokens / 1000000) * + inputRatioPrice * + audioRatioValue * + audioCompletionRatioValue * + groupRatio, + ), + }, + ), + buildBillingText( + '合计:文字部分 {{textTotal}} + 音频部分 {{audioTotal}} = {{total}}', + { + textTotal: renderDisplayAmountFromUsd(textPrice), + audioTotal: renderDisplayAmountFromUsd(audioPrice), + total: renderDisplayAmountFromUsd(totalPrice), + }, + ), + ]); } export function renderQuotaWithPrompt(quota, digits) { @@ -2405,31 +2558,24 @@ export function renderClaudeModelPrice( if (!shouldUseRatioBillingProcess(modelPrice)) { if (modelPrice !== -1) { - return ( - <> -
-

- {i18next.t('模型价格:{{symbol}}{{price}} / 次', { - symbol, - price: (modelPrice * rate).toFixed(6), - })} -

-

- {i18next.t( - '模型价格 {{symbol}}{{price}} / 次 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}', - { - symbol, - price: (modelPrice * rate).toFixed(6), - ratioType: ratioLabel, - ratio: groupRatio, - total: (modelPrice * groupRatio * rate).toFixed(6), - }, - )} -

-

{i18next.t('仅供参考,以实际扣费为准')}

-
- - ); + return renderBillingArticle([ + buildBillingPriceText('模型价格:{{symbol}}{{price}} / 次', { + symbol, + usdAmount: modelPrice, + rate, + }), + buildBillingPriceText( + '模型价格 {{symbol}}{{price}} / 次 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}', + { + symbol, + usdAmount: modelPrice, + rate, + ratioType: ratioLabel, + ratio: groupRatio, + total: formatBillingDisplayPrice(modelPrice * groupRatio, rate), + }, + ), + ]); } if (completionRatio === undefined) { @@ -2492,31 +2638,40 @@ export function renderClaudeModelPrice( if (shouldShowLegacyCacheCreation) { breakdownSegments.push( - i18next.t('缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}', { - tokens: cacheCreationTokens, - symbol, - price: cacheCreationUnitPrice.toFixed(6), - }), + i18next.t( + '缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}', + { + tokens: cacheCreationTokens, + symbol, + price: cacheCreationUnitPrice.toFixed(6), + }, + ), ); } if (shouldShowCacheCreation5m) { breakdownSegments.push( - i18next.t('5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}', { - tokens: cacheCreationTokens5m, - symbol, - price: cacheCreationUnitPrice5m.toFixed(6), - }), + i18next.t( + '5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}', + { + tokens: cacheCreationTokens5m, + symbol, + price: cacheCreationUnitPrice5m.toFixed(6), + }, + ), ); } if (shouldShowCacheCreation1h) { breakdownSegments.push( - i18next.t('1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}', { - tokens: cacheCreationTokens1h, - symbol, - price: cacheCreationUnitPrice1h.toFixed(6), - }), + i18next.t( + '1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}', + { + tokens: cacheCreationTokens1h, + symbol, + price: cacheCreationUnitPrice1h.toFixed(6), + }, + ), ); } @@ -2533,69 +2688,68 @@ export function renderClaudeModelPrice( const breakdownText = breakdownSegments.join(' + '); - return ( - <> -
-

- {i18next.t('输入价格:{{symbol}}{{price}} / 1M tokens', { + return renderBillingArticle([ + buildBillingPriceText('输入价格:{{symbol}}{{price}} / 1M tokens', { + symbol, + usdAmount: inputRatioPrice, + rate, + }), + buildBillingPriceText('输出价格:{{symbol}}{{price}} / 1M tokens', { + symbol, + usdAmount: completionRatioPrice, + rate, + }), + cacheTokens > 0 + ? buildBillingPriceText( + '缓存读取价格:{{symbol}}{{price}} / 1M tokens', + { symbol, - price: (inputRatioPrice * rate).toFixed(6), - })} -

-

- {i18next.t('补全价格:{{symbol}}{{price}} / 1M tokens', { + usdAmount: cacheRatioPrice, + rate, + }, + ) + : null, + !hasSplitCacheCreation && cacheCreationTokens > 0 + ? buildBillingPriceText( + '缓存创建价格:{{symbol}}{{price}} / 1M tokens', + { symbol, - price: (completionRatioPrice * rate).toFixed(6), - })} -

- {cacheTokens > 0 && ( -

- {i18next.t('缓存读取价格:{{symbol}}{{price}} / 1M tokens', { - symbol, - price: (cacheRatioPrice * rate).toFixed(6), - })} -

- )} - {!hasSplitCacheCreation && cacheCreationTokens > 0 && ( -

- {i18next.t('缓存创建价格:{{symbol}}{{price}} / 1M tokens', { - symbol, - price: (cacheCreationRatioPrice * rate).toFixed(6), - })} -

- )} - {hasSplitCacheCreation && cacheCreationTokens5m > 0 && ( -

- {i18next.t('5m缓存创建价格:{{symbol}}{{price}} / 1M tokens', { - symbol, - price: (cacheCreationRatioPrice5m * rate).toFixed(6), - })} -

- )} - {hasSplitCacheCreation && cacheCreationTokens1h > 0 && ( -

- {i18next.t('1h缓存创建价格:{{symbol}}{{price}} / 1M tokens', { - symbol, - price: (cacheCreationRatioPrice1h * rate).toFixed(6), - })} -

- )} -

- {i18next.t( - '{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}', - { - breakdown: breakdownText, - ratioType: ratioLabel, - ratio: groupRatio, - symbol, - total: (price * rate).toFixed(6), - }, - )} -

-

{i18next.t('仅供参考,以实际扣费为准')}

-
- - ); + usdAmount: cacheCreationRatioPrice, + rate, + }, + ) + : null, + hasSplitCacheCreation && cacheCreationTokens5m > 0 + ? buildBillingPriceText( + '5m缓存创建价格:{{symbol}}{{price}} / 1M tokens', + { + symbol, + usdAmount: cacheCreationRatioPrice5m, + rate, + }, + ) + : null, + hasSplitCacheCreation && cacheCreationTokens1h > 0 + ? buildBillingPriceText( + '1h缓存创建价格:{{symbol}}{{price}} / 1M tokens', + { + symbol, + usdAmount: cacheCreationRatioPrice1h, + rate, + }, + ) + : null, + buildBillingText( + '{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}', + { + breakdown: breakdownText, + ratioType: ratioLabel, + ratio: groupRatio, + symbol, + total: formatBillingDisplayPrice(price, rate), + }, + ), + ]); } if (modelPrice !== -1) { @@ -2635,7 +2789,9 @@ export function renderClaudeModelPrice( const shouldShowCacheCreation1h = hasSplitCacheCreation && cacheCreationTokens1h > 0; - const legacyCacheCreationTokens = hasSplitCacheCreation ? 0 : cacheCreationTokens; + const legacyCacheCreationTokens = hasSplitCacheCreation + ? 0 + : cacheCreationTokens; const effectiveInputTokens = inputTokens + cacheTokens * cacheRatioValue + @@ -2647,162 +2803,139 @@ export function renderClaudeModelPrice( (effectiveInputTokens / 1000000) * inputRatioPrice * groupRatio + (completionTokens / 1000000) * completionRatioPrice * groupRatio; - return ( - <> -
-

- {i18next.t( - '模型倍率 {{modelRatio}},输出倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},{{ratioType}} {{ratio}}', - { - modelRatio: modelRatioValue, - completionRatio: completionRatioValue, - cacheRatio: cacheRatioValue, - ratioType: ratioLabel, - ratio: groupRatio, - }, - )} -

-

- {hasSplitCacheCreation - ? i18next.t( - '缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}', - { - cacheCreationRatio5m: cacheCreationRatio5mValue, - cacheCreationRatio1h: cacheCreationRatio1hValue, - }, - ) - : i18next.t('缓存创建倍率 {{cacheCreationRatio}}', { - cacheCreationRatio: cacheCreationRatioValue, - })} -

-

- {i18next.t( - '普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}', - { - tokens: inputTokens, - modelRatio: modelRatioValue, - ratioType: ratioLabel, - ratio: groupRatio, - amount: renderDisplayAmountFromUsd( - ((inputTokens / 1000000) * inputRatioPrice * groupRatio), - ), - }, - )} -

- {shouldShowCache && ( -

- {i18next.t( - '缓存读取:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}', - { - tokens: cacheTokens, - modelRatio: modelRatioValue, - cacheRatio: cacheRatioValue, - ratioType: ratioLabel, - ratio: groupRatio, - amount: renderDisplayAmountFromUsd( - ((cacheTokens / 1000000) * - inputRatioPrice * - cacheRatioValue * - groupRatio), - ), - }, - )} -

- )} - {shouldShowLegacyCacheCreation && ( -

- {i18next.t( - '缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存创建倍率 {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}', - { - tokens: cacheCreationTokens, - modelRatio: modelRatioValue, - cacheCreationRatio: cacheCreationRatioValue, - ratioType: ratioLabel, - ratio: groupRatio, - amount: renderDisplayAmountFromUsd( - ((cacheCreationTokens / 1000000) * - inputRatioPrice * - cacheCreationRatioValue * - groupRatio), - ), - }, - )} -

- )} - {shouldShowCacheCreation5m && ( -

- {i18next.t( - '5m缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 5m缓存创建倍率 {{cacheCreationRatio5m}} * {{ratioType}} {{ratio}} = {{amount}}', - { - tokens: cacheCreationTokens5m, - modelRatio: modelRatioValue, - cacheCreationRatio5m: cacheCreationRatio5mValue, - ratioType: ratioLabel, - ratio: groupRatio, - amount: renderDisplayAmountFromUsd( - ((cacheCreationTokens5m / 1000000) * - inputRatioPrice * - cacheCreationRatio5mValue * - groupRatio), - ), - }, - )} -

- )} - {shouldShowCacheCreation1h && ( -

- {i18next.t( - '1h缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 1h缓存创建倍率 {{cacheCreationRatio1h}} * {{ratioType}} {{ratio}} = {{amount}}', - { - tokens: cacheCreationTokens1h, - modelRatio: modelRatioValue, - cacheCreationRatio1h: cacheCreationRatio1hValue, - ratioType: ratioLabel, - ratio: groupRatio, - amount: renderDisplayAmountFromUsd( - ((cacheCreationTokens1h / 1000000) * - inputRatioPrice * - cacheCreationRatio1hValue * - groupRatio), - ), - }, - )} -

- )} -

- {i18next.t('补全 {{completion}} tokens * 输出倍率 {{completionRatio}}', { - completion: completionTokens, - completionRatio: completionRatioValue, - })} -

-

- {i18next.t( - '输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 输出倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}', - { - tokens: completionTokens, - modelRatio: modelRatioValue, - completionRatio: completionRatioValue, - ratioType: ratioLabel, - ratio: groupRatio, - amount: renderDisplayAmountFromUsd( - ((completionTokens / 1000000) * - inputRatioPrice * - completionRatioValue * - groupRatio), - ), - }, - )} -

-

- {i18next.t('合计:{{total}}', { - total: renderDisplayAmountFromUsd(totalAmount), - }, - )} -

-

{i18next.t('仅供参考,以实际扣费为准')}

-
- - ); + return renderBillingArticle([ + buildBillingText( + '模型倍率 {{modelRatio}},输出倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},{{ratioType}} {{ratio}}', + { + modelRatio: modelRatioValue, + completionRatio: completionRatioValue, + cacheRatio: cacheRatioValue, + ratioType: ratioLabel, + ratio: groupRatio, + }, + ), + hasSplitCacheCreation + ? buildBillingText( + '缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}', + { + cacheCreationRatio5m: cacheCreationRatio5mValue, + cacheCreationRatio1h: cacheCreationRatio1hValue, + }, + ) + : buildBillingText('缓存创建倍率 {{cacheCreationRatio}}', { + cacheCreationRatio: cacheCreationRatioValue, + }), + buildBillingText( + '普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}', + { + tokens: inputTokens, + modelRatio: modelRatioValue, + ratioType: ratioLabel, + ratio: groupRatio, + amount: renderDisplayAmountFromUsd( + (inputTokens / 1000000) * inputRatioPrice * groupRatio, + ), + }, + ), + shouldShowCache + ? buildBillingText( + '缓存读取:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}', + { + tokens: cacheTokens, + modelRatio: modelRatioValue, + cacheRatio: cacheRatioValue, + ratioType: ratioLabel, + ratio: groupRatio, + amount: renderDisplayAmountFromUsd( + (cacheTokens / 1000000) * + inputRatioPrice * + cacheRatioValue * + groupRatio, + ), + }, + ) + : null, + shouldShowLegacyCacheCreation + ? buildBillingText( + '缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存创建倍率 {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}', + { + tokens: cacheCreationTokens, + modelRatio: modelRatioValue, + cacheCreationRatio: cacheCreationRatioValue, + ratioType: ratioLabel, + ratio: groupRatio, + amount: renderDisplayAmountFromUsd( + (cacheCreationTokens / 1000000) * + inputRatioPrice * + cacheCreationRatioValue * + groupRatio, + ), + }, + ) + : null, + shouldShowCacheCreation5m + ? buildBillingText( + '5m缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 5m缓存创建倍率 {{cacheCreationRatio5m}} * {{ratioType}} {{ratio}} = {{amount}}', + { + tokens: cacheCreationTokens5m, + modelRatio: modelRatioValue, + cacheCreationRatio5m: cacheCreationRatio5mValue, + ratioType: ratioLabel, + ratio: groupRatio, + amount: renderDisplayAmountFromUsd( + (cacheCreationTokens5m / 1000000) * + inputRatioPrice * + cacheCreationRatio5mValue * + groupRatio, + ), + }, + ) + : null, + shouldShowCacheCreation1h + ? buildBillingText( + '1h缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 1h缓存创建倍率 {{cacheCreationRatio1h}} * {{ratioType}} {{ratio}} = {{amount}}', + { + tokens: cacheCreationTokens1h, + modelRatio: modelRatioValue, + cacheCreationRatio1h: cacheCreationRatio1hValue, + ratioType: ratioLabel, + ratio: groupRatio, + amount: renderDisplayAmountFromUsd( + (cacheCreationTokens1h / 1000000) * + inputRatioPrice * + cacheCreationRatio1hValue * + groupRatio, + ), + }, + ) + : null, + buildBillingText( + '补全 {{completion}} tokens * 输出倍率 {{completionRatio}}', + { + completion: completionTokens, + completionRatio: completionRatioValue, + }, + ), + buildBillingText( + '输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 输出倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}', + { + tokens: completionTokens, + modelRatio: modelRatioValue, + completionRatio: completionRatioValue, + ratioType: ratioLabel, + ratio: groupRatio, + amount: renderDisplayAmountFromUsd( + (completionTokens / 1000000) * + inputRatioPrice * + completionRatioValue * + groupRatio, + ), + }, + ), + buildBillingText('合计:{{total}}', { + total: renderDisplayAmountFromUsd(totalAmount), + }), + ]); } export function renderClaudeLogContent( @@ -2844,7 +2977,7 @@ export function renderClaudeLogContent( symbol, price: (modelRatio * 2.0 * rate).toFixed(6), }), - i18next.t('补全价格 {{symbol}}{{price}} / 1M tokens', { + i18next.t('输出价格 {{symbol}}{{price}} / 1M tokens', { symbol, price: (modelRatio * 2.0 * completionRatio * rate).toFixed(6), }), diff --git a/web/src/i18n/locales/en.json b/web/src/i18n/locales/en.json index 453f3916..e7213cd3 100644 --- a/web/src/i18n/locales/en.json +++ b/web/src/i18n/locales/en.json @@ -18,7 +18,6 @@ "(输入 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "(Input {{input}} tokens / 1M tokens * {{symbol}}{{price}}", "(输入 {{nonAudioInput}} tokens / 1M tokens * {{symbol}}{{price}} + 音频输入 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioPrice}}": "(Input {{nonAudioInput}} tokens / 1M tokens * {{symbol}}{{price}} + Audio input {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioPrice}}", "(输入 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}}": "(Input {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + Cache {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}}", - "(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens * {{imageRatio}} / 1M tokens * {{symbol}}{{price}}": "(Input {{nonImageInput}} tokens + Image input {{imageInput}} tokens * {{imageRatio}} / 1M tokens * {{symbol}}{{price}}", "[最多请求次数]和[最多请求完成次数]的最大值为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}", @@ -155,10 +154,10 @@ "JSON格式错误": "JSON format error", "JSON编辑": "JSON Editor", "JSON解析错误:": "JSON parsing error:", - "Key": "", + "Key": "Key", "Key 或 Path": "", "Key 指纹": "", - "Key 摘要": "", + "Key 摘要": "Key summary", "Key 来源": "", "Key 来源类型": "", "Linux DO Client ID": "Linux DO Client ID", @@ -915,7 +914,6 @@ "图片输入价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (图片倍率: {{imageRatio}})": "Image input price: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (Image ratio: {{imageRatio}})", "图片输入价格:{{symbol}}{{price}} / 1M tokens": "Image input price: {{symbol}}{{price}} / 1M tokens", "图片输入价格 {{symbol}}{{price}} / 1M tokens": "Image input price {{symbol}}{{price}} / 1M tokens", - "图片输入 {{price}}": "Image input {{price}}", "图片输入倍率(仅部分模型支持该计费)": "Image input ratio (only supported by some models for billing)", "图片输入相关的倍率设置,键为模型名称,值为倍率,仅部分模型支持该计费": "Ratio settings related to image input, key is model name, value is ratio, only supported by some models for billing", "图生文": "Describe", @@ -1371,7 +1369,7 @@ "打开 CC Switch": "Open CC Switch", "打开侧边栏": "Open sidebar", "打开授权页面": "", - "扣费": "", + "扣费": "Charge", "执行 GC": "Run GC", "执行中": "processing", "扫描二维码": "Scan QR code", @@ -1406,7 +1404,6 @@ "按倍率类型筛选": "Filter by ratio type", "按倍率设置": "Set by ratio", "按次": "Per request", - "按次 {{price}} / 次": "Per request {{price}} / request", "按次计费": "Pay per request", "按照如下格式输入:AccessKey|SecretAccessKey|Region": "Enter in the format: AccessKey|SecretAccessKey|Region", "按量计费": "Pay as you go", @@ -1799,9 +1796,11 @@ "模型价格": "Model price", "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}": "Model price {{symbol}}{{price}}, {{ratioType}} {{ratio}}", "模型价格 {{symbol}}{{price}} / 次": "Model price {{symbol}}{{price}} / request", + "按次 {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Per request {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "模型价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "Model price: {{symbol}}{{price}} * {{ratioType}}: {{ratio}} = {{symbol}}{{total}}", + "按次:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "Per request: {{symbol}}{{price}} * {{ratioType}}: {{ratio}} = {{symbol}}{{total}}", "模型价格:{{symbol}}{{price}} / 次": "Model price: {{symbol}}{{price}} / request", - "输入 {{price}} / 1M tokens": "Input {{price}} / 1M tokens", + "按次:{{symbol}}{{price}}": "Per request: {{symbol}}{{price}}", "模型倍率": "Model ratio", "模型倍率 {{modelRatio}}": "Model ratio {{modelRatio}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}}": "Model ratio {{modelRatio}}, cache ratio {{cacheRatio}}, completion ratio {{completionRatio}}, {{ratioType}} {{ratio}}", @@ -1997,7 +1996,7 @@ "渠道": "Channel", "渠道 ID": "Channel ID", "渠道ID,名称,密钥,API地址": "Channel ID, name, key, Base URL", - "渠道亲和性": "", + "渠道亲和性": "Channel affinity", "渠道亲和性:上游缓存命中": "", "渠道亲和性会基于从请求上下文或 JSON Body 提取的 Key,优先复用上一次成功的渠道。": "", "渠道优先级": "Channel Priority", @@ -2099,7 +2098,7 @@ "用户账户管理": "User account management", "用时/首字": "Time/first word", "由全站货币展示设置统一控制": "Controlled by the site-wide currency display settings", - "由订阅抵扣": "", + "由订阅抵扣": "Deducted by subscription", "界面语言和其他个人偏好": "Interface language and other personal preferences", "留空使用系统临时目录": "Leave empty to use system temp directory", "留空则使用账号绑定的邮箱": "If left blank, the email address bound to the account will be used", @@ -2360,8 +2359,6 @@ "缓存价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存倍率: {{cacheRatio}})": "Cache price: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (Cache ratio: {{cacheRatio}})", "缓存读取价格:{{symbol}}{{price}} / 1M tokens": "Cache read price: {{symbol}}{{price}} / 1M tokens", "缓存读取价格 {{symbol}}{{price}} / 1M tokens": "Cache read price {{symbol}}{{price}} / 1M tokens", - "缓存读取 {{price}}": "Cache read {{price}}", - "缓存读取 {{price}}": "Cache read {{price}}", "缓存倍率": "Cache ratio", "缓存倍率 {{cacheRatio}}": "Cache ratio {{cacheRatio}}", "缓存写": "Cache Write", @@ -2371,12 +2368,6 @@ "缓存创建: 1h {{cacheCreationRatio1h}}": "Cache creation: 1h {{cacheCreationRatio1h}}", "缓存创建: 5m {{cacheCreationRatio5m}}": "Cache creation: 5m {{cacheCreationRatio5m}}", "缓存创建: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Cache creation: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", - "缓存创建 {{price}}": "Cache creation {{price}}", - "5m缓存创建 {{price}}": "5m cache creation {{price}}", - "1h缓存创建 {{price}}": "1h cache creation {{price}}", - "缓存创建 {{price}}": "Cache creation {{price}}", - "5m缓存创建 {{price}}": "5m cache creation {{price}}", - "1h缓存创建 {{price}}": "1h cache creation {{price}}", "缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存创建倍率: {{cacheCreationRatio}})": "Cache creation price: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (Cache creation ratio: {{cacheCreationRatio}})", "缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Cache creation price: {{symbol}}{{price}} / 1M tokens", "缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Cache creation price {{symbol}}{{price}} / 1M tokens", @@ -2510,7 +2501,6 @@ "输入与缓存价格合计 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Input and cache pricing subtotal * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "补全价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "Completion price: {{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (Completion ratio: {{completionRatio}})", "补全价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens": "Completion price: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens", - "补全价格 {{symbol}}{{price}} / 1M tokens": "Completion price {{symbol}}{{price}} / 1M tokens", "补全倍率": "Completion ratio", "补全倍率值": "Completion Ratio Value", "补单": "Complete Order", @@ -2521,7 +2511,7 @@ "覆盖模式:将完全替换现有的所有密钥": "Overwrite mode: completely replace all existing keys", "覆盖模板": "", "覆盖现有密钥": "Overwrite existing key", - "规则": "", + "规则": "Rule", "规则 JSON": "", "规则 JSON 格式不正确": "", "规则 ttl_seconds 为 0 时使用。0 表示使用后端默认 TTL:3600 秒。": "", @@ -2551,7 +2541,7 @@ "订阅套餐": "Subscription Plans", "订阅套餐管理": "Subscription Plan Management", "订阅实例": "", - "订阅抵扣": "", + "订阅抵扣": "Subscription deduction", "订阅管理": "Subscription Management", "订阅结算": "", "订阅说明": "", @@ -2942,7 +2932,7 @@ "进度": "Progress", "进行中": "Ongoing", "进行该操作时,可能导致渠道访问错误,请仅在数据库出现问题时使用": "When performing this operation, it may cause channel access errors. Please only use it when there is a problem with the database.", - "违规扣费": "", + "违规扣费": "Violation deduction", "违规扣费金额": "Violation deduction amount", "连接保活设置": "Connection Keep-alive Settings", "连接已断开": "Connection Disconnected", @@ -3292,12 +3282,33 @@ "音频输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * 音频补全倍率 {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Audio output: {{tokens}} / 1M * model ratio {{modelRatio}} * audio ratio {{audioRatio}} * audio completion ratio {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "合计:文字部分 {{textTotal}} + 音频部分 {{audioTotal}} = {{total}}": "Total: text {{textTotal}} + audio {{audioTotal}} = {{total}}", "模型倍率 {{modelRatio}},输出倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},{{ratioType}} {{ratio}}": "Model ratio {{modelRatio}}, output ratio {{completionRatio}}, cache ratio {{cacheRatio}}, {{ratioType}} {{ratio}}", - "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Cache creation ratio 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", "缓存读取:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Cache read: {{tokens}} / 1M * model ratio {{modelRatio}} * cache ratio {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存创建倍率 {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Cache creation: {{tokens}} / 1M * model ratio {{modelRatio}} * cache creation ratio {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "5m缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 5m缓存创建倍率 {{cacheCreationRatio5m}} * {{ratioType}} {{ratio}} = {{amount}}": "5m cache creation: {{tokens}} / 1M * model ratio {{modelRatio}} * 5m cache creation ratio {{cacheCreationRatio5m}} * {{ratioType}} {{ratio}} = {{amount}}", "1h缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 1h缓存创建倍率 {{cacheCreationRatio1h}} * {{ratioType}} {{ratio}} = {{amount}}": "1h cache creation: {{tokens}} / 1M * model ratio {{modelRatio}} * 1h cache creation ratio {{cacheCreationRatio1h}} * {{ratioType}} {{ratio}} = {{amount}}", "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 输出倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Output: {{tokens}} / 1M * model ratio {{modelRatio}} * output ratio {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "空": "Empty" + "空": "Empty", + "{{ratioType}} {{ratio}}x": "{{ratioType}} {{ratio}}x", + "模型价格:{{symbol}}{{price}}": "Model price: {{symbol}}{{price}}", + "模型价格 {{price}}": "Model price {{price}}", + "缓存读 {{price}} / 1M tokens": "Cache read {{price}} / 1M tokens", + "5m缓存创建 {{price}} / 1M tokens": "5m cache creation {{price}} / 1M tokens", + "1h缓存创建 {{price}} / 1M tokens": "1h cache creation {{price}} / 1M tokens", + "缓存创建 {{price}} / 1M tokens": "Cache creation {{price}} / 1M tokens", + "图片输入 {{price}} / 1M tokens": "Image input {{price}} / 1M tokens", + "输入 {{price}} / 1M tokens": "Input {{price}} / 1M tokens", + "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "5m cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "1h cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}": "(Input {{nonImageInput}} tokens + Image input {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}", + "图片输入价格:{{symbol}}{{total}} / 1M tokens": "Image input price: {{symbol}}{{total}} / 1M tokens", + "文字提示 {{input}} tokens / 1M tokens * {{symbol}}{{textInputPrice}} + 文字补全 {{completion}} tokens / 1M tokens * {{symbol}}{{textCompPrice}} + 音频提示 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{audioCompletion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Text prompt {{input}} tokens / 1M tokens * {{symbol}}{{textInputPrice}} + Text completion {{completion}} tokens / 1M tokens * {{symbol}}{{textCompPrice}} + Audio prompt {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + Audio completion {{audioCompletion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "缓存读取价格:{{symbol}}{{total}} / 1M tokens": "Cache read price: {{symbol}}{{total}} / 1M tokens", + "补全 {{completion}} tokens * 输出倍率 {{completionRatio}}": "Completion {{completion}} tokens * Output ratio {{completionRatio}}", + "补全倍率 {{completionRatio}}": "Completion ratio {{completionRatio}}", + "输入价格:{{symbol}}{{price}} / 1M tokens": "Input Price: {{symbol}}{{price}} / 1M tokens", + "输出价格 {{symbol}}{{price}} / 1M tokens": "Output Price {{symbol}}{{price}} / 1M tokens", + "输出价格:{{symbol}}{{price}} / 1M tokens": "Output Price: {{symbol}}{{price}} / 1M tokens", + "输出价格:{{symbol}}{{total}} / 1M tokens": "Output Price: {{symbol}}{{total}} / 1M tokens" } } diff --git a/web/src/i18n/locales/fr.json b/web/src/i18n/locales/fr.json index 845c3a38..54ecd673 100644 --- a/web/src/i18n/locales/fr.json +++ b/web/src/i18n/locales/fr.json @@ -21,7 +21,6 @@ "(输入 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "(Entrée {{input}} tokens / 1M tokens * {{symbol}}{{price}}", "(输入 {{nonAudioInput}} tokens / 1M tokens * {{symbol}}{{price}} + 音频输入 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioPrice}}": "(Entrée {{nonAudioInput}} tokens / 1M tokens * {{symbol}}{{price}} + Entrée audio {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioPrice}}", "(输入 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}}": "(Entrée {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + Cache {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}}", - "(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens * {{imageRatio}} / 1M tokens * {{symbol}}{{price}}": "(Entrée {{nonImageInput}} tokens + Entrée image {{imageInput}} tokens * {{imageRatio}} / 1M tokens * {{symbol}}{{price}}", "[最多请求次数]和[最多请求完成次数]的最大值为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}", @@ -155,10 +154,10 @@ "JSON格式错误": "Erreur de format JSON", "JSON编辑": "Édition JSON", "JSON解析错误:": "Erreur d'analyse JSON :", - "Key": "", + "Key": "Key", "Key 或 Path": "", "Key 指纹": "", - "Key 摘要": "", + "Key 摘要": "Résumé de Key", "Key 来源": "", "Key 来源类型": "", "Linux DO Client ID": "ID client Linux DO", @@ -1366,7 +1365,7 @@ "打开 CC Switch": "", "打开侧边栏": "Ouvrir la barre latérale", "打开授权页面": "", - "扣费": "", + "扣费": "Déduction", "执行 GC": "", "执行中": "En cours", "扫描二维码": "Scanner le code QR", @@ -1782,6 +1781,7 @@ "模型价格": "Prix du modèle", "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}": "Prix du modèle {{symbol}}{{price}}, {{ratioType}} {{ratio}}", "模型价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "Prix du modèle : {{symbol}}{{price}} * {{ratioType}} : {{ratio}} = {{symbol}}{{total}}", + "按次:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "Par requête : {{symbol}}{{price}} * {{ratioType}} : {{ratio}} = {{symbol}}{{total}}", "模型倍率": "Ratio", "模型倍率 {{modelRatio}}": "Ratio du modèle {{modelRatio}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}}": "Ratio du modèle {{modelRatio}}, ratio de cache {{cacheRatio}}, ratio de complétion {{completionRatio}}, {{ratioType}} {{ratio}}", @@ -1976,7 +1976,7 @@ "渠道": "Canal", "渠道 ID": "ID du Canal", "渠道ID,名称,密钥,API地址": "ID du canal, nom, clé, URL de base", - "渠道亲和性": "", + "渠道亲和性": "Affinité de canal", "渠道亲和性:上游缓存命中": "", "渠道亲和性会基于从请求上下文或 JSON Body 提取的 Key,优先复用上一次成功的渠道。": "", "渠道优先级": "Priorité du canal", @@ -2075,7 +2075,7 @@ "用户账户管理": "Comptes utilisateurs", "用时/首字": "Temps/premier mot", "由全站货币展示设置统一控制": "Contrôlé par les paramètres globaux d'affichage des devises", - "由订阅抵扣": "", + "由订阅抵扣": "Déduit par l'abonnement", "界面语言和其他个人偏好": "", "留空使用系统临时目录": "", "留空则使用账号绑定的邮箱": "Si ce champ est laissé vide, l'adresse e-mail liée au compte sera utilisée", @@ -2348,7 +2348,7 @@ "缓存创建倍率 {{cacheCreationRatio}}": "Ratio de création de cache {{cacheCreationRatio}}", "缓存创建倍率 1h {{cacheCreationRatio1h}}": "Multiplicateur de création de cache 1h {{cacheCreationRatio1h}}", "缓存创建倍率 5m {{cacheCreationRatio5m}}": "Multiplicateur de création de cache 5m {{cacheCreationRatio5m}}", - "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Ratio de création de cache 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", + "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Ratio de création du cache 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", "缓存条目数": "", "缓存目录": "", "缓存目录磁盘空间": "", @@ -2471,7 +2471,7 @@ "覆盖模式:将完全替换现有的所有密钥": "Mode de remplacement : remplacera complètement toutes les clés existantes", "覆盖模板": "", "覆盖现有密钥": "Remplacer les clés existantes", - "规则": "", + "规则": "Règle", "规则 JSON": "", "规则 JSON 格式不正确": "", "规则 ttl_seconds 为 0 时使用。0 表示使用后端默认 TTL:3600 秒。": "", @@ -2501,7 +2501,7 @@ "订阅套餐": "Plans d'abonnement", "订阅套餐管理": "Gestion des plans d'abonnement", "订阅实例": "", - "订阅抵扣": "", + "订阅抵扣": "Déduction d'abonnement", "订阅管理": "Gestion des abonnements", "订阅结算": "", "订阅说明": "", @@ -2888,7 +2888,7 @@ "进度": "calendrier", "进行中": "En cours", "进行该操作时,可能导致渠道访问错误,请仅在数据库出现问题时使用": "Lors de cette opération, cela peut entraîner des erreurs d'accès au canal. Veuillez ne l'utiliser que lorsqu'il y a un problème avec la base de données.", - "违规扣费": "", + "违规扣费": "Déduction pour violation", "违规扣费金额": "Montant de la déduction de violation", "连接保活设置": "Maintien connexion", "连接已断开": "Connexion interrompue", @@ -3208,7 +3208,9 @@ "计费显示模式": "Mode d'affichage de la facturation", "价格模式(默认)": "Mode prix (par défaut)", "模型价格 {{symbol}}{{price}} / 次": "Prix du modèle {{symbol}}{{price}} / requête", + "按次 {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Par requête {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "模型价格:{{symbol}}{{price}} / 次": "Prix du modèle : {{symbol}}{{price}} / requête", + "按次:{{symbol}}{{price}}": "Par requête : {{symbol}}{{price}}", "实际结算金额:{{symbol}}{{total}}(已包含分组价格调整)": "Montant facturé réel : {{symbol}}{{total}} (ajustement tarifaire de groupe inclus)", "缓存读取价格:{{symbol}}{{price}} / 1M tokens": "Prix de lecture du cache : {{symbol}}{{price}} / 1M tokens", "缓存读取价格 {{symbol}}{{price}} / 1M tokens": "Prix de lecture du cache {{symbol}}{{price}} / 1M tokens", @@ -3221,7 +3223,6 @@ "图片输入价格:{{symbol}}{{price}} / 1M tokens": "Prix d'entrée image : {{symbol}}{{price}} / 1M tokens", "图片输入价格 {{symbol}}{{price}} / 1M tokens": "Prix d'entrée image {{symbol}}{{price}} / 1M tokens", "输入价格 {{symbol}}{{price}} / 1M tokens": "Prix d'entrée {{symbol}}{{price}} / 1M tokens", - "补全价格 {{symbol}}{{price}} / 1M tokens": "Prix de complétion {{symbol}}{{price}} / 1M tokens", "音频输入价格:{{symbol}}{{price}} / 1M tokens": "Prix d'entrée audio : {{symbol}}{{price}} / 1M tokens", "音频补全价格:{{symbol}}{{price}} / 1M tokens": "Prix de complétion audio : {{symbol}}{{price}} / 1M tokens", "Web 搜索调用 {{webSearchCallCount}} 次": "Recherche Web appelée {{webSearchCallCount}} fois", @@ -3242,12 +3243,35 @@ "音频输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * 音频补全倍率 {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Sortie audio : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * ratio audio {{audioRatio}} * ratio de complétion audio {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "合计:文字部分 {{textTotal}} + 音频部分 {{audioTotal}} = {{total}}": "Total : partie texte {{textTotal}} + partie audio {{audioTotal}} = {{total}}", "模型倍率 {{modelRatio}},输出倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},{{ratioType}} {{ratio}}": "Ratio du modèle {{modelRatio}}, ratio de sortie {{completionRatio}}, ratio du cache {{cacheRatio}}, {{ratioType}} {{ratio}}", - "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Ratio de création du cache 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", "缓存读取:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Lecture du cache : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * ratio du cache {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存创建倍率 {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Création du cache : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * ratio de création du cache {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "5m缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 5m缓存创建倍率 {{cacheCreationRatio5m}} * {{ratioType}} {{ratio}} = {{amount}}": "Création du cache 5m : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * ratio de création du cache 5m {{cacheCreationRatio5m}} * {{ratioType}} {{ratio}} = {{amount}}", "1h缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 1h缓存创建倍率 {{cacheCreationRatio1h}} * {{ratioType}} {{ratio}} = {{amount}}": "Création du cache 1h : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * ratio de création du cache 1h {{cacheCreationRatio1h}} * {{ratioType}} {{ratio}} = {{amount}}", "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 输出倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Sortie : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * ratio de sortie {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "空": "Vide" + "空": "Vide", + "{{ratioType}} {{ratio}}x": "{{ratioType}} {{ratio}}x", + "模型价格:{{symbol}}{{price}}": "Prix du modèle : {{symbol}}{{price}}", + "模型价格 {{price}}": "Prix du modèle {{price}}", + "缓存读 {{price}} / 1M tokens": "Lecture du cache {{price}} / 1M tokens", + "5m缓存创建 {{price}} / 1M tokens": "Création de cache 5m {{price}} / 1M tokens", + "1h缓存创建 {{price}} / 1M tokens": "Création de cache 1h {{price}} / 1M tokens", + "缓存创建 {{price}} / 1M tokens": "Création de cache {{price}} / 1M tokens", + "图片输入 {{price}} / 1M tokens": "Entrée image {{price}} / 1M tokens", + "输入 {{price}} / 1M tokens": "Entrée {{price}} / 1M tokens", + "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Cache {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Création de cache {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Création de cache 5m {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Création de cache 1h {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}": "(Entrée {{nonImageInput}} tokens + Entrée image {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}", + "图片输入价格:{{symbol}}{{total}} / 1M tokens": "Prix d'entrée image : {{symbol}}{{total}} / 1M tokens", + "文字提示 {{input}} tokens / 1M tokens * {{symbol}}{{textInputPrice}} + 文字补全 {{completion}} tokens / 1M tokens * {{symbol}}{{textCompPrice}} + 音频提示 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{audioCompletion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Prompt texte {{input}} tokens / 1M tokens * {{symbol}}{{textInputPrice}} + Complétion texte {{completion}} tokens / 1M tokens * {{symbol}}{{textCompPrice}} + Prompt audio {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + Complétion audio {{audioCompletion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "模型价格 {{symbol}}{{price}} / 次 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Prix du modèle {{symbol}}{{price}} / requête * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "缓存读取价格:{{symbol}}{{total}} / 1M tokens": "Prix de lecture du cache : {{symbol}}{{total}} / 1M tokens", + "补全 {{completion}} tokens * 输出倍率 {{completionRatio}}": "Complétion {{completion}} tokens * Ratio de sortie {{completionRatio}}", + "补全倍率 {{completionRatio}}": "Ratio de complétion {{completionRatio}}", + "输入价格:{{symbol}}{{price}} / 1M tokens": "Prix d'entrée : {{symbol}}{{price}} / 1M tokens", + "输出价格 {{symbol}}{{price}} / 1M tokens": "Prix de sortie {{symbol}}{{price}} / 1M tokens", + "输出价格:{{symbol}}{{price}} / 1M tokens": "Prix de sortie : {{symbol}}{{price}} / 1M tokens", + "输出价格:{{symbol}}{{total}} / 1M tokens": "Prix de sortie : {{symbol}}{{total}} / 1M tokens" } } diff --git a/web/src/i18n/locales/ja.json b/web/src/i18n/locales/ja.json index 5415694b..e7e1ff46 100644 --- a/web/src/i18n/locales/ja.json +++ b/web/src/i18n/locales/ja.json @@ -17,7 +17,6 @@ "(输入 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "(入力 {{input}} tokens / 1M tokens * {{symbol}}{{price}}", "(输入 {{nonAudioInput}} tokens / 1M tokens * {{symbol}}{{price}} + 音频输入 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioPrice}}": "(入力 {{nonAudioInput}} tokens / 1M tokens * {{symbol}}{{price}} + オーディオ入力 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioPrice}}", "(输入 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}}": "(入力 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + キャッシュ {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}}", - "(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens * {{imageRatio}} / 1M tokens * {{symbol}}{{price}}": "(入力 {{nonImageInput}} tokens + 画像入力 {{imageInput}} tokens * {{imageRatio}} / 1M tokens * {{symbol}}{{price}}", "[最多请求次数]和[最多请求完成次数]的最大值为2147483647。": "[最大リクエスト数]と[最大成功リクエスト数]の最大値は2147483647です", "[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。": "[最大リクエスト数]は0以上、[最大成功リクエスト数]は1以上である必要があります", "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", @@ -151,10 +150,10 @@ "JSON格式错误": "JSON形式エラー", "JSON编辑": "JSON編集", "JSON解析错误:": "JSONの解析エラー:", - "Key": "", + "Key": "Key", "Key 或 Path": "", "Key 指纹": "", - "Key 摘要": "", + "Key 摘要": "Key 要約", "Key 来源": "", "Key 来源类型": "", "Linux DO Client ID": "Linux DO Client ID", @@ -1349,7 +1348,7 @@ "打开 CC Switch": "", "打开侧边栏": "サイドバーを展開", "打开授权页面": "", - "扣费": "", + "扣费": "課金", "执行 GC": "", "执行中": "実行中", "扫描二维码": "QRコードスキャン", @@ -1765,6 +1764,7 @@ "模型价格": "モデル料金", "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}": "モデル料金 {{symbol}}{{price}}、{{ratioType}} {{ratio}}", "模型价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "モデル料金:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}", + "按次:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "リクエストごと:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}", "模型倍率": "モデル倍率", "模型倍率 {{modelRatio}}": "Model ratio {{modelRatio}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}}": "モデル倍率 {{modelRatio}}、キャッシュ倍率 {{cacheRatio}}、補完倍率 {{completionRatio}}、{{ratioType}} {{ratio}}", @@ -1959,7 +1959,7 @@ "渠道": "チャネル", "渠道 ID": "チャネルID", "渠道ID,名称,密钥,API地址": "チャネルID\\名称\\キー\\ベースURL", - "渠道亲和性": "", + "渠道亲和性": "チャネル親和性", "渠道亲和性:上游缓存命中": "", "渠道亲和性会基于从请求上下文或 JSON Body 提取的 Key,优先复用上一次成功的渠道。": "", "渠道优先级": "チャネル優先度", @@ -2058,7 +2058,7 @@ "用户账户管理": "ユーザーアカウント管理", "用时/首字": "所要時間 / 初回トークン", "由全站货币展示设置统一控制": "サイト全体の通貨表示設定で統一して管理", - "由订阅抵扣": "", + "由订阅抵扣": "サブスクリプションで相殺", "界面语言和其他个人偏好": "", "留空使用系统临时目录": "", "留空则使用账号绑定的邮箱": "未入力の場合、アカウントに登録されているメールアドレスが使用されます", @@ -2329,7 +2329,7 @@ "缓存创建倍率 {{cacheCreationRatio}}": "Cache creation ratio {{cacheCreationRatio}}", "缓存创建倍率 1h {{cacheCreationRatio1h}}": "キャッシュ作成倍率 1h {{cacheCreationRatio1h}}", "缓存创建倍率 5m {{cacheCreationRatio5m}}": "キャッシュ作成倍率 5m {{cacheCreationRatio5m}}", - "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Cache creation ratio 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", + "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "キャッシュ作成倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", "缓存条目数": "", "缓存目录": "", "缓存目录磁盘空间": "", @@ -2452,7 +2452,7 @@ "覆盖模式:将完全替换现有的所有密钥": "上書きモード:既存のすべてのAPIキーを完全に置き換えます", "覆盖模板": "", "覆盖现有密钥": "既存のAPIキーを上書き", - "规则": "", + "规则": "ルール", "规则 JSON": "", "规则 JSON 格式不正确": "", "规则 ttl_seconds 为 0 时使用。0 表示使用后端默认 TTL:3600 秒。": "", @@ -2482,7 +2482,7 @@ "订阅套餐": "サブスクリプションプラン", "订阅套餐管理": "サブスクリプションプラン管理", "订阅实例": "", - "订阅抵扣": "", + "订阅抵扣": "サブスクリプション控除", "订阅管理": "サブスクリプション管理", "订阅结算": "", "订阅说明": "", @@ -2869,7 +2869,7 @@ "进度": "進捗", "进行中": "進行中", "进行该操作时,可能导致渠道访问错误,请仅在数据库出现问题时使用": "この操作の実行時、チャネルへのアクセスエラーが発生する可能性があります。データベースに問題がある場合のみ使用してください", - "违规扣费": "", + "违规扣费": "違反課金", "违规扣费金额": "違反課金金額", "连接保活设置": "接続キープアライブ設定", "连接已断开": "接続が切断されました", @@ -3189,7 +3189,9 @@ "计费显示模式": "課金表示モード", "价格模式(默认)": "価格モード(デフォルト)", "模型价格 {{symbol}}{{price}} / 次": "モデル価格 {{symbol}}{{price}} / リクエスト", + "按次 {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "リクエストごと {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "模型价格:{{symbol}}{{price}} / 次": "モデル価格:{{symbol}}{{price}} / リクエスト", + "按次:{{symbol}}{{price}}": "リクエストごと:{{symbol}}{{price}}", "实际结算金额:{{symbol}}{{total}}(已包含分组价格调整)": "実際の請求額:{{symbol}}{{total}}(グループ価格調整込み)", "缓存读取价格:{{symbol}}{{price}} / 1M tokens": "キャッシュ読み取り価格:{{symbol}}{{price}} / 1M tokens", "缓存读取价格 {{symbol}}{{price}} / 1M tokens": "キャッシュ読み取り価格 {{symbol}}{{price}} / 1M tokens", @@ -3202,7 +3204,6 @@ "图片输入价格:{{symbol}}{{price}} / 1M tokens": "画像入力価格:{{symbol}}{{price}} / 1M tokens", "图片输入价格 {{symbol}}{{price}} / 1M tokens": "画像入力価格 {{symbol}}{{price}} / 1M tokens", "输入价格 {{symbol}}{{price}} / 1M tokens": "入力価格 {{symbol}}{{price}} / 1M tokens", - "补全价格 {{symbol}}{{price}} / 1M tokens": "補完価格 {{symbol}}{{price}} / 1M tokens", "音频输入价格:{{symbol}}{{price}} / 1M tokens": "音声入力価格:{{symbol}}{{price}} / 1M tokens", "音频补全价格:{{symbol}}{{price}} / 1M tokens": "音声補完価格:{{symbol}}{{price}} / 1M tokens", "Web 搜索调用 {{webSearchCallCount}} 次": "Web 検索呼び出し {{webSearchCallCount}} 回", @@ -3223,12 +3224,35 @@ "音频输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * 音频补全倍率 {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "音声出力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * 音声倍率 {{audioRatio}} * 音声補完倍率 {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "合计:文字部分 {{textTotal}} + 音频部分 {{audioTotal}} = {{total}}": "合計: テキスト部分 {{textTotal}} + 音声部分 {{audioTotal}} = {{total}}", "模型倍率 {{modelRatio}},输出倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},{{ratioType}} {{ratio}}": "モデル倍率 {{modelRatio}}、出力倍率 {{completionRatio}}、キャッシュ倍率 {{cacheRatio}}、{{ratioType}} {{ratio}}", - "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "キャッシュ作成倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", "缓存读取:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "キャッシュ読み取り: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * キャッシュ倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存创建倍率 {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "キャッシュ作成: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * キャッシュ作成倍率 {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "5m缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 5m缓存创建倍率 {{cacheCreationRatio5m}} * {{ratioType}} {{ratio}} = {{amount}}": "5m キャッシュ作成: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * 5m キャッシュ作成倍率 {{cacheCreationRatio5m}} * {{ratioType}} {{ratio}} = {{amount}}", "1h缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 1h缓存创建倍率 {{cacheCreationRatio1h}} * {{ratioType}} {{ratio}} = {{amount}}": "1h キャッシュ作成: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * 1h キャッシュ作成倍率 {{cacheCreationRatio1h}} * {{ratioType}} {{ratio}} = {{amount}}", "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 输出倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "出力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * 出力倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "空": "空" + "空": "空", + "{{ratioType}} {{ratio}}x": "{{ratioType}} {{ratio}}x", + "模型价格:{{symbol}}{{price}}": "モデル価格:{{symbol}}{{price}}", + "模型价格 {{price}}": "モデル価格 {{price}}", + "缓存读 {{price}} / 1M tokens": "キャッシュ読み取り {{price}} / 1M tokens", + "5m缓存创建 {{price}} / 1M tokens": "5m キャッシュ作成 {{price}} / 1M tokens", + "1h缓存创建 {{price}} / 1M tokens": "1h キャッシュ作成 {{price}} / 1M tokens", + "缓存创建 {{price}} / 1M tokens": "キャッシュ作成 {{price}} / 1M tokens", + "图片输入 {{price}} / 1M tokens": "画像入力 {{price}} / 1M tokens", + "输入 {{price}} / 1M tokens": "入力 {{price}} / 1M tokens", + "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "キャッシュ {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "キャッシュ作成 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "5m キャッシュ作成 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "1h キャッシュ作成 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}": "(入力 {{nonImageInput}} tokens + 画像入力 {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}", + "图片输入价格:{{symbol}}{{total}} / 1M tokens": "画像入力価格:{{symbol}}{{total}} / 1M tokens", + "文字提示 {{input}} tokens / 1M tokens * {{symbol}}{{textInputPrice}} + 文字补全 {{completion}} tokens / 1M tokens * {{symbol}}{{textCompPrice}} + 音频提示 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{audioCompletion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "テキストプロンプト {{input}} tokens / 1M tokens * {{symbol}}{{textInputPrice}} + テキスト補完 {{completion}} tokens / 1M tokens * {{symbol}}{{textCompPrice}} + 音声プロンプト {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音声補完 {{audioCompletion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "模型价格 {{symbol}}{{price}} / 次 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "モデル価格 {{symbol}}{{price}} / リクエスト * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "缓存读取价格:{{symbol}}{{total}} / 1M tokens": "キャッシュ読み取り価格:{{symbol}}{{total}} / 1M tokens", + "补全 {{completion}} tokens * 输出倍率 {{completionRatio}}": "補完 {{completion}} tokens * 出力倍率 {{completionRatio}}", + "补全倍率 {{completionRatio}}": "補完倍率 {{completionRatio}}", + "输入价格:{{symbol}}{{price}} / 1M tokens": "入力価格:{{symbol}}{{price}} / 1M tokens", + "输出价格 {{symbol}}{{price}} / 1M tokens": "補完料金 {{symbol}}{{price}} / 1M tokens", + "输出价格:{{symbol}}{{price}} / 1M tokens": "補完料金:{{symbol}}{{price}} / 1M tokens", + "输出价格:{{symbol}}{{total}} / 1M tokens": "補完料金:{{symbol}}{{total}} / 1M tokens" } } diff --git a/web/src/i18n/locales/ru.json b/web/src/i18n/locales/ru.json index 1799f2a0..447ad3bb 100644 --- a/web/src/i18n/locales/ru.json +++ b/web/src/i18n/locales/ru.json @@ -24,7 +24,6 @@ "(输入 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "(Ввод {{input}} токенов / 1M токенов * {{symbol}}{{price}}", "(输入 {{nonAudioInput}} tokens / 1M tokens * {{symbol}}{{price}} + 音频输入 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioPrice}}": "(Ввод {{nonAudioInput}} токенов / 1M токенов * {{symbol}}{{price}} + аудио ввод {{audioInput}} токенов / 1M токенов * {{symbol}}{{audioPrice}}", "(输入 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}}": "(Ввод {{nonCacheInput}} токенов / 1M токенов * {{symbol}}{{price}} + кэш {{cacheInput}} токенов / 1M токенов * {{symbol}}{{cachePrice}}", - "(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens * {{imageRatio}} / 1M tokens * {{symbol}}{{price}}": "(Ввод {{nonImageInput}} токенов + ввод изображения {{imageInput}} токенов * {{imageRatio}} / 1M токенов * {{symbol}}{{price}}", "[最多请求次数]和[最多请求完成次数]的最大值为2147483647。": "[Максимальное количество запросов] и [Максимальное количество выполненных запросов] имеют максимальное значение 2147483647.", "[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。": "[Максимальное количество запросов] должно быть больше или равно 0, [Максимальное количество выполненных запросов] должно быть больше или равно 1.", "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", @@ -158,10 +157,10 @@ "JSON格式错误": "Ошибка формата JSON", "JSON编辑": "Редактирование JSON", "JSON解析错误:": "Ошибка парсинга JSON:", - "Key": "", + "Key": "Key", "Key 或 Path": "", "Key 指纹": "", - "Key 摘要": "", + "Key 摘要": "Сводка Key", "Key 来源": "", "Key 来源类型": "", "Linux DO Client ID": "ID клиента Linux DO", @@ -1378,7 +1377,7 @@ "打开 CC Switch": "", "打开侧边栏": "Открыть боковую панель", "打开授权页面": "", - "扣费": "", + "扣费": "Списание", "执行 GC": "", "执行中": "Выполняется", "扫描二维码": "Сканировать QR-код", @@ -1794,6 +1793,7 @@ "模型价格": "Цена модели", "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}": "Цена модели {{symbol}}{{price}}, {{ratioType}} {{ratio}}", "模型价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "Цена модели: {{symbol}}{{price}} * {{ratioType}}: {{ratio}} = {{symbol}}{{total}}", + "按次:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "За запрос: {{symbol}}{{price}} * {{ratioType}}: {{ratio}} = {{symbol}}{{total}}", "模型倍率": "Коэффициент модели", "模型倍率 {{modelRatio}}": "Коэффициент модели {{modelRatio}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}}": "Коэффициент модели {{modelRatio}}, коэффициент кэша {{cacheRatio}}, коэффициент вывода {{completionRatio}}, {{ratioType}} {{ratio}}", @@ -1988,7 +1988,7 @@ "渠道": "Канал", "渠道 ID": "ID канала", "渠道ID,名称,密钥,API地址": "ID Канала, имя, Токен, адрес API", - "渠道亲和性": "", + "渠道亲和性": "Аффинитет канала", "渠道亲和性:上游缓存命中": "", "渠道亲和性会基于从请求上下文或 JSON Body 提取的 Key,优先复用上一次成功的渠道。": "", "渠道优先级": "Приоритет канала", @@ -2087,7 +2087,7 @@ "用户账户管理": "Управление аккаунтами пользователей", "用时/首字": "Время/первый символ", "由全站货币展示设置统一控制": "Управляется глобальными настройками отображения валюты", - "由订阅抵扣": "", + "由订阅抵扣": "Списано по подписке", "界面语言和其他个人偏好": "", "留空使用系统临时目录": "", "留空则使用账号绑定的邮箱": "Если оставить пустым, будет использован email, привязанный к аккаунту", @@ -2485,7 +2485,7 @@ "覆盖模式:将完全替换现有的所有密钥": "Режим перезаписи: полностью заменит все существующие ключи", "覆盖模板": "", "覆盖现有密钥": "Перезаписать существующие ключи", - "规则": "", + "规则": "Правило", "规则 JSON": "", "规则 JSON 格式不正确": "", "规则 ttl_seconds 为 0 时使用。0 表示使用后端默认 TTL:3600 秒。": "", @@ -2515,7 +2515,7 @@ "订阅套餐": "Планы подписки", "订阅套餐管理": "Управление тарифами подписки", "订阅实例": "", - "订阅抵扣": "", + "订阅抵扣": "Списание по подписке", "订阅管理": "Управление подписками", "订阅结算": "", "订阅说明": "", @@ -2902,7 +2902,7 @@ "进度": "Прогресс", "进行中": "В процессе", "进行该操作时,可能导致渠道访问错误,请仅在数据库出现问题时使用": "При выполнении этой операции могут возникнуть ошибки доступа к каналам, используйте только при проблемах с базой данных", - "违规扣费": "", + "违规扣费": "Удержание за нарушение", "违规扣费金额": "Сумма удержания за нарушение", "连接保活设置": "Настройки поддержания соединения", "连接已断开": "Соединение разорвано", @@ -3222,7 +3222,9 @@ "计费显示模式": "Режим отображения тарификации", "价格模式(默认)": "Режим цен (по умолчанию)", "模型价格 {{symbol}}{{price}} / 次": "Цена модели {{symbol}}{{price}} / запрос", + "按次 {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "За запрос {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "模型价格:{{symbol}}{{price}} / 次": "Цена модели: {{symbol}}{{price}} / запрос", + "按次:{{symbol}}{{price}}": "За запрос: {{symbol}}{{price}}", "实际结算金额:{{symbol}}{{total}}(已包含分组价格调整)": "Фактическое списание: {{symbol}}{{total}} (включая групповую ценовую корректировку)", "缓存读取价格:{{symbol}}{{price}} / 1M tokens": "Цена чтения кеша: {{symbol}}{{price}} / 1M tokens", "缓存读取价格 {{symbol}}{{price}} / 1M tokens": "Цена чтения кеша {{symbol}}{{price}} / 1M tokens", @@ -3235,7 +3237,6 @@ "图片输入价格:{{symbol}}{{price}} / 1M tokens": "Цена входного изображения: {{symbol}}{{price}} / 1M tokens", "图片输入价格 {{symbol}}{{price}} / 1M tokens": "Цена входного изображения {{symbol}}{{price}} / 1M tokens", "输入价格 {{symbol}}{{price}} / 1M tokens": "Цена ввода {{symbol}}{{price}} / 1M tokens", - "补全价格 {{symbol}}{{price}} / 1M tokens": "Цена завершения {{symbol}}{{price}} / 1M tokens", "音频输入价格:{{symbol}}{{price}} / 1M tokens": "Цена входного аудио: {{symbol}}{{price}} / 1M tokens", "音频补全价格:{{symbol}}{{price}} / 1M tokens": "Цена завершения аудио: {{symbol}}{{price}} / 1M tokens", "Web 搜索调用 {{webSearchCallCount}} 次": "Web-поиск вызван {{webSearchCallCount}} раз", @@ -3256,12 +3257,35 @@ "音频输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * 音频补全倍率 {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Аудиовывод: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * аудио-коэффициент {{audioRatio}} * коэффициент аудиозавершения {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "合计:文字部分 {{textTotal}} + 音频部分 {{audioTotal}} = {{total}}": "Итого: текстовая часть {{textTotal}} + аудиочасть {{audioTotal}} = {{total}}", "模型倍率 {{modelRatio}},输出倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},{{ratioType}} {{ratio}}": "Коэффициент модели {{modelRatio}}, коэффициент вывода {{completionRatio}}, коэффициент кэша {{cacheRatio}}, {{ratioType}} {{ratio}}", - "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Коэффициент создания кэша 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", "缓存读取:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Чтение кэша: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * коэффициент кэша {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存创建倍率 {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Создание кэша: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * коэффициент создания кэша {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "5m缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 5m缓存创建倍率 {{cacheCreationRatio5m}} * {{ratioType}} {{ratio}} = {{amount}}": "Создание кэша 5m: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * коэффициент создания кэша 5m {{cacheCreationRatio5m}} * {{ratioType}} {{ratio}} = {{amount}}", "1h缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 1h缓存创建倍率 {{cacheCreationRatio1h}} * {{ratioType}} {{ratio}} = {{amount}}": "Создание кэша 1h: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * коэффициент создания кэша 1h {{cacheCreationRatio1h}} * {{ratioType}} {{ratio}} = {{amount}}", "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 输出倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Вывод: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * коэффициент вывода {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "空": "Пусто" + "空": "Пусто", + "{{ratioType}} {{ratio}}x": "{{ratioType}} {{ratio}}x", + "模型价格:{{symbol}}{{price}}": "Цена модели: {{symbol}}{{price}}", + "模型价格 {{price}}": "Цена модели {{price}}", + "缓存读 {{price}} / 1M tokens": "Чтение кеша {{price}} / 1M tokens", + "5m缓存创建 {{price}} / 1M tokens": "Создание кэша 5m {{price}} / 1M tokens", + "1h缓存创建 {{price}} / 1M tokens": "Создание кэша 1h {{price}} / 1M tokens", + "缓存创建 {{price}} / 1M tokens": "Создание кэша {{price}} / 1M tokens", + "图片输入 {{price}} / 1M tokens": "Ввод изображения {{price}} / 1M tokens", + "输入 {{price}} / 1M tokens": "Вход {{price}} / 1M tokens", + "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Кэш {{tokens}} токенов / 1M токенов * {{symbol}}{{price}}", + "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Создание кэша {{tokens}} токенов / 1M токенов * {{symbol}}{{price}}", + "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Создание кэша 5m {{tokens}} токенов / 1M токенов * {{symbol}}{{price}}", + "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Создание кэша 1h {{tokens}} токенов / 1M токенов * {{symbol}}{{price}}", + "(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}": "(Ввод {{nonImageInput}} токенов + ввод изображения {{imageInput}} токенов / 1M токенов * {{symbol}}{{price}}", + "图片输入价格:{{symbol}}{{total}} / 1M tokens": "Цена входного изображения: {{symbol}}{{total}} / 1M tokens", + "文字提示 {{input}} tokens / 1M tokens * {{symbol}}{{textInputPrice}} + 文字补全 {{completion}} tokens / 1M tokens * {{symbol}}{{textCompPrice}} + 音频提示 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{audioCompletion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Текстовый промпт {{input}} tokens / 1M tokens * {{symbol}}{{textInputPrice}} + Текстовое дополнение {{completion}} tokens / 1M tokens * {{symbol}}{{textCompPrice}} + Аудио промпт {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + Аудио дополнение {{audioCompletion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "模型价格 {{symbol}}{{price}} / 次 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Цена модели {{symbol}}{{price}} / запрос * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "缓存读取价格:{{symbol}}{{total}} / 1M tokens": "Цена чтения кеша: {{symbol}}{{total}} / 1M tokens", + "补全 {{completion}} tokens * 输出倍率 {{completionRatio}}": "Дополнение {{completion}} токенов * коэффициент вывода {{completionRatio}}", + "补全倍率 {{completionRatio}}": "Коэффициент вывода {{completionRatio}}", + "输入价格:{{symbol}}{{price}} / 1M tokens": "Цена ввода: {{symbol}}{{price}} / 1M tokens", + "输出价格 {{symbol}}{{price}} / 1M tokens": "Цена вывода {{symbol}}{{price}} / 1M tokens", + "输出价格:{{symbol}}{{price}} / 1M tokens": "Цена вывода: {{symbol}}{{price}} / 1M tokens", + "输出价格:{{symbol}}{{total}} / 1M tokens": "Цена вывода: {{symbol}}{{total}} / 1M tokens" } } diff --git a/web/src/i18n/locales/vi.json b/web/src/i18n/locales/vi.json index a1de3a46..e533237a 100644 --- a/web/src/i18n/locales/vi.json +++ b/web/src/i18n/locales/vi.json @@ -17,7 +17,6 @@ "(输入 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "(Đầu vào {{input}} tokens / 1M tokens * {{symbol}}{{price}}", "(输入 {{nonAudioInput}} tokens / 1M tokens * {{symbol}}{{price}} + 音频输入 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioPrice}}": "(Đầu vào {{nonAudioInput}} tokens / 1M tokens * {{symbol}}{{price}} + Đầu vào âm thanh {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioPrice}}", "(输入 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}}": "(Đầu vào {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + Bộ nhớ đệm {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}}", - "(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens * {{imageRatio}} / 1M tokens * {{symbol}}{{price}}": "(Đầu vào {{nonImageInput}} tokens + Đầu vào hình ảnh {{imageInput}} tokens * {{imageRatio}} / 1M tokens * {{symbol}}{{price}}", "[最多请求次数]和[最多请求完成次数]的最大值为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}", @@ -151,10 +150,10 @@ "JSON格式错误": "Lỗi định dạng JSON", "JSON编辑": "Trình chỉnh sửa JSON", "JSON解析错误:": "Lỗi phân tích cú pháp JSON:", - "Key": "", + "Key": "Key", "Key 或 Path": "", "Key 指纹": "", - "Key 摘要": "", + "Key 摘要": "Tóm tắt Key", "Key 来源": "", "Key 来源类型": "", "Linux DO Client ID": "Linux DO Client ID", @@ -1350,7 +1349,7 @@ "打开 CC Switch": "", "打开侧边栏": "Mở thanh bên", "打开授权页面": "", - "扣费": "", + "扣费": "Khấu phí", "执行 GC": "", "执行中": "đang xử lý", "扫描二维码": "Quét mã QR", @@ -1766,6 +1765,7 @@ "模型价格": "Giá mô hình", "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}": "Giá mô hình {{symbol}}{{price}}, {{ratioType}} {{ratio}}", "模型价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "Giá mô hình: {{symbol}}{{price}} * {{ratioType}}: {{ratio}} = {{symbol}}{{total}}", + "按次:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "Theo lượt gọi: {{symbol}}{{price}} * {{ratioType}}: {{ratio}} = {{symbol}}{{total}}", "模型倍率": "Tỷ lệ mô hình", "模型倍率 {{modelRatio}}": "Model ratio {{modelRatio}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}}": "Tỷ lệ mô hình {{modelRatio}}, tỷ lệ bộ nhớ đệm {{cacheRatio}}, tỷ lệ hoàn thành {{completionRatio}}, {{ratioType}} {{ratio}}", @@ -2068,7 +2068,7 @@ "渠道 ID": "ID kênh", "渠道ID": "ID kênh", "渠道ID,名称,密钥,API地址": "ID kênh, tên, khóa, Base URL", - "渠道亲和性": "", + "渠道亲和性": "Độ ưu tiên kênh", "渠道亲和性:上游缓存命中": "", "渠道亲和性会基于从请求上下文或 JSON Body 提取的 Key,优先复用上一次成功的渠道。": "", "渠道优先级": "Ưu tiên kênh", @@ -2243,7 +2243,7 @@ "用时/首字": "Thời gian/từ đầu tiên", "用途": "Mục đích", "由全站货币展示设置统一控制": "Được điều khiển bởi cài đặt hiển thị tiền tệ toàn site", - "由订阅抵扣": "", + "由订阅抵扣": "Khấu trừ bởi gói đăng ký", "申请": "Đăng ký", "申请时间": "Thời gian đăng ký", "电子邮箱": "Email", @@ -2634,7 +2634,7 @@ "缓存创建倍率 {{cacheCreationRatio}}": "Cache creation ratio {{cacheCreationRatio}}", "缓存创建倍率 1h {{cacheCreationRatio1h}}": "Tỷ lệ tạo bộ nhớ đệm 1h {{cacheCreationRatio1h}}", "缓存创建倍率 5m {{cacheCreationRatio5m}}": "Tỷ lệ tạo bộ nhớ đệm 5m {{cacheCreationRatio5m}}", - "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Cache creation ratio 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", + "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Hệ số tạo bộ nhớ đệm 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", "缓存条目数": "", "缓存目录": "", "缓存目录磁盘空间": "", @@ -2790,7 +2790,6 @@ "补全 {{completion}} tokens / 1M tokens * {{symbol}}{{price}}": "Completion {{completion}} tokens / 1M tokens * {{symbol}}{{price}}", "补全价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "Giá hoàn thành: {{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (Tỷ lệ hoàn thành: {{completionRatio}})", "补全价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens": "Giá hoàn thành: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens", - "补全价格:{{symbol}}{{price}} / 1M tokens": "Giá hoàn thành: {{symbol}}{{price}} / 1M tokens", "补全倍率": "Tỷ lệ hoàn thành", "补全倍率值": "Giá trị tỷ lệ hoàn thành", "补单": "Bổ sung đơn hàng", @@ -2806,7 +2805,7 @@ "覆盖模式:将完全替换现有的所有密钥": "Chế độ ghi đè: sẽ thay thế hoàn toàn tất cả các khóa hiện có", "覆盖模板": "", "覆盖现有密钥": "Ghi đè khóa hiện có", - "规则": "", + "规则": "Quy tắc", "规则 JSON": "", "规则 JSON 格式不正确": "", "规则 ttl_seconds 为 0 时使用。0 表示使用后端默认 TTL:3600 秒。": "", @@ -2841,7 +2840,7 @@ "订阅套餐": "Gói đăng ký", "订阅套餐管理": "Quản lý gói đăng ký", "订阅实例": "", - "订阅抵扣": "", + "订阅抵扣": "Khấu trừ gói đăng ký", "订阅管理": "Quản lý đăng ký", "订阅结算": "", "订阅说明": "", @@ -3358,7 +3357,7 @@ "进度": "Tiến độ", "进行中": "Đang tiến hành", "进行该操作时,可能导致渠道访问错误,请仅在数据库出现问题时使用": "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ó vấn đề với cơ sở dữ liệu.", - "违规扣费": "", + "违规扣费": "Khấu phí vi phạm", "违规扣费金额": "Số tiền trừ phí vi phạm", "连接保活设置": "Cài đặt giữ kết nối", "连接已断开": "Kết nối đã ngắt", @@ -3761,7 +3760,9 @@ "计费显示模式": "Chế độ hiển thị tính phí", "价格模式(默认)": "Chế độ giá (mặc định)", "模型价格 {{symbol}}{{price}} / 次": "Giá mô hình {{symbol}}{{price}} / lượt gọi", + "按次 {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Theo lượt gọi {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "模型价格:{{symbol}}{{price}} / 次": "Giá mô hình: {{symbol}}{{price}} / lượt gọi", + "按次:{{symbol}}{{price}}": "Theo lượt gọi: {{symbol}}{{price}}", "实际结算金额:{{symbol}}{{total}}(已包含分组价格调整)": "Khoản phí thực tế: {{symbol}}{{total}} (đã bao gồm điều chỉnh giá theo nhóm)", "缓存读取价格:{{symbol}}{{price}} / 1M tokens": "Giá đọc bộ nhớ đệm: {{symbol}}{{price}} / 1M tokens", "缓存读取价格 {{symbol}}{{price}} / 1M tokens": "Giá đọc bộ nhớ đệm {{symbol}}{{price}} / 1M tokens", @@ -3774,7 +3775,6 @@ "图片输入价格:{{symbol}}{{price}} / 1M tokens": "Giá đầu vào hình ảnh: {{symbol}}{{price}} / 1M tokens", "图片输入价格 {{symbol}}{{price}} / 1M tokens": "Giá đầu vào hình ảnh {{symbol}}{{price}} / 1M tokens", "输入价格 {{symbol}}{{price}} / 1M tokens": "Giá đầu vào {{symbol}}{{price}} / 1M tokens", - "补全价格 {{symbol}}{{price}} / 1M tokens": "Giá hoàn thành {{symbol}}{{price}} / 1M tokens", "音频输入价格:{{symbol}}{{price}} / 1M tokens": "Giá đầu vào âm thanh: {{symbol}}{{price}} / 1M tokens", "音频补全价格:{{symbol}}{{price}} / 1M tokens": "Giá hoàn thành âm thanh: {{symbol}}{{price}} / 1M tokens", "Web 搜索调用 {{webSearchCallCount}} 次": "Đã gọi tìm kiếm Web {{webSearchCallCount}} lần", @@ -3795,12 +3795,34 @@ "音频输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * 音频补全倍率 {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Đầu ra âm thanh: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * hệ số âm thanh {{audioRatio}} * hệ số hoàn thành âm thanh {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "合计:文字部分 {{textTotal}} + 音频部分 {{audioTotal}} = {{total}}": "Tổng cộng: phần văn bản {{textTotal}} + phần âm thanh {{audioTotal}} = {{total}}", "模型倍率 {{modelRatio}},输出倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},{{ratioType}} {{ratio}}": "Hệ số mô hình {{modelRatio}}, hệ số đầu ra {{completionRatio}}, hệ số bộ nhớ đệm {{cacheRatio}}, {{ratioType}} {{ratio}}", - "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Hệ số tạo bộ nhớ đệm 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", "缓存读取:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Đọc bộ nhớ đệm: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * hệ số bộ nhớ đệm {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存创建倍率 {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Tạo bộ nhớ đệm: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * hệ số tạo bộ nhớ đệm {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "5m缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 5m缓存创建倍率 {{cacheCreationRatio5m}} * {{ratioType}} {{ratio}} = {{amount}}": "Tạo bộ nhớ đệm 5m: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * hệ số tạo bộ nhớ đệm 5m {{cacheCreationRatio5m}} * {{ratioType}} {{ratio}} = {{amount}}", "1h缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 1h缓存创建倍率 {{cacheCreationRatio1h}} * {{ratioType}} {{ratio}} = {{amount}}": "Tạo bộ nhớ đệm 1h: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * hệ số tạo bộ nhớ đệm 1h {{cacheCreationRatio1h}} * {{ratioType}} {{ratio}} = {{amount}}", "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 输出倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Đầu ra: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * hệ số đầu ra {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "空": "Trống" + "空": "Trống", + "{{ratioType}} {{ratio}}x": "{{ratioType}} {{ratio}}x", + "模型价格:{{symbol}}{{price}}": "Giá mô hình: {{symbol}}{{price}}", + "模型价格 {{price}}": "Giá mô hình {{price}}", + "缓存读 {{price}} / 1M tokens": "Đọc bộ nhớ đệm {{price}} / 1M tokens", + "5m缓存创建 {{price}} / 1M tokens": "Tạo bộ nhớ đệm 5m {{price}} / 1M tokens", + "1h缓存创建 {{price}} / 1M tokens": "Tạo bộ nhớ đệm 1h {{price}} / 1M tokens", + "缓存创建 {{price}} / 1M tokens": "Tạo bộ nhớ đệm {{price}} / 1M tokens", + "图片输入 {{price}} / 1M tokens": "Đầu vào hình ảnh {{price}} / 1M tokens", + "输入 {{price}} / 1M tokens": "Đầu vào {{price}} / 1M tokens", + "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Bộ nhớ đệm {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Tạo bộ nhớ đệm {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Tạo bộ nhớ đệm 5m {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Tạo bộ nhớ đệm 1h {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}": "(Đầu vào {{nonImageInput}} tokens + Đầu vào hình ảnh {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}", + "图片输入价格:{{symbol}}{{total}} / 1M tokens": "Giá đầu vào hình ảnh: {{symbol}}{{total}} / 1M tokens", + "文字提示 {{input}} tokens / 1M tokens * {{symbol}}{{textInputPrice}} + 文字补全 {{completion}} tokens / 1M tokens * {{symbol}}{{textCompPrice}} + 音频提示 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{audioCompletion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Prompt văn bản {{input}} tokens / 1M tokens * {{symbol}}{{textInputPrice}} + Hoàn thành văn bản {{completion}} tokens / 1M tokens * {{symbol}}{{textCompPrice}} + Prompt âm thanh {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + Hoàn thành âm thanh {{audioCompletion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "模型价格 {{symbol}}{{price}} / 次 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Giá mô hình {{symbol}}{{price}} / lượt gọi * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "缓存读取价格:{{symbol}}{{total}} / 1M tokens": "Giá đọc bộ nhớ đệm: {{symbol}}{{total}} / 1M tokens", + "补全 {{completion}} tokens * 输出倍率 {{completionRatio}}": "Hoàn thành {{completion}} tokens * Tỷ lệ đầu ra {{completionRatio}}", + "补全倍率 {{completionRatio}}": "Tỷ lệ hoàn thành {{completionRatio}}", + "输出价格 {{symbol}}{{price}} / 1M tokens": "Giá đầu ra {{symbol}}{{price}} / 1M tokens", + "输出价格:{{symbol}}{{price}} / 1M tokens": "Giá đầu ra: {{symbol}}{{price}} / 1M tokens", + "输出价格:{{symbol}}{{total}} / 1M tokens": "Giá đầu ra: {{symbol}}{{total}} / 1M tokens" } } diff --git a/web/src/i18n/locales/zh-CN.json b/web/src/i18n/locales/zh-CN.json index 2ebc7dc8..02681108 100644 --- a/web/src/i18n/locales/zh-CN.json +++ b/web/src/i18n/locales/zh-CN.json @@ -13,7 +13,6 @@ "(输入 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "(输入 {{input}} tokens / 1M tokens * {{symbol}}{{price}}", "(输入 {{nonAudioInput}} tokens / 1M tokens * {{symbol}}{{price}} + 音频输入 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioPrice}}": "(输入 {{nonAudioInput}} tokens / 1M tokens * {{symbol}}{{price}} + 音频输入 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioPrice}}", "(输入 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}}": "(输入 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}}", - "(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens * {{imageRatio}} / 1M tokens * {{symbol}}{{price}}": "(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens * {{imageRatio}} / 1M tokens * {{symbol}}{{price}}", "[最多请求次数]和[最多请求完成次数]的最大值为2147483647。": "[最多请求次数]和[最多请求完成次数]的最大值为2147483647。", "[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。": "[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。", "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", @@ -1106,7 +1105,6 @@ "按倍率类型筛选": "按倍率类型筛选", "按倍率设置": "按倍率设置", "按次": "按次", - "按次 {{price}} / 次": "按次 {{price}} / 次", "按次计费": "按次计费", "按照如下格式输入:AccessKey|SecretAccessKey|Region": "按照如下格式输入:AccessKey|SecretAccessKey|Region", "按量计费": "按量计费", @@ -1430,6 +1428,7 @@ "模型价格": "模型价格", "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}": "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}", "模型价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "模型价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}", + "按次:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "按次:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}", "模型倍率": "模型倍率", "模型倍率 {{modelRatio}}": "模型倍率 {{modelRatio}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}}": "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}}", @@ -2867,26 +2866,21 @@ "计费显示模式": "计费显示模式", "价格模式(默认)": "价格模式(默认)", "模型价格 {{symbol}}{{price}} / 次": "模型价格 {{symbol}}{{price}} / 次", + "按次 {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "按次 {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "模型价格:{{symbol}}{{price}} / 次": "模型价格:{{symbol}}{{price}} / 次", - "输入 {{price}} / 1M tokens": "输入 {{price}} / 1M tokens", + "按次:{{symbol}}{{price}}": "按次:{{symbol}}{{price}}", "实际结算金额:{{symbol}}{{total}}(已包含分组价格调整)": "实际结算金额:{{symbol}}{{total}}(已包含分组价格调整)", "缓存读取价格:{{symbol}}{{price}} / 1M tokens": "缓存读取价格:{{symbol}}{{price}} / 1M tokens", "缓存读取价格 {{symbol}}{{price}} / 1M tokens": "缓存读取价格 {{symbol}}{{price}} / 1M tokens", - "缓存读取 {{price}}": "缓存读取 {{price}}", "缓存创建价格:{{symbol}}{{price}} / 1M tokens": "缓存创建价格:{{symbol}}{{price}} / 1M tokens", "缓存创建价格 {{symbol}}{{price}} / 1M tokens": "缓存创建价格 {{symbol}}{{price}} / 1M tokens", - "缓存创建 {{price}}": "缓存创建 {{price}}", "5m缓存创建价格:{{symbol}}{{price}} / 1M tokens": "5m缓存创建价格:{{symbol}}{{price}} / 1M tokens", "5m缓存创建价格 {{symbol}}{{price}} / 1M tokens": "5m缓存创建价格 {{symbol}}{{price}} / 1M tokens", - "5m缓存创建 {{price}}": "5m缓存创建 {{price}}", "1h缓存创建价格:{{symbol}}{{price}} / 1M tokens": "1h缓存创建价格:{{symbol}}{{price}} / 1M tokens", "1h缓存创建价格 {{symbol}}{{price}} / 1M tokens": "1h缓存创建价格 {{symbol}}{{price}} / 1M tokens", - "1h缓存创建 {{price}}": "1h缓存创建 {{price}}", "图片输入价格:{{symbol}}{{price}} / 1M tokens": "图片输入价格:{{symbol}}{{price}} / 1M tokens", "图片输入价格 {{symbol}}{{price}} / 1M tokens": "图片输入价格 {{symbol}}{{price}} / 1M tokens", - "图片输入 {{price}}": "图片输入 {{price}}", "输入价格 {{symbol}}{{price}} / 1M tokens": "输入价格 {{symbol}}{{price}} / 1M tokens", - "补全价格 {{symbol}}{{price}} / 1M tokens": "补全价格 {{symbol}}{{price}} / 1M tokens", "音频输入价格:{{symbol}}{{price}} / 1M tokens": "音频输入价格:{{symbol}}{{price}} / 1M tokens", "音频补全价格:{{symbol}}{{price}} / 1M tokens": "音频补全价格:{{symbol}}{{price}} / 1M tokens", "Web 搜索调用 {{webSearchCallCount}} 次": "Web 搜索调用 {{webSearchCallCount}} 次", @@ -2907,12 +2901,43 @@ "音频输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * 音频补全倍率 {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "音频输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * 音频补全倍率 {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "合计:文字部分 {{textTotal}} + 音频部分 {{audioTotal}} = {{total}}": "合计:文字部分 {{textTotal}} + 音频部分 {{audioTotal}} = {{total}}", "模型倍率 {{modelRatio}},输出倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},{{ratioType}} {{ratio}}": "模型倍率 {{modelRatio}},输出倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},{{ratioType}} {{ratio}}", - "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", "缓存读取:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "缓存读取:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存创建倍率 {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存创建倍率 {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "5m缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 5m缓存创建倍率 {{cacheCreationRatio5m}} * {{ratioType}} {{ratio}} = {{amount}}": "5m缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 5m缓存创建倍率 {{cacheCreationRatio5m}} * {{ratioType}} {{ratio}} = {{amount}}", "1h缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 1h缓存创建倍率 {{cacheCreationRatio1h}} * {{ratioType}} {{ratio}} = {{amount}}": "1h缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 1h缓存创建倍率 {{cacheCreationRatio1h}} * {{ratioType}} {{ratio}} = {{amount}}", "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 输出倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 输出倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "空": "空" + "空": "空", + "{{ratioType}} {{ratio}}x": "{{ratioType}} {{ratio}}x", + "模型价格:{{symbol}}{{price}}": "模型价格:{{symbol}}{{price}}", + "模型价格 {{price}}": "模型价格 {{price}}", + "缓存读 {{price}} / 1M tokens": "缓存读 {{price}} / 1M tokens", + "5m缓存创建 {{price}} / 1M tokens": "5m缓存创建 {{price}} / 1M tokens", + "1h缓存创建 {{price}} / 1M tokens": "1h缓存创建 {{price}} / 1M tokens", + "缓存创建 {{price}} / 1M tokens": "缓存创建 {{price}} / 1M tokens", + "图片输入 {{price}} / 1M tokens": "图片输入 {{price}} / 1M tokens", + "输入 {{price}} / 1M tokens": "输入 {{price}} / 1M tokens", + "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "Key": "Key", + "Key 摘要": "Key 摘要", + "扣费": "扣费", + "渠道亲和性": "渠道亲和性", + "由订阅抵扣": "由订阅抵扣", + "规则": "规则", + "订阅抵扣": "订阅抵扣", + "违规扣费": "违规扣费", + "(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}": "(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}", + "图片输入价格:{{symbol}}{{total}} / 1M tokens": "图片输入价格:{{symbol}}{{total}} / 1M tokens", + "文字提示 {{input}} tokens / 1M tokens * {{symbol}}{{textInputPrice}} + 文字补全 {{completion}} tokens / 1M tokens * {{symbol}}{{textCompPrice}} + 音频提示 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{audioCompletion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "文字提示 {{input}} tokens / 1M tokens * {{symbol}}{{textInputPrice}} + 文字补全 {{completion}} tokens / 1M tokens * {{symbol}}{{textCompPrice}} + 音频提示 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{audioCompletion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "模型价格 {{symbol}}{{price}} / 次 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "模型价格 {{symbol}}{{price}} / 次 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "缓存读取价格:{{symbol}}{{total}} / 1M tokens": "缓存读取价格:{{symbol}}{{total}} / 1M tokens", + "补全 {{completion}} tokens * 输出倍率 {{completionRatio}}": "补全 {{completion}} tokens * 输出倍率 {{completionRatio}}", + "补全倍率 {{completionRatio}}": "补全倍率 {{completionRatio}}", + "输入价格:{{symbol}}{{price}} / 1M tokens": "输入价格:{{symbol}}{{price}} / 1M tokens", + "输出价格 {{symbol}}{{price}} / 1M tokens": "输出价格 {{symbol}}{{price}} / 1M tokens", + "输出价格:{{symbol}}{{price}} / 1M tokens": "输出价格:{{symbol}}{{price}} / 1M tokens", + "输出价格:{{symbol}}{{total}} / 1M tokens": "输出价格:{{symbol}}{{total}} / 1M tokens" } } diff --git a/web/src/i18n/locales/zh-TW.json b/web/src/i18n/locales/zh-TW.json index fe00b476..6ffa630a 100644 --- a/web/src/i18n/locales/zh-TW.json +++ b/web/src/i18n/locales/zh-TW.json @@ -13,7 +13,6 @@ "(输入 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "(輸入 {{input}} tokens / 1M tokens * {{symbol}}{{price}}", "(输入 {{nonAudioInput}} tokens / 1M tokens * {{symbol}}{{price}} + 音频输入 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioPrice}}": "(輸入 {{nonAudioInput}} tokens / 1M tokens * {{symbol}}{{price}} + 音訊輸入 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioPrice}}", "(输入 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}}": "(輸入 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 快取 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}}", - "(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens * {{imageRatio}} / 1M tokens * {{symbol}}{{price}}": "(輸入 {{nonImageInput}} tokens + 圖片輸入 {{imageInput}} tokens * {{imageRatio}} / 1M tokens * {{symbol}}{{price}}", "[最多请求次数]和[最多请求完成次数]的最大值为2147483647。": "[最多請求次數]和[最多請求完成次數]的最大值為2147483647。", "[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。": "[最多請求次數]必須大於等於0,[最多請求完成次數]必須大於等於1。", "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", @@ -1109,7 +1108,6 @@ "按倍率类型筛选": "按倍率類型篩選", "按倍率设置": "按倍率設定", "按次": "按次", - "按次 {{price}} / 次": "按次 {{price}} / 次", "按次计费": "按次計費", "按照如下格式输入:AccessKey|SecretAccessKey|Region": "按照如下格式輸入:AccessKey|SecretAccessKey|Region", "按量计费": "按量計費", @@ -1436,6 +1434,7 @@ "模型价格": "模型價格", "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}": "模型價格 {{symbol}}{{price}},{{ratioType}} {{ratio}}", "模型价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "模型價格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}", + "按次:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "按次:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}", "模型倍率": "模型倍率", "模型倍率 {{modelRatio}}": "模型倍率 {{modelRatio}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}}": "模型倍率 {{modelRatio}},快取倍率 {{cacheRatio}},輸出倍率 {{completionRatio}},{{ratioType}} {{ratio}}", @@ -2860,26 +2859,21 @@ "计费显示模式": "計費顯示模式", "价格模式(默认)": "價格模式(預設)", "模型价格 {{symbol}}{{price}} / 次": "模型價格 {{symbol}}{{price}} / 次", + "按次 {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "按次 {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "模型价格:{{symbol}}{{price}} / 次": "模型價格:{{symbol}}{{price}} / 次", - "输入 {{price}} / 1M tokens": "輸入 {{price}} / 1M tokens", + "按次:{{symbol}}{{price}}": "按次:{{symbol}}{{price}}", "实际结算金额:{{symbol}}{{total}}(已包含分组价格调整)": "實際結算金額:{{symbol}}{{total}}(已包含分組價格調整)", "缓存读取价格:{{symbol}}{{price}} / 1M tokens": "快取讀取價格:{{symbol}}{{price}} / 1M tokens", "缓存读取价格 {{symbol}}{{price}} / 1M tokens": "快取讀取價格 {{symbol}}{{price}} / 1M tokens", - "缓存读取 {{price}}": "快取讀取 {{price}}", "缓存创建价格:{{symbol}}{{price}} / 1M tokens": "快取建立價格:{{symbol}}{{price}} / 1M tokens", "缓存创建价格 {{symbol}}{{price}} / 1M tokens": "快取建立價格 {{symbol}}{{price}} / 1M tokens", - "缓存创建 {{price}}": "快取建立 {{price}}", "5m缓存创建价格:{{symbol}}{{price}} / 1M tokens": "5m快取建立價格:{{symbol}}{{price}} / 1M tokens", "5m缓存创建价格 {{symbol}}{{price}} / 1M tokens": "5m快取建立價格 {{symbol}}{{price}} / 1M tokens", - "5m缓存创建 {{price}}": "5m快取建立 {{price}}", "1h缓存创建价格:{{symbol}}{{price}} / 1M tokens": "1h快取建立價格:{{symbol}}{{price}} / 1M tokens", "1h缓存创建价格 {{symbol}}{{price}} / 1M tokens": "1h快取建立價格 {{symbol}}{{price}} / 1M tokens", - "1h缓存创建 {{price}}": "1h快取建立 {{price}}", "图片输入价格:{{symbol}}{{price}} / 1M tokens": "圖片輸入價格:{{symbol}}{{price}} / 1M tokens", "图片输入价格 {{symbol}}{{price}} / 1M tokens": "圖片輸入價格 {{symbol}}{{price}} / 1M tokens", - "图片输入 {{price}}": "圖片輸入 {{price}}", "输入价格 {{symbol}}{{price}} / 1M tokens": "輸入價格 {{symbol}}{{price}} / 1M tokens", - "补全价格 {{symbol}}{{price}} / 1M tokens": "補全價格 {{symbol}}{{price}} / 1M tokens", "音频输入价格:{{symbol}}{{price}} / 1M tokens": "音訊輸入價格:{{symbol}}{{price}} / 1M tokens", "音频补全价格:{{symbol}}{{price}} / 1M tokens": "音訊補全價格:{{symbol}}{{price}} / 1M tokens", "Web 搜索调用 {{webSearchCallCount}} 次": "Web 搜尋呼叫 {{webSearchCallCount}} 次", @@ -2900,12 +2894,49 @@ "音频输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * 音频补全倍率 {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "音訊輸出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音訊倍率 {{audioRatio}} * 音訊補全倍率 {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "合计:文字部分 {{textTotal}} + 音频部分 {{audioTotal}} = {{total}}": "合計:文字部分 {{textTotal}} + 音訊部分 {{audioTotal}} = {{total}}", "模型倍率 {{modelRatio}},输出倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},{{ratioType}} {{ratio}}": "模型倍率 {{modelRatio}},輸出倍率 {{completionRatio}},快取倍率 {{cacheRatio}},{{ratioType}} {{ratio}}", - "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "快取建立倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", "缓存读取:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "快取讀取:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 快取倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存创建倍率 {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "快取建立:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 快取建立倍率 {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "5m缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 5m缓存创建倍率 {{cacheCreationRatio5m}} * {{ratioType}} {{ratio}} = {{amount}}": "5m快取建立:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 5m快取建立倍率 {{cacheCreationRatio5m}} * {{ratioType}} {{ratio}} = {{amount}}", "1h缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 1h缓存创建倍率 {{cacheCreationRatio1h}} * {{ratioType}} {{ratio}} = {{amount}}": "1h快取建立:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 1h快取建立倍率 {{cacheCreationRatio1h}} * {{ratioType}} {{ratio}} = {{amount}}", "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 输出倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "輸出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 輸出倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "空": "空" + "空": "空", + "{{ratioType}} {{ratio}}x": "{{ratioType}} {{ratio}}x", + "模型价格:{{symbol}}{{price}}": "模型價格:{{symbol}}{{price}}", + "模型价格 {{price}}": "模型價格 {{price}}", + "缓存读 {{price}} / 1M tokens": "快取讀 {{price}} / 1M tokens", + "5m缓存创建 {{price}} / 1M tokens": "5m快取建立 {{price}} / 1M tokens", + "1h缓存创建 {{price}} / 1M tokens": "1h快取建立 {{price}} / 1M tokens", + "缓存创建 {{price}} / 1M tokens": "快取建立 {{price}} / 1M tokens", + "图片输入 {{price}} / 1M tokens": "圖片輸入 {{price}} / 1M tokens", + "输入 {{price}} / 1M tokens": "輸入 {{price}} / 1M tokens", + "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "快取 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "快取建立 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "5m快取建立 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "1h快取建立 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "Key": "Key", + "Key 摘要": "Key 摘要", + "写": "寫", + "异步任务退款": "非同步任務退款", + "扣费": "扣費", + "根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。": "根據 Anthropic 協定,/v1/messages 的輸入 tokens 僅統計非快取輸入,不包含快取讀取與快取寫入 tokens。", + "渠道亲和性": "渠道親和性", + "由订阅抵扣": "由訂閱抵扣", + "缓存写": "快取寫", + "缓存读": "快取讀", + "规则": "規則", + "订阅抵扣": "訂閱抵扣", + "违规扣费": "違規扣費", + "退款": "退款", + "(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}": "(輸入 {{nonImageInput}} tokens + 圖片輸入 {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}", + "图片输入价格:{{symbol}}{{total}} / 1M tokens": "圖片輸入價格:{{symbol}}{{total}} / 1M tokens", + "文字提示 {{input}} tokens / 1M tokens * {{symbol}}{{textInputPrice}} + 文字补全 {{completion}} tokens / 1M tokens * {{symbol}}{{textCompPrice}} + 音频提示 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{audioCompletion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "文字提示 {{input}} tokens / 1M tokens * {{symbol}}{{textInputPrice}} + 文字補全 {{completion}} tokens / 1M tokens * {{symbol}}{{textCompPrice}} + 音訊提示 {{audioInput}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音訊補全 {{audioCompletion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "模型价格 {{symbol}}{{price}} / 次 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "模型價格 {{symbol}}{{price}} / 次 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "缓存读取价格:{{symbol}}{{total}} / 1M tokens": "快取讀取價格:{{symbol}}{{total}} / 1M tokens", + "补全 {{completion}} tokens * 输出倍率 {{completionRatio}}": "補全 {{completion}} tokens * 輸出倍率 {{completionRatio}}", + "补全倍率 {{completionRatio}}": "補全倍率 {{completionRatio}}", + "输入价格:{{symbol}}{{price}} / 1M tokens": "輸入價格:{{symbol}}{{price}} / 1M tokens", + "输出价格 {{symbol}}{{price}} / 1M tokens": "輸出價格 {{symbol}}{{price}} / 1M tokens", + "输出价格:{{symbol}}{{price}} / 1M tokens": "輸出價格:{{symbol}}{{price}} / 1M tokens", + "输出价格:{{symbol}}{{total}} / 1M tokens": "輸出價格:{{symbol}}{{total}} / 1M tokens" } }