From 70560d53718f9e8ed2c70d15bc26b043c9b562b0 Mon Sep 17 00:00:00 2001 From: Clansty Date: Sun, 29 Mar 2026 02:22:24 +0800 Subject: [PATCH 01/54] feat: add IncludeModelName option to channel affinity rules for per-model affinity tracking --- service/channel_affinity.go | 21 +++++++++++++++---- service/channel_affinity_template_test.go | 2 +- .../channel_affinity_setting.go | 1 + 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/service/channel_affinity.go b/service/channel_affinity.go index 9f89585f..e09cb01f 100644 --- a/service/channel_affinity.go +++ b/service/channel_affinity.go @@ -166,12 +166,22 @@ func GetChannelAffinityCacheStats() ChannelAffinityCacheStats { unknown++ continue } - if rule.IncludeUsingGroup { + if rule.IncludeModelName { if len(parts) < 3 { unknown++ continue } } + if rule.IncludeUsingGroup { + minParts := 3 + if rule.IncludeModelName { + minParts = 4 + } + if len(parts) < minParts { + unknown++ + continue + } + } byRuleName[ruleName]++ } @@ -319,11 +329,14 @@ func extractChannelAffinityValue(c *gin.Context, src operation_setting.ChannelAf } } -func buildChannelAffinityCacheKeySuffix(rule operation_setting.ChannelAffinityRule, usingGroup string, affinityValue string) string { - parts := make([]string, 0, 3) +func buildChannelAffinityCacheKeySuffix(rule operation_setting.ChannelAffinityRule, modelName string, usingGroup string, affinityValue string) string { + parts := make([]string, 0, 4) if rule.IncludeRuleName && rule.Name != "" { parts = append(parts, rule.Name) } + if rule.IncludeModelName && modelName != "" { + parts = append(parts, modelName) + } if rule.IncludeUsingGroup && usingGroup != "" { parts = append(parts, usingGroup) } @@ -573,7 +586,7 @@ func GetPreferredChannelByAffinity(c *gin.Context, modelName string, usingGroup if ttlSeconds <= 0 { ttlSeconds = setting.DefaultTTLSeconds } - cacheKeySuffix := buildChannelAffinityCacheKeySuffix(rule, usingGroup, affinityValue) + cacheKeySuffix := buildChannelAffinityCacheKeySuffix(rule, modelName, usingGroup, affinityValue) cacheKeyFull := channelAffinityCacheNamespace + ":" + cacheKeySuffix setChannelAffinityContext(c, channelAffinityMeta{ CacheKey: cacheKeyFull, diff --git a/service/channel_affinity_template_test.go b/service/channel_affinity_template_test.go index 264f9122..033cbd83 100644 --- a/service/channel_affinity_template_test.go +++ b/service/channel_affinity_template_test.go @@ -193,7 +193,7 @@ func TestChannelAffinityHitCodexTemplatePassHeadersEffective(t *testing.T) { require.NotNil(t, codexRule) affinityValue := fmt.Sprintf("pc-hit-%d", time.Now().UnixNano()) - cacheKeySuffix := buildChannelAffinityCacheKeySuffix(*codexRule, "default", affinityValue) + cacheKeySuffix := buildChannelAffinityCacheKeySuffix(*codexRule, "gpt-5", "default", affinityValue) cache := getChannelAffinityCache() require.NoError(t, cache.SetWithTTL(cacheKeySuffix, 9527, time.Minute)) diff --git a/setting/operation_setting/channel_affinity_setting.go b/setting/operation_setting/channel_affinity_setting.go index 74213e99..ebe00f44 100644 --- a/setting/operation_setting/channel_affinity_setting.go +++ b/setting/operation_setting/channel_affinity_setting.go @@ -23,6 +23,7 @@ type ChannelAffinityRule struct { SkipRetryOnFailure bool `json:"skip_retry_on_failure,omitempty"` IncludeUsingGroup bool `json:"include_using_group"` + IncludeModelName bool `json:"include_model_name"` IncludeRuleName bool `json:"include_rule_name"` } From 116e0b8f1ce0740b486e20a1734c93ba4943bb25 Mon Sep 17 00:00:00 2001 From: Clansty Date: Sun, 29 Mar 2026 02:48:37 +0800 Subject: [PATCH 02/54] feat: add include_model_name UI switch to channel affinity settings --- web/src/i18n/locales/en.json | 2 ++ web/src/i18n/locales/fr.json | 2 ++ web/src/i18n/locales/ja.json | 2 ++ web/src/i18n/locales/ru.json | 2 ++ web/src/i18n/locales/vi.json | 2 ++ .../Operation/SettingsChannelAffinity.jsx | 20 +++++++++++++++++-- 6 files changed, 28 insertions(+), 2 deletions(-) diff --git a/web/src/i18n/locales/en.json b/web/src/i18n/locales/en.json index e392379e..6a147021 100644 --- a/web/src/i18n/locales/en.json +++ b/web/src/i18n/locales/en.json @@ -401,6 +401,8 @@ "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "After invalidation, the subscription becomes invalid immediately. History is not affected. Continue?", "作用域": "Scope", "作用域:包含分组": "Scope: Include Group", + "作用域:包含模型名称": "Scope: Include Model Name", + "开启后,模型名称会参与 cache key(不同模型隔离)。": "When enabled, the model name is included in the cache key (isolates different models).", "作用域:包含规则名称": "Scope: Include Rule Name", "你似乎并没有修改什么": "You seem to have not modified anything", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "You can manually add them under “Custom model names”, click Fill and submit, or use the actions below to handle them automatically.", diff --git a/web/src/i18n/locales/fr.json b/web/src/i18n/locales/fr.json index 6ff22ab5..2ebefb71 100644 --- a/web/src/i18n/locales/fr.json +++ b/web/src/i18n/locales/fr.json @@ -397,6 +397,8 @@ "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "Après invalidation, l'abonnement devient immédiatement invalide. L'historique n'est pas affecté. Continuer ?", "作用域": "Portée", "作用域:包含分组": "Portée : inclure le groupe", + "作用域:包含模型名称": "Portée : inclure le nom du modèle", + "开启后,模型名称会参与 cache key(不同模型隔离)。": "Lorsque activé, le nom du modèle est inclus dans la clé de cache (isole les différents modèles).", "作用域:包含规则名称": "Portée : inclure le nom de la règle", "你似乎并没有修改什么": "Vous ne semblez rien avoir modifié", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "Vous pouvez les ajouter manuellement dans « Noms de modèles personnalisés », cliquer sur Remplir puis soumettre, ou utiliser directement les actions ci-dessous pour les traiter automatiquement.", diff --git a/web/src/i18n/locales/ja.json b/web/src/i18n/locales/ja.json index b2a59fc4..9a8a7ac6 100644 --- a/web/src/i18n/locales/ja.json +++ b/web/src/i18n/locales/ja.json @@ -393,6 +393,8 @@ "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "無効化するとこのサブスクリプションは直ちに失効します。履歴には影響しません。続行しますか?", "作用域": "スコープ", "作用域:包含分组": "スコープ:グループを含む", + "作用域:包含模型名称": "スコープ:モデル名を含む", + "开启后,模型名称会参与 cache key(不同模型隔离)。": "有効にすると、モデル名がキャッシュキーに含まれます(異なるモデルを分離)。", "作用域:包含规则名称": "スコープ:ルール名を含む", "你似乎并没有修改什么": "何も変更されていないようです", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "You can manually add them under “Custom model names”, click Fill and submit, or use the actions below to handle them automatically.", diff --git a/web/src/i18n/locales/ru.json b/web/src/i18n/locales/ru.json index ccf10242..9368d630 100644 --- a/web/src/i18n/locales/ru.json +++ b/web/src/i18n/locales/ru.json @@ -400,6 +400,8 @@ "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "После аннулирования подписка сразу станет недействительной. История не изменится. Продолжить?", "作用域": "Область действия", "作用域:包含分组": "Область действия: включить группу", + "作用域:包含模型名称": "Область действия: включить имя модели", + "开启后,模型名称会参与 cache key(不同模型隔离)。": "При включении имя модели включается в ключ кэша (изолирует разные модели).", "作用域:包含规则名称": "Область действия: включить имя правила", "你似乎并没有修改什么": "Похоже, вы ничего не изменили", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "Вы можете добавить их вручную в разделе «Пользовательские названия моделей», нажать «Заполнить», затем отправить или воспользоваться действиями ниже для автоматической обработки.", diff --git a/web/src/i18n/locales/vi.json b/web/src/i18n/locales/vi.json index 5c9e1e8c..1a5be4d7 100644 --- a/web/src/i18n/locales/vi.json +++ b/web/src/i18n/locales/vi.json @@ -394,6 +394,8 @@ "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "Sau khi vô hiệu, đăng ký sẽ mất hiệu lực ngay. Lịch sử không bị ảnh hưởng. Tiếp tục?", "作用域": "Phạm vi", "作用域:包含分组": "Phạm vi: Bao gồm nhóm", + "作用域:包含模型名称": "Phạm vi: Bao gồm tên mô hình", + "开启后,模型名称会参与 cache key(不同模型隔离)。": "Khi bật, tên mô hình sẽ được bao gồm trong cache key (cách ly các mô hình khác nhau).", "作用域:包含规则名称": "Phạm vi: Bao gồm tên quy tắc", "你似乎并没有修改什么": "Bạn dường như không sửa đổi gì cả", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "You can manually add them under “Custom model names”, click Fill and submit, or use the actions below to handle them automatically.", diff --git a/web/src/pages/Setting/Operation/SettingsChannelAffinity.jsx b/web/src/pages/Setting/Operation/SettingsChannelAffinity.jsx index c179e855..192dc291 100644 --- a/web/src/pages/Setting/Operation/SettingsChannelAffinity.jsx +++ b/web/src/pages/Setting/Operation/SettingsChannelAffinity.jsx @@ -103,6 +103,7 @@ const RULES_JSON_PLACEHOLDER = `[ }, "skip_retry_on_failure": false, "include_using_group": true, + "include_model_name": false, "include_rule_name": true } ]`; @@ -246,6 +247,7 @@ export default function SettingsChannelAffinity(props) { ttl_seconds: Number(r.ttl_seconds || 0), skip_retry_on_failure: !!r.skip_retry_on_failure, include_using_group: r.include_using_group ?? true, + include_model_name: !!r.include_model_name, include_rule_name: r.include_rule_name ?? true, param_override_template_json: r.param_override_template ? stringifyPretty(r.param_override_template) @@ -582,6 +584,7 @@ export default function SettingsChannelAffinity(props) { render: (_, record) => { const tags = []; if (record?.include_using_group) tags.push('分组'); + if (record?.include_model_name) tags.push('模型'); if (record?.include_rule_name) tags.push('规则'); if (tags.length === 0) return '-'; return tags.map((x) => ( @@ -650,6 +653,7 @@ export default function SettingsChannelAffinity(props) { ttl_seconds: 0, skip_retry_on_failure: false, include_using_group: true, + include_model_name: false, include_rule_name: true, }; setEditingRule(nextRule); @@ -721,6 +725,7 @@ export default function SettingsChannelAffinity(props) { value_regex: (values.value_regex || '').trim(), ttl_seconds: Number(values.ttl_seconds || 0), include_using_group: !!values.include_using_group, + include_model_name: !!values.include_model_name, include_rule_name: !!values.include_rule_name, ...(values.skip_retry_on_failure ? { skip_retry_on_failure: true } @@ -1251,7 +1256,7 @@ export default function SettingsChannelAffinity(props) { - + - + + + + {t( + '开启后,模型名称会参与 cache key(不同模型隔离)。', + )} + + + Date: Fri, 27 Mar 2026 17:24:26 +0800 Subject: [PATCH 03/54] feat: TaskSubmitReq support Duration --- relay/common/relay_info.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/relay/common/relay_info.go b/relay/common/relay_info.go index e4421fc1..7d4f063c 100644 --- a/relay/common/relay_info.go +++ b/relay/common/relay_info.go @@ -4,6 +4,7 @@ import ( "encoding/json" "errors" "fmt" + "strconv" "strings" "time" @@ -690,6 +691,7 @@ func (t *TaskSubmitReq) UnmarshalJSON(data []byte) error { type Alias TaskSubmitReq aux := &struct { Metadata json.RawMessage `json:"metadata,omitempty"` + Duration json.RawMessage `json:"duration,omitempty"` *Alias }{ Alias: (*Alias)(t), @@ -699,6 +701,20 @@ func (t *TaskSubmitReq) UnmarshalJSON(data []byte) error { return err } + if len(aux.Duration) > 0 { + var durationInt int + if err := common.Unmarshal(aux.Duration, &durationInt); err == nil { + t.Duration = durationInt + } else { + var durationStr string + if err := common.Unmarshal(aux.Duration, &durationStr); err == nil && durationStr != "" { + if v, err := strconv.Atoi(durationStr); err == nil { + t.Duration = v + } + } + } + } + if len(aux.Metadata) > 0 { var metadataStr string if err := common.Unmarshal(aux.Metadata, &metadataStr); err == nil && metadataStr != "" { From b713e277cdc5a41e22abf2831976d61f26153052 Mon Sep 17 00:00:00 2001 From: feitianbubu Date: Fri, 3 Apr 2026 15:25:57 +0800 Subject: [PATCH 04/54] feat: metadata correct parse --- relay/common/relay_utils.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/relay/common/relay_utils.go b/relay/common/relay_utils.go index 3cbb18c2..18df77a6 100644 --- a/relay/common/relay_utils.go +++ b/relay/common/relay_utils.go @@ -204,7 +204,9 @@ func ValidateBasicTaskRequest(c *gin.Context, info *RelayInfo, action string) *d if err != nil { return createTaskError(err, "invalid_multipart_form", http.StatusBadRequest, true) } - } else if err := common.UnmarshalBodyReusable(c, &req); err != nil { + } + // 为了metadata字段的兼容性,统一UnmarshalBodyReusable + if err := common.UnmarshalBodyReusable(c, &req); err != nil { return createTaskError(err, "invalid_request", http.StatusBadRequest, true) } From 4cd0e3651df795ddc49654bca621580cde2aeba8 Mon Sep 17 00:00:00 2001 From: HynoR <20227709+HynoR@users.noreply.github.com> Date: Mon, 6 Apr 2026 00:40:08 +0800 Subject: [PATCH 05/54] feat(playground): enhance max_tokens handling and input sanitization - Introduced `sanitizePlaygroundInputs` to normalize `max_tokens` input values. - Updated `loadConfig` to utilize the new sanitization function. - Replaced `Input` with `InputNumber` for `max_tokens` in `ParameterControl` for better user experience. - Modified API payload building logic to handle `max_tokens` more robustly. - Added tests for new helper functions in `playgroundMaxTokens.js` to ensure correct behavior. --- .../playground/ParameterControl.jsx | 20 ++++--- .../components/playground/configStorage.js | 5 +- web/src/helpers/api.js | 13 ++++- web/src/helpers/index.js | 1 + web/src/helpers/playgroundMaxTokens.js | 55 +++++++++++++++++++ web/src/helpers/playgroundMaxTokens.test.mjs | 43 +++++++++++++++ .../hooks/playground/usePlaygroundState.js | 15 ++++- 7 files changed, 139 insertions(+), 13 deletions(-) create mode 100644 web/src/helpers/playgroundMaxTokens.js create mode 100644 web/src/helpers/playgroundMaxTokens.test.mjs diff --git a/web/src/components/playground/ParameterControl.jsx b/web/src/components/playground/ParameterControl.jsx index e06c3973..82ab4b77 100644 --- a/web/src/components/playground/ParameterControl.jsx +++ b/web/src/components/playground/ParameterControl.jsx @@ -18,7 +18,14 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; -import { Input, Slider, Typography, Button, Tag } from '@douyinfe/semi-ui'; +import { + Input, + InputNumber, + Slider, + Typography, + Button, + Tag, +} from '@douyinfe/semi-ui'; import { useTranslation } from 'react-i18next'; import { Hash, @@ -241,15 +248,14 @@ const ParameterControl = ({ disabled={disabled} /> - onInputChange('max_tokens', value)} - className='!rounded-lg' + onNumberChange={(value) => onInputChange('max_tokens', value)} + min={0} + precision={0} + style={{ width: '100%' }} disabled={!parameterEnabled.max_tokens || disabled} /> diff --git a/web/src/components/playground/configStorage.js b/web/src/components/playground/configStorage.js index 86674eb5..273d39f9 100644 --- a/web/src/components/playground/configStorage.js +++ b/web/src/components/playground/configStorage.js @@ -21,6 +21,7 @@ import { STORAGE_KEYS, DEFAULT_CONFIG, } from '../../constants/playground.constants'; +import { sanitizePlaygroundInputs } from '../../helpers/playgroundMaxTokens'; const MESSAGES_STORAGE_KEY = 'playground_messages'; @@ -67,10 +68,10 @@ export const loadConfig = () => { const parsedConfig = JSON.parse(savedConfig); const mergedConfig = { - inputs: { + inputs: sanitizePlaygroundInputs({ ...DEFAULT_CONFIG.inputs, ...parsedConfig.inputs, - }, + }), parameterEnabled: { ...DEFAULT_CONFIG.parameterEnabled, ...parsedConfig.parameterEnabled, diff --git a/web/src/helpers/api.js b/web/src/helpers/api.js index 9381968e..88122a56 100644 --- a/web/src/helpers/api.js +++ b/web/src/helpers/api.js @@ -150,7 +150,18 @@ export const buildApiPayload = ( const value = inputs[param]; const hasValue = value !== undefined && value !== null; - if (enabled && hasValue) { + if (!enabled) { + return; + } + + if (param === 'max_tokens') { + if (typeof value === 'number') { + payload[param] = value; + } + return; + } + + if (hasValue) { payload[param] = value; } }); diff --git a/web/src/helpers/index.js b/web/src/helpers/index.js index a86c3bca..1c959d8d 100644 --- a/web/src/helpers/index.js +++ b/web/src/helpers/index.js @@ -30,3 +30,4 @@ export * from './boolean'; export * from './dashboard'; export * from './passkey'; export * from './statusCodeRules'; +export * from './playgroundMaxTokens'; diff --git a/web/src/helpers/playgroundMaxTokens.js b/web/src/helpers/playgroundMaxTokens.js new file mode 100644 index 00000000..19d5f2c4 --- /dev/null +++ b/web/src/helpers/playgroundMaxTokens.js @@ -0,0 +1,55 @@ +/* +Copyright (C) 2025 QuantumNous + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . + +For commercial licensing, please contact support@quantumnous.com +*/ + +export const normalizeMaxTokensValue = (value) => { + if (typeof value === 'number') { + return Number.isFinite(value) && value >= 0 ? Math.floor(value) : null; + } + + if (typeof value === 'string') { + const trimmed = value.trim(); + if (trimmed === '') { + return null; + } + + const parsed = Number(trimmed); + return Number.isFinite(parsed) && parsed >= 0 ? Math.floor(parsed) : null; + } + + return null; +}; + +export const normalizePlaygroundInputValue = (name, value) => { + if (name === 'max_tokens') { + return normalizeMaxTokensValue(value); + } + + return value; +}; + +export const sanitizePlaygroundInputs = (inputs) => { + if (!inputs) { + return inputs; + } + + return { + ...inputs, + max_tokens: normalizeMaxTokensValue(inputs.max_tokens), + }; +}; diff --git a/web/src/helpers/playgroundMaxTokens.test.mjs b/web/src/helpers/playgroundMaxTokens.test.mjs new file mode 100644 index 00000000..3503ca9a --- /dev/null +++ b/web/src/helpers/playgroundMaxTokens.test.mjs @@ -0,0 +1,43 @@ +import assert from 'node:assert/strict'; + +import { + normalizeMaxTokensValue, + normalizePlaygroundInputValue, + sanitizePlaygroundInputs, +} from './playgroundMaxTokens.js'; + +assert.equal(normalizeMaxTokensValue(8192), 8192); +assert.equal(normalizeMaxTokensValue('8192'), 8192); +assert.equal(normalizeMaxTokensValue(' 8192 '), 8192); +assert.equal(normalizeMaxTokensValue(''), null); +assert.equal(normalizeMaxTokensValue('abc'), null); +assert.equal(normalizeMaxTokensValue(-1), null); +assert.equal(normalizeMaxTokensValue(1.9), 1); + +assert.equal(normalizePlaygroundInputValue('max_tokens', '2048'), 2048); +assert.equal(normalizePlaygroundInputValue('max_tokens', 'bad'), null); +assert.equal(normalizePlaygroundInputValue('seed', 'bad'), 'bad'); + +assert.deepEqual( + sanitizePlaygroundInputs({ + model: 'gpt-4o', + max_tokens: '2048', + }), + { + model: 'gpt-4o', + max_tokens: 2048, + }, +); + +assert.deepEqual( + sanitizePlaygroundInputs({ + model: 'gpt-4o', + max_tokens: 'bad', + }), + { + model: 'gpt-4o', + max_tokens: null, + }, +); + +console.log('playground max_tokens tests passed'); diff --git a/web/src/hooks/playground/usePlaygroundState.js b/web/src/hooks/playground/usePlaygroundState.js index 79be1013..9818db91 100644 --- a/web/src/hooks/playground/usePlaygroundState.js +++ b/web/src/hooks/playground/usePlaygroundState.js @@ -32,7 +32,11 @@ import { loadMessages, saveMessages, } from '../../components/playground/configStorage'; -import { processIncompleteThinkTags } from '../../helpers'; +import { + processIncompleteThinkTags, + normalizePlaygroundInputValue, + sanitizePlaygroundInputs, +} from '../../helpers'; export const usePlaygroundState = () => { const { t } = useTranslation(); @@ -121,7 +125,10 @@ export const usePlaygroundState = () => { // 配置更新函数 const handleInputChange = useCallback((name, value) => { - setInputs((prev) => ({ ...prev, [name]: value })); + setInputs((prev) => ({ + ...prev, + [name]: normalizePlaygroundInputValue(name, value), + })); }, []); const handleParameterToggle = useCallback((paramName) => { @@ -167,7 +174,9 @@ export const usePlaygroundState = () => { // 配置导入/重置 const handleConfigImport = useCallback((importedConfig) => { if (importedConfig.inputs) { - setInputs((prev) => ({ ...prev, ...importedConfig.inputs })); + setInputs((prev) => + sanitizePlaygroundInputs({ ...prev, ...importedConfig.inputs }), + ); } if (importedConfig.parameterEnabled) { setParameterEnabled((prev) => ({ From 427fb7eaf6819b3b1dfc287debdcd4d4258762b9 Mon Sep 17 00:00:00 2001 From: HynoR <20227709+HynoR@users.noreply.github.com> Date: Mon, 6 Apr 2026 00:48:06 +0800 Subject: [PATCH 06/54] refactor(playground): remove playgroundMaxTokens helper and update input handling - Deleted the `playgroundMaxTokens` helper functions and their associated tests. - Updated `loadConfig` and `usePlaygroundState` to handle `max_tokens` directly without sanitization. - Simplified input handling in `usePlaygroundState` to directly set values without normalization. --- .../components/playground/configStorage.js | 9 ++- web/src/helpers/index.js | 1 - web/src/helpers/playgroundMaxTokens.js | 55 ------------------- web/src/helpers/playgroundMaxTokens.test.mjs | 43 --------------- .../hooks/playground/usePlaygroundState.js | 22 ++++---- 5 files changed, 16 insertions(+), 114 deletions(-) delete mode 100644 web/src/helpers/playgroundMaxTokens.js delete mode 100644 web/src/helpers/playgroundMaxTokens.test.mjs diff --git a/web/src/components/playground/configStorage.js b/web/src/components/playground/configStorage.js index 273d39f9..d201ed6a 100644 --- a/web/src/components/playground/configStorage.js +++ b/web/src/components/playground/configStorage.js @@ -21,7 +21,6 @@ import { STORAGE_KEYS, DEFAULT_CONFIG, } from '../../constants/playground.constants'; -import { sanitizePlaygroundInputs } from '../../helpers/playgroundMaxTokens'; const MESSAGES_STORAGE_KEY = 'playground_messages'; @@ -66,12 +65,16 @@ export const loadConfig = () => { const savedConfig = localStorage.getItem(STORAGE_KEYS.CONFIG); if (savedConfig) { const parsedConfig = JSON.parse(savedConfig); + const parsedMaxTokens = parseInt(parsedConfig?.inputs?.max_tokens, 10); const mergedConfig = { - inputs: sanitizePlaygroundInputs({ + inputs: { ...DEFAULT_CONFIG.inputs, ...parsedConfig.inputs, - }), + max_tokens: Number.isNaN(parsedMaxTokens) + ? parsedConfig?.inputs?.max_tokens + : parsedMaxTokens, + }, parameterEnabled: { ...DEFAULT_CONFIG.parameterEnabled, ...parsedConfig.parameterEnabled, diff --git a/web/src/helpers/index.js b/web/src/helpers/index.js index 1c959d8d..a86c3bca 100644 --- a/web/src/helpers/index.js +++ b/web/src/helpers/index.js @@ -30,4 +30,3 @@ export * from './boolean'; export * from './dashboard'; export * from './passkey'; export * from './statusCodeRules'; -export * from './playgroundMaxTokens'; diff --git a/web/src/helpers/playgroundMaxTokens.js b/web/src/helpers/playgroundMaxTokens.js deleted file mode 100644 index 19d5f2c4..00000000 --- a/web/src/helpers/playgroundMaxTokens.js +++ /dev/null @@ -1,55 +0,0 @@ -/* -Copyright (C) 2025 QuantumNous - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . - -For commercial licensing, please contact support@quantumnous.com -*/ - -export const normalizeMaxTokensValue = (value) => { - if (typeof value === 'number') { - return Number.isFinite(value) && value >= 0 ? Math.floor(value) : null; - } - - if (typeof value === 'string') { - const trimmed = value.trim(); - if (trimmed === '') { - return null; - } - - const parsed = Number(trimmed); - return Number.isFinite(parsed) && parsed >= 0 ? Math.floor(parsed) : null; - } - - return null; -}; - -export const normalizePlaygroundInputValue = (name, value) => { - if (name === 'max_tokens') { - return normalizeMaxTokensValue(value); - } - - return value; -}; - -export const sanitizePlaygroundInputs = (inputs) => { - if (!inputs) { - return inputs; - } - - return { - ...inputs, - max_tokens: normalizeMaxTokensValue(inputs.max_tokens), - }; -}; diff --git a/web/src/helpers/playgroundMaxTokens.test.mjs b/web/src/helpers/playgroundMaxTokens.test.mjs deleted file mode 100644 index 3503ca9a..00000000 --- a/web/src/helpers/playgroundMaxTokens.test.mjs +++ /dev/null @@ -1,43 +0,0 @@ -import assert from 'node:assert/strict'; - -import { - normalizeMaxTokensValue, - normalizePlaygroundInputValue, - sanitizePlaygroundInputs, -} from './playgroundMaxTokens.js'; - -assert.equal(normalizeMaxTokensValue(8192), 8192); -assert.equal(normalizeMaxTokensValue('8192'), 8192); -assert.equal(normalizeMaxTokensValue(' 8192 '), 8192); -assert.equal(normalizeMaxTokensValue(''), null); -assert.equal(normalizeMaxTokensValue('abc'), null); -assert.equal(normalizeMaxTokensValue(-1), null); -assert.equal(normalizeMaxTokensValue(1.9), 1); - -assert.equal(normalizePlaygroundInputValue('max_tokens', '2048'), 2048); -assert.equal(normalizePlaygroundInputValue('max_tokens', 'bad'), null); -assert.equal(normalizePlaygroundInputValue('seed', 'bad'), 'bad'); - -assert.deepEqual( - sanitizePlaygroundInputs({ - model: 'gpt-4o', - max_tokens: '2048', - }), - { - model: 'gpt-4o', - max_tokens: 2048, - }, -); - -assert.deepEqual( - sanitizePlaygroundInputs({ - model: 'gpt-4o', - max_tokens: 'bad', - }), - { - model: 'gpt-4o', - max_tokens: null, - }, -); - -console.log('playground max_tokens tests passed'); diff --git a/web/src/hooks/playground/usePlaygroundState.js b/web/src/hooks/playground/usePlaygroundState.js index 9818db91..130df90d 100644 --- a/web/src/hooks/playground/usePlaygroundState.js +++ b/web/src/hooks/playground/usePlaygroundState.js @@ -32,11 +32,7 @@ import { loadMessages, saveMessages, } from '../../components/playground/configStorage'; -import { - processIncompleteThinkTags, - normalizePlaygroundInputValue, - sanitizePlaygroundInputs, -} from '../../helpers'; +import { processIncompleteThinkTags } from '../../helpers'; export const usePlaygroundState = () => { const { t } = useTranslation(); @@ -125,10 +121,7 @@ export const usePlaygroundState = () => { // 配置更新函数 const handleInputChange = useCallback((name, value) => { - setInputs((prev) => ({ - ...prev, - [name]: normalizePlaygroundInputValue(name, value), - })); + setInputs((prev) => ({ ...prev, [name]: value })); }, []); const handleParameterToggle = useCallback((paramName) => { @@ -174,9 +167,14 @@ export const usePlaygroundState = () => { // 配置导入/重置 const handleConfigImport = useCallback((importedConfig) => { if (importedConfig.inputs) { - setInputs((prev) => - sanitizePlaygroundInputs({ ...prev, ...importedConfig.inputs }), - ); + const parsedMaxTokens = parseInt(importedConfig.inputs.max_tokens, 10); + setInputs((prev) => ({ + ...prev, + ...importedConfig.inputs, + max_tokens: Number.isNaN(parsedMaxTokens) + ? importedConfig.inputs.max_tokens + : parsedMaxTokens, + })); } if (importedConfig.parameterEnabled) { setParameterEnabled((prev) => ({ From 8fc0eb78e263353cfb4d24380b20fac6b8e4a71d Mon Sep 17 00:00:00 2001 From: CaIon Date: Sun, 5 Apr 2026 20:07:48 +0800 Subject: [PATCH 07/54] feat(billing): enhance task billing process with video input detection and updated pricing logic - Added `EstimateBilling` function to check for video input in request metadata and return corresponding discount ratios. - Updated `ModelPriceHelperPerCall` to incorporate new pricing logic based on model ratios and video input. - Enhanced task billing logs to include model ratio information and adjusted calculations for actual quota based on additional multipliers. - Introduced `renderTaskBillingProcess` to improve rendering of task billing information in the UI. --- controller/relay.go | 2 +- relay/channel/task/doubao/adaptor.go | 43 ++++++++++++++++++ relay/channel/task/doubao/constants.go | 13 ++++++ relay/helper/price.go | 44 ++++++++++++------- service/task_billing.go | 24 ++++++++-- web/src/helpers/render.jsx | 12 +++++ web/src/hooks/usage-logs/useUsageLogsData.jsx | 6 ++- 7 files changed, 123 insertions(+), 21 deletions(-) diff --git a/controller/relay.go b/controller/relay.go index 10dfd502..593b31b7 100644 --- a/controller/relay.go +++ b/controller/relay.go @@ -581,7 +581,7 @@ func RelayTask(c *gin.Context) { ModelRatio: relayInfo.PriceData.ModelRatio, OtherRatios: relayInfo.PriceData.OtherRatios, OriginModelName: relayInfo.OriginModelName, - PerCallBilling: common.StringsContains(constant.TaskPricePatches, relayInfo.OriginModelName), + PerCallBilling: common.StringsContains(constant.TaskPricePatches, relayInfo.OriginModelName) || relayInfo.PriceData.UsePrice, } task.Quota = result.Quota task.Data = result.TaskData diff --git a/relay/channel/task/doubao/adaptor.go b/relay/channel/task/doubao/adaptor.go index e760e4c9..a6dabb5f 100644 --- a/relay/channel/task/doubao/adaptor.go +++ b/relay/channel/task/doubao/adaptor.go @@ -132,6 +132,49 @@ func (a *TaskAdaptor) BuildRequestHeader(_ *gin.Context, req *http.Request, _ *r return nil } +// EstimateBilling 检测请求 metadata 中是否包含视频输入,返回视频折扣 OtherRatio。 +func (a *TaskAdaptor) EstimateBilling(c *gin.Context, info *relaycommon.RelayInfo) map[string]float64 { + req, err := relaycommon.GetTaskRequest(c) + if err != nil { + return nil + } + if hasVideoInMetadata(req.Metadata) { + if ratio, ok := GetVideoInputRatio(info.OriginModelName); ok { + return map[string]float64{"video_input": ratio} + } + } + return nil +} + +// hasVideoInMetadata 直接检查 metadata 的 content 数组是否包含 video_url 条目, +// 避免构建完整的上游 requestPayload。 +func hasVideoInMetadata(metadata map[string]interface{}) bool { + if metadata == nil { + return false + } + contentRaw, ok := metadata["content"] + if !ok { + return false + } + contentSlice, ok := contentRaw.([]interface{}) + if !ok { + return false + } + for _, item := range contentSlice { + itemMap, ok := item.(map[string]interface{}) + if !ok { + continue + } + if itemMap["type"] == "video_url" { + return true + } + if _, has := itemMap["video_url"]; has { + return true + } + } + return false +} + // BuildRequestBody converts request into Doubao specific format. func (a *TaskAdaptor) BuildRequestBody(c *gin.Context, info *relaycommon.RelayInfo) (io.Reader, error) { req, err := relaycommon.GetTaskRequest(c) diff --git a/relay/channel/task/doubao/constants.go b/relay/channel/task/doubao/constants.go index 417fd587..d65773d3 100644 --- a/relay/channel/task/doubao/constants.go +++ b/relay/channel/task/doubao/constants.go @@ -10,3 +10,16 @@ var ModelList = []string{ } var ChannelName = "doubao-video" + +// videoInputRatioMap 视频输入折扣比率(含视频单价 / 不含视频单价)。 +// 管理员应将 ModelRatio 设置为"不含视频"的较高费率, +// 系统在检测到视频输入时自动乘以此折扣。 +var videoInputRatioMap = map[string]float64{ + "doubao-seedance-2-0-260128": 28.0 / 46.0, // ~0.6087 + "doubao-seedance-2-0-fast-260128": 22.0 / 37.0, // ~0.5946 +} + +func GetVideoInputRatio(modelName string) (float64, bool) { + r, ok := videoInputRatioMap[modelName] + return r, ok +} diff --git a/relay/helper/price.go b/relay/helper/price.go index f109040d..e9c3b463 100644 --- a/relay/helper/price.go +++ b/relay/helper/price.go @@ -139,21 +139,23 @@ func ModelPriceHelper(c *gin.Context, info *relaycommon.RelayInfo, promptTokens return priceData, nil } -// ModelPriceHelperPerCall 按次计费的 PriceHelper (MJ、Task) +// ModelPriceHelperPerCall 按次/按量计费的 PriceHelper (MJ、Task) func ModelPriceHelperPerCall(c *gin.Context, info *relaycommon.RelayInfo) (types.PriceData, error) { groupRatioInfo := HandleGroupRatio(c, info) modelPrice, success := ratio_setting.GetModelPrice(info.OriginModelName, true) - // 如果没有配置价格,检查模型倍率配置 - if !success { + usePrice := success + var modelRatio float64 - // 没有配置费用,也要使用默认费用,否则按费率计费模型无法使用 + if !success { defaultPrice, ok := ratio_setting.GetDefaultModelPriceMap()[info.OriginModelName] if ok { modelPrice = defaultPrice + usePrice = true } else { - // 没有配置倍率也不接受没配置,那就返回错误 - _, ratioSuccess, matchName := ratio_setting.GetModelRatio(info.OriginModelName) + var ratioSuccess bool + var matchName string + modelRatio, ratioSuccess, matchName = ratio_setting.GetModelRatio(info.OriginModelName) acceptUnsetRatio := false if info.UserSetting.AcceptUnsetRatioModel { acceptUnsetRatio = true @@ -161,25 +163,37 @@ func ModelPriceHelperPerCall(c *gin.Context, info *relaycommon.RelayInfo) (types if !ratioSuccess && !acceptUnsetRatio { return types.PriceData{}, fmt.Errorf("模型 %s 倍率或价格未配置,请联系管理员设置或开始自用模式;Model %s ratio or price not set, please set or start self-use mode", matchName, matchName) } - // 未配置价格但配置了倍率,使用默认预扣价格 - modelPrice = float64(common.PreConsumedQuota) / common.QuotaPerUnit } - } - quota := int(modelPrice * common.QuotaPerUnit * groupRatioInfo.GroupRatio) - // 免费模型检测(与 ModelPriceHelper 对齐) + var quota int freeModel := false - if !operation_setting.GetQuotaSetting().EnableFreeModelPreConsume { - if groupRatioInfo.GroupRatio == 0 || modelPrice == 0 { - quota = 0 - freeModel = true + + if usePrice { + quota = int(modelPrice * common.QuotaPerUnit * groupRatioInfo.GroupRatio) + if !operation_setting.GetQuotaSetting().EnableFreeModelPreConsume { + if groupRatioInfo.GroupRatio == 0 || modelPrice == 0 { + quota = 0 + freeModel = true + } + } + } else { + // 按量计费:以模型倍率的一半作为预扣额度 + quota = int(modelRatio / 2 * common.QuotaPerUnit * groupRatioInfo.GroupRatio) + modelPrice = -1 + if !operation_setting.GetQuotaSetting().EnableFreeModelPreConsume { + if groupRatioInfo.GroupRatio == 0 || modelRatio == 0 { + quota = 0 + freeModel = true + } } } priceData := types.PriceData{ FreeModel: freeModel, ModelPrice: modelPrice, + ModelRatio: modelRatio, + UsePrice: usePrice, Quota: quota, GroupRatioInfo: groupRatioInfo, } diff --git a/service/task_billing.go b/service/task_billing.go index b887f668..e5c406dd 100644 --- a/service/task_billing.go +++ b/service/task_billing.go @@ -36,8 +36,12 @@ func LogTaskConsumption(c *gin.Context, info *relaycommon.RelayInfo) { } } other := make(map[string]interface{}) + other["is_task"] = true other["request_path"] = c.Request.URL.Path other["model_price"] = info.PriceData.ModelPrice + if info.PriceData.ModelRatio > 0 { + other["model_ratio"] = info.PriceData.ModelRatio + } other["group_ratio"] = info.PriceData.GroupRatioInfo.GroupRatio if info.PriceData.GroupRatioInfo.HasSpecialRatio { other["user_group_ratio"] = info.PriceData.GroupRatioInfo.GroupSpecialRatio @@ -117,6 +121,9 @@ func taskBillingOther(task *model.Task) map[string]interface{} { other := make(map[string]interface{}) if bc := task.PrivateData.BillingContext; bc != nil { other["model_price"] = bc.ModelPrice + if bc.ModelRatio > 0 { + other["model_ratio"] = bc.ModelRatio + } other["group_ratio"] = bc.GroupRatio if len(bc.OtherRatios) > 0 { for k, v := range bc.OtherRatios { @@ -222,7 +229,6 @@ func RecalculateTaskQuota(ctx context.Context, task *model.Task, actualQuota int } other := taskBillingOther(task) other["task_id"] = task.TaskID - //other["reason"] = reason other["pre_consumed_quota"] = preConsumedQuota other["actual_quota"] = actualQuota model.RecordTaskBillingLog(model.RecordTaskBillingLogParams{ @@ -277,9 +283,19 @@ func RecalculateTaskQuotaByTokens(ctx context.Context, task *model.Task, totalTo finalGroupRatio = groupRatio } - // 计算实际应扣费额度: totalTokens * modelRatio * groupRatio - actualQuota := int(float64(totalTokens) * modelRatio * finalGroupRatio) + // 计算 OtherRatios 乘积(视频折扣、时长等) + otherMultiplier := 1.0 + if bc := task.PrivateData.BillingContext; bc != nil { + for _, r := range bc.OtherRatios { + if r != 1.0 && r > 0 { + otherMultiplier *= r + } + } + } - reason := fmt.Sprintf("token重算:tokens=%d, modelRatio=%.2f, groupRatio=%.2f", totalTokens, modelRatio, finalGroupRatio) + // 计算实际应扣费额度: totalTokens * modelRatio * groupRatio * otherMultiplier + actualQuota := int(float64(totalTokens) * modelRatio * finalGroupRatio * otherMultiplier) + + reason := fmt.Sprintf("token重算:tokens=%d, modelRatio=%.2f, groupRatio=%.2f, otherMultiplier=%.4f", totalTokens, modelRatio, finalGroupRatio, otherMultiplier) RecalculateTaskQuota(ctx, task, actualQuota, reason) } diff --git a/web/src/helpers/render.jsx b/web/src/helpers/render.jsx index 28da657f..0ad16bca 100644 --- a/web/src/helpers/render.jsx +++ b/web/src/helpers/render.jsx @@ -1620,6 +1620,18 @@ function renderPriceSimpleCore({ return result; } +export function renderTaskBillingProcess(other, content) { + if (other?.task_id != null) { + return renderBillingArticle( + [content].filter(Boolean), + { showReferenceNote: false }, + ); + } + return renderBillingArticle([ + buildBillingText('任务预扣费(将在任务完成后按实际token重算)'), + ]); +} + export function renderModelPrice( inputTokens, completionTokens, diff --git a/web/src/hooks/usage-logs/useUsageLogsData.jsx b/web/src/hooks/usage-logs/useUsageLogsData.jsx index a9ffaba0..e406b2ab 100644 --- a/web/src/hooks/usage-logs/useUsageLogsData.jsx +++ b/web/src/hooks/usage-logs/useUsageLogsData.jsx @@ -36,6 +36,7 @@ import { renderAudioModelPrice, renderClaudeModelPrice, renderModelPrice, + renderTaskBillingProcess, } from '../../helpers'; import { ITEMS_PER_PAGE } from '../../constants'; import { useTableCompactMode } from '../common/useTableCompactMode'; @@ -497,7 +498,10 @@ export const useLogsData = () => { let content = ''; if (!isViolationFeeLog) { - if (other?.ws || other?.audio) { + const isTaskLog = other?.is_task === true || other?.task_id != null; + if (isTaskLog && other?.model_price === -1) { + content = renderTaskBillingProcess(other, logs[i].content); + } else if (other?.ws || other?.audio) { content = renderAudioModelPrice( other?.text_input, other?.text_output, From 03758a4a855e49a27ac5b2eac799bdb52e80583d Mon Sep 17 00:00:00 2001 From: CaIon Date: Mon, 6 Apr 2026 15:54:42 +0800 Subject: [PATCH 08/54] refactor(file-source): unify file source creation and enhance caching mechanisms --- dto/claude.go | 54 +++--- dto/gemini.go | 19 +- dto/openai_request.go | 100 ++++++----- relay/channel/claude/relay-claude.go | 100 ++--------- relay/channel/gemini/relay-gemini.go | 42 +---- relay/channel/ollama/relay-ollama.go | 11 +- service/file_service.go | 85 +++++---- service/token_counter.go | 3 - types/file_source.go | 255 ++++++++++++++------------- types/request_meta.go | 9 +- 10 files changed, 292 insertions(+), 386 deletions(-) diff --git a/dto/claude.go b/dto/claude.go index 73bfa9c5..d292f97e 100644 --- a/dto/claude.go +++ b/dto/claude.go @@ -98,6 +98,20 @@ func (c *ClaudeMediaMessage) ParseMediaContent() []ClaudeMediaMessage { return mediaContent } +func (m *ClaudeMediaMessage) ToFileSource() types.FileSource { + if m.Source == nil { + return nil + } + data := m.Source.Url + if data == "" { + data = common.Interface2String(m.Source.Data) + } + if data == "" { + return nil + } + return types.NewFileSourceFromData(data, m.Source.MediaType) +} + type ClaudeMessageSource struct { Type string `json:"type"` MediaType string `json:"media_type,omitempty"` @@ -223,14 +237,6 @@ type OutputConfigForEffort struct { Effort string `json:"effort,omitempty"` } -// createClaudeFileSource 根据数据内容创建正确类型的 FileSource -func createClaudeFileSource(data string) *types.FileSource { - if strings.HasPrefix(data, "http://") || strings.HasPrefix(data, "https://") { - return types.NewURLFileSource(data) - } - return types.NewBase64FileSource(data, "") -} - func (c *ClaudeRequest) GetTokenCountMeta() *types.TokenCountMeta { maxTokens := 0 if c.MaxTokens != nil { @@ -258,17 +264,11 @@ func (c *ClaudeRequest) GetTokenCountMeta() *types.TokenCountMeta { case "text": texts = append(texts, media.GetText()) case "image": - if media.Source != nil { - data := media.Source.Url - if data == "" { - data = common.Interface2String(media.Source.Data) - } - if data != "" { - fileMeta = append(fileMeta, &types.FileMeta{ - FileType: types.FileTypeImage, - Source: createClaudeFileSource(data), - }) - } + if source := media.ToFileSource(); source != nil { + fileMeta = append(fileMeta, &types.FileMeta{ + FileType: types.FileTypeImage, + Source: source, + }) } } } @@ -293,17 +293,11 @@ func (c *ClaudeRequest) GetTokenCountMeta() *types.TokenCountMeta { case "text": texts = append(texts, media.GetText()) case "image": - if media.Source != nil { - data := media.Source.Url - if data == "" { - data = common.Interface2String(media.Source.Data) - } - if data != "" { - fileMeta = append(fileMeta, &types.FileMeta{ - FileType: types.FileTypeImage, - Source: createClaudeFileSource(data), - }) - } + if source := media.ToFileSource(); source != nil { + fileMeta = append(fileMeta, &types.FileMeta{ + FileType: types.FileTypeImage, + Source: source, + }) } case "tool_use": if media.Name != "" { diff --git a/dto/gemini.go b/dto/gemini.go index 63c99b86..029c3f03 100644 --- a/dto/gemini.go +++ b/dto/gemini.go @@ -64,14 +64,6 @@ type LatLng struct { Longitude *float64 `json:"longitude,omitempty"` } -// createGeminiFileSource 根据数据内容创建正确类型的 FileSource -func createGeminiFileSource(data string, mimeType string) *types.FileSource { - if strings.HasPrefix(data, "http://") || strings.HasPrefix(data, "https://") { - return types.NewURLFileSource(data) - } - return types.NewBase64FileSource(data, mimeType) -} - func (r *GeminiChatRequest) GetTokenCountMeta() *types.TokenCountMeta { var files []*types.FileMeta = make([]*types.FileMeta, 0) @@ -87,9 +79,8 @@ func (r *GeminiChatRequest) GetTokenCountMeta() *types.TokenCountMeta { if part.Text != "" { inputTexts = append(inputTexts, part.Text) } - if part.InlineData != nil && part.InlineData.Data != "" { + if source := part.InlineData.ToFileSource(); source != nil { mimeType := part.InlineData.MimeType - source := createGeminiFileSource(part.InlineData.Data, mimeType) var fileType types.FileType if strings.HasPrefix(mimeType, "image/") { fileType = types.FileTypeImage @@ -103,7 +94,6 @@ func (r *GeminiChatRequest) GetTokenCountMeta() *types.TokenCountMeta { files = append(files, &types.FileMeta{ FileType: fileType, Source: source, - MimeType: mimeType, }) } } @@ -215,6 +205,13 @@ type GeminiInlineData struct { Data string `json:"data"` } +func (d *GeminiInlineData) ToFileSource() types.FileSource { + if d == nil || d.Data == "" { + return nil + } + return types.NewFileSourceFromData(d.Data, d.MimeType) +} + // UnmarshalJSON custom unmarshaler for GeminiInlineData to support snake_case and camelCase for MimeType func (g *GeminiInlineData) UnmarshalJSON(data []byte) error { type Alias GeminiInlineData // Use type alias to avoid recursion diff --git a/dto/openai_request.go b/dto/openai_request.go index 76a86662..25ef3a21 100644 --- a/dto/openai_request.go +++ b/dto/openai_request.go @@ -108,14 +108,6 @@ type GeneralOpenAIRequest struct { ReasoningSplit json.RawMessage `json:"reasoning_split,omitempty"` } -// createFileSource 根据数据内容创建正确类型的 FileSource -func createFileSource(data string) *types.FileSource { - if strings.HasPrefix(data, "http://") || strings.HasPrefix(data, "https://") { - return types.NewURLFileSource(data) - } - return types.NewBase64FileSource(data, "") -} - func (r *GeneralOpenAIRequest) GetTokenCountMeta() *types.TokenCountMeta { var tokenCountMeta types.TokenCountMeta var texts = make([]string, 0) @@ -159,44 +151,24 @@ func (r *GeneralOpenAIRequest) GetTokenCountMeta() *types.TokenCountMeta { } arrayContent := message.ParseContent() for _, m := range arrayContent { - if m.Type == ContentTypeImageURL { - imageUrl := m.GetImageMedia() - if imageUrl != nil && imageUrl.Url != "" { - source := createFileSource(imageUrl.Url) - fileMeta = append(fileMeta, &types.FileMeta{ - FileType: types.FileTypeImage, - Source: source, - Detail: imageUrl.Detail, - }) + source := m.ToFileSource() + if source != nil { + meta := &types.FileMeta{Source: source} + switch m.Type { + case ContentTypeImageURL: + meta.FileType = types.FileTypeImage + if img := m.GetImageMedia(); img != nil { + meta.Detail = img.Detail + } + case ContentTypeInputAudio: + meta.FileType = types.FileTypeAudio + case ContentTypeFile: + meta.FileType = types.FileTypeFile + case ContentTypeVideoUrl: + meta.FileType = types.FileTypeVideo } - } else if m.Type == ContentTypeInputAudio { - inputAudio := m.GetInputAudio() - if inputAudio != nil && inputAudio.Data != "" { - source := createFileSource(inputAudio.Data) - fileMeta = append(fileMeta, &types.FileMeta{ - FileType: types.FileTypeAudio, - Source: source, - }) - } - } else if m.Type == ContentTypeFile { - file := m.GetFile() - if file != nil && file.FileData != "" { - source := createFileSource(file.FileData) - fileMeta = append(fileMeta, &types.FileMeta{ - FileType: types.FileTypeFile, - Source: source, - }) - } - } else if m.Type == ContentTypeVideoUrl { - videoUrl := m.GetVideoUrl() - if videoUrl != nil && videoUrl.Url != "" { - source := createFileSource(videoUrl.Url) - fileMeta = append(fileMeta, &types.FileMeta{ - FileType: types.FileTypeVideo, - Source: source, - }) - } - } else { + fileMeta = append(fileMeta, meta) + } else if m.Type == ContentTypeText { texts = append(texts, m.Text) } } @@ -391,6 +363,40 @@ func (m *MediaContent) GetVideoUrl() *MessageVideoUrl { return nil } +func (m *MediaContent) ToFileSource() types.FileSource { + switch m.Type { + case ContentTypeImageURL: + img := m.GetImageMedia() + if img == nil || img.Url == "" { + return nil + } + return types.NewFileSourceFromData(img.Url, img.MimeType) + case ContentTypeInputAudio: + audio := m.GetInputAudio() + if audio == nil || audio.Data == "" { + return nil + } + mimeType := "" + if audio.Format != "" { + mimeType = "audio/" + audio.Format + } + return types.NewFileSourceFromData(audio.Data, mimeType) + case ContentTypeFile: + file := m.GetFile() + if file == nil || file.FileData == "" { + return nil + } + return types.NewFileSourceFromData(file.FileData, "") + case ContentTypeVideoUrl: + video := m.GetVideoUrl() + if video == nil || video.Url == "" { + return nil + } + return types.NewFileSourceFromData(video.Url, "") + } + return nil +} + type MessageImageUrl struct { Url string `json:"url"` Detail string `json:"detail,omitempty"` @@ -865,7 +871,7 @@ func (r *OpenAIResponsesRequest) GetTokenCountMeta() *types.TokenCountMeta { if input.ImageUrl != "" { fileMeta = append(fileMeta, &types.FileMeta{ FileType: types.FileTypeImage, - Source: createFileSource(input.ImageUrl), + Source: types.NewFileSourceFromData(input.ImageUrl, ""), Detail: input.Detail, }) } @@ -873,7 +879,7 @@ func (r *OpenAIResponsesRequest) GetTokenCountMeta() *types.TokenCountMeta { if input.FileUrl != "" { fileMeta = append(fileMeta, &types.FileMeta{ FileType: types.FileTypeFile, - Source: createFileSource(input.FileUrl), + Source: types.NewFileSourceFromData(input.FileUrl, ""), }) } } else { diff --git a/relay/channel/claude/relay-claude.go b/relay/channel/claude/relay-claude.go index ba97bc90..dceff5e7 100644 --- a/relay/channel/claude/relay-claude.go +++ b/relay/channel/claude/relay-claude.go @@ -1,12 +1,10 @@ package claude import ( - "encoding/base64" "encoding/json" "fmt" "io" "net/http" - "path/filepath" "strings" "github.com/QuantumNous/new-api/common" @@ -46,61 +44,6 @@ func maybeMarkClaudeRefusal(c *gin.Context, stopReason string) { } } -func createClaudeFileSource(file *dto.MessageFile) *types.FileSource { - if file == nil || file.FileData == "" { - return nil - } - if strings.HasPrefix(file.FileData, "http://") || strings.HasPrefix(file.FileData, "https://") { - return types.NewURLFileSource(file.FileData) - } - mimeType := "" - if ext := strings.TrimPrefix(strings.ToLower(filepath.Ext(file.FileName)), "."); ext != "" { - if detected := service.GetMimeTypeByExtension(ext); detected != "application/octet-stream" { - mimeType = detected - } - } - return types.NewBase64FileSource(file.FileData, mimeType) -} - -func buildClaudeFileMessage(c *gin.Context, file *dto.MessageFile) (*dto.ClaudeMediaMessage, error) { - source := createClaudeFileSource(file) - if source == nil { - return nil, nil - } - base64Data, mimeType, err := service.GetBase64Data(c, source, "formatting document for Claude") - if err != nil { - return nil, fmt.Errorf("get file data failed: %w", err) - } - switch strings.ToLower(mimeType) { - case "application/pdf": - return &dto.ClaudeMediaMessage{ - Type: "document", - Source: &dto.ClaudeMessageSource{ - Type: "base64", - MediaType: mimeType, - Data: base64Data, - }, - }, nil - case "text/plain": - decodedData, err := base64.StdEncoding.DecodeString(base64Data) - if err != nil { - return nil, fmt.Errorf("decode text file data failed: %w", err) - } - return &dto.ClaudeMediaMessage{ - Type: "text", - Text: common.GetPointer(string(decodedData)), - }, nil - default: - msg := fmt.Sprintf("claude: skip unsupported file content, filename=%q, mime=%q", file.FileName, mimeType) - if c != nil { - logger.LogInfo(c, msg) - } else { - common.SysLog(msg) - } - return nil, nil - } -} - func RequestOpenAI2ClaudeMessage(c *gin.Context, textRequest dto.GeneralOpenAIRequest) (*dto.ClaudeRequest, error) { claudeTools := make([]any, 0, len(textRequest.Tools)) @@ -142,7 +85,7 @@ func RequestOpenAI2ClaudeMessage(c *gin.Context, textRequest dto.GeneralOpenAIRe // 解析 UserLocation JSON var userLocationMap map[string]interface{} - if err := json.Unmarshal(textRequest.WebSearchOptions.UserLocation, &userLocationMap); err == nil { + if err := common.Unmarshal(textRequest.WebSearchOptions.UserLocation, &userLocationMap); err == nil { // 检查是否有 approximate 字段 if approximateData, ok := userLocationMap["approximate"].(map[string]interface{}); ok { if timezone, ok := approximateData["timezone"].(string); ok && timezone != "" { @@ -406,44 +349,33 @@ func RequestOpenAI2ClaudeMessage(c *gin.Context, textRequest dto.GeneralOpenAIRe Type: "text", Text: common.GetPointer[string](mediaMessage.Text), }) - case dto.ContentTypeImageURL: - claudeMediaMessage := dto.ClaudeMediaMessage{ - Type: "image", - Source: &dto.ClaudeMessageSource{ - Type: "base64", - }, - } - imageUrl := mediaMessage.GetImageMedia() - if imageUrl == nil { + default: + source := mediaMessage.ToFileSource() + if source == nil { continue } - // 使用统一的文件服务获取图片数据 - var source *types.FileSource - if strings.HasPrefix(imageUrl.Url, "http") { - source = types.NewURLFileSource(imageUrl.Url) - } else { - source = types.NewBase64FileSource(imageUrl.Url, "") - } base64Data, mimeType, err := service.GetBase64Data(c, source, "formatting image for Claude") if err != nil { return nil, fmt.Errorf("get file data failed: %s", err.Error()) } + claudeMediaMessage := dto.ClaudeMediaMessage{ + Source: &dto.ClaudeMessageSource{ + Type: "base64", + }, + } + if strings.HasPrefix(mimeType, "application/pdf") { + claudeMediaMessage.Type = "document" + } else { + claudeMediaMessage.Type = "image" + } + claudeMediaMessage.Source.MediaType = mimeType claudeMediaMessage.Source.Data = base64Data claudeMediaMessages = append(claudeMediaMessages, claudeMediaMessage) - // FIXME - //case dto.ContentTypeFile: - // claudeFileMessage, err := buildClaudeFileMessage(c, mediaMessage.GetFile()) - // if err != nil { - // return nil, err - // } - // if claudeFileMessage != nil { - // claudeMediaMessages = append(claudeMediaMessages, *claudeFileMessage) - // } - default: continue } } + if message.ToolCalls != nil { for _, toolCall := range message.ParseToolCalls() { inputObj := make(map[string]any) diff --git a/relay/channel/gemini/relay-gemini.go b/relay/channel/gemini/relay-gemini.go index 2f1e7ecb..69175e76 100644 --- a/relay/channel/gemini/relay-gemini.go +++ b/relay/channel/gemini/relay-gemini.go @@ -585,14 +585,10 @@ func CovertOpenAI2Gemini(c *gin.Context, textRequest dto.GeneralOpenAIRequest, i Text: part.Text, }) } - } else if part.Type == dto.ContentTypeImageURL { - // 使用统一的文件服务获取图片数据 - var source *types.FileSource - imageUrl := part.GetImageMedia().Url - if strings.HasPrefix(imageUrl, "http") { - source = types.NewURLFileSource(imageUrl) - } else { - source = types.NewBase64FileSource(imageUrl, "") + } else { + source := part.ToFileSource() + if source == nil { + continue } base64Data, mimeType, err := service.GetBase64Data(c, source, "formatting image for Gemini") if err != nil { @@ -604,36 +600,6 @@ func CovertOpenAI2Gemini(c *gin.Context, textRequest dto.GeneralOpenAIRequest, i return nil, fmt.Errorf("mime type is not supported by Gemini: '%s', url: '%s', supported types are: %v", mimeType, source.GetIdentifier(), getSupportedMimeTypesList()) } - parts = append(parts, dto.GeminiPart{ - InlineData: &dto.GeminiInlineData{ - MimeType: mimeType, - Data: base64Data, - }, - }) - } else if part.Type == dto.ContentTypeFile { - if part.GetFile().FileId != "" { - return nil, fmt.Errorf("only base64 file is supported in gemini") - } - fileSource := types.NewBase64FileSource(part.GetFile().FileData, "") - base64Data, mimeType, err := service.GetBase64Data(c, fileSource, "formatting file for Gemini") - if err != nil { - return nil, fmt.Errorf("decode base64 file data failed: %s", err.Error()) - } - parts = append(parts, dto.GeminiPart{ - InlineData: &dto.GeminiInlineData{ - MimeType: mimeType, - Data: base64Data, - }, - }) - } else if part.Type == dto.ContentTypeInputAudio { - if part.GetInputAudio().Data == "" { - return nil, fmt.Errorf("only base64 audio is supported in gemini") - } - audioSource := types.NewBase64FileSource(part.GetInputAudio().Data, "audio/"+part.GetInputAudio().Format) - base64Data, mimeType, err := service.GetBase64Data(c, audioSource, "formatting audio for Gemini") - if err != nil { - return nil, fmt.Errorf("decode base64 audio data failed: %s", err.Error()) - } parts = append(parts, dto.GeminiPart{ InlineData: &dto.GeminiInlineData{ MimeType: mimeType, diff --git a/relay/channel/ollama/relay-ollama.go b/relay/channel/ollama/relay-ollama.go index afc27160..975c244c 100644 --- a/relay/channel/ollama/relay-ollama.go +++ b/relay/channel/ollama/relay-ollama.go @@ -98,15 +98,8 @@ func openAIChatToOllamaChat(c *gin.Context, r *dto.GeneralOpenAIRequest) (*Ollam parts := m.ParseContent() for _, part := range parts { if part.Type == dto.ContentTypeImageURL { - img := part.GetImageMedia() - if img != nil && img.Url != "" { - // 使用统一的文件服务获取图片数据 - var source *types.FileSource - if strings.HasPrefix(img.Url, "http") { - source = types.NewURLFileSource(img.Url) - } else { - source = types.NewBase64FileSource(img.Url, "") - } + source := part.ToFileSource() + if source != nil { base64Data, _, err := service.GetBase64Data(c, source, "fetch image for ollama chat") if err != nil { return nil, err diff --git a/service/file_service.go b/service/file_service.go index 918e426d..bcf47442 100644 --- a/service/file_service.go +++ b/service/file_service.go @@ -25,14 +25,26 @@ import ( // FileService 统一的文件处理服务 // 提供文件下载、解码、缓存等功能的统一入口 -// getContextCacheKey 生成 context 缓存的 key +// getContextCacheKey 生成 URL context 缓存的 key func getContextCacheKey(url string) string { return fmt.Sprintf("file_cache_%s", common.GenerateHMAC(url)) } +// getBase64ContextCacheKey 生成 base64 context 缓存的 key +// 使用 length + MIME + 前 128 字符作为输入,避免对整个 base64 数据做 hash +func getBase64ContextCacheKey(data string, mimeType string) string { + keyMaterial := fmt.Sprintf("%d:%s:", len(data), mimeType) + if len(data) > 128 { + keyMaterial += data[:128] + } else { + keyMaterial += data + } + return fmt.Sprintf("b64_cache_%s", common.GenerateHMAC(keyMaterial)) +} + // LoadFileSource 加载文件源数据 // 这是统一的入口,会自动处理缓存和不同的来源类型 -func LoadFileSource(c *gin.Context, source *types.FileSource, reason ...string) (*types.CachedFileData, error) { +func LoadFileSource(c *gin.Context, source types.FileSource, reason ...string) (*types.CachedFileData, error) { if source == nil { return nil, fmt.Errorf("file source is nil") } @@ -43,7 +55,6 @@ func LoadFileSource(c *gin.Context, source *types.FileSource, reason ...string) // 1. 快速检查内部缓存 if source.HasCache() { - // 即使命中内部缓存,也要确保注册到清理列表(如果尚未注册) if c != nil { registerSourceForCleanup(c, source) } @@ -62,39 +73,49 @@ func LoadFileSource(c *gin.Context, source *types.FileSource, reason ...string) return source.GetCache(), nil } - // 4. 如果是 URL,检查 Context 缓存 - var contextKey string - if source.IsURL() && c != nil { - contextKey = getContextCacheKey(source.URL) - if cachedData, exists := c.Get(contextKey); exists { - data := cachedData.(*types.CachedFileData) - source.SetCache(data) - registerSourceForCleanup(c, source) - return data, nil - } - } - - // 5. 执行加载逻辑 + // 4. 根据来源类型加载(含 URL context 缓存查找) var cachedData *types.CachedFileData + var contextKey string var err error - if source.IsURL() { - cachedData, err = loadFromURL(c, source.URL, reason...) - } else { - cachedData, err = loadFromBase64(source.Base64Data, source.MimeType) + switch s := source.(type) { + case *types.URLSource: + if c != nil { + contextKey = getContextCacheKey(s.URL) + if cached, exists := c.Get(contextKey); exists { + data := cached.(*types.CachedFileData) + source.SetCache(data) + registerSourceForCleanup(c, source) + return data, nil + } + } + cachedData, err = loadFromURL(c, s.URL, reason...) + case *types.Base64Source: + if c != nil { + contextKey = getBase64ContextCacheKey(s.Base64Data, s.MimeType) + if cached, exists := c.Get(contextKey); exists { + data := cached.(*types.CachedFileData) + source.SetCache(data) + registerSourceForCleanup(c, source) + return data, nil + } + } + cachedData, err = loadFromBase64(s.Base64Data, s.MimeType) + default: + return nil, fmt.Errorf("unsupported file source type: %T", source) } if err != nil { return nil, err } - // 6. 设置缓存 + // 5. 设置缓存 source.SetCache(cachedData) if contextKey != "" && c != nil { c.Set(contextKey, cachedData) } - // 7. 注册到 context 以便请求结束时自动清理 + // 6. 注册到 context 以便请求结束时自动清理 if c != nil { registerSourceForCleanup(c, source) } @@ -103,15 +124,15 @@ func LoadFileSource(c *gin.Context, source *types.FileSource, reason ...string) } // registerSourceForCleanup 注册 FileSource 到 context 以便请求结束时清理 -func registerSourceForCleanup(c *gin.Context, source *types.FileSource) { +func registerSourceForCleanup(c *gin.Context, source types.FileSource) { if source.IsRegistered() { return } key := string(constant.ContextKeyFileSourcesToCleanup) - var sources []*types.FileSource + var sources []types.FileSource if existing, exists := c.Get(key); exists { - sources = existing.([]*types.FileSource) + sources = existing.([]types.FileSource) } sources = append(sources, source) c.Set(key, sources) @@ -123,12 +144,12 @@ func registerSourceForCleanup(c *gin.Context, source *types.FileSource) { func CleanupFileSources(c *gin.Context) { key := string(constant.ContextKeyFileSourcesToCleanup) if sources, exists := c.Get(key); exists { - for _, source := range sources.([]*types.FileSource) { + for _, source := range sources.([]types.FileSource) { if cache := source.GetCache(); cache != nil { cache.Close() } } - c.Set(key, nil) // 清除引用 + c.Set(key, nil) } } @@ -363,7 +384,7 @@ func loadFromBase64(base64String string, providedMimeType string) (*types.Cached } // GetImageConfig 获取图片配置 -func GetImageConfig(c *gin.Context, source *types.FileSource) (image.Config, string, error) { +func GetImageConfig(c *gin.Context, source types.FileSource) (image.Config, string, error) { cachedData, err := LoadFileSource(c, source, "get_image_config") if err != nil { return image.Config{}, "", err @@ -394,7 +415,7 @@ func GetImageConfig(c *gin.Context, source *types.FileSource) (image.Config, str } // GetBase64Data 获取 base64 编码的数据 -func GetBase64Data(c *gin.Context, source *types.FileSource, reason ...string) (string, string, error) { +func GetBase64Data(c *gin.Context, source types.FileSource, reason ...string) (string, string, error) { cachedData, err := LoadFileSource(c, source, reason...) if err != nil { return "", "", err @@ -407,13 +428,13 @@ func GetBase64Data(c *gin.Context, source *types.FileSource, reason ...string) ( } // GetMimeType 获取文件的 MIME 类型 -func GetMimeType(c *gin.Context, source *types.FileSource) (string, error) { +func GetMimeType(c *gin.Context, source types.FileSource) (string, error) { if source.HasCache() { return source.GetCache().MimeType, nil } - if source.IsURL() { - mimeType, err := GetFileTypeFromUrl(c, source.URL, "get_mime_type") + if urlSource, ok := source.(*types.URLSource); ok { + mimeType, err := GetFileTypeFromUrl(c, urlSource.URL, "get_mime_type") if err == nil && mimeType != "" && mimeType != "application/octet-stream" { return mimeType, nil } diff --git a/service/token_counter.go b/service/token_counter.go index 7d648d77..63b76d97 100644 --- a/service/token_counter.go +++ b/service/token_counter.go @@ -100,8 +100,6 @@ func getImageToken(c *gin.Context, fileMeta *types.FileMeta, model string, strea if err != nil { return 0, err } - fileMeta.MimeType = format - if config.Width == 0 || config.Height == 0 { // not an image, but might be a valid file if format != "" { @@ -268,7 +266,6 @@ func EstimateRequestToken(c *gin.Context, meta *types.TokenCountMeta, info *rela } continue } - file.MimeType = cachedData.MimeType file.FileType = DetectFileType(cachedData.MimeType) } } diff --git a/types/file_source.go b/types/file_source.go index c52062d7..86ef25e1 100644 --- a/types/file_source.go +++ b/types/file_source.go @@ -4,39 +4,144 @@ import ( "fmt" "image" "os" + "strings" "sync" ) -// FileSourceType 文件来源类型 -type FileSourceType string - -const ( - FileSourceTypeURL FileSourceType = "url" // URL 来源 - FileSourceTypeBase64 FileSourceType = "base64" // Base64 内联数据 -) - -// FileSource 统一的文件来源抽象 +// FileSource 统一的文件来源抽象接口 // 支持 URL 和 base64 两种来源,提供懒加载和缓存机制 -type FileSource struct { - Type FileSourceType `json:"type"` // 来源类型 - URL string `json:"url,omitempty"` // URL(当 Type 为 url 时) - Base64Data string `json:"base64_data,omitempty"` // Base64 数据(当 Type 为 base64 时) - MimeType string `json:"mime_type,omitempty"` // MIME 类型(可选,会自动检测) +type FileSource interface { + IsURL() bool + GetIdentifier() string + GetRawData() string + ClearRawData() - // 内部缓存(不导出,不序列化) + SetCache(data *CachedFileData) + GetCache() *CachedFileData + HasCache() bool + ClearCache() + + IsRegistered() bool + SetRegistered(registered bool) + Mu() *sync.Mutex +} + +// baseFileSource 共享的缓存/锁/清理注册状态 +type baseFileSource struct { cachedData *CachedFileData cacheLoaded bool - registered bool // 是否已注册到清理列表 - mu sync.Mutex // 保护加载过程 + registered bool + mu sync.Mutex } -// Mu 获取内部锁 -func (f *FileSource) Mu() *sync.Mutex { - return &f.mu +func (b *baseFileSource) SetCache(data *CachedFileData) { + b.cachedData = data + b.cacheLoaded = true } -// CachedFileData 缓存的文件数据 -// 支持内存缓存和磁盘缓存两种模式 +func (b *baseFileSource) GetCache() *CachedFileData { + return b.cachedData +} + +func (b *baseFileSource) HasCache() bool { + return b.cacheLoaded && b.cachedData != nil +} + +func (b *baseFileSource) ClearCache() { + if b.cachedData != nil { + b.cachedData.Close() + } + b.cachedData = nil + b.cacheLoaded = false +} + +func (b *baseFileSource) IsRegistered() bool { + return b.registered +} + +func (b *baseFileSource) SetRegistered(registered bool) { + b.registered = registered +} + +func (b *baseFileSource) Mu() *sync.Mutex { + return &b.mu +} + +// --------------------------------------------------------------------------- +// URLSource — URL 来源的 FileSource 实现 +// --------------------------------------------------------------------------- + +type URLSource struct { + baseFileSource + URL string +} + +func (u *URLSource) IsURL() bool { return true } + +func (u *URLSource) GetIdentifier() string { + if len(u.URL) > 100 { + return u.URL[:100] + "..." + } + return u.URL +} + +func (u *URLSource) GetRawData() string { return u.URL } + +func (u *URLSource) ClearRawData() {} + +// --------------------------------------------------------------------------- +// Base64Source — Base64 内联数据来源的 FileSource 实现 +// --------------------------------------------------------------------------- + +type Base64Source struct { + baseFileSource + Base64Data string + MimeType string +} + +func (b *Base64Source) IsURL() bool { return false } + +func (b *Base64Source) GetIdentifier() string { + if len(b.Base64Data) > 50 { + return "base64:" + b.Base64Data[:50] + "..." + } + return "base64:" + b.Base64Data +} + +func (b *Base64Source) GetRawData() string { return b.Base64Data } + +func (b *Base64Source) ClearRawData() { + if len(b.Base64Data) > 1024 { + b.Base64Data = "" + } +} + +// --------------------------------------------------------------------------- +// Constructors +// --------------------------------------------------------------------------- + +func NewURLFileSource(url string) *URLSource { + return &URLSource{URL: url} +} + +func NewBase64FileSource(base64Data string, mimeType string) *Base64Source { + return &Base64Source{ + Base64Data: base64Data, + MimeType: mimeType, + } +} + +func NewFileSourceFromData(data string, mimeType string) FileSource { + if strings.HasPrefix(data, "http://") || strings.HasPrefix(data, "https://") { + return NewURLFileSource(data) + } + return NewBase64FileSource(data, mimeType) +} + +// --------------------------------------------------------------------------- +// CachedFileData — 缓存的文件数据(支持内存和磁盘两种模式) +// --------------------------------------------------------------------------- + type CachedFileData struct { base64Data string // 内存中的 base64 数据(小文件) MimeType string // MIME 类型 @@ -45,18 +150,15 @@ type CachedFileData struct { ImageConfig *image.Config // 图片配置(如果是图片) ImageFormat string // 图片格式(如果是图片) - // 磁盘缓存相关 diskPath string // 磁盘缓存文件路径(大文件) isDisk bool // 是否使用磁盘缓存 diskMu sync.Mutex // 磁盘操作锁(保护磁盘文件的读取和删除) diskClosed bool // 是否已关闭/清理 statDecremented bool // 是否已扣减统计 - // 统计回调,避免循环依赖 OnClose func(size int64) } -// NewMemoryCachedData 创建内存缓存的数据 func NewMemoryCachedData(base64Data string, mimeType string, size int64) *CachedFileData { return &CachedFileData{ base64Data: base64Data, @@ -66,7 +168,6 @@ func NewMemoryCachedData(base64Data string, mimeType string, size int64) *Cached } } -// NewDiskCachedData 创建磁盘缓存的数据 func NewDiskCachedData(diskPath string, mimeType string, size int64) *CachedFileData { return &CachedFileData{ diskPath: diskPath, @@ -76,7 +177,6 @@ func NewDiskCachedData(diskPath string, mimeType string, size int64) *CachedFile } } -// GetBase64Data 获取 base64 数据(自动处理内存/磁盘) func (c *CachedFileData) GetBase64Data() (string, error) { if !c.isDisk { return c.base64Data, nil @@ -89,7 +189,6 @@ func (c *CachedFileData) GetBase64Data() (string, error) { return "", fmt.Errorf("disk cache already closed") } - // 从磁盘读取 data, err := os.ReadFile(c.diskPath) if err != nil { return "", fmt.Errorf("failed to read from disk cache: %w", err) @@ -97,22 +196,19 @@ func (c *CachedFileData) GetBase64Data() (string, error) { return string(data), nil } -// SetBase64Data 设置 base64 数据(仅用于内存模式) func (c *CachedFileData) SetBase64Data(data string) { if !c.isDisk { c.base64Data = data } } -// IsDisk 是否使用磁盘缓存 func (c *CachedFileData) IsDisk() bool { return c.isDisk } -// Close 关闭并清理资源 func (c *CachedFileData) Close() error { if !c.isDisk { - c.base64Data = "" // 释放内存 + c.base64Data = "" return nil } @@ -126,7 +222,6 @@ func (c *CachedFileData) Close() error { c.diskClosed = true if c.diskPath != "" { err := os.Remove(c.diskPath) - // 只有在删除成功且未扣减过统计时,才执行回调 if err == nil && !c.statDecremented && c.OnClose != nil { c.OnClose(c.DiskSize) c.statDecremented = true @@ -135,97 +230,3 @@ func (c *CachedFileData) Close() error { } return nil } - -// NewURLFileSource 创建 URL 来源的 FileSource -func NewURLFileSource(url string) *FileSource { - return &FileSource{ - Type: FileSourceTypeURL, - URL: url, - } -} - -// NewBase64FileSource 创建 base64 来源的 FileSource -func NewBase64FileSource(base64Data string, mimeType string) *FileSource { - return &FileSource{ - Type: FileSourceTypeBase64, - Base64Data: base64Data, - MimeType: mimeType, - } -} - -// IsURL 判断是否是 URL 来源 -func (f *FileSource) IsURL() bool { - return f.Type == FileSourceTypeURL -} - -// IsBase64 判断是否是 base64 来源 -func (f *FileSource) IsBase64() bool { - return f.Type == FileSourceTypeBase64 -} - -// GetIdentifier 获取文件标识符(用于日志和错误追踪) -func (f *FileSource) GetIdentifier() string { - if f.IsURL() { - if len(f.URL) > 100 { - return f.URL[:100] + "..." - } - return f.URL - } - if len(f.Base64Data) > 50 { - return "base64:" + f.Base64Data[:50] + "..." - } - return "base64:" + f.Base64Data -} - -// GetRawData 获取原始数据(URL 或完整的 base64 字符串) -func (f *FileSource) GetRawData() string { - if f.IsURL() { - return f.URL - } - return f.Base64Data -} - -// SetCache 设置缓存数据 -func (f *FileSource) SetCache(data *CachedFileData) { - f.cachedData = data - f.cacheLoaded = true -} - -// IsRegistered 是否已注册到清理列表 -func (f *FileSource) IsRegistered() bool { - return f.registered -} - -// SetRegistered 设置注册状态 -func (f *FileSource) SetRegistered(registered bool) { - f.registered = registered -} - -// GetCache 获取缓存数据 -func (f *FileSource) GetCache() *CachedFileData { - return f.cachedData -} - -// HasCache 是否有缓存 -func (f *FileSource) HasCache() bool { - return f.cacheLoaded && f.cachedData != nil -} - -// ClearCache 清除缓存,释放内存和磁盘文件 -func (f *FileSource) ClearCache() { - // 如果有缓存数据,先关闭它(会清理磁盘文件) - if f.cachedData != nil { - f.cachedData.Close() - } - f.cachedData = nil - f.cacheLoaded = false -} - -// ClearRawData 清除原始数据,只保留必要的元信息 -// 用于在处理完成后释放大文件的内存 -func (f *FileSource) ClearRawData() { - // 保留 URL(通常很短),只清除大的 base64 数据 - if f.IsBase64() && len(f.Base64Data) > 1024 { - f.Base64Data = "" - } -} diff --git a/types/request_meta.go b/types/request_meta.go index 2d909d0b..476ea052 100644 --- a/types/request_meta.go +++ b/types/request_meta.go @@ -32,13 +32,12 @@ type TokenCountMeta struct { type FileMeta struct { FileType - MimeType string - Source *FileSource // 统一的文件来源(URL 或 base64) - Detail string // 图片细节级别(low/high/auto) + Source FileSource // 统一的文件来源(URL 或 base64) + Detail string // 图片细节级别(low/high/auto) } // NewFileMeta 创建新的 FileMeta -func NewFileMeta(fileType FileType, source *FileSource) *FileMeta { +func NewFileMeta(fileType FileType, source FileSource) *FileMeta { return &FileMeta{ FileType: fileType, Source: source, @@ -46,7 +45,7 @@ func NewFileMeta(fileType FileType, source *FileSource) *FileMeta { } // NewImageFileMeta 创建图片类型的 FileMeta -func NewImageFileMeta(source *FileSource, detail string) *FileMeta { +func NewImageFileMeta(source FileSource, detail string) *FileMeta { return &FileMeta{ FileType: FileTypeImage, Source: source, From 12a48c620edcefc4d8641d67d4b55fcd920238bf Mon Sep 17 00:00:00 2001 From: RedwindA Date: Mon, 6 Apr 2026 18:07:27 +0800 Subject: [PATCH 09/54] feat(token): add batch API for fetching token keys Add new endpoint POST /api/token/batch/keys to fetch multiple token keys in a single request, improving performance when exporting or copying multiple tokens. - Backend: Add GetTokenKeysBatch controller and GetTokenKeysByIds model - Backend: Add route with CriticalRateLimit and DisableCache middleware - Frontend: Add fetchTokenKeysBatch helper function - Frontend: Update useTokensData to use batch API for token export --- controller/token.go | 23 +++++++++++++++++++++++ i18n/keys.go | 1 + i18n/locales/en.yaml | 1 + i18n/locales/zh-CN.yaml | 1 + i18n/locales/zh-TW.yaml | 1 + model/token.go | 8 ++++++++ router/api-router.go | 1 + web/src/helpers/token.js | 14 ++++++++++++++ web/src/hooks/tokens/useTokensData.jsx | 16 ++++++++++------ 9 files changed, 60 insertions(+), 6 deletions(-) diff --git a/controller/token.go b/controller/token.go index 889b962a..836e9b29 100644 --- a/controller/token.go +++ b/controller/token.go @@ -334,3 +334,26 @@ func DeleteTokenBatch(c *gin.Context) { "data": count, }) } + +func GetTokenKeysBatch(c *gin.Context) { + tokenBatch := TokenBatch{} + if err := c.ShouldBindJSON(&tokenBatch); err != nil || len(tokenBatch.Ids) == 0 { + common.ApiErrorI18n(c, i18n.MsgInvalidParams) + return + } + if len(tokenBatch.Ids) > 100 { + common.ApiErrorI18n(c, i18n.MsgBatchTooMany, map[string]any{"Max": 100}) + return + } + userId := c.GetInt("id") + tokens, err := model.GetTokenKeysByIds(tokenBatch.Ids, userId) + if err != nil { + common.ApiError(c, err) + return + } + keysMap := make(map[int]string) + for _, t := range tokens { + keysMap[t.Id] = t.GetFullKey() + } + common.ApiSuccess(c, gin.H{"keys": keysMap}) +} diff --git a/i18n/keys.go b/i18n/keys.go index 4d98540a..8118dff9 100644 --- a/i18n/keys.go +++ b/i18n/keys.go @@ -25,6 +25,7 @@ const ( MsgDeleteFailed = "common.delete_failed" MsgAlreadyExists = "common.already_exists" MsgNameCannotBeEmpty = "common.name_cannot_be_empty" + MsgBatchTooMany = "common.batch_too_many" ) // Token related messages diff --git a/i18n/locales/en.yaml b/i18n/locales/en.yaml index 54dbf918..75a8bc6e 100644 --- a/i18n/locales/en.yaml +++ b/i18n/locales/en.yaml @@ -21,6 +21,7 @@ common.delete_success: "Deletion successful" common.delete_failed: "Deletion failed" common.already_exists: "Already exists" common.name_cannot_be_empty: "Name cannot be empty" +common.batch_too_many: "Too many items in batch request, maximum is {{.Max}}" # Token messages token.name_too_long: "Token name is too long" diff --git a/i18n/locales/zh-CN.yaml b/i18n/locales/zh-CN.yaml index 4e0b5cd1..1f3b5a7b 100644 --- a/i18n/locales/zh-CN.yaml +++ b/i18n/locales/zh-CN.yaml @@ -22,6 +22,7 @@ common.delete_success: "删除成功" common.delete_failed: "删除失败" common.already_exists: "已存在" common.name_cannot_be_empty: "名称不能为空" +common.batch_too_many: "批量请求数量过多,最多 {{.Max}} 条" # Token messages token.name_too_long: "令牌名称过长" diff --git a/i18n/locales/zh-TW.yaml b/i18n/locales/zh-TW.yaml index dcdd331b..1231c0e2 100644 --- a/i18n/locales/zh-TW.yaml +++ b/i18n/locales/zh-TW.yaml @@ -22,6 +22,7 @@ common.delete_success: "刪除成功" common.delete_failed: "刪除失敗" common.already_exists: "已存在" common.name_cannot_be_empty: "名稱不能為空" +common.batch_too_many: "批次請求數量過多,最多 {{.Max}} 條" # Token messages token.name_too_long: "令牌名稱過長" diff --git a/model/token.go b/model/token.go index 91e5fe1d..b7989ad1 100644 --- a/model/token.go +++ b/model/token.go @@ -481,3 +481,11 @@ func BatchDeleteTokens(ids []int, userId int) (int, error) { return len(tokens), nil } + +func GetTokenKeysByIds(ids []int, userId int) ([]Token, error) { + var tokens []Token + err := DB.Select("id", commonKeyCol). + Where("user_id = ? AND id IN (?)", userId, ids). + Find(&tokens).Error + return tokens, err +} diff --git a/router/api-router.go b/router/api-router.go index 35d11376..bff158a8 100644 --- a/router/api-router.go +++ b/router/api-router.go @@ -257,6 +257,7 @@ func SetApiRouter(router *gin.Engine) { tokenRoute.PUT("/", controller.UpdateToken) tokenRoute.DELETE("/:id", controller.DeleteToken) tokenRoute.POST("/batch", controller.DeleteTokenBatch) + tokenRoute.POST("/batch/keys", middleware.CriticalRateLimit(), middleware.DisableCache(), controller.GetTokenKeysBatch) } usageRoute := apiRouter.Group("/usage") diff --git a/web/src/helpers/token.js b/web/src/helpers/token.js index 84abacf4..a491f384 100644 --- a/web/src/helpers/token.js +++ b/web/src/helpers/token.js @@ -33,6 +33,20 @@ export async function fetchTokenKey(tokenId) { return data.key; } +/** + * 批量获取多个令牌的真实 key + * @param {number[]} tokenIds + * @returns {Promise>} 返回 {id: key} map,key 不带 sk- 前缀 + */ +export async function fetchTokenKeysBatch(tokenIds) { + const response = await API.post('/api/token/batch/keys', { ids: tokenIds }); + const { success, data, message } = response.data || {}; + if (!success || !data?.keys) { + throw new Error(message || 'Failed to fetch token keys'); + } + return data.keys; +} + /** * 获取可用的 token keys * @returns {Promise} 返回 active 状态的不带 sk- 前缀的真实 token key 数组 diff --git a/web/src/hooks/tokens/useTokensData.jsx b/web/src/hooks/tokens/useTokensData.jsx index 9d0770e9..2caffcad 100644 --- a/web/src/hooks/tokens/useTokensData.jsx +++ b/web/src/hooks/tokens/useTokensData.jsx @@ -31,6 +31,7 @@ import { ITEMS_PER_PAGE } from '../../constants'; import { useTableCompactMode } from '../common/useTableCompactMode'; import { fetchTokenKey as fetchTokenKeyById, + fetchTokenKeysBatch, getServerAddress, encodeChannelConnectionString, } from '../../helpers/token'; @@ -408,14 +409,17 @@ export const useTokensData = (openFluentNotification, openCCSwitchModal) => { return; } try { - const keys = await Promise.all( - selectedKeys.map((token) => fetchTokenKey(token, { suppressError: true })), - ); + const ids = selectedKeys.map((token) => token.id); + const keysMap = await fetchTokenKeysBatch(ids); + + setResolvedTokenKeys((prev) => ({ ...prev, ...keysMap })); + let content = ''; - for (let i = 0; i < selectedKeys.length; i++) { - const fullKey = keys[i]; + for (const token of selectedKeys) { + const fullKey = keysMap[token.id]; + if (!fullKey) continue; if (copyType === 'name+key') { - content += `${selectedKeys[i].name} sk-${fullKey}\n`; + content += `${token.name} sk-${fullKey}\n`; } else { content += `sk-${fullKey}\n`; } From 559c98f261a9d730c18e3c49e308c4cd6ab1073a Mon Sep 17 00:00:00 2001 From: irongit <96106336+goodmorning10@users.noreply.github.com> Date: Mon, 6 Apr 2026 22:32:19 +0800 Subject: [PATCH 10/54] feat(web): add ErrorBoundary to prevent full-page crashes --- web/src/components/common/ErrorBoundary.jsx | 52 +++++++++++++++++++++ web/src/components/layout/PageLayout.jsx | 5 +- web/src/i18n/locales/en.json | 4 +- web/src/i18n/locales/fr.json | 4 +- web/src/i18n/locales/ja.json | 4 +- web/src/i18n/locales/ru.json | 4 +- web/src/i18n/locales/vi.json | 4 +- web/src/i18n/locales/zh-CN.json | 4 +- web/src/i18n/locales/zh-TW.json | 4 +- 9 files changed, 77 insertions(+), 8 deletions(-) create mode 100644 web/src/components/common/ErrorBoundary.jsx diff --git a/web/src/components/common/ErrorBoundary.jsx b/web/src/components/common/ErrorBoundary.jsx new file mode 100644 index 00000000..3827969a --- /dev/null +++ b/web/src/components/common/ErrorBoundary.jsx @@ -0,0 +1,52 @@ +import React from 'react'; +import { Empty, Button } from '@douyinfe/semi-ui'; +import { + IllustrationFailure, + IllustrationFailureDark, +} from '@douyinfe/semi-illustrations'; +import { withTranslation } from 'react-i18next'; + +class ErrorBoundary extends React.Component { + constructor(props) { + super(props); + this.state = { hasError: false }; + } + + static getDerivedStateFromError() { + return { hasError: true }; + } + + componentDidCatch(error, errorInfo) { + console.error('[ErrorBoundary]', error, errorInfo); + } + + render() { + if (this.state.hasError) { + const { t } = this.props; + return ( +
+ + } + darkModeImage={ + + } + description={t('页面渲染出错,请刷新页面重试')} + /> + +
+ ); + } + return this.props.children; + } +} + +export default withTranslation()(ErrorBoundary); diff --git a/web/src/components/layout/PageLayout.jsx b/web/src/components/layout/PageLayout.jsx index 51666b5e..ca38ed50 100644 --- a/web/src/components/layout/PageLayout.jsx +++ b/web/src/components/layout/PageLayout.jsx @@ -23,6 +23,7 @@ import SiderBar from './SiderBar'; import App from '../../App'; import FooterBar from './Footer'; import { ToastContainer } from 'react-toastify'; +import ErrorBoundary from '../common/ErrorBoundary'; import React, { useContext, useEffect, useState } from 'react'; import { useIsMobile } from '../../hooks/common/useIsMobile'; import { useSidebarCollapsed } from '../../hooks/common/useSidebarCollapsed'; @@ -216,7 +217,9 @@ const PageLayout = () => { position: 'relative', }} > - + + + {!shouldHideFooter && ( Date: Tue, 7 Apr 2026 15:56:28 +0800 Subject: [PATCH 11/54] fix(pricing): add filtering for pricing based on usable groups --- controller/pricing.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/controller/pricing.go b/controller/pricing.go index d0736119..82523272 100644 --- a/controller/pricing.go +++ b/controller/pricing.go @@ -1,6 +1,7 @@ package controller import ( + "github.com/QuantumNous/new-api/common" "github.com/QuantumNous/new-api/model" "github.com/QuantumNous/new-api/service" "github.com/QuantumNous/new-api/setting/ratio_setting" @@ -8,6 +9,30 @@ import ( "github.com/gin-gonic/gin" ) +func filterPricingByUsableGroups(pricing []model.Pricing, usableGroup map[string]string) []model.Pricing { + if len(pricing) == 0 { + return pricing + } + if len(usableGroup) == 0 { + return []model.Pricing{} + } + + filtered := make([]model.Pricing, 0, len(pricing)) + for _, item := range pricing { + if common.StringsContains(item.EnableGroup, "all") { + filtered = append(filtered, item) + continue + } + for _, group := range item.EnableGroup { + if _, ok := usableGroup[group]; ok { + filtered = append(filtered, item) + break + } + } + } + return filtered +} + func GetPricing(c *gin.Context) { pricing := model.GetPricing() userId, exists := c.Get("id") @@ -31,6 +56,7 @@ func GetPricing(c *gin.Context) { } usableGroup = service.GetUserUsableGroups(group) + pricing = filterPricingByUsableGroups(pricing, usableGroup) // check groupRatio contains usableGroup for group := range ratio_setting.GetGroupRatioCopy() { if _, ok := usableGroup[group]; !ok { From f7cdc727df2669068a53eb51d0415647b3af2ab5 Mon Sep 17 00:00:00 2001 From: zuiho <2324465096@qq.com> Date: Tue, 7 Apr 2026 17:41:08 +0800 Subject: [PATCH 12/54] =?UTF-8?q?fix:=20Claude=20=E6=B5=81=E5=BC=8F?= =?UTF-8?q?=E6=96=AD=E6=B5=81=E6=97=B6=E4=B8=8D=E5=86=8D=E6=95=B4=E4=BB=BD?= =?UTF-8?q?=E8=A6=86=E7=9B=96=20usage=EF=BC=8C=E4=BF=9D=E7=95=99=20cache?= =?UTF-8?q?=20=E8=AE=A1=E8=B4=B9=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit HandleStreamFinalResponse 在 !Done 时调用 ResponseText2Usage 整份覆盖 claudeInfo.Usage,导致 message_start 已获取的 CacheReadInputTokens、 CacheCreationInputTokens 等字段丢失,prompt 退化为占位值 1。 修复: - 只补缺失的 CompletionTokens/PromptTokens,保留已有 cache 数据 - PromptTokens 兜底改用 info.GetEstimatePromptTokens()(与其他渠道对齐) Fixes #4127 --- relay/channel/claude/relay-claude.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/relay/channel/claude/relay-claude.go b/relay/channel/claude/relay-claude.go index dceff5e7..21427b1f 100644 --- a/relay/channel/claude/relay-claude.go +++ b/relay/channel/claude/relay-claude.go @@ -809,7 +809,15 @@ func HandleStreamFinalResponse(c *gin.Context, info *relaycommon.RelayInfo, clau if common.DebugEnabled { common.SysLog("claude response usage is not complete, maybe upstream error") } - claudeInfo.Usage = service.ResponseText2Usage(c, claudeInfo.ResponseText.String(), info.UpstreamModelName, claudeInfo.Usage.PromptTokens) + // 只补缺失字段,不整份覆盖——保留 message_start 已拿到的 cache 字段 + fallback := service.ResponseText2Usage(c, claudeInfo.ResponseText.String(), info.UpstreamModelName, info.GetEstimatePromptTokens()) + if claudeInfo.Usage.CompletionTokens == 0 { + claudeInfo.Usage.CompletionTokens = fallback.CompletionTokens + } + if claudeInfo.Usage.PromptTokens == 0 { + claudeInfo.Usage.PromptTokens = fallback.PromptTokens + } + claudeInfo.Usage.TotalTokens = claudeInfo.Usage.PromptTokens + claudeInfo.Usage.CompletionTokens } if claudeInfo.Usage != nil { claudeInfo.Usage.UsageSemantic = "anthropic" From c66636a0c737d093a7e813bd4ad8b3f9bc0add60 Mon Sep 17 00:00:00 2001 From: zuiho <2324465096@qq.com> Date: Tue, 7 Apr 2026 17:52:11 +0800 Subject: [PATCH 13/54] =?UTF-8?q?fix:=20=E9=87=87=E7=BA=B3=20CodeRabbit=20?= =?UTF-8?q?=E5=BB=BA=E8=AE=AE=EF=BC=8C!Done=20=E6=97=B6=E4=B9=9F=E7=94=A8?= =?UTF-8?q?=20fallback=20=E8=A6=86=E7=9B=96=E5=8D=A0=E4=BD=8D=20Completion?= =?UTF-8?q?Tokens?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit message_start 阶段可能给 CompletionTokens 非零占位值, 只检查 == 0 不够,加上 !Done && fallback > current 条件。 --- relay/channel/claude/relay-claude.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/relay/channel/claude/relay-claude.go b/relay/channel/claude/relay-claude.go index 21427b1f..2982945c 100644 --- a/relay/channel/claude/relay-claude.go +++ b/relay/channel/claude/relay-claude.go @@ -811,7 +811,8 @@ func HandleStreamFinalResponse(c *gin.Context, info *relaycommon.RelayInfo, clau } // 只补缺失字段,不整份覆盖——保留 message_start 已拿到的 cache 字段 fallback := service.ResponseText2Usage(c, claudeInfo.ResponseText.String(), info.UpstreamModelName, info.GetEstimatePromptTokens()) - if claudeInfo.Usage.CompletionTokens == 0 { + if claudeInfo.Usage.CompletionTokens == 0 || + (!claudeInfo.Done && fallback.CompletionTokens > claudeInfo.Usage.CompletionTokens) { claudeInfo.Usage.CompletionTokens = fallback.CompletionTokens } if claudeInfo.Usage.PromptTokens == 0 { From 741aaf44368daf30f36e6b67beb10b3347308bef Mon Sep 17 00:00:00 2001 From: Clansty Date: Tue, 7 Apr 2026 20:00:34 +0800 Subject: [PATCH 14/54] fix: wrap scope tag labels with t() for i18n support --- web/src/pages/Setting/Operation/SettingsChannelAffinity.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/src/pages/Setting/Operation/SettingsChannelAffinity.jsx b/web/src/pages/Setting/Operation/SettingsChannelAffinity.jsx index 192dc291..7d3cdd6e 100644 --- a/web/src/pages/Setting/Operation/SettingsChannelAffinity.jsx +++ b/web/src/pages/Setting/Operation/SettingsChannelAffinity.jsx @@ -583,9 +583,9 @@ export default function SettingsChannelAffinity(props) { title: t('作用域'), render: (_, record) => { const tags = []; - if (record?.include_using_group) tags.push('分组'); - if (record?.include_model_name) tags.push('模型'); - if (record?.include_rule_name) tags.push('规则'); + if (record?.include_using_group) tags.push(t('分组')); + if (record?.include_model_name) tags.push(t('模型')); + if (record?.include_rule_name) tags.push(t('规则')); if (tags.length === 0) return '-'; return tags.map((x) => ( From cf1b485389d105182d982738c06ef203156a5a89 Mon Sep 17 00:00:00 2001 From: borx <53216212+binorxin@users.noreply.github.com> Date: Tue, 7 Apr 2026 21:12:13 +0800 Subject: [PATCH 15/54] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=20=E5=90=AF?= =?UTF-8?q?=E7=94=A8=E9=94=99=E8=AF=AF=E6=97=A5=E5=BF=97=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E5=88=B0env=E9=85=8D=E7=BD=AE=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.env.example b/.env.example index 0a64758d..b152c2a1 100644 --- a/.env.example +++ b/.env.example @@ -19,6 +19,8 @@ # HOSTNAME=your-hostname # 数据库相关配置 +# 启用错误日志记录 +# ERROR_LOG_ENABLED=true # 数据库连接字符串 # SQL_DSN=user:password@tcp(127.0.0.1:3306)/dbname?parseTime=true # 日志数据库连接字符串 From dc83c4af311fc961646af994c54efe24bc318eb8 Mon Sep 17 00:00:00 2001 From: CaIon Date: Wed, 8 Apr 2026 00:59:50 +0800 Subject: [PATCH 16/54] refactor(settings): update RatioSetting component to use ModelPricingCombined and adjust tab structure - Replaced ModelRatioSettings with ModelPricingCombined in the RatioSetting component. - Updated tab structure to prioritize pricing settings over model settings. - Removed unused imports for ModelRatioSettings and ModelSettingsVisualEditor. --- web/src/components/settings/RatioSetting.jsx | 13 +- .../table/tokens/TokensColumnDefs.jsx | 17 +- .../components/table/tokens/TokensTable.jsx | 3 + .../table/tokens/modals/EditTokenModal.jsx | 8 + web/src/hooks/tokens/useTokensData.jsx | 13 + web/src/i18n/locales/en.json | 747 ++++++----- web/src/i18n/locales/fr.json | 771 ++++++----- web/src/i18n/locales/ja.json | 757 ++++++----- web/src/i18n/locales/ru.json | 765 ++++++----- web/src/i18n/locales/vi.json | 744 ++++++----- web/src/i18n/locales/zh-TW.json | 1190 +++++++++-------- .../Setting/Ratio/GroupRatioSettings.jsx | 655 +++++++-- .../Setting/Ratio/ModelPricingCombined.jsx | 50 + .../Ratio/components/AutoGroupList.jsx | 169 +++ .../Ratio/components/GroupGroupRatioRules.jsx | 206 +++ .../components/GroupSpecialUsableRules.jsx | 276 ++++ .../Setting/Ratio/components/GroupTable.jsx | 242 ++++ 17 files changed, 4382 insertions(+), 2244 deletions(-) create mode 100644 web/src/pages/Setting/Ratio/ModelPricingCombined.jsx create mode 100644 web/src/pages/Setting/Ratio/components/AutoGroupList.jsx create mode 100644 web/src/pages/Setting/Ratio/components/GroupGroupRatioRules.jsx create mode 100644 web/src/pages/Setting/Ratio/components/GroupSpecialUsableRules.jsx create mode 100644 web/src/pages/Setting/Ratio/components/GroupTable.jsx diff --git a/web/src/components/settings/RatioSetting.jsx b/web/src/components/settings/RatioSetting.jsx index 90858bf8..c1fa3b86 100644 --- a/web/src/components/settings/RatioSetting.jsx +++ b/web/src/components/settings/RatioSetting.jsx @@ -21,9 +21,8 @@ import React, { useEffect, useState } from 'react'; import { Card, Spin, Tabs } from '@douyinfe/semi-ui'; import { useTranslation } from 'react-i18next'; +import ModelPricingCombined from '../../pages/Setting/Ratio/ModelPricingCombined'; import GroupRatioSettings from '../../pages/Setting/Ratio/GroupRatioSettings'; -import ModelRatioSettings from '../../pages/Setting/Ratio/ModelRatioSettings'; -import ModelSettingsVisualEditor from '../../pages/Setting/Ratio/ModelSettingsVisualEditor'; import ModelRatioNotSetEditor from '../../pages/Setting/Ratio/ModelRationNotSetEditor'; import UpstreamRatioSync from '../../pages/Setting/Ratio/UpstreamRatioSync'; @@ -95,18 +94,14 @@ const RatioSetting = () => { return ( - {/* 模型倍率设置以及价格编辑器 */} - - - + + + - - - diff --git a/web/src/components/table/tokens/TokensColumnDefs.jsx b/web/src/components/table/tokens/TokensColumnDefs.jsx index d78f7545..86b33dd1 100644 --- a/web/src/components/table/tokens/TokensColumnDefs.jsx +++ b/web/src/components/table/tokens/TokensColumnDefs.jsx @@ -88,7 +88,7 @@ const renderStatus = (text, record, t) => { }; // Render group column -const renderGroupColumn = (text, record, t) => { +const renderGroupColumn = (text, record, t, groupRatios = {}) => { if (text === 'auto') { return ( { ); } - return renderGroup(text); + const ratio = groupRatios[text]; + return ( + + {renderGroup(text)} + {ratio !== undefined && ( + + {ratio}x + + )} + + ); }; // Render token key column with show/hide and copy functionality @@ -469,6 +479,7 @@ export const getTokensColumns = ({ setEditingToken, setShowEdit, refresh, + groupRatios = {}, }) => { return [ { @@ -490,7 +501,7 @@ export const getTokensColumns = ({ title: t('分组'), dataIndex: 'group', key: 'group', - render: (text, record) => renderGroupColumn(text, record, t), + render: (text, record) => renderGroupColumn(text, record, t, groupRatios), }, { title: t('密钥'), diff --git a/web/src/components/table/tokens/TokensTable.jsx b/web/src/components/table/tokens/TokensTable.jsx index 906aad23..a50c1938 100644 --- a/web/src/components/table/tokens/TokensTable.jsx +++ b/web/src/components/table/tokens/TokensTable.jsx @@ -49,6 +49,7 @@ const TokensTable = (tokensData) => { setEditingToken, setShowEdit, refresh, + groupRatios, t, } = tokensData; @@ -67,6 +68,7 @@ const TokensTable = (tokensData) => { setEditingToken, setShowEdit, refresh, + groupRatios, }); }, [ t, @@ -81,6 +83,7 @@ const TokensTable = (tokensData) => { setEditingToken, setShowEdit, refresh, + groupRatios, ]); // Handle compact mode by removing fixed positioning diff --git a/web/src/components/table/tokens/modals/EditTokenModal.jsx b/web/src/components/table/tokens/modals/EditTokenModal.jsx index fce48201..93664580 100644 --- a/web/src/components/table/tokens/modals/EditTokenModal.jsx +++ b/web/src/components/table/tokens/modals/EditTokenModal.jsx @@ -366,6 +366,14 @@ const EditTokenModal = (props) => { placeholder={t('令牌分组,默认为用户的分组')} optionList={groups} renderOptionItem={renderGroupOption} + filter={(input, option) => { + const q = input.toLowerCase(); + return ( + option.value?.toLowerCase().includes(q) || + (typeof option.label === 'string' && + option.label.toLowerCase().includes(q)) + ); + }} showClear style={{ width: '100%' }} /> diff --git a/web/src/hooks/tokens/useTokensData.jsx b/web/src/hooks/tokens/useTokensData.jsx index 2caffcad..abee82b3 100644 --- a/web/src/hooks/tokens/useTokensData.jsx +++ b/web/src/hooks/tokens/useTokensData.jsx @@ -42,6 +42,7 @@ export const useTokensData = (openFluentNotification, openCCSwitchModal) => { // Basic state const [tokens, setTokens] = useState([]); const [loading, setLoading] = useState(true); + const [groupRatios, setGroupRatios] = useState({}); const [activePage, setActivePage] = useState(1); const [tokenCount, setTokenCount] = useState(0); const [pageSize, setPageSize] = useState(ITEMS_PER_PAGE); @@ -437,6 +438,17 @@ export const useTokensData = (openFluentNotification, openCCSwitchModal) => { .catch((reason) => { showError(reason); }); + API.get('/api/user/self/groups') + .then((res) => { + if (res.data.success && res.data.data) { + const ratios = {}; + for (const [name, info] of Object.entries(res.data.data)) { + ratios[name] = info.ratio; + } + setGroupRatios(ratios); + } + }) + .catch(() => {}); }, [pageSize]); return { @@ -447,6 +459,7 @@ export const useTokensData = (openFluentNotification, openCCSwitchModal) => { tokenCount, pageSize, searching, + groupRatios, // Selection state selectedKeys, diff --git a/web/src/i18n/locales/en.json b/web/src/i18n/locales/en.json index aade2fd3..1e0671a8 100644 --- a/web/src/i18n/locales/en.json +++ b/web/src/i18n/locales/en.json @@ -9,42 +9,41 @@ " 吗?": "?", " 秒": "s", " 秒。": " seconds.", - ",当前无生效订阅,将自动使用钱包": ", no active subscription. Wallet will be used automatically.", - ",时间:": ",time:", - ",点击更新": ", click Update", - "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(Currently only supports Epay interface, the default callback address is the server address above!)", + "$/1M tokens": "$/1M tokens", "(筛选后显示 {{count}} 条)_one": "(Showing {{count}} item after filtering)", "(筛选后显示 {{count}} 条)_other": "(Showing {{count}} items after filtering)", "(输入 {{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}}", - "[最多请求次数]和[最多请求完成次数]的最大值为2147483647。": "The maximum value of [Maximum request count] and [Maximum request completion count] is 2147483647.", - "[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。": "[Maximum request count] must be greater than or equal to 0, [Maximum request completion count] must be greater than or equal to 1.", - "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", - "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", - "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", - "{{name}} ID": "{{name}} ID", - "{{ratioType}} {{ratio}}": "{{ratioType}} {{ratio}}", - "• 视频服务商的跨域限制": "• Cross-origin limitations from the video provider", - "• 防盗链保护机制": "• Hotlink protection mechanisms", - "• 需要特定的请求头或认证": "• Specific headers or authentication are required", - "© {{currentYear}}": "© {{currentYear}}", - "| 基于": " | Based on ", - "$/1M tokens": "$/1M tokens", + "(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}": "(Input {{nonImageInput}} tokens + Image input {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}", "0 - 最低": "0 - Lowest", "0 表示不限": "0 means unlimited", "0.002-1之间的小数": "Decimal between 0.002-1", "0.1以上的小数": "Decimal above 0.1", "1) 点击「打开授权页面」完成登录;2) 浏览器会跳转到 localhost(页面打不开也没关系);3) 复制地址栏完整 URL 粘贴到下方;4) 点击「生成并填入」。": "1) Click \"Open Authorization Page\" to complete login; 2) The browser will redirect to localhost (it's OK if the page doesn't load); 3) Copy the full URL from the address bar and paste it below; 4) Click \"Generate and Fill\".", + "1. 管理员在此创建分组并设置倍率": "1. Admin creates groups and sets ratios here", "10 - 最高": "10 - Highest", + "1h缓存创建 {{price}} / 1M tokens": "1h cache creation {{price}} / 1M tokens", + "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "1h cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "1h cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", + "1h缓存创建价格 {{symbol}}{{price}} / 1M tokens": "1h cache creation price {{symbol}}{{price}} / 1M tokens", "1h缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (1h缓存创建倍率: {{cacheCreationRatio1h}})": "1h cache creation price: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (1h cache creation ratio: {{cacheCreationRatio1h}})", + "1h缓存创建价格:{{symbol}}{{price}} / 1M tokens": "1h cache creation price: {{symbol}}{{price}} / 1M tokens", + "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}}", "2 - 低": "2 - Low", + "2. 管理员在用户管理中将用户分配到对应分组(如 vip)": "2. Admin assigns users to groups in User Management (e.g., vip)", "2025年5月10日后添加的渠道,不需要再在部署的时候移除模型名称中的\".\"": "After May 10, 2025, channels added do not need to remove the dot in the model name during deployment", + "3. 用户创建令牌时,下拉菜单中出现勾选了「用户可选」的分组": "3. When users create tokens, groups with \"User Selectable\" checked appear in the dropdown", "360智脑": "360 AI Brain", + "4. 令牌使用所选分组的倍率进行计费": "4. Token uses the selected group's ratio for billing", "5 - 正常(默认)": "5 - Normal (default)", + "5m缓存创建 {{price}} / 1M tokens": "5m cache creation {{price}} / 1M tokens", + "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "5m cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "5m cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", + "5m缓存创建价格 {{symbol}}{{price}} / 1M tokens": "5m cache creation price {{symbol}}{{price}} / 1M tokens", "5m缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (5m缓存创建倍率: {{cacheCreationRatio5m}})": "5m cache creation price: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (5m cache creation ratio: {{cacheCreationRatio5m}})", + "5m缓存创建价格:{{symbol}}{{price}} / 1M tokens": "5m cache creation price: {{symbol}}{{price}} / 1M tokens", + "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}}", "8 - 高": "8 - High", "AGPL v3.0协议": "AGPL v3.0 License", "AI 对话": "AI Chat", @@ -66,14 +65,15 @@ "API地址": "Base URL", "API渠道配置": "API channel configuration", "API端点": "API endpoints", - "Authorization callback URL 填": "Fill in the Authorization callback URL", "Authorization Endpoint": "Authorization Endpoint", - "auto分组调用链路": "auto group call chain", + "Authorization callback URL 填": "Fill in the Authorization callback URL", "Available": "Available", "Bark推送URL": "Bark Push URL", "Bark推送URL必须以http://或https://开头": "Bark push URL must start with http:// or https://", "Bark通知": "Bark notification", "Basic Auth 头": "Basic Auth Header", + "CPU 使用率超过此值时拒绝请求": "Reject requests when CPU usage exceeds this value", + "CPU 阈值 (%)": "CPU Threshold (%)", "Cache Directory": "Cache Directory", "Cached tokens": "Cached tokens", "Cached tokens 占比口径由后端返回:Claude 语义按 cached/(prompt+cached),其余按 cached/prompt。": "Cached token ratio is returned by the backend: Claude calculates as cached/(prompt+cached), others as cached/prompt.", @@ -81,28 +81,22 @@ "ChatCompletions→Responses 兼容配置": "ChatCompletions→Responses Compatibility Configuration", "ChatCompletions→Responses 兼容配置(Beta)": "ChatCompletions→Responses Compatibility (Beta)", "Claude 强制 beta=true": "Claude Force beta=true", + "Claude会在原有请求头基础上追加这些值,不会覆盖已有同名请求头;重复值会自动忽略。": "Claude appends these values on top of existing request headers. Existing headers are not overwritten, and duplicate values are ignored automatically.", "Claude思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Claude thinking adaptation BudgetTokens = MaxTokens * BudgetTokens percentage", "Claude设置": "Claude settings", "Claude请求头覆盖": "Claude request header override", "Claude请求头追加": "Claude request header append", - "Claude会在原有请求头基础上追加这些值,不会覆盖已有同名请求头;重复值会自动忽略。": "Claude appends these values on top of existing request headers. Existing headers are not overwritten, and duplicate values are ignored automatically.", "Client ID": "Client ID", "Client Secret": "Client Secret", "Codex 授权": "Codex Authorization", "Codex 渠道不支持批量创建": "Codex channel does not support batch creation", - "common.changeLanguage": "Change Language", "Completion tokens": "Completion tokens", "Configuration": "Configuration", - "context_int/context_string 从请求上下文读取;gjson 从入口请求的 JSON body 按 gjson path 读取。": "context_int/context_string reads from request context; gjson reads from the entry request JSON body using gjson path.", - "CPU 使用率超过此值时拒绝请求": "Reject requests when CPU usage exceeds this value", - "CPU 阈值 (%)": "CPU Threshold (%)", "Creem API 密钥,敏感信息不显示": "Creem API key, sensitive information not displayed", "Creem Setting Tips": "Creem only supports preset fixed-amount products. These products and their prices need to be created and configured in advance on the Creem website, so custom dynamic amount top-ups are not supported. Configure the product name and price on Creem, obtain the Product Id, and then fill it in for the product below. Set the top-up amount and display price for this product in the new API.", "Creem 介绍": "Creem is the payment partner you always deserved, we strive for simplicity and straightforwardness on our APIs.", "Creem 充值": "Creem Recharge", "Creem 设置": "Creem Setting", - "default为默认设置,可单独设置每个分类的安全等级": "\"default\" is the default setting, and each category can be set separately", - "default为默认设置,可单独设置每个模型的版本": "\"default\" is the default setting, and each model can be set separately", "Dify渠道只适配chatflow和agent,并且agent不支持图片!": "Dify channel only supports chatflow and agent, and agent does not support images!", "Discord": "Discord", "Discord Client ID": "Discord Client ID", @@ -112,11 +106,12 @@ "Discovery scopes": "Discovery scopes", "Discovery 建议 scopes:": "Recommended Discovery scopes:", "EUR (欧元)": "EUR (Euro)", - "false": "false", "GC execution failed": "GC execution failed", "GC 已执行": "GC executed", "GC 执行失败": "GC execution failed", "GC 次数": "GC Count", + "GPU/容器": "GPU/Container", + "GPU数量": "Number of GPUs", "Gemini安全设置": "Gemini safety settings", "Gemini思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Gemini thinking adaptation BudgetTokens = MaxTokens * BudgetTokens percentage", "Gemini思考适配设置": "Gemini thinking adaptation settings", @@ -131,14 +126,10 @@ "Gotify服务器地址": "Gotify server address", "Gotify服务器地址必须以http://或https://开头": "Gotify server address must start with http:// or https://", "Gotify通知": "Gotify notification", - "GPU/容器": "GPU/Container", - "GPU数量": "Number of GPUs", "Grok设置": "Grok Settings", "Haiku 模型": "Haiku Model", "Homepage URL 填": "Fill in the Homepage URL", "ID": "ID", - "include_obfuscation 用于控制 Responses 流混淆字段。默认关闭以避免客户端关闭该安全保护": "include_obfuscation controls obfuscation fields in Responses stream. Disabled by default to prevent clients from disabling this security protection", - "inference_geo 字段用于控制 Claude 数据驻留推理区域。默认关闭以避免未经授权透传地域信息": "The inference_geo field controls Claude's data residency inference region. Disabled by default to prevent unauthorized pass-through of geographic information", "IP": "IP", "IP白名单": "IP Whitelist", "IP白名单(支持CIDR表达式)": "IP whitelist (supports CIDR expressions)", @@ -148,6 +139,7 @@ "JSON 已格式化": "JSON Formatted", "JSON 文本": "JSON Text", "JSON 无效": "Invalid JSON", + "JSON 格式参考": "JSON Reference", "JSON 模式": "JSON Mode", "JSON 模式支持手动输入或上传服务账号 JSON": "JSON mode supports manual input or upload service account JSON", "JSON格式密钥,请确保格式正确": "JSON format key, please ensure the format is correct", @@ -165,8 +157,8 @@ "LinuxDO": "LinuxDO", "LinuxDO ID": "LinuxDO ID", "Logo 图片地址": "Logo image address", - "Midjourney 任务记录": "Midjourney Task Records", "MIT许可证": "MIT License", + "Midjourney 任务记录": "Midjourney Task Records", "New API项目仓库地址:": "New API project repository address: ", "NewAPI 默认不会将入口请求的 User-Agent 透传到上游渠道;该条件仅用于识别访问本站点的客户端。": "NewAPI does not pass the incoming request's User-Agent to upstream channels by default; this condition is only used to identify clients accessing this site.", "OAuth Client ID": "OAuth Client ID", @@ -179,6 +171,7 @@ "Ollama 模型管理": "Ollama Model Management", "Ollama 版本信息": "Ollama Version Info", "Opus 模型": "Opus Model", + "POST 参数": "POST Parameters", "Passkey": "Passkey", "Passkey 已解绑": "Passkey removed", "Passkey 已重置": "Passkey has been reset", @@ -187,54 +180,51 @@ "Passkey 注册成功": "Passkey registration successful", "Passkey 登录": "Passkey Login", "Ping间隔(秒)": "Ping Interval (seconds)", - "POST 参数": "POST Parameters", - "price_xxx 的商品价格 ID,新建产品后可获得": "Product price ID for price_xxx, available after creating new product", "Prompt cache hit tokens": "Prompt cache hit tokens", "Prompt tokens": "Prompt tokens", "Reasoning Effort": "Reasoning Effort", "Recharge Quota": "Recharge Quota", "Request ID": "Request ID", - "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "The safety_identifier field helps OpenAI identify application users who may violate usage policies. Disabled by default to protect user privacy", - "Scopes(可选)": "Scopes (optional)", - "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "The service_tier field is used to specify service level. Allowing pass-through may result in higher billing than expected. Disabled by default to avoid extra charges", - "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "Stripe key for sk_xxx or rk_xxx, sensitive information not displayed", "SMTP 发送者邮箱": "SMTP Sender Email", "SMTP 服务器地址": "SMTP Server Address", "SMTP 端口": "SMTP Port", "SMTP 访问凭证": "SMTP Access Credential", "SMTP 账户": "SMTP Account", - "Sonnet 模型": "Sonnet Model", "SSE 事件": "SSE Events", "SSE数据流": "SSE Stream", "SSRF防护开关详细说明": "Master switch controls whether SSRF protection is enabled. When disabled, all SSRF checks are bypassed, allowing access to any URL. ⚠️ Only disable this feature in completely trusted environments.", "SSRF防护设置": "SSRF Protection Settings", "SSRF防护详细说明": "SSRF protection prevents malicious users from using your server to access internal network resources. Configure whitelists for trusted domains/IPs and restrict allowed ports. Applies to file downloads, webhooks, and notifications.", - "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "The store field authorizes OpenAI to store request data for product evaluation and optimization. Disabled by default. Enabling may cause Codex to malfunction", + "Scopes(可选)": "Scopes (optional)", + "Sonnet 模型": "Sonnet Model", "Stripe 设置": "Stripe Settings", "Stripe/Creem 商品ID(可选)": "Stripe/Creem Product ID (optional)", "Stripe/Creem 需在第三方平台创建商品并填入 ID": "Stripe/Creem products must be created on the third-party platform and the ID filled in", + "TTL(秒)": "TTL (seconds)", + "TTL(秒,0 表示默认)": "TTL (seconds, 0 for default)", "Telegram": "Telegram", "Telegram Bot Token": "Telegram Bot Token", "Telegram Bot 名称": "Telegram Bot Name", "Telegram ID": "Telegram ID", "Token Endpoint": "Token Endpoint", - "token 会按倍率换算成“额度/次数”,请求结束后再做差额结算(补扣/返还)。": "Tokens are converted to quota/usage count by ratio. After the request completes, the difference is settled (additional deduction/refund).", "Total tokens": "Total tokens", - "true": "true", - "TTL(秒,0 表示默认)": "TTL (seconds, 0 for default)", - "TTL(秒)": "TTL (seconds)", "Turnstile Secret Key": "Turnstile Secret Key", "Turnstile Site Key": "Turnstile Site Key", - "Unix时间戳": "Unix timestamp", - "Uptime Kuma地址": "Uptime Kuma Address", - "Uptime Kuma监控分类管理,可以配置多个监控分类用于服务状态展示(最多20个)": "Uptime Kuma monitoring category management, you can configure multiple monitoring categories for service status display (maximum 20)", "URL 标识,只能包含小写字母、数字和连字符": "URL identifier, only lowercase letters, numbers, and hyphens allowed", "URL链接": "URL Link", "USD (美元)": "USD (US Dollar)", + "Unix时间戳": "Unix timestamp", + "Uptime Kuma地址": "Uptime Kuma Address", + "Uptime Kuma监控分类管理,可以配置多个监控分类用于服务状态展示(最多20个)": "Uptime Kuma monitoring category management, you can configure multiple monitoring categories for service status display (maximum 20)", "User Info Endpoint": "User Info Endpoint", "User-Agent include(每行一个,可不写)": "User-Agent include (one per line, optional)", "Value 正则": "Value Regex", "Vertex AI 不支持 functionResponse.id 字段,开启后将自动移除该字段": "Vertex AI does not support the functionResponse.id field. When enabled, this field will be automatically removed", + "WeChat Server 服务器地址": "WeChat Server Address", + "WeChat Server 访问凭证": "WeChat Server Access Credential", + "Web 搜索 {{count}} 次 * {{symbol}}{{price}} / 1K 次": "Web search {{count}} calls * {{symbol}}{{price}} / 1K calls", + "Web 搜索调用 {{webSearchCallCount}} 次": "Web search called {{webSearchCallCount}} times", + "Web 搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Web search: {{count}} / 1K * unit price {{price}} * {{ratioType}} {{ratio}} = {{amount}}", "Webhook 密钥": "Webhook Secret", "Webhook 签名密钥": "Webhook Signature Key", "Webhook地址": "Webhook URL", @@ -242,49 +232,89 @@ "Webhook请求结构说明": "Webhook request structure description", "Webhook通知": "Webhook notification", "Web搜索价格:{{symbol}}{{price}} / 1K 次": "Web Search Price: {{symbol}}{{price}} / 1K requests", - "WeChat Server 服务器地址": "WeChat Server Address", - "WeChat Server 访问凭证": "WeChat Server Access Credential", "Well-Known URL": "Well-Known URL", "Well-Known URL 必须以 http:// 或 https:// 开头": "Well-Known URL must start with http:// or https://", - "whsec_xxx 的 Webhook 签名密钥,敏感信息不显示": "Webhook signature key for whsec_xxx, sensitive information not displayed", "Worker地址": "Worker Address", "Worker密钥": "Worker Key", + "[最多请求次数]和[最多请求完成次数]的最大值为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.", + "auto分组调用链路": "auto group call chain", + "common.changeLanguage": "Change Language", + "context_int/context_string 从请求上下文读取;gjson 从入口请求的 JSON body 按 gjson path 读取。": "context_int/context_string reads from request context; gjson reads from the entry request JSON body using gjson path.", + "default 和 vip 只能由管理员在「用户管理」中分配给用户。适用于按用户等级定价、内部测试等不希望用户自主选择的场景。": "default and vip can only be assigned to users by admin in \"User Management\". Suitable for tiered pricing, internal testing, or other scenarios where user self-selection is not desired.", + "default为默认设置,可单独设置每个分类的安全等级": "\"default\" is the default setting, and each category can be set separately", + "default为默认设置,可单独设置每个模型的版本": "\"default\" is the default setting, and each model can be set separately", + "false": "false", + "include_obfuscation 用于控制 Responses 流混淆字段。默认关闭以避免客户端关闭该安全保护": "include_obfuscation controls obfuscation fields in Responses stream. Disabled by default to prevent clients from disabling this security protection", + "inference_geo 字段用于控制 Claude 数据驻留推理区域。默认关闭以避免未经授权透传地域信息": "The inference_geo field controls Claude's data residency inference region. Disabled by default to prevent unauthorized pass-through of geographic information", + "price_xxx 的商品价格 ID,新建产品后可获得": "Product price ID for price_xxx, available after creating new product", + "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "The safety_identifier field helps OpenAI identify application users who may violate usage policies. Disabled by default to protect user privacy", + "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "The service_tier field is used to specify service level. Allowing pass-through may result in higher billing than expected. Disabled by default to avoid extra charges", + "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "Stripe key for sk_xxx or rk_xxx, sensitive information not displayed", + "standard 已被移除,vip 用户看不到": "standard has been removed, vip users cannot see it", + "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "The store field authorizes OpenAI to store request data for product evaluation and optimization. Disabled by default. Enabling may cause Codex to malfunction", + "token 会按倍率换算成“额度/次数”,请求结束后再做差额结算(补扣/返还)。": "Tokens are converted to quota/usage count by ratio. After the request completes, the difference is settled (additional deduction/refund).", + "true": "true", + "whsec_xxx 的 Webhook 签名密钥,敏感信息不显示": "Webhook signature key for whsec_xxx, sensitive information not displayed", + "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", + "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", + "{{name}} ID": "{{name}} ID", + "{{ratioType}} {{ratio}}": "{{ratioType}} {{ratio}}", + "{{ratioType}} {{ratio}}x": "{{ratioType}} {{ratio}}x", + "| 基于": " | Based on ", + "© {{currentYear}}": "© {{currentYear}}", + "• 视频服务商的跨域限制": "• Cross-origin limitations from the video provider", + "• 防盗链保护机制": "• Hotlink protection mechanisms", + "• 需要特定的请求头或认证": "• Specific headers or authentication are required", + "「用户可选」决定用户创建令牌时能否自主选择该分组。未勾选的分组只能由管理员在后台分配给用户,不会出现在用户的令牌创建页面中。": "\"User Selectable\" controls whether users can choose this group when creating tokens. Unchecked groups can only be assigned by admin and won't appear in the token creation page.", "一个月": "A month", "一天": "One day", "一小时": "One hour", "一次调用消耗多少刀,优先级大于模型倍率": "How much USD one call costs, priority over model ratio", - "一行一个,不区分大小写": "One line per keyword, not case-sensitive", "一行一个屏蔽词,不需要符号分割": "One line per sensitive word, no symbols are required", + "一行一个,不区分大小写": "One line per keyword, not case-sensitive", "一键填充到 FluentRead": "One-click fill to FluentRead", + "三种操作的区别:": "Differences between the three operations:", "上一个表单块": "Previous form block", "上一步": "Previous", "上次保存: ": "Last saved: ", "上游倍率同步": "Upstream ratio synchronization", + "上游模型管理": "Upstream Model Management", "上游返回": "Upstream response", "下一个表单块": "Next form block", "下一步": "Next", "下午好": "Good afternoon", "下载日志": "Download Logs", + "下面展示这个模型保存后会写入哪些后端字段,便于和原始 JSON 编辑框保持一致。": "The fields below show which backend values will be written after saving, so you can keep them aligned with the raw JSON editors.", + "不会出现": "will not appear", "不再提醒": "Do not remind again", + "不勾选用户可选": "Not user-selectable", "不升级": "No upgrade", + "不变": "unchanged", "不同用户分组的价格信息": "Price information for different user groups", "不填则为模型列表第一个": "First model in list if empty", "不建议使用": "Not recommended", "不支持": "Not supported", "不是合法的 JSON 字符串": "Not a valid JSON string", "不更改": "Not change", + "不配置特殊倍率时:": "Without special ratios:", + "不配置规则时,所有用户看到的下拉框一样:": "Without rules, all users see the same dropdown:", "不重置": "No Reset", + "不重试": "No Retry", "不限": "Unlimited", "不限制": "Unlimited", "与本地相同": "Same as local", "专属倍率": "Exclusive group ratio", + "专属分组": "Exclusive group", + "两个分组都勾选了「用户可选」,所以用户创建令牌时可以看到这两个选项:": "Both groups have \"User Selectable\" checked, so users can see these two options when creating tokens:", "两次输入的密码不一致": "The two passwords entered do not match", "两次输入的密码不一致!": "The passwords entered twice are inconsistent!", "两步验证": "Two-Factor Authentication", - "两步验证(2FA)为您的账户提供额外的安全保护。启用后,登录时需要输入密码和验证器应用生成的验证码。": "Two-factor authentication (2FA) provides additional security protection for your account. After enabling, you need to enter your password and the verification code generated by the authenticator application when logging in.", "两步验证启用成功!": "Two-factor authentication enabled successfully!", "两步验证已禁用": "Two-factor authentication has been disabled", "两步验证设置": "Two-factor authentication settings", + "两步验证(2FA)为您的账户提供额外的安全保护。启用后,登录时需要输入密码和验证器应用生成的验证码。": "Two-factor authentication (2FA) provides additional security protection for your account. After enabling, you need to enter your password and the verification code generated by the authenticator application when logging in.", "个": "individual", "个GPU": " GPUs", "个人中心": "Personal center", @@ -302,6 +332,7 @@ "个生效中": "active", "个部署吗?此操作不可逆。": " deployments? This operation cannot be undone.", "中午好": "Good afternoon", + "为 vip 用户配置规则:": "Configure rules for vip users:", "为一个 JSON 对象,例如:{\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}": "Is a JSON object, e.g.: {\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}", "为一个 JSON 数组,例如:[10, 20, 50, 100, 200, 500]": "Is a JSON array, e.g.: [10, 20, 50, 100, 200, 500]", "为一个 JSON 文本": "Is a JSON text", @@ -316,7 +347,9 @@ "为一个 JSON 文本,键为组名称,值为倍率": "Is a JSON text with group name as key and ratio as value", "为了保护账户安全,请验证您的两步验证码。": "To protect account security, please verify your two-factor authentication code.", "为了保护账户安全,请验证您的身份。": "To protect account security, please verify your identity.", + "为什么 default 不勾选「用户可选」?": "Why is default not set as \"User Selectable\"?", "为保证匹配准确,请确保客户端直连本站点(避免反向代理/网关改写 User-Agent)。": "To ensure accurate matching, make sure the client connects directly to this site (avoid reverse proxies/gateways that rewrite User-Agent).", + "为特定用户分组配置可用分组的增减规则。「添加」为该分组新增可用分组,「移除」移除默认可用分组,「追加」直接追加分组": "Configure add/remove rules for specific user groups. \"Add\" adds a new selectable group, \"Remove\" removes a default selectable group, \"Append\" directly appends a group", "为空则默认使用服务器地址,多个 Origin 用逗号分隔,例如 https://newapi.pro,https://newapi.com ,注意不能携带[],需使用https": "If empty, defaults to server address. Multiple Origins separated by commas, e.g.: https://newapi.pro,https://newapi.com. Note: cannot contain [], must use https", "主模型": "Primary Model", "主页链接填": "Enter homepage link", @@ -327,6 +360,8 @@ "产品名称": "Product Name", "产品配置": "Product Configuration", "产品配置错误,请联系管理员": "Product configuration error, please contact the administrator", + "享受 8 折": "20% off", + "什么是分组?": "What are groups?", "仅为使用OpenAI格式的Gemini/Vertex渠道填充thoughtSignature": "Fill thoughtSignature only for Gemini/Vertex channels using the OpenAI format", "仅会覆盖你勾选的字段,未勾选的字段保持本地不变。": "Only selected fields will be overwritten, unselected fields remain unchanged.", "仅供参考,以实际扣费为准": "For reference only, actual deduction shall prevail", @@ -351,14 +386,19 @@ "今日关闭": "Close Today", "今日已签到": "Checked in today", "今日已签到,累计签到": "Checked in today, total check-ins", + "从 0.5 降到 0.3": "reduced from 0.5 to 0.3", + "从剪贴板粘贴配置": "Paste Config", "从官方模型库同步": "Sync from official model library", "从认证器应用中获取验证码,或使用备用码": "Get verification code from authenticator app, or use backup code", "从配置文件同步": "Sync from config file", + "从默认列表中去掉一个分组": "Remove a group from the default list", "代理地址": "Proxy address", "代理设置": "Proxy Settings", "代码已复制到剪贴板": "Code copied to clipboard", "令牌": "Tokens", - "令牌分组": "Token grouping", + "令牌分组": "Token Group", + "令牌分组设为 auto 时,按以下顺序依次尝试选择可用分组,排在前面的优先级更高": "When token group is set to auto, groups are selected in order of priority, with higher priority groups listed first", + "令牌分组设为 auto 时,系统按优先级顺序自动选择一个可用分组。": "When token group is set to auto, the system automatically selects an available group by priority.", "令牌分组,默认为用户的分组": "Token group, default is your group", "令牌创建成功,请在列表页面点击复制获取令牌!": "Token created successfully, please click copy on the list page to get the token!", "令牌名称": "Token Name", @@ -372,9 +412,9 @@ "以及": "and", "仪表盘设置": "Dashboard Settings", "价格": "Pricing", - "价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}}": "Price: {{symbol}}{{price}} * {{ratioType}}: {{ratio}}", - "价格:${{price}} * {{ratioType}}:{{ratio}}": "Price: ${{price}} * {{ratioType}}: {{ratio}}", + "价格摘要": "Price Summary", "价格暂时不可用,请稍后重试": "Price temporarily unavailable, please try again later", + "价格模式(默认)": "Price Mode (Default)", "价格计算中...": "Calculating price...", "价格计算失败": "Price calculation failed", "价格计算失败: ": "Price calculation failed: ", @@ -382,6 +422,8 @@ "价格设置方式": "Pricing configuration method", "价格重新计算中...": "Recalculating price...", "价格预估": "Price Estimate", + "价格:${{price}} * {{ratioType}}:{{ratio}}": "Price: ${{price}} * {{ratioType}}: {{ratio}}", + "价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}}": "Price: {{symbol}}{{price}} * {{ratioType}}: {{ratio}}", "任一满足(OR)": "Any match (OR)", "任务 ID": "Task ID", "任务ID": "Task ID", @@ -404,7 +446,6 @@ "作用域:包含规则名称": "Scope: Include Rule Name", "你似乎并没有修改什么": "You seem to have not modified anything", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "You can manually add them under “Custom model names”, click Fill and submit, or use the actions below to handle them automatically.", - "使用 {{name}} 继续": "Continue with {{name}}", "使用 Discord 继续": "Continue with Discord", "使用 GitHub 继续": "Continue with GitHub", "使用 JSON 对象格式,格式为:{\"组名\": [最多请求次数, 最多请求完成次数]}": "Use JSON object format, format: {\"group_name\": [max_requests, max_completions]}", @@ -413,38 +454,45 @@ "使用 Passkey 实现免密且更安全的登录体验": "Use Passkey for password-free and more secure login experience", "使用 Passkey 登录": "Sign in with Passkey", "使用 Passkey 验证": "Verify with Passkey", + "使用 {{name}} 继续": "Continue with {{name}}", "使用 微信 继续": "Continue with WeChat", "使用 用户名 注册": "Sign up with Username", "使用 邮箱或用户名 登录": "Sign in with Email or Username", "使用ID排序": "Sort by ID", + "使用分组": "Using Group", "使用日志": "Usage Logs", "使用模式": "Usage mode", "使用统计": "Usage Statistics", - "使用认证器应用(如 Google Authenticator、Microsoft Authenticator)扫描下方二维码:": "Use an authenticator app (such as Google Authenticator, Microsoft Authenticator) to scan the QR code below:", "使用认证器应用扫描二维码": "Scan QR code with authenticator app", + "使用认证器应用(如 Google Authenticator、Microsoft Authenticator)扫描下方二维码:": "Use an authenticator app (such as Google Authenticator, Microsoft Authenticator) to scan the QR code below:", + "使用说明": "Guide", "例如": "e.g.", "例如 /var/cache/new-api": "e.g. /var/cache/new-api", - "例如 €, £, Rp, ₩, ₹...": "For example, €, £, Rp, ₩, ₹...", "例如 https://docs.newapi.pro": "E.g., https://docs.newapi.pro", - "例如:": "For example:", + "例如 €, £, Rp, ₩, ₹...": "For example, €, £, Rp, ₩, ₹...", "例如: /bin/bash -c \"python app.py\"": "e.g.: /bin/bash -c \"python app.py\"", "例如: nginx:latest": "e.g.: nginx:latest", "例如: socks5://user:pass@host:port": "e.g.: socks5://user:pass@host:port", + "例如发卡网站的购买链接": "E.g., purchase link from card issuing website", + "例如(全渠道):": "Example (all channels):", + "例如(指定渠道):": "Example (specific channels):", + "例如:": "For example:", "例如:-c": "e.g.: -c", "例如:/bin/bash": "e.g.: /bin/bash", "例如:0001": "e.g.: 0001", "例如:1000": "e.g.: 1000", "例如:100000": "e.g.: 100000", - "例如:2,就是最低充值2$": "e.g.: 2, means minimum top-up is $2", "例如:2000": "e.g.: 2000", + "例如:2,就是最低充值2$": "e.g.: 2, means minimum top-up is $2", "例如:4.99": "e.g.: 4.99", "例如:401, 403, 429, 500-599": "e.g. 401,403,429,500-599", "例如:7,就是7元/美金": "e.g.: 7, means 7 yuan per USD", + "例如:GitHub Enterprise": "e.g.: GitHub Enterprise", "例如:email": "e.g.: email", "例如:example.com": "e.g.: example.com", "例如:github / si:google / https://example.com/logo.png / 🐱": "e.g.: github / si:google / https://example.com/logo.png / 🐱", - "例如:GitHub Enterprise": "e.g.: GitHub Enterprise", "例如:github-enterprise": "e.g.: github-enterprise", + "例如:gpt-4.1-nano,regex:^claude-.*$,regex:^sora-.*$": "Example: gpt-4.1-nano,regex:^claude-.*$,regex:^sora-.*$", "例如:https://example.com/.well-known/openid-configuration": "e.g.: https://example.com/.well-known/openid-configuration", "例如:https://gitea.example.com": "e.g.: https://gitea.example.com", "例如:https://yourdomain.com": "e.g.: https://yourdomain.com", @@ -458,9 +506,6 @@ "例如:该请求不满足准入策略": "e.g.: This request does not meet the admission policy", "例如:适合轻度使用": "e.g.: Suitable for light usage", "例如:需要等级 {{required}},你当前等级 {{current}}": "e.g.: Required level {{required}}, your current level is {{current}}", - "例如(全渠道):": "Example (all channels):", - "例如(指定渠道):": "Example (specific channels):", - "例如发卡网站的购买链接": "E.g., purchase link from card issuing website", "供应商": "Provider", "供应商介绍": "Provider introduction", "供应商信息:": "Provider information:", @@ -482,11 +527,12 @@ "保存 Turnstile 设置": "Save Turnstile Settings", "保存 WeChat Server 设置": "Save WeChat Server Settings", "保存分组倍率设置": "Save group ratio settings", + "保存分组相关设置": "Save Group Related Settings", "保存备用码": "Save backup codes", "保存备用码以备不时之需": "Save backup codes for emergencies", "保存失败": "Save failed", - "保存失败,请重试": "Save failed, please try again", "保存失败:": "Save failed:", + "保存失败,请重试": "Save failed, please try again", "保存屏蔽词过滤设置": "Save sensitive word filtering settings", "保存性能设置": "Save Performance Settings", "保存成功": "Saved successfully", @@ -501,7 +547,9 @@ "保存设置": "Save Settings", "保存通用设置": "Save General Settings", "保存邮箱域名白名单设置": "Save Email Domain Whitelist Settings", + "保存预览": "Save Preview", "保存额度设置": "Save Quota Settings", + "保留": "kept", "保留原值(目标已有值时不覆盖)": "Keep original value (do not overwrite if target already has a value)", "保留天数": "Days to Retain", "保留文件数": "Files to Retain", @@ -518,20 +566,20 @@ "倍率信息": "Ratio information", "倍率是为了方便换算不同价格的模型": "The magnification is to facilitate the conversion of models with different prices.", "倍率模式": "Ratio Mode", - "计费显示模式": "Billing Display Mode", - "价格模式(默认)": "Price Mode (Default)", + "倍率用于计费乘数,勾选「用户可选」后用户可在创建令牌时选择该分组": "Ratio is the billing multiplier. Check \"User Selectable\" to let users pick this group when creating tokens", "倍率类型": "Ratio type", + "假设再加两个分组 default 和 vip,但不勾选用户可选:": "Now add two more groups default and vip, but without checking User Selectable:", "偏好设置": "Preferences", "停止测试": "Stop Testing", "停止重试": "Stop Retry", "停用": "Deactivate", "允许 AccountFilter 参数": "Allow AccountFilter parameter", "允许 HTTP 协议图片请求(适用于自部署代理)": "Allow HTTP protocol image requests (for self-deployed proxies)", + "允许 Turnstile 用户校验": "Allow Turnstile user verification", "允许 inference_geo 透传": "Allow inference_geo Pass-through", "允许 safety_identifier 透传": "Allow safety_identifier Pass-through", "允许 service_tier 透传": "Allow service_tier Pass-through", "允许 stream_options.include_obfuscation 透传": "Allow stream_options.include_obfuscation Pass-through", - "允许 Turnstile 用户校验": "Allow Turnstile user verification", "允许不安全的 Origin(HTTP)": "Allow insecure Origin (HTTP)", "允许回调(会泄露服务器 IP 地址)": "Allow callback (will leak server IP address)", "允许在 Stripe 支付中输入促销码": "Allow entering promotion codes during Stripe checkout", @@ -552,13 +600,13 @@ "允许重试": "Allow Retry", "元": "CNY", "充值": "Top Up", - "充值价格(x元/美金)": "Top Up price (x yuan/dollar)", "充值价格显示": "Top Up price", + "充值价格(x元/美金)": "Top Up price (x yuan/dollar)", "充值分组倍率": "Top Up group ratio", "充值分组倍率不是合法的 JSON 字符串": "Top Up group ratio is not a valid JSON string", "充值数量": "Top Up quantity", - "充值数量,最低 ": "Top Up quantity, minimum", "充值数量不能小于": "The top up amount cannot be less than", + "充值数量,最低 ": "Top Up quantity, minimum", "充值方式设置": "Top Up method settings", "充值方式设置不是合法的 JSON 字符串": "Top Up method settings is not a valid JSON string", "充值确认": "Top Up confirmation", @@ -574,8 +622,8 @@ "兑换成功!": "Redemption successful!", "兑换码充值": "Redemption code recharge", "兑换码创建成功": "Redemption Code Created", - "兑换码创建成功,是否下载兑换码?": "Redemption code created successfully. Do you want to download it?", "兑换码创建成功!": "Redemption code created successfully!", + "兑换码创建成功,是否下载兑换码?": "Redemption code created successfully. Do you want to download it?", "兑换码将以文本文件的形式下载,文件名为兑换码的名称。": "The redemption code will be downloaded as a text file, with the filename being the redemption code name.", "兑换码更新成功!": "Redemption code updated successfully!", "兑换码生成管理": "Redemption code generation management", @@ -622,8 +670,8 @@ "关闭": "Close", "关闭侧边栏": "Close sidebar", "关闭公告": "Close Notice", - "关闭后,此模型将不会被“同步官方”自动覆盖或创建": "After closing, this model will not be automatically overwritten or created by \"Sync Official\"", "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?": "After closing, this notice will no longer be shown (only for this browser). Are you sure you want to close it?", + "关闭后,此模型将不会被“同步官方”自动覆盖或创建": "After closing, this model will not be automatically overwritten or created by \"Sync Official\"", "关闭弹窗,已停止批量测试": "Dialog closed, batch testing stopped", "关闭提示": "Close notice", "其他": "Other", @@ -641,17 +689,6 @@ "内置": "Built-in", "内置 Ollama 镜像": "Built-in Ollama Image", "再次输入部署名称": "Enter Deployment Name Again", - "最低": "lowest", - "最低充值美元数量": "Minimum recharge dollar amount", - "最后使用时间": "Last used time", - "最后更新": "Last Updated", - "最后请求": "Last request", - "最大GPU数量": "Max Number of GPUs", - "最大可用": "Max Available", - "最大条目数": "Max Entries", - "最终抵扣": "Final Deduction", - "最近一次": "Last", - "最近事件": "Recent Events", "写": "Write", "准入策略": "Admission Policy", "准入策略 JSON(可选)": "Admission Policy JSON (optional)", @@ -660,14 +697,23 @@ "凭证已刷新": "Credentials Refreshed", "分类名称": "Category Name", "分组": "Group", + "分组JSON设置": "Group JSON Settings", "分组与模型定价设置": "Group and Model Pricing Settings", "分组价格": "Group price", "分组倍率": "Group ratio", "分组倍率设置": "Group ratio settings", "分组倍率设置,可以在此处新增分组或修改现有分组的倍率,格式为 JSON 字符串,例如:{\"vip\": 0.5, \"test\": 1},表示 vip 分组的倍率为 0.5,test 分组的倍率为 1": "Group ratio settings, you can add new groups or modify existing group ratios here, format as JSON string, e.g.: {\"vip\": 0.5, \"test\": 1}, indicating vip group ratio is 0.5, test group ratio is 1", + "分组名": "Group", + "分组名称": "Group Name", + "分组名称到倍率的映射": "Mapping of group names to ratios", + "分组描述": "Group Description", + "分组是用于控制计费倍率和模型访问权限的核心概念。每个用户属于一个分组,每个令牌也可以指定使用某个分组。": "Groups are a core concept for controlling billing ratios and model access. Each user belongs to a group, and each token can be assigned to a specific group.", "分组特殊倍率": "Group special ratio", "分组特殊可用分组": "Available special groups", + "分组相关设置": "Group Related Settings", + "分组管理": "Group Management", "分组设置": "Group settings", + "分组设置使用说明": "Group Settings Guide", "分组速率配置优先级高于全局速率限制。": "Group rate configuration priority is higher than global rate limit.", "分组速率限制": "Group rate limit", "分钟": "minutes", @@ -682,7 +728,9 @@ "列出的模型将不会自动添加或移除-thinking/-nothinking 后缀": "Models in this list will not automatically add or remove the -thinking/-nothinking suffix.", "列设置": "Column settings", "创建": "Create", + "创建令牌可选": "Selectable when creating tokens", "创建令牌默认选择auto分组,初始令牌也将设为auto(否则留空,为用户默认分组)": "Create token with auto group by default, initial token will also be set to auto (otherwise leave blank for user default group)", + "创建和管理分组": "Create and Manage Groups", "创建失败": "Creation failed", "创建成功": "Created successfully", "创建或选择密钥时,将 Project 设置为 io.cloud": "When creating or selecting a key, set Project to io.cloud", @@ -694,6 +742,7 @@ "创建新的订阅套餐": "Create a New Subscription Plan", "创建新的预填组": "Create new pre-filled group", "创建时间": "Creation Time", + "创建渠道所需的基本信息": "Basic information needed to create a channel", "创建用户": "Create User", "初始化失败,请重试": "Initialization failed, please retry", "初始化系统": "Initialize system", @@ -727,13 +776,15 @@ "前往设置": "Go to Settings", "前往设置页面": "Go to Settings Page", "前缀": "Prefix", - "副本数量": "Number of Replicas", + "前:": "Before:", "剩余": "Remaining", "剩余备用码:": "Remaining backup codes: ", "剩余时间": "Remaining Time", "剩余额度": "Remaining quota", - "剩余额度/总额度": "Remaining/Total", "剩余额度$": "Remaining quota $", + "剩余额度/总额度": "Remaining/Total", + "剪贴板中未检测到连接信息": "No connection info found in clipboard", + "副本数量": "Number of Replicas", "功能特性": "Features", "加入渠道": "Join Channel", "加入预填组": "Join Pre-filled Group", @@ -754,6 +805,7 @@ "加载详情中...": "Loading details...", "加载账单失败": "Failed to load bills", "加载隐私政策内容失败...": "Failed to load privacy policy content...", + "勾选后,该分组会出现在用户创建令牌时的下拉菜单中。未勾选的分组只能由管理员分配,用户自己无法选择。": "When checked, this group appears in the dropdown when users create tokens. Unchecked groups can only be assigned by admin.", "包含": "Contains", "包含来自未知或未标明供应商的AI模型,这些模型可能来自小型供应商或开源项目。": "Includes AI models from unknown or unmarked suppliers, which may come from small suppliers or open-source projects.", "包括失败请求的次数,0代表不限制": "Including failed request times, 0 means no limit", @@ -766,6 +818,7 @@ "单GPU小时费率": "Per GPU Hour Rate", "历史消耗": "Consumption", "原价": "Original price", + "原价,和普通用户一样": "original price, same as regular users", "原因:": "Reason: ", "原密码": "Original Password", "原生格式": "Native format", @@ -801,6 +854,9 @@ "只包括请求成功的次数": "Only include successful request times", "只支持HTTPS,系统将以POST方式发送通知,请确保地址可以接收POST请求": "Only HTTPS is supported, the system will send notifications via POST, please ensure that the address can receive POST requests", "只有当用户设置开启IP记录时,才会进行请求和错误类型日志的IP记录": "Only when the user sets IP recording, the IP recording of request and error type logs will be performed", + "只有配置了规则的组合才会覆盖,未配置的组合仍使用令牌分组的基础倍率。": "Only configured combinations are overridden. Unconfigured combinations still use the token group's base ratio.", + "可以根据用户分组增减令牌可选的分组范围。例如 vip 用户额外开放 premium 分组,或移除某个分组的选择权。": "Adjust the selectable group range based on user group. E.g., grant vip users access to premium, or remove access to a group.", + "可以根据用户分组设置不同的计费倍率。例如 vip 用户使用 standard 令牌时倍率从 1.0 降为 0.8。": "Set different billing ratios based on user group. E.g., vip users using standard tokens get ratio 0.8 instead of 1.0.", "可信": "Reliable", "可在设置页面设置关于内容,支持 HTML & Markdown": "The About content can be set on the settings page, supporting HTML & Markdown", "可手动填写,多个 scope 用空格分隔": "Can be filled in manually, separate multiple scopes with spaces", @@ -817,14 +873,16 @@ "可视化": "Visualization", "可视化倍率设置": "Visual model ratio settings", "可视化编辑": "Visual editing", - "可选,公告的补充说明": "Optional, additional information for the notice", - "可选,用于复现结果": "Optional, for reproducibility", - "可选:基于用户信息 JSON 做组合条件准入,条件不满足时返回自定义提示": "Optional: Admission based on combined conditions from user info JSON; returns custom message when conditions are not met", - "可选:用于自动生成端点或 Discovery URL": "Optional: Used to auto-generate endpoints or Discovery URL", "可选。匹配入口请求的 User-Agent;任意一行作为子串匹配(忽略大小写)即命中。": "Optional. Match the incoming request's User-Agent; any line matched as a substring (case-insensitive) counts as a hit.", "可选。对提取到的亲和 Key 做正则校验;不填表示不校验。": "Optional. Validate the extracted affinity key with regex; leave empty to skip validation.", "可选。对请求路径进行匹配;不填表示匹配所有路径。": "Optional. Match the request path; leave empty to match all paths.", "可选值": "Optional value", + "可选,公告的补充说明": "Optional, additional information for the notice", + "可选,用于复现结果": "Optional, for reproducibility", + "可选:基于用户信息 JSON 做组合条件准入,条件不满足时返回自定义提示": "Optional: Admission based on combined conditions from user info JSON; returns custom message when conditions are not met", + "可选:用于自动生成端点或 Discovery URL": "Optional: Used to auto-generate endpoints or Discovery URL", + "合计:{{total}}": "Total: {{total}}", + "合计:文字部分 {{textTotal}} + 音频部分 {{audioTotal}} = {{total}}": "Total: text {{textTotal}} + audio {{audioTotal}} = {{total}}", "同时重置消息": "Reset messages simultaneously", "同步": "Sync", "同步到渠道": "Sync to Channel", @@ -839,8 +897,12 @@ "名称+密钥": "Name + key", "名称不能为空": "Name cannot be empty", "名称匹配类型": "Name matching type", + "后端固定倍率:{{ratio}}。该字段仅展示换算后的价格。": "Backend fixed ratio: {{ratio}}. This field only displays the converted price.", "后端请求失败": "Backend request failed", "后缀": "Suffix", + "后:": "After:", + "向右展开": "Expand right", + "向左展开": "Expand left", "否": "No", "启动": "Start", "启动参数 (Args)": "Startup Args", @@ -851,10 +913,10 @@ "启动部署失败": "Failed to start deployment", "启动配置": "Startup Configuration", "启用": "Enable", + "启用 Prompt 检查": "Enable Prompt check", "启用 io.net 部署": "Enable io.net Deployment", "启用 io.net 部署开关": "Enable io.net Deployment Switch", "启用 io.net 部署时必须填写 API Key": "API Key is required when enabling io.net deployment", - "启用 Prompt 检查": "Enable Prompt check", "启用2FA失败": "Failed to enable Two-Factor Authentication", "启用Claude思考适配(-thinking后缀)": "Enable Claude thinking adaptation (-thinking suffix)", "启用FunctionCall思维签名填充": "Enable FunctionCall thoughtSignature fill", @@ -910,16 +972,23 @@ "图标使用 react-icons(Simple Icons)或 URL/emoji,例如:github、gitlab、si:google": "Icon uses react-icons (Simple Icons) or URL/emoji, e.g.: github, gitlab, si:google", "图标使用@lobehub/icons库,如:OpenAI、Claude.Color,支持链式参数:OpenAI.Avatar.type={'platform'}、OpenRouter.Avatar.shape={'square'},查询所有可用图标请 ": "The icon uses the @lobehub/icons library, such as: OpenAI, Claude.Color, supports chain parameters: OpenAI.Avatar.type={'platform'}, OpenRouter.Avatar.shape={'square'}, query all available icons please ", "图混合": "Blend", + "图片倍率 {{imageRatio}}": "Image ratio {{imageRatio}}", "图片功能在自定义请求体模式下不可用": "Image functionality is not available in custom request body mode", "图片地址": "Image URL", "图片已添加": "Image Added", "图片生成调用:{{symbol}}{{price}} / 1次": "Image generation call: {{symbol}}{{price}} / 1 time", + "图片生成:1 次 * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Image generation: 1 call * unit price {{price}} * {{ratioType}} {{ratio}} = {{amount}}", + "图片输入 {{price}} / 1M tokens": "Image input {{price}} / 1M tokens", + "图片输入 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Image input {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", "图片输入: {{imageRatio}}": "Image input: {{imageRatio}}", + "图片输入价格": "Image Input Price", + "图片输入价格 {{symbol}}{{price}} / 1M tokens": "Image input price {{symbol}}{{price}} / 1M tokens", "图片输入价格:{{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", + "图片输入价格:{{symbol}}{{total}} / 1M tokens": "Image input price: {{symbol}}{{total}} / 1M tokens", "图片输入倍率(仅部分模型支持该计费)": "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", + "图片输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 图片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Image input: {{tokens}} / 1M * model ratio {{modelRatio}} * image ratio {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "图生文": "Describe", "图生视频": "Image to Video", "在Gotify服务器创建应用后获得的令牌,用于发送通知": "Token obtained after creating an application on the Gotify server, used to send notifications", @@ -935,20 +1004,27 @@ "在此输入系统名称": "Enter the system name here", "在此输入隐私政策内容,支持 Markdown & HTML 代码": "Enter privacy policy content here, supports Markdown & HTML code", "在此输入首页内容,支持 Markdown & HTML 代码,设置后首页的状态信息将不再显示。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为首页": "Enter the home page content here, supports Markdown", + "在默认列表基础上新增一个分组": "Add a new group to the default list", + "场景:站点提供两个价格档位,用户可以按需选择": "Scenario: site offers two pricing tiers, users can choose as needed", + "场景:站点有 standard 和 premium 两个用户可选分组。希望 vip 用户额外看到 exclusive 分组,同时不再看到 standard 分组": "Scenario: site has standard and premium as selectable groups. Want vip users to see exclusive but not standard", + "场景:站点有 standard(倍率 1.0)和 premium(倍率 0.5)两个分组,希望 vip 用户使用 standard 令牌时也能享受折扣": "Scenario: site has standard (ratio 1.0) and premium (ratio 0.5). Want vip users to get a discount on standard tokens too", + "场景:设置自动选择优先级": "Scenario: set auto-selection priority", "域名IP过滤详细说明": "Recommended: When enabled, domains are resolved via DNS and the resulting IPs are checked against private address ranges, effectively preventing DNS rebinding attacks that bypass SSRF protection. Note: A domain may resolve to multiple IPv4/IPv6 addresses. If you have configured an IP filter list, ensure it covers these addresses, otherwise access may fail.", "域名白名单": "Domain Whitelist", "域名黑名单": "Domain Blacklist", "基本信息": "Basic Information", + "基础价格": "Base Pricing", + "基础用户": "Basic user", "填充 Codex CLI / Claude CLI 模版": "Fill Codex CLI / Claude CLI Template", "填充新模板": "Fill New Template", "填充旧模板": "Fill Old Template", "填充模板": "Fill Template", + "填充模板(全渠道)": "Fill template (all channels)", + "填充模板(指定渠道)": "Fill template (selected channels)", "填充模板:等级+激活": "Fill Template: Level + Activation", "填充模板:等级提示": "Fill Template: Level Prompt", "填充模板:组织或角色": "Fill Template: Organization or Role", "填充模板:组织提示": "Fill Template: Organization Prompt", - "填充模板(全渠道)": "Fill template (all channels)", - "填充模板(指定渠道)": "Fill template (selected channels)", "填入": "Fill", "填入 CC Switch": "Fill in CC Switch", "填入所有模型": "Fill in all models", @@ -966,6 +1042,7 @@ "填写服务器地址后自动生成:": "Auto-generated after entering server address: ", "填写用户协议内容后,用户注册时将被要求勾选已阅读用户协议": "After filling in the user agreement content, users will be required to check that they have read the user agreement during registration", "填写隐私政策内容后,用户注册时将被要求勾选已阅读隐私政策": "After filling in the privacy policy content, users will be required to check that they have read the privacy policy during registration", + "填写音频补全价格前,需要先填写音频输入价格。": "Fill in the audio input price before setting the audio completion price.", "处理中": "Processing", "备份支持": "Backup support", "备份状态": "Backup state", @@ -981,6 +1058,7 @@ "复制失败": "Copy failed", "复制失败,请手动复制": "Copy failed, please copy manually", "复制失败,请手动选择文本复制": "Copy failed, please manually select and copy the text", + "复制密钥": "Copy Key", "复制已选": "Copy selected", "复制应用的令牌(Token)并填写到上方的应用令牌字段": "Copy the application token and fill it in the application token field above", "复制成功": "Copy successful", @@ -993,6 +1071,7 @@ "复制渠道的所有信息": "Copy all information for a channel", "复制版本号": "Copy Version", "复制生成的密钥并粘贴到此处": "Copy the generated key and paste it here", + "复制连接信息": "Copy Connection String", "复制链接": "Copy link", "外接设备": "External device", "多个命令用空格分隔": "Multiple commands separated by spaces", @@ -1006,7 +1085,6 @@ "失败原因": "Failure Reason", "失败后不重试": "No Retry on Failure", "失败后是否重试": "Retry on Failure", - "不重试": "No Retry", "失败时自动禁用通道": "Automatically disable channel on failure", "失败重试次数": "Failed retry times", "奖励说明": "Reward description", @@ -1016,13 +1094,13 @@ "套餐标题": "Plan Title", "套餐标题不能为空": "Package title cannot be empty", "套餐的基本信息和定价": "Basic plan info and pricing", - "如:大带宽批量分析图片推荐": "e.g. Large bandwidth batch analysis of image recommendations", - "如:香港线路": "e.g. Hong Kong line", "如果亲和到的渠道失败,重试到其他渠道成功后,将亲和更新到成功的渠道。": "If the affinity channel fails, after a successful retry on another channel, the affinity will be updated to the successful channel.", "如果你对接的是上游One API或者New API等转发项目,请使用OpenAI类型,不要使用此类型,除非你知道你在做什么。": "If you are connecting to upstream One API or New API forwarding projects, please use OpenAI type. Do not use this type unless you know what you are doing.", "如果用户请求中包含系统提示词,则使用此设置拼接到用户的系统提示词前面": "If the user request contains a system prompt, this setting will be appended to the user's system prompt", "如果镜像为私有,请填写密码或Token": "If the image is private, please fill in the password or token", "如果镜像为私有,请填写用户名": "If the image is private, please fill in the username", + "如:大带宽批量分析图片推荐": "e.g. Large bandwidth batch analysis of image recommendations", + "如:香港线路": "e.g. Hong Kong line", "始终使用浅色主题": "Always use light theme", "始终使用深色主题": "Always use dark theme", "字段映射": "Field Mapping", @@ -1031,6 +1109,7 @@ "字段透传控制": "Field Pass-through Control", "字段速查": "Field Quick Reference", "存在惩罚,鼓励讨论新话题": "Presence penalty, encourages discussing new topics", + "存在重复的分组名称:": "Duplicate group names: ", "存在重复的键名:": "Duplicate key names exist:", "安全提醒": "Security reminder", "安全设置": "Security Settings", @@ -1042,6 +1121,7 @@ "完成硬件类型、部署位置、副本数量等配置后,将自动计算价格": "Price will be automatically calculated after completing hardware type, deployment location, number of replicas and other configurations", "完成设置并启用两步验证": "Complete setup and enable two-factor authentication", "完成进度": "Completion Progress", + "完整流程:": "Full workflow:", "完整的 Base URL,支持变量{model}": "Complete Base URL, supports variable {model}", "官方": "Official", "官方文档": "Official documentation", @@ -1054,6 +1134,7 @@ "实付金额": "Actual payment amount", "实付金额:": "Actual payment amount: ", "实际模型": "Actual model", + "实际结算金额:{{symbol}}{{total}}(已包含分组价格调整)": "Actual charge: {{symbol}}{{total}} (group pricing adjustment included)", "实际请求体": "Actual request body", "容器": "Container", "容器ID": "Container ID", @@ -1087,7 +1168,6 @@ "密钥": "Key", "密钥 JSON 必须包含 access_token": "Key JSON must include access_token", "密钥 JSON 必须包含 account_id": "Key JSON must include account_id", - "密钥(编辑模式下,保存的密钥不会显示)": "Key (in edit mode, saved keys will not be displayed)", "密钥去重": "Key deduplication", "密钥将以Bearer方式添加到请求头中,用于验证webhook请求的合法性": "The key will be added to the request header as Bearer to verify the legitimacy of the webhook request", "密钥已删除": "Key has been deleted", @@ -1105,10 +1185,12 @@ "密钥获取成功": "Key acquisition successful", "密钥输入方式": "Key input method", "密钥预览": "Key preview", + "密钥(编辑模式下,保存的密钥不会显示)": "Key (in edit mode, saved keys will not be displayed)", "对于官方渠道,new-api已经内置地址,除非是第三方代理站点或者Azure的特殊接入地址,否则不需要填写": "For official channels, the new-api has a built-in address. Unless it is a third-party proxy site or a special Azure access address, there is no need to fill it in", "对免费模型启用预消耗": "Enable pre-consumption for free models", "对域名启用 IP 过滤(推荐开启)": "Enable IP filtering for domains (recommended)", "对外运营模式": "Default mode", + "对比:不勾选「用户可选」的场景": "Comparison: groups without \"User Selectable\"", "对象清理规则": "Object Pruning Rules", "导入": "Import", "导入的配置将覆盖当前设置,是否继续?": "The imported configuration will overwrite the current settings, continue?", @@ -1127,6 +1209,7 @@ "将删除所有仍在内存中的渠道亲和性缓存条目。": "This will delete all channel affinity cache entries still in memory.", "将只保留最近 {{value}} 个日志文件,其余将被删除。": "Only the last {{value}} log files will be retained; the rest will be deleted.", "将大请求体临时存储到磁盘": "Store large request bodies temporarily on disk", + "将把当前编辑中的模型 {{name}} 的价格配置,批量应用到已勾选的 {{count}} 个模型。": "The pricing configuration of the currently edited model {{name}} will be applied to the {{count}} selected models.", "将清除所有保存的配置并恢复默认设置,此操作不可撤销。是否继续?": "This will clear all saved configurations and restore default settings, this operation cannot be undone. Continue?", "将清除选定时间之前的所有日志": "This will clear all logs before the selected time", "将追加 2 条规则到现有规则列表。": "2 rules will be appended to the existing rule list.", @@ -1139,10 +1222,11 @@ "展开": "Expand", "展开更多": "Expand more", "展示价格": "Display Pricing", + "嵌套映射:用户分组 → 使用分组 → 倍率": "Nested mapping: user group → using group → ratio", "左侧边栏个人设置": "Personal settings in left sidebar", + "已为 ${count} 个渠道设置标签!": "Set tags for ${count} channels!", "已为 {{count}} 个模型设置{{type}}_one": "Set {{type}} for {{count}} model", "已为 {{count}} 个模型设置{{type}}_other": "Set {{type}} for {{count}} models", - "已为 ${count} 个渠道设置标签!": "Set tags for ${count} channels!", "已从 Discovery 自动填充配置": "Configuration auto-filled from Discovery", "已从 Discovery 获取配置,可继续手动修改所有字段。": "Configuration retrieved from Discovery. You can continue to manually modify all fields.", "已作废": "Invalidated", @@ -1157,14 +1241,16 @@ "已切换至最优倍率视图,每个模型使用其最低倍率分组": "Switched to the optimal ratio view, each model uses its lowest ratio group", "已初始化": "Initialized", "已删除": "Deleted", + "已删除 ${data} 个通道!": "Deleted ${data} channels!", "已删除 {{count}} 个令牌!": "Deleted {{count}} tokens!", "已删除 {{count}} 个令牌!_one": "Deleted {{count}} token!", "已删除 {{count}} 个令牌!_other": "Deleted {{count}} tokens!", "已删除 {{count}} 条失效兑换码_one": "Deleted {{count}} expired redemption code", "已删除 {{count}} 条失效兑换码_other": "Deleted {{count}} expired redemption codes", - "已删除 ${data} 个通道!": "Deleted ${data} channels!", "已删除所有禁用渠道,共计 ${data} 个": "Deleted all disabled channels, total ${data}", "已删除消息及其回复": "Deleted message and its replies", + "已勾选": "Selected", + "已勾选 {{count}} 个模型": "{{count}} models selected", "已发起支付": "Payment initiated", "已发送到 Fluent": "Sent to Fluent", "已取消 Passkey 注册": "Passkey registration cancelled", @@ -1180,8 +1266,6 @@ "已复制": "Copied", "已复制 ${count} 个模型": "Copied ${count} models", "已复制 ID 到剪贴板": "ID copied to clipboard", - "已复制:": "Copied:", - "已复制:{{name}}": "Copied: {{name}}", "已复制全部数据": "All data copied", "已复制到剪切板": "Copied to clipboard", "已复制到剪贴板": "Copied to clipboard", @@ -1190,7 +1274,10 @@ "已复制模型名称": "Model name copied", "已复制版本号": "Version copied", "已复制自动生成的 API Key": "Auto-generated API Key copied", + "已复制:": "Copied:", + "已复制:{{name}}": "Copied: {{name}}", "已完成": "Completed", + "已将模型 {{name}} 的价格配置批量应用到 {{count}} 个模型": "Applied the pricing configuration of model {{name}} to {{count}} models in batch", "已开启全局请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "Global request pass-through is enabled. Built-in NewAPI features such as parameter overrides, model redirection, and channel adaptation will be disabled. This is not a best practice. If this causes issues, please do not submit an issue.", "已成功开始测试所有已启用通道,请刷新页面查看结果。": "Successfully started testing all enabled channels. Please refresh page to view results.", "已打开授权页面": "Authorization page opened", @@ -1229,10 +1316,10 @@ "已达到购买上限": "Purchase limit reached", "已过期": "Expired", "已运行时间": "Uptime", + "已选择 ${count} 个渠道": "Selected ${count} channels", "已选择 {{count}} 个模型_one": "Selected {{count}} model", "已选择 {{count}} 个模型_other": "Selected {{count}} models", "已选择 {{selected}} / {{total}}": "Selected {{selected}} / {{total}}", - "已选择 ${count} 个渠道": "Selected ${count} channels", "已重置为默认配置": "Reset to default configuration", "已销毁": "Destroyed", "币种": "Currency", @@ -1254,15 +1341,19 @@ "延长容器时长将会产生额外费用,请确认您有足够的账户余额。": "Extending container duration will incur additional charges, please ensure you have sufficient account balance.", "延长操作一旦确认无法撤销,费用将立即扣除。": "Once confirmed, the extension operation cannot be undone, and charges will be deducted immediately.", "延长时长": "Extension Duration", - "延长时长(小时)": "Extension Duration (hours)", "延长时长不能超过720小时(30天)": "Extension duration cannot exceed 720 hours (30 days)", "延长时长失败": "Failed to extend duration", "延长时长至少为1小时": "Extension duration must be at least 1 hour", + "延长时长(小时)": "Extension Duration (hours)", "建立连接时发生错误": "Error occurred while establishing connection", "建议在生产环境中使用 MySQL 或 PostgreSQL 数据库,或确保 SQLite 数据库文件已映射到宿主机的持久化存储。": "It is recommended to use MySQL or PostgreSQL databases in production environments, or ensure that the SQLite database file is mapped to the persistent storage of the host machine.", "开": "On", + "开启「默认使用 auto 分组」后,新建令牌和初始令牌都会自动设为 auto。": "After enabling \"Default to auto group\", new tokens and initial tokens will be set to auto.", "开启之后会清除用户提示词中的": "After enabling, the user prompt will be cleared", "开启之后将上游地址替换为服务器地址": "After enabling, the upstream address will be replaced with the server address", + "开启后不限制:必须设置模型倍率": "After enabling, no limit: must set model ratio", + "开启后创建令牌默认选择auto分组,初始令牌也将设为auto": "When enabled, new tokens default to auto group, initial tokens are also set to auto", + "开启后未登录用户无法访问模型广场": "When enabled, unauthenticated users cannot access the model marketplace", "开启后,using_group 会参与 cache key(不同分组隔离)。": "When enabled, using_group will be part of the cache key (isolated by group).", "开启后,仅\"消费\"和\"错误\"日志将记录您的客户端IP地址": "After enabling, only \"consumption\" and \"error\" logs will record your client IP address", "开启后,对免费模型(倍率为0,或者价格为0)的模型也会预消耗额度": "After enabling, free models (ratio 0 or price 0) will also pre-consume quota", @@ -1273,13 +1364,12 @@ "开启后,规则名称会参与 cache key(不同规则隔离)。": "When enabled, the rule name will be part of the cache key (isolated by rule).", "开启后,该渠道请求 Claude 时将强制追加 ?beta=true(无需客户端手动传参)": "When enabled, requests to Claude through this channel will force append ?beta=true (no need for clients to pass this parameter manually)", "开启后,违规请求将额外扣费。": "When enabled, violation requests will incur additional charges.", - "开启后不限制:必须设置模型倍率": "After enabling, no limit: must set model ratio", - "开启后未登录用户无法访问模型广场": "When enabled, unauthenticated users cannot access the model marketplace", "开启批量操作": "Enable batch selection", "开始": "Start", "开始同步": "Start sync", "开始批量测试 ${count} 个模型,已清空上次结果...": "Starting batch test of ${count} models, cleared previous results...", "开始时间": "start time", + "异常": "Abnormal", "异步任务退款": "Async Task Refund", "张图片": " images", "弱变换": "High Variation", @@ -1288,6 +1378,7 @@ "强制要求": "Mandatory requirement", "强变换": "Low Variation", "当上游通道返回错误中包含这些关键词时(不区分大小写),自动禁用通道": "When the upstream channel returns an error containing these keywords (not case-sensitive), automatically disable the channel", + "当令牌分组设为 auto 时,系统按列表顺序依次选择可用分组。排在前面的优先级更高。": "When token group is set to auto, the system selects groups in list order. Groups listed first have higher priority.", "当前 API 密钥已过期,请在设置中更新。": "Current API key has expired, please update it in settings.", "当前 Ollama 版本为 ${version}": "Current Ollama version is ${version}", "当前仅 OpenAI / Claude 语义支持缓存 token 统计,其他通道将隐藏 token 相关字段。": "Currently only OpenAI / Claude semantics support cached token statistics. Other channels will hide token-related fields.", @@ -1297,15 +1388,21 @@ "当前分组为 auto,会自动选择最优分组,当一个组不可用时自动降级到下一个组(熔断机制)": "The current group is auto, it will automatically select the optimal group, and automatically downgrade to the next group when a group is unavailable (breakage mechanism)", "当前剩余": "Currently Remaining", "当前参数覆盖不是合法的 JSON": "Current parameter override is not valid JSON", + "当前提示": "Current Notes", "当前旧格式 JSON 不合法,无法追加模板": "Current legacy format JSON is invalid, cannot append template", "当前旧格式不是 JSON 对象,无法追加模板": "Current legacy format is not a JSON object, cannot append template", "当前时间": "Current time", + "当前未启用,需要时再打开即可。": "This field is currently disabled. Enable it when needed.", "当前未开启Midjourney回调,部分项目可能无法获得绘图结果,可在运营设置中开启。": "Current Midjourney callback is not enabled, some projects may not be able to obtain drawing results, which can be enabled in the operation settings.", "当前查看的分组为:{{group}},倍率为:{{ratio}}": "Current group: {{group}}, ratio: {{ratio}}", "当前模型列表为该标签下所有渠道模型列表最长的一个,并非所有渠道的并集,请注意可能导致某些渠道模型丢失。": "The current model list is the longest one among all channel model lists under this tag, not the union of all channels. Please note that this may cause some channel models to be lost.", + "当前模型同时存在按次价格和倍率配置,保存时会按当前计费方式覆盖。": "This model currently has both per-request pricing and ratio-based pricing. Saving will overwrite them according to the current billing mode.", + "当前模型存在未显式设置输入倍率的扩展倍率;填写输入价格后会自动换算为价格字段。": "This model has derived ratios without an explicit input ratio. Once you fill in the input price, they will be converted into price fields automatically.", + "当前没有未设置定价的模型": "There are currently no models without pricing", "当前版本": "Current version", "当前状态": "Current Status", "当前缓存大小": "Current Cache Size", + "当前编辑": "Editing", "当前规则不支持写入到该位置": "Current rule does not support writing to this location", "当前规则未设置参数覆盖模板": "Current rule has no parameter override template set", "当前计费": "Current billing", @@ -1313,6 +1410,7 @@ "当前设置类型: ": "Current setting type: ", "当前跟随系统": "Currently following system", "当前配置无法连接到 io.net。": "Unable to connect to io.net with current configuration.", + "当某个分组的用户使用另一个分组的令牌时,可设置特殊倍率覆盖基础倍率。例如:vip 分组的用户使用 default 分组时倍率为 0.5": "When a user in one group uses a token from another group, a special ratio can override the base ratio. E.g., vip users using default group get ratio 0.5", "当模型没有设置价格时仍接受调用,仅当您信任该网站时使用,可能会产生高额费用": "Accept calls even if the model has no price settings, use only when you trust the website, which may incur high costs", "当运行通道全部测试时,超过此时间将自动禁用通道": "When running all channel tests, the channel will be automatically disabled when this time is exceeded", "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知": "When wallet or subscription remaining quota falls below this value, the system will send a notification through the selected method", @@ -1323,13 +1421,14 @@ "微信扫码关注公众号,输入「验证码」获取验证码(三分钟内有效)": "Scan WeChat QR code to follow official account, enter \"verification code\" to get code (valid for 3 minutes)", "微信扫码登录": "WeChat scan code to log in", "微信账户绑定成功!": "WeChat account bound successfully!", - "必填:请输入服务器地址以自动生成完整端点 URL": "Required: Enter server address to auto-generate full endpoint URLs", "必填。对请求的 model 名称进行匹配,任意一条匹配即命中该规则。": "Required. Match the requested model name; any match triggers this rule.", + "必填:请输入服务器地址以自动生成完整端点 URL": "Required: Enter server address to auto-generate full endpoint URLs", "必须全部满足(AND)": "All must be met (AND)", "必须是有效的 JSON 字符串数组,例如:[\"g1\",\"g2\"]": "Must be a valid JSON string array, for example: [\"g1\",\"g2\"]", "忘记密码?": "Forgot password?", "快速开始": "Quick Start", "快速选择": "Quick Select", + "忽略": "Ignore", "思考中...": "Thinking...", "思考内容转换": "Thinking content conversion", "思考过程": "Thinking process", @@ -1370,6 +1469,7 @@ "或手动输入密钥:": "Or manually enter the secret:", "所有上游数据均可信": "All upstream data is reliable", "所有密钥已复制到剪贴板": "All keys have been copied to the clipboard", + "所有用户": "All users", "所有编辑均为覆盖操作,留空则不更改": "All edits are overwrite operations, leaving blank will not change", "所选模板已存在": "Selected templates already exist", "手动禁用": "Manually disabled", @@ -1381,6 +1481,7 @@ "扣费": "Charge", "执行 GC": "Run GC", "执行中": "processing", + "扩展价格": "Additional Pricing", "扫描二维码": "Scan QR code", "批量创建": "Batch Create", "批量创建时会在名称后自动添加随机后缀": "When creating in batches, a random suffix will be automatically added to the name", @@ -1390,6 +1491,7 @@ "批量删除失败": "Batch deletion failed", "批量删除成功": "Batch deletion successful", "批量删除模型": "Batch delete models", + "批量应用当前模型价格": "Batch Apply Current Model Pricing", "批量操作": "Batch Operations", "批量操作失败": "Batch operation failed", "批量操作完成: {{success}}个成功, {{failed}}个失败": "Batch operation completed: {{success}} succeeded, {{failed}} failed", @@ -1413,15 +1515,19 @@ "按倍率类型筛选": "Filter by ratio type", "按倍率设置": "Set by ratio", "按次": "Per request", + "按次 {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Per request {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "按次计费": "Pay per request", + "按次:{{symbol}}{{price}}": "Per request: {{symbol}}{{price}}", + "按次:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "Per request: {{symbol}}{{price}} * {{ratioType}}: {{ratio}} = {{symbol}}{{total}}", "按照如下格式输入:AccessKey|SecretAccessKey|Region": "Enter in the format: AccessKey|SecretAccessKey|Region", "按量计费": "Pay as you go", + "按量计费下需要先填写输入价格,才能保存其它价格项。": "For per-token billing, fill in the input price before saving other price fields.", "按顺序替换content中的变量占位符": "Replace variable placeholders in content in order", "换脸": "Face swap", - "授权,需在遵守": " and must be used in compliance with the ", "授权失败": "Authorization failed", "授权端点": "Authorization Endpoint", "授权范围 (Scopes)": "Scopes", + "授权,需在遵守": " and must be used in compliance with the ", "排序": "Sort Order", "排队中": "Queuing", "接受未设置价格模型": "Accept models without price settings", @@ -1432,8 +1538,8 @@ "控制输出的随机性和创造性": "Controls randomness and creativity of output", "控制顶栏模块显示状态,全局生效": "Control header module display status, global effect", "推荐": "Recommended", - "推荐:用户可以选择是否使用指纹等验证": "Recommended: Users can choose whether to use fingerprint verification", "推荐使用(用户可选)": "Recommended (user optional)", + "推荐:用户可以选择是否使用指纹等验证": "Recommended: Users can choose whether to use fingerprint verification", "描述": "Description", "提交": "Submit", "提交时间": "Submission time", @@ -1444,13 +1550,14 @@ "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "Prompt {{input}} tokens / 1M tokens * {{symbol}}{{price}}", "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Prompt {{input}} tokens / 1M tokens * {{symbol}}{{price}} + Completion {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 缓存创建 {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Prompt {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + Cache {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + Cache creation {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + Completion {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "提示价格:{{symbol}}{{price}} / 1M tokens": "Prompt price: {{symbol}}{{price}} / 1M tokens", + "提示缓存倍率": "Prompt cache ratio", "提示:如需备份数据,只需复制上述目录即可": "Tip: To back up data, simply copy the directory above", "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。": "Notice: This configuration only affects how models are displayed in the Model Marketplace and does not impact actual model invocation or routing. To configure real invocation behavior, please go to Channel Management.", + "提示:端点映射仅用于模型广场展示,不会影响模型真实调用。如需配置真实调用,请前往「渠道管理」。": "Notice: Endpoint mapping is for Model Marketplace display only and does not affect real model invocation. To configure real invocation, please go to Channel Management.", "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。": "Notice: This feature is beta. The configuration structure and behavior may change in the future. Do not use in production.", "提示:语言偏好会同步到您登录的所有设备,并影响API返回的错误消息语言。": "Note: Language preference syncs across all your logged-in devices and affects the language of API error messages.", "提示:链接中的{key}将被替换为API密钥,{address}将被替换为服务器地址": "Tip: {key} in the link will be replaced with the API key, {address} will be replaced with the server address", - "提示价格:{{symbol}}{{price}} / 1M tokens": "Prompt price: {{symbol}}{{price}} / 1M tokens", - "提示缓存倍率": "Prompt cache ratio", "搜索供应商": "Search vendor", "搜索关键字": "Search keywords", "搜索失败": "Search failed", @@ -1480,6 +1587,8 @@ "支付失败": "Payment failed", "支付宝": "Alipay", "支付方式": "Payment method", + "支付方式名称": "Pay Method Name", + "支付方式类型": "Pay Method Type", "支付渠道": "Payment Channels", "支付设置": "Payment Settings", "支付请求失败": "Payment request failed", @@ -1503,14 +1612,13 @@ "支持拉取 Ollama 官方模型库中的所有模型,拉取过程可能需要几分钟时间": "Supports pulling all models from the Ollama official model library, the pulling process may take a few minutes", "支持搜索用户的 ID、用户名、显示名称和邮箱地址": "Support searching for user ID, username, display name, and email address", "支持的图像模型": "Supported image models", + "支持精确匹配;使用 regex: 开头可按正则匹配。": "Supports exact matching. Use a regex: prefix for regex matching.", "支持通配符格式,如:example.com, *.api.example.com": "Supports wildcard format, e.g.: example.com, *.api.example.com", "支持逻辑 and/or 与嵌套 groups;操作符支持 eq/ne/gt/gte/lt/lte/in/not_in/contains/exists": "Supports logical and/or with nested groups; operators include eq/ne/gt/gte/lt/lte/in/not_in/contains/exists", "收益": "Earnings", "收益统计": "Income statistics", "收起": "Collapse", "收起侧边栏": "Collapse sidebar", - "向左展开": "Expand left", - "向右展开": "Expand right", "收起内容": "Collapse content", "放大": "Upscalers", "放大编辑": "Expand editor", @@ -1528,15 +1636,22 @@ "数据看板默认时间粒度": "Data dashboard default time granularity", "数据管理和日志查看": "Data management and log viewing", "文件上传": "File upload", + "文件搜索 {{count}} 次 * {{symbol}}{{price}} / 1K 次": "File search {{count}} calls * {{symbol}}{{price}} / 1K calls", "文件搜索价格:{{symbol}}{{price}} / 1K 次": "File search price: {{symbol}}{{price}} / 1K times", + "文件搜索调用 {{fileSearchCallCount}} 次": "File search called {{fileSearchCallCount}} times", + "文件搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "File search: {{count}} / 1K * unit price {{price}} * {{ratioType}} {{ratio}} = {{amount}}", + "文字价格 {{textPrice}} + 音频价格 {{audioPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Text price {{textPrice}} + Audio price {{audioPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "文字提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 文字补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} = {{symbol}}{{total}}": "Text prompt {{input}} tokens / 1M tokens * {{symbol}}{{price}} + Text completion {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} = {{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}}": "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}}", "文字提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 文字补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} = {{symbol}}{{total}}": "Text prompt {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + Cache {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + Text completion {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} = {{symbol}}{{total}}", "文字输入": "Text input", "文字输出": "text output", + "文字输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Text output: {{tokens}} / 1M * model ratio {{modelRatio}} * completion ratio {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "文心一言": "ERNIE Bot", "文档": "Documentation", "文档地址": "Document Link", "文生视频": "Text-to-video", + "新增": "added", "新增 Key 来源": "Add Key Source", "新增供应商": "Add vendor", "新增失败": "Failed to add", @@ -1552,9 +1667,9 @@ "新建容器部署": "Create Container Deployment", "新建数量": "New quantity", "新建组": "New group", + "新格式模板": "New format template", "新格式(支持条件判断与json自定义):": "New format (supports conditional judgment and JSON customization):", "新格式(规则 + 条件)": "New Format (Rules + Conditions)", - "新格式模板": "New format template", "新版本": "New Version", "新用户使用邀请码奖励额度": "New user invitation code bonus quota", "新用户初始额度": "Initial quota for new users", @@ -1571,6 +1686,7 @@ "无法复制到剪贴板,请手动复制": "Unable to copy to clipboard, please copy manually", "无法添加图片": "Unable to add image", "无法获取容器详情": "Unable to get container details", + "无法读取剪贴板": "Cannot read clipboard", "无法连接 io.net": "Unable to connect to io.net", "无生效": "No active", "无邀请人": "No Inviter", @@ -1581,19 +1697,19 @@ "日志已下载": "Logs downloaded", "日志已加载": "Logs loaded", "日志已复制到剪贴板": "Logs copied to clipboard", - "日志时间范围": "Log Date Range", "日志总大小": "Total Log Size", "日志文件数": "Log File Count", + "日志时间范围": "Log Date Range", "日志流": "Log Stream", "日志清理失败:": "Log cleanup failed:", "日志目录": "Log Directory", "日志类型": "Log type", "日志设置": "Log settings", "日志详情": "Log details", - "旧格式(JSON 对象)": "Legacy Format (JSON Object)", - "旧格式(直接覆盖):": "Old format (direct override):", "旧格式必须是 JSON 对象": "Legacy format must be a JSON object", "旧格式模板": "Old format template", + "旧格式(JSON 对象)": "Legacy Format (JSON Object)", + "旧格式(直接覆盖):": "Old format (direct override):", "旧的备用码已失效,请保存新的备用码": "Old backup codes have been invalidated, please save the new backup codes", "早上好": "Good morning", "时间": "Time", @@ -1610,19 +1726,20 @@ "是否自动禁用": "Whether to automatically disable", "是否要求指纹/面容等生物识别": "Whether to require fingerprint/face recognition", "显示倍率": "Show ratio", - "显示最新20条": "Display latest 20", "显示名称": "Display Name", "显示名称字段": "Display Name Field", "显示名称字段(可选)": "Display Name Field (optional)", "显示完整内容": "Show full content", "显示操作项": "Show actions", "显示更多": "Show more", + "显示最新20条": "Display latest 20", "显示第": "Showing", "显示设置": "Display settings", "显示调试": "Show debug", "晚上好": "Good evening", "普通环境变量": "Regular Environment Variables", "普通用户": "Normal User", + "普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Standard input: {{tokens}} / 1M * model ratio {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "智能体ID": "Agent ID", "智能熔断": "Smart fallback", "智谱": "Zhipu AI", @@ -1634,6 +1751,7 @@ "暂无保存的配置": "No saved configuration", "暂无充值记录": "No recharge records", "暂无公告": "No Notice", + "暂无分组,点击下方按钮添加": "No groups yet. Click the button below to add one.", "暂无匹配模型": "No matching model", "暂无可复制 JSON": "No JSON available to copy", "暂无可复制的版本信息": "No version information to copy", @@ -1660,7 +1778,9 @@ "暂无监控数据": "No monitoring data", "暂无系统公告": "No system notice", "暂无缺失模型": "No missing models", + "暂无自动分组,点击下方按钮添加": "No auto groups yet. Click the button below to add one.", "暂无自定义 OAuth 提供商": "No custom OAuth providers", + "暂无规则,点击下方按钮添加": "No rules yet. Click the button below to add one.", "暂无订阅套餐": "No subscription plans", "暂无订阅记录": "No subscription records", "暂无请求数据": "No request data", @@ -1696,8 +1816,21 @@ "更新配置后,容器可能需要重启以应用新的设置。请确保您了解这些更改的影响。": "After updating the configuration, the container may need to restart to apply the new settings. Please ensure you understand the impact of these changes.", "更新配置失败": "Failed to update configuration", "更新预填组": "Update pre-filled group", + "最低": "lowest", + "最低充值美元数量": "Minimum recharge dollar amount", + "最后使用时间": "Last used time", + "最后更新": "Last Updated", + "最后请求": "Last request", + "最大GPU数量": "Max Number of GPUs", + "最大可用": "Max Available", + "最大条目数": "Max Entries", + "最终抵扣": "Final Deduction", + "最近一次": "Last", + "最近事件": "Recent Events", + "最高优先级": "highest priority", "月": "month", "有 Reasoning": "Has Reasoning", + "有序字符串数组": "Ordered string array", "有效期": "Validity", "有效期单位": "Validity Unit", "有效期数值": "Validity Value", @@ -1740,8 +1873,9 @@ "未绑定": "Not bound", "未获取到授权码": "Authorization code not obtained", "未设置": "Not set", - "未设置倍率模型": "Models without ratio settings", + "未设置价格": "Price not set", "未设置价格模型": "Models without price settings", + "未设置倍率模型": "Models without ratio settings", "未设置路径": "No path configured", "未配置模型": "No model configured", "未配置的模型列表": "Models not configured", @@ -1749,8 +1883,8 @@ "本地数据存储": "Local data storage", "本地计费": "Local billing", "本月获得": "This month", - "本设备:手机指纹/面容,外接:USB安全密钥": "Built-in: phone fingerprint/face, External: USB security key", "本设备内置": "Built-in device", + "本设备:手机指纹/面容,外接:USB安全密钥": "Built-in: phone fingerprint/face, External: USB security key", "本项目根据": "This project is licensed under the ", "机密环境变量": "Secret Environment Variables", "机密环境变量将被加密存储,适用于存储密码、API密钥等敏感信息。": "Secret environment variables will be stored encrypted, suitable for storing passwords, API keys and other sensitive information.", @@ -1759,12 +1893,12 @@ "权限设置": "Permission Settings", "条": "items", "条 - 第": "to", - "条,共": "of", "条件取反": "Negate Condition", "条件数": "Conditions", "条件规则": "Condition Rules", "条件项设置": "Condition Item Settings", "条日志已清理!": "logs have been cleared!", + "条,共": "of", "来源": "Source", "来源于 IO.NET 部署": "From IO.NET Deployment", "来源端点": "Source Endpoint", @@ -1778,8 +1912,10 @@ "查看所有可用的AI模型供应商,包括众多知名供应商的模型。": "View all available AI model suppliers, including models from many well-known suppliers.", "查看日志": "View Logs", "查看渠道密钥": "View channel key", + "查看示例": "View Example", "查看详情": "View Details", "查询": "Query", + "标准价格": "Standard price", "标签": "Label", "标签不能为空!": "Label cannot be empty!", "标签信息": "Tag Information", @@ -1790,6 +1926,8 @@ "标签聚合模式": "Enable tag mode", "标识符 (Slug)": "Slug", "标识颜色": "Identifier color", + "核心概念": "Key Concepts", + "核心配置": "Core Configuration", "核采样,控制词汇选择的多样性": "Nucleus sampling, controls vocabulary selection diversity", "根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。": "Per Anthropic conventions, /v1/messages input tokens count only non-cached input and exclude cache read/write tokens.", "根据模型名称和匹配规则查找模型元数据,优先级:精确 > 前缀 > 后缀 > 包含": "Find model metadata based on model name and matching rules, priority: exact > prefix > suffix > contains", @@ -1797,32 +1935,35 @@ "格式化 JSON": "Format JSON", "格式正确": "Format Correct", "格式示例:": "Format example:", - "前:": "Before:", - "配置:": "Config:", - "后:": "After:", "格式错误": "Format Error", "检查更新": "Check for updates", "检测到 FluentRead(流畅阅读)": "FluentRead (smooth reading) detected", "检测到以下高危状态码重定向规则": "Detected high-risk status-code redirect rules", + "检测到剪贴板中的连接信息": "Connection info detected in clipboard", "检测到多个密钥,您可以单独复制每个密钥,或点击复制全部获取完整内容。": "Detected multiple keys, you can copy each key individually or click Copy All to get the complete content.", "检测到该消息后有AI回复,是否删除后续回复并重新生成?": "AI reply detected after this message, delete subsequent replies and regenerate?", "检测必须等待绘图成功才能进行放大等操作": "Detection must wait for drawing to succeed before performing zooming and other operations", + "概览": "Overview", "模型": "Model", + "模型 {{name}} 缺少输入价格,无法计算补全/缓存/图片/音频价格对应的倍率": "Model {{name}} is missing an input price, so the ratios for completion, cache, image, and audio pricing cannot be calculated.", + "模型 {{name}} 缺少音频输入价格,无法计算音频补全倍率": "Model {{name}} is missing an audio input price, so the audio completion ratio cannot be calculated.", "模型: {{ratio}}": "Model: {{ratio}}", "模型专用区域": "Model-specific area", "模型价格": "Model price", - "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}": "Model price {{symbol}}{{price}}, {{ratioType}} {{ratio}}", + "模型价格 {{price}}": "Model price {{price}}", "模型价格 {{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}} / request * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}": "Model price {{symbol}}{{price}}, {{ratioType}} {{ratio}}", + "模型价格:{{symbol}}{{price}}": "Model price: {{symbol}}{{price}}", "模型价格:{{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", - "按次:{{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}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}},Web 搜索调用 {{webSearchCallCount}} 次": "Model ratio {{modelRatio}}, cache ratio {{cacheRatio}}, completion ratio {{completionRatio}}, {{ratioType}} {{ratio}}, Web search called {{webSearchCallCount}} times", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},图片输入倍率 {{imageRatio}},{{ratioType}} {{ratio}}": "Model ratio {{modelRatio}}, cache ratio {{cacheRatio}}, completion ratio {{completionRatio}}, image input ratio {{imageRatio}}, {{ratioType}} {{ratio}}", + "模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},音频倍率 {{audioRatio}},音频补全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}": "Model ratio {{modelRatio}}, completion ratio {{completionRatio}}, audio ratio {{audioRatio}}, audio completion ratio {{audioCompletionRatio}}, {{cachePart}}{{ratioType}} {{ratio}}", + "模型倍率 {{modelRatio}},输出倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},{{ratioType}} {{ratio}}": "Model ratio {{modelRatio}}, output ratio {{completionRatio}}, cache ratio {{cacheRatio}}, {{ratioType}} {{ratio}}", "模型倍率 {{modelRatio}},输出倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},缓存创建倍率 {{cacheCreationRatio}},{{ratioType}} {{ratio}}": "Model ratio {{modelRatio}}, completion ratio {{completionRatio}}, cache ratio {{cacheRatio}}, cache creation ratio {{cacheCreationRatio}}, {{ratioType}} {{ratio}}", "模型倍率值": "Model Ratio Value", "模型倍率和补全倍率": "Model Ratio and Completion Ratio", @@ -1840,6 +1981,7 @@ "模型名称已存在": "Model name already exists", "模型固定价格": "Model price per call", "模型图标": "Model icon", + "模型定价设置": "Model Pricing", "模型定价,需要登录访问": "Model pricing, requires login to access", "模型广场": "Model Marketplace", "模型拉取失败: {{error}}": "Failed to pull model: {{error}}", @@ -1849,8 +1991,8 @@ "模型更新成功!": "Model updated successfully!", "模型未加入列表,可能无法调用": "Model not in the list; requests may fail", "模型正则": "Model Regex", - "模型正则(每行一个)": "Model Regex (one per line)", "模型正则不能为空": "Model regex cannot be empty", + "模型正则(每行一个)": "Model Regex (one per line)", "模型消耗分布": "Model consumption distribution", "模型消耗趋势": "Model consumption trend", "模型版本": "Model version", @@ -1860,6 +2002,7 @@ "模型管理": "Model Management", "模型组": "Model group", "模型补全倍率(仅对自定义模型有效)": "Model completion ratio (only effective for custom models)", + "模型计费编辑器": "Model Pricing Editor", "模型请求速率限制": "Model request rate limit", "模型调用次数占比": "Model call ratio", "模型调用次数排行": "Model call ranking", @@ -1890,6 +2033,8 @@ "正在跟随最新日志": "Following latest logs", "正在跳转 GitHub...": "Redirecting to GitHub...", "正在跳转...": "Redirecting...", + "正常": "Normal", + "正常情况下,令牌的计费倍率由令牌所选的分组决定。特殊倍率可以根据「用户所在分组」进一步覆盖这个倍率。": "Normally, a token's billing ratio is determined by its selected group. Special ratios can override this based on the user's group.", "此代理仅用于图片请求转发,Webhook通知发送等,AI API请求仍然由服务器直接发出,可在渠道设置中单独配置代理": "This proxy is only used for image request forwarding, webhook notification sending, etc. AI API requests are still sent directly by the server, and proxy can be configured separately in channel settings", "此修改将不可逆": "This modification will be irreversible", "此操作不可恢复,请仔细确认时间后再操作!": "This operation cannot be recovered, please confirm the time carefully before proceeding!", @@ -1904,9 +2049,11 @@ "此操作将解绑用户当前的 Passkey,下次登录需要重新注册。": "This will detach the user's current Passkey. They will need to register again on next login.", "此操作将降低用户的权限级别": "This operation will reduce the user's permission level", "此支付方式最低充值金额为": "Minimum recharge amount for this payment method is", + "此时用户创建令牌时只能看到 standard 和 premium:": "Users can now only see standard and premium when creating tokens:", "此渠道由 IO.NET 自动同步,类型、密钥和 API 地址已锁定。": "This channel is automatically synchronized by IO.NET, type, key and API address are locked.", "此设置用于系统内部计算,默认值500000是为了精确到6位小数点设计,不推荐修改。": "This setting is used for internal system calculations. The default value of 500000 is designed for 6 decimal places precision, modification is not recommended.", "此页面仅显示未设置价格或倍率的模型,设置后将自动从列表中移除": "This page only shows models without price or ratio settings. After setting, they will be automatically removed from the list", + "此页面仅显示未设置价格或基础倍率的模型,设置后会自动从列表中移出": "This page only shows models without base pricing. After saving, configured models will be removed from this list automatically.", "此项只读,需要用户通过个人设置页面的相关绑定按钮进行绑定,不可直接修改": "Read-only, user's personal settings, and cannot be modified directly", "此项可选,用于修改请求体中的模型名称,为一个 JSON 字符串,键为请求中模型名称,值为要替换的模型名称,例如:": "This is optional, used to modify the model name in the request body, it's a JSON string, the key is the model name in the request, and the value is the model name to be replaced, for example:", "此项可选,用于修改请求体中的模型名称,为一个 JSON 字符串,键为请求中模型名称,值为要替换的模型名称,留空则不更改": "This is optional, used to modify the model name in the request body, as a JSON string, the key is the model name in the request, the value is the model name to be replaced, leaving blank will not change", @@ -1914,6 +2061,7 @@ "此项可选,用于覆盖请求参数。不支持覆盖 stream 参数": "This is optional, used to override request parameters. Overriding stream parameter is not supported.", "此项可选,用于覆盖请求头参数": "This is optional, used to override request header parameters.", "此项可选,用于通过自定义API地址来进行 API 调用,末尾不要带/v1和/": "Optional for API calls through custom API address, do not add /v1 and / at the end", + "每个分组代表一个价格档位。管理员创建分组后,可以选择哪些档位对用户开放自选。": "Each group represents a pricing tier. After creating groups, admins can choose which tiers are open for user self-selection.", "每个用户最多可创建的令牌数量,默认 1000,设置过大可能会影响性能": "Maximum number of tokens each user can create, default 1000. Setting too large may affect performance", "每周": "Weekly", "每天": "Daily", @@ -1922,16 +2070,21 @@ "每日签到": "Daily Check-in", "每日签到可获得随机额度奖励": "Daily check-in rewards random quota", "每月": "Monthly", + "每美元对应 Token 数": "Tokens per USD", "每隔多少分钟测试一次所有通道": "How many minutes between testing all channels", "永不过期": "Never expires", "永久删除您的两步验证设置": "Permanently delete your two-factor authentication settings", "永久删除所有备用码(包括未使用的)": "Permanently delete all backup codes (including unused ones)", + "汇率": "Exchange rate", + "沙盒环境 RSA 私钥 Base64 (PKCS#8 DER)": "Sandbox RSA private key Base64 (PKCS#8 DER)", + "沙盒环境 Waffo 公钥 Base64 (X.509 DER)": "Sandbox Waffo public key Base64 (X.509 DER)", "没有匹配的字段": "No matching fields", "没有匹配的日志条目": "No matching log entries", "没有匹配的规则": "No matching rules", "没有可用令牌用于填充": "No available tokens for filling", "没有可用模型": "No available models", "没有找到匹配的模型": "No matching model found", + "没有未设置定价的模型": "No unpriced models", "没有未设置的模型": "No unconfigured models", "没有条件时,默认总是执行该操作。": "When no conditions are set, the operation is always executed by default.", "没有模型可以复制": "No models to copy", @@ -1940,8 +2093,8 @@ "注册": "Sign up", "注册 Passkey": "Register Passkey", "注意": "Note", - "注意:JSON中重复的键只会保留最后一个同名键的值": "Note: In JSON, duplicate keys will only keep the value of the last key with the same name", "注意非Chat API,请务必填写正确的API地址,否则可能导致无法使用": "Note: For non-Chat API, please make sure to enter the correct API address, otherwise it may not work", + "注意:JSON中重复的键只会保留最后一个同名键的值": "Note: In JSON, duplicate keys will only keep the value of the last key with the same name", "注销": "Logout", "注销成功!": "Logout successful!", "活跃文件": "Active Files", @@ -1950,7 +2103,9 @@ "流式": "Streaming", "流式响应完成": "Streaming response completed", "流式输出": "Streaming Output", + "流状态": "Stream Status", "流量端口": "Traffic Port", + "流错误详情": "Stream Error Details", "浅色": "Light", "浅色模式": "Light Mode", "测活": "Health Check", @@ -1979,6 +2134,7 @@ "深色": "Dark", "深色模式": "Dark Mode", "添加": "Add", + "添加 (+:)": "Add (+:)", "添加 OAuth 提供商": "Add OAuth Provider", "添加API": "Add API", "添加产品": "Add Product", @@ -1986,6 +2142,7 @@ "添加兑换码": "Add redemption code", "添加公告": "Add Notice", "添加分类": "Add Category", + "添加分组": "Add Group", "添加后提交": "Submit after adding", "添加启动参数": "Add Startup Args", "添加启动命令": "Add Startup Command", @@ -1998,6 +2155,7 @@ "添加环境变量": "Add Environment Variable", "添加用户": "Add user", "添加聊天配置": "Add chat configuration", + "添加规则": "Add Rule", "添加键值对": "Add key-value pair", "添加问答": "Add FAQ", "添加额度": "Add quota", @@ -2016,8 +2174,8 @@ "渠道 ID": "Channel ID", "渠道ID,名称,密钥,API地址": "Channel ID, name, key, Base URL", "渠道亲和性": "Channel affinity", - "渠道亲和性:上游缓存命中": "Channel Affinity: Upstream Cache Hit", "渠道亲和性会基于从请求上下文或 JSON Body 提取的 Key,优先复用上一次成功的渠道。": "Channel affinity reuses the last successful channel based on keys extracted from the request context or JSON body.", + "渠道亲和性:上游缓存命中": "Channel Affinity: Upstream Cache Hit", "渠道优先级": "Channel Priority", "渠道信息": "Channel information", "渠道创建成功!": "Channel created successfully!", @@ -2035,6 +2193,7 @@ "渠道的模型测试": "Channel Model Test", "渠道的高级配置选项": "Advanced channel configuration options", "渠道管理": "Channel Management", + "渠道行为": "Channel Behavior", "渠道额外设置": "Channel extra settings", "源地址": "Source address", "满足任一条件(OR)": "Match any condition (OR)", @@ -2052,6 +2211,8 @@ "点击预览音乐": "Click to preview music", "点击验证按钮,使用您的生物特征或安全密钥": "Click the verification button and use your biometrics or security key", "版权所有": "All rights reserved", + "特殊倍率": "Special Ratios", + "特殊可用分组规则": "Special Usable Group Rules", "状态": "Status", "状态码": "Status Code", "状态码复写": "Status Code Override", @@ -2059,6 +2220,8 @@ "状态筛选": "Status filter", "状态页面Slug": "Status Page Slug", "环境变量": "Environment Variables", + "生产环境 RSA 私钥 Base64 (PKCS#8 DER)": "Production RSA private key Base64 (PKCS#8 DER)", + "生产环境 Waffo 公钥 Base64 (X.509 DER)": "Production Waffo public key Base64 (X.509 DER)", "生成令牌": "Generate Token", "生成并填入": "Generate and Fill", "生成数量": "Generate quantity", @@ -2091,14 +2254,18 @@ "用户信息更新成功!": "User information updated successfully!", "用户信息端点": "User Info Endpoint", "用户信息缺失": "User information missing", - "用户最大令牌数量": "Maximum Tokens per User", - "用户分组": "Your default group", + "用户分组": "User Group", "用户分组和额度管理": "User Group and Quota Management", + "用户分组的联动作用": "How user group affects other features", "用户分组配置": "User group configuration", + "用户创建令牌 → 选择分组下拉框:": "User creates token → group dropdown:", + "用户创建令牌时选择的分组,决定该令牌的实际计费倍率。一个用户可以创建多个令牌,使用不同分组。": "The group selected when creating a token determines its billing ratio. A user can create multiple tokens using different groups.", "用户协议": "User Agreement", "用户协议已更新": "User agreement updated", "用户协议更新失败": "User agreement update failed", + "用户可选": "User Selectable", "用户可选分组": "User selectable groups", + "用户可选分组的名称和描述(只包含勾选了用户可选的分组)": "Names and descriptions of user-selectable groups (only includes checked groups)", "用户名": "Username", "用户名字段": "Username Field", "用户名字段(可选)": "Username Field (optional)", @@ -2106,6 +2273,7 @@ "用户名称": "User Name", "用户控制面板,管理账户": "User control panel for account management", "用户新建令牌时可选的分组,格式为 JSON 字符串,例如:{\"vip\": \"VIP 用户\", \"test\": \"测试\"},表示用户可以选择 vip 分组和 test 分组": "User selectable groups when creating tokens, in JSON string format, for example: {\"vip\": \"VIP User\", \"test\": \"Test\"}, indicating that users can choose vip group and test group", + "用户最大令牌数量": "Maximum Tokens per User", "用户每周期最多请求完成次数": "User max successful request times per period", "用户每周期最多请求次数": "User max request times per period", "用户注册时看到的网站名称,比如'我的网站'": "Website name users see during registration, e.g. 'My Website'", @@ -2117,6 +2285,7 @@ "用户账户管理": "User account management", "用时/首字": "Time/first word", "由全站货币展示设置统一控制": "Controlled by the site-wide currency display settings", + "由管理员分配,决定用户身份等级(如 default、vip)。": "Assigned by admin, determines user tier (e.g., default, vip).", "由订阅抵扣": "Deducted by subscription", "界面语言和其他个人偏好": "Interface language and other personal preferences", "留空使用系统临时目录": "Leave empty to use system temp directory", @@ -2133,11 +2302,13 @@ "监控设置": "Monitoring Settings", "目录总大小": "Directory Total Size", "目录文件数": "Directory File Count", + "目标分组": "Target Group", "目标用户:{{username}}": "Target user: {{username}}", "目标端点": "Target Endpoint", "目标路径(可选)": "Target Path (optional)", "直接提交": "Submit directly", "直接编辑 JSON 文本,保存时会校验格式。": "Edit JSON text directly; format will be validated on save.", + "直接追加(和添加类似,但无前缀)": "Directly append (similar to Add, but without prefix)", "相关项目": "Related Projects", "相当于删除用户,此修改将不可逆": "Equivalent to deleting the user, this modification is irreversible", "矛盾": "Conflict", @@ -2147,7 +2318,6 @@ "硬件类型": "Hardware Type", "硬件配置": "Hardware Configuration", "确定": "OK", - "确定?": "Sure?", "确定删除此组?": "Confirm delete this group?", "确定导入": "Confirm import", "确定是否要修复数据库一致性?": "Are you sure you want to repair database consistency?", @@ -2190,12 +2360,15 @@ "确定要降级此用户吗?": "Are you sure you want to demote this user?", "确定重置": "Confirm reset", "确定重置模型倍率吗?": "Confirm to reset model ratio?", + "确定?": "Sure?", "确认": "Confirm", "确认作废": "Confirm invalidation", "确认关闭提示": "Confirm close", "确认冲突项修改": "Confirm conflict item modification", "确认删除": "Confirm deletion", "确认删除模型": "Confirm Delete Model", + "确认删除该分组?": "Confirm delete this group?", + "确认删除该规则?": "Confirm delete this rule?", "确认取消密码登录": "Confirm cancel password login", "确认启用": "Confirm Enable", "确认密码": "Confirm Password", @@ -2210,6 +2383,7 @@ "确认清空该规则缓存": "Confirm clearing this rule's cache", "确认清除历史日志": "Confirm clear historical logs", "确认禁用": "Confirm disable", + "确认移除?": "Confirm remove?", "确认补单": "Confirm Order Completion", "确认解绑": "Confirm Unbind", "确认解绑 Passkey": "Confirm Unbind Passkey", @@ -2221,16 +2395,13 @@ "磁盘使用率超过此值时拒绝请求": "Reject requests when disk usage exceeds this value", "磁盘可用空间小于缓存最大总量设置": "Disk free space is less than max cache size setting", "磁盘命中": "Disk Hits", - "磁盘缓存最大总量 (MB)": "Max Disk Cache Size (MB)", "磁盘缓存占用的最大空间": "Maximum space occupied by disk cache", "磁盘缓存已清理": "Disk cache cleared", + "磁盘缓存最大总量 (MB)": "Max Disk Cache Size (MB)", "磁盘缓存设置(磁盘换内存)": "Disk Cache Settings (Disk Swap Memory)", "磁盘缓存阈值 (MB)": "Disk Cache Threshold (MB)", "示例": "Example", "示例:{\"default\": [200, 100], \"vip\": [0, 1000]}。": "Example: {\"default\": [200, 100], \"vip\": [0, 1000]}.", - "视频": "Video", - "视频Remix": "Video remix", - "视频无法在当前浏览器中播放,这可能是由于:": "The video cannot be played in this browser, possibly because:", "禁用": "Disable", "禁用 store 透传": "Disable store Pass-through", "禁用2FA失败": "Failed to disable Two-Factor Authentication", @@ -2248,12 +2419,19 @@ "私有镜像仓库的密码": "Password for private image registry", "私有镜像仓库的用户名": "Username for private image registry", "秒": "Second", - "移除 functionResponse.id 字段": "Remove functionResponse.id Field", + "移除": "Remove", + "移除 (-:)": "Remove (-:)", "移除 One API 的版权标识必须首先获得授权,项目维护需要花费大量精力,如果本项目对你有意义,请主动支持本项目": "Removal of One API copyright mark must first be authorized. Project maintenance requires a lot of effort. If this project is meaningful to you, please actively support it.", + "移除 functionResponse.id 字段": "Remove functionResponse.id Field", + "空": "Empty", "窗口处理": "window handling", "窗口等待": "window wait", "立即签到": "Check in now", "立即订阅": "Subscribe now", + "站点所有额度将以原始 Token 数显示,不做货币换算": "All site quotas will be displayed as raw token counts without currency conversion", + "站点所有额度将以美元 ($) 显示": "All site quotas will be displayed in USD ($)", + "站点所有额度将按汇率换算为人民币 (¥) 显示": "All site quotas will be converted to CNY (¥) using the exchange rate", + "站点所有额度将按汇率换算为自定义货币显示": "All site quotas will be converted to custom currency using the exchange rate", "站点额度展示类型及汇率": "Site quota display type and exchange rate", "端口号必须在1-65535之间": "Port number must be between 1-65535", "端口配置详细说明": "Restrict external requests to specific ports. Use single ports (80, 443) or ranges (8000-8999). Empty list allows all ports. Default includes common web ports.", @@ -2278,30 +2456,34 @@ "等待中": "Waiting", "等待获取邮箱信息...": "Waiting to get email information...", "筛选": "Filter", - "签到最大额度": "Maximum check-in quota", - "签到最小额度": "Minimum check-in quota", "签到功能允许用户每日签到获取随机额度奖励": "Check-in feature allows users to check in daily to receive random quota rewards", "签到失败": "Check-in failed", "签到奖励将直接添加到您的账户余额": "Check-in rewards will be directly added to your account balance", "签到奖励的最大额度": "Maximum quota for check-in rewards", "签到奖励的最小额度": "Minimum quota for check-in rewards", "签到成功!获得": "Check-in successful! Received", + "签到最大额度": "Maximum check-in quota", + "签到最小额度": "Minimum check-in quota", "签到设置": "Check-in Settings", + "简单来说:同一个令牌分组,不同等级的用户可以享受不同的价格。": "In short: same token group, different user tiers can enjoy different prices.", "简洁": "Simple", - "简洁模式:按 type 全量清理对象,例如 redacted_thinking。": "Simple mode: Prune all objects by type, e.g. redacted_thinking.", "简洁模式仅返回 message;状态码和错误类型将使用系统默认值。": "Simple mode returns message only; status code and error type will use system defaults.", + "简洁模式:按 type 全量清理对象,例如 redacted_thinking。": "Simple mode: Prune all objects by type, e.g. redacted_thinking.", "管理": "Manage", "管理 Ollama 模型的拉取和删除": "Manage Ollama model pulling and deletion", "管理你的 LinuxDO OAuth App": "Manage your LinuxDO OAuth App", "管理员": "Admin", + "管理员分配的优惠分组": "Admin-assigned discount group", + "管理员分配的基础分组": "Admin-assigned base group", "管理员区域": "Administrator Area", "管理员暂时未设置任何关于内容": "The administrator has not set any custom About content yet", "管理员未开启 Creem 充值!": "The administrator has not enabled Creem recharge!", "管理员未开启Stripe充值!": "Administrator has not enabled Stripe recharge!", - "管理员未开启在线充值!": "The administrator has not enabled online recharge!", "管理员未开启在线充值功能,请联系管理员开启或使用兑换码充值。": "The administrator has not enabled the online recharge function, please contact the administrator to enable it or recharge with a redemption code.", + "管理员未开启在线充值!": "The administrator has not enabled online recharge!", "管理员未开启在线支付功能,请联系管理员配置。": "Online payment is not enabled by the admin. Please contact the administrator.", "管理员未设置用户可选分组": "Administrator has not set user-selectable groups", + "管理员给用户分配的分组(如 vip)不仅决定用户身份,还会影响后续两个功能:": "The group assigned to a user (e.g., vip) not only determines their identity, but also affects the following two features:", "管理员设置了外部链接,点击下方按钮访问": "Administrator has set up external links, click the button below to access", "管理员账号": "Admin account", "管理员账号已经初始化过,请继续设置其他参数": "The admin account has already been initialized, please continue to set other parameters", @@ -2320,6 +2502,9 @@ "系统公告": "System Notice", "系统公告管理,可以发布系统通知和重要消息(最多100个,前端显示最新20条)": "System notice management, you can publish system notices and important messages (maximum 100, display latest 20 on the front end)", "系统内存": "System Memory", + "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为人民币,不影响内部计费": "The system uses USD as the base pricing unit. User balance, top-up amounts, model pricing, usage logs — all displayed amounts will be converted to CNY at this rate. Internal billing is not affected.", + "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为自定义货币,不影响内部计费": "The system uses USD as the base pricing unit. User balance, top-up amounts, model pricing, usage logs — all displayed amounts will be converted to custom currency at this rate. Internal billing is not affected.", + "系统内部计费精度,默认 500000,修改可能导致计费异常,请谨慎操作": "Internal billing precision, default 500000. Changing this may cause billing anomalies — proceed with caution.", "系统初始化": "System initialization", "系统初始化失败,请重试": "System initialization failed, please try again", "系统初始化成功,正在跳转...": "System initialization successful, redirecting...", @@ -2338,11 +2523,11 @@ "系统管理功能": "System management functions", "系统设置": "System Settings", "系统访问令牌": "System Access Token", - "约": "Approximately", "索引": "Index", "紧凑列表": "Compact list", "累计签到": "Total check-ins", "累计获得": "Total received", + "约": "Approximately", "线路描述": "Route description", "组列表": "Group list", "组名": "Group name", @@ -2372,40 +2557,45 @@ "统计次数": "Statistical count", "统计额度": "Statistical quota", "继续": "Continue", + "缓存 Tokens": "Cache Tokens", "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Cache {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Cache {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", - "缓存 Tokens": "Cache Tokens", "缓存: {{cacheRatio}}": "Cache: {{cacheRatio}}", "缓存价格:{{symbol}}{{price}} * {{cacheRatio}} = {{symbol}}{{total}} / 1M tokens (缓存倍率: {{cacheRatio}})": "Cache price: {{symbol}}{{price}} * {{cacheRatio}} = {{symbol}}{{total}} / 1M tokens (Cache ratio: {{cacheRatio}})", "缓存价格:{{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", "缓存倍率": "Cache ratio", "缓存倍率 {{cacheRatio}}": "Cache ratio {{cacheRatio}}", "缓存写": "Cache Write", - "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", "缓存创建 Tokens": "Cache Creation Tokens", - "缓存创建: {{cacheCreationRatio}}": "Cache creation: {{cacheCreationRatio}}", + "缓存创建 {{price}} / 1M tokens": "Cache creation {{price}} / 1M tokens", + "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", "缓存创建: 1h {{cacheCreationRatio1h}}": "Cache creation: 1h {{cacheCreationRatio1h}}", "缓存创建: 5m {{cacheCreationRatio5m}}": "Cache creation: 5m {{cacheCreationRatio5m}}", "缓存创建: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Cache creation: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", - "缓存创建价格:{{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", + "缓存创建: {{cacheCreationRatio}}": "Cache creation: {{cacheCreationRatio}}", + "缓存创建价格": "Input Cache Creation Price", "缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Cache creation price {{symbol}}{{price}} / 1M tokens", "缓存创建价格合计:5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens": "Cache creation price total: 5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens", - "5m缓存创建价格:{{symbol}}{{price}} / 1M tokens": "5m cache creation price: {{symbol}}{{price}} / 1M tokens", - "5m缓存创建价格 {{symbol}}{{price}} / 1M tokens": "5m cache creation price {{symbol}}{{price}} / 1M tokens", - "1h缓存创建价格:{{symbol}}{{price}} / 1M tokens": "1h cache creation price: {{symbol}}{{price}} / 1M tokens", - "1h缓存创建价格 {{symbol}}{{price}} / 1M tokens": "1h cache creation price {{symbol}}{{price}} / 1M tokens", + "缓存创建价格:{{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", "缓存创建倍率": "Cache creation ratio", - "缓存创建倍率 {{cacheCreationRatio}}": "Cache creation ratio {{cacheCreationRatio}}", "缓存创建倍率 1h {{cacheCreationRatio1h}}": "Cache creation multiplier 1h {{cacheCreationRatio1h}}", "缓存创建倍率 5m {{cacheCreationRatio5m}}": "Cache creation multiplier 5m {{cacheCreationRatio5m}}", "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Cache creation ratio 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", + "缓存创建倍率 {{cacheCreationRatio}}": "Cache creation ratio {{cacheCreationRatio}}", + "缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存创建倍率 {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Cache creation: {{tokens}} / 1M * model ratio {{modelRatio}} * cache creation ratio {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "缓存条目数": "Cache Entries", "缓存目录": "Cache Directory", "缓存目录磁盘空间": "Cache Directory Disk Space", "缓存读": "Cache Read", + "缓存读 {{price}} / 1M tokens": "Cache read {{price}} / 1M tokens", + "缓存读取价格": "Input Cache Read Price", + "缓存读取价格 {{symbol}}{{price}} / 1M tokens": "Cache read price {{symbol}}{{price}} / 1M tokens", + "缓存读取价格:{{symbol}}{{price}} / 1M tokens": "Cache read price: {{symbol}}{{price}} / 1M tokens", + "缓存读取价格:{{symbol}}{{total}} / 1M tokens": "Cache read price: {{symbol}}{{total}} / 1M tokens", + "缓存读取:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Cache read: {{tokens}} / 1M * model ratio {{modelRatio}} * cache ratio {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", + "缓存输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Cached input: {{tokens}} / 1M * model ratio {{modelRatio}} * cache ratio {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "编辑": "Edit", "编辑 OAuth 提供商": "Edit OAuth Provider", "编辑API": "Edit API", @@ -2443,10 +2633,13 @@ "聊天链接配置错误,请联系管理员": "Chat link configuration error, please contact administrator", "联系我们": "Contact Us", "腾讯混元": "Hunyuan", + "自动分组": "Auto Group", "自动分组auto,从第一个开始选择": "Auto grouping auto, select from the first one", + "自动分组选择": "Auto Group Selection", "自动刷新": "Auto Refresh", "自动刷新中": "Auto refreshing", "自动填充字段": "Auto-fill Fields", + "自动填入": "Auto-fill", "自动检测": "Auto-detect", "自动模式": "Auto Mode", "自动测试所有通道间隔时间": "Auto test interval for all channels", @@ -2471,18 +2664,6 @@ "自定义货币": "Custom currency", "自定义货币符号": "Custom currency symbol", "自定义货币符号将显示在所有额度数值前,例如 €1.50": "Custom currency symbol will appear before all quota amounts, e.g. €1.50", - "额度展示类型": "Quota display type", - "站点所有额度将以美元 ($) 显示": "All site quotas will be displayed in USD ($)", - "站点所有额度将按汇率换算为人民币 (¥) 显示": "All site quotas will be converted to CNY (¥) using the exchange rate", - "站点所有额度将以原始 Token 数显示,不做货币换算": "All site quotas will be displayed as raw token counts without currency conversion", - "站点所有额度将按汇率换算为自定义货币显示": "All site quotas will be converted to custom currency using the exchange rate", - "汇率": "Exchange rate", - "每美元对应 Token 数": "Tokens per USD", - "预览效果": "Preview", - "请输入汇率": "Please enter the exchange rate", - "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为人民币,不影响内部计费": "The system uses USD as the base pricing unit. User balance, top-up amounts, model pricing, usage logs — all displayed amounts will be converted to CNY at this rate. Internal billing is not affected.", - "系统内部计费精度,默认 500000,修改可能导致计费异常,请谨慎操作": "Internal billing precision, default 500000. Changing this may cause billing anomalies — proceed with caution.", - "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为自定义货币,不影响内部计费": "The system uses USD as the base pricing unit. User balance, top-up amounts, model pricing, usage logs — all displayed amounts will be converted to custom currency at this rate. Internal billing is not affected.", "自定义错误响应": "Custom Error Response", "自定义镜像": "Custom Image", "自用模式": "Self-use mode", @@ -2494,11 +2675,13 @@ "若你的 OIDC Provider 支持 Discovery Endpoint,你可以仅填写 OIDC Well-Known URL,系统会自动获取 OIDC 配置": "If your OIDC Provider supports Discovery Endpoint, you can only fill in the OIDC Well-Known URL, and the system will automatically obtain the OIDC configuration", "获取 Discovery 配置": "Fetch Discovery Configuration", "获取 Discovery 配置失败:": "Failed to fetch Discovery configuration: ", - "获取 io.net API Key": "Get io.net API Key", "获取 OIDC 配置失败,请检查网络状况和 Well-Known URL 是否正确": "Failed to get OIDC configuration, please check network status and whether the Well-Known URL is correct", "获取 OIDC 配置成功!": "OIDC configuration obtained successfully!", "获取 Ollama 版本失败": "Failed to get Ollama version", + "获取 io.net API Key": "Get io.net API Key", "获取2FA状态失败": "Failed to get Two-Factor Authentication status", + "获取充值配置失败": "Failed to get topup configuration", + "获取充值配置异常": "Topup configuration error", "获取初始化状态失败": "Failed to get initialization status", "获取可用资源失败: ": "Failed to get available resources: ", "获取启用模型失败": "Failed to get enabled models", @@ -2525,17 +2708,14 @@ "获取验证码": "Get Verification Code", "获得": "Received", "补全": "Completion", + "补全 {{completion}} tokens * 输出倍率 {{completionRatio}}": "Completion {{completion}} tokens * Output ratio {{completionRatio}}", "补全 {{completion}} tokens / 1M tokens * {{symbol}}{{price}}": "Completion {{completion}} tokens / 1M tokens * {{symbol}}{{price}}", - "模型价格 {{symbol}}{{price}} / 次 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Model price {{symbol}}{{price}} / request * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", - "输入 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "Input {{input}} tokens / 1M tokens * {{symbol}}{{price}}", - "图片输入 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Image input {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", - "Web 搜索 {{count}} 次 * {{symbol}}{{price}} / 1K 次": "Web search {{count}} calls * {{symbol}}{{price}} / 1K calls", - "文件搜索 {{count}} 次 * {{symbol}}{{price}} / 1K 次": "File search {{count}} calls * {{symbol}}{{price}} / 1K calls", - "文字价格 {{textPrice}} + 音频价格 {{audioPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Text price {{textPrice}} + Audio price {{audioPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", - "输入与缓存价格合计 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Input and cache pricing subtotal * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "补全价格": "Completion Price", + "补全价格已锁定": "Completion price is locked", "补全价格:{{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", "补全倍率": "Completion ratio", + "补全倍率 {{completionRatio}}": "Completion ratio {{completionRatio}}", "补全倍率值": "Completion Ratio Value", "补单": "Complete Order", "补单失败": "Failed to complete order", @@ -2553,6 +2733,9 @@ "规则名称(可读性更好,也会出现在管理侧日志中)。": "Rule name (for better readability, also appears in admin logs).", "规则导航": "Rule Navigation", "规则未找到,请刷新后重试": "Rule not found, please refresh and try again", + "视频": "Video", + "视频Remix": "Video remix", + "视频无法在当前浏览器中播放,这可能是由于:": "The video cannot be played in this browser, possibly because:", "角色": "Role", "解析响应数据时发生错误": "An error occurred while parsing response data", "解析密钥文件失败: {{msg}}": "Failed to parse key file: {{msg}}", @@ -2561,11 +2744,17 @@ "解绑 Passkey": "Remove Passkey", "解绑后将无法使用 Passkey 登录,确定要继续吗?": "After unbinding, you will not be able to login with Passkey. Are you sure you want to continue?", "解绑成功": "Unbind successful", + "警告": "Warning", + "警告:启用保活后,如果已经写入保活数据后渠道出错,系统无法重试,如果必须开启,推荐设置尽可能大的Ping间隔": "Warning: After enabling keep-alive, if the channel fails after keep-alive data has been written, the system cannot retry. If you must enable it, it is recommended to set the Ping interval as large as possible", + "警告:禁用两步验证将永久删除您的验证设置和所有备用码,此操作不可撤销!": "Warning: Disabling two-factor authentication will permanently delete your verification settings and all backup codes. This action is irreversible!", "计价币种": "Pricing Currency", "计算中": "Calculating", "计算成本": "Calculate Cost", "计算费用中...": "Calculating fees...", + "计费乘数,倍率越低费用越低。例如倍率 0.5 表示半价。": "Billing multiplier — the lower the ratio, the lower the cost. E.g., ratio 0.5 means half price.", "计费开始": "Billing Start", + "计费方式": "Billing Mode", + "计费显示模式": "Billing Display Mode", "计费模式": "Billing mode", "计费类型": "Billing type", "计费过程": "Billing process", @@ -2625,6 +2814,7 @@ "该数据可能不可信,请谨慎使用": "This data may not be reliable, please use with caution", "该服务器地址将影响支付回调地址以及默认首页展示的地址,请确保正确配置": "This server address will affect the payment callback address and the address displayed on the default homepage, please ensure correct configuration", "该模型存在固定价格与倍率计费方式冲突,请确认选择": "The model has a fixed price and ratio billing method conflict, please confirm the selection", + "该模型补全倍率由后端固定为 {{ratio}}。补全价格不能在这里修改。": "This model's completion ratio is fixed to {{ratio}} by the backend. The completion price cannot be changed here.", "该渠道已开启请求透传,参数覆写、模型重定向等 NewAPI 内置功能将失效,非最佳实践。": "Request pass-through is enabled for this channel; built-in NewAPI features such as parameter overrides and model redirection will be disabled. This is not a best practice.", "该渠道已开启请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "Request pass-through is enabled for this channel. Built-in NewAPI features such as parameter overrides, model redirection, and channel adaptation will be disabled. This is not a best practice. If this causes issues, please do not submit an issue.", "该规则未启用“作用域:包含规则名称”,无法按规则清空缓存。": "This rule has not enabled \"Scope: Include Rule Name\", cannot clear cache by rule.", @@ -2632,19 +2822,21 @@ "该规则的缓存保留时长;0 表示使用默认 TTL:": "Cache retention duration for this rule; 0 means using default TTL: ", "该记录不包含可用的 token 统计口径。": "This record does not contain available token statistics.", "详情": "Details", + "详见「特殊倍率」和「可用分组」标签页。": "See \"Special Ratios\" and \"Usable Groups\" tabs for details.", "语言偏好": "Language Preference", "语言偏好已保存": "Language preference saved", "语音输入": "Voice input", "语音输出": "Voice output", "说明": "Description", + "说明信息": "Description", "说明:": "Instructions:", "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。": "Note: Tests on this page use non-streaming requests. If a channel only supports streaming responses, tests may fail. Please rely on actual usage.", "说明:生成结果是可直接粘贴到渠道密钥里的 JSON(包含 access_token / refresh_token / account_id)。": "Note: The generated result is a JSON that can be pasted directly into the channel key (includes access_token / refresh_token / account_id).", - "说明信息": "Description", "请上传密钥文件": "Please upload the key file", "请上传密钥文件!": "Please upload the key file!", "请为渠道命名": "Please name the channel", "请使用 Project 为 io.cloud 的密钥": "Please use a key with Project set to io.cloud", + "请先勾选需要批量设置的模型": "Please select the models you want to update in batch first", "请先在设置中启用图片功能": "Please enable image feature in settings first", "请先填写 API Key": "Please fill in API Key first", "请先填写 Discovery URL 或 Issuer URL": "Please fill in Discovery URL or Issuer URL first", @@ -2652,8 +2844,10 @@ "请先填写 Ollama API 地址": "Please fill in Ollama API address first", "请先填写服务器地址": "Please fill in the server address first", "请先填写服务器地址,以自动生成完整的端点 URL": "Please enter the server address first to auto-generate full endpoint URLs", + "请先开启并填写音频输入价格。": "Enable and fill in the audio input price first.", "请先粘贴回调 URL": "Please paste the callback URL first", "请先输入密钥": "Please enter the key first", + "请先选择一个作为模板的模型": "Please select a model to use as the template first", "请先选择一条规则": "Please select a rule first", "请先选择同步渠道": "Please select the synchronization channel first", "请先选择模型!": "Please select a model first!", @@ -2693,12 +2887,8 @@ "请求结束后多退少补": "Adjust after request completion", "请求超时,请刷新页面后重新发起 GitHub 登录": "Request timed out, please refresh and restart GitHub login", "请求路径": "Request path", - "流状态": "Stream Status", - "流错误详情": "Stream Error Details", - "软错误": "soft errors", - "正常": "Normal", - "异常": "Abnormal", "请求转换": "Request conversion", + "请求配置": "Request Configuration", "请求预扣费额度": "Pre-deduction quota for requests", "请点击我": "Please click me", "请确认以下设置信息,点击\"初始化系统\"开始配置": "Please confirm the following settings information, click \"Initialize system\" to start configuration", @@ -2718,18 +2908,18 @@ "请至少选择一个渠道": "Please select at least one channel", "请输入 API Key,一行一个,格式:APIKey|Region": "Enter API Key, one per line, format: APIKey|Region", "请输入 API Key,格式:APIKey|Region": "Enter API Key, format: APIKey|Region", - "请输入 Authorization Endpoint": "Please enter Authorization Endpoint", "请输入 AZURE_OPENAI_ENDPOINT,例如:https://docs-test-001.openai.azure.com": "Please enter AZURE_OPENAI_ENDPOINT, e.g.: https://docs-test-001.openai.azure.com", + "请输入 Authorization Endpoint": "Please enter Authorization Endpoint", "请输入 Client ID": "Please enter Client ID", "请输入 Client Secret": "Please enter Client Secret", - "请输入 io.net API Key": "Please enter io.net API Key", - "请输入 io.net API Key(敏感信息不显示)": "Please enter io.net API Key (sensitive information not displayed)", "请输入 JSON 格式的 OAuth 凭据,例如:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}": "Please enter OAuth credentials in JSON format, e.g.:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}", "请输入 JSON 格式的密钥内容,例如:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}": "Please enter the key content in JSON format, for example:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}", "请输入 OIDC 的 Well-Known URL": "Please enter the Well-Known URL for OIDC", "请输入 Slug": "Please enter Slug", "请输入 Token Endpoint": "Please enter Token Endpoint", "请输入 User Info Endpoint": "Please enter User Info Endpoint", + "请输入 io.net API Key": "Please enter io.net API Key", + "请输入 io.net API Key(敏感信息不显示)": "Please enter io.net API Key (sensitive information not displayed)", "请输入6位验证码或8位备用码": "Please enter a 6-digit verification code or 8-digit backup code", "请输入API地址": "Please enter the API address", "请输入API地址!": "Please enter the API address!", @@ -2739,9 +2929,9 @@ "请输入Gotify服务器地址": "Please enter Gotify server address", "请输入Gotify服务器地址,例如: https://gotify.example.com": "Please enter Gotify server address, e.g.: https://gotify.example.com", "请输入JSON数组,如 [\"model-a\",\"model-b\"]": "Enter a JSON array, e.g. [\"model-a\",\"model-b\"]", + "请输入URL链接": "Please enter the URL link", "请输入Uptime Kuma地址": "Please enter the Uptime Kuma address", "请输入Uptime Kuma服务地址,如:https://status.example.com": "Please enter the Uptime Kuma service address, such as: https://status.example.com", - "请输入URL链接": "Please enter the URL link", "请输入Webhook地址": "Please enter the Webhook address", "请输入Webhook地址,例如: https://example.com/webhook": "Please enter the Webhook URL, e.g.: https://example.com/webhook", "请输入你的账户名以确认删除!": "Please enter your account name to confirm deletion!", @@ -2766,14 +2956,14 @@ "请输入备注(仅管理员可见)": "Please enter a remark (only visible to administrators)", "请输入套餐标题": "Please enter plan title", "请输入完整的 JSON 格式密钥内容": "Please enter the complete JSON format key content", - "请输入完整的URL,例如:https://api.openai.com/v1/chat/completions": "Please enter complete URL, e.g.: https://api.openai.com/v1/chat/completions", "请输入完整的URL链接": "Please enter the complete URL link", + "请输入完整的URL,例如:https://api.openai.com/v1/chat/completions": "Please enter complete URL, e.g.: https://api.openai.com/v1/chat/completions", "请输入容器名称": "Please enter container name", "请输入密码": "Please enter password", "请输入密钥": "Please enter the key", + "请输入密钥!": "Please enter the key!", "请输入密钥,一行一个": "Please enter the key, one per line", "请输入密钥,一行一个,格式:AccessKey|SecretAccessKey|Region": "Enter keys one per line, format: AccessKey|SecretAccessKey|Region", - "请输入密钥!": "Please enter the key!", "请输入延长时长": "Please enter extension duration", "请输入总额度": "Please enter total quota", "请输入您的密码": "Please enter your password", @@ -2804,6 +2994,7 @@ "请输入模型名称,例如: llama3.2, qwen2.5:7b": "Please enter model name, e.g.: llama3.2, qwen2.5:7b", "请输入模型名称,如:gpt-4": "Please enter the model name, such as: gpt-4", "请输入模型描述": "Please enter the model description", + "请输入汇率": "Please enter the exchange rate", "请输入消息内容...": "Please enter the message content...", "请输入状态页面Slug": "Please enter the status page Slug", "请输入状态页面的Slug,如:my-status": "Please enter the slug for the status page, such as: my-status", @@ -2825,9 +3016,9 @@ "请输入认证器验证码或备用码": "Please enter authenticator verification code or backup code", "请输入说明": "Please enter the description", "请输入运行时长": "Please enter runtime duration", - "请输入邮箱!": "Please enter your email!", "请输入邮箱地址": "Please enter the email address", "请输入邮箱验证码!": "Please enter the email verification code!", + "请输入邮箱!": "Please enter your email!", "请输入部署名称": "Please enter deployment name", "请输入部署名称以完成二次确认": "Enter deployment name to complete secondary confirmation", "请输入部署地区,例如:us-central1\n支持使用模型映射格式\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}": "Please enter the deployment region, for example: us-central1\nSupports using model mapping format\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}", @@ -2875,9 +3066,6 @@ "调用次数排行": "Models call ranking", "调试信息": "Debug information", "谨慎": "Cautious", - "警告": "Warning", - "警告:启用保活后,如果已经写入保活数据后渠道出错,系统无法重试,如果必须开启,推荐设置尽可能大的Ping间隔": "Warning: After enabling keep-alive, if the channel fails after keep-alive data has been written, the system cannot retry. If you must enable it, it is recommended to set the Ping interval as large as possible", - "警告:禁用两步验证将永久删除您的验证设置和所有备用码,此操作不可撤销!": "Warning: Disabling two-factor authentication will permanently delete your verification settings and all backup codes. This action is irreversible!", "豆包": "Doubao", "账单": "Bills", "账户充值": "Account recharge", @@ -2896,6 +3084,7 @@ "购买套餐后即可享受模型权益": "Enjoy model benefits after purchasing a plan", "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。": "Purchasing or manually adding a subscription will upgrade to this group. When the plan expires or is invalidated/deleted, it will revert to the previous group. The rollback is not immediate and usually takes a few minutes.", "购买订阅套餐": "Purchase Subscription Plan", + "购买订阅获得模型额度/次数": "Purchase a subscription to get model quota/usage", "费用信息": "Cost Information", "费用预估": "Cost Estimate", "资源消耗": "Resource Consumption", @@ -2906,6 +3095,7 @@ "跟随日志": "Follow Logs", "跟随系统主题设置": "Follow system theme", "跨分组": "Cross-group", + "跨分组特殊倍率": "Cross-Group Special Ratios", "跨分组重试": "Cross-group retry", "路径正则": "Path Regex", "路径正则(每行一个)": "Path Regex (one per line)", @@ -2914,16 +3104,21 @@ "轮询": "Polling", "轮询模式": "Polling mode", "轮询模式必须搭配Redis和内存缓存功能使用,否则性能将大幅降低,并且无法实现轮询功能": "Polling mode must be used with Redis and memory cache functions, otherwise the performance will be significantly reduced and the polling function will not be implemented", + "软错误": "soft errors", "输入": "Input", "输入 OIDC 的 Authorization Endpoint": "Enter OIDC Authorization Endpoint", "输入 OIDC 的 Client ID": "Enter OIDC Client ID", "输入 OIDC 的 Token Endpoint": "Enter OIDC Token Endpoint", "输入 OIDC 的 Userinfo Endpoint": "Enter OIDC Userinfo Endpoint", + "输入 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "Input {{input}} tokens / 1M tokens * {{symbol}}{{price}}", + "输入 {{price}} / 1M tokens": "Input {{price}} / 1M tokens", "输入IP地址后回车,如:8.8.8.8": "Enter IP address and press Enter, e.g.: 8.8.8.8", "输入JSON对象": "Enter JSON Object", + "输入与缓存价格合计 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Input and cache pricing subtotal * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "输入价格": "Input Price", - "输入价格:{{symbol}}{{price}} / 1M tokens{{audioPrice}}": "Input Price: {{symbol}}{{price}} / 1M tokens{{audioPrice}}", "输入价格 {{symbol}}{{price}} / 1M tokens": "Input Price {{symbol}}{{price}} / 1M tokens", + "输入价格:{{symbol}}{{price}} / 1M tokens": "Input Price: {{symbol}}{{price}} / 1M tokens", + "输入价格:{{symbol}}{{price}} / 1M tokens{{audioPrice}}": "Input Price: {{symbol}}{{price}} / 1M tokens{{audioPrice}}", "输入你注册的 LinuxDO OAuth APP 的 ID": "Enter the ID of your registered LinuxDO OAuth APP", "输入你的账户名{{username}}以确认删除": "Enter your account name{{username}} to confirm deletion", "输入域名后回车": "Enter domain and press Enter", @@ -2933,6 +3128,7 @@ "输入数字": "Enter Number", "输入标签或使用\",\"分隔多个标签": "Enter tags or use \",\" to separate multiple tags", "输入模型倍率": "Enter model ratio", + "输入模型名称,例如 gpt-4.1": "Enter a model name, for example gpt-4.1", "输入每次价格": "Enter per-use price", "输入端口后回车,如:80 或 8000-8999": "Enter port and press Enter, e.g.: 80 or 8000-8999", "输入系统提示词,用户的系统提示词将优先于此设置": "Enter system prompt, user's system prompt will take priority over this setting", @@ -2950,8 +3146,13 @@ "输出": "Output", "输出 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}}) * {{ratioType}} {{ratio}}": "Output {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}}", "输出价格": "Output Price", + "输出价格 {{symbol}}{{price}} / 1M tokens": "Output Price {{symbol}}{{price}} / 1M tokens", "输出价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "Output price: {{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (Completion ratio: {{completionRatio}})", + "输出价格:{{symbol}}{{price}} / 1M tokens": "Output Price: {{symbol}}{{price}} / 1M tokens", + "输出价格:{{symbol}}{{total}} / 1M tokens": "Output Price: {{symbol}}{{total}} / 1M tokens", "输出倍率 {{completionRatio}}": "Output ratio {{completionRatio}}", + "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Output: {{tokens}} / 1M * model ratio {{modelRatio}} * completion ratio {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", + "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 输出倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Output: {{tokens}} / 1M * model ratio {{modelRatio}} * output ratio {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "边栏设置": "Sidebar Settings", "过期于": "Expires at", "过期时间": "Expiration time", @@ -2965,6 +3166,8 @@ "运行时长(小时)": "Runtime Duration (hours)", "返回修改": "Go back and edit", "返回登录": "Return to Login", + "这个界面默认按价格填写,保存时会自动换算回后端需要的倍率 JSON。": "This editor uses prices by default and converts them back into the ratio JSON required by the backend when saved.", + "这些价格都是可选项,不填也可以。": "All of these prices are optional and can be left empty.", "这将删除超过 10 分钟未使用的临时缓存文件": "This will delete temporary cache files that have not been used for more than 10 minutes", "这是基础金额,实际扣费 = 基础金额 x 系统分组倍率。": "This is the base amount. Actual deduction = base amount × system group ratio.", "这是重复键中的最后一个,其值将被使用": "This is the last one among duplicate keys, and its value will be used", @@ -2975,18 +3178,24 @@ "违规扣费": "Violation deduction", "违规扣费金额": "Violation deduction amount", "连接保活设置": "Connection Keep-alive Settings", + "连接信息已填入": "Connection info applied", "连接已断开": "Connection Disconnected", "连接测试中...": "Testing connection...", + "追加": "Append", "追加到现有密钥": "Append to existing key", "追加模式:将新密钥添加到现有密钥列表末尾": "Append mode: add new keys to the end of the existing key list", "追加模式:新密钥将添加到现有密钥列表的末尾": "Append mode: new keys will be added to the end of the existing key list", "追加模板": "Append Template", "退出": "Quit", "退款": "Refund", + "适合 MJ / 任务类等按次收费模型。": "Suitable for MJ and other task-based models billed per request.", + "适合同系列模型一起定价,例如把 gpt-5.1 的价格批量同步到 gpt-5.1-high、gpt-5.1-low 等模型。": "Useful for pricing model variants together, for example syncing the pricing of gpt-5.1 to gpt-5.1-high, gpt-5.1-low, and similar models.", "适用于个人使用的场景,不需要设置模型价格": "Suitable for personal use, no need to set model price.", "适用于为多个用户提供服务的场景": "Suitable for scenarios where multiple users are provided.", "适用于展示系统功能的场景,提供基础功能演示": "Suitable for scenarios where the system functions are displayed, providing basic feature demonstrations.", "适配 -thinking、-thinking-预算数字 和 -nothinking 后缀": "Adapt to -thinking, -thinking-budget number, -nothinking, and -low/-medium/-high suffixes", + "选择 premium 创建的令牌,调用 API 时费用为 standard 的 50%。": "Tokens created with premium cost 50% of standard when calling APIs.", + "选择使用分组": "Select using group", "选择充值套餐": "Choose a top-up package", "选择充值额度": "Select recharge amount", "选择分组": "Select group", @@ -3005,6 +3214,7 @@ "选择模型后可一键填充当前选中令牌(或本页第一个令牌)。": "After selecting a model, you can fill the current selected token (or the first token on this page) with one click.", "选择模型开始对话": "Select a model to start the conversation", "选择状态": "Select Status", + "选择用户分组": "Select user group", "选择硬件类型": "Select Hardware Type", "选择端点类型": "Select Endpoint Type", "选择系统运行模式": "Select system running mode", @@ -3030,8 +3240,10 @@ "通知类型 (quota_exceed: 额度预警)": "Notification type (quota_exceed: quota warning)", "通知邮箱": "Notification email", "通知配置": "Notification configuration", + "通过分组可以实现不同用户等级的差异化定价,例如 VIP 用户享受更低的 API 调用费用。": "Groups enable differentiated pricing for different user tiers. For example, VIP users can enjoy lower API costs.", "通过划转功能将奖励额度转入到您的账户余额中": "Transfer the reward amount to your account balance through the transfer function", "通过密码注册时需要进行邮箱验证": "Email verification is required when registering via password", + "通过此功能,可以根据用户所在分组,为不同等级的用户展示不同的可选列表。": "This feature allows showing different selectable group lists to users of different tiers.", "通道 ${name} 余额更新成功!": "Channel ${name} quota updated successfully!", "通道 ${name} 测试成功,模型 ${model} 耗时 ${time.toFixed(2)} 秒。": "Channel ${name} test successful, model ${model} took ${time.toFixed(2)} seconds.", "通道 ${name} 测试成功,耗时 ${time.toFixed(2)} 秒。": "Channel ${name} test successful, took ${time.toFixed(2)} seconds.", @@ -3086,6 +3298,7 @@ "配置 Telegram 登录": "Configure Telegram Login", "配置 Turnstile": "Configure Turnstile", "配置 WeChat Server": "Configure WeChat Server", + "配置后的效果:": "After configuration:", "配置和消息已全部重置": "Configuration and messages have been completely reset", "配置套餐的有效时长": "Configure the plan validity duration", "配置如何从用户信息 API 响应中提取用户数据,支持 JSONPath 语法": "Configure how to extract user data from user info API response, supports JSONPath syntax", @@ -3098,10 +3311,12 @@ "配置有效的 io.net API Key": "Configure a valid io.net API Key", "配置服务器端请求伪造(SSRF)防护,用于保护内网资源安全": "Configure Server-Side Request Forgery (SSRF) protection to secure internal network resources", "配置模型部署服务提供商的API密钥和启用状态": "Configure the API key and enabled status of the model deployment service provider", + "配置特殊倍率后:": "After configuring special ratios:", "配置登录注册": "Configure Login/Registration", "配置自定义 OAuth 提供商,支持 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 协议的身份提供商": "Configure custom OAuth providers, supports GitHub Enterprise, GitLab, Gitea, Nextcloud, Keycloak, ORY and other OAuth 2.0 compatible identity providers", "配置说明": "Configuration instructions", "配置邮箱域名白名单": "Configure email domain whitelist", + "配置:": "Config:", "重启部署失败": "Failed to restart deployment", "重命名部署": "Rename Deployment", "重复提交": "Duplicate submission", @@ -3145,6 +3360,7 @@ "键为端点类型,值为路径和方法对象": "The key is the endpoint type, the value is the path and method object", "键为请求中的模型名称,值为要替换的模型名称": "Key is the model name in the request, value is the model name to replace", "键名": "Key name", + "键的前缀 +: 表示添加,-: 表示移除,无前缀表示追加。值为分组描述(移除时填 \"remove\")。": "Key prefix +: means add, -: means remove, no prefix means append. Value is the group description (use \"remove\" for removal).", "镜像仓库密码": "Image Registry Password", "镜像仓库用户名": "Image Registry Username", "镜像仓库配置": "Image Registry Configuration", @@ -3160,15 +3376,15 @@ "限制周期统一使用上方配置的“限制周期”值。": "The limit period uniformly uses the \"limit period\" value configured above.", "限流": "Rate Limiting", "限购": "Limit", + "随机": "Random", + "随机模式": "Random mode", + "随机种子 (留空为随机)": "Random Seed (leave blank for random)", "隐私政策": "Privacy Policy", "隐私政策已更新": "Privacy policy updated", "隐私政策更新失败": "Privacy policy update failed", "隐私设置": "Privacy settings", "隐藏操作项": "Hide actions", "隐藏调试": "Hide debug", - "随机": "Random", - "随机模式": "Random mode", - "随机种子 (留空为随机)": "Random Seed (leave blank for random)", "零一万物": "Yi", "需要安全验证": "Security verification required", "需要添加的额度(支持负数)": "Need to add quota (supports negative numbers)", @@ -3178,14 +3394,21 @@ "非必要,不建议启用模型限制": "Not necessary, model restrictions are not recommended", "非流": "not stream", "音乐预览": "Music Preview", + "音频倍率 {{audioRatio}}": "Audio ratio {{audioRatio}}", "音频倍率(仅部分模型支持该计费)": "Audio ratio (only supported by some models for billing)", "音频提示 {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}": "Audio prompt {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + Audio completion {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}", "音频提示价格:{{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens (音频倍率: {{audioRatio}})": "Audio prompt price: {{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens (Audio ratio: {{audioRatio}})", "音频无法播放": "Audio cannot be played", + "音频补全价格": "Audio Completion Price", "音频补全价格:{{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens (音频补全倍率: {{audioCompRatio}})": "Audio completion price: {{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens (Audio completion ratio: {{audioCompRatio}})", + "音频补全价格:{{symbol}}{{price}} / 1M tokens": "Audio completion price: {{symbol}}{{price}} / 1M tokens", "音频补全倍率(仅部分模型支持该计费)": "Audio completion ratio (only supported by some models for this billing)", + "音频输入价格": "Audio Input Price", + "音频输入价格:{{symbol}}{{price}} / 1M tokens": "Audio input price: {{symbol}}{{price}} / 1M tokens", "音频输入相关的倍率设置,键为模型名称,值为倍率": "Audio input related ratio settings, key is model name, value is ratio", + "音频输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Audio input: {{tokens}} / 1M * model ratio {{modelRatio}} * audio ratio {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "音频输出补全相关的倍率设置,键为模型名称,值为倍率": "Audio output completion related ratio settings, key is model name, value is ratio", + "音频输出:{{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}}", "页脚": "Footer", "页面未找到,请检查您的浏览器地址是否正确": "Page not found, please check if your browser address is correct", "顶栏管理": "Header Management", @@ -3198,17 +3421,21 @@ "预填组管理": "Pre-filled group", "预扣": "Pre-deduction", "预览失败": "Preview failed", + "预览效果": "Preview", "预览更新": "Preview update", "预览模板": "Preview Template", "预览请求体": "Preview request body", + "预警阈值必须为正数": "Warning threshold must be a positive number", "预计结束": "Estimated End", "预设模板": "Preset Template", - "预警阈值必须为正数": "Warning threshold must be a positive number", "频率惩罚,减少重复词汇的出现": "Frequency penalty, reduces repeated vocabulary", "频率限制的周期(分钟)": "Rate limit period (minutes)", "颜色": "Color", + "额外价格项": "Additional price items", + "额外设置": "Extra Settings", "额度": "Quota", "额度充值": "Quota Top-up", + "额度展示类型": "Quota display type", "额度必须大于0": "Quota must be greater than 0", "额度提醒阈值": "Quota reminder threshold", "额度查询接口返回令牌额度而非用户额度": "Displays token quota instead of user quota", @@ -3238,144 +3465,30 @@ "高危状态码重试风险输入不匹配提示": "The input does not match the required text", "高危状态码重试风险输入框占位文案": "Please type the exact text above", "高级": "Advanced", + "高级套餐,半价优惠": "Premium plan, 50% off", "高级文本编辑": "Advanced Text Editing", "高级设置": "Advanced Settings", "高级选项": "Advanced Options", "高级配置": "Advanced Configuration", - "核心配置": "Core Configuration", - "创建渠道所需的基本信息": "Basic information needed to create a channel", - "请求配置": "Request Configuration", - "渠道行为": "Channel Behavior", - "额外设置": "Extra Settings", - "上游模型管理": "Upstream Model Management", "黑名单": "Blacklist", "默认": "Default", "默认 API 版本": "Default API Version", "默认 Responses API 版本,为空则使用上方版本": "Default Responses API version, if empty, uses the version above", "默认 TTL(秒)": "Default TTL (seconds)", "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)": "Defaults to the 5m cache creation ratio; the 1h cache creation ratio is computed by fixed multiplication (currently 1.6x)", + "默认使用auto分组": "Default to auto group", "默认使用系统名称": "Default uses system name", "默认助手消息": "Default Assistant Message", "默认区域": "Default region", "默认区域,如: us-central1": "Default region, e.g.: us-central1", + "默认情况下,所有用户创建令牌时看到的可选分组列表是一样的(即「用户可选」列勾选的分组)。": "By default, all users see the same selectable group list when creating tokens (i.e., groups with \"User Selectable\" checked).", "默认折叠侧边栏": "Default collapse sidebar", "默认测试模型": "Default Test Model", "默认用户消息": "Default User Message", "默认补全倍率": "Default completion ratio", - "提示:端点映射仅用于模型广场展示,不会影响模型真实调用。如需配置真实调用,请前往「渠道管理」。": "Notice: Endpoint mapping is for Model Marketplace display only and does not affect real model invocation. To configure real invocation, please go to Channel Management.", - "购买订阅获得模型额度/次数": "Purchase a subscription to get model quota/usage", - "生产环境 RSA 私钥 Base64 (PKCS#8 DER)": "Production RSA private key Base64 (PKCS#8 DER)", - "沙盒环境 RSA 私钥 Base64 (PKCS#8 DER)": "Sandbox RSA private key Base64 (PKCS#8 DER)", - "生产环境 Waffo 公钥 Base64 (X.509 DER)": "Production Waffo public key Base64 (X.509 DER)", - "沙盒环境 Waffo 公钥 Base64 (X.509 DER)": "Sandbox Waffo public key Base64 (X.509 DER)", - "支付方式类型": "Pay Method Type", - "支付方式名称": "Pay Method Name", - "获取充值配置失败": "Failed to get topup configuration", - "获取充值配置异常": "Topup configuration error", - "分组相关设置": "Group Related Settings", - "保存分组相关设置": "Save Group Related Settings", - "此页面仅显示未设置价格或基础倍率的模型,设置后会自动从列表中移出": "This page only shows models without base pricing. After saving, configured models will be removed from this list automatically.", - "没有未设置定价的模型": "No unpriced models", - "当前没有未设置定价的模型": "There are currently no models without pricing", - "模型计费编辑器": "Model Pricing Editor", - "价格摘要": "Price Summary", - "当前提示": "Current Notes", - "这个界面默认按价格填写,保存时会自动换算回后端需要的倍率 JSON。": "This editor uses prices by default and converts them back into the ratio JSON required by the backend when saved.", - "当前未启用,需要时再打开即可。": "This field is currently disabled. Enable it when needed.", - "下面展示这个模型保存后会写入哪些后端字段,便于和原始 JSON 编辑框保持一致。": "The fields below show which backend values will be written after saving, so you can keep them aligned with the raw JSON editors.", - "补全价格已锁定": "Completion price is locked", - "后端固定倍率:{{ratio}}。该字段仅展示换算后的价格。": "Backend fixed ratio: {{ratio}}. This field only displays the converted price.", - "这些价格都是可选项,不填也可以。": "All of these prices are optional and can be left empty.", - "请先开启并填写音频输入价格。": "Enable and fill in the audio input price first.", - "输入模型名称,例如 gpt-4.1": "Enter a model name, for example gpt-4.1", - "当前模型同时存在按次价格和倍率配置,保存时会按当前计费方式覆盖。": "This model currently has both per-request pricing and ratio-based pricing. Saving will overwrite them according to the current billing mode.", - "当前模型存在未显式设置输入倍率的扩展倍率;填写输入价格后会自动换算为价格字段。": "This model has derived ratios without an explicit input ratio. Once you fill in the input price, they will be converted into price fields automatically.", - "按量计费下需要先填写输入价格,才能保存其它价格项。": "For per-token billing, fill in the input price before saving other price fields.", - "填写音频补全价格前,需要先填写音频输入价格。": "Fill in the audio input price before setting the audio completion price.", - "模型 {{name}} 缺少输入价格,无法计算补全/缓存/图片/音频价格对应的倍率": "Model {{name}} is missing an input price, so the ratios for completion, cache, image, and audio pricing cannot be calculated.", - "模型 {{name}} 缺少音频输入价格,无法计算音频补全倍率": "Model {{name}} is missing an audio input price, so the audio completion ratio cannot be calculated.", - "批量应用当前模型价格": "Batch Apply Current Model Pricing", - "请先选择一个作为模板的模型": "Please select a model to use as the template first", - "请先勾选需要批量设置的模型": "Please select the models you want to update in batch first", - "已将模型 {{name}} 的价格配置批量应用到 {{count}} 个模型": "Applied the pricing configuration of model {{name}} to {{count}} models in batch", - "将把当前编辑中的模型 {{name}} 的价格配置,批量应用到已勾选的 {{count}} 个模型。": "The pricing configuration of the currently edited model {{name}} will be applied to the {{count}} selected models.", - "适合同系列模型一起定价,例如把 gpt-5.1 的价格批量同步到 gpt-5.1-high、gpt-5.1-low 等模型。": "Useful for pricing model variants together, for example syncing the pricing of gpt-5.1 to gpt-5.1-high, gpt-5.1-low, and similar models.", - "已勾选": "Selected", - "当前编辑": "Editing", - "已勾选 {{count}} 个模型": "{{count}} models selected", - "计费方式": "Billing Mode", - "未设置价格": "Price not set", - "保存预览": "Save Preview", - "基础价格": "Base Pricing", - "扩展价格": "Additional Pricing", - "额外价格项": "Additional price items", - "补全价格": "Completion Price", - "缓存读取价格": "Input Cache Read Price", - "缓存创建价格": "Input Cache Creation Price", - "图片输入价格": "Image Input Price", - "音频输入价格": "Audio Input Price", - "音频输入价格:{{symbol}}{{price}} / 1M tokens": "Audio input price: {{symbol}}{{price}} / 1M tokens", - "音频补全价格": "Audio Completion Price", - "音频补全价格:{{symbol}}{{price}} / 1M tokens": "Audio completion price: {{symbol}}{{price}} / 1M tokens", - "适合 MJ / 任务类等按次收费模型。": "Suitable for MJ and other task-based models billed per request.", - "该模型补全倍率由后端固定为 {{ratio}}。补全价格不能在这里修改。": "This model's completion ratio is fixed to {{ratio}} by the backend. The completion price cannot be changed here.", - "Web 搜索调用 {{webSearchCallCount}} 次": "Web search called {{webSearchCallCount}} times", - "文件搜索调用 {{fileSearchCallCount}} 次": "File search called {{fileSearchCallCount}} times", - "实际结算金额:{{symbol}}{{total}}(已包含分组价格调整)": "Actual charge: {{symbol}}{{total}} (group pricing adjustment included)", - "图片倍率 {{imageRatio}}": "Image ratio {{imageRatio}}", - "音频倍率 {{audioRatio}}": "Audio ratio {{audioRatio}}", - "普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Standard input: {{tokens}} / 1M * model ratio {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "缓存输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Cached input: {{tokens}} / 1M * model ratio {{modelRatio}} * cache ratio {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 图片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Image input: {{tokens}} / 1M * model ratio {{modelRatio}} * image ratio {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Audio input: {{tokens}} / 1M * model ratio {{modelRatio}} * audio ratio {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Output: {{tokens}} / 1M * model ratio {{modelRatio}} * completion ratio {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "Web 搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Web search: {{count}} / 1K * unit price {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "文件搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "File search: {{count}} / 1K * unit price {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片生成:1 次 * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Image generation: 1 call * unit price {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "合计:{{total}}": "Total: {{total}}", - "模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},音频倍率 {{audioRatio}},音频补全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}": "Model ratio {{modelRatio}}, completion ratio {{completionRatio}}, audio ratio {{audioRatio}}, audio completion ratio {{audioCompletionRatio}}, {{cachePart}}{{ratioType}} {{ratio}}", - "文字输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Text output: {{tokens}} / 1M * model ratio {{modelRatio}} * completion ratio {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输出:{{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}}", - "缓存读取:{{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", - "{{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", - "例如:gpt-4.1-nano,regex:^claude-.*$,regex:^sora-.*$": "Example: gpt-4.1-nano,regex:^claude-.*$,regex:^sora-.*$", - "支持精确匹配;使用 regex: 开头可按正则匹配。": "Supports exact matching. Use a regex: prefix for regex matching.", - "复制密钥": "Copy Key", - "复制连接信息": "Copy Connection String", - "检测到剪贴板中的连接信息": "Connection info detected in clipboard", - "自动填入": "Auto-fill", - "忽略": "Ignore", - "从剪贴板粘贴配置": "Paste Config", - "剪贴板中未检测到连接信息": "No connection info found in clipboard", - "连接信息已填入": "Connection info applied", - "无法读取剪贴板": "Cannot read clipboard" + "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(Currently only supports Epay interface, the default callback address is the server address above!)", + ",当前无生效订阅,将自动使用钱包": ", no active subscription. Wallet will be used automatically.", + ",时间:": ",time:", + ",点击更新": ", click Update" } } diff --git a/web/src/i18n/locales/fr.json b/web/src/i18n/locales/fr.json index ec0689fe..b3b57060 100644 --- a/web/src/i18n/locales/fr.json +++ b/web/src/i18n/locales/fr.json @@ -1,53 +1,52 @@ { "translation": { - " + Web搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_one": " + Recherche Web {{count}} fois / 1K fois * {{symbol}}{{price}} * {{ratioType}} {{ratio}}", " + Web搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_many": " + Recherche Web {{count}} fois / 1K fois * {{symbol}}{{price}} * {{ratioType}} {{ratio}}", + " + Web搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_one": " + Recherche Web {{count}} fois / 1K fois * {{symbol}}{{price}} * {{ratioType}} {{ratio}}", " + Web搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_other": " + Recherche Web {{count}} fois / 1K fois * {{symbol}}{{price}} * {{ratioType}} {{ratio}}", " + 图片生成调用 {{symbol}}{{price}} / 1次 * {{ratioType}} {{ratio}}": " + Appel de génération d'image {{symbol}}{{price}} / 1 fois * {{ratioType}} {{ratio}}", - " + 文件搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_one": " + Recherche de fichiers {{count}} fois / 1K fois * {{symbol}}{{price}} * {{ratioType}} {{ratio}}", " + 文件搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_many": " + Recherche de fichiers {{count}} fois / 1K fois * {{symbol}}{{price}} * {{ratioType}} {{ratio}}", + " + 文件搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_one": " + Recherche de fichiers {{count}} fois / 1K fois * {{symbol}}{{price}} * {{ratioType}} {{ratio}}", " + 文件搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_other": " + Recherche de fichiers {{count}} fois / 1K fois * {{symbol}}{{price}} * {{ratioType}} {{ratio}}", " 个模型设置相同的值": " modèles avec la même valeur", " 吗?": " ?", " 秒": "s", " 秒。": " secondes.", - ",当前无生效订阅,将自动使用钱包": ", aucun abonnement actif, le portefeuille sera utilisé automatiquement.", - ",时间:": ", time:", - ",点击更新": ", cliquez sur Mettre à jour", - "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(Actuellement, seule l'interface Epay est prise en charge, l'adresse du serveur ci-dessus est utilisée par défaut comme adresse de rappel !)", - "(筛选后显示 {{count}} 条)_one": "(Showing {{count}} item after filtering)", + "$/1M tokens": "$/1M tokens", "(筛选后显示 {{count}} 条)_many": "(Affichage de {{count}} éléments après filtrage)", + "(筛选后显示 {{count}} 条)_one": "(Showing {{count}} item after filtering)", "(筛选后显示 {{count}} 条)_other": "(Showing {{count}} items after filtering)", "(输入 {{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}}", - "[最多请求次数]和[最多请求完成次数]的最大值为2147483647。": "La valeur maximale de [Nombre maximal de requêtes] et [Nombre maximal d'achèvements de requêtes] est 2147483647.", - "[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。": "[Nombre maximal de requêtes] doit être supérieur ou égal à 0, [Nombre maximal d'achèvements de requêtes] doit être supérieur ou égal à 1.", - "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", - "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", - "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", - "{{name}} ID": "{{name}} ID", - "{{ratioType}} {{ratio}}": "{{ratioType}} {{ratio}}", - "• 视频服务商的跨域限制": "• Des restrictions cross-origin imposées par le fournisseur vidéo", - "• 防盗链保护机制": "• Un mécanisme de protection anti-hotlink", - "• 需要特定的请求头或认证": "• Des en-têtes ou une authentification spécifiques sont requis", - "© {{currentYear}}": "© {{currentYear}}", - "| 基于": " | Basé sur ", - "$/1M tokens": "$/1M tokens", + "(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}": "(Entrée {{nonImageInput}} tokens + Entrée image {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}", "0 - 最低": "0 - La plus basse", "0 表示不限": "0 signifie illimité", "0.002-1之间的小数": "Décimal entre 0,002-1", "0.1以上的小数": "Décimal supérieur à 0,1", "1) 点击「打开授权页面」完成登录;2) 浏览器会跳转到 localhost(页面打不开也没关系);3) 复制地址栏完整 URL 粘贴到下方;4) 点击「生成并填入」。": "1) Cliquez sur « Ouvrir la page d'autorisation » pour vous connecter ; 2) Le navigateur redirigera vers localhost (ce n'est pas grave si la page ne s'ouvre pas) ; 3) Copiez l'URL complète de la barre d'adresse et collez-la ci-dessous ; 4) Cliquez sur « Générer et remplir ».", + "1. 管理员在此创建分组并设置倍率": "1. Admin creates groups and sets ratios here", "10 - 最高": "10 - La plus haute", + "1h缓存创建 {{price}} / 1M tokens": "Création de cache 1h {{price}} / 1M tokens", + "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Création de cache 1h {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Création du cache 1h {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio : {{ratio}})", + "1h缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Prix de création du cache 1h {{symbol}}{{price}} / 1M tokens", "1h缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (1h缓存创建倍率: {{cacheCreationRatio1h}})": "Prix de création de cache 1h : {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (ratio de création 1h : {{cacheCreationRatio1h}})", + "1h缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Prix de création du cache 1h : {{symbol}}{{price}} / 1M tokens", + "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}}", "2 - 低": "2 - Basse", + "2. 管理员在用户管理中将用户分配到对应分组(如 vip)": "2. Admin assigns users to groups in User Management (e.g., vip)", "2025年5月10日后添加的渠道,不需要再在部署的时候移除模型名称中的\".\"": "Après le 10 mai 2025, les canaux ajoutés n'ont plus besoin de supprimer le point dans le nom du modèle lors du déploiement", + "3. 用户创建令牌时,下拉菜单中出现勾选了「用户可选」的分组": "3. When users create tokens, groups with \"User Selectable\" checked appear in the dropdown", "360智脑": "360 AI Brain", + "4. 令牌使用所选分组的倍率进行计费": "4. Token uses the selected group's ratio for billing", "5 - 正常(默认)": "5 - Normale (par défaut)", + "5m缓存创建 {{price}} / 1M tokens": "Création de cache 5m {{price}} / 1M tokens", + "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Création de cache 5m {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Création du cache 5m {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio : {{ratio}})", + "5m缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Prix de création du cache 5m {{symbol}}{{price}} / 1M tokens", "5m缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (5m缓存创建倍率: {{cacheCreationRatio5m}})": "Prix de création de cache 5m : {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (ratio de création 5m : {{cacheCreationRatio5m}})", + "5m缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Prix de création du cache 5m : {{symbol}}{{price}} / 1M tokens", + "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}}", "8 - 高": "8 - Haute", "AGPL v3.0协议": "Licence AGPL v3.0", "AI 对话": "Conversation IA", @@ -69,41 +68,36 @@ "API地址": "URL de base", "API渠道配置": "Configuration du canal de l'API", "API端点": "Points de terminaison de l'API", - "Authorization callback URL 填": "Remplir l'URL de rappel d'autorisation", "Authorization Endpoint": "Point de terminaison d'autorisation", - "auto分组调用链路": "Chaîne d'appels de groupe auto", + "Authorization callback URL 填": "Remplir l'URL de rappel d'autorisation", "Bark推送URL": "URL de notification Bark", "Bark推送URL必须以http://或https://开头": "L'URL de notification Bark doit commencer par http:// ou https://", "Bark通知": "Notification Bark", "Basic Auth 头": "En-tête Basic Auth", + "CPU 使用率超过此值时拒绝请求": "Rejeter les requêtes lorsque l'utilisation du CPU dépasse cette valeur", + "CPU 阈值 (%)": "Seuil CPU (%)", "Cached tokens": "Cached tokens", "Cached tokens 占比口径由后端返回:Claude 语义按 cached/(prompt+cached),其余按 cached/prompt。": "Le ratio de cached tokens est renvoyé par le backend : la sémantique Claude calcule cached/(prompt+cached), les autres calculent cached/prompt.", "Changing batch type to:": "Changement du type de lot en :", "ChatCompletions→Responses 兼容配置": "Configuration de compatibilité ChatCompletions→Responses", "ChatCompletions→Responses 兼容配置(Beta)": "Compatibilité ChatCompletions→Responses (bêta)", "Claude 强制 beta=true": "Claude forcer beta=true", + "Claude会在原有请求头基础上追加这些值,不会覆盖已有同名请求头;重复值会自动忽略。": "Claude ajoute ces valeurs aux en-tetes de requete existants. Les en-tetes existants ne sont pas remplaces et les valeurs en double sont ignorees automatiquement.", "Claude思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Adaptation de la pensée Claude BudgetTokens = MaxTokens * BudgetTokens pourcentage", "Claude设置": "Paramètres Claude", "Claude请求头覆盖": "Remplacement de l'en-tête de la requête Claude", "Claude请求头追加": "Ajout des en-tetes de requete Claude", - "Claude会在原有请求头基础上追加这些值,不会覆盖已有同名请求头;重复值会自动忽略。": "Claude ajoute ces valeurs aux en-tetes de requete existants. Les en-tetes existants ne sont pas remplaces et les valeurs en double sont ignorees automatiquement.", "Client ID": "ID client", "Client Secret": "Secret client", "Codex 授权": "Autorisation Codex", "Codex 渠道不支持批量创建": "Le canal Codex ne prend pas en charge la création par lot", - "common.changeLanguage": "Changer de langue", "Completion tokens": "Completion tokens", "Configuration": "Configuration", - "context_int/context_string 从请求上下文读取;gjson 从入口请求的 JSON body 按 gjson path 读取。": "context_int/context_string lit depuis le contexte de la requête ; gjson lit depuis le body JSON de la requête d'entrée via le chemin gjson.", - "CPU 使用率超过此值时拒绝请求": "Rejeter les requêtes lorsque l'utilisation du CPU dépasse cette valeur", - "CPU 阈值 (%)": "Seuil CPU (%)", "Creem API 密钥,敏感信息不显示": "Clé API Creem, les informations sensibles ne sont pas affichées", "Creem Setting Tips": "Creem ne prend en charge que des produits à montant fixe préconfigurés. Ces produits et leurs prix doivent être créés et configurés à l'avance sur le site Creem, les recharges à montant dynamique ne sont donc pas prises en charge. Configurez le nom et le prix du produit sur Creem, récupérez l'identifiant du produit, puis remplissez-le ci-dessous. Définissez enfin le montant et le prix affiché dans new-api.", "Creem 介绍": "Présentation de Creem", "Creem 充值": "Recharge Creem", "Creem 设置": "Paramètres Creem", - "default为默认设置,可单独设置每个分类的安全等级": "\"default\" est le paramètre par défaut, et chaque catégorie peut être définie séparément", - "default为默认设置,可单独设置每个模型的版本": "\"default\" est le paramètre par défaut, et chaque modèle peut être défini séparément", "Dify渠道只适配chatflow和agent,并且agent不支持图片!": "Le canal Dify ne prend en charge que chatflow et agent, et l'agent ne prend pas en charge les images !", "Discord": "Discord", "Discord Client ID": "ID client Discord", @@ -113,10 +107,11 @@ "Discovery scopes": "Discovery scopes", "Discovery 建议 scopes:": "Scopes Discovery recommandés :", "EUR (欧元)": "EUR (Euro)", - "false": "faux", "GC 已执行": "GC exécuté", "GC 执行失败": "Échec de l'exécution du GC", "GC 次数": "Nombre de GC", + "GPU/容器": "GPU/Container", + "GPU数量": "Number of GPUs", "Gemini安全设置": "Paramètres de sécurité Gemini", "Gemini思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Adaptation de la pensée Gemini BudgetTokens = MaxTokens * BudgetTokens pourcentage", "Gemini思考适配设置": "Paramètres d'adaptation de la pensée Gemini", @@ -131,14 +126,10 @@ "Gotify服务器地址": "Adresse du serveur Gotify", "Gotify服务器地址必须以http://或https://开头": "L'adresse du serveur Gotify doit commencer par http:// ou https://", "Gotify通知": "Notification Gotify", - "GPU/容器": "GPU/Container", - "GPU数量": "Number of GPUs", "Grok设置": "Paramètres Grok", "Haiku 模型": "Modèle Haiku", "Homepage URL 填": "Remplir l'URL de la page d'accueil", "ID": "ID", - "include_obfuscation 用于控制 Responses 流混淆字段。默认关闭以避免客户端关闭该安全保护": "include_obfuscation contrôle les champs d'obfuscation dans le flux Responses. Désactivé par défaut pour éviter que les clients ne désactivent cette protection de sécurité", - "inference_geo 字段用于控制 Claude 数据驻留推理区域。默认关闭以避免未经授权透传地域信息": "Le champ inference_geo contrôle la région de résidence des données d'inférence de Claude. Désactivé par défaut pour éviter la transmission non autorisée d'informations géographiques", "IP": "IP", "IP白名单": "IP Whitelist", "IP白名单(支持CIDR表达式)": "Liste blanche d'adresses IP (prise en charge des expressions CIDR)", @@ -148,6 +139,7 @@ "JSON 已格式化": "JSON formaté", "JSON 文本": "Texte JSON", "JSON 无效": "JSON invalide", + "JSON 格式参考": "JSON Reference", "JSON 模式": "Mode JSON", "JSON 模式支持手动输入或上传服务账号 JSON": "Le mode JSON prend en charge la saisie manuelle ou le téléchargement du JSON du compte de service", "JSON格式密钥,请确保格式正确": "Clé au format JSON, veuillez vous assurer que le format est correct", @@ -165,8 +157,8 @@ "LinuxDO": "LinuxDO", "LinuxDO ID": "ID LinuxDO", "Logo 图片地址": "Adresse de l'image du logo", - "Midjourney 任务记录": "Tâches Midjourney", "MIT许可证": "Licence MIT", + "Midjourney 任务记录": "Tâches Midjourney", "New API项目仓库地址:": "Adresse du référentiel du projet New API : ", "NewAPI 默认不会将入口请求的 User-Agent 透传到上游渠道;该条件仅用于识别访问本站点的客户端。": "NewAPI ne transmet pas le User-Agent de la requête entrante aux canaux en amont par défaut ; cette condition sert uniquement à identifier les clients accédant à ce site.", "OAuth Client ID": "OAuth Client ID", @@ -177,6 +169,7 @@ "Ollama 模型管理": "Ollama Model Management", "Ollama 版本信息": "Ollama Version Info", "Opus 模型": "Modèle Opus", + "POST 参数": "Paramètres POST", "Passkey": "Passkey", "Passkey 已解绑": "Passkey délié", "Passkey 已重置": "Le Passkey a été réinitialisé", @@ -185,53 +178,49 @@ "Passkey 注册成功": "Enregistrement du Passkey réussi", "Passkey 登录": "Connexion avec Passkey", "Ping间隔(秒)": "Intervalle de ping (secondes)", - "POST 参数": "Paramètres POST", - "price_xxx 的商品价格 ID,新建产品后可获得": "ID de prix du produit price_xxx, peut être obtenu après la création d'un nouveau produit", "Prompt cache hit tokens": "Prompt cache hit tokens", "Prompt tokens": "Prompt tokens", "Reasoning Effort": "Effort de raisonnement", "Request ID": "Request ID", - "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "Le champ safety_identifier aide OpenAI à identifier les utilisateurs d'applications susceptibles de violer les politiques d'utilisation. Désactivé par défaut pour protéger la confidentialité des utilisateurs", - "Scopes(可选)": "Scopes (optionnel)", - "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "Le champ service_tier est utilisé pour spécifier le niveau de service. Permettre le passage peut entraîner une facturation plus élevée que prévu. Désactivé par défaut pour éviter des frais supplémentaires", - "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "Clé secrète Stripe sk_xxx ou rk_xxx, les informations sensibles ne sont pas affichées", "SMTP 发送者邮箱": "Adresse e-mail de l'expéditeur SMTP", "SMTP 服务器地址": "Adresse du serveur SMTP", "SMTP 端口": "Port SMTP", "SMTP 访问凭证": "Informations d'identification d'accès SMTP", "SMTP 账户": "Compte SMTP", - "Sonnet 模型": "Modèle Sonnet", "SSE 事件": "Événement SSE", "SSE数据流": "Flux de données SSE", "SSRF防护开关详细说明": "L'interrupteur principal contrôle si la protection SSRF est activée. Lorsqu'elle est désactivée, toutes les vérifications SSRF sont contournées, autorisant l'accès à n'importe quelle URL. ⚠️ Ne désactivez cette fonctionnalité que dans des environnements entièrement fiables.", "SSRF防护设置": "Protection SSRF", "SSRF防护详细说明": "La protection SSRF empêche les utilisateurs malveillants d'utiliser votre serveur pour accéder aux ressources du réseau interne. Configurez des listes blanches pour les domaines/IP de confiance et limitez les ports autorisés. S'applique aux téléchargements de fichiers, aux webhooks et aux notifications.", - "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "Le champ store autorise OpenAI à stocker les données de requête pour l'évaluation et l'optimisation du produit. Désactivé par défaut. L'activation peut causer un dysfonctionnement de Codex", + "Scopes(可选)": "Scopes (optionnel)", + "Sonnet 模型": "Modèle Sonnet", "Stripe 设置": "Paramètres Stripe", "Stripe/Creem 商品ID(可选)": "ID produit Stripe/Creem (optionnel)", "Stripe/Creem 需在第三方平台创建商品并填入 ID": "Les produits Stripe/Creem doivent être créés sur la plateforme tierce et l'ID doit être renseigné", + "TTL(秒)": "TTL (secondes)", + "TTL(秒,0 表示默认)": "TTL (secondes, 0 pour la valeur par défaut)", "Telegram": "Telegram", "Telegram Bot Token": "Jeton du bot Telegram", "Telegram Bot 名称": "Nom du bot Telegram", "Telegram ID": "ID Telegram", "Token Endpoint": "Point de terminaison du jeton", - "token 会按倍率换算成“额度/次数”,请求结束后再做差额结算(补扣/返还)。": "Les tokens sont convertis en quota/nombre d'utilisations selon le ratio. Après la requête, la différence est réglée (déduction supplémentaire/remboursement).", "Total tokens": "Total tokens", - "true": "vrai", - "TTL(秒,0 表示默认)": "TTL (secondes, 0 pour la valeur par défaut)", - "TTL(秒)": "TTL (secondes)", "Turnstile Secret Key": "Clé secrète Turnstile", "Turnstile Site Key": "Clé du site Turnstile", - "Unix时间戳": "Horodatage Unix", - "Uptime Kuma地址": "Adresse Uptime Kuma", - "Uptime Kuma监控分类管理,可以配置多个监控分类用于服务状态展示(最多20个)": "Catégories de surveillance Uptime Kuma, vous pouvez configurer plusieurs catégories de surveillance pour l'affichage de l'état du service (maximum 20)", "URL 标识,只能包含小写字母、数字和连字符": "Identifiant URL, uniquement lettres minuscules, chiffres et tirets autorisés", "URL链接": "Lien URL", "USD (美元)": "USD (Dollar US)", + "Unix时间戳": "Horodatage Unix", + "Uptime Kuma地址": "Adresse Uptime Kuma", + "Uptime Kuma监控分类管理,可以配置多个监控分类用于服务状态展示(最多20个)": "Catégories de surveillance Uptime Kuma, vous pouvez configurer plusieurs catégories de surveillance pour l'affichage de l'état du service (maximum 20)", "User Info Endpoint": "Point de terminaison des informations utilisateur", "User-Agent include(每行一个,可不写)": "User-Agent include (un par ligne, optionnel)", "Value 正则": "Regex de valeur", "Vertex AI 不支持 functionResponse.id 字段,开启后将自动移除该字段": "Vertex AI ne prend pas en charge le champ functionResponse.id. Lorsqu'il est activé, ce champ sera automatiquement supprimé", + "WeChat Server 服务器地址": "Adresse du serveur WeChat Server", + "WeChat Server 访问凭证": "Informations d'identification d'accès au serveur WeChat", + "Web 搜索调用 {{webSearchCallCount}} 次": "Recherche Web appelée {{webSearchCallCount}} fois", + "Web 搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Recherche Web : {{count}} / 1K * prix unitaire {{price}} * {{ratioType}} {{ratio}} = {{amount}}", "Webhook 密钥": "Clé Webhook", "Webhook 签名密钥": "Clé de signature Webhook", "Webhook地址": "URL du Webhook", @@ -239,49 +228,89 @@ "Webhook请求结构说明": "Description de la structure de la requête Webhook", "Webhook通知": "Notification par Webhook", "Web搜索价格:{{symbol}}{{price}} / 1K 次": "Prix de recherche Web : {{symbol}}{{price}} / 1K fois", - "WeChat Server 服务器地址": "Adresse du serveur WeChat Server", - "WeChat Server 访问凭证": "Informations d'identification d'accès au serveur WeChat", "Well-Known URL": "URL bien connue", "Well-Known URL 必须以 http:// 或 https:// 开头": "L'URL bien connue doit commencer par http:// ou https://", - "whsec_xxx 的 Webhook 签名密钥,敏感信息不显示": "Clé de signature Webhook whsec_xxx, les informations sensibles ne sont pas affichées", "Worker地址": "Adresse du Worker", "Worker密钥": "Clé du Worker", + "[最多请求次数]和[最多请求完成次数]的最大值为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.", + "auto分组调用链路": "Chaîne d'appels de groupe auto", + "common.changeLanguage": "Changer de langue", + "context_int/context_string 从请求上下文读取;gjson 从入口请求的 JSON body 按 gjson path 读取。": "context_int/context_string lit depuis le contexte de la requête ; gjson lit depuis le body JSON de la requête d'entrée via le chemin gjson.", + "default 和 vip 只能由管理员在「用户管理」中分配给用户。适用于按用户等级定价、内部测试等不希望用户自主选择的场景。": "default and vip can only be assigned to users by admin in \"User Management\". Suitable for tiered pricing, internal testing, or other scenarios where user self-selection is not desired.", + "default为默认设置,可单独设置每个分类的安全等级": "\"default\" est le paramètre par défaut, et chaque catégorie peut être définie séparément", + "default为默认设置,可单独设置每个模型的版本": "\"default\" est le paramètre par défaut, et chaque modèle peut être défini séparément", + "false": "faux", + "include_obfuscation 用于控制 Responses 流混淆字段。默认关闭以避免客户端关闭该安全保护": "include_obfuscation contrôle les champs d'obfuscation dans le flux Responses. Désactivé par défaut pour éviter que les clients ne désactivent cette protection de sécurité", + "inference_geo 字段用于控制 Claude 数据驻留推理区域。默认关闭以避免未经授权透传地域信息": "Le champ inference_geo contrôle la région de résidence des données d'inférence de Claude. Désactivé par défaut pour éviter la transmission non autorisée d'informations géographiques", + "price_xxx 的商品价格 ID,新建产品后可获得": "ID de prix du produit price_xxx, peut être obtenu après la création d'un nouveau produit", + "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "Le champ safety_identifier aide OpenAI à identifier les utilisateurs d'applications susceptibles de violer les politiques d'utilisation. Désactivé par défaut pour protéger la confidentialité des utilisateurs", + "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "Le champ service_tier est utilisé pour spécifier le niveau de service. Permettre le passage peut entraîner une facturation plus élevée que prévu. Désactivé par défaut pour éviter des frais supplémentaires", + "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "Clé secrète Stripe sk_xxx ou rk_xxx, les informations sensibles ne sont pas affichées", + "standard 已被移除,vip 用户看不到": "standard has been removed, vip users cannot see it", + "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "Le champ store autorise OpenAI à stocker les données de requête pour l'évaluation et l'optimisation du produit. Désactivé par défaut. L'activation peut causer un dysfonctionnement de Codex", + "token 会按倍率换算成“额度/次数”,请求结束后再做差额结算(补扣/返还)。": "Les tokens sont convertis en quota/nombre d'utilisations selon le ratio. Après la requête, la différence est réglée (déduction supplémentaire/remboursement).", + "true": "vrai", + "whsec_xxx 的 Webhook 签名密钥,敏感信息不显示": "Clé de signature Webhook whsec_xxx, les informations sensibles ne sont pas affichées", + "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", + "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", + "{{name}} ID": "{{name}} ID", + "{{ratioType}} {{ratio}}": "{{ratioType}} {{ratio}}", + "{{ratioType}} {{ratio}}x": "{{ratioType}} {{ratio}}x", + "| 基于": " | Basé sur ", + "© {{currentYear}}": "© {{currentYear}}", + "• 视频服务商的跨域限制": "• Des restrictions cross-origin imposées par le fournisseur vidéo", + "• 防盗链保护机制": "• Un mécanisme de protection anti-hotlink", + "• 需要特定的请求头或认证": "• Des en-têtes ou une authentification spécifiques sont requis", + "「用户可选」决定用户创建令牌时能否自主选择该分组。未勾选的分组只能由管理员在后台分配给用户,不会出现在用户的令牌创建页面中。": "\"User Selectable\" controls whether users can choose this group when creating tokens. Unchecked groups can only be assigned by admin and won't appear in the token creation page.", "一个月": "Un mois", "一天": "Un jour", "一小时": "Une heure", "一次调用消耗多少刀,优先级大于模型倍率": "Combien de USD coûte un appel, priorité sur le ratio de modèle", - "一行一个,不区分大小写": "Un mot-clé par ligne, insensible à la casse", "一行一个屏蔽词,不需要符号分割": "Un mot sensible par ligne, aucun symbole n'est requis", + "一行一个,不区分大小写": "Un mot-clé par ligne, insensible à la casse", "一键填充到 FluentRead": "Remplissage en un clic vers FluentRead", + "三种操作的区别:": "Differences between the three operations:", "上一个表单块": "Bloc de formulaire précédent", "上一步": "Précédent", "上次保存: ": "Dernier enregistrement : ", "上游倍率同步": "Synchronisation du ratio en amont", + "上游模型管理": "Gestion des modèles amont", "上游返回": "Réponse amont", "下一个表单块": "Bloc de formulaire suivant", "下一步": "Suivant", "下午好": "Bon après-midi", "下载日志": "Download Logs", + "下面展示这个模型保存后会写入哪些后端字段,便于和原始 JSON 编辑框保持一致。": "Les champs backend écrits après l'enregistrement sont affichés ci-dessous afin de rester cohérents avec les éditeurs JSON bruts.", + "不会出现": "will not appear", "不再提醒": "Ne plus rappeler", + "不勾选用户可选": "Not user-selectable", "不升级": "Pas de mise à niveau", + "不变": "unchanged", "不同用户分组的价格信息": "Informations sur les prix pour différents groupes d'utilisateurs", "不填则为模型列表第一个": "Premier modèle de la liste si vide", "不建议使用": "Non recommandé", "不支持": "Non pris en charge", "不是合法的 JSON 字符串": "N'est pas une chaîne JSON valide", "不更改": "Ne pas changer", + "不配置特殊倍率时:": "Without special ratios:", + "不配置规则时,所有用户看到的下拉框一样:": "Without rules, all users see the same dropdown:", "不重置": "Pas de réinitialisation", + "不重试": "Ne pas réessayer", "不限": "Illimité", "不限制": "Illimité", "与本地相同": "Identique au local", "专属倍率": "Ratio de groupe exclusif", + "专属分组": "Exclusive group", + "两个分组都勾选了「用户可选」,所以用户创建令牌时可以看到这两个选项:": "Both groups have \"User Selectable\" checked, so users can see these two options when creating tokens:", "两次输入的密码不一致": "Les deux mots de passe saisis ne correspondent pas", "两次输入的密码不一致!": "Les mots de passe saisis deux fois sont incohérents !", "两步验证": "Authentification à deux facteurs", - "两步验证(2FA)为您的账户提供额外的安全保护。启用后,登录时需要输入密码和验证器应用生成的验证码。": "L'authentification à deux facteurs (2FA) offre une protection de sécurité supplémentaire à votre compte. Après l'avoir activée, vous devez saisir votre mot de passe et le code de vérification généré par l'application d'authentification lorsque vous vous connectez.", "两步验证启用成功!": "Authentification à deux facteurs activée avec succès !", "两步验证已禁用": "L'authentification à deux facteurs a été désactivée", "两步验证设置": "Paramètres d'authentification à deux facteurs", + "两步验证(2FA)为您的账户提供额外的安全保护。启用后,登录时需要输入密码和验证器应用生成的验证码。": "L'authentification à deux facteurs (2FA) offre une protection de sécurité supplémentaire à votre compte. Après l'avoir activée, vous devez saisir votre mot de passe et le code de vérification généré par l'application d'authentification lorsque vous vous connectez.", "个": " individuel", "个GPU": " GPUs", "个人中心": "Centre personnel", @@ -299,6 +328,7 @@ "个生效中": "actifs", "个部署吗?此操作不可逆。": " deployments? This operation cannot be undone.", "中午好": "Bon midi", + "为 vip 用户配置规则:": "Configure rules for vip users:", "为一个 JSON 对象,例如:{\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}": "Est un objet JSON, par exemple : {\"100\": 0,95, \"200\": 0,9, \"500\": 0,85}", "为一个 JSON 数组,例如:[10, 20, 50, 100, 200, 500]": "Est un tableau JSON, par exemple : [10, 20, 50, 100, 200, 500]", "为一个 JSON 文本": "Est un texte JSON", @@ -313,7 +343,9 @@ "为一个 JSON 文本,键为组名称,值为倍率": "Est un texte JSON, la clé est le nom du groupe, la valeur est le ratio", "为了保护账户安全,请验证您的两步验证码。": "Pour protéger la sécurité du compte, veuillez vérifier votre code d'authentification à deux facteurs.", "为了保护账户安全,请验证您的身份。": "Pour protéger la sécurité de votre compte, veuillez vérifier votre identité.", + "为什么 default 不勾选「用户可选」?": "Why is default not set as \"User Selectable\"?", "为保证匹配准确,请确保客户端直连本站点(避免反向代理/网关改写 User-Agent)。": "Pour garantir un matching précis, assurez-vous que le client se connecte directement à ce site (évitez les proxys inversés/passerelles qui réécrivent le User-Agent).", + "为特定用户分组配置可用分组的增减规则。「添加」为该分组新增可用分组,「移除」移除默认可用分组,「追加」直接追加分组": "Configure add/remove rules for specific user groups. \"Add\" adds a new selectable group, \"Remove\" removes a default selectable group, \"Append\" directly appends a group", "为空则默认使用服务器地址,多个 Origin 用逗号分隔,例如 https://newapi.pro,https://newapi.com ,注意不能携带[],需使用https": "Si vide, l'adresse du serveur est utilisée par défaut, plusieurs Origines sont séparées par des virgules, par exemple https://newapi.pro,https://newapi.com, attention ne pas inclure [], utiliser https", "主模型": "Modèle principal", "主页链接填": "Remplir le lien de la page d'accueil", @@ -324,6 +356,8 @@ "产品名称": "Nom du produit", "产品配置": "Configuration du produit", "产品配置错误,请联系管理员": "Erreur de configuration du produit, veuillez contacter l'administrateur", + "享受 8 折": "20% off", + "什么是分组?": "What are groups?", "仅为使用OpenAI格式的Gemini/Vertex渠道填充thoughtSignature": "Remplit thoughtSignature uniquement pour les canaux Gemini/Vertex utilisant le format OpenAI", "仅会覆盖你勾选的字段,未勾选的字段保持本地不变。": "Seuls les champs sélectionnés seront remplacés, les champs non sélectionnés restent inchangés.", "仅供参考,以实际扣费为准": "Pour référence uniquement, la déduction réelle prévaudra", @@ -348,14 +382,19 @@ "今日关闭": "Fermer aujourd'hui", "今日已签到": "Enregistré aujourd'hui", "今日已签到,累计签到": "Enregistré aujourd'hui, total des enregistrements", + "从 0.5 降到 0.3": "reduced from 0.5 to 0.3", + "从剪贴板粘贴配置": "Coller la config", "从官方模型库同步": "Synchroniser depuis la bibliothèque de modèles officielle", "从认证器应用中获取验证码,或使用备用码": "Obtenez le code de vérification à partir de l'application d'authentification ou utilisez un code de secours", "从配置文件同步": "Synchroniser depuis un fichier de configuration", + "从默认列表中去掉一个分组": "Remove a group from the default list", "代理地址": "Adresse du proxy", "代理设置": "Paramètres du proxy", "代码已复制到剪贴板": "Le code a été copié dans le presse-papiers", "令牌": "Jeton", "令牌分组": "Regroupement de jetons", + "令牌分组设为 auto 时,按以下顺序依次尝试选择可用分组,排在前面的优先级更高": "When token group is set to auto, groups are selected in order of priority, with higher priority groups listed first", + "令牌分组设为 auto 时,系统按优先级顺序自动选择一个可用分组。": "When token group is set to auto, the system automatically selects an available group by priority.", "令牌分组,默认为用户的分组": "Groupe de jetons, par défaut le groupe de l'utilisateur", "令牌创建成功,请在列表页面点击复制获取令牌!": "Jeton créé avec succès, veuillez cliquer sur copier sur la page de liste pour obtenir le jeton !", "令牌名称": "Nom du jeton", @@ -368,9 +407,9 @@ "以及": "et", "仪表盘设置": "Tableau de bord", "价格": "Tarifs", - "价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}}": "Price: {{symbol}}{{price}} * {{ratioType}}: {{ratio}}", - "价格:${{price}} * {{ratioType}}:{{ratio}}": "Prix : ${{price}} * {{ratioType}} : {{ratio}}", + "价格摘要": "Résumé des prix", "价格暂时不可用,请稍后重试": "Price temporarily unavailable, please try again later", + "价格模式(默认)": "Mode prix (par défaut)", "价格计算中...": "Calculating price...", "价格计算失败": "Price calculation failed", "价格计算失败: ": "Price calculation failed: ", @@ -378,6 +417,8 @@ "价格设置方式": "Méthode de configuration des prix", "价格重新计算中...": "Recalculating price...", "价格预估": "Price Estimate", + "价格:${{price}} * {{ratioType}}:{{ratio}}": "Prix : ${{price}} * {{ratioType}} : {{ratio}}", + "价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}}": "Price: {{symbol}}{{price}} * {{ratioType}}: {{ratio}}", "任一满足(OR)": "Au moins un (OR)", "任务 ID": "ID de la tâche", "任务ID": "ID de tâche", @@ -400,7 +441,6 @@ "作用域:包含规则名称": "Portée : inclure le nom de la règle", "你似乎并没有修改什么": "Vous ne semblez rien avoir modifié", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "Vous pouvez les ajouter manuellement dans « Noms de modèles personnalisés », cliquer sur Remplir puis soumettre, ou utiliser directement les actions ci-dessous pour les traiter automatiquement.", - "使用 {{name}} 继续": "Continuer avec {{name}}", "使用 Discord 继续": "Continuer avec Discord", "使用 GitHub 继续": "Continuer avec GitHub", "使用 JSON 对象格式,格式为:{\"组名\": [最多请求次数, 最多请求完成次数]}": "Utiliser le format d'objet JSON, au format : {\"nom du groupe\": [nombre maximal de requêtes, nombre maximal d'achèvements de requêtes]}", @@ -409,36 +449,42 @@ "使用 Passkey 实现免密且更安全的登录体验": "Utilisez Passkey pour une expérience de connexion sans mot de passe et plus sécurisée.", "使用 Passkey 登录": "Se connecter avec Passkey", "使用 Passkey 验证": "Vérifier avec Passkey", + "使用 {{name}} 继续": "Continuer avec {{name}}", "使用 微信 继续": "Continuer avec WeChat", "使用 用户名 注册": "S'inscrire avec un nom d'utilisateur", "使用 邮箱或用户名 登录": "Connectez-vous avec votre e-mail ou votre nom d'utilisateur", "使用ID排序": "Trier par ID", + "使用分组": "Using Group", "使用日志": "Journaux", "使用模式": "Mode d'utilisation", "使用统计": "Statistiques d'utilisation", - "使用认证器应用(如 Google Authenticator、Microsoft Authenticator)扫描下方二维码:": "Utilisez une application d'authentification (telle que Google Authenticator, Microsoft Authenticator) pour scanner le code QR ci-dessous :", "使用认证器应用扫描二维码": "Scanner le code QR avec l'application d'authentification", + "使用认证器应用(如 Google Authenticator、Microsoft Authenticator)扫描下方二维码:": "Utilisez une application d'authentification (telle que Google Authenticator, Microsoft Authenticator) pour scanner le code QR ci-dessous :", + "使用说明": "Guide", "例如 /var/cache/new-api": "ex. : /var/cache/new-api", - "例如 €, £, Rp, ₩, ₹...": "Par exemple, €, £, Rp, ₩, ₹...", "例如 https://docs.newapi.pro": "Par exemple, https://docs.newapi.pro", - "例如:": "Par exemple :", + "例如 €, £, Rp, ₩, ₹...": "Par exemple, €, £, Rp, ₩, ₹...", "例如: /bin/bash -c \"python app.py\"": "e.g.: /bin/bash -c \"python app.py\"", "例如: nginx:latest": "e.g.: nginx:latest", "例如: socks5://user:pass@host:port": "par exemple : socks5://user:pass@host:port", + "例如发卡网站的购买链接": "Par exemple, lien d'achat sur un site d'émission de cartes", + "例如(全渠道):": "Exemple (tous les canaux) :", + "例如(指定渠道):": "Exemple (canaux spécifiques) :", + "例如:": "Par exemple :", "例如:-c": "e.g.: -c", "例如:/bin/bash": "e.g.: /bin/bash", "例如:0001": "Par exemple : 0001", "例如:1000": "Par exemple : 1000", "例如:100000": "Ex. : 100000", - "例如:2,就是最低充值2$": "Par exemple : 2, c'est-à-dire un minimum de 2$ de recharge", "例如:2000": "Par exemple : 2000", + "例如:2,就是最低充值2$": "Par exemple : 2, c'est-à-dire un minimum de 2$ de recharge", "例如:4.99": "Ex. : 4.99", "例如:401, 403, 429, 500-599": "ex. : 401, 403, 429, 500-599", "例如:7,就是7元/美金": "Par exemple : 7, c'est-à-dire 7 yuans/dollar", + "例如:GitHub Enterprise": "ex. : GitHub Enterprise", "例如:email": "ex. : email", "例如:example.com": "ex: example.com", "例如:github / si:google / https://example.com/logo.png / 🐱": "ex. : github / si:google / https://example.com/logo.png / 🐱", - "例如:GitHub Enterprise": "ex. : GitHub Enterprise", "例如:github-enterprise": "ex. : github-enterprise", "例如:https://example.com/.well-known/openid-configuration": "ex. : https://example.com/.well-known/openid-configuration", "例如:https://gitea.example.com": "ex. : https://gitea.example.com", @@ -453,9 +499,6 @@ "例如:该请求不满足准入策略": "ex. : Cette requête ne satisfait pas la politique d'admission", "例如:适合轻度使用": "Ex. : Convient à un usage léger", "例如:需要等级 {{required}},你当前等级 {{current}}": "ex. : Niveau requis {{required}}, votre niveau actuel est {{current}}", - "例如(全渠道):": "Exemple (tous les canaux) :", - "例如(指定渠道):": "Exemple (canaux spécifiques) :", - "例如发卡网站的购买链接": "Par exemple, lien d'achat sur un site d'émission de cartes", "供应商": "Fournisseur", "供应商介绍": "Présentation du fournisseur", "供应商信息:": "Informations sur le fournisseur :", @@ -477,11 +520,12 @@ "保存 Turnstile 设置": "Enregistrer les paramètres Turnstile", "保存 WeChat Server 设置": "Enregistrer les paramètres du serveur WeChat", "保存分组倍率设置": "Enregistrer les paramètres de ratio de groupe", + "保存分组相关设置": "Enregistrer les paramètres liés aux groupes", "保存备用码": "Enregistrer les codes de sauvegarde", "保存备用码以备不时之需": "Enregistrez les codes de sauvegarde pour les urgences", "保存失败": "Échec de l'enregistrement", - "保存失败,请重试": "Échec de l'enregistrement, veuillez réessayer", "保存失败:": "Échec de l'enregistrement :", + "保存失败,请重试": "Échec de l'enregistrement, veuillez réessayer", "保存屏蔽词过滤设置": "Enregistrer les paramètres de filtrage des mots sensibles", "保存性能设置": "Enregistrer les paramètres de performance", "保存成功": "Enregistré avec succès", @@ -496,7 +540,9 @@ "保存设置": "Enregistrer les paramètres", "保存通用设置": "Enregistrer les paramètres généraux", "保存邮箱域名白名单设置": "Enregistrer les paramètres de liste blanche des domaines de messagerie", + "保存预览": "Aperçu avant enregistrement", "保存额度设置": "Enregistrer les paramètres de quota", + "保留": "kept", "保留原值(目标已有值时不覆盖)": "Conserver la valeur originale (ne pas écraser si la cible a déjà une valeur)", "保留天数": "Jours à conserver", "保留文件数": "Fichiers à conserver", @@ -513,18 +559,20 @@ "倍率信息": "Informations sur le ratio", "倍率是为了方便换算不同价格的模型": "Le ratio sert à faciliter la conversion de modèles à des prix différents.", "倍率模式": "Mode de ratio", + "倍率用于计费乘数,勾选「用户可选」后用户可在创建令牌时选择该分组": "Ratio is the billing multiplier. Check \"User Selectable\" to let users pick this group when creating tokens", "倍率类型": "Type de ratio", + "假设再加两个分组 default 和 vip,但不勾选用户可选:": "Now add two more groups default and vip, but without checking User Selectable:", "偏好设置": "Préférences", "停止测试": "Arrêter le test", "停止重试": "Arrêter les tentatives", "停用": "Désactiver", "允许 AccountFilter 参数": "Autoriser le paramètre AccountFilter", "允许 HTTP 协议图片请求(适用于自部署代理)": "Autoriser les requêtes d'images via le protocole HTTP (applicable aux proxies auto-déployés)", + "允许 Turnstile 用户校验": "Autoriser la vérification des utilisateurs Turnstile", "允许 inference_geo 透传": "Autoriser la transmission de inference_geo", "允许 safety_identifier 透传": "Autoriser le passage de safety_identifier", "允许 service_tier 透传": "Autoriser le passage de service_tier", "允许 stream_options.include_obfuscation 透传": "Autoriser la transmission de stream_options.include_obfuscation", - "允许 Turnstile 用户校验": "Autoriser la vérification des utilisateurs Turnstile", "允许不安全的 Origin(HTTP)": "Autoriser une origine non sécurisée (HTTP)", "允许回调(会泄露服务器 IP 地址)": "Autoriser le rappel (divulguera l'adresse IP du serveur)", "允许在 Stripe 支付中输入促销码": "Autoriser la saisie de codes promotionnels lors du paiement Stripe", @@ -545,13 +593,13 @@ "允许重试": "Autoriser les tentatives", "元": "CNY", "充值": "Recharger", - "充值价格(x元/美金)": "Prix de recharge (x yuans/dollar)", "充值价格显示": "Prix de recharge", + "充值价格(x元/美金)": "Prix de recharge (x yuans/dollar)", "充值分组倍率": "Ratio de groupe de recharge", "充值分组倍率不是合法的 JSON 字符串": "Le ratio de groupe de recharge n'est pas une chaîne JSON valide", "充值数量": "Quantité de recharge", - "充值数量,最低 ": "Quantité de recharge, minimum ", "充值数量不能小于": "Le montant de la recharge ne peut pas être inférieur à", + "充值数量,最低 ": "Quantité de recharge, minimum ", "充值方式设置": "Méthodes recharge", "充值方式设置不是合法的 JSON 字符串": "Les paramètres de la méthode de recharge ne sont pas une chaîne JSON valide", "充值确认": "Confirmation de la recharge", @@ -567,8 +615,8 @@ "兑换成功!": "Échange réussi !", "兑换码充值": "Recharge par code d'échange", "兑换码创建成功": "Code d'échange créé", - "兑换码创建成功,是否下载兑换码?": "Code d'échange créé avec succès. Voulez-vous le télécharger ?", "兑换码创建成功!": "Code d'échange créé avec succès !", + "兑换码创建成功,是否下载兑换码?": "Code d'échange créé avec succès. Voulez-vous le télécharger ?", "兑换码将以文本文件的形式下载,文件名为兑换码的名称。": "Le code d'échange sera téléchargé sous forme de fichier texte, le nom de fichier étant le nom du code d'échange.", "兑换码更新成功!": "Code d'échange mis à jour avec succès !", "兑换码生成管理": "Génération de codes", @@ -598,15 +646,15 @@ "公告更新失败": "Échec de la mise à jour de l'avis", "公告类型": "Type d'avis", "共": "Total", - "共 {{count}} 个密钥_one": "{{count}} clé au total", "共 {{count}} 个密钥_many": "{{count}} clés au total", + "共 {{count}} 个密钥_one": "{{count}} clé au total", "共 {{count}} 个密钥_other": "{{count}} clés au total", "共 {{count}} 个模型": "{{count}} modèles", - "共 {{count}} 个模型_one": "{{count}} modèle", "共 {{count}} 个模型_many": "{{count}} modèles", + "共 {{count}} 个模型_one": "{{count}} modèle", "共 {{count}} 个模型_other": "{{count}} modèles", - "共 {{count}} 条日志_one": "{{count}} log entry", "共 {{count}} 条日志_many": "{{count}} entrées de journal", + "共 {{count}} 条日志_one": "{{count}} log entry", "共 {{count}} 条日志_other": "{{count}} log entries", "共 {{total}} 项,当前显示 {{start}}-{{end}} 项": "Total {{total}} éléments, affichage actuel {{start}}-{{end}} éléments", "关": "Fermer", @@ -618,8 +666,8 @@ "关闭": "Fermer", "关闭侧边栏": "Fermer la barre latérale", "关闭公告": "Fermer l'avis", - "关闭后,此模型将不会被“同步官方”自动覆盖或创建": "Après fermeture, ce modèle ne sera pas automatiquement remplacé ou créé par \"Synchroniser depuis la bibliothèque de modèles officielle\"", "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?": "Après fermeture, cet avertissement ne sera plus affiché (uniquement pour ce navigateur). Voulez-vous vraiment le fermer ?", + "关闭后,此模型将不会被“同步官方”自动覆盖或创建": "Après fermeture, ce modèle ne sera pas automatiquement remplacé ou créé par \"Synchroniser depuis la bibliothèque de modèles officielle\"", "关闭弹窗,已停止批量测试": "Fermer la fenêtre popup, le test par lots a été arrêté", "关闭提示": "Fermer l’avertissement", "其他": "Autre", @@ -637,17 +685,6 @@ "内置": "Intégré", "内置 Ollama 镜像": "Built-in Ollama Image", "再次输入部署名称": "Enter Deployment Name Again", - "最低": "Le plus bas", - "最低充值美元数量": "Montant minimum de recharge en dollars", - "最后使用时间": "Dernière utilisation", - "最后更新": "Last Updated", - "最后请求": "Dernière requête", - "最大GPU数量": "Max Number of GPUs", - "最大可用": "Max Available", - "最大条目数": "Nombre max. d'entrées", - "最终抵扣": "Déduction finale", - "最近一次": "Dernière", - "最近事件": "Recent Events", "写": "Écriture", "准入策略": "Politique d'admission", "准入策略 JSON(可选)": "Politique d'admission JSON (optionnel)", @@ -656,14 +693,23 @@ "凭证已刷新": "Identifiants actualisés", "分类名称": "Nom de la catégorie", "分组": "Groupe", + "分组JSON设置": "Group JSON Settings", "分组与模型定价设置": "Groupe et tarification", "分组价格": "Prix de groupe", "分组倍率": "Ratio", "分组倍率设置": "Ratio de groupe", "分组倍率设置,可以在此处新增分组或修改现有分组的倍率,格式为 JSON 字符串,例如:{\"vip\": 0.5, \"test\": 1},表示 vip 分组的倍率为 0.5,test 分组的倍率为 1": "Paramètres de ratio de groupe, vous pouvez ajouter de nouveaux groupes ou modifier le ratio des groupes existants ici, au format de chaîne JSON, par exemple : {\"vip\": 0,5, \"test\": 1}, ce qui signifie que le ratio du groupe vip est 0,5 et celui du groupe test est 1", + "分组名": "Group", + "分组名称": "Group Name", + "分组名称到倍率的映射": "Mapping of group names to ratios", + "分组描述": "Group Description", + "分组是用于控制计费倍率和模型访问权限的核心概念。每个用户属于一个分组,每个令牌也可以指定使用某个分组。": "Groups are a core concept for controlling billing ratios and model access. Each user belongs to a group, and each token can be assigned to a specific group.", "分组特殊倍率": "Ratio spécial de groupe", "分组特殊可用分组": "Groupes spéciaux disponibles", + "分组相关设置": "Paramètres liés aux groupes", + "分组管理": "Group Management", "分组设置": "Groupe", + "分组设置使用说明": "Group Settings Guide", "分组速率配置优先级高于全局速率限制。": "La priorité de configuration du taux de groupe est supérieure à la limite de taux globale.", "分组速率限制": "Limitation du taux de groupe", "分钟": "minutes", @@ -678,7 +724,9 @@ "列出的模型将不会自动添加或移除-thinking/-nothinking 后缀": "Les modèles listés ici n'ajouteront ni ne retireront automatiquement le suffixe -thinking/-nothinking.", "列设置": "Colonnes", "创建": "Create", + "创建令牌可选": "Selectable when creating tokens", "创建令牌默认选择auto分组,初始令牌也将设为auto(否则留空,为用户默认分组)": "Lors de la création d'un jeton, le groupe auto est sélectionné par défaut, et le jeton initial sera également défini sur auto (sinon laisser vide, pour le groupe par défaut de l'utilisateur)", + "创建和管理分组": "Create and Manage Groups", "创建失败": "Échec de la création", "创建成功": "Création réussie", "创建或选择密钥时,将 Project 设置为 io.cloud": "When creating or selecting a key, set Project to io.cloud", @@ -690,6 +738,7 @@ "创建新的订阅套餐": "Créer un nouveau plan d'abonnement", "创建新的预填组": "Créer un nouveau groupe pré-rempli", "创建时间": "Heure de création", + "创建渠道所需的基本信息": "Informations de base pour créer un canal", "创建用户": "Créer un utilisateur", "初始化失败,请重试": "Échec de l'initialisation, veuillez réessayer", "初始化系统": "Initialiser le système", @@ -723,13 +772,15 @@ "前往设置": "Go to Settings", "前往设置页面": "Go to Settings Page", "前缀": "Préfixe", - "副本数量": "Number of Replicas", + "前:": "Avant :", "剩余": "Remaining", "剩余备用码:": "Codes de sauvegarde restants : ", "剩余时间": "Remaining Time", "剩余额度": "Quota restant", - "剩余额度/总额度": "Restant/Total", "剩余额度$": "Quota restant $", + "剩余额度/总额度": "Restant/Total", + "剪贴板中未检测到连接信息": "Aucune info de connexion trouvée dans le presse-papiers", + "副本数量": "Number of Replicas", "功能特性": "Fonctionnalités", "加入渠道": "Join Channel", "加入预填组": "Rejoindre un groupe pré-rempli", @@ -750,6 +801,7 @@ "加载详情中...": "Loading details...", "加载账单失败": "Échec du chargement des factures", "加载隐私政策内容失败...": "Échec du chargement du contenu de la politique de confidentialité...", + "勾选后,该分组会出现在用户创建令牌时的下拉菜单中。未勾选的分组只能由管理员分配,用户自己无法选择。": "When checked, this group appears in the dropdown when users create tokens. Unchecked groups can only be assigned by admin.", "包含": "Contient", "包含来自未知或未标明供应商的AI模型,这些模型可能来自小型供应商或开源项目。": "Comprend des modèles d'IA de fournisseurs inconnus ou non marqués, qui peuvent provenir de petits fournisseurs ou de projets open-source.", "包括失败请求的次数,0代表不限制": "Y compris les tentatives de requête échouées, 0 signifie aucune limite", @@ -762,6 +814,7 @@ "单GPU小时费率": "Per GPU Hour Rate", "历史消耗": "Consommation historique", "原价": "Prix original", + "原价,和普通用户一样": "original price, same as regular users", "原因:": "Raison :", "原密码": "Mot de passe original", "原生格式": "Format natif", @@ -796,6 +849,9 @@ "只包括请求成功的次数": "N'inclure que les tentatives de requête réussies", "只支持HTTPS,系统将以POST方式发送通知,请确保地址可以接收POST请求": "Seul HTTPS est pris en charge, le système enverra des notifications via POST, veuillez vous assurer que l'adresse peut recevoir des requêtes POST", "只有当用户设置开启IP记录时,才会进行请求和错误类型日志的IP记录": "Ce n'est que lorsque l'utilisateur définit l'enregistrement IP que l'enregistrement IP des journaux de type requête et erreur sera effectué", + "只有配置了规则的组合才会覆盖,未配置的组合仍使用令牌分组的基础倍率。": "Only configured combinations are overridden. Unconfigured combinations still use the token group's base ratio.", + "可以根据用户分组增减令牌可选的分组范围。例如 vip 用户额外开放 premium 分组,或移除某个分组的选择权。": "Adjust the selectable group range based on user group. E.g., grant vip users access to premium, or remove access to a group.", + "可以根据用户分组设置不同的计费倍率。例如 vip 用户使用 standard 令牌时倍率从 1.0 降为 0.8。": "Set different billing ratios based on user group. E.g., vip users using standard tokens get ratio 0.8 instead of 1.0.", "可信": "Fiable", "可在设置页面设置关于内容,支持 HTML & Markdown": "Le contenu \"À propos\" peut être défini sur la page des paramètres, prenant en charge HTML & Markdown", "可手动填写,多个 scope 用空格分隔": "Peut être rempli manuellement, séparer les scopes par des espaces", @@ -812,14 +868,16 @@ "可视化": "Visualisation", "可视化倍率设置": "Ratio visuel", "可视化编辑": "Édition visuelle", - "可选,公告的补充说明": "Facultatif, informations supplémentaires pour l'avis", - "可选,用于复现结果": "Optionnel, pour des résultats reproductibles", - "可选:基于用户信息 JSON 做组合条件准入,条件不满足时返回自定义提示": "Optionnel : Admission basée sur des conditions combinées à partir du JSON des informations utilisateur ; renvoie un message personnalisé lorsque les conditions ne sont pas remplies", - "可选:用于自动生成端点或 Discovery URL": "Optionnel : Utilisé pour générer automatiquement les points de terminaison ou l'URL de découverte", "可选。匹配入口请求的 User-Agent;任意一行作为子串匹配(忽略大小写)即命中。": "Optionnel. Correspondance du User-Agent de la requête entrante ; toute ligne correspondant comme sous-chaîne (insensible à la casse) est considérée comme un hit.", "可选。对提取到的亲和 Key 做正则校验;不填表示不校验。": "Optionnel. Validation regex de la clé d'affinité extraite ; laisser vide pour ignorer la validation.", "可选。对请求路径进行匹配;不填表示匹配所有路径。": "Optionnel. Correspondance du chemin de la requête ; laisser vide pour correspondre à tous les chemins.", "可选值": "Valeur facultative", + "可选,公告的补充说明": "Facultatif, informations supplémentaires pour l'avis", + "可选,用于复现结果": "Optionnel, pour des résultats reproductibles", + "可选:基于用户信息 JSON 做组合条件准入,条件不满足时返回自定义提示": "Optionnel : Admission basée sur des conditions combinées à partir du JSON des informations utilisateur ; renvoie un message personnalisé lorsque les conditions ne sont pas remplies", + "可选:用于自动生成端点或 Discovery URL": "Optionnel : Utilisé pour générer automatiquement les points de terminaison ou l'URL de découverte", + "合计:{{total}}": "Total : {{total}}", + "合计:文字部分 {{textTotal}} + 音频部分 {{audioTotal}} = {{total}}": "Total : partie texte {{textTotal}} + partie audio {{audioTotal}} = {{total}}", "同时重置消息": "Réinitialiser également les messages", "同步": "Synchroniser", "同步到渠道": "Sync to Channel", @@ -834,8 +892,12 @@ "名称+密钥": "Nom + clé", "名称不能为空": "Le nom ne peut pas être vide", "名称匹配类型": "Type de correspondance de nom", + "后端固定倍率:{{ratio}}。该字段仅展示换算后的价格。": "Ratio fixé par le backend : {{ratio}}. Ce champ affiche uniquement le prix converti.", "后端请求失败": "Échec de la requête du backend", "后缀": "Suffixe", + "后:": "Apres :", + "向右展开": "Développer à droite", + "向左展开": "Développer à gauche", "否": "Non", "启动": "Start", "启动参数 (Args)": "Startup Args", @@ -846,10 +908,10 @@ "启动部署失败": "Failed to start deployment", "启动配置": "Startup Configuration", "启用": "Activer", + "启用 Prompt 检查": "Activer la vérification de l'invite", "启用 io.net 部署": "Enable io.net Deployment", "启用 io.net 部署开关": "Enable io.net Deployment Switch", "启用 io.net 部署时必须填写 API Key": "API Key is required when enabling io.net deployment", - "启用 Prompt 检查": "Activer la vérification de l'invite", "启用2FA失败": "Échec de l'activation de 2FA", "启用Claude思考适配(-thinking后缀)": "Activer l'adaptation de la pensée Claude (suffixe -thinking)", "启用FunctionCall思维签名填充": "Activer le remplissage de thoughtSignature pour FunctionCall", @@ -905,14 +967,22 @@ "图标使用 react-icons(Simple Icons)或 URL/emoji,例如:github、gitlab、si:google": "L'icône utilise react-icons (Simple Icons) ou URL/emoji, ex. : github, gitlab, si:google", "图标使用@lobehub/icons库,如:OpenAI、Claude.Color,支持链式参数:OpenAI.Avatar.type={'platform'}、OpenRouter.Avatar.shape={'square'},查询所有可用图标请 ": "L'icône utilise la bibliothèque @lobehub/icons, telle que : OpenAI, Claude.Color, prend en charge les paramètres de chaîne : OpenAI.Avatar.type={'platform'}, OpenRouter.Avatar.shape={'square'}, interroger toutes les icônes disponibles s'il vous plaît ", "图混合": "Mélanger", + "图片倍率 {{imageRatio}}": "Ratio d'image {{imageRatio}}", "图片功能在自定义请求体模式下不可用": "La fonction image n'est pas disponible en mode requête personnalisée", "图片地址": "URL de l'image", "图片已添加": "Image ajoutée", "图片生成调用:{{symbol}}{{price}} / 1次": "Appel de génération d'image : {{symbol}}{{price}} / 1 fois", + "图片生成:1 次 * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Génération d'image : 1 appel * prix unitaire {{price}} * {{ratioType}} {{ratio}} = {{amount}}", + "图片输入 {{price}} / 1M tokens": "Entrée image {{price}} / 1M tokens", "图片输入: {{imageRatio}}": "Entrée d'image : {{imageRatio}}", + "图片输入价格": "Prix d'entrée image", + "图片输入价格 {{symbol}}{{price}} / 1M tokens": "Prix d'entrée image {{symbol}}{{price}} / 1M tokens", "图片输入价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (图片倍率: {{imageRatio}})": "Prix d'entrée d'image : {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (ratio d'image : {{imageRatio}})", + "图片输入价格:{{symbol}}{{price}} / 1M tokens": "Prix d'entrée image : {{symbol}}{{price}} / 1M tokens", + "图片输入价格:{{symbol}}{{total}} / 1M tokens": "Prix d'entrée image : {{symbol}}{{total}} / 1M tokens", "图片输入倍率(仅部分模型支持该计费)": "Ratio d'entrée d'image (seulement certains modèles prennent en charge cette facturation)", "图片输入相关的倍率设置,键为模型名称,值为倍率,仅部分模型支持该计费": "Paramètres de ratio liés à l'entrée d'image, la clé est le nom du modèle, la valeur est le ratio, seulement certains modèles prennent en charge cette facturation", + "图片输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 图片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Entrée d'image : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * ratio d'image {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "图生文": "Décrire", "图生视频": "Générer une vidéo à partir d'une image", "在Gotify服务器创建应用后获得的令牌,用于发送通知": "Jeton obtenu après la création d'une application sur le serveur Gotify, utilisé pour envoyer des notifications", @@ -928,20 +998,27 @@ "在此输入系统名称": "Saisissez le nom du système ici", "在此输入隐私政策内容,支持 Markdown & HTML 代码": "Saisissez le contenu de la politique de confidentialité ici, prend en charge le code Markdown & HTML", "在此输入首页内容,支持 Markdown & HTML 代码,设置后首页的状态信息将不再显示。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为首页": "Saisissez le contenu de la page d'accueil ici, prend en charge Markdown & HTML. Après configuration, les informations d'état de la page d'accueil ne seront plus affichées. Si un lien est saisi, il sera utilisé comme attribut src de l'iframe, ce qui vous permet de définir n'importe quelle page web comme page d'accueil", + "在默认列表基础上新增一个分组": "Add a new group to the default list", + "场景:站点提供两个价格档位,用户可以按需选择": "Scenario: site offers two pricing tiers, users can choose as needed", + "场景:站点有 standard 和 premium 两个用户可选分组。希望 vip 用户额外看到 exclusive 分组,同时不再看到 standard 分组": "Scenario: site has standard and premium as selectable groups. Want vip users to see exclusive but not standard", + "场景:站点有 standard(倍率 1.0)和 premium(倍率 0.5)两个分组,希望 vip 用户使用 standard 令牌时也能享受折扣": "Scenario: site has standard (ratio 1.0) and premium (ratio 0.5). Want vip users to get a discount on standard tokens too", + "场景:设置自动选择优先级": "Scenario: set auto-selection priority", "域名IP过滤详细说明": "Recommandé : lorsqu'il est activé, les domaines sont résolus par DNS et les IP résultantes sont vérifiées par rapport aux plages d'adresses privées, ce qui empêche efficacement les attaques de DNS rebinding qui contournent la protection SSRF. Remarque : un domaine peut se résoudre en plusieurs adresses IPv4/IPv6. Si vous avez configuré une liste de filtres IP, assurez-vous qu'elle couvre ces adresses, sinon l'accès peut échouer.", "域名白名单": "Liste blanche de domaines", "域名黑名单": "Liste noire de domaines", "基本信息": "Informations de base", + "基础价格": "Prix de base", + "基础用户": "Basic user", "填充 Codex CLI / Claude CLI 模版": "Remplir le modèle Codex CLI / Claude CLI", "填充新模板": "Remplir le nouveau modèle", "填充旧模板": "Remplir l'ancien modèle", "填充模板": "Remplir le modèle", + "填充模板(全渠道)": "Remplir le modèle (tous les canaux)", + "填充模板(指定渠道)": "Remplir le modèle (canaux sélectionnés)", "填充模板:等级+激活": "Remplir le modèle : Niveau + Activation", "填充模板:等级提示": "Remplir le modèle : Invite de niveau", "填充模板:组织或角色": "Remplir le modèle : Organisation ou rôle", "填充模板:组织提示": "Remplir le modèle : Invite d'organisation", - "填充模板(全渠道)": "Remplir le modèle (tous les canaux)", - "填充模板(指定渠道)": "Remplir le modèle (canaux sélectionnés)", "填入": "Remplir", "填入 CC Switch": "Remplir CC Switch", "填入所有模型": "Remplir tous les modèles", @@ -958,6 +1035,7 @@ "填写带https的域名,逗号分隔": "Saisir les domaines avec https, séparés par des virgules", "填写用户协议内容后,用户注册时将被要求勾选已阅读用户协议": "Après avoir rempli le contenu de l'accord utilisateur, les utilisateurs devront cocher avoir lu l'accord utilisateur lors de l'inscription", "填写隐私政策内容后,用户注册时将被要求勾选已阅读隐私政策": "Après avoir rempli le contenu de la politique de confidentialité, les utilisateurs devront cocher avoir lu la politique de confidentialité lors de l'inscription", + "填写音频补全价格前,需要先填写音频输入价格。": "Renseignez d'abord le prix d'entrée audio avant de définir le prix de complétion audio.", "处理中": "Processing", "备份支持": "Prise en charge de la sauvegarde", "备份状态": "État de la sauvegarde", @@ -973,6 +1051,7 @@ "复制失败": "Échec de la copie", "复制失败,请手动复制": "Échec de la copie, veuillez copier manuellement", "复制失败,请手动选择文本复制": "Copy failed, please manually select and copy the text", + "复制密钥": "Copier la clé", "复制已选": "Copier la sélection", "复制应用的令牌(Token)并填写到上方的应用令牌字段": "Copier le jeton de l'application et le remplir dans le champ de jeton d'application ci-dessus", "复制成功": "Copié avec succès", @@ -985,6 +1064,7 @@ "复制渠道的所有信息": "Copier toutes les informations d'un canal", "复制版本号": "Copy Version", "复制生成的密钥并粘贴到此处": "Copy the generated key and paste it here", + "复制连接信息": "Copier les infos de connexion", "复制链接": "Copier le lien", "外接设备": "Périphériques externes", "多个命令用空格分隔": "Multiple commands separated by spaces", @@ -998,7 +1078,6 @@ "失败原因": "Raison de l'échec", "失败后不重试": "Pas de nouvelle tentative après échec", "失败后是否重试": "Réessayer après échec", - "不重试": "Ne pas réessayer", "失败时自动禁用通道": "Désactiver automatiquement le canal en cas d'échec", "失败重试次数": "Nombre de tentatives en cas d'échec", "奖励说明": "Description de la récompense", @@ -1008,13 +1087,13 @@ "套餐标题": "Titre du plan", "套餐标题不能为空": "Le titre du forfait ne peut pas être vide", "套餐的基本信息和定价": "Informations de base et tarification du plan", - "如:大带宽批量分析图片推荐": "par exemple, Recommandations d'analyse d'images par lots à large bande passante", - "如:香港线路": "par exemple, Ligne de Hong Kong", "如果亲和到的渠道失败,重试到其他渠道成功后,将亲和更新到成功的渠道。": "Si le canal d'affinité échoue, après une nouvelle tentative réussie sur un autre canal, l'affinité sera mise à jour vers le canal réussi.", "如果你对接的是上游One API或者New API等转发项目,请使用OpenAI类型,不要使用此类型,除非你知道你在做什么。": "Si vous vous connectez à des projets de redirection One API ou New API en amont, veuillez utiliser le type OpenAI. N'utilisez pas ce type, sauf si vous savez ce que vous faites.", "如果用户请求中包含系统提示词,则使用此设置拼接到用户的系统提示词前面": "Si la requête de l'utilisateur contient un prompt système, utilisez ce paramètre pour le concaténer avant le prompt système de l'utilisateur", "如果镜像为私有,请填写密码或Token": "If the image is private, please fill in the password or token", "如果镜像为私有,请填写用户名": "If the image is private, please fill in the username", + "如:大带宽批量分析图片推荐": "par exemple, Recommandations d'analyse d'images par lots à large bande passante", + "如:香港线路": "par exemple, Ligne de Hong Kong", "始终使用浅色主题": "Toujours utiliser le thème clair", "始终使用深色主题": "Toujours utiliser le thème sombre", "字段映射": "Mapping des champs", @@ -1023,6 +1102,7 @@ "字段透传控制": "Contrôle du passage des champs", "字段速查": "Référence rapide des champs", "存在惩罚,鼓励讨论新话题": "Pénalité de présence, encourage de nouveaux sujets", + "存在重复的分组名称:": "Duplicate group names: ", "存在重复的键名:": "Il existe des noms de clés en double :", "安全提醒": "Rappel de sécurité", "安全设置": "Sécurité", @@ -1034,6 +1114,7 @@ "完成硬件类型、部署位置、副本数量等配置后,将自动计算价格": "Price will be automatically calculated after completing hardware type, deployment location, number of replicas and other configurations", "完成设置并启用两步验证": "Terminer la configuration et activer l'authentification à deux facteurs", "完成进度": "Completion Progress", + "完整流程:": "Full workflow:", "完整的 Base URL,支持变量{model}": "URL de base complète, prend en charge la variable {model}", "官方": "Officiel", "官方文档": "Documentation officielle", @@ -1046,6 +1127,7 @@ "实付金额": "Montant du paiement réel", "实付金额:": "Montant du paiement réel : ", "实际模型": "Modèle réel", + "实际结算金额:{{symbol}}{{total}}(已包含分组价格调整)": "Montant facturé réel : {{symbol}}{{total}} (ajustement tarifaire de groupe inclus)", "实际请求体": "Corps de requête réel", "容器": "Container", "容器ID": "Container ID", @@ -1079,7 +1161,6 @@ "密钥": "Clé API", "密钥 JSON 必须包含 access_token": "Le JSON de la clé doit inclure access_token", "密钥 JSON 必须包含 account_id": "Le JSON de la clé doit inclure account_id", - "密钥(编辑模式下,保存的密钥不会显示)": "Clé (en mode édition, les clés enregistrées ne sont pas affichées)", "密钥去重": "Suppression des doublons de clés", "密钥将以Bearer方式添加到请求头中,用于验证webhook请求的合法性": "La clé sera ajoutée à l'en-tête de la requête en tant que Bearer pour vérifier la légitimité de la requête webhook", "密钥已删除": "La clé a été supprimée", @@ -1097,10 +1178,12 @@ "密钥获取成功": "Acquisition de la clé réussie", "密钥输入方式": "Méthode de saisie de la clé", "密钥预览": "Aperçu de la clé", + "密钥(编辑模式下,保存的密钥不会显示)": "Clé (en mode édition, les clés enregistrées ne sont pas affichées)", "对于官方渠道,new-api已经内置地址,除非是第三方代理站点或者Azure的特殊接入地址,否则不需要填写": "Pour les canaux officiels, le new-api a une adresse intégrée. Sauf s'il s'agit d'un site proxy tiers ou d'une adresse d'accès Azure spéciale, il n'est pas nécessaire de la remplir", "对免费模型启用预消耗": "Activer la préconsommation pour les modèles gratuits", "对域名启用 IP 过滤(推荐开启)": "Activer le filtrage IP pour les domaines (recommandé)", "对外运营模式": "Mode par défaut", + "对比:不勾选「用户可选」的场景": "Comparison: groups without \"User Selectable\"", "对象清理规则": "Règles de nettoyage d'objets", "导入": "Importer", "导入的配置将覆盖当前设置,是否继续?": "La configuration importée remplacera les paramètres actuels. Continuer ?", @@ -1119,6 +1202,7 @@ "将删除所有仍在内存中的渠道亲和性缓存条目。": "Ceci supprimera toutes les entrées de cache d'affinité de canal encore en mémoire.", "将只保留最近 {{value}} 个日志文件,其余将被删除。": "Seuls les {{value}} derniers fichiers journaux seront conservés ; le reste sera supprimé.", "将大请求体临时存储到磁盘": "Stocker temporairement les grands corps de requête sur le disque", + "将把当前编辑中的模型 {{name}} 的价格配置,批量应用到已勾选的 {{count}} 个模型。": "La configuration tarifaire du modèle actuellement édité {{name}} sera appliquée aux {{count}} modèles sélectionnés.", "将清除所有保存的配置并恢复默认设置,此操作不可撤销。是否继续?": "Effacera toutes les configurations enregistrées et rétablira les paramètres par défaut. Cette opération ne peut pas être annulée. Continuer ?", "将清除选定时间之前的所有日志": "Effacera tous les journaux avant l'heure sélectionnée", "将追加 2 条规则到现有规则列表。": "2 règles seront ajoutées à la liste de règles existante.", @@ -1131,11 +1215,12 @@ "展开": "Développer", "展开更多": "Développer plus", "展示价格": "Prix affiché", + "嵌套映射:用户分组 → 使用分组 → 倍率": "Nested mapping: user group → using group → ratio", "左侧边栏个人设置": "Paramètres personnels de la barre latérale gauche", - "已为 {{count}} 个模型设置{{type}}_one": "{{type}} défini pour {{count}} modèle", - "已为 {{count}} 个模型设置{{type}}_many": "{{type}} défini pour {{count}} modèles", - "已为 {{count}} 个模型设置{{type}}_other": "{{type}} défini pour {{count}} modèles", "已为 ${count} 个渠道设置标签!": "Étiquettes définies pour ${count} canaux !", + "已为 {{count}} 个模型设置{{type}}_many": "{{type}} défini pour {{count}} modèles", + "已为 {{count}} 个模型设置{{type}}_one": "{{type}} défini pour {{count}} modèle", + "已为 {{count}} 个模型设置{{type}}_other": "{{type}} défini pour {{count}} modèles", "已从 Discovery 自动填充配置": "Configuration remplie automatiquement depuis Discovery", "已从 Discovery 获取配置,可继续手动修改所有字段。": "Configuration récupérée depuis Discovery. Vous pouvez continuer à modifier manuellement tous les champs.", "已作废": "Invalidé", @@ -1150,16 +1235,18 @@ "已切换至最优倍率视图,每个模型使用其最低倍率分组": "Passé à la vue de ratio optimal, chaque modèle utilise son groupe de ratio le plus bas", "已初始化": "Initialisé", "已删除": "Supprimé", - "已删除 {{count}} 个令牌!": "Supprimé {{count}} jetons !", - "已删除 {{count}} 个令牌!_one": "Supprimé {{count}} jeton !", - "已删除 {{count}} 个令牌!_many": "Supprimé {{count}} jetons !", - "已删除 {{count}} 个令牌!_other": "Supprimé {{count}} jetons !", - "已删除 {{count}} 条失效兑换码_one": "{{count}} code d'échange invalide supprimé", - "已删除 {{count}} 条失效兑换码_many": "{{count}} codes d'échange invalides supprimés", - "已删除 {{count}} 条失效兑换码_other": "{{count}} codes d'échange invalides supprimés", "已删除 ${data} 个通道!": "${data} canaux supprimés !", + "已删除 {{count}} 个令牌!": "Supprimé {{count}} jetons !", + "已删除 {{count}} 个令牌!_many": "Supprimé {{count}} jetons !", + "已删除 {{count}} 个令牌!_one": "Supprimé {{count}} jeton !", + "已删除 {{count}} 个令牌!_other": "Supprimé {{count}} jetons !", + "已删除 {{count}} 条失效兑换码_many": "{{count}} codes d'échange invalides supprimés", + "已删除 {{count}} 条失效兑换码_one": "{{count}} code d'échange invalide supprimé", + "已删除 {{count}} 条失效兑换码_other": "{{count}} codes d'échange invalides supprimés", "已删除所有禁用渠道,共计 ${data} 个": "Tous les canaux désactivés ont été supprimés, au total ${data}", "已删除消息及其回复": "Message et ses réponses supprimés", + "已勾选": "Sélectionné", + "已勾选 {{count}} 个模型": "{{count}} modèles sélectionnés", "已发起支付": "Paiement initié", "已发送到 Fluent": "Envoyé à Fluent", "已取消 Passkey 注册": "Enregistrement du Passkey annulé", @@ -1175,8 +1262,6 @@ "已复制": "Copié", "已复制 ${count} 个模型": "${count} modèles copiés", "已复制 ID 到剪贴板": "ID copied to clipboard", - "已复制:": "Copié :", - "已复制:{{name}}": "Copié : {{name}}", "已复制全部数据": "Toutes les données copiées", "已复制到剪切板": "Copié dans le presse-papiers", "已复制到剪贴板": "Copié dans le presse-papiers", @@ -1185,15 +1270,18 @@ "已复制模型名称": "Nom du modèle copié", "已复制版本号": "Version copied", "已复制自动生成的 API Key": "Auto-generated API Key copied", + "已复制:": "Copié :", + "已复制:{{name}}": "Copié : {{name}}", "已完成": "Completed", + "已将模型 {{name}} 的价格配置批量应用到 {{count}} 个模型": "La configuration tarifaire du modèle {{name}} a été appliquée à {{count}} modèles en lot", "已开启全局请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "La transmission globale des requêtes est activée. Les fonctionnalités intégrées de NewAPI (surcharge des paramètres, redirection de modèle, adaptation du canal, etc.) seront désactivées. Ce n'est pas une bonne pratique. Si cela cause des problèmes, merci de ne pas ouvrir d'issue.", "已成功开始测试所有已启用通道,请刷新页面查看结果。": "Le test de tous les canaux activés a démarré avec succès. Veuillez actualiser la page pour voir les résultats.", "已打开授权页面": "Page d'autorisation ouverte", "已打开支付页面": "Page de paiement ouverte", "已提交": "Soumis", "已支付金额": "Amount Paid", - "已新增 {{count}} 个模型:{{list}}_one": "{{count}} nouveau modèle ajouté : {{list}}", "已新增 {{count}} 个模型:{{list}}_many": "{{count}} nouveaux modèles ajoutés : {{list}}", + "已新增 {{count}} 个模型:{{list}}_one": "{{count}} nouveau modèle ajouté : {{list}}", "已新增 {{count}} 个模型:{{list}}_other": "{{count}} nouveaux modèles ajoutés : {{list}}", "已更新完毕所有已启用通道余额!": "Le quota de tous les canaux activés a été mis à jour !", "已有保存的配置": "Configuration enregistrée existante", @@ -1203,13 +1291,13 @@ "已服务": "Served", "已注销": "Déconnecté", "已添加": "Ajouté", - "已添加 {{count}} 个模板_one": "{{count}} modèle ajouté", "已添加 {{count}} 个模板_many": "{{count}} modèles ajoutés", + "已添加 {{count}} 个模板_one": "{{count}} modèle ajouté", "已添加 {{count}} 个模板_other": "{{count}} modèles ajoutés", "已添加到白名单": "Ajouté à la liste blanche", + "已清理 {{count}} 个日志文件,释放 {{size}}": "{{count}} fichiers journaux nettoyés, {{size}} libérés", "已清空": "Vidé", "已清空测试结果": "Résultats de test effacés", - "已清理 {{count}} 个日志文件,释放 {{size}}": "{{count}} fichiers journaux nettoyés, {{size}} libérés", "已生成授权凭据": "Identifiants d'autorisation générés", "已用": "Used", "已用/剩余": "Utilisé/Restant", @@ -1226,11 +1314,11 @@ "已达到购买上限": "Limite d'achat atteinte", "已过期": "Expiré", "已运行时间": "Uptime", - "已选择 {{count}} 个模型_one": "{{count}} modèle sélectionné", + "已选择 ${count} 个渠道": "${count} canaux sélectionnés", "已选择 {{count}} 个模型_many": "{{count}} modèles sélectionnés", + "已选择 {{count}} 个模型_one": "{{count}} modèle sélectionné", "已选择 {{count}} 个模型_other": "{{count}} modèles sélectionnés", "已选择 {{selected}} / {{total}}": "{{selected}} / {{total}} sélectionnés", - "已选择 ${count} 个渠道": "${count} canaux sélectionnés", "已重置为默认配置": "Réinitialisé à la configuration par défaut", "已销毁": "Destroyed", "币种": "Devise", @@ -1252,15 +1340,19 @@ "延长容器时长将会产生额外费用,请确认您有足够的账户余额。": "Extending container duration will incur additional charges, please ensure you have sufficient account balance.", "延长操作一旦确认无法撤销,费用将立即扣除。": "Once confirmed, the extension operation cannot be undone, and charges will be deducted immediately.", "延长时长": "Extension Duration", - "延长时长(小时)": "Extension Duration (hours)", "延长时长不能超过720小时(30天)": "Extension duration cannot exceed 720 hours (30 days)", "延长时长失败": "Failed to extend duration", "延长时长至少为1小时": "Extension duration must be at least 1 hour", + "延长时长(小时)": "Extension Duration (hours)", "建立连接时发生错误": "Erreur lors de l'établissement de la connexion", "建议在生产环境中使用 MySQL 或 PostgreSQL 数据库,或确保 SQLite 数据库文件已映射到宿主机的持久化存储。": "Il est recommandé d'utiliser les bases de données MySQL ou PostgreSQL dans les environnements de production, ou de s'assurer que le fichier de base de données SQLite est mappé sur le stockage persistant de la machine hôte.", "开": "Ouvert", + "开启「默认使用 auto 分组」后,新建令牌和初始令牌都会自动设为 auto。": "After enabling \"Default to auto group\", new tokens and initial tokens will be set to auto.", "开启之后会清除用户提示词中的": "Après l'activation, l'invite de l'utilisateur sera effacée", "开启之后将上游地址替换为服务器地址": "Après l'activation, l'adresse en amont sera remplacée par l'adresse du serveur", + "开启后不限制:必须设置模型倍率": "Après l'activation, aucune limite : le ratio de modèle doit être défini", + "开启后创建令牌默认选择auto分组,初始令牌也将设为auto": "When enabled, new tokens default to auto group, initial tokens are also set to auto", + "开启后未登录用户无法访问模型广场": "Lorsqu'il est activé, les utilisateurs non authentifiés ne peuvent pas accéder à la place du marché des modèles", "开启后,using_group 会参与 cache key(不同分组隔离)。": "Une fois activé, using_group fera partie de la clé de cache (isolation par groupe).", "开启后,仅\"消费\"和\"错误\"日志将记录您的客户端IP地址": "Après l'activation, seuls les journaux \"consommation\" et \"erreur\" enregistreront votre adresse IP client", "开启后,对免费模型(倍率为0,或者价格为0)的模型也会预消耗额度": "Après activation, les modèles gratuits (ratio 0 ou prix 0) préconsommeront également du quota", @@ -1271,8 +1363,6 @@ "开启后,规则名称会参与 cache key(不同规则隔离)。": "Une fois activé, le nom de la règle fera partie de la clé de cache (isolation par règle).", "开启后,该渠道请求 Claude 时将强制追加 ?beta=true(无需客户端手动传参)": "Une fois activé, les requêtes à Claude via ce canal ajouteront automatiquement ?beta=true (pas besoin de le passer manuellement côté client)", "开启后,违规请求将额外扣费。": "Lorsqu'il est activé, les requêtes en violation entraîneront des frais supplémentaires.", - "开启后不限制:必须设置模型倍率": "Après l'activation, aucune limite : le ratio de modèle doit être défini", - "开启后未登录用户无法访问模型广场": "Lorsqu'il est activé, les utilisateurs non authentifiés ne peuvent pas accéder à la place du marché des modèles", "开启批量操作": "Activer la sélection par lots", "开始": "Début", "开始同步": "Démarrer la synchronisation", @@ -1286,6 +1376,7 @@ "强制要求": "Exigence obligatoire", "强变换": "Forte variation", "当上游通道返回错误中包含这些关键词时(不区分大小写),自动禁用通道": "Lorsque le canal en amont renvoie une erreur contenant ces mots-clés (insensible à la casse), désactivez automatiquement le canal", + "当令牌分组设为 auto 时,系统按列表顺序依次选择可用分组。排在前面的优先级更高。": "When token group is set to auto, the system selects groups in list order. Groups listed first have higher priority.", "当前 API 密钥已过期,请在设置中更新。": "Current API key has expired, please update it in settings.", "当前 Ollama 版本为 ${version}": "Current Ollama version is ${version}", "当前仅 OpenAI / Claude 语义支持缓存 token 统计,其他通道将隐藏 token 相关字段。": "Actuellement, seules les sémantiques OpenAI / Claude prennent en charge les statistiques de tokens en cache. Les autres canaux masqueront les champs liés aux tokens.", @@ -1295,15 +1386,21 @@ "当前分组为 auto,会自动选择最优分组,当一个组不可用时自动降级到下一个组(熔断机制)": "Le groupe actuel est auto, il sélectionnera automatiquement le groupe optimal et passera automatiquement au groupe suivant lorsqu'un groupe n'est pas disponible (mécanisme de disjoncteur)", "当前剩余": "Currently Remaining", "当前参数覆盖不是合法的 JSON": "Le remplacement de paramètres actuel n'est pas un JSON valide", + "当前提示": "Informations actuelles", "当前旧格式 JSON 不合法,无法追加模板": "Le JSON de l'ancien format actuel est invalide, impossible d'ajouter le modèle", "当前旧格式不是 JSON 对象,无法追加模板": "L'ancien format actuel n'est pas un objet JSON, impossible d'ajouter le modèle", "当前时间": "Heure actuelle", + "当前未启用,需要时再打开即可。": "Ce champ est actuellement désactivé. Activez-le si nécessaire.", "当前未开启Midjourney回调,部分项目可能无法获得绘图结果,可在运营设置中开启。": "Le rappel Midjourney actuel n'est pas activé, certains projets peuvent ne pas être en mesure d'obtenir des résultats de dessin, qui peuvent être activés dans les paramètres de fonctionnement.", "当前查看的分组为:{{group}},倍率为:{{ratio}}": "Groupe actuel : {{group}}, ratio : {{ratio}}", "当前模型列表为该标签下所有渠道模型列表最长的一个,并非所有渠道的并集,请注意可能导致某些渠道模型丢失。": "La liste de modèles actuelle est la plus longue liste de modèles de canal sous cette étiquette, pas l'union de tous les canaux. Veuillez noter que cela peut entraîner la perte de certains modèles de canal.", + "当前模型同时存在按次价格和倍率配置,保存时会按当前计费方式覆盖。": "Ce modèle possède actuellement à la fois une tarification par requête et une configuration par ratio. L'enregistrement écrasera selon le mode de facturation actuel.", + "当前模型存在未显式设置输入倍率的扩展倍率;填写输入价格后会自动换算为价格字段。": "Ce modèle contient des ratios étendus sans ratio d'entrée explicite. Après saisie du prix d'entrée, ils seront convertis automatiquement en champs de prix.", + "当前没有未设置定价的模型": "Il n'y a actuellement aucun modèle sans prix", "当前版本": "Version actuelle", "当前状态": "Current Status", "当前缓存大小": "Taille actuelle du cache", + "当前编辑": "En cours d'édition", "当前规则不支持写入到该位置": "La règle actuelle ne prend pas en charge l'écriture à cet emplacement", "当前规则未设置参数覆盖模板": "La règle actuelle n'a pas de modèle de remplacement de paramètres défini", "当前计费": "Facturation actuelle", @@ -1311,6 +1408,7 @@ "当前设置类型: ": "Type de paramètre actuel : ", "当前跟随系统": "Suit actuellement le système", "当前配置无法连接到 io.net。": "Unable to connect to io.net with current configuration.", + "当某个分组的用户使用另一个分组的令牌时,可设置特殊倍率覆盖基础倍率。例如:vip 分组的用户使用 default 分组时倍率为 0.5": "When a user in one group uses a token from another group, a special ratio can override the base ratio. E.g., vip users using default group get ratio 0.5", "当模型没有设置价格时仍接受调用,仅当您信任该网站时使用,可能会产生高额费用": "Acceptez les appels même si le modèle n'a pas de prix défini, utilisez uniquement lorsque vous faites confiance au site Web, ce qui peut entraîner des coûts élevés", "当运行通道全部测试时,超过此时间将自动禁用通道": "Lors de l'exécution de tous les tests de canaux, le canal sera automatiquement désactivé lorsque ce temps sera dépassé", "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知": "Lorsque le quota restant du portefeuille ou de l'abonnement est inférieur à cette valeur, le système enverra une notification via la méthode sélectionnée", @@ -1327,6 +1425,7 @@ "忘记密码?": "Mot de passe oublié ?", "快速开始": "Démarrage rapide", "快速选择": "Quick Select", + "忽略": "Ignorer", "思考中...": "Réflexion en cours...", "思考内容转换": "Conversion du contenu de la pensée", "思考过程": "Processus de réflexion", @@ -1366,6 +1465,7 @@ "或手动输入密钥:": "Ou saisissez manuellement le secret :", "所有上游数据均可信": "Toutes les données en amont sont fiables", "所有密钥已复制到剪贴板": "Toutes les clés ont été copiées dans le presse-papiers", + "所有用户": "All users", "所有编辑均为覆盖操作,留空则不更改": "Toutes les modifications sont des opérations de remplacement, laisser vide ne changera rien", "所选模板已存在": "Le modèle sélectionné existe déjà", "手动禁用": "Désactivé manuellement", @@ -1377,6 +1477,7 @@ "扣费": "Déduction", "执行 GC": "Exécuter le GC", "执行中": "En cours", + "扩展价格": "Prix supplémentaires", "扫描二维码": "Scanner le code QR", "批量创建": "Création par lots", "批量创建时会在名称后自动添加随机后缀": "Lors de la création par lots, un suffixe aléatoire sera automatiquement ajouté au nom", @@ -1386,6 +1487,7 @@ "批量删除失败": "Échec de la suppression par lots", "批量删除成功": "Batch deletion successful", "批量删除模型": "Supprimer les modèles par lots", + "批量应用当前模型价格": "Appliquer en lot le prix du modèle actuel", "批量操作": "Opérations par lots", "批量操作失败": "Batch operation failed", "批量操作完成: {{success}}个成功, {{failed}}个失败": "Batch operation completed: {{success}} succeeded, {{failed}} failed", @@ -1409,13 +1511,17 @@ "按倍率类型筛选": "Filtrer par type de ratio", "按倍率设置": "Définir par ratio", "按次": "Par requête", + "按次 {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Par requête {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "按次计费": "Paiement par requête", + "按次:{{symbol}}{{price}}": "Par requête : {{symbol}}{{price}}", + "按次:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "Par requête : {{symbol}}{{price}} * {{ratioType}} : {{ratio}} = {{symbol}}{{total}}", "按照如下格式输入:AccessKey|SecretAccessKey|Region": "Entrez au format : AccessKey|SecretAccessKey|Region", "按量计费": "Paiement à l'utilisation", + "按量计费下需要先填写输入价格,才能保存其它价格项。": "En facturation au volume, il faut d'abord renseigner le prix d'entrée avant d'enregistrer les autres prix.", "按顺序替换content中的变量占位符": "Remplacer les espaces réservés de variable dans le contenu dans l'ordre", "换脸": "Remplacement de visage", - "授权,需在遵守": " et doit être utilisé conformément au ", "授权失败": "Échec de l'autorisation", + "授权,需在遵守": " et doit être utilisé conformément au ", "排序": "Ordre", "排队中": "En file d'attente", "接受未设置价格模型": "Accepter les modèles sans prix défini", @@ -1426,8 +1532,8 @@ "控制输出的随机性和创造性": "Contrôle l'aléatoire et la créativité de la sortie", "控制顶栏模块显示状态,全局生效": "Contrôler l'état d'affichage du module d'en-tête, effet global", "推荐": "Recommandé", - "推荐:用户可以选择是否使用指纹等验证": "Recommandé : les utilisateurs peuvent choisir d'utiliser ou non la vérification par empreinte digitale", "推荐使用(用户可选)": "Recommandé (optionnel pour l'utilisateur)", + "推荐:用户可以选择是否使用指纹等验证": "Recommandé : les utilisateurs peuvent choisir d'utiliser ou non la vérification par empreinte digitale", "描述": "Description", "提交": "Soumettre", "提交时间": "Heure de soumission", @@ -1437,13 +1543,14 @@ "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "Invite {{input}} tokens / 1M tokens * {{symbol}}{{price}}", "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Invite {{input}} tokens / 1M tokens * {{symbol}}{{price}} + Complétion {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 缓存创建 {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Invite {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + Cache {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + Création de cache {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + Complétion {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "提示价格:{{symbol}}{{price}} / 1M tokens": "Prix d'invite : {{symbol}}{{price}} / 1M tokens", + "提示缓存倍率": "Ratio de cache d'invite", "提示:如需备份数据,只需复制上述目录即可": "Astuce : pour sauvegarder les données, il suffit de copier le répertoire ci-dessus", "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。": "Remarque : cette configuration n'affecte que l'affichage des modèles dans la place de marché des modèles et n'a aucun impact sur l'invocation ou le routage réels. Pour configurer le comportement réel des appels, veuillez aller dans « Gestion des canaux ».", + "提示:端点映射仅用于模型广场展示,不会影响模型真实调用。如需配置真实调用,请前往「渠道管理」。": "Remarque : la correspondance des endpoints sert uniquement à l'affichage dans la place de marché des modèles et n'affecte pas l'invocation réelle. Pour configurer l'invocation réelle, veuillez aller dans « Gestion des canaux ».", "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。": "Remarque : cette fonctionnalité est en version bêta. La structure de configuration et le comportement peuvent changer à l’avenir. Ne l’utilisez pas en production.", "提示:语言偏好会同步到您登录的所有设备,并影响API返回的错误消息语言。": "Conseil : La préférence linguistique sera synchronisée sur tous vos appareils connectés et affectera la langue des messages d'erreur renvoyés par l'API.", "提示:链接中的{key}将被替换为API密钥,{address}将被替换为服务器地址": "Astuce : {key} dans le lien sera remplacé par la clé API, {address} sera remplacé par l'adresse du serveur", - "提示价格:{{symbol}}{{price}} / 1M tokens": "Prix d'invite : {{symbol}}{{price}} / 1M tokens", - "提示缓存倍率": "Ratio de cache d'invite", "搜索供应商": "Rechercher un fournisseur", "搜索关键字": "Rechercher des mots-clés", "搜索失败": "Search failed", @@ -1472,6 +1579,8 @@ "支付失败": "Paiement échoué", "支付宝": "Alipay", "支付方式": "Mode de paiement", + "支付方式名称": "Nom de méthode de paiement", + "支付方式类型": "Type de méthode de paiement", "支付渠道": "Canaux de paiement", "支付设置": "Paiement", "支付请求失败": "Échec de la demande de paiement", @@ -1497,8 +1606,6 @@ "收益统计": "Statistiques sur les revenus", "收起": "Réduire", "收起侧边栏": "Réduire la barre latérale", - "向左展开": "Développer à gauche", - "向右展开": "Développer à droite", "收起内容": "Réduire le contenu", "放大": "Upscalers", "放大编辑": "Développer l'éditeur", @@ -1517,14 +1624,19 @@ "数据管理和日志查看": "Données et journaux", "文件上传": "Téléchargement de fichier", "文件搜索价格:{{symbol}}{{price}} / 1K 次": "Prix de recherche de fichier : {{symbol}}{{price}} / 1K fois", + "文件搜索调用 {{fileSearchCallCount}} 次": "Recherche de fichier appelée {{fileSearchCallCount}} fois", + "文件搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Recherche de fichier : {{count}} / 1K * prix unitaire {{price}} * {{ratioType}} {{ratio}} = {{amount}}", "文字提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 文字补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} = {{symbol}}{{total}}": "Invite texte {{input}} tokens / 1M tokens * {{symbol}}{{price}} + Complétion texte {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} = {{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}}": "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}}", "文字提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 文字补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} = {{symbol}}{{total}}": "Invite texte {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + Cache {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + Complétion texte {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} = {{symbol}}{{total}}", "文字输入": "Saisie de texte", "文字输出": "Sortie de texte", + "文字输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Sortie texte : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * ratio de complétion {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "文心一言": "ERNIE Bot", "文档": "Documentation", "文档地址": "Lien du document", "文生视频": "Texte vers vidéo", + "新增": "added", "新增 Key 来源": "Ajouter une source de clé", "新增供应商": "Ajouter un fournisseur", "新增失败": "Échec de l'ajout", @@ -1540,9 +1652,9 @@ "新建容器部署": "Create Container Deployment", "新建数量": "Nouvelle quantité", "新建组": "Nouveau groupe", + "新格式模板": "Modèle de nouveau format", "新格式(支持条件判断与json自定义):": "Nouveau format (prend en charge les conditions et la personnalisation JSON) :", "新格式(规则 + 条件)": "Nouveau format (Règles + Conditions)", - "新格式模板": "Modèle de nouveau format", "新版本": "Nouvelle version", "新用户使用邀请码奖励额度": "Quota de bonus de code d'invitation pour nouvel utilisateur", "新用户初始额度": "Quota initial pour les nouveaux utilisateurs", @@ -1559,6 +1671,7 @@ "无法复制到剪贴板,请手动复制": "Impossible de copier dans le presse-papiers, veuillez copier manuellement", "无法添加图片": "Impossible d'ajouter l'image", "无法获取容器详情": "Unable to get container details", + "无法读取剪贴板": "Impossible de lire le presse-papiers", "无法连接 io.net": "Unable to connect to io.net", "无生效": "Aucun actif", "无邀请人": "Pas d'invitant", @@ -1569,19 +1682,19 @@ "日志已下载": "Logs downloaded", "日志已加载": "Logs loaded", "日志已复制到剪贴板": "Logs copied to clipboard", + "日志总大小": "Taille totale des journaux", + "日志文件数": "Nombre de fichiers journaux", + "日志时间范围": "Plage de dates des journaux", "日志流": "Log Stream", "日志清理失败:": "Échec du nettoyage des journaux :", + "日志目录": "Répertoire des journaux", "日志类型": "Type de journal", "日志设置": "Config. journaux", "日志详情": "Détails du journal", - "日志目录": "Répertoire des journaux", - "日志文件数": "Nombre de fichiers journaux", - "日志时间范围": "Plage de dates des journaux", - "日志总大小": "Taille totale des journaux", - "旧格式(JSON 对象)": "Ancien format (Objet JSON)", - "旧格式(直接覆盖):": "Ancien format (remplacement direct) :", "旧格式必须是 JSON 对象": "L'ancien format doit être un objet JSON", "旧格式模板": "Modèle d'ancien format", + "旧格式(JSON 对象)": "Ancien format (Objet JSON)", + "旧格式(直接覆盖):": "Ancien format (remplacement direct) :", "旧的备用码已失效,请保存新的备用码": "Les anciens codes de sauvegarde ont été invalidés, veuillez enregistrer les nouveaux codes de sauvegarde", "早上好": "Bonjour", "时间": "Heure", @@ -1598,18 +1711,19 @@ "是否自动禁用": "Désactiver automatiquement", "是否要求指纹/面容等生物识别": "Exiger une reconnaissance biométrique par empreinte digitale/faciale", "显示倍率": "Afficher le ratio", - "显示最新20条": "Afficher les 20 dernières", "显示名称": "Nom d'affichage", "显示名称字段(可选)": "Champ du nom d'affichage (optionnel)", "显示完整内容": "Afficher le contenu complet", "显示操作项": "Afficher les actions", "显示更多": "Afficher plus", + "显示最新20条": "Afficher les 20 dernières", "显示第": "Affichage de", "显示设置": "Paramètres d'affichage", "显示调试": "Afficher le débogage", "晚上好": "Bonsoir", "普通环境变量": "Regular Environment Variables", "普通用户": "Utilisateur normal", + "普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Entrée standard : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "智能体ID": "ID de l'agent intelligent", "智能熔断": "Fallback intelligent", "智谱": "Zhipu AI", @@ -1621,6 +1735,7 @@ "暂无保存的配置": "Aucune configuration enregistrée", "暂无充值记录": "Aucune recharge", "暂无公告": "Pas d'avis", + "暂无分组,点击下方按钮添加": "No groups yet. Click the button below to add one.", "暂无匹配模型": "Aucun modèle correspondant", "暂无可复制 JSON": "Aucun JSON à copier", "暂无可复制的版本信息": "No version information to copy", @@ -1647,7 +1762,9 @@ "暂无监控数据": "Pas de données de surveillance", "暂无系统公告": "Pas d'avis système", "暂无缺失模型": "Aucun modèle manquant", + "暂无自动分组,点击下方按钮添加": "No auto groups yet. Click the button below to add one.", "暂无自定义 OAuth 提供商": "Aucun fournisseur OAuth personnalisé", + "暂无规则,点击下方按钮添加": "No rules yet. Click the button below to add one.", "暂无订阅套餐": "Aucun plan d'abonnement", "暂无订阅记录": "Aucun enregistrement d'abonnement", "暂无请求数据": "Aucune donnée de requête", @@ -1683,8 +1800,21 @@ "更新配置后,容器可能需要重启以应用新的设置。请确保您了解这些更改的影响。": "After updating the configuration, the container may need to restart to apply the new settings. Please ensure you understand the impact of these changes.", "更新配置失败": "Failed to update configuration", "更新预填组": "Mettre à jour le groupe pré-rempli", + "最低": "Le plus bas", + "最低充值美元数量": "Montant minimum de recharge en dollars", + "最后使用时间": "Dernière utilisation", + "最后更新": "Last Updated", + "最后请求": "Dernière requête", + "最大GPU数量": "Max Number of GPUs", + "最大可用": "Max Available", + "最大条目数": "Nombre max. d'entrées", + "最终抵扣": "Déduction finale", + "最近一次": "Dernière", + "最近事件": "Recent Events", + "最高优先级": "highest priority", "月": "mois", "有 Reasoning": "A un raisonnement", + "有序字符串数组": "Ordered string array", "有效期": "Validité", "有效期单位": "Unité de validité", "有效期数值": "Valeur de validité", @@ -1727,8 +1857,9 @@ "未绑定": "Non lié", "未获取到授权码": "Code d'autorisation non obtenu", "未设置": "Non défini", - "未设置倍率模型": "Modèles sans ratio", + "未设置价格": "Prix non défini", "未设置价格模型": "Modèles sans prix", + "未设置倍率模型": "Modèles sans ratio", "未设置路径": "Aucun chemin configuré", "未配置模型": "Aucun modèle configuré", "未配置的模型列表": "Modèles non configurés", @@ -1736,8 +1867,8 @@ "本地数据存储": "Stockage de données locales", "本地计费": "Facturation locale", "本月获得": "Ce mois-ci", - "本设备:手机指纹/面容,外接:USB安全密钥": "Intégré : empreinte digitale/visage du téléphone, Externe : clé de sécurité USB", "本设备内置": "Intégré à cet appareil", + "本设备:手机指纹/面容,外接:USB安全密钥": "Intégré : empreinte digitale/visage du téléphone, Externe : clé de sécurité USB", "本项目根据": "Ce projet est sous licence ", "机密环境变量": "Secret Environment Variables", "机密环境变量将被加密存储,适用于存储密码、API密钥等敏感信息。": "Secret environment variables will be stored encrypted, suitable for storing passwords, API keys and other sensitive information.", @@ -1746,12 +1877,12 @@ "权限设置": "Paramètres d'autorisation", "条": "éléments", "条 - 第": "à", - "条,共": "sur", "条件取反": "Inverser la condition", "条件数": "Conditions", "条件规则": "Règles de condition", "条件项设置": "Paramètres des éléments de condition", "条日志已清理!": "les journaux ont été effacés !", + "条,共": "sur", "来源": "Source", "来源于 IO.NET 部署": "From IO.NET Deployment", "来源端点": "Point de terminaison source", @@ -1765,8 +1896,10 @@ "查看所有可用的AI模型供应商,包括众多知名供应商的模型。": "Affichez tous les fournisseurs de modèles d'IA disponibles, y compris les modèles de nombreux fournisseurs bien connus.", "查看日志": "View Logs", "查看渠道密钥": "Afficher la clé du canal", + "查看示例": "View Example", "查看详情": "View Details", "查询": "Requête", + "标准价格": "Standard price", "标签": "Étiquette", "标签不能为空!": "L'étiquette ne peut pas être vide !", "标签信息": "Informations sur l'étiquette", @@ -1776,6 +1909,8 @@ "标签聚合": "Agrégation d'étiquettes", "标签聚合模式": "Activer le mode étiquette", "标识颜色": "Couleur de l'identifiant", + "核心概念": "Key Concepts", + "核心配置": "Configuration principale", "核采样,控制词汇选择的多样性": "Échantillonnage nucléaire, contrôle la diversité de la sélection du vocabulaire", "根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。": "Selon la convention Anthropic, les tokens d'entrée de /v1/messages ne comptent que les entrées non mises en cache et excluent les tokens de lecture/écriture du cache.", "根据模型名称和匹配规则查找模型元数据,优先级:精确 > 前缀 > 后缀 > 包含": "Rechercher les métadonnées du modèle en fonction du nom du modèle et des règles de correspondance, priorité : exact > préfixe > suffixe > contient", @@ -1783,27 +1918,34 @@ "格式化 JSON": "Formater le JSON", "格式正确": "Format valide", "格式示例:": "Exemple de format :", - "前:": "Avant :", - "配置:": "Configuration :", - "后:": "Apres :", "格式错误": "Format invalide", "检查更新": "Vérifier les mises à jour", "检测到 FluentRead(流畅阅读)": "FluentRead détecté", + "检测到剪贴板中的连接信息": "Informations de connexion détectées dans le presse-papiers", "检测到多个密钥,您可以单独复制每个密钥,或点击复制全部获取完整内容。": "Plusieurs clés détectées, vous pouvez copier chaque clé individuellement ou cliquer sur Tout copier pour obtenir le contenu complet.", "检测到该消息后有AI回复,是否删除后续回复并重新生成?": "Une réponse IA a été détectée après ce message, voulez-vous supprimer les réponses suivantes et régénérer ?", "检测必须等待绘图成功才能进行放大等操作": "La détection doit attendre que le dessin réussisse avant d'effectuer un zoom et d'autres opérations", + "概览": "Overview", "模型": "Modèle", + "模型 {{name}} 缺少输入价格,无法计算补全/缓存/图片/音频价格对应的倍率": "Le modèle {{name}} n'a pas de prix d'entrée, impossible de calculer les ratios correspondants pour la complétion, le cache, les images et l'audio.", + "模型 {{name}} 缺少音频输入价格,无法计算音频补全倍率": "Le modèle {{name}} n'a pas de prix d'entrée audio, impossible de calculer le ratio de complétion audio.", "模型: {{ratio}}": "Modèle : {{ratio}}", "模型专用区域": "Zone dédiée au modèle", "模型价格": "Prix du modèle", + "模型价格 {{price}}": "Prix du modèle {{price}}", + "模型价格 {{symbol}}{{price}} / 次": "Prix du modèle {{symbol}}{{price}} / requête", + "模型价格 {{symbol}}{{price}} / 次 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Prix du modèle {{symbol}}{{price}} / requête * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}": "Prix du modèle {{symbol}}{{price}}, {{ratioType}} {{ratio}}", + "模型价格:{{symbol}}{{price}}": "Prix du modèle : {{symbol}}{{price}}", "模型价格:{{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}}", + "模型价格:{{symbol}}{{price}} / 次": "Prix du modèle : {{symbol}}{{price}} / requête", "模型倍率": "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}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}},Web 搜索调用 {{webSearchCallCount}} 次": "Ratio du modèle {{modelRatio}}, ratio de cache {{cacheRatio}}, ratio de complétion {{completionRatio}}, {{ratioType}} {{ratio}}, appels de recherche Web {{webSearchCallCount}} fois", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},图片输入倍率 {{imageRatio}},{{ratioType}} {{ratio}}": "Ratio du modèle {{modelRatio}}, ratio de cache {{cacheRatio}}, ratio de complétion {{completionRatio}}, ratio d'entrée image {{imageRatio}}, {{ratioType}} {{ratio}}", + "模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},音频倍率 {{audioRatio}},音频补全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}": "Ratio du modèle {{modelRatio}}, ratio de complétion {{completionRatio}}, ratio audio {{audioRatio}}, ratio de complétion audio {{audioCompletionRatio}}, {{cachePart}}{{ratioType}} {{ratio}}", + "模型倍率 {{modelRatio}},输出倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},{{ratioType}} {{ratio}}": "Ratio du modèle {{modelRatio}}, ratio de sortie {{completionRatio}}, ratio du cache {{cacheRatio}}, {{ratioType}} {{ratio}}", "模型倍率 {{modelRatio}},输出倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},缓存创建倍率 {{cacheCreationRatio}},{{ratioType}} {{ratio}}": "Ratio du modèle {{modelRatio}}, ratio de complétion {{completionRatio}}, ratio de cache {{cacheRatio}}, ratio de création de cache {{cacheCreationRatio}}, {{ratioType}} {{ratio}}", "模型倍率值": "Valeur du ratio de modèle", "模型倍率和补全倍率": "Ratio de modèle et ratio de complétion", @@ -1821,6 +1963,7 @@ "模型名称已存在": "Le nom du modèle existe déjà", "模型固定价格": "Prix du modèle par appel", "模型图标": "Icône du modèle", + "模型定价设置": "Model Pricing", "模型定价,需要登录访问": "Tarification du modèle, nécessite une connexion pour y accéder", "模型广场": "Marché des modèles", "模型拉取失败: {{error}}": "Failed to pull model: {{error}}", @@ -1830,8 +1973,8 @@ "模型更新成功!": "Modèle mis à jour avec succès !", "模型未加入列表,可能无法调用": "Le modèle n'est pas dans la liste, il peut ne pas être disponible", "模型正则": "Regex de modèle", - "模型正则(每行一个)": "Regex de modèle (un par ligne)", "模型正则不能为空": "La regex de modèle ne peut pas être vide", + "模型正则(每行一个)": "Regex de modèle (un par ligne)", "模型消耗分布": "Distribution de la consommation des modèles", "模型消耗趋势": "Tendance de la consommation des modèles", "模型版本": "Version du modèle", @@ -1841,6 +1984,7 @@ "模型管理": "Modèles", "模型组": "Groupe de modèles", "模型补全倍率(仅对自定义模型有效)": "Ratio d'achèvement de modèle (uniquement efficace pour les modèles personnalisés)", + "模型计费编辑器": "Éditeur de tarification des modèles", "模型请求速率限制": "Limite de débit de requête de modèle", "模型调用次数占比": "Ratio d'appels de modèles", "模型调用次数排行": "Classement des appels de modèles", @@ -1871,6 +2015,7 @@ "正在跟随最新日志": "Following latest logs", "正在跳转 GitHub...": "Redirection vers GitHub...", "正在跳转...": "Redirection...", + "正常情况下,令牌的计费倍率由令牌所选的分组决定。特殊倍率可以根据「用户所在分组」进一步覆盖这个倍率。": "Normally, a token's billing ratio is determined by its selected group. Special ratios can override this based on the user's group.", "此代理仅用于图片请求转发,Webhook通知发送等,AI API请求仍然由服务器直接发出,可在渠道设置中单独配置代理": "Ce proxy est utilisé uniquement pour le transfert des requêtes d'images, l'envoi de notifications Webhook, etc. Les requêtes d'API IA sont toujours émises directement par le serveur, le proxy peut être configuré séparément dans les paramètres du canal", "此修改将不可逆": "Cette modification sera irréversible", "此操作不可恢复,请仔细确认时间后再操作!": "Cette opération est irréversible, veuillez confirmer attentivement l'heure avant d'opérer !", @@ -1885,9 +2030,11 @@ "此操作将解绑用户当前的 Passkey,下次登录需要重新注册。": "Cela détachera le Passkey actuel de l'utilisateur. Il devra se réenregistrer lors de sa prochaine connexion.", "此操作将降低用户的权限级别": "Cette opération abaissera le niveau de permission de l'utilisateur", "此支付方式最低充值金额为": "Le montant minimum de recharge pour ce mode de paiement est de", + "此时用户创建令牌时只能看到 standard 和 premium:": "Users can now only see standard and premium when creating tokens:", "此渠道由 IO.NET 自动同步,类型、密钥和 API 地址已锁定。": "This channel is automatically synchronized by IO.NET, type, key and API address are locked.", "此设置用于系统内部计算,默认值500000是为了精确到6位小数点设计,不推荐修改。": "Ce paramètre est utilisé pour les calculs internes du système, la valeur par défaut 500000 est conçue pour une précision de 6 décimales, la modification n'est pas recommandée.", "此页面仅显示未设置价格或倍率的模型,设置后将自动从列表中移除": "Cette page n'affiche que les modèles sans prix ni ratio. Après le paramétrage, ils seront automatiquement supprimés de la liste", + "此页面仅显示未设置价格或基础倍率的模型,设置后会自动从列表中移出": "Cette page n'affiche que les modèles sans prix ou ratio de base. Après enregistrement, ils seront retirés automatiquement de cette liste.", "此项只读,需要用户通过个人设置页面的相关绑定按钮进行绑定,不可直接修改": "Lecture seule, paramètres personnels de l'utilisateur, et ne peut pas être modifié directement", "此项可选,用于修改请求体中的模型名称,为一个 JSON 字符串,键为请求中模型名称,值为要替换的模型名称,例如:": "Ceci est facultatif, utilisé pour modifier le nom du modèle dans le corps de la requête, c'est une chaîne JSON, la clé est le nom du modèle dans la requête, et la valeur est le nom du modèle à remplacer, par exemple :", "此项可选,用于修改请求体中的模型名称,为一个 JSON 字符串,键为请求中模型名称,值为要替换的模型名称,留空则不更改": "Ceci est facultatif, utilisé pour modifier le nom du modèle dans le corps de la requête, sous forme de chaîne JSON, la clé est le nom du modèle dans la requête, la valeur est le nom du modèle à remplacer, laisser vide ne changera rien", @@ -1895,6 +2042,7 @@ "此项可选,用于覆盖请求参数。不支持覆盖 stream 参数": "Ceci est facultatif, utilisé pour remplacer les paramètres de requête. Ne prend pas en charge le remplacement du paramètre stream", "此项可选,用于覆盖请求头参数": "Ceci est facultatif, utilisé pour remplacer les paramètres d'en-tête de requête", "此项可选,用于通过自定义API地址来进行 API 调用,末尾不要带/v1和/": "Facultatif pour les appels d'API via une adresse d'API personnalisée, n'ajoutez pas /v1 et / à la fin", + "每个分组代表一个价格档位。管理员创建分组后,可以选择哪些档位对用户开放自选。": "Each group represents a pricing tier. After creating groups, admins can choose which tiers are open for user self-selection.", "每个用户最多可创建的令牌数量,默认 1000,设置过大可能会影响性能": "Nombre maximal de jetons que chaque utilisateur peut créer, par défaut 1000. Une valeur trop élevée peut affecter les performances", "每周": "Hebdomadaire", "每天": "Quotidien", @@ -1903,16 +2051,21 @@ "每日签到": "Enregistrement quotidien", "每日签到可获得随机额度奖励": "L'enregistrement quotidien récompense un quota aléatoire", "每月": "Mensuel", + "每美元对应 Token 数": "Tokens par USD", "每隔多少分钟测试一次所有通道": "Tous les combien de minutes tester tous les canaux", "永不过期": "N'expire jamais", "永久删除您的两步验证设置": "Supprimer définitivement vos paramètres d'authentification à deux facteurs", "永久删除所有备用码(包括未使用的)": "Supprimer définitivement tous les codes de sauvegarde (y compris ceux non utilisés)", + "汇率": "Taux de change", + "沙盒环境 RSA 私钥 Base64 (PKCS#8 DER)": "Clé privée RSA Base64 (PKCS#8 DER) de sandbox", + "沙盒环境 Waffo 公钥 Base64 (X.509 DER)": "Clé publique Waffo Base64 (X.509 DER) de sandbox", "没有匹配的字段": "Aucun champ correspondant", "没有匹配的日志条目": "No matching log entries", "没有匹配的规则": "Aucune règle correspondante", "没有可用令牌用于填充": "Aucun jeton disponible pour le remplissage", "没有可用模型": "Aucun modèle disponible", "没有找到匹配的模型": "Aucun modèle correspondant trouvé", + "没有未设置定价的模型": "Aucun modèle sans prix", "没有未设置的模型": "Aucun modèle non configuré", "没有条件时,默认总是执行该操作。": "Lorsqu'aucune condition n'est définie, l'opération est toujours exécutée par défaut.", "没有模型可以复制": "Aucun modèle à copier", @@ -1921,8 +2074,8 @@ "注册": "S'inscrire", "注册 Passkey": "Enregistrer un Passkey", "注意": "Remarque", - "注意:JSON中重复的键只会保留最后一个同名键的值": "Remarque : Dans JSON, pour les clés dupliquées, seule la valeur de la dernière clé du même nom sera conservée", "注意非Chat API,请务必填写正确的API地址,否则可能导致无法使用": "Remarque : Pour les API non-Chat, assurez-vous de saisir l'adresse API correcte, sinon elle pourrait ne pas fonctionner", + "注意:JSON中重复的键只会保留最后一个同名键的值": "Remarque : Dans JSON, pour les clés dupliquées, seule la valeur de la dernière clé du même nom sera conservée", "注销": "Se déconnecter", "注销成功!": "Déconnexion réussie !", "活跃文件": "Fichiers actifs", @@ -1960,6 +2113,7 @@ "深色": "Sombre", "深色模式": "Mode sombre", "添加": "Ajouter", + "添加 (+:)": "Add (+:)", "添加 OAuth 提供商": "Ajouter un fournisseur OAuth", "添加API": "Ajouter une API", "添加产品": "Ajouter un produit", @@ -1967,6 +2121,7 @@ "添加兑换码": "Ajouter un code d'échange", "添加公告": "Ajouter un avis", "添加分类": "Ajouter une catégorie", + "添加分组": "Add Group", "添加后提交": "Soumettre après ajout", "添加启动参数": "Add Startup Args", "添加启动命令": "Add Startup Command", @@ -1978,6 +2133,7 @@ "添加环境变量": "Add Environment Variable", "添加用户": "Ajouter un utilisateur", "添加聊天配置": "Ajouter une configuration de chat", + "添加规则": "Add Rule", "添加键值对": "Ajouter une paire clé-valeur", "添加问答": "Ajouter une FAQ", "添加额度": "Ajouter un quota", @@ -1996,8 +2152,8 @@ "渠道 ID": "ID du Canal", "渠道ID,名称,密钥,API地址": "ID du canal, nom, clé, URL de base", "渠道亲和性": "Affinité de canal", - "渠道亲和性:上游缓存命中": "Affinité de canal : hit du cache en amont", "渠道亲和性会基于从请求上下文或 JSON Body 提取的 Key,优先复用上一次成功的渠道。": "L'affinité de canal réutilise le dernier canal réussi en fonction des clés extraites du contexte de la requête ou du body JSON.", + "渠道亲和性:上游缓存命中": "Affinité de canal : hit du cache en amont", "渠道优先级": "Priorité du canal", "渠道信息": "Informations sur le canal", "渠道创建成功!": "Canal créé avec succès !", @@ -2015,6 +2171,7 @@ "渠道的模型测试": "Test de modèle de canal", "渠道的高级配置选项": "Options de configuration avancées du canal", "渠道管理": "Canaux", + "渠道行为": "Comportement du canal", "渠道额外设置": "Paramètres supplémentaires du canal", "源地址": "Adresse source", "满足任一条件(OR)": "Satisfaire une condition quelconque (OR)", @@ -2032,6 +2189,8 @@ "点击预览音乐": "Cliquez pour écouter la musique", "点击验证按钮,使用您的生物特征或安全密钥": "Cliquez sur le bouton de vérification pour utiliser vos caractéristiques biométriques ou votre clé de sécurité", "版权所有": "Tous droits réservés", + "特殊倍率": "Special Ratios", + "特殊可用分组规则": "Special Usable Group Rules", "状态": "Statut", "状态码": "Code d'état", "状态码复写": "Remplacement du code d'état", @@ -2039,6 +2198,8 @@ "状态筛选": "Filtre d'état", "状态页面Slug": "Slug de la page d'état", "环境变量": "Environment Variables", + "生产环境 RSA 私钥 Base64 (PKCS#8 DER)": "Clé privée RSA Base64 (PKCS#8 DER) de production", + "生产环境 Waffo 公钥 Base64 (X.509 DER)": "Clé publique Waffo Base64 (X.509 DER) de production", "生成令牌": "Générer un jeton", "生成并填入": "Générer et remplir", "生成数量": "Générer la quantité", @@ -2069,20 +2230,25 @@ "用户信息": "Informations utilisateur", "用户信息更新成功!": "Informations utilisateur mises à jour avec succès !", "用户信息缺失": "Informations utilisateur manquantes", - "用户最大令牌数量": "Nombre maximal de jetons par utilisateur", "用户分组": "Votre groupe par défaut", "用户分组和额度管理": "Groupes et quotas", + "用户分组的联动作用": "How user group affects other features", "用户分组配置": "Configuration du groupe d'utilisateurs", + "用户创建令牌 → 选择分组下拉框:": "User creates token → group dropdown:", + "用户创建令牌时选择的分组,决定该令牌的实际计费倍率。一个用户可以创建多个令牌,使用不同分组。": "The group selected when creating a token determines its billing ratio. A user can create multiple tokens using different groups.", "用户协议": "Accord utilisateur", "用户协议已更新": "L'accord utilisateur a été mis à jour", "用户协议更新失败": "Échec de la mise à jour de l'accord utilisateur", + "用户可选": "User Selectable", "用户可选分组": "Groupes sélectionnables par l'utilisateur", + "用户可选分组的名称和描述(只包含勾选了用户可选的分组)": "Names and descriptions of user-selectable groups (only includes checked groups)", "用户名": "Nom d'utilisateur", "用户名字段(可选)": "Champ nom d'utilisateur (optionnel)", "用户名或邮箱": "Nom d'utilisateur ou e-mail", "用户名称": "Nom d'utilisateur", "用户控制面板,管理账户": "Panneau de configuration de l'utilisateur pour la gestion du compte", "用户新建令牌时可选的分组,格式为 JSON 字符串,例如:{\"vip\": \"VIP 用户\", \"test\": \"测试\"},表示用户可以选择 vip 分组和 test 分组": "Groupes sélectionnables par l'utilisateur lors de la création d'un jeton, format de chaîne JSON, par exemple : {\"vip\": \"Utilisateur VIP\", \"test\": \"Test\"}, indiquant que l'utilisateur peut sélectionner le groupe vip et le groupe test", + "用户最大令牌数量": "Nombre maximal de jetons par utilisateur", "用户每周期最多请求完成次数": "Nombre maximal de requêtes utilisateur réussies par période", "用户每周期最多请求次数": "Nombre maximal de requêtes utilisateur par période", "用户注册时看到的网站名称,比如'我的网站'": "Nom du site Web que les utilisateurs voient lors de l'inscription, par exemple 'Mon site Web'", @@ -2094,6 +2260,7 @@ "用户账户管理": "Comptes utilisateurs", "用时/首字": "Temps/premier mot", "由全站货币展示设置统一控制": "Contrôlé par les paramètres globaux d'affichage des devises", + "由管理员分配,决定用户身份等级(如 default、vip)。": "Assigned by admin, determines user tier (e.g., default, vip).", "由订阅抵扣": "Déduit par l'abonnement", "界面语言和其他个人偏好": "Langue de l'interface et autres préférences personnelles", "留空使用系统临时目录": "Laisser vide pour utiliser le répertoire temporaire du système", @@ -2110,11 +2277,13 @@ "监控设置": "Surveillance", "目录总大小": "Taille totale du répertoire", "目录文件数": "Nombre de fichiers du répertoire", + "目标分组": "Target Group", "目标用户:{{username}}": "Utilisateur cible : {{username}}", "目标端点": "Point de terminaison cible", "目标路径(可选)": "Chemin cible (optionnel)", "直接提交": "Soumettre directement", "直接编辑 JSON 文本,保存时会校验格式。": "Modifier le texte JSON directement ; le format sera validé lors de la sauvegarde.", + "直接追加(和添加类似,但无前缀)": "Directly append (similar to Add, but without prefix)", "相关项目": "Projets connexes", "相当于删除用户,此修改将不可逆": "Équivalent à supprimer l'utilisateur, cette modification sera irréversible", "矛盾": "Conflit", @@ -2124,7 +2293,6 @@ "硬件类型": "Hardware Type", "硬件配置": "Hardware Configuration", "确定": "OK", - "确定?": "Sûr ?", "确定删除此组?": "Confirmer la suppression de ce groupe ?", "确定导入": "Confirmer l'importation", "确定是否要修复数据库一致性?": "Êtes-vous sûr de vouloir réparer la cohérence de la base de données ?", @@ -2142,11 +2310,11 @@ "确定要充值 $": "Confirmer la recharge de $", "确定要删除供应商 \"{{name}}\" 吗?此操作不可撤销。": "Êtes-vous sûr de vouloir supprimer le fournisseur \"{{name}}\" ? Cette opération est irréversible.", "确定要删除所有已自动禁用的密钥吗?": "Êtes-vous sûr de vouloir supprimer toutes les clés désactivées automatiquement ?", - "确定要删除所选的 {{count}} 个令牌吗?_one": "Êtes-vous sûr de vouloir supprimer le jeton sélectionné ?", "确定要删除所选的 {{count}} 个令牌吗?_many": "Êtes-vous sûr de vouloir supprimer les {{count}} jetons sélectionnés ?", + "确定要删除所选的 {{count}} 个令牌吗?_one": "Êtes-vous sûr de vouloir supprimer le jeton sélectionné ?", "确定要删除所选的 {{count}} 个令牌吗?_other": "Êtes-vous sûr de vouloir supprimer les {{count}} jetons sélectionnés ?", - "确定要删除所选的 {{count}} 个模型吗?_one": "Êtes-vous sûr de vouloir supprimer le modèle sélectionné ?", "确定要删除所选的 {{count}} 个模型吗?_many": "Êtes-vous sûr de vouloir supprimer les {{count}} modèles sélectionnés ?", + "确定要删除所选的 {{count}} 个模型吗?_one": "Êtes-vous sûr de vouloir supprimer le modèle sélectionné ?", "确定要删除所选的 {{count}} 个模型吗?_other": "Êtes-vous sûr de vouloir supprimer les {{count}} modèles sélectionnés ?", "确定要删除此 OAuth 提供商吗?": "Êtes-vous sûr de vouloir supprimer ce fournisseur OAuth ?", "确定要删除此API信息吗?": "Êtes-vous sûr de vouloir supprimer ces informations d'API ?", @@ -2168,12 +2336,15 @@ "确定要降级此用户吗?": "Êtes-vous sûr de vouloir rétrograder cet utilisateur ?", "确定重置": "Confirmer la réinitialisation", "确定重置模型倍率吗?": "Confirmer la réinitialisation du ratio de modèle ?", + "确定?": "Sûr ?", "确认": "Confirmer", "确认作废": "Confirmer l'invalidation", "确认关闭提示": "Confirmer la fermeture", "确认冲突项修改": "Confirmer la modification de l'élément de conflit", "确认删除": "Confirmer la suppression", "确认删除模型": "Confirm Delete Model", + "确认删除该分组?": "Confirm delete this group?", + "确认删除该规则?": "Confirm delete this rule?", "确认取消密码登录": "Confirmer l'annulation de la connexion par mot de passe", "确认启用": "Confirmer l'activation", "确认密码": "Confirmer le mot de passe", @@ -2188,6 +2359,7 @@ "确认清空该规则缓存": "Confirmer la suppression du cache de cette règle", "确认清除历史日志": "Confirmer l'effacement des journaux historiques", "确认禁用": "Confirmer la désactivation", + "确认移除?": "Confirm remove?", "确认补单": "Confirmer la complétion", "确认解绑": "Confirmer la dissociation", "确认解绑 Passkey": "Confirmer la dissociation du Passkey", @@ -2199,16 +2371,13 @@ "磁盘使用率超过此值时拒绝请求": "Rejeter les requêtes lorsque l'utilisation du disque dépasse cette valeur", "磁盘可用空间小于缓存最大总量设置": "L'espace disque disponible est inférieur au paramètre de taille maximale du cache", "磁盘命中": "Hits disque", - "磁盘缓存最大总量 (MB)": "Taille maximale du cache disque (Mo)", "磁盘缓存占用的最大空间": "Espace maximal occupé par le cache disque", "磁盘缓存已清理": "Cache disque nettoyé", + "磁盘缓存最大总量 (MB)": "Taille maximale du cache disque (Mo)", "磁盘缓存设置(磁盘换内存)": "Paramètres du cache disque (échange disque/mémoire)", "磁盘缓存阈值 (MB)": "Seuil du cache disque (Mo)", "示例": "Exemple", "示例:{\"default\": [200, 100], \"vip\": [0, 1000]}。": "Exemple : {\"default\": [200, 100], \"vip\": [0, 1000]}.", - "视频": "Vidéo", - "视频Remix": "Remix vidéo", - "视频无法在当前浏览器中播放,这可能是由于:": "La vidéo ne peut pas être lue dans ce navigateur, cela peut être dû à :", "禁用": "Désactiver", "禁用 store 透传": "Désactiver le passage de store", "禁用2FA失败": "Échec de la désactivation de 2FA", @@ -2226,12 +2395,19 @@ "私有镜像仓库的密码": "Password for private image registry", "私有镜像仓库的用户名": "Username for private image registry", "秒": "Seconde", - "移除 functionResponse.id 字段": "Supprimer le champ functionResponse.id", + "移除": "Remove", + "移除 (-:)": "Remove (-:)", "移除 One API 的版权标识必须首先获得授权,项目维护需要花费大量精力,如果本项目对你有意义,请主动支持本项目": "La suppression de la marque de copyright de One API doit d'abord être autorisée. La maintenance du projet demande beaucoup d'efforts. Si ce projet a du sens pour vous, veuillez le soutenir activement.", + "移除 functionResponse.id 字段": "Supprimer le champ functionResponse.id", + "空": "Vide", "窗口处理": "gestion des fenêtres", "窗口等待": "attente de la fenêtre", "立即签到": "S'enregistrer maintenant", "立即订阅": "S'abonner maintenant", + "站点所有额度将以原始 Token 数显示,不做货币换算": "Tous les quotas du site seront affichés en nombre brut de tokens sans conversion monétaire", + "站点所有额度将以美元 ($) 显示": "Tous les quotas du site seront affichés en USD ($)", + "站点所有额度将按汇率换算为人民币 (¥) 显示": "Tous les quotas du site seront convertis en CNY (¥) selon le taux de change", + "站点所有额度将按汇率换算为自定义货币显示": "Tous les quotas du site seront convertis en devise personnalisée selon le taux de change", "站点额度展示类型及汇率": "Type d'affichage du quota du site et taux de change", "端口号必须在1-65535之间": "Port number must be between 1-65535", "端口配置详细说明": "Limitez les requêtes externes à des ports spécifiques. Utilisez des ports uniques (80, 443) ou des plages (8000-8999). Une liste vide autorise tous les ports. La valeur par défaut inclut les ports Web courants.", @@ -2255,34 +2431,38 @@ "等待中": "En attente", "等待获取邮箱信息...": "En attente d'obtenir des informations par e-mail...", "筛选": "Filtre", - "签到最大额度": "Quota maximum d'enregistrement", - "签到最小额度": "Quota minimum d'enregistrement", "签到功能允许用户每日签到获取随机额度奖励": "La fonction d'enregistrement permet aux utilisateurs de s'enregistrer quotidiennement pour recevoir des récompenses de quota aléatoires", "签到失败": "Échec de l'enregistrement", "签到奖励将直接添加到您的账户余额": "Les récompenses d'enregistrement seront directement ajoutées à votre solde de compte", "签到奖励的最大额度": "Quota maximum pour les récompenses d'enregistrement", "签到奖励的最小额度": "Quota minimum pour les récompenses d'enregistrement", "签到成功!获得": "Enregistrement réussi ! Reçu", + "签到最大额度": "Quota maximum d'enregistrement", + "签到最小额度": "Quota minimum d'enregistrement", "签到设置": "Paramètres d'enregistrement", + "简单来说:同一个令牌分组,不同等级的用户可以享受不同的价格。": "In short: same token group, different user tiers can enjoy different prices.", "简洁": "Simple", - "简洁模式:按 type 全量清理对象,例如 redacted_thinking。": "Mode simple : Nettoyer tous les objets par type, ex. redacted_thinking.", "简洁模式仅返回 message;状态码和错误类型将使用系统默认值。": "Le mode simple renvoie uniquement le message ; le code d'état et le type d'erreur utiliseront les valeurs par défaut du système.", + "简洁模式:按 type 全量清理对象,例如 redacted_thinking。": "Mode simple : Nettoyer tous les objets par type, ex. redacted_thinking.", "管理": "Gérer", "管理 Ollama 模型的拉取和删除": "Manage Ollama model pulling and deletion", - "管理服务器运行日志文件。日志文件会随运行时间不断累积,建议定期清理以释放磁盘空间。": "Gérer les fichiers journaux du serveur. Les fichiers journaux s'accumulent au fil du temps ; un nettoyage régulier est recommandé pour libérer de l'espace disque.", "管理你的 LinuxDO OAuth App": "Gérer votre application OAuth LinuxDO", "管理员": "Admin", + "管理员分配的优惠分组": "Admin-assigned discount group", + "管理员分配的基础分组": "Admin-assigned base group", "管理员区域": "Zone administrateur", "管理员暂时未设置任何关于内容": "L'administrateur n'a encore défini aucun contenu personnalisé \"À propos\".", "管理员未开启 Creem 充值!": "L'administrateur n'a pas activé la recharge Creem !", "管理员未开启Stripe充值!": "L'administrateur n'a pas activé la recharge Stripe !", - "管理员未开启在线充值!": "L'administrateur n'a pas activé la recharge en ligne !", "管理员未开启在线充值功能,请联系管理员开启或使用兑换码充值。": "L'administrateur n'a pas activé la fonction de recharge en ligne, veuillez contacter l'administrateur pour l'activer ou recharger avec un code d'échange.", + "管理员未开启在线充值!": "L'administrateur n'a pas activé la recharge en ligne !", "管理员未开启在线支付功能,请联系管理员配置。": "Le paiement en ligne n'est pas activé par l'administrateur. Veuillez contacter l'administrateur.", "管理员未设置用户可选分组": "L'administrateur n'a pas défini de groupes sélectionnables par l'utilisateur", + "管理员给用户分配的分组(如 vip)不仅决定用户身份,还会影响后续两个功能:": "The group assigned to a user (e.g., vip) not only determines their identity, but also affects the following two features:", "管理员设置了外部链接,点击下方按钮访问": "L'administrateur a défini un lien externe, cliquez sur le bouton ci-dessous pour y accéder", "管理员账号": "Compte administrateur", "管理员账号已经初始化过,请继续设置其他参数": "Le compte administrateur a déjà été initialisé, veuillez continuer à définir d'autres paramètres", + "管理服务器运行日志文件。日志文件会随运行时间不断累积,建议定期清理以释放磁盘空间。": "Gérer les fichiers journaux du serveur. Les fichiers journaux s'accumulent au fil du temps ; un nettoyage régulier est recommandé pour libérer de l'espace disque.", "管理模型、标签、端点等预填组": "Gérer les groupes pré-remplis de modèles, d'étiquettes, de points de terminaison, etc.", "管理用户已绑定的第三方账户,支持筛选与解绑": "Gérer les comptes tiers liés des utilisateurs, avec prise en charge du filtrage et de la dissociation", "管理绑定": "Gérer les liaisons", @@ -2297,6 +2477,9 @@ "系统公告": "Avis système", "系统公告管理,可以发布系统通知和重要消息(最多100个,前端显示最新20条)": "Avis système, vous pouvez publier des avis système et des messages importants (maximum 100, afficher les 20 derniers sur le front-end)", "系统内存": "Mémoire système", + "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为人民币,不影响内部计费": "Le système utilise l'USD comme unité de tarification de base. Solde utilisateur, montants de recharge, tarification des modèles, journaux d'utilisation — tous les montants affichés seront convertis en CNY à ce taux. La facturation interne n'est pas affectée.", + "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为自定义货币,不影响内部计费": "Le système utilise l'USD comme unité de tarification de base. Solde utilisateur, montants de recharge, tarification des modèles, journaux d'utilisation — tous les montants affichés seront convertis en devise personnalisée à ce taux. La facturation interne n'est pas affectée.", + "系统内部计费精度,默认 500000,修改可能导致计费异常,请谨慎操作": "Précision de facturation interne, par défaut 500000. Modifier cette valeur peut provoquer des anomalies de facturation — procédez avec prudence.", "系统初始化": "Initialisation du système", "系统初始化失败,请重试": "L'initialisation du système a échoué, veuillez réessayer", "系统初始化成功,正在跳转...": "Initialisation du système réussie, redirection en cours...", @@ -2315,11 +2498,11 @@ "系统管理功能": "Fonctions de gestion du système", "系统设置": "Système", "系统访问令牌": "Jeton d'accès au système", - "约": "Environ", "索引": "Index", "紧凑列表": "Liste compacte", "累计签到": "Total des enregistrements", "累计获得": "Total reçu", + "约": "Environ", "线路描述": "Description de l'itinéraire", "组列表": "Liste des groupes", "组名": "Nom du groupe", @@ -2349,31 +2532,45 @@ "统计次数": "Nombre de statistiques", "统计额度": "Quota statistique", "继续": "Continuer", - "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Cache {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio : {{ratio}})", "缓存 Tokens": "Jetons de cache", + "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Cache {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Cache {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio : {{ratio}})", "缓存: {{cacheRatio}}": "Cache : {{cacheRatio}}", "缓存价格:{{symbol}}{{price}} * {{cacheRatio}} = {{symbol}}{{total}} / 1M tokens (缓存倍率: {{cacheRatio}})": "Prix du cache : {{symbol}}{{price}} * {{cacheRatio}} = {{symbol}}{{total}} / 1M tokens (taux de cache : {{cacheRatio}})", "缓存价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存倍率: {{cacheRatio}})": "Prix du cache : {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (taux de cache : {{cacheRatio}})", "缓存倍率": "Ratio de cache", "缓存倍率 {{cacheRatio}}": "Ratio de cache {{cacheRatio}}", "缓存写": "Écriture cache", - "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Création de cache {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio : {{ratio}})", "缓存创建 Tokens": "Jetons de création de cache", - "缓存创建: {{cacheCreationRatio}}": "Création de cache : {{cacheCreationRatio}}", + "缓存创建 {{price}} / 1M tokens": "Création de cache {{price}} / 1M tokens", + "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Création de cache {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Création de cache {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio : {{ratio}})", "缓存创建: 1h {{cacheCreationRatio1h}}": "Création de cache : 1h {{cacheCreationRatio1h}}", "缓存创建: 5m {{cacheCreationRatio5m}}": "Création de cache : 5m {{cacheCreationRatio5m}}", "缓存创建: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Création de cache : 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", - "缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存创建倍率: {{cacheCreationRatio}})": "Prix de création du cache : {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (taux de création de cache : {{cacheCreationRatio}})", + "缓存创建: {{cacheCreationRatio}}": "Création de cache : {{cacheCreationRatio}}", + "缓存创建价格": "Prix de création du cache d'entrée", + "缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Prix de création du cache {{symbol}}{{price}} / 1M tokens", "缓存创建价格合计:5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens": "Total du prix de création de cache : 5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens", + "缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存创建倍率: {{cacheCreationRatio}})": "Prix de création du cache : {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (taux de création de cache : {{cacheCreationRatio}})", + "缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Prix de création du cache : {{symbol}}{{price}} / 1M tokens", "缓存创建倍率": "Ratio de création du cache", - "缓存创建倍率 {{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 du cache 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", + "缓存创建倍率 {{cacheCreationRatio}}": "Ratio de création de cache {{cacheCreationRatio}}", + "缓存创建:{{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}}", "缓存条目数": "Nombre d'entrées en cache", "缓存目录": "Répertoire de cache", "缓存目录磁盘空间": "Espace disque du répertoire de cache", "缓存读": "Lecture cache", + "缓存读 {{price}} / 1M tokens": "Lecture du cache {{price}} / 1M tokens", + "缓存读取价格": "Prix de lecture du cache d'entrée", + "缓存读取价格 {{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", + "缓存读取价格:{{symbol}}{{total}} / 1M tokens": "Prix de lecture du cache : {{symbol}}{{total}} / 1M tokens", + "缓存读取:{{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}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Entrée en cache : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * ratio du cache {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "编辑": "Modifier", "编辑 OAuth 提供商": "Modifier le fournisseur OAuth", "编辑API": "Modifier l'API", @@ -2410,10 +2607,13 @@ "聊天链接配置错误,请联系管理员": "Erreur de configuration du lien de discussion, veuillez contacter l'administrateur", "联系我们": "Contactez-nous", "腾讯混元": "Hunyuan", + "自动分组": "Auto Group", "自动分组auto,从第一个开始选择": "Regroupement automatique auto, sélection à partir du premier", + "自动分组选择": "Auto Group Selection", "自动刷新": "Auto Refresh", "自动刷新中": "Auto refreshing", "自动填充字段": "Remplissage automatique des champs", + "自动填入": "Remplir auto", "自动检测": "Détection automatique", "自动模式": "Mode automatique", "自动测试所有通道间隔时间": "Intervalle de test automatique pour tous les canaux", @@ -2438,18 +2638,6 @@ "自定义货币": "Devise personnalisée", "自定义货币符号": "Symbole de devise personnalisé", "自定义货币符号将显示在所有额度数值前,例如 €1.50": "Le symbole de devise personnalisé sera affiché avant tous les montants de quota, par ex. €1.50", - "额度展示类型": "Type d'affichage du quota", - "站点所有额度将以美元 ($) 显示": "Tous les quotas du site seront affichés en USD ($)", - "站点所有额度将按汇率换算为人民币 (¥) 显示": "Tous les quotas du site seront convertis en CNY (¥) selon le taux de change", - "站点所有额度将以原始 Token 数显示,不做货币换算": "Tous les quotas du site seront affichés en nombre brut de tokens sans conversion monétaire", - "站点所有额度将按汇率换算为自定义货币显示": "Tous les quotas du site seront convertis en devise personnalisée selon le taux de change", - "汇率": "Taux de change", - "每美元对应 Token 数": "Tokens par USD", - "预览效果": "Aperçu", - "请输入汇率": "Veuillez saisir le taux de change", - "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为人民币,不影响内部计费": "Le système utilise l'USD comme unité de tarification de base. Solde utilisateur, montants de recharge, tarification des modèles, journaux d'utilisation — tous les montants affichés seront convertis en CNY à ce taux. La facturation interne n'est pas affectée.", - "系统内部计费精度,默认 500000,修改可能导致计费异常,请谨慎操作": "Précision de facturation interne, par défaut 500000. Modifier cette valeur peut provoquer des anomalies de facturation — procédez avec prudence.", - "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为自定义货币,不影响内部计费": "Le système utilise l'USD comme unité de tarification de base. Solde utilisateur, montants de recharge, tarification des modèles, journaux d'utilisation — tous les montants affichés seront convertis en devise personnalisée à ce taux. La facturation interne n'est pas affectée.", "自定义错误响应": "Réponse d'erreur personnalisée", "自定义镜像": "Custom Image", "自用模式": "Mode auto-utilisation", @@ -2461,11 +2649,13 @@ "若你的 OIDC Provider 支持 Discovery Endpoint,你可以仅填写 OIDC Well-Known URL,系统会自动获取 OIDC 配置": "Si votre fournisseur OIDC prend en charge le Discovery Endpoint, vous pouvez simplement remplir l'URL OIDC Well-Known, le système obtiendra automatiquement la configuration OIDC", "获取 Discovery 配置": "Récupérer la configuration Discovery", "获取 Discovery 配置失败:": "Échec de la récupération de la configuration Discovery : ", - "获取 io.net API Key": "Get io.net API Key", "获取 OIDC 配置失败,请检查网络状况和 Well-Known URL 是否正确": "Échec de l'obtention de la configuration OIDC, veuillez vérifier l'état du réseau et si l'URL Well-Known est correcte", "获取 OIDC 配置成功!": "Configuration OIDC obtenue avec succès !", "获取 Ollama 版本失败": "Failed to get Ollama version", + "获取 io.net API Key": "Get io.net API Key", "获取2FA状态失败": "Échec de l'obtention de l'état 2FA", + "获取充值配置失败": "Échec de la récupération de la configuration de recharge", + "获取充值配置异常": "Erreur de configuration de recharge", "获取初始化状态失败": "Échec de l'obtention de l'état d'initialisation", "获取可用资源失败: ": "Failed to get available resources: ", "获取启用模型失败": "Échec de l'obtention des modèles activés", @@ -2492,10 +2682,14 @@ "获取验证码": "Obtenir le code de vérification", "获得": "Reçu", "补全": "Achèvement", + "补全 {{completion}} tokens * 输出倍率 {{completionRatio}}": "Complétion {{completion}} tokens * Ratio de sortie {{completionRatio}}", "补全 {{completion}} tokens / 1M tokens * {{symbol}}{{price}}": "Complétion {{completion}} tokens / 1M tokens * {{symbol}}{{price}}", + "补全价格": "Prix de complétion", + "补全价格已锁定": "Le prix de complétion est verrouillé", "补全价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "Prix de complétion : {{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (taux de complétion : {{completionRatio}})", "补全价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens": "Prix de complétion : {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens", "补全倍率": "Ratio de complétion", + "补全倍率 {{completionRatio}}": "Ratio de complétion {{completionRatio}}", "补全倍率值": "Valeur du ratio de complétion", "补单": "Compléter la commande", "补单失败": "Échec de la complétion de la commande", @@ -2513,6 +2707,9 @@ "规则名称(可读性更好,也会出现在管理侧日志中)。": "Nom de la règle (pour une meilleure lisibilité, apparaît également dans les journaux d'administration).", "规则导航": "Navigation des règles", "规则未找到,请刷新后重试": "Règle non trouvée, veuillez actualiser et réessayer", + "视频": "Vidéo", + "视频Remix": "Remix vidéo", + "视频无法在当前浏览器中播放,这可能是由于:": "La vidéo ne peut pas être lue dans ce navigateur, cela peut être dû à :", "角色": "Rôle", "解析响应数据时发生错误": "Erreur lors de l'analyse des données de réponse", "解析密钥文件失败: {{msg}}": "Échec de l'analyse du fichier de clés : {{msg}}", @@ -2521,11 +2718,17 @@ "解绑 Passkey": "Supprimer le Passkey", "解绑后将无法使用 Passkey 登录,确定要继续吗?": "Après la dissociation, vous ne pourrez plus vous connecter avec Passkey. Êtes-vous sûr de vouloir continuer ?", "解绑成功": "Dissociation réussie", + "警告": "Avertissement", + "警告:启用保活后,如果已经写入保活数据后渠道出错,系统无法重试,如果必须开启,推荐设置尽可能大的Ping间隔": "Avertissement : après l'activation du keep-alive, si une erreur de canal se produit après l'écriture des données de keep-alive, le système ne peut pas réessayer. Si vous devez l'activer, il est recommandé de définir un intervalle Ping aussi grand que possible", + "警告:禁用两步验证将永久删除您的验证设置和所有备用码,此操作不可撤销!": "Avertissement : la désactivation de l'authentification à deux facteurs supprimera définitivement vos paramètres de vérification et tous les codes de sauvegarde. Cette action est irréversible !", "计价币种": "Pricing Currency", "计算中": "Calculating", "计算成本": "Calculate Cost", "计算费用中...": "Calculating fees...", + "计费乘数,倍率越低费用越低。例如倍率 0.5 表示半价。": "Billing multiplier — the lower the ratio, the lower the cost. E.g., ratio 0.5 means half price.", "计费开始": "Billing Start", + "计费方式": "Mode de facturation", + "计费显示模式": "Mode d'affichage de la facturation", "计费模式": "Mode de facturation", "计费类型": "Type de facturation", "计费过程": "Processus de mise en lots", @@ -2585,6 +2788,7 @@ "该数据可能不可信,请谨慎使用": "Ces données peuvent ne pas être fiables, veuillez les utiliser avec prudence", "该服务器地址将影响支付回调地址以及默认首页展示的地址,请确保正确配置": "Cette adresse de serveur affectera l'adresse de rappel de paiement et l'adresse affichée sur la page d'accueil par défaut, veuillez vous assurer d'une configuration correcte", "该模型存在固定价格与倍率计费方式冲突,请确认选择": "Le modèle a un conflit de méthode de facturation à prix fixe et à ratio, veuillez confirmer la sélection", + "该模型补全倍率由后端固定为 {{ratio}}。补全价格不能在这里修改。": "Le ratio de complétion de ce modèle est fixé à {{ratio}} par le backend. Le prix de complétion ne peut pas être modifié ici.", "该渠道已开启请求透传,参数覆写、模型重定向等 NewAPI 内置功能将失效,非最佳实践。": "La transmission des requêtes est activée pour ce canal ; les fonctionnalités intégrées de NewAPI (comme la surcharge des paramètres et la redirection de modèle) seront désactivées. Ce n'est pas une bonne pratique.", "该渠道已开启请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "La transmission des requêtes est activée pour ce canal. Les fonctionnalités intégrées de NewAPI (surcharge des paramètres, redirection de modèle, adaptation du canal, etc.) seront désactivées. Ce n'est pas une bonne pratique. Si cela cause des problèmes, merci de ne pas ouvrir d'issue.", "该规则未启用“作用域:包含规则名称”,无法按规则清空缓存。": "Cette règle n'a pas activé « Portée : inclure le nom de la règle », impossible de vider le cache par règle.", @@ -2592,27 +2796,31 @@ "该规则的缓存保留时长;0 表示使用默认 TTL:": "Durée de rétention du cache pour cette règle ; 0 signifie utiliser le TTL par défaut : ", "该记录不包含可用的 token 统计口径。": "Cet enregistrement ne contient pas de statistiques de tokens disponibles.", "详情": "Détails", + "详见「特殊倍率」和「可用分组」标签页。": "See \"Special Ratios\" and \"Usable Groups\" tabs for details.", "语言偏好": "Préférence linguistique", "语言偏好已保存": "Préférence linguistique enregistrée", "语音输入": "Entrée vocale", "语音输出": "Sortie vocale", "说明": "Description", + "说明信息": "Description", "说明:": "Description :", "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。": "Remarque : les tests sur cette page utilisent des requêtes non-streaming. Si un canal ne prend en charge que les réponses en streaming, les tests peuvent échouer. Veuillez vous référer à l’usage réel.", "说明:生成结果是可直接粘贴到渠道密钥里的 JSON(包含 access_token / refresh_token / account_id)。": "Note : Le résultat généré est un JSON qui peut être collé directement dans la clé du canal (inclut access_token / refresh_token / account_id).", - "说明信息": "Description", "请上传密钥文件": "Veuillez télécharger le fichier de clé", "请上传密钥文件!": "Veuillez télécharger le fichier de clé !", "请为渠道命名": "Veuillez nommer le canal", "请使用 Project 为 io.cloud 的密钥": "Please use a key with Project set to io.cloud", + "请先勾选需要批量设置的模型": "Veuillez d'abord sélectionner les modèles à configurer en lot", "请先在设置中启用图片功能": "Veuillez d'abord activer la fonction image dans les paramètres", "请先填写 API Key": "Please fill in API Key first", "请先填写 Discovery URL 或 Issuer URL": "Veuillez d'abord remplir l'URL de découverte ou l'URL de l'émetteur", "请先填写 Issuer URL,以自动生成完整的端点 URL": "Veuillez d'abord remplir l'Issuer URL pour générer automatiquement les URL complètes des points de terminaison", "请先填写 Ollama API 地址": "Please fill in Ollama API address first", "请先填写服务器地址": "Veuillez d'abord remplir l'adresse du serveur", + "请先开启并填写音频输入价格。": "Activez et renseignez d'abord le prix d'entrée audio.", "请先粘贴回调 URL": "Veuillez d'abord coller l'URL de rappel", "请先输入密钥": "Veuillez d'abord saisir la clé", + "请先选择一个作为模板的模型": "Veuillez d'abord choisir un modèle comme modèle de référence", "请先选择一条规则": "Veuillez d'abord sélectionner une règle", "请先选择同步渠道": "Veuillez d'abord sélectionner le canal de synchronisation", "请先选择模型!": "Veuillez d'abord sélectionner un modèle !", @@ -2653,6 +2861,7 @@ "请求超时,请刷新页面后重新发起 GitHub 登录": "Délai dépassé, veuillez actualiser la page puis relancer la connexion GitHub", "请求路径": "Chemin de requête", "请求转换": "Transformation de requête", + "请求配置": "Configuration des requêtes", "请求预扣费额度": "Quota de pré-déduction pour les demandes", "请点击我": "Veuillez cliquer sur moi", "请确认以下设置信息,点击\"初始化系统\"开始配置": "Veuillez confirmer les informations de configuration suivantes, cliquez sur \"Initialiser le système\" pour commencer la configuration", @@ -2672,18 +2881,18 @@ "请至少选择一个渠道": "Veuillez sélectionner au moins un canal", "请输入 API Key,一行一个,格式:APIKey|Region": "Saisissez une API Key par ligne, format : APIKey|Region", "请输入 API Key,格式:APIKey|Region": "Saisissez l'API Key au format : APIKey|Region", - "请输入 Authorization Endpoint": "Veuillez saisir l'Authorization Endpoint", "请输入 AZURE_OPENAI_ENDPOINT,例如:https://docs-test-001.openai.azure.com": "Veuillez saisir AZURE_OPENAI_ENDPOINT, par exemple : https://docs-test-001.openai.azure.com", + "请输入 Authorization Endpoint": "Veuillez saisir l'Authorization Endpoint", "请输入 Client ID": "Veuillez saisir le Client ID", "请输入 Client Secret": "Veuillez saisir le Client Secret", - "请输入 io.net API Key": "Please enter io.net API Key", - "请输入 io.net API Key(敏感信息不显示)": "Please enter io.net API Key (sensitive information not displayed)", "请输入 JSON 格式的 OAuth 凭据,例如:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}": "Veuillez saisir les identifiants OAuth au format JSON, ex. :\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}", "请输入 JSON 格式的密钥内容,例如:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}": "Veuillez saisir le contenu de la clé au format JSON, par exemple :\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}", "请输入 OIDC 的 Well-Known URL": "Veuillez saisir l'URL Well-Known de l'OIDC", "请输入 Slug": "Veuillez saisir le Slug", "请输入 Token Endpoint": "Veuillez saisir le Token Endpoint", "请输入 User Info Endpoint": "Veuillez saisir le User Info Endpoint", + "请输入 io.net API Key": "Please enter io.net API Key", + "请输入 io.net API Key(敏感信息不显示)": "Please enter io.net API Key (sensitive information not displayed)", "请输入6位验证码或8位备用码": "Veuillez saisir le code de vérification à 6 chiffres ou le code de sauvegarde à 8 chiffres", "请输入API地址": "Veuillez saisir l'adresse de l'API", "请输入API地址!": "Veuillez saisir l'adresse de l'API !", @@ -2693,9 +2902,9 @@ "请输入Gotify服务器地址": "Veuillez saisir l'adresse du serveur Gotify", "请输入Gotify服务器地址,例如: https://gotify.example.com": "Veuillez saisir l'adresse du serveur Gotify, par exemple : https://gotify.example.com", "请输入JSON数组,如 [\"model-a\",\"model-b\"]": "Saisissez un tableau JSON, par ex. [\"model-a\",\"model-b\"]", + "请输入URL链接": "Veuillez saisir le lien URL", "请输入Uptime Kuma地址": "Veuillez saisir l'adresse Uptime Kuma", "请输入Uptime Kuma服务地址,如:https://status.example.com": "Veuillez saisir l'adresse du service Uptime Kuma, telle que : https://status.example.com", - "请输入URL链接": "Veuillez saisir le lien URL", "请输入Webhook地址": "Veuillez saisir l'adresse du Webhook", "请输入Webhook地址,例如: https://example.com/webhook": "Veuillez saisir l'URL du Webhook, par exemple : https://example.com/webhook", "请输入你的账户名以确认删除!": "Veuillez saisir votre nom de compte pour confirmer la suppression !", @@ -2720,14 +2929,14 @@ "请输入备注(仅管理员可见)": "Veuillez saisir une remarque (visible uniquement par les administrateurs)", "请输入套餐标题": "Veuillez saisir le titre du plan", "请输入完整的 JSON 格式密钥内容": "Veuillez saisir le contenu complet de la clé au format JSON", - "请输入完整的URL,例如:https://api.openai.com/v1/chat/completions": "Veuillez saisir l'URL complète, par exemple : https://api.openai.com/v1/chat/completions", "请输入完整的URL链接": "Veuillez saisir le lien URL complet", + "请输入完整的URL,例如:https://api.openai.com/v1/chat/completions": "Veuillez saisir l'URL complète, par exemple : https://api.openai.com/v1/chat/completions", "请输入容器名称": "Please enter container name", "请输入密码": "Veuillez saisir un mot de passe", "请输入密钥": "Veuillez saisir la clé", + "请输入密钥!": "Veuillez saisir la clé !", "请输入密钥,一行一个": "Veuillez saisir la clé, une par ligne", "请输入密钥,一行一个,格式:AccessKey|SecretAccessKey|Region": "Saisissez les clés une par ligne, format : AccessKey|SecretAccessKey|Region", - "请输入密钥!": "Veuillez saisir la clé !", "请输入延长时长": "Please enter extension duration", "请输入总额度": "Veuillez saisir le quota total", "请输入您的密码": "Veuillez saisir votre mot de passe", @@ -2758,6 +2967,7 @@ "请输入模型名称,例如: llama3.2, qwen2.5:7b": "Please enter model name, e.g.: llama3.2, qwen2.5:7b", "请输入模型名称,如:gpt-4": "Veuillez saisir le nom du modèle, tel que : gpt-4", "请输入模型描述": "Veuillez saisir la description du modèle", + "请输入汇率": "Veuillez saisir le taux de change", "请输入消息内容...": "Veuillez saisir le contenu du message...", "请输入状态页面Slug": "Veuillez saisir le Slug de la page d'état", "请输入状态页面的Slug,如:my-status": "Veuillez saisir le slug de la page d'état, tel que : my-status", @@ -2779,9 +2989,9 @@ "请输入认证器验证码或备用码": "Veuillez saisir le code de vérification de l'authentificateur ou le code de sauvegarde", "请输入说明": "Veuillez saisir la description", "请输入运行时长": "Please enter runtime duration", - "请输入邮箱!": "Veuillez saisir votre e-mail !", "请输入邮箱地址": "Veuillez saisir l'adresse e-mail", "请输入邮箱验证码!": "Veuillez saisir le code de vérification de l'e-mail !", + "请输入邮箱!": "Veuillez saisir votre e-mail !", "请输入部署名称": "Please enter deployment name", "请输入部署名称以完成二次确认": "Enter deployment name to complete secondary confirmation", "请输入部署地区,例如:us-central1\n支持使用模型映射格式\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}": "Veuillez saisir la région de déploiement, par exemple : us-central1\nPrend en charge l'utilisation du format de mappage de modèle\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}", @@ -2829,9 +3039,6 @@ "调用次数排行": "Classement des appels de modèles", "调试信息": "Informations de débogage", "谨慎": "Prudent", - "警告": "Avertissement", - "警告:启用保活后,如果已经写入保活数据后渠道出错,系统无法重试,如果必须开启,推荐设置尽可能大的Ping间隔": "Avertissement : après l'activation du keep-alive, si une erreur de canal se produit après l'écriture des données de keep-alive, le système ne peut pas réessayer. Si vous devez l'activer, il est recommandé de définir un intervalle Ping aussi grand que possible", - "警告:禁用两步验证将永久删除您的验证设置和所有备用码,此操作不可撤销!": "Avertissement : la désactivation de l'authentification à deux facteurs supprimera définitivement vos paramètres de vérification et tous les codes de sauvegarde. Cette action est irréversible !", "豆包": "Doubao", "账单": "Factures", "账户充值": "Recharge de compte", @@ -2850,6 +3057,7 @@ "购买套餐后即可享受模型权益": "Profitez des avantages du modèle après l'achat d'un plan", "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。": "L'achat ou l'ajout manuel d'un abonnement mettra à niveau vers ce groupe. À l'expiration ou en cas d'invalidation/suppression, il reviendra au groupe précédent. Le retour n'est pas immédiat et prend généralement quelques minutes.", "购买订阅套餐": "Acheter un plan d'abonnement", + "购买订阅获得模型额度/次数": "Acheter un abonnement pour obtenir des quotas/usages de modèles", "费用信息": "Cost Information", "费用预估": "Cost Estimate", "资源消耗": "Consommation de ressources", @@ -2860,6 +3068,7 @@ "跟随日志": "Follow Logs", "跟随系统主题设置": "Suivre le thème du système", "跨分组": "Inter-groupes", + "跨分组特殊倍率": "Cross-Group Special Ratios", "跨分组重试": "Nouvelle tentative inter-groupes", "路径正则": "Regex de chemin", "路径正则(每行一个)": "Regex de chemin (un par ligne)", @@ -2872,9 +3081,12 @@ "输入 OIDC 的 Client ID": "Saisir l'ID client OIDC", "输入 OIDC 的 Token Endpoint": "Saisir le point de terminaison de jeton OIDC", "输入 OIDC 的 Userinfo Endpoint": "Saisir le point de terminaison des informations utilisateur OIDC", + "输入 {{price}} / 1M tokens": "Entrée {{price}} / 1M tokens", "输入IP地址后回车,如:8.8.8.8": "Saisissez l'adresse IP et appuyez sur Entrée, par exemple : 8.8.8.8", "输入JSON对象": "Saisir l'objet JSON", "输入价格": "Prix d'entrée", + "输入价格 {{symbol}}{{price}} / 1M tokens": "Prix d'entrée {{symbol}}{{price}} / 1M tokens", + "输入价格:{{symbol}}{{price}} / 1M tokens": "Prix d'entrée : {{symbol}}{{price}} / 1M tokens", "输入价格:{{symbol}}{{price}} / 1M tokens{{audioPrice}}": "Prix d'entrée : {{symbol}}{{price}} / 1M tokens{{audioPrice}}", "输入你注册的 LinuxDO OAuth APP 的 ID": "Saisir l'ID de votre application OAuth LinuxDO enregistrée", "输入你的账户名{{username}}以确认删除": "Saisissez votre nom de compte{{username}}pour confirmer la suppression", @@ -2884,6 +3096,7 @@ "输入数字": "Saisir un nombre", "输入标签或使用\",\"分隔多个标签": "Saisissez des étiquettes ou utilisez \",\" pour séparer plusieurs étiquettes", "输入模型倍率": "Saisir le ratio de modèle", + "输入模型名称,例如 gpt-4.1": "Saisissez un nom de modèle, par exemple gpt-4.1", "输入每次价格": "Saisir le prix par utilisation", "输入端口后回车,如:80 或 8000-8999": "Saisissez le port et appuyez sur Entrée, par exemple : 80 ou 8000-8999", "输入系统提示词,用户的系统提示词将优先于此设置": "Saisissez l'invite système, l'invite système de l'utilisateur aura la priorité sur ce paramètre", @@ -2901,8 +3114,13 @@ "输出": "Sortie", "输出 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}}) * {{ratioType}} {{ratio}}": "Sortie {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}}", "输出价格": "Prix de sortie", + "输出价格 {{symbol}}{{price}} / 1M tokens": "Prix de sortie {{symbol}}{{price}} / 1M tokens", "输出价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "Prix de sortie : {{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (ratio d'achèvement : {{completionRatio}})", + "输出价格:{{symbol}}{{price}} / 1M tokens": "Prix de sortie : {{symbol}}{{price}} / 1M tokens", + "输出价格:{{symbol}}{{total}} / 1M tokens": "Prix de sortie : {{symbol}}{{total}} / 1M tokens", "输出倍率 {{completionRatio}}": "Ratio de sortie {{completionRatio}}", + "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Sortie : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * ratio de complétion {{completionRatio}} * {{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}}", "边栏设置": "Barre latérale", "过期于": "Expire le", "过期时间": "Date d'expiration", @@ -2916,6 +3134,8 @@ "运行时长(小时)": "Runtime Duration (hours)", "返回修改": "Revenir pour modifier", "返回登录": "Retour à la connexion", + "这个界面默认按价格填写,保存时会自动换算回后端需要的倍率 JSON。": "Cette interface utilise les prix par défaut et les reconvertit automatiquement en JSON de ratios requis par le backend lors de l'enregistrement.", + "这些价格都是可选项,不填也可以。": "Tous ces prix sont optionnels et peuvent être laissés vides.", "这将删除超过 10 分钟未使用的临时缓存文件": "Cela supprimera les fichiers de cache temporaires non utilisés depuis plus de 10 minutes", "这是基础金额,实际扣费 = 基础金额 x 系统分组倍率。": "Ceci est le montant de base. Déduction réelle = montant de base × ratio de groupe système.", "这是重复键中的最后一个,其值将被使用": "Ceci est la dernière clé dupliquée, sa valeur sera utilisée", @@ -2926,18 +3146,24 @@ "违规扣费": "Déduction pour violation", "违规扣费金额": "Montant de la déduction de violation", "连接保活设置": "Maintien connexion", + "连接信息已填入": "Informations de connexion appliquées", "连接已断开": "Connexion interrompue", "连接测试中...": "Testing connection...", + "追加": "Append", "追加到现有密钥": "Ajouter aux clés existantes", "追加模式:将新密钥添加到现有密钥列表末尾": "Mode d'ajout : ajouter les nouvelles clés à la fin de la liste de clés existantes", "追加模式:新密钥将添加到现有密钥列表的末尾": "Mode d'ajout : les nouvelles clés seront ajoutées à la fin de la liste de clés existantes", "追加模板": "Ajouter le modèle", "退出": "Quitter", "退款": "Remboursement", + "适合 MJ / 任务类等按次收费模型。": "Convient aux modèles MJ et autres modèles facturés à la requête.", + "适合同系列模型一起定价,例如把 gpt-5.1 的价格批量同步到 gpt-5.1-high、gpt-5.1-low 等模型。": "Pratique pour tarifer ensemble des variantes d'un même modèle, par exemple synchroniser le prix de gpt-5.1 vers gpt-5.1-high, gpt-5.1-low et autres variantes similaires.", "适用于个人使用的场景,不需要设置模型价格": "Adapté à un usage personnel, pas besoin de définir le prix du modèle.", "适用于为多个用户提供服务的场景": "Adapté aux scénarios où plusieurs utilisateurs sont fournis.", "适用于展示系统功能的场景,提供基础功能演示": "Adapté aux scénarios où les fonctions du système sont affichées, fournissant des démonstrations de fonctionnalités de base.", "适配 -thinking、-thinking-预算数字 和 -nothinking 后缀": "Adapter les suffixes -thinking, -thinking-budget, -nothinking et -low/-medium/-high", + "选择 premium 创建的令牌,调用 API 时费用为 standard 的 50%。": "Tokens created with premium cost 50% of standard when calling APIs.", + "选择使用分组": "Select using group", "选择充值额度": "Sélectionner le montant de la recharge", "选择分组": "Sélectionner un groupe", "选择同步来源": "Sélectionner la source de synchronisation", @@ -2955,6 +3181,7 @@ "选择模型后可一键填充当前选中令牌(或本页第一个令牌)。": "Après avoir sélectionné un modèle, vous pouvez remplir en un clic le jeton actuellement sélectionné (ou le premier jeton de cette page).", "选择模型开始对话": "Sélectionner un modèle pour commencer la conversation", "选择状态": "Select Status", + "选择用户分组": "Select user group", "选择硬件类型": "Select Hardware Type", "选择端点类型": "Sélectionner le type de point de terminaison", "选择系统运行模式": "Sélectionner le mode de fonctionnement du système", @@ -2979,8 +3206,10 @@ "通知类型 (quota_exceed: 额度预警)": "Type de notification (quota_exceed : avertissement de quota)", "通知邮箱": "E-mail de notification", "通知配置": "Notifications", + "通过分组可以实现不同用户等级的差异化定价,例如 VIP 用户享受更低的 API 调用费用。": "Groups enable differentiated pricing for different user tiers. For example, VIP users can enjoy lower API costs.", "通过划转功能将奖励额度转入到您的账户余额中": "Transférez le montant de la récompense sur le solde de votre compte via la fonction de virement", "通过密码注册时需要进行邮箱验证": "La vérification par e-mail est requise lors de l'inscription via mot de passe", + "通过此功能,可以根据用户所在分组,为不同等级的用户展示不同的可选列表。": "This feature allows showing different selectable group lists to users of different tiers.", "通道 ${name} 余额更新成功!": "Le quota du canal ${name} a été mis à jour avec succès !", "通道 ${name} 测试成功,模型 ${model} 耗时 ${time.toFixed(2)} 秒。": "Test du canal ${name} réussi, modèle ${model} a pris ${time.toFixed(2)} secondes.", "通道 ${name} 测试成功,耗时 ${time.toFixed(2)} 秒。": "Test du canal ${name} réussi, a pris ${time.toFixed(2)} secondes.", @@ -3034,6 +3263,7 @@ "配置 Telegram 登录": "Configurer la connexion Telegram", "配置 Turnstile": "Configurer Turnstile", "配置 WeChat Server": "Configurer le serveur WeChat", + "配置后的效果:": "After configuration:", "配置和消息已全部重置": "La configuration et les messages ont été entièrement réinitialisés", "配置套餐的有效时长": "Configurer la durée de validité du plan", "配置如何从用户信息 API 响应中提取用户数据,支持 JSONPath 语法": "Configurer comment extraire les données utilisateur de la réponse API des informations utilisateur, prend en charge la syntaxe JSONPath", @@ -3046,10 +3276,12 @@ "配置有效的 io.net API Key": "Configure a valid io.net API Key", "配置服务器端请求伪造(SSRF)防护,用于保护内网资源安全": "Configurez la protection contre la falsification de requêtes côté serveur (SSRF) pour sécuriser les ressources du réseau interne", "配置模型部署服务提供商的API密钥和启用状态": "Configure the API key and enabled status of the model deployment service provider", + "配置特殊倍率后:": "After configuring special ratios:", "配置登录注册": "Configurer la connexion/l'inscription", "配置自定义 OAuth 提供商,支持 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 协议的身份提供商": "Configurer des fournisseurs OAuth personnalisés, prend en charge GitHub Enterprise, GitLab, Gitea, Nextcloud, Keycloak, ORY et d'autres fournisseurs d'identité compatibles OAuth 2.0", "配置说明": "Instructions de configuration", "配置邮箱域名白名单": "Configurer la liste blanche des domaines e-mail", + "配置:": "Configuration :", "重启部署失败": "Failed to restart deployment", "重命名部署": "Rename Deployment", "重复提交": "Soumission en double", @@ -3093,6 +3325,7 @@ "键为端点类型,值为路径和方法对象": "La clé est le type de point de terminaison, la valeur est le chemin et l'objet de la méthode", "键为请求中的模型名称,值为要替换的模型名称": "La clé est le nom du modèle dans la requête, la valeur est le nom du modèle à remplacer", "键名": "Nom de clé", + "键的前缀 +: 表示添加,-: 表示移除,无前缀表示追加。值为分组描述(移除时填 \"remove\")。": "Key prefix +: means add, -: means remove, no prefix means append. Value is the group description (use \"remove\" for removal).", "镜像仓库密码": "Image Registry Password", "镜像仓库用户名": "Image Registry Username", "镜像仓库配置": "Image Registry Configuration", @@ -3108,15 +3341,15 @@ "限制周期统一使用上方配置的“限制周期”值。": "La période de limite utilise uniformément la valeur \"période de limite\" configurée ci-dessus.", "限流": "Limitation de débit", "限购": "Limite", + "随机": "Aléatoire", + "随机模式": "Mode aléatoire", + "随机种子 (留空为随机)": "Graine aléatoire (laisser vide pour aléatoire)", "隐私政策": "Politique de confidentialité", "隐私政策已更新": "La politique de confidentialité a été mise à jour", "隐私政策更新失败": "Échec de la mise à jour de la politique de confidentialité", "隐私设置": "Confidentialité", "隐藏操作项": "Masquer les actions", "隐藏调试": "Masquer le débogage", - "随机": "Aléatoire", - "随机模式": "Mode aléatoire", - "随机种子 (留空为随机)": "Graine aléatoire (laisser vide pour aléatoire)", "零一万物": "Yi", "需要安全验证": "Vérification de sécurité requise", "需要添加的额度(支持负数)": "Besoin d'ajouter un quota (prend en charge les nombres négatifs)", @@ -3126,14 +3359,21 @@ "非必要,不建议启用模型限制": "Non nécessaire, les restrictions de modèle ne sont pas recommandées", "非流": "Non flux", "音乐预览": "Aperçu musical", + "音频倍率 {{audioRatio}}": "Ratio audio {{audioRatio}}", "音频倍率(仅部分模型支持该计费)": "Ratio audio (seuls certains modèles prennent en charge cette facturation)", "音频提示 {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}": "Invite audio {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + achèvement audio {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}", "音频提示价格:{{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens (音频倍率: {{audioRatio}})": "Prix de l'invite audio : {{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens (ratio audio : {{audioRatio}})", "音频无法播放": "Impossible de lire l'audio", + "音频补全价格": "Prix de complétion audio", "音频补全价格:{{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens (音频补全倍率: {{audioCompRatio}})": "Prix d'achèvement audio : {{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens (ratio d'achèvement audio : {{audioCompRatio}})", + "音频补全价格:{{symbol}}{{price}} / 1M tokens": "Prix de complétion audio : {{symbol}}{{price}} / 1M tokens", "音频补全倍率(仅部分模型支持该计费)": "Ratio d'achèvement audio (seuls certains modèles prennent en charge cette facturation)", + "音频输入价格": "Prix d'entrée audio", + "音频输入价格:{{symbol}}{{price}} / 1M tokens": "Prix d'entrée audio : {{symbol}}{{price}} / 1M tokens", "音频输入相关的倍率设置,键为模型名称,值为倍率": "Paramètres de ratio liés à l'entrée audio, la clé est le nom du modèle, la valeur est le ratio", + "音频输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Entrée audio : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * ratio audio {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "音频输出补全相关的倍率设置,键为模型名称,值为倍率": "Paramètres de ratio liés à l'achèvement de la sortie audio, la clé est le nom du modèle, la valeur est le ratio", + "音频输出:{{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}}", "页脚": "Pied de page", "页面未找到,请检查您的浏览器地址是否正确": "Page non trouvée, veuillez vérifier si l'adresse de votre navigateur est correcte", "顶栏管理": "En-tête", @@ -3146,17 +3386,21 @@ "预填组管理": "Groupe pré-rempli", "预扣": "Pré-déduction", "预览失败": "Échec de l'aperçu", + "预览效果": "Aperçu", "预览更新": "Mise à jour de l'aperçu", "预览模板": "Aperçu du modèle", "预览请求体": "Aperçu du corps de la requête", + "预警阈值必须为正数": "Le seuil d'alerte doit être un nombre positif", "预计结束": "Estimated End", "预设模板": "Modèle prédéfini", - "预警阈值必须为正数": "Le seuil d'alerte doit être un nombre positif", "频率惩罚,减少重复词汇的出现": "Pénalité de fréquence, réduit la répétition des mots", "频率限制的周期(分钟)": "Période de limitation de débit (minutes)", "颜色": "Couleur", + "额外价格项": "Éléments de prix supplémentaires", + "额外设置": "Paramètres supplémentaires", "额度": "Quota", "额度充值": "Recharge de quota", + "额度展示类型": "Type d'affichage du quota", "额度必须大于0": "Le quota doit être supérieur à 0", "额度提醒阈值": "Seuil de rappel de quota", "额度查询接口返回令牌额度而非用户额度": "Affiche le quota de jetons au lieu du quota utilisateur", @@ -3177,161 +3421,30 @@ "验证身份": "Vérifier l'identité", "验证配置错误": "Erreur de configuration de vérification", "高级": "Avancé", + "高级套餐,半价优惠": "Premium plan, 50% off", "高级文本编辑": "Édition de texte avancée", "高级设置": "Paramètres avancés", "高级选项": "Options avancées", "高级配置": "Advanced Configuration", - "核心配置": "Configuration principale", - "创建渠道所需的基本信息": "Informations de base pour créer un canal", - "请求配置": "Configuration des requêtes", - "渠道行为": "Comportement du canal", - "额外设置": "Paramètres supplémentaires", - "上游模型管理": "Gestion des modèles amont", "黑名单": "Liste noire", "默认": "Par défaut", "默认 API 版本": "Version de l'API par défaut", "默认 Responses API 版本,为空则使用上方版本": "Version de l'API Responses par défaut, utilise la version ci-dessus si vide", "默认 TTL(秒)": "TTL par défaut (secondes)", "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)": "Par défaut, le ratio de création de cache 5m est utilisé ; le ratio de création de cache 1h est calculé via une multiplication fixe (actuellement 1.6x)", + "默认使用auto分组": "Default to auto group", "默认使用系统名称": "Le nom du système est utilisé par défaut", "默认助手消息": "Bonjour ! Comment puis-je vous aider aujourd'hui ?", "默认区域": "Région par défaut", "默认区域,如: us-central1": "Région par défaut, ex: us-central1", + "默认情况下,所有用户创建令牌时看到的可选分组列表是一样的(即「用户可选」列勾选的分组)。": "By default, all users see the same selectable group list when creating tokens (i.e., groups with \"User Selectable\" checked).", "默认折叠侧边栏": "Réduire la barre latérale par défaut", "默认测试模型": "Modèle de test par défaut", "默认用户消息": "Bonjour", "默认补全倍率": "Taux de complétion par défaut", - "提示:端点映射仅用于模型广场展示,不会影响模型真实调用。如需配置真实调用,请前往「渠道管理」。": "Remarque : la correspondance des endpoints sert uniquement à l'affichage dans la place de marché des modèles et n'affecte pas l'invocation réelle. Pour configurer l'invocation réelle, veuillez aller dans « Gestion des canaux ».", - "购买订阅获得模型额度/次数": "Acheter un abonnement pour obtenir des quotas/usages de modèles", - "生产环境 RSA 私钥 Base64 (PKCS#8 DER)": "Clé privée RSA Base64 (PKCS#8 DER) de production", - "沙盒环境 RSA 私钥 Base64 (PKCS#8 DER)": "Clé privée RSA Base64 (PKCS#8 DER) de sandbox", - "生产环境 Waffo 公钥 Base64 (X.509 DER)": "Clé publique Waffo Base64 (X.509 DER) de production", - "沙盒环境 Waffo 公钥 Base64 (X.509 DER)": "Clé publique Waffo Base64 (X.509 DER) de sandbox", - "支付方式类型": "Type de méthode de paiement", - "支付方式名称": "Nom de méthode de paiement", - "获取充值配置失败": "Échec de la récupération de la configuration de recharge", - "获取充值配置异常": "Erreur de configuration de recharge", - "分组相关设置": "Paramètres liés aux groupes", - "保存分组相关设置": "Enregistrer les paramètres liés aux groupes", - "此页面仅显示未设置价格或基础倍率的模型,设置后会自动从列表中移出": "Cette page n'affiche que les modèles sans prix ou ratio de base. Après enregistrement, ils seront retirés automatiquement de cette liste.", - "没有未设置定价的模型": "Aucun modèle sans prix", - "当前没有未设置定价的模型": "Il n'y a actuellement aucun modèle sans prix", - "模型计费编辑器": "Éditeur de tarification des modèles", - "价格摘要": "Résumé des prix", - "当前提示": "Informations actuelles", - "这个界面默认按价格填写,保存时会自动换算回后端需要的倍率 JSON。": "Cette interface utilise les prix par défaut et les reconvertit automatiquement en JSON de ratios requis par le backend lors de l'enregistrement.", - "当前未启用,需要时再打开即可。": "Ce champ est actuellement désactivé. Activez-le si nécessaire.", - "下面展示这个模型保存后会写入哪些后端字段,便于和原始 JSON 编辑框保持一致。": "Les champs backend écrits après l'enregistrement sont affichés ci-dessous afin de rester cohérents avec les éditeurs JSON bruts.", - "补全价格已锁定": "Le prix de complétion est verrouillé", - "后端固定倍率:{{ratio}}。该字段仅展示换算后的价格。": "Ratio fixé par le backend : {{ratio}}. Ce champ affiche uniquement le prix converti.", - "这些价格都是可选项,不填也可以。": "Tous ces prix sont optionnels et peuvent être laissés vides.", - "请先开启并填写音频输入价格。": "Activez et renseignez d'abord le prix d'entrée audio.", - "输入模型名称,例如 gpt-4.1": "Saisissez un nom de modèle, par exemple gpt-4.1", - "当前模型同时存在按次价格和倍率配置,保存时会按当前计费方式覆盖。": "Ce modèle possède actuellement à la fois une tarification par requête et une configuration par ratio. L'enregistrement écrasera selon le mode de facturation actuel.", - "当前模型存在未显式设置输入倍率的扩展倍率;填写输入价格后会自动换算为价格字段。": "Ce modèle contient des ratios étendus sans ratio d'entrée explicite. Après saisie du prix d'entrée, ils seront convertis automatiquement en champs de prix.", - "按量计费下需要先填写输入价格,才能保存其它价格项。": "En facturation au volume, il faut d'abord renseigner le prix d'entrée avant d'enregistrer les autres prix.", - "填写音频补全价格前,需要先填写音频输入价格。": "Renseignez d'abord le prix d'entrée audio avant de définir le prix de complétion audio.", - "模型 {{name}} 缺少输入价格,无法计算补全/缓存/图片/音频价格对应的倍率": "Le modèle {{name}} n'a pas de prix d'entrée, impossible de calculer les ratios correspondants pour la complétion, le cache, les images et l'audio.", - "模型 {{name}} 缺少音频输入价格,无法计算音频补全倍率": "Le modèle {{name}} n'a pas de prix d'entrée audio, impossible de calculer le ratio de complétion audio.", - "批量应用当前模型价格": "Appliquer en lot le prix du modèle actuel", - "请先选择一个作为模板的模型": "Veuillez d'abord choisir un modèle comme modèle de référence", - "请先勾选需要批量设置的模型": "Veuillez d'abord sélectionner les modèles à configurer en lot", - "已将模型 {{name}} 的价格配置批量应用到 {{count}} 个模型": "La configuration tarifaire du modèle {{name}} a été appliquée à {{count}} modèles en lot", - "将把当前编辑中的模型 {{name}} 的价格配置,批量应用到已勾选的 {{count}} 个模型。": "La configuration tarifaire du modèle actuellement édité {{name}} sera appliquée aux {{count}} modèles sélectionnés.", - "适合同系列模型一起定价,例如把 gpt-5.1 的价格批量同步到 gpt-5.1-high、gpt-5.1-low 等模型。": "Pratique pour tarifer ensemble des variantes d'un même modèle, par exemple synchroniser le prix de gpt-5.1 vers gpt-5.1-high, gpt-5.1-low et autres variantes similaires.", - "已勾选": "Sélectionné", - "当前编辑": "En cours d'édition", - "已勾选 {{count}} 个模型": "{{count}} modèles sélectionnés", - "计费方式": "Mode de facturation", - "未设置价格": "Prix non défini", - "保存预览": "Aperçu avant enregistrement", - "基础价格": "Prix de base", - "扩展价格": "Prix supplémentaires", - "额外价格项": "Éléments de prix supplémentaires", - "补全价格": "Prix de complétion", - "缓存读取价格": "Prix de lecture du cache d'entrée", - "缓存创建价格": "Prix de création du cache d'entrée", - "图片输入价格": "Prix d'entrée image", - "音频输入价格": "Prix d'entrée audio", - "音频补全价格": "Prix de complétion audio", - "适合 MJ / 任务类等按次收费模型。": "Convient aux modèles MJ et autres modèles facturés à la requête.", - "该模型补全倍率由后端固定为 {{ratio}}。补全价格不能在这里修改。": "Le ratio de complétion de ce modèle est fixé à {{ratio}} par le backend. Le prix de complétion ne peut pas être modifié ici.", - "计费显示模式": "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", - "缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Prix de création du cache : {{symbol}}{{price}} / 1M tokens", - "缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Prix de création du cache {{symbol}}{{price}} / 1M tokens", - "5m缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Prix de création du cache 5m : {{symbol}}{{price}} / 1M tokens", - "5m缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Prix de création du cache 5m {{symbol}}{{price}} / 1M tokens", - "1h缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Prix de création du cache 1h : {{symbol}}{{price}} / 1M tokens", - "1h缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Prix de création du cache 1h {{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 image {{symbol}}{{price}} / 1M tokens", - "输入价格 {{symbol}}{{price}} / 1M tokens": "Prix d'entrée {{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", - "文件搜索调用 {{fileSearchCallCount}} 次": "Recherche de fichier appelée {{fileSearchCallCount}} fois", - "图片倍率 {{imageRatio}}": "Ratio d'image {{imageRatio}}", - "音频倍率 {{audioRatio}}": "Ratio audio {{audioRatio}}", - "普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Entrée standard : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "缓存输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Entrée en cache : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * ratio du cache {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 图片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Entrée d'image : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * ratio d'image {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Entrée audio : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * ratio audio {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Sortie : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * ratio de complétion {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "Web 搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Recherche Web : {{count}} / 1K * prix unitaire {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "文件搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Recherche de fichier : {{count}} / 1K * prix unitaire {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片生成:1 次 * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Génération d'image : 1 appel * prix unitaire {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "合计:{{total}}": "Total : {{total}}", - "模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},音频倍率 {{audioRatio}},音频补全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}": "Ratio du modèle {{modelRatio}}, ratio de complétion {{completionRatio}}, ratio audio {{audioRatio}}, ratio de complétion audio {{audioCompletionRatio}}, {{cachePart}}{{ratioType}} {{ratio}}", - "文字输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Sortie texte : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * ratio de complétion {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输出:{{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}}", - "缓存读取:{{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", - "{{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", - "复制密钥": "Copier la clé", - "复制连接信息": "Copier les infos de connexion", - "检测到剪贴板中的连接信息": "Informations de connexion détectées dans le presse-papiers", - "自动填入": "Remplir auto", - "忽略": "Ignorer", - "从剪贴板粘贴配置": "Coller la config", - "剪贴板中未检测到连接信息": "Aucune info de connexion trouvée dans le presse-papiers", - "连接信息已填入": "Informations de connexion appliquées", - "无法读取剪贴板": "Impossible de lire le presse-papiers" + "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(Actuellement, seule l'interface Epay est prise en charge, l'adresse du serveur ci-dessus est utilisée par défaut comme adresse de rappel !)", + ",当前无生效订阅,将自动使用钱包": ", aucun abonnement actif, le portefeuille sera utilisé automatiquement.", + ",时间:": ", time:", + ",点击更新": ", cliquez sur Mettre à jour" } } diff --git a/web/src/i18n/locales/ja.json b/web/src/i18n/locales/ja.json index 73ba69e5..a41e3c2d 100644 --- a/web/src/i18n/locales/ja.json +++ b/web/src/i18n/locales/ja.json @@ -9,41 +9,40 @@ " 吗?": "に変更しますか?", " 秒": " 秒", " 秒。": " 秒。", - ",当前无生效订阅,将自动使用钱包": "、有効なサブスクリプションがないため、自動的にウォレットを使用します", - ",时间:": "、時間:", - ",点击更新": "、クリックして更新してください", - "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(現在、Epay APIのみに対応しています。デフォルトで、上記のサーバーURLがコールバックアドレスとして使用されます。)", + "$/1M tokens": "$/1M tokens", "(筛选后显示 {{count}} 条)_other": "(Showing {{count}} items after filtering)", "(输入 {{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}}", - "[最多请求次数]和[最多请求完成次数]的最大值为2147483647。": "[最大リクエスト数]と[最大成功リクエスト数]の最大値は2147483647です", - "[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。": "[最大リクエスト数]は0以上、[最大成功リクエスト数]は1以上である必要があります", - "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", - "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", - "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", - "{{name}} ID": "{{name}} ID", - "{{ratioType}} {{ratio}}": "{{ratioType}} {{ratio}}", - "• 视频服务商的跨域限制": "• Cross-origin limitations from the video provider", - "• 防盗链保护机制": "• Hotlink protection mechanisms", - "• 需要特定的请求头或认证": "• Specific headers or authentication are required", - "© {{currentYear}}": "© {{currentYear}}", - "| 基于": "| ベース: ", - "$/1M tokens": "$/1M tokens", + "(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}": "(入力 {{nonImageInput}} tokens + 画像入力 {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}", "0 - 最低": "0 - 最低", "0 表示不限": "0 は無制限を意味します", "0.002-1之间的小数": "0.002~1の小数", "0.1以上的小数": "0.1以上の小数", "1) 点击「打开授权页面」完成登录;2) 浏览器会跳转到 localhost(页面打不开也没关系);3) 复制地址栏完整 URL 粘贴到下方;4) 点击「生成并填入」。": "1) 「認可ページを開く」をクリックしてログインを完了します。2) ブラウザがlocalhostにリダイレクトされます(ページが開かなくても問題ありません)。3) アドレスバーの完全なURLをコピーして下に貼り付けます。4)「生成して入力」をクリックします。", + "1. 管理员在此创建分组并设置倍率": "1. 管理者がここでグループを作成しレートを設定", "10 - 最高": "10 - 最高", + "1h缓存创建 {{price}} / 1M tokens": "1h キャッシュ作成 {{price}} / 1M tokens", + "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "1h キャッシュ作成 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "1h cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", + "1h缓存创建价格 {{symbol}}{{price}} / 1M tokens": "1h キャッシュ作成価格 {{symbol}}{{price}} / 1M tokens", "1h缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (1h缓存创建倍率: {{cacheCreationRatio1h}})": "1h cache creation price: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (1h cache creation ratio: {{cacheCreationRatio1h}})", + "1h缓存创建价格:{{symbol}}{{price}} / 1M tokens": "1h キャッシュ作成価格:{{symbol}}{{price}} / 1M tokens", + "1h缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 1h缓存创建倍率 {{cacheCreationRatio1h}} * {{ratioType}} {{ratio}} = {{amount}}": "1h キャッシュ作成: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * 1h キャッシュ作成倍率 {{cacheCreationRatio1h}} * {{ratioType}} {{ratio}} = {{amount}}", "2 - 低": "2 - 低", + "2. 管理员在用户管理中将用户分配到对应分组(如 vip)": "2. 管理者がユーザー管理でユーザーをグループに割り当て(例:vip)", "2025年5月10日后添加的渠道,不需要再在部署的时候移除模型名称中的\".\"": "2025年5月10日以降に追加されたチャネルでは、デプロイ時にモデル名から「.」を削除する必要はなくなりました。", + "3. 用户创建令牌时,下拉菜单中出现勾选了「用户可选」的分组": "3. トークン作成時、「ユーザー選択可」がチェックされたグループがドロップダウンに表示", "360智脑": "360智脑", + "4. 令牌使用所选分组的倍率进行计费": "4. トークンは選択したグループのレートで課金", "5 - 正常(默认)": "5 - 正常(デフォルト)", + "5m缓存创建 {{price}} / 1M tokens": "5m キャッシュ作成 {{price}} / 1M tokens", + "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "5m キャッシュ作成 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "5m cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", + "5m缓存创建价格 {{symbol}}{{price}} / 1M tokens": "5m キャッシュ作成価格 {{symbol}}{{price}} / 1M tokens", "5m缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (5m缓存创建倍率: {{cacheCreationRatio5m}})": "5m cache creation price: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (5m cache creation ratio: {{cacheCreationRatio5m}})", + "5m缓存创建价格:{{symbol}}{{price}} / 1M tokens": "5m キャッシュ作成価格:{{symbol}}{{price}} / 1M tokens", + "5m缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 5m缓存创建倍率 {{cacheCreationRatio5m}} * {{ratioType}} {{ratio}} = {{amount}}": "5m キャッシュ作成: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * 5m キャッシュ作成倍率 {{cacheCreationRatio5m}} * {{ratioType}} {{ratio}} = {{amount}}", "8 - 高": "8 - 高", "AGPL v3.0协议": "AGPL v3.0ライセンス", "AI 对话": "AIチャット", @@ -65,41 +64,36 @@ "API地址": "ベースURL", "API渠道配置": "APIチャネル設定", "API端点": "APIエンドポイント", - "Authorization callback URL 填": "Authorization callback URLを入力してください", "Authorization Endpoint": "Authorization Endpoint", - "auto分组调用链路": "自動グループ連携", + "Authorization callback URL 填": "Authorization callback URLを入力してください", "Bark推送URL": "BarkプッシュURL", "Bark推送URL必须以http://或https://开头": "BarkプッシュURLは、http://またはhttps://で始まることが必須です", "Bark通知": "Bark通知", "Basic Auth 头": "Basic Auth ヘッダー", + "CPU 使用率超过此值时拒绝请求": "CPU使用率がこの値を超えた場合にリクエストを拒否", + "CPU 阈值 (%)": "CPUしきい値 (%)", "Cached tokens": "Cached tokens", "Cached tokens 占比口径由后端返回:Claude 语义按 cached/(prompt+cached),其余按 cached/prompt。": "キャッシュトークン比率はバックエンドから返されます:Claudeのセマンティクスはcached/(prompt+cached)、その他はcached/promptで計算されます。", "Changing batch type to:": "Changing batch type to:", "ChatCompletions→Responses 兼容配置": "ChatCompletions→Responses 互換設定", "ChatCompletions→Responses 兼容配置(Beta)": "ChatCompletions→Responses 互換設定(ベータ)", "Claude 强制 beta=true": "Claude 強制 beta=true", + "Claude会在原有请求头基础上追加这些值,不会覆盖已有同名请求头;重复值会自动忽略。": "Claude は既存のリクエストヘッダーにこれらの値を追加します。既存の同名ヘッダーは上書きされず、重複した値は自動的に無視されます。", "Claude思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Claude思考モード:BudgetTokens = MaxTokens * BudgetTokensの割合", "Claude设置": "Claude設定", "Claude请求头覆盖": "Claudeリクエストヘッダーの上書き", "Claude请求头追加": "Claudeリクエストヘッダーの追加", - "Claude会在原有请求头基础上追加这些值,不会覆盖已有同名请求头;重复值会自动忽略。": "Claude は既存のリクエストヘッダーにこれらの値を追加します。既存の同名ヘッダーは上書きされず、重複した値は自動的に無視されます。", "Client ID": "Client ID", "Client Secret": "Client Secret", "Codex 授权": "Codex 認可", "Codex 渠道不支持批量创建": "Codexチャネルはバッチ作成をサポートしていません", - "common.changeLanguage": "common.changeLanguage", "Completion tokens": "Completion tokens", "Configuration": "Configuration", - "context_int/context_string 从请求上下文读取;gjson 从入口请求的 JSON body 按 gjson path 读取。": "context_int/context_stringはリクエストコンテキストから読み取り、gjsonはエントリリクエストのJSON bodyからgjsonパスで読み取ります。", - "CPU 使用率超过此值时拒绝请求": "CPU使用率がこの値を超えた場合にリクエストを拒否", - "CPU 阈值 (%)": "CPUしきい値 (%)", "Creem API 密钥,敏感信息不显示": "Creem API key, sensitive information not displayed", "Creem Setting Tips": "Creem only supports preset fixed-amount products. These products and their prices need to be created and configured in advance on the Creem website, so custom dynamic amount top-ups are not supported. Configure the product name and price on Creem, obtain the Product Id, and then fill it in for the product below. Set the top-up amount and display price for this product in the new API.", "Creem 介绍": "Creem is the payment partner you always deserved, we strive for simplicity and straightforwardness on our APIs.", "Creem 充值": "Creem Recharge", "Creem 设置": "Creem Setting", - "default为默认设置,可单独设置每个分类的安全等级": "「default」はデフォルト設定で、各分類のセキュリティレベルを個別に設定できます", - "default为默认设置,可单独设置每个模型的版本": "「default」はデフォルト設定で、各モデルのバージョンを個別に設定できます", "Dify渠道只适配chatflow和agent,并且agent不支持图片!": "Difyチャネルはchatflowとagentのみに対応しており、agentは画像のサポート対象外です", "Discord": "Discord", "Discord Client ID": "Discord Client ID", @@ -109,10 +103,11 @@ "Discovery scopes": "Discovery scopes", "Discovery 建议 scopes:": "推奨Discovery scopes:", "EUR (欧元)": "EUR (Euro)", - "false": "false", "GC 已执行": "GC実行済み", "GC 执行失败": "GC実行失敗", "GC 次数": "GC回数", + "GPU/容器": "GPU/Container", + "GPU数量": "Number of GPUs", "Gemini安全设置": "Geminiセキュリティ設定", "Gemini思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Gemini思考モード:BudgetTokens = MaxTokens * BudgetTokensの割合", "Gemini思考适配设置": "Gemini思考モード設定", @@ -127,14 +122,10 @@ "Gotify服务器地址": "GotifyサーバーURL", "Gotify服务器地址必须以http://或https://开头": "GotifyサーバーURLは、http://またはhttps://で始まることが必須です", "Gotify通知": "Gotify通知", - "GPU/容器": "GPU/Container", - "GPU数量": "Number of GPUs", "Grok设置": "Grok設定", "Haiku 模型": "Haikuモデル", "Homepage URL 填": "ホームページURLを入力してください", "ID": "ID", - "include_obfuscation 用于控制 Responses 流混淆字段。默认关闭以避免客户端关闭该安全保护": "include_obfuscationはResponsesストリームの難読化フィールドを制御します。クライアントがこのセキュリティ保護を無効にするのを防ぐため、デフォルトで無効です", - "inference_geo 字段用于控制 Claude 数据驻留推理区域。默认关闭以避免未经授权透传地域信息": "inference_geoフィールドはClaudeのデータ常駐推論リージョンを制御します。未承認の地理情報のパススルーを防ぐため、デフォルトで無効です", "IP": "IP", "IP白名单": "IP Whitelist", "IP白名单(支持CIDR表达式)": "IPホワイトリスト(CIDR表記に対応)", @@ -144,6 +135,7 @@ "JSON 已格式化": "JSONフォーマット済み", "JSON 文本": "JSONテキスト", "JSON 无效": "無効なJSON", + "JSON 格式参考": "JSONリファレンス", "JSON 模式": "JSONモード", "JSON 模式支持手动输入或上传服务账号 JSON": "JSONモードは、サービスアカウントJSONの手動入力またはアップロードに対応しています。", "JSON格式密钥,请确保格式正确": "JSON形式のAPIキー。正しい形式であることをご確認ください。", @@ -161,8 +153,8 @@ "LinuxDO": "LinuxDO", "LinuxDO ID": "LinuxDO ID", "Logo 图片地址": "ロゴ画像URL", - "Midjourney 任务记录": "Midjourneyタスク履歴", "MIT许可证": "MITライセンス", + "Midjourney 任务记录": "Midjourneyタスク履歴", "New API项目仓库地址:": "New APIプロジェクトリポジトリ:", "NewAPI 默认不会将入口请求的 User-Agent 透传到上游渠道;该条件仅用于识别访问本站点的客户端。": "NewAPIはデフォルトでは入力リクエストのUser-Agentを上流チャネルにパススルーしません。この条件はこのサイトにアクセスするクライアントの識別にのみ使用されます。", "OAuth Client ID": "OAuth Client ID", @@ -173,6 +165,7 @@ "Ollama 模型管理": "Ollama Model Management", "Ollama 版本信息": "Ollama Version Info", "Opus 模型": "Opusモデル", + "POST 参数": "POSTパラメータ", "Passkey": "Passkey", "Passkey 已解绑": "Passkeyが連携解除されました。", "Passkey 已重置": "Passkeyがリセットされました。", @@ -181,53 +174,49 @@ "Passkey 注册成功": "Passkeyの登録に成功しました", "Passkey 登录": "Passkeyログイン", "Ping间隔(秒)": "Ping間隔(秒)", - "POST 参数": "POSTパラメータ", - "price_xxx 的商品价格 ID,新建产品后可获得": "price_xxx の料金ID。新規製品の作成後に取得できます", "Prompt cache hit tokens": "Prompt cache hit tokens", "Prompt tokens": "Prompt tokens", "Reasoning Effort": "Reasoning Effort", "Request ID": "Request ID", - "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "safety_identifierフィールドは、OpenAIが利用ポリシーに違反する可能性のあるアプリユーザーを特定するために使用されます。ユーザーのプライバシーを保護するため、デフォルトでは無効です", - "Scopes(可选)": "Scopes(オプション)", - "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "service_tierフィールドはサービス階層の指定に使用されます。パススルーを許可すると実際の課金額が想定を上回る場合があるため、追加料金を避けるためにデフォルトでは無効になっています", - "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "sk_xxx または rk_xxx のStripe APIキー。機密情報は表示されません", "SMTP 发送者邮箱": "SMTP 送信元メールアドレス", "SMTP 服务器地址": "SMTP サーバーURL", "SMTP 端口": "SMTP ポート", "SMTP 访问凭证": "SMTP 認証情報", "SMTP 账户": "SMTP アカウント", - "Sonnet 模型": "Sonnetモデル", "SSE 事件": "SSEイベント", "SSE数据流": "SSEデータストリーム", "SSRF防护开关详细说明": "SSRF保護スイッチの詳細説明", "SSRF防护设置": "SSRF保護設定", "SSRF防护详细说明": "SSRF保護の詳細説明", - "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "storeフィールドは、製品の評価と最適化のためにOpenAIがリクエストデータを保存することを許可します。デフォルトでは無効です。有効にすると、Codexが正常に利用できなくなる場合があります", + "Scopes(可选)": "Scopes(オプション)", + "Sonnet 模型": "Sonnetモデル", "Stripe 设置": "Stripe 設定", "Stripe/Creem 商品ID(可选)": "Stripe/Creem 商品ID(任意)", "Stripe/Creem 需在第三方平台创建商品并填入 ID": "Stripe/Creem の商品は外部プラットフォームで作成し、ID を入力してください", + "TTL(秒)": "TTL(秒)", + "TTL(秒,0 表示默认)": "TTL(秒、0はデフォルト)", "Telegram": "Telegram", "Telegram Bot Token": "Telegram Bot Token", "Telegram Bot 名称": "Telegram Bot 名称", "Telegram ID": "Telegram ID", "Token Endpoint": "Token Endpoint", - "token 会按倍率换算成“额度/次数”,请求结束后再做差额结算(补扣/返还)。": "トークンは比率に基づいて「クォータ/回数」に換算されます。リクエスト完了後に差額精算(追加控除/返金)が行われます。", "Total tokens": "Total tokens", - "true": "true", - "TTL(秒,0 表示默认)": "TTL(秒、0はデフォルト)", - "TTL(秒)": "TTL(秒)", "Turnstile Secret Key": "Turnstile Secret Key", "Turnstile Site Key": "Turnstile Site Key", - "Unix时间戳": "Unixタイムスタンプ", - "Uptime Kuma地址": "Uptime Kumaアドレス", - "Uptime Kuma监控分类管理,可以配置多个监控分类用于服务状态展示(最多20个)": "Uptime Kumaの監視分類管理:サービスステータス表示用に、複数の監視分類を設定できます(最大20個)", "URL 标识,只能包含小写字母、数字和连字符": "URL識別子、小文字、数字、ハイフンのみ使用可能", "URL链接": "URL", "USD (美元)": "USD (US Dollar)", + "Unix时间戳": "Unixタイムスタンプ", + "Uptime Kuma地址": "Uptime Kumaアドレス", + "Uptime Kuma监控分类管理,可以配置多个监控分类用于服务状态展示(最多20个)": "Uptime Kumaの監視分類管理:サービスステータス表示用に、複数の監視分類を設定できます(最大20個)", "User Info Endpoint": "User Info Endpoint", "User-Agent include(每行一个,可不写)": "User-Agent include(1行に1つ、オプション)", "Value 正则": "値の正規表現", "Vertex AI 不支持 functionResponse.id 字段,开启后将自动移除该字段": "Vertex AIはfunctionResponse.idフィールドをサポートしていません。有効にすると、このフィールドは自動的に削除されます", + "WeChat Server 服务器地址": "WeChat Server サーバーURL", + "WeChat Server 访问凭证": "WeChatサーバー認証情報", + "Web 搜索调用 {{webSearchCallCount}} 次": "Web 検索呼び出し {{webSearchCallCount}} 回", + "Web 搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Web 検索: {{count}} / 1K * 単価 {{price}} * {{ratioType}} {{ratio}} = {{amount}}", "Webhook 密钥": "Webhook Secret", "Webhook 签名密钥": "Webhook署名シークレット", "Webhook地址": "Webhook URL", @@ -235,49 +224,89 @@ "Webhook请求结构说明": "Webhookリクエスト構造の説明", "Webhook通知": "Webhook通知", "Web搜索价格:{{symbol}}{{price}} / 1K 次": "Web検索料金:{{symbol}}{{price}} / 1K回", - "WeChat Server 服务器地址": "WeChat Server サーバーURL", - "WeChat Server 访问凭证": "WeChatサーバー認証情報", "Well-Known URL": "Well-Known URL", "Well-Known URL 必须以 http:// 或 https:// 开头": "Well-Known URLは、http://またはhttps://で始まることが必須です", - "whsec_xxx 的 Webhook 签名密钥,敏感信息不显示": "whsec_xxx のWebhook署名シークレット。機密情報は表示されません", "Worker地址": "Workerアドレス", "Worker密钥": "WorkerAPIキー", + "[最多请求次数]和[最多请求完成次数]的最大值为2147483647。": "[最大リクエスト数]と[最大成功リクエスト数]の最大値は2147483647です", + "[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。": "[最大リクエスト数]は0以上、[最大成功リクエスト数]は1以上である必要があります", + "auto分组调用链路": "自動グループ連携", + "common.changeLanguage": "common.changeLanguage", + "context_int/context_string 从请求上下文读取;gjson 从入口请求的 JSON body 按 gjson path 读取。": "context_int/context_stringはリクエストコンテキストから読み取り、gjsonはエントリリクエストのJSON bodyからgjsonパスで読み取ります。", + "default 和 vip 只能由管理员在「用户管理」中分配给用户。适用于按用户等级定价、内部测试等不希望用户自主选择的场景。": "default と vip は管理者が「ユーザー管理」で割り当てるのみ可能です。ユーザー等級別の料金設定やテストなど、ユーザーに自主選択させたくないシーンに適しています。", + "default为默认设置,可单独设置每个分类的安全等级": "「default」はデフォルト設定で、各分類のセキュリティレベルを個別に設定できます", + "default为默认设置,可单独设置每个模型的版本": "「default」はデフォルト設定で、各モデルのバージョンを個別に設定できます", + "false": "false", + "include_obfuscation 用于控制 Responses 流混淆字段。默认关闭以避免客户端关闭该安全保护": "include_obfuscationはResponsesストリームの難読化フィールドを制御します。クライアントがこのセキュリティ保護を無効にするのを防ぐため、デフォルトで無効です", + "inference_geo 字段用于控制 Claude 数据驻留推理区域。默认关闭以避免未经授权透传地域信息": "inference_geoフィールドはClaudeのデータ常駐推論リージョンを制御します。未承認の地理情報のパススルーを防ぐため、デフォルトで無効です", + "price_xxx 的商品价格 ID,新建产品后可获得": "price_xxx の料金ID。新規製品の作成後に取得できます", + "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "safety_identifierフィールドは、OpenAIが利用ポリシーに違反する可能性のあるアプリユーザーを特定するために使用されます。ユーザーのプライバシーを保護するため、デフォルトでは無効です", + "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "service_tierフィールドはサービス階層の指定に使用されます。パススルーを許可すると実際の課金額が想定を上回る場合があるため、追加料金を避けるためにデフォルトでは無効になっています", + "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "sk_xxx または rk_xxx のStripe APIキー。機密情報は表示されません", + "standard 已被移除,vip 用户看不到": "standard は削除され、vipユーザーには表示されません", + "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "storeフィールドは、製品の評価と最適化のためにOpenAIがリクエストデータを保存することを許可します。デフォルトでは無効です。有効にすると、Codexが正常に利用できなくなる場合があります", + "token 会按倍率换算成“额度/次数”,请求结束后再做差额结算(补扣/返还)。": "トークンは比率に基づいて「クォータ/回数」に換算されます。リクエスト完了後に差額精算(追加控除/返金)が行われます。", + "true": "true", + "whsec_xxx 的 Webhook 签名密钥,敏感信息不显示": "whsec_xxx のWebhook署名シークレット。機密情報は表示されません", + "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", + "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", + "{{name}} ID": "{{name}} ID", + "{{ratioType}} {{ratio}}": "{{ratioType}} {{ratio}}", + "{{ratioType}} {{ratio}}x": "{{ratioType}} {{ratio}}x", + "| 基于": "| ベース: ", + "© {{currentYear}}": "© {{currentYear}}", + "• 视频服务商的跨域限制": "• Cross-origin limitations from the video provider", + "• 防盗链保护机制": "• Hotlink protection mechanisms", + "• 需要特定的请求头或认证": "• Specific headers or authentication are required", + "「用户可选」决定用户创建令牌时能否自主选择该分组。未勾选的分组只能由管理员在后台分配给用户,不会出现在用户的令牌创建页面中。": "「ユーザー選択可」はトークン作成時にユーザーがこのグループを選択できるかを制御します。未チェックのグループは管理者のみが割り当て可能で、トークン作成画面には表示されません。", "一个月": "1ヶ月", "一天": "1日", "一小时": "1時間", "一次调用消耗多少刀,优先级大于模型倍率": "1コールあたりの消費ドル額。モデル倍率より優先されます", - "一行一个,不区分大小写": "1行に1つずつ(大文字・小文字の区別なし)", "一行一个屏蔽词,不需要符号分割": "NGワードを1行に1つずつ入力してください。記号による区切りは不要です", + "一行一个,不区分大小写": "1行に1つずつ(大文字・小文字の区別なし)", "一键填充到 FluentRead": "FluentReadにクイック入力", + "三种操作的区别:": "3つの操作の違い:", "上一个表单块": "前のフォームブロック", "上一步": "前へ", "上次保存: ": "最終保存: ", "上游倍率同步": "アップストリーム倍率同期", + "上游模型管理": "上流モデル管理", "上游返回": "Upstream response", "下一个表单块": "次のフォームブロック", "下一步": "次へ", "下午好": "こんにちは", "下载日志": "Download Logs", + "下面展示这个模型保存后会写入哪些后端字段,便于和原始 JSON 编辑框保持一致。": "保存後にこのモデルでどのバックエンド項目に書き込まれるかを以下に表示します。元の JSON エディタとの整合確認に便利です。", + "不会出现": "表示されません", "不再提醒": "今後表示しない", + "不勾选用户可选": "ユーザー選択不可", "不升级": "アップグレードしない", + "不变": "変更なし", "不同用户分组的价格信息": "ユーザーグループ別の料金情報", "不填则为模型列表第一个": "未入力の場合、モデルリストの先頭モデルが使用されます", "不建议使用": "非推奨", "不支持": "サポート対象外", "不是合法的 JSON 字符串": "は有効なJSON文字列ではありません", "不更改": "変更なし", + "不配置特殊倍率时:": "特殊レートを設定しない場合:", + "不配置规则时,所有用户看到的下拉框一样:": "ルール未設定時、全ユーザーに同じドロップダウンが表示されます:", "不重置": "リセットしない", + "不重试": "リトライしない", "不限": "無制限", "不限制": "制限なし", "与本地相同": "ローカルと同じ", "专属倍率": "専用倍率", + "专属分组": "専用グループ", + "两个分组都勾选了「用户可选」,所以用户创建令牌时可以看到这两个选项:": "両方のグループに「ユーザー選択可」がチェックされているため、トークン作成時にこの2つが表示されます:", "两次输入的密码不一致": "パスワードが一致しません", "两次输入的密码不一致!": "パスワードが一致しません", "两步验证": "2要素認証", - "两步验证(2FA)为您的账户提供额外的安全保护。启用后,登录时需要输入密码和验证器应用生成的验证码。": "2要素認証(2FA)は、アカウントのセキュリティを強化する追加の保護機能です。有効にすると、ログイン時にパスワードと、認証アプリによって生成された認証コードの入力が必要になります。", "两步验证启用成功!": "2要素認証の有効化に成功しました", "两步验证已禁用": "2要素認証は無効になっています", "两步验证设置": "2要素認証設定", + "两步验证(2FA)为您的账户提供额外的安全保护。启用后,登录时需要输入密码和验证器应用生成的验证码。": "2要素認証(2FA)は、アカウントのセキュリティを強化する追加の保護機能です。有効にすると、ログイン時にパスワードと、認証アプリによって生成された認証コードの入力が必要になります。", "个": "個", "个GPU": " GPUs", "个人中心": "アカウント", @@ -295,6 +324,7 @@ "个生效中": "件有効中", "个部署吗?此操作不可逆。": " deployments? This operation cannot be undone.", "中午好": "こんにちは", + "为 vip 用户配置规则:": "vipユーザーのルールを設定:", "为一个 JSON 对象,例如:{\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}": "JSONオブジェクト形式で入力。例:{\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}", "为一个 JSON 数组,例如:[10, 20, 50, 100, 200, 500]": "JSON配列形式で入力。例:[10, 20, 50, 100, 200, 500]", "为一个 JSON 文本": "JSON形式で入力", @@ -309,7 +339,9 @@ "为一个 JSON 文本,键为组名称,值为倍率": "JSON形式で入力。キー:グループ名、値:倍率", "为了保护账户安全,请验证您的两步验证码。": "アカウント保護のため、2要素認証コードを入力してください。", "为了保护账户安全,请验证您的身份。": "アカウント保護のため、本人確認を行ってください。", + "为什么 default 不勾选「用户可选」?": "なぜdefaultに「ユーザー選択可」をチェックしないのか?", "为保证匹配准确,请确保客户端直连本站点(避免反向代理/网关改写 User-Agent)。": "正確なマッチングを保証するため、クライアントがこのサイトに直接接続していることを確認してください(リバースプロキシ/ゲートウェイによるUser-Agentの書き換えを避けてください)。", + "为特定用户分组配置可用分组的增减规则。「添加」为该分组新增可用分组,「移除」移除默认可用分组,「追加」直接追加分组": "特定のユーザーグループに対して利用可能グループの追加・削除ルールを設定します。「追加」は新しいグループを追加、「削除」はデフォルトのグループを削除、「付加」は直接付加します", "为空则默认使用服务器地址,多个 Origin 用逗号分隔,例如 https://newapi.pro,https://newapi.com ,注意不能携带[],需使用https": "空欄の場合は、デフォルトのサーバーURLが使用されます。複数のオリジンはカンマで区切ってください(例:https://newapi.pro,https://newapi.com)。ご注意:[]は含めず、httpsを使用してください。", "主模型": "メインモデル", "主页链接填": "ホームページURLを入力してください。", @@ -320,6 +352,8 @@ "产品名称": "Product Name", "产品配置": "Product Configuration", "产品配置错误,请联系管理员": "Product configuration error, please contact the administrator", + "享受 8 折": "20%オフ", + "什么是分组?": "グループとは?", "仅为使用OpenAI格式的Gemini/Vertex渠道填充thoughtSignature": "OpenAI形式を利用するGemini/VertexチャネルにのみthoughtSignatureを付与します", "仅会覆盖你勾选的字段,未勾选的字段保持本地不变。": "チェックを入れたフィールドのみが上書きされ、チェックのないフィールドはローカルの値が維持されます。", "仅供参考,以实际扣费为准": "あくまで目安であり、実際の請求額が適用されます", @@ -344,14 +378,19 @@ "今日关闭": "今日は表示しない", "今日已签到": "本日チェックイン済み", "今日已签到,累计签到": "本日チェックイン済み、累計チェックイン", + "从 0.5 降到 0.3": "0.5から0.3に引き下げ", + "从剪贴板粘贴配置": "クリップボードから貼り付け", "从官方模型库同步": "公式モデルライブラリから同期", "从认证器应用中获取验证码,或使用备用码": "認証アプリから認証コードを取得するか、バックアップコードを使用してください", "从配置文件同步": "設定ファイルから同期", + "从默认列表中去掉一个分组": "デフォルトリストからグループを削除", "代理地址": "プロキシアドレス", "代理设置": "プロキシ設定", "代码已复制到剪贴板": "コードがクリップボードにコピーされました", "令牌": "トークン", "令牌分组": "トークングループ", + "令牌分组设为 auto 时,按以下顺序依次尝试选择可用分组,排在前面的优先级更高": "トークングループがautoの場合、以下の順序で利用可能なグループを選択します。上位のグループが優先されます", + "令牌分组设为 auto 时,系统按优先级顺序自动选择一个可用分组。": "トークングループがautoの場合、システムは優先順位に従って利用可能なグループを自動選択します。", "令牌分组,默认为用户的分组": "トークングループ、デフォルトはユーザーのグループ", "令牌创建成功,请在列表页面点击复制获取令牌!": "トークンの作成に成功しました。リストページでコピーをクリックしてトークンを取得してください", "令牌名称": "トークン名", @@ -364,9 +403,9 @@ "以及": "および", "仪表盘设置": "ダッシュボード設定", "价格": "料金", - "价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}}": "Price: {{symbol}}{{price}} * {{ratioType}}: {{ratio}}", - "价格:${{price}} * {{ratioType}}:{{ratio}}": "料金:${{price}} * {{ratioType}}:{{ratio}}", + "价格摘要": "価格概要", "价格暂时不可用,请稍后重试": "Price temporarily unavailable, please try again later", + "价格模式(默认)": "価格モード(デフォルト)", "价格计算中...": "Calculating price...", "价格计算失败": "Price calculation failed", "价格计算失败: ": "Price calculation failed: ", @@ -374,6 +413,8 @@ "价格设置方式": "料金設定方法", "价格重新计算中...": "Recalculating price...", "价格预估": "Price Estimate", + "价格:${{price}} * {{ratioType}}:{{ratio}}": "料金:${{price}} * {{ratioType}}:{{ratio}}", + "价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}}": "Price: {{symbol}}{{price}} * {{ratioType}}: {{ratio}}", "任一满足(OR)": "いずれか一致(OR)", "任务 ID": "タスクID", "任务ID": "タスクID", @@ -396,7 +437,6 @@ "作用域:包含规则名称": "スコープ:ルール名を含む", "你似乎并没有修改什么": "何も変更されていないようです", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "You can manually add them under “Custom model names”, click Fill and submit, or use the actions below to handle them automatically.", - "使用 {{name}} 继续": "{{name}}で続行", "使用 Discord 继续": "Continue with Discord", "使用 GitHub 继续": "GitHubでログイン", "使用 JSON 对象格式,格式为:{\"组名\": [最多请求次数, 最多请求完成次数]}": "JSONオブジェクト形式で入力してください。形式:{\"グループ名\": [最大リクエスト数, 最大成功リクエスト数]}", @@ -405,36 +445,42 @@ "使用 Passkey 实现免密且更安全的登录体验": "Passkeyで、より安全なパスワードレスログインを実現。", "使用 Passkey 登录": "Passkeyでログイン", "使用 Passkey 验证": "Passkeyで認証", + "使用 {{name}} 继续": "{{name}}で続行", "使用 微信 继续": "WeChatでログイン", "使用 用户名 注册": "ユーザー名でサインアップ", "使用 邮箱或用户名 登录": "メールアドレスまたはユーザー名でログイン", "使用ID排序": "IDでソート", + "使用分组": "使用グループ", "使用日志": "利用履歴", "使用模式": "利用モード", "使用统计": "利用統計", - "使用认证器应用(如 Google Authenticator、Microsoft Authenticator)扫描下方二维码:": "Google Authenticator、Microsoft Authenticatorなどの認証アプリで、以下のQRコードをスキャンしてください:", "使用认证器应用扫描二维码": " 認証アプリスキャン", + "使用认证器应用(如 Google Authenticator、Microsoft Authenticator)扫描下方二维码:": "Google Authenticator、Microsoft Authenticatorなどの認証アプリで、以下のQRコードをスキャンしてください:", + "使用说明": "ガイド", "例如 /var/cache/new-api": "例:/var/cache/new-api", - "例如 €, £, Rp, ₩, ₹...": "例:€, £, Rp, ₩, ₹...", "例如 https://docs.newapi.pro": "例:https://docs.newapi.pro", - "例如:": "例:", + "例如 €, £, Rp, ₩, ₹...": "例:€, £, Rp, ₩, ₹...", "例如: /bin/bash -c \"python app.py\"": "e.g.: /bin/bash -c \"python app.py\"", "例如: nginx:latest": "e.g.: nginx:latest", "例如: socks5://user:pass@host:port": "(例:socks5://user:pass@host:port)", + "例如发卡网站的购买链接": "例:カード発行サイトの購入リンク", + "例如(全渠道):": "例(全チャネル):", + "例如(指定渠道):": "例(指定チャネル):", + "例如:": "例:", "例如:-c": "e.g.: -c", "例如:/bin/bash": "e.g.: /bin/bash", "例如:0001": "例:0001", "例如:1000": "例:1000", "例如:100000": "e.g.: 100000", - "例如:2,就是最低充值2$": "例:2(最低チャージ額$2)", "例如:2000": "例:2000", + "例如:2,就是最低充值2$": "例:2(最低チャージ額$2)", "例如:4.99": "e.g.: 4.99", "例如:401, 403, 429, 500-599": "例:401, 403, 429, 500-599", "例如:7,就是7元/美金": "例:7(1USDあたり7CNY)", + "例如:GitHub Enterprise": "例:GitHub Enterprise", "例如:email": "例:email", "例如:example.com": "例:example.com", "例如:github / si:google / https://example.com/logo.png / 🐱": "例:github / si:google / https://example.com/logo.png / 🐱", - "例如:GitHub Enterprise": "例:GitHub Enterprise", "例如:github-enterprise": "例:github-enterprise", "例如:https://example.com/.well-known/openid-configuration": "例:https://example.com/.well-known/openid-configuration", "例如:https://gitea.example.com": "例:https://gitea.example.com", @@ -449,9 +495,6 @@ "例如:该请求不满足准入策略": "例:このリクエストはアドミッションポリシーを満たしていません", "例如:适合轻度使用": "例:軽めの利用に最適", "例如:需要等级 {{required}},你当前等级 {{current}}": "例:レベル{{required}}が必要です。現在のレベルは{{current}}です", - "例如(全渠道):": "例(全チャネル):", - "例如(指定渠道):": "例(指定チャネル):", - "例如发卡网站的购买链接": "例:カード発行サイトの購入リンク", "供应商": "プロバイダー", "供应商介绍": "プロバイダー紹介", "供应商信息:": "プロバイダー情報:", @@ -473,11 +516,12 @@ "保存 Turnstile 设置": "Turnstile 設定を保存", "保存 WeChat Server 设置": "WeChatサーバー設定を保存", "保存分组倍率设置": "グループ倍率設定を保存", + "保存分组相关设置": "グループ設定を保存", "保存备用码": "バックアップコード", "保存备用码以备不时之需": "万一に備え保存", "保存失败": "保存に失敗しました", - "保存失败,请重试": "保存に失敗しました。再試行してください", "保存失败:": "保存に失敗しました:", + "保存失败,请重试": "保存に失敗しました。再試行してください", "保存屏蔽词过滤设置": "NGワードフィルタリング設定を保存", "保存性能设置": "パフォーマンス設定を保存", "保存成功": "保存に成功しました", @@ -492,7 +536,9 @@ "保存设置": "設定を保存", "保存通用设置": "一般設定を保存", "保存邮箱域名白名单设置": "メールドメインのホワイトリスト設定を保存", + "保存预览": "保存プレビュー", "保存额度设置": "クォータ設定を保存", + "保留": "保持", "保留原值(目标已有值时不覆盖)": "元の値を保持(ターゲットに既に値がある場合は上書きしない)", "保留天数": "保持日数", "保留文件数": "保持ファイル数", @@ -505,22 +551,24 @@ "修改密码": "パスワード変更", "修改绑定": "連携変更", "修改部署名称": "Change Deployment Name", - "倍率": "倍率", + "倍率": "レート", "倍率信息": "倍率情報", "倍率是为了方便换算不同价格的模型": "倍率は、料金が異なるモデルの換算を容易にするためのものです", "倍率模式": "倍率モード", + "倍率用于计费乘数,勾选「用户可选」后用户可在创建令牌时选择该分组": "レートは課金倍率です。「ユーザー選択可」をチェックすると、ユーザーがトークン作成時にこのグループを選択できます", "倍率类型": "倍率タイプ", + "假设再加两个分组 default 和 vip,但不勾选用户可选:": "さらにdefaultとvipの2グループを追加しますが、ユーザー選択可にはチェックしません:", "偏好设置": "設定", "停止测试": "テストを停止", "停止重试": "リトライ停止", "停用": "無効", "允许 AccountFilter 参数": "AccountFilterパラメータを許可する", "允许 HTTP 协议图片请求(适用于自部署代理)": "HTTPプロトコルによる画像リクエストを許可する(セルフホストプロキシ向け)", + "允许 Turnstile 用户校验": "Turnstileによるユーザー検証を許可する", "允许 inference_geo 透传": "inference_geoパススルーを許可", "允许 safety_identifier 透传": "safety_identifierのパススルーを許可する", "允许 service_tier 透传": "service_tierのパススルーを許可する", "允许 stream_options.include_obfuscation 透传": "stream_options.include_obfuscationパススルーを許可", - "允许 Turnstile 用户校验": "Turnstileによるユーザー検証を許可する", "允许不安全的 Origin(HTTP)": "安全でないオリジン(HTTP)を許可する", "允许回调(会泄露服务器 IP 地址)": "コールバックを許可する(サーバーIPアドレスが漏洩します)", "允许在 Stripe 支付中输入促销码": "Stripe決済でのプロモーションコード入力を許可する", @@ -541,13 +589,13 @@ "允许重试": "リトライを許可", "元": "CNY", "充值": "チャージ", - "充值价格(x元/美金)": "チャージ料金(x CNY/USD)", "充值价格显示": "チャージ料金表示", + "充值价格(x元/美金)": "チャージ料金(x CNY/USD)", "充值分组倍率": "チャージグループ倍率", "充值分组倍率不是合法的 JSON 字符串": "チャージグループ倍率は有効なJSON文字列ではありません", "充值数量": "チャージ額", - "充值数量,最低 ": "チャージ額、最低", "充值数量不能小于": "チャージ額は次を下回れません:", + "充值数量,最低 ": "チャージ額、最低", "充值方式设置": "チャージ方法設定", "充值方式设置不是合法的 JSON 字符串": "チャージ方法設定は有効なJSON文字列ではありません", "充值确认": "チャージの確認", @@ -563,8 +611,8 @@ "兑换成功!": "引き換えに成功しました", "兑换码充值": "引き換えコードによるチャージ", "兑换码创建成功": "引き換えコードの作成に成功しました", - "兑换码创建成功,是否下载兑换码?": "引き換えコードの作成に成功しました。ダウンロードしますか?", "兑换码创建成功!": "引き換えコードの作成に成功しました", + "兑换码创建成功,是否下载兑换码?": "引き換えコードの作成に成功しました。ダウンロードしますか?", "兑换码将以文本文件的形式下载,文件名为兑换码的名称。": "引き換えコードはテキストファイルとしてダウンロードされ、ファイル名は引き換えコードの名称になります。", "兑换码更新成功!": "引き換えコードの更新に成功しました", "兑换码生成管理": "引き換えコード生成管理", @@ -609,8 +657,8 @@ "关闭": "閉じる", "关闭侧边栏": "サイドバー折りたたみ", "关闭公告": "お知らせを閉じる", - "关闭后,此模型将不会被“同步官方”自动覆盖或创建": "オフにすると、このモデルは「公式から同期」機能によって自動的に上書き・作成されなくなります", "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?": "閉じると、このお知らせは今後表示されません(このブラウザのみ)。閉じてもよろしいですか?", + "关闭后,此模型将不会被“同步官方”自动覆盖或创建": "オフにすると、このモデルは「公式から同期」機能によって自動的に上書き・作成されなくなります", "关闭弹窗,已停止批量测试": "ポップアップを閉じたため、一括テストは停止されました", "关闭提示": "お知らせを閉じる", "其他": "その他", @@ -628,17 +676,6 @@ "内置": "組み込み", "内置 Ollama 镜像": "Built-in Ollama Image", "再次输入部署名称": "Enter Deployment Name Again", - "最低": "最低", - "最低充值美元数量": "最低チャージUSD額", - "最后使用时间": "最終利用日時", - "最后更新": "Last Updated", - "最后请求": "最終リクエスト日時", - "最大GPU数量": "Max Number of GPUs", - "最大可用": "Max Available", - "最大条目数": "最大エントリ数", - "最终抵扣": "最終控除", - "最近一次": "最新", - "最近事件": "Recent Events", "写": "書込", "准入策略": "アドミッションポリシー", "准入策略 JSON(可选)": "アドミッションポリシー JSON(オプション)", @@ -647,14 +684,23 @@ "凭证已刷新": "資格情報が更新されました", "分类名称": "分類名称", "分组": "グループ", + "分组JSON设置": "グループJSON設定", "分组与模型定价设置": "グループとモデルの料金設定", "分组价格": "グループ料金", - "分组倍率": "グループ倍率", + "分组倍率": "グループレート", "分组倍率设置": "グループ倍率設定", "分组倍率设置,可以在此处新增分组或修改现有分组的倍率,格式为 JSON 字符串,例如:{\"vip\": 0.5, \"test\": 1},表示 vip 分组的倍率为 0.5,test 分组的倍率为 1": "グループ倍率設定。ここで新規グループの追加や既存グループの倍率を変更できます。JSON形式で入力してください。例:{\"vip\": 0.5, \"test\": 1} は、vipグループの倍率が0.5、testグループの倍率が1であることを示します", - "分组特殊倍率": "グループ特別倍率", - "分组特殊可用分组": "Available special groups", + "分组名": "グループ名", + "分组名称": "グループ名", + "分组名称到倍率的映射": "グループ名からレートへのマッピング", + "分组描述": "グループの説明", + "分组是用于控制计费倍率和模型访问权限的核心概念。每个用户属于一个分组,每个令牌也可以指定使用某个分组。": "グループは課金レートとモデルアクセス権限を制御するための中核概念です。各ユーザーは1つのグループに属し、各トークンも特定のグループを指定できます。", + "分组特殊倍率": "グループ特殊レート", + "分组特殊可用分组": "特殊利用可能グループ", + "分组相关设置": "グループ関連設定", + "分组管理": "グループ管理", "分组设置": "グループ設定", + "分组设置使用说明": "グループ設定ガイド", "分组速率配置优先级高于全局速率限制。": "グループレート設定が、グローバルレート制限より優先されます。", "分组速率限制": "グループレート制限", "分钟": "分", @@ -669,7 +715,9 @@ "列出的模型将不会自动添加或移除-thinking/-nothinking 后缀": "ここに含まれるモデルでは-thinking/-nothinkingサフィックスを自動的に追加・削除しません。", "列设置": "列設定", "创建": "Create", + "创建令牌可选": "トークン作成時に選択可", "创建令牌默认选择auto分组,初始令牌也将设为auto(否则留空,为用户默认分组)": "トークン作成時、デフォルトで「auto」グループが選択され、初期トークンも「auto」に設定されます。(空欄の場合は、ユーザーのデフォルトグループが適用されます)", + "创建和管理分组": "グループの作成と管理", "创建失败": "作成に失敗しました", "创建成功": "作成に成功しました", "创建或选择密钥时,将 Project 设置为 io.cloud": "When creating or selecting a key, set Project to io.cloud", @@ -681,6 +729,7 @@ "创建新的订阅套餐": "新しいサブスクリプションプランを作成", "创建新的预填组": "新規事前入力グループ作成", "创建时间": "作成日時", + "创建渠道所需的基本信息": "チャネル作成に必要な基本情報", "创建用户": "ユーザー作成", "初始化失败,请重试": "初期化に失敗しました。再試行してください", "初始化系统": "システム初期化", @@ -714,13 +763,15 @@ "前往设置": "Go to Settings", "前往设置页面": "Go to Settings Page", "前缀": "プレフィックス", - "副本数量": "Number of Replicas", + "前:": "前:", "剩余": "Remaining", "剩余备用码:": "残りバックアップコード:", "剩余时间": "Remaining Time", "剩余额度": "残りクォータ", - "剩余额度/总额度": "残りクォータ/総クォータ", "剩余额度$": "残高 ($)", + "剩余额度/总额度": "残りクォータ/総クォータ", + "剪贴板中未检测到连接信息": "クリップボードに接続情報が見つかりません", + "副本数量": "Number of Replicas", "功能特性": "機能", "加入渠道": "Join Channel", "加入预填组": "事前入力グループへの参加", @@ -741,6 +792,7 @@ "加载详情中...": "Loading details...", "加载账单失败": "請求情報の読み込みに失敗しました", "加载隐私政策内容失败...": "プライバシーポリシーのコンテンツの読み込みに失敗しました", + "勾选后,该分组会出现在用户创建令牌时的下拉菜单中。未勾选的分组只能由管理员分配,用户自己无法选择。": "チェックすると、このグループはトークン作成時のドロップダウンに表示されます。未チェックのグループは管理者のみが割り当て可能です。", "包含": "含む", "包含来自未知或未标明供应商的AI模型,这些模型可能来自小型供应商或开源项目。": "プロバイダーが不明または明記されていないAIモデルが含まれています。これらのモデルは、小規模なプロバイダーやオープンソースプロジェクト由来の場合があります。", "包括失败请求的次数,0代表不限制": "失敗したリクエストの回数を含みます。0は無制限を意味します", @@ -752,7 +804,8 @@ "升级分组": "アップグレードグループ", "单GPU小时费率": "Per GPU Hour Rate", "历史消耗": "消費履歴", - "原价": "通常料金", + "原价": "定価", + "原价,和普通用户一样": "定価、一般ユーザーと同じ", "原因:": "原因:", "原密码": "現在のパスワード", "原生格式": "ネイティブ形式", @@ -787,12 +840,15 @@ "只包括请求成功的次数": "成功したリクエストの回数のみを含みます", "只支持HTTPS,系统将以POST方式发送通知,请确保地址可以接收POST请求": "HTTPSにのみ対応しています。システムはPOSTで通知を送信するため、ご指定のURLがPOSTリクエストを受信できることをご確認ください", "只有当用户设置开启IP记录时,才会进行请求和错误类型日志的IP记录": "ユーザーがIP記録を有効に設定した場合にのみ、リクエストとエラータイプのログにIPが記録されます", + "只有配置了规则的组合才会覆盖,未配置的组合仍使用令牌分组的基础倍率。": "設定されたルールの組み合わせのみが上書きされ、未設定の組み合わせはトークングループの基本レートを使用します。", + "可以根据用户分组增减令牌可选的分组范围。例如 vip 用户额外开放 premium 分组,或移除某个分组的选择权。": "ユーザーグループに基づいて選択可能なグループ範囲を調整できます。例:vipユーザーにpremiumグループへのアクセスを追加、または特定グループの選択権を削除。", + "可以根据用户分组设置不同的计费倍率。例如 vip 用户使用 standard 令牌时倍率从 1.0 降为 0.8。": "ユーザーグループに基づいて異なる課金レートを設定できます。例:vipユーザーがstandardトークンを使用する際、レートが1.0から0.8に。", "可信": "信頼できる", "可在设置页面设置关于内容,支持 HTML & Markdown": "「このサービスについて」のコンテンツは設定ページで設定でき、HTML & Markdownに対応しています", "可手动填写,多个 scope 用空格分隔": "手動入力可能、複数のscopeはスペースで区切ります", "可用": "利用可能", "可用令牌分组": "利用可能なトークングループ", - "可用分组": "利用可能なグループ", + "可用分组": "利用可能グループ", "可用变量:{{provider}} {{field}} {{op}} {{required}} {{current}} 以及 {{current.path}}": "利用可能な変数:{{provider}} {{field}} {{op}} {{required}} {{current}} および {{current.path}}", "可用数量": "Available Quantity", "可用模型": "利用可能なモデル", @@ -803,14 +859,16 @@ "可视化": "可視化", "可视化倍率设置": "倍率設定の可視化", "可视化编辑": "ビジュアル編集", - "可选,公告的补充说明": "(オプション)お知らせの補足説明", - "可选,用于复现结果": "オプション、結果の再現用", - "可选:基于用户信息 JSON 做组合条件准入,条件不满足时返回自定义提示": "オプション:ユーザー情報JSONに基づく複合条件アドミッション。条件が満たされない場合、カスタムメッセージを返します", - "可选:用于自动生成端点或 Discovery URL": "オプション:エンドポイントまたはDiscovery URLの自動生成に使用", "可选。匹配入口请求的 User-Agent;任意一行作为子串匹配(忽略大小写)即命中。": "オプション。入力リクエストのUser-Agentをマッチ。いずれかの行がサブストリングとして一致(大文字小文字無視)すればヒットです。", "可选。对提取到的亲和 Key 做正则校验;不填表示不校验。": "オプション。抽出されたアフィニティキーを正規表現で検証。空欄は検証をスキップします。", "可选。对请求路径进行匹配;不填表示匹配所有路径。": "オプション。リクエストパスをマッチ。空欄はすべてのパスにマッチします。", "可选值": "選択可能な値", + "可选,公告的补充说明": "(オプション)お知らせの補足説明", + "可选,用于复现结果": "オプション、結果の再現用", + "可选:基于用户信息 JSON 做组合条件准入,条件不满足时返回自定义提示": "オプション:ユーザー情報JSONに基づく複合条件アドミッション。条件が満たされない場合、カスタムメッセージを返します", + "可选:用于自动生成端点或 Discovery URL": "オプション:エンドポイントまたはDiscovery URLの自動生成に使用", + "合计:{{total}}": "合計: {{total}}", + "合计:文字部分 {{textTotal}} + 音频部分 {{audioTotal}} = {{total}}": "合計: テキスト部分 {{textTotal}} + 音声部分 {{audioTotal}} = {{total}}", "同时重置消息": "メッセージも同時にリセット", "同步": "同期", "同步到渠道": "Sync to Channel", @@ -825,8 +883,12 @@ "名称+密钥": "名称+APIキー", "名称不能为空": "名称は空にできません", "名称匹配类型": "名称マッチングタイプ", + "后端固定倍率:{{ratio}}。该字段仅展示换算后的价格。": "バックエンド固定倍率: {{ratio}}。この項目は変換後の価格表示のみです。", "后端请求失败": "バックエンドリクエストに失敗しました", "后缀": "サフィックス", + "后:": "後:", + "向右展开": "右に展開", + "向左展开": "左に展開", "否": "いいえ", "启动": "Start", "启动参数 (Args)": "Startup Args", @@ -837,10 +899,10 @@ "启动部署失败": "Failed to start deployment", "启动配置": "Startup Configuration", "启用": "有効にする", + "启用 Prompt 检查": "プロンプトチェックを有効にする", "启用 io.net 部署": "Enable io.net Deployment", "启用 io.net 部署开关": "Enable io.net Deployment Switch", "启用 io.net 部署时必须填写 API Key": "API Key is required when enabling io.net deployment", - "启用 Prompt 检查": "プロンプトチェックを有効にする", "启用2FA失败": "2要素認証の有効化に失敗しました", "启用Claude思考适配(-thinking后缀)": "Claude思考モードを有効にする(-thinkingサフィックス)", "启用FunctionCall思维签名填充": "FunctionCall用のthoughtSignature自動付与を有効化", @@ -877,7 +939,7 @@ "命中判定:usage 中存在 cached tokens(例如 cached_tokens/prompt_cache_hit_tokens)即视为命中。": "ヒット判定:usageにキャッシュトークン(例:cached_tokens/prompt_cache_hit_tokens)が存在する場合、ヒットとみなされます。", "命中率": "ヒット率", "命中该亲和规则后,会把此模板合并到渠道参数覆盖中(同名键由模板覆盖)。": "このアフィニティルールがヒットすると、テンプレートがチャネルパラメータオーバーライドにマージされます(同名キーはテンプレートで上書きされます)。", - "和": "および", + "和": "と", "和Claude不同,默认情况下Gemini的思考模型会自动决定要不要思考,就算不开启适配模型也可以正常使用,如果您需要计费,推荐设置无后缀模型价格按思考価格設置。支持使用 gemini-2.5-pro-preview-06-05-thinking-128 格式来精确传递思考预算。": "Claudeとは異なり、Geminiの思考モデルはデフォルトで思考するかどうかを自動的に決定します。アダプターを有効にしなくても正常に動作します。課金が必要な場合は、サフィックスなしモデルの価格を思考価格に設定してください。gemini-2.5-pro-preview-06-05-thinking-128のような形式を使用して、正確な思考予算を指定できます。", "响应": "レスポンス", "响应时间": "応答時間", @@ -896,14 +958,22 @@ "图标使用 react-icons(Simple Icons)或 URL/emoji,例如:github、gitlab、si:google": "アイコンはreact-icons(Simple Icons)またはURL/emojiを使用、例:github、gitlab、si:google", "图标使用@lobehub/icons库,如:OpenAI、Claude.Color,支持链式参数:OpenAI.Avatar.type={'platform'}、OpenRouter.Avatar.shape={'square'},查询所有可用图标请 ": "アイコンは `@lobehub/icons` ライブラリを使用しています(例:OpenAI、Claude.Color)。`OpenAI.Avatar.type={'platform'}`、`OpenRouter.Avatar.shape={'square'}` のようなチェーンパラメータに対応しています。利用可能なすべてのアイコンは、こちらで確認できます。", "图混合": "Blend", + "图片倍率 {{imageRatio}}": "画像倍率 {{imageRatio}}", "图片功能在自定义请求体模式下不可用": "カスタムリクエストモードでは画像機能は利用できません", "图片地址": "画像URL", "图片已添加": "画像が追加されました", "图片生成调用:{{symbol}}{{price}} / 1次": "画像生成APIコール:{{symbol}}{{price}} / 1回", + "图片生成:1 次 * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "画像生成: 1 回 * 単価 {{price}} * {{ratioType}} {{ratio}} = {{amount}}", + "图片输入 {{price}} / 1M tokens": "画像入力 {{price}} / 1M tokens", "图片输入: {{imageRatio}}": "画像入力:{{imageRatio}}", + "图片输入价格": "画像入力価格", + "图片输入价格 {{symbol}}{{price}} / 1M tokens": "画像入力価格 {{symbol}}{{price}} / 1M tokens", "图片输入价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (图片倍率: {{imageRatio}})": "画像入力料金:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens(画像倍率:{{imageRatio}})", + "图片输入价格:{{symbol}}{{price}} / 1M tokens": "画像入力価格:{{symbol}}{{price}} / 1M tokens", + "图片输入价格:{{symbol}}{{total}} / 1M tokens": "画像入力価格:{{symbol}}{{total}} / 1M tokens", "图片输入倍率(仅部分模型支持该计费)": "画像入力倍率(一部のモデルのみこの課金に対応)", "图片输入相关的倍率设置,键为模型名称,值为倍率,仅部分模型支持该计费": "画像入力に関する倍率設定です。キー:モデル名、値:倍率。この課金方法は一部のモデルのみ対応しています", + "图片输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 图片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "画像入力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * 画像倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "图生文": "ディスクライブ", "图生视频": "画像からの動画生成", "在Gotify服务器创建应用后获得的令牌,用于发送通知": "Gotifyサーバーでアプリを作成後に取得する、通知送信用トークンです。", @@ -919,20 +989,27 @@ "在此输入系统名称": "システム名称を入力してください", "在此输入隐私政策内容,支持 Markdown & HTML 代码": "プライバシーポリシーのコンテンツを入力してください。MarkdownとHTMLコードに対応しています", "在此输入首页内容,支持 Markdown & HTML 代码,设置后首页的状态信息将不再显示。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为首页": "ホームのコンテンツを入力してください。MarkdownとHTMLに対応しています。設定後は、ホームのステータス情報が表示されなくなります。リンクを入力した場合は、そのリンクがiframeのsrc属性として使用され、任意のWebページをホームとして設定できます", + "在默认列表基础上新增一个分组": "デフォルトリストに新しいグループを追加", + "场景:站点提供两个价格档位,用户可以按需选择": "シナリオ:サイトが2つの料金プランを提供し、ユーザーが選択可能", + "场景:站点有 standard 和 premium 两个用户可选分组。希望 vip 用户额外看到 exclusive 分组,同时不再看到 standard 分组": "シナリオ:standardとpremiumが選択可能。vipユーザーにexclusiveを追加し、standardを非表示にしたい", + "场景:站点有 standard(倍率 1.0)和 premium(倍率 0.5)两个分组,希望 vip 用户使用 standard 令牌时也能享受折扣": "シナリオ:standard(レート1.0)とpremium(レート0.5)があり、vipユーザーがstandardトークンでも割引を受けられるようにしたい", + "场景:设置自动选择优先级": "シナリオ:自動選択の優先順位を設定", "域名IP过滤详细说明": "推奨:有効にすると、ドメインをDNS解決し、解決されたIPがプライベートアドレスかどうかを確認します。DNSリバインディング攻撃によるSSRF防護の回避を効果的に防止できます。注意:ドメインは複数のIPv4/IPv6アドレスに解決される場合があります。IPフィルタリストを設定している場合は、これらのアドレスをカバーしていることを確認してください。", "域名白名单": "ドメインホワイトリスト", "域名黑名单": "ドメインブラックリスト", "基本信息": "基本情報", + "基础价格": "基本価格", + "基础用户": "基本ユーザー", "填充 Codex CLI / Claude CLI 模版": "Codex CLI / Claude CLI テンプレートを入力", "填充新模板": "新しいテンプレートを入力", "填充旧模板": "古いテンプレートを入力", "填充模板": "テンプレートを入力", + "填充模板(全渠道)": "テンプレートを入力(全チャネル)", + "填充模板(指定渠道)": "テンプレートを入力(指定チャネル)", "填充模板:等级+激活": "テンプレート入力:レベル+アクティベーション", "填充模板:等级提示": "テンプレート入力:レベルプロンプト", "填充模板:组织或角色": "テンプレート入力:組織またはロール", "填充模板:组织提示": "テンプレート入力:組織プロンプト", - "填充模板(全渠道)": "テンプレートを入力(全チャネル)", - "填充模板(指定渠道)": "テンプレートを入力(指定チャネル)", "填入": "入力", "填入 CC Switch": "CC Switchを入力", "填入所有模型": "すべてのモデルを入力", @@ -949,6 +1026,7 @@ "填写带https的域名,逗号分隔": "https://を含むドメインをカンマ区切りで入力してください", "填写用户协议内容后,用户注册时将被要求勾选已阅读用户协议": "ユーザー利用規約のコンテンツを設定すると、ユーザーがサインアップする際に、利用規約を読んだことへの同意チェックが求められます", "填写隐私政策内容后,用户注册时将被要求勾选已阅读隐私政策": "プライバシーポリシーのコンテンツを設定すると、ユーザーがサインアップする際に、プライバシーポリシーを読んだことへの同意チェックが求められます", + "填写音频补全价格前,需要先填写音频输入价格。": "音声補完価格を入力する前に、先に音声入力価格を入力してください。", "处理中": "Processing", "备份支持": "バックアップ対応", "备份状态": "バックアップステータス", @@ -964,6 +1042,7 @@ "复制失败": "コピーに失敗しました", "复制失败,请手动复制": "コピーに失敗しました。手動でコピーしてください。", "复制失败,请手动选择文本复制": "Copy failed, please manually select and copy the text", + "复制密钥": "キーをコピー", "复制已选": "選択した項目をコピー", "复制应用的令牌(Token)并填写到上方的应用令牌字段": "アプリのトークンをコピーし、上部のトークンフィールドに入力してください", "复制成功": "コピーに成功しました", @@ -976,6 +1055,7 @@ "复制渠道的所有信息": "チャネルのすべての情報をコピー", "复制版本号": "Copy Version", "复制生成的密钥并粘贴到此处": "Copy the generated key and paste it here", + "复制连接信息": "接続情報をコピー", "复制链接": "Copy link", "外接设备": "外部デバイス", "多个命令用空格分隔": "Multiple commands separated by spaces", @@ -989,7 +1069,6 @@ "失败原因": "失敗の原因", "失败后不重试": "失敗後リトライしない", "失败后是否重试": "失敗後リトライ", - "不重试": "リトライしない", "失败时自动禁用通道": "失敗時にチャネルを自動的に無効にする", "失败重试次数": "再試行回数", "奖励说明": "特典説明", @@ -999,13 +1078,13 @@ "套餐标题": "プラン名", "套餐标题不能为空": "プラン名は空にできません", "套餐的基本信息和定价": "プランの基本情報と価格", - "如:大带宽批量分析图片推荐": "例:広帯域での画像一括分析に推奨", - "如:香港线路": "例:香港回線", "如果亲和到的渠道失败,重试到其他渠道成功后,将亲和更新到成功的渠道。": "アフィニティチャネルが失敗した場合、別のチャネルでリトライが成功すると、アフィニティが成功したチャネルに更新されます。", "如果你对接的是上游One API或者New API等转发项目,请使用OpenAI类型,不要使用此类型,除非你知道你在做什么。": "New APIなどのリレープロジェクトに接続する場合は、OpenAIタイプを利用してください。設定内容を熟知している場合を除き、このタイプは利用しないでください", "如果用户请求中包含系统提示词,则使用此设置拼接到用户的系统提示词前面": "ユーザーリクエストにシステムプロンプトが含まれている場合、この設定内容がユーザーのシステムプロンプトの前に追加されます", "如果镜像为私有,请填写密码或Token": "If the image is private, please fill in the password or token", "如果镜像为私有,请填写用户名": "If the image is private, please fill in the username", + "如:大带宽批量分析图片推荐": "例:広帯域での画像一括分析に推奨", + "如:香港线路": "例:香港回線", "始终使用浅色主题": "常にライトテーマを使用", "始终使用深色主题": "常にダークテーマを使用", "字段映射": "フィールドマッピング", @@ -1014,6 +1093,7 @@ "字段透传控制": "フィールドパススルー制御", "字段速查": "フィールドクイックリファレンス", "存在惩罚,鼓励讨论新话题": "存在ペナルティ、新しいトピックを促進", + "存在重复的分组名称:": "重複するグループ名:", "存在重复的键名:": "キー名が重複しています:", "安全提醒": "セキュリティ通知", "安全设置": "セキュリティ設定", @@ -1025,6 +1105,7 @@ "完成硬件类型、部署位置、副本数量等配置后,将自动计算价格": "Price will be automatically calculated after completing hardware type, deployment location, number of replicas and other configurations", "完成设置并启用两步验证": "設定を完了し、2要素認証を有効にする", "完成进度": "Completion Progress", + "完整流程:": "完全なフロー:", "完整的 Base URL,支持变量{model}": "完全なベースURL(変数{model}に対応)", "官方": "公式", "官方文档": "公式ドキュメント", @@ -1037,6 +1118,7 @@ "实付金额": "決済金額", "实付金额:": "決済金額:", "实际模型": "アップストリームモデル", + "实际结算金额:{{symbol}}{{total}}(已包含分组价格调整)": "実際の請求額:{{symbol}}{{total}}(グループ価格調整込み)", "实际请求体": "実際のリクエストボディ", "容器": "Container", "容器ID": "Container ID", @@ -1070,7 +1152,6 @@ "密钥": "APIキー", "密钥 JSON 必须包含 access_token": "キーJSONにはaccess_tokenを含む必要があります", "密钥 JSON 必须包含 account_id": "キーJSONにはaccount_idを含む必要があります", - "密钥(编辑模式下,保存的密钥不会显示)": "APIキー(編集モードでは、保存済みのAPIキーは表示されません)", "密钥去重": "APIキーの重複排除", "密钥将以Bearer方式添加到请求头中,用于验证webhook请求的合法性": "シークレットキーは、Webhookリクエストの正当性を検証するため、Bearerトークンとしてリクエストヘッダーに追加されます。", "密钥已删除": "APIキーが削除されました", @@ -1088,10 +1169,12 @@ "密钥获取成功": "APIキーの取得に成功しました", "密钥输入方式": "APIキーの入力方式", "密钥预览": "APIキーのプレビュー", + "密钥(编辑模式下,保存的密钥不会显示)": "APIキー(編集モードでは、保存済みのAPIキーは表示されません)", "对于官方渠道,new-api已经内置地址,除非是第三方代理站点或者Azure的特殊接入地址,否则不需要填写": "公式チャネルの場合、new-apiにはベースURLが組み込まれているため、サードパーティのプロキシサイトやAzureの専用のエンドポイントでない限り、入力する必要はありません。", "对免费模型启用预消耗": "Enable pre-consumption for free models", "对域名启用 IP 过滤(推荐开启)": "ドメインのIPフィルタリングを有効にする(推奨)", "对外运营模式": "公開運用モード", + "对比:不勾选「用户可选」的场景": "比較:「ユーザー選択可」をチェックしない場合", "对象清理规则": "オブジェクトプルーニングルール", "导入": "インポート", "导入的配置将覆盖当前设置,是否继续?": "インポートする設定によって現在の設定が上書きされます。続行しますか?", @@ -1105,11 +1188,12 @@ "将为选中的 ": "選択中の", "将仅保留第一个密钥文件,其余文件将被移除,是否继续?": "最初のAPIキーファイルのみ保持され、残りのファイルは削除されます。続行しますか?", "将删除": "削除の確認", + "将删除 {{value}} 天前的日志文件。": "{{value}} 日より前のログファイルが削除されます。", "将删除已使用、已禁用及过期的兑换码,此操作不可撤销。": "使用済み、無効、および有効期限切れの引き換えコードを削除します。この操作は元に戻すことはできません。", "将删除所有仍在内存中的渠道亲和性缓存条目。": "メモリ内に残っているすべてのチャネルアフィニティキャッシュエントリが削除されます。", - "将删除 {{value}} 天前的日志文件。": "{{value}} 日より前のログファイルが削除されます。", "将只保留最近 {{value}} 个日志文件,其余将被删除。": "最新の {{value}} 個のログファイルのみ保持し、残りは削除されます。", "将大请求体临时存储到磁盘": "大きなリクエストボディをディスクに一時保存", + "将把当前编辑中的模型 {{name}} 的价格配置,批量应用到已勾选的 {{count}} 个模型。": "現在編集中のモデル {{name}} の価格設定を、選択済みの {{count}} 個のモデルに一括適用します。", "将清除所有保存的配置并恢复默认设置,此操作不可撤销。是否继续?": "保存されているすべての設定がクリアされ、デフォルト設定に復元されます。この操作は元に戻すことはできません。続行しますか?", "将清除选定时间之前的所有日志": "選択した日時以前のすべてのログをクリアします", "将追加 2 条规则到现有规则列表。": "既存のルールリストに2つのルールが追加されます。", @@ -1122,10 +1206,11 @@ "展开": "展開", "展开更多": "もっと見る", "展示价格": "Display Pricing", + "嵌套映射:用户分组 → 使用分组 → 倍率": "ネスト構造:ユーザーグループ → 使用グループ → レート", "左侧边栏个人设置": "サイドバーのアカウント設定", + "已为 ${count} 个渠道设置标签!": "${count}個のチャネルにタグが設定されました", "已为 {{count}} 个模型设置{{type}}_one": "{{count}}個のモデルに{{type}}が設定されました_one", "已为 {{count}} 个模型设置{{type}}_other": "{{count}}個のモデルに{{type}}_otherが設定されました_other", - "已为 ${count} 个渠道设置标签!": "${count}個のチャネルにタグが設定されました", "已从 Discovery 自动填充配置": "Discoveryから設定を自動入力しました", "已从 Discovery 获取配置,可继续手动修改所有字段。": "Discoveryから設定を取得しました。すべてのフィールドを手動で変更できます。", "已作废": "無効化済み", @@ -1140,13 +1225,15 @@ "已切换至最优倍率视图,每个模型使用其最低倍率分组": "各モデルが最低倍率グループを利用する最適倍率ビューに切り替えられました", "已初始化": "初期化済み", "已删除": "削除済み", + "已删除 ${data} 个通道!": "${data}個のチャネルが削除されました!", "已删除 {{count}} 个令牌!": "{{count}}個のトークンが削除されました", "已删除 {{count}} 个令牌!_other": "Deleted {{count}} tokens!", "已删除 {{count}} 条失效兑换码_one": "無効な引き換えコードが{{count}}件削除されました_one", "已删除 {{count}} 条失效兑换码_other": "無効な引き換えコードが{{count}}件削除されました_other", - "已删除 ${data} 个通道!": "${data}個のチャネルが削除されました!", "已删除所有禁用渠道,共计 ${data} 个": "すべての無効なチャネル(合計${data}個)が削除されました", "已删除消息及其回复": "メッセージとその返信が削除されました", + "已勾选": "選択済み", + "已勾选 {{count}} 个模型": "{{count}} 個のモデルを選択済み", "已发起支付": "支払いを開始しました", "已发送到 Fluent": "Fluentに送信されました", "已取消 Passkey 注册": "Passkeyの登録がキャンセルされました", @@ -1162,8 +1249,6 @@ "已复制": "コピーされました", "已复制 ${count} 个模型": "${count}個のモデルがコピーされました", "已复制 ID 到剪贴板": "ID copied to clipboard", - "已复制:": "コピーされました:", - "已复制:{{name}}": "コピーされました:{{name}}", "已复制全部数据": "すべてのデータをコピーしました", "已复制到剪切板": "クリップボードにコピーされました", "已复制到剪贴板": "クリップボードにコピーされました", @@ -1172,7 +1257,10 @@ "已复制模型名称": "モデル名がコピーされました", "已复制版本号": "Version copied", "已复制自动生成的 API Key": "Auto-generated API Key copied", + "已复制:": "コピーされました:", + "已复制:{{name}}": "コピーされました:{{name}}", "已完成": "Completed", + "已将模型 {{name}} 的价格配置批量应用到 {{count}} 个模型": "モデル {{name}} の価格設定を {{count}} 個のモデルに一括適用しました", "已开启全局请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "全体のリクエストパススルーが有効です。パラメータ上書き、モデルリダイレクト、チャネル適応などの NewAPI 内蔵機能は無効になります。ベストプラクティスではありません。これにより問題が発生しても issue を投稿しないでください。", "已成功开始测试所有已启用通道,请刷新页面查看结果。": "有効なすべてのチャネルのテストを開始しました。ページを更新して結果を確認してください。", "已打开授权页面": "認可ページを開きました", @@ -1191,9 +1279,9 @@ "已添加": "追加済み", "已添加 {{count}} 个模板_other": "{{count}}個のテンプレートが追加されました", "已添加到白名单": "ホワイトリストに追加されました", + "已清理 {{count}} 个日志文件,释放 {{size}}": "{{count}} 個のログファイルをクリーンアップし、{{size}} を解放しました", "已清空": "クリア済み", "已清空测试结果": "テスト結果がクリアされました", - "已清理 {{count}} 个日志文件,释放 {{size}}": "{{count}} 個のログファイルをクリーンアップし、{{size}} を解放しました", "已生成授权凭据": "認可資格情報が生成されました", "已用": "Used", "已用/剩余": "使用済み/残り", @@ -1210,10 +1298,10 @@ "已达到购买上限": "購入上限に達しました", "已过期": "有効期限切れ", "已运行时间": "Uptime", + "已选择 ${count} 个渠道": "${count}個のチャネルが選択されました", "已选择 {{count}} 个模型_one": "{{count}}個のモデルが選択されました_one", "已选择 {{count}} 个模型_other": "{{count}}個のモデルが選択されました_other", "已选择 {{selected}} / {{total}}": "{{selected}} / {{total}} 件選択済み", - "已选择 ${count} 个渠道": "${count}個のチャネルが選択されました", "已重置为默认配置": "デフォルト設定にリセットされました", "已销毁": "Destroyed", "币种": "通貨", @@ -1235,15 +1323,19 @@ "延长容器时长将会产生额外费用,请确认您有足够的账户余额。": "Extending container duration will incur additional charges, please ensure you have sufficient account balance.", "延长操作一旦确认无法撤销,费用将立即扣除。": "Once confirmed, the extension operation cannot be undone, and charges will be deducted immediately.", "延长时长": "Extension Duration", - "延长时长(小时)": "Extension Duration (hours)", "延长时长不能超过720小时(30天)": "Extension duration cannot exceed 720 hours (30 days)", "延长时长失败": "Failed to extend duration", "延长时长至少为1小时": "Extension duration must be at least 1 hour", + "延长时长(小时)": "Extension Duration (hours)", "建立连接时发生错误": "接続時にエラーが発生しました", "建议在生产环境中使用 MySQL 或 PostgreSQL 数据库,或确保 SQLite 数据库文件已映射到宿主机的持久化存储。": "本番環境では MySQL または PostgreSQL データベースを使用するか、SQLite データベースファイルがホストマシンの永続ストレージにマッピングされていることを確認することを推奨します", "开": "On", + "开启「默认使用 auto 分组」后,新建令牌和初始令牌都会自动设为 auto。": "「デフォルトでautoグループを使用」を有効にすると、新規トークンと初期トークンが自動的にautoに設定されます。", "开启之后会清除用户提示词中的": "有効にすると、ユーザープロンプトがクリアされます", "开启之后将上游地址替换为服务器地址": "有効にすると、アップストリームアドレスがサーバーURLに置換されます", + "开启后不限制:必须设置模型倍率": "有効化後は制限なし:モデル倍率の設定が必須", + "开启后创建令牌默认选择auto分组,初始令牌也将设为auto": "有効にするとトークン作成時にデフォルトでautoグループが選択され、初期トークンもautoに設定されます", + "开启后未登录用户无法访问模型广场": "有効にすると、ログインしていないユーザーはモデルマーケットプレイスにアクセスできなくなります", "开启后,using_group 会参与 cache key(不同分组隔离)。": "有効にすると、using_groupがキャッシュキーに含まれます(グループごとに隔離)。", "开启后,仅\"消费\"和\"错误\"日志将记录您的客户端IP地址": "有効にすると、「消費」と「エラー」のログにのみ、クライアントIPアドレスが記録されます", "开启后,对免费模型(倍率为0,或者价格为0)的模型也会预消耗额度": "After enabling, free models (ratio 0 or price 0) will also pre-consume quota", @@ -1254,8 +1346,6 @@ "开启后,规则名称会参与 cache key(不同规则隔离)。": "有効にすると、ルール名がキャッシュキーに含まれます(ルールごとに隔離)。", "开启后,该渠道请求 Claude 时将强制追加 ?beta=true(无需客户端手动传参)": "有効にすると、このチャネルでClaudeにリクエストする際に?beta=trueが強制追加されます(クライアント側で手動パラメータ渡し不要)", "开启后,违规请求将额外扣费。": "有効にすると、違反リクエストには追加料金が発生します。", - "开启后不限制:必须设置模型倍率": "有効化後は制限なし:モデル倍率の設定が必須", - "开启后未登录用户无法访问模型广场": "有効にすると、ログインしていないユーザーはモデルマーケットプレイスにアクセスできなくなります", "开启批量操作": "一括操作を有効にする", "开始": "開始", "开始同步": "同期開始", @@ -1269,6 +1359,7 @@ "强制要求": "必須", "强变换": "バリエーション(強)", "当上游通道返回错误中包含这些关键词时(不区分大小写),自动禁用通道": "アップストリームチャネルがこれらのキーワード(大文字と小文字を区別しない)を含むエラーを返した場合、チャネルは自動的に無効になります", + "当令牌分组设为 auto 时,系统按列表顺序依次选择可用分组。排在前面的优先级更高。": "トークングループがautoの場合、システムはリスト順に利用可能なグループを選択します。上位のグループが優先されます。", "当前 API 密钥已过期,请在设置中更新。": "Current API key has expired, please update it in settings.", "当前 Ollama 版本为 ${version}": "Current Ollama version is ${version}", "当前仅 OpenAI / Claude 语义支持缓存 token 统计,其他通道将隐藏 token 相关字段。": "現在、OpenAI / Claudeセマンティクスのみがキャッシュトークン統計をサポートしています。他のチャネルではトークン関連フィールドが非表示になります。", @@ -1278,15 +1369,21 @@ "当前分组为 auto,会自动选择最优分组,当一个组不可用时自动降级到下一个组(熔断机制)": "現在のグループは auto です。最適なグループが自動的に選択され、利用できないグループが発生した場合は、次のグループへ自動的にフォールバックします(サーキットブレーカー機能)", "当前剩余": "Currently Remaining", "当前参数覆盖不是合法的 JSON": "現在のパラメータオーバーライドは有効なJSONではありません", + "当前提示": "現在のヒント", "当前旧格式 JSON 不合法,无法追加模板": "現在のレガシー形式JSONが無効なため、テンプレートを追加できません", "当前旧格式不是 JSON 对象,无法追加模板": "現在のレガシー形式はJSONオブジェクトではないため、テンプレートを追加できません", "当前时间": "現在時刻", + "当前未启用,需要时再打开即可。": "この項目は現在無効です。必要なときに有効にしてください。", "当前未开启Midjourney回调,部分项目可能无法获得绘图结果,可在运营设置中开启。": "現在、Midjourneyコールバックが有効になっていないため、一部のプロジェクトで画像生成結果を取得できない場合があります。この機能は運用設定で有効にできます", "当前查看的分组为:{{group}},倍率为:{{ratio}}": "現在表示中のグループ:{{group}}、倍率:{{ratio}}", "当前模型列表为该标签下所有渠道模型列表最长的一个,并非所有渠道的并集,请注意可能导致某些渠道模型丢失。": "現在のモデルリストは、このタグに属するチャネルの中で最も長いモデルリストを採用しており、すべてのチャネルのモデルの和集合ではありません。これにより一部のチャネルのモデルがリストに含まれない可能性があるため、ご注意ください。", + "当前模型同时存在按次价格和倍率配置,保存时会按当前计费方式覆盖。": "このモデルには従量価格と倍率設定が同時に存在しています。保存すると現在の課金方式に従って上書きされます。", + "当前模型存在未显式设置输入倍率的扩展倍率;填写输入价格后会自动换算为价格字段。": "このモデルには入力倍率が明示されていない拡張倍率があります。入力価格を設定すると価格項目へ自動換算されます。", + "当前没有未设置定价的模型": "現在、価格未設定のモデルはありません", "当前版本": "現在のバージョン", "当前状态": "Current Status", "当前缓存大小": "現在のキャッシュサイズ", + "当前编辑": "編集中", "当前规则不支持写入到该位置": "現在のルールはこの場所への書き込みをサポートしていません", "当前规则未设置参数覆盖模板": "現在のルールにはパラメータオーバーライドテンプレートが設定されていません", "当前计费": "現在の課金", @@ -1294,6 +1391,7 @@ "当前设置类型: ": "現在の設定タイプ:", "当前跟随系统": "システム設定に準拠", "当前配置无法连接到 io.net。": "Unable to connect to io.net with current configuration.", + "当某个分组的用户使用另一个分组的令牌时,可设置特殊倍率覆盖基础倍率。例如:vip 分组的用户使用 default 分组时倍率为 0.5": "あるグループのユーザーが別のグループのトークンを使用する際、特殊レートで基本レートを上書きできます。例:vipユーザーがdefaultグループを使用する際のレートを0.5に", "当模型没有设置价格时仍接受调用,仅当您信任该网站时使用,可能会产生高额费用": "モデルに料金が設定されていない場合でもAPIコールを受け付けます。信頼できるウェブサイトの場合にのみ使用してください。高額な料金が発生する可能性があります", "当运行通道全部测试时,超过此时间将自动禁用通道": "すべてのチャネルテストの実行時、この時間を超えたチャネルは自動的に無効になります", "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知": "ウォレットまたはサブスクリプションの残りクォータがこの値を下回ると、システムは選択した方法で通知します", @@ -1310,6 +1408,7 @@ "忘记密码?": "パスワードをお忘れですか?", "快速开始": "クイックスタート", "快速选择": "Quick Select", + "忽略": "無視", "思考中...": "思考中...", "思考内容转换": "思考プロセス変換", "思考过程": "思考プロセス", @@ -1349,10 +1448,11 @@ "或手动输入密钥:": "またはAPIキーを手動で入力:", "所有上游数据均可信": "すべてのアップストリームデータは信頼できます", "所有密钥已复制到剪贴板": "すべてのAPIキーがクリップボードにコピーされました", + "所有用户": "全ユーザー", "所有编辑均为覆盖操作,留空则不更改": "すべての編集は上書き操作です。未入力の場合は変更なしとなります", "所选模板已存在": "選択したテンプレートは既に存在します", "手动禁用": "手動で無効にする", - "手动编辑": "手動編集", + "手动编辑": "JSON編集", "手动输入": "手動入力", "打开 CC Switch": "CC Switchを開く", "打开侧边栏": "サイドバーを展開", @@ -1360,6 +1460,7 @@ "扣费": "課金", "执行 GC": "GCを実行", "执行中": "実行中", + "扩展价格": "追加価格", "扫描二维码": "QRコードスキャン", "批量创建": "一括作成", "批量创建时会在名称后自动添加随机后缀": "一括作成時、名称の後ろにランダムなサフィックスが自動的に追加されます", @@ -1369,6 +1470,7 @@ "批量删除失败": "一括削除に失敗しました", "批量删除成功": "Batch deletion successful", "批量删除模型": "モデルの一括削除", + "批量应用当前模型价格": "現在のモデル価格を一括適用", "批量操作": "一括操作", "批量操作失败": "Batch operation failed", "批量操作完成: {{success}}个成功, {{failed}}个失败": "Batch operation completed: {{success}} succeeded, {{failed}} failed", @@ -1392,13 +1494,17 @@ "按倍率类型筛选": "倍率タイプで絞り込み", "按倍率设置": "倍率設定", "按次": "リクエストごと", + "按次 {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "リクエストごと {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "按次计费": "リクエストごとの課金", + "按次:{{symbol}}{{price}}": "リクエストごと:{{symbol}}{{price}}", + "按次:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "リクエストごと:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}", "按照如下格式输入:AccessKey|SecretAccessKey|Region": "Enter in the format: AccessKey|SecretAccessKey|Region", "按量计费": "従量課金", + "按量计费下需要先填写输入价格,才能保存其它价格项。": "従量課金では、他の価格項目を保存する前に入力価格を設定する必要があります。", "按顺序替换content中的变量占位符": "content内の変数プレースホルダーを順番に置換します", "换脸": "フェイススワップ", - "授权,需在遵守": "の条件に基づき、", "授权失败": "認可に失敗しました", + "授权,需在遵守": "の条件に基づき、", "排序": "並び順", "排队中": "待機中", "接受未设置价格模型": "料金未設定モデルを許可", @@ -1409,8 +1515,8 @@ "控制输出的随机性和创造性": "出力のランダム性と創造性を制御", "控制顶栏模块显示状态,全局生效": "トップバーモジュールの表示ステータスをグローバルに制御します", "推荐": "おすすめ", - "推荐:用户可以选择是否使用指纹等验证": "推奨:ユーザーは指紋認証などの利用を選択できます", "推荐使用(用户可选)": "(オプション)推奨", + "推荐:用户可以选择是否使用指纹等验证": "推奨:ユーザーは指紋認証などの利用を選択できます", "描述": "説明", "提交": "送信", "提交时间": "送信日時", @@ -1420,13 +1526,14 @@ "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "Prompt {{input}} tokens / 1M tokens * {{symbol}}{{price}}", "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "プロンプト {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 補完 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 缓存创建 {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "プロンプト {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + キャッシュ {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + キャッシュ作成 {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + 補完 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "提示价格:{{symbol}}{{price}} / 1M tokens": "プロンプト料金:{{symbol}}{{price}} / 1M tokens", + "提示缓存倍率": "プロンプトキャッシュ倍率", "提示:如需备份数据,只需复制上述目录即可": "ヒント:データをバックアップする際は、上記のディレクトリをコピーしてください", "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。": "注意: ここでの設定は「モデル広場」での表示にのみ影響し、実際の呼び出しやルーティングには影響しません。実際の呼び出しを設定する場合は、「チャネル管理」で設定してください。", + "提示:端点映射仅用于模型广场展示,不会影响模型真实调用。如需配置真实调用,请前往「渠道管理」。": "注意: エンドポイントマッピングは「モデル広場」での表示専用で、実際の呼び出しには影響しません。実際の呼び出し設定は「チャネル管理」で行ってください。", "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。": "注意: この機能はベータ版です。今後、設定構造や挙動が変更される可能性があります。本番環境では使用しないでください。", "提示:语言偏好会同步到您登录的所有设备,并影响API返回的错误消息语言。": "ヒント:言語設定はログインしているすべてのデバイスに同期され、APIが返すエラーメッセージの言語に影響します。", "提示:链接中的{key}将被替换为API密钥,{address}将被替换为服务器地址": "ヒント:リンク内の{key}はAPIキーに、{address}はサーバーURLに置換されます", - "提示价格:{{symbol}}{{price}} / 1M tokens": "プロンプト料金:{{symbol}}{{price}} / 1M tokens", - "提示缓存倍率": "プロンプトキャッシュ倍率", "搜索供应商": "プロバイダーで検索", "搜索关键字": "検索キーワード", "搜索失败": "Search failed", @@ -1455,6 +1562,8 @@ "支付失败": "支払いに失敗しました", "支付宝": "Alipay", "支付方式": "チャージ方法", + "支付方式名称": "決済方法名", + "支付方式类型": "決済方法タイプ", "支付渠道": "決済チャネル", "支付设置": "決済設定", "支付请求失败": "決済リクエストに失敗しました", @@ -1480,8 +1589,6 @@ "收益统计": "収益統計", "收起": "折りたたみ", "收起侧边栏": "サイドバー折りたたみ", - "向左展开": "左に展開", - "向右展开": "右に展開", "收起内容": "コンテンツ折りたたみ", "放大": "アップスケール", "放大编辑": "エディタで開く", @@ -1500,14 +1607,19 @@ "数据管理和日志查看": "データ管理とログ閲覧", "文件上传": "ファイルアップロード", "文件搜索价格:{{symbol}}{{price}} / 1K 次": "ファイル検索料金:{{symbol}}{{price}} / 1K 回", + "文件搜索调用 {{fileSearchCallCount}} 次": "ファイル検索呼び出し {{fileSearchCallCount}} 回", + "文件搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "ファイル検索: {{count}} / 1K * 単価 {{price}} * {{ratioType}} {{ratio}} = {{amount}}", "文字提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 文字补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} = {{symbol}}{{total}}": "プロンプト {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 補完 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} = {{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}}": "テキストプロンプト {{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}}", "文字提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 文字补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} = {{symbol}}{{total}}": "プロンプト {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + キャッシュ {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 補完 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} = {{symbol}}{{total}}", "文字输入": "テキスト入力", "文字输出": "テキスト出力", + "文字输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "テキスト出力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * 補完倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "文心一言": "ERNIE Bot", "文档": "ドキュメント", "文档地址": "ドキュメントURL", "文生视频": "テキストからの動画生成", + "新增": "追加", "新增 Key 来源": "キーソースを追加", "新增供应商": "プロバイダーの追加", "新增失败": "追加に失敗しました", @@ -1523,9 +1635,9 @@ "新建容器部署": "Create Container Deployment", "新建数量": "作成数", "新建组": "新規グループ", + "新格式模板": "新規形式テンプレート", "新格式(支持条件判断与json自定义):": "新規形式(条件判断とカスタムJSONに対応):", "新格式(规则 + 条件)": "新形式(ルール + 条件)", - "新格式模板": "新規形式テンプレート", "新版本": "新しいバージョン", "新用户使用邀请码奖励额度": "招待コードを利用した新規ユーザーへの特典クォータ", "新用户初始额度": "新規ユーザーの初期クォータ", @@ -1542,6 +1654,7 @@ "无法复制到剪贴板,请手动复制": "クリップボードにコピーできません。手動でコピーしてください。", "无法添加图片": "画像を追加できません", "无法获取容器详情": "Unable to get container details", + "无法读取剪贴板": "クリップボードを読み取れません", "无法连接 io.net": "Unable to connect to io.net", "无生效": "有効なし", "无邀请人": "招待元なし", @@ -1552,19 +1665,19 @@ "日志已下载": "Logs downloaded", "日志已加载": "Logs loaded", "日志已复制到剪贴板": "Logs copied to clipboard", + "日志总大小": "ログ合計サイズ", + "日志文件数": "ログファイル数", + "日志时间范围": "ログ期間", "日志流": "Log Stream", "日志清理失败:": "ログのクリアに失敗しました:", + "日志目录": "ログディレクトリ", "日志类型": "ログタイプ", "日志设置": "ログ設定", "日志详情": "ログ詳細", - "日志目录": "ログディレクトリ", - "日志文件数": "ログファイル数", - "日志时间范围": "ログ期間", - "日志总大小": "ログ合計サイズ", - "旧格式(JSON 对象)": "レガシー形式(JSONオブジェクト)", - "旧格式(直接覆盖):": "旧形式(直接上書き):", "旧格式必须是 JSON 对象": "レガシー形式はJSONオブジェクトである必要があります", "旧格式模板": "旧形式テンプレート", + "旧格式(JSON 对象)": "レガシー形式(JSONオブジェクト)", + "旧格式(直接覆盖):": "旧形式(直接上書き):", "旧的备用码已失效,请保存新的备用码": "古いバックアップコードは無効になりました。新規バックアップコードを保存してください", "早上好": "おはようございます", "时间": "時間", @@ -1581,18 +1694,19 @@ "是否自动禁用": "自動的に無効にする", "是否要求指纹/面容等生物识别": "生体認証を要求する", "显示倍率": "表示倍率", - "显示最新20条": "最新20件を表示", "显示名称": "表示名", "显示名称字段(可选)": "表示名フィールド(オプション)", "显示完整内容": "すべてのコンテンツを表示", "显示操作项": "操作項目を表示", "显示更多": "もっと見る", + "显示最新20条": "最新20件を表示", "显示第": "表示", "显示设置": "表示設定", "显示调试": "デバッグを表示", "晚上好": "こんばんは", "普通环境变量": "Regular Environment Variables", "普通用户": "一般ユーザー", + "普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "通常入力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "智能体ID": "エージェントID", "智能熔断": "スマートフォールバック", "智谱": "Zhipu AI", @@ -1604,6 +1718,7 @@ "暂无保存的配置": "保存済みの設定はありません", "暂无充值记录": "チャージ履歴はありません", "暂无公告": "お知らせはありません", + "暂无分组,点击下方按钮添加": "グループがありません。下のボタンをクリックして追加してください。", "暂无匹配模型": "マッチングするモデルはありません", "暂无可复制 JSON": "コピー可能なJSONがありません", "暂无可复制的版本信息": "No version information to copy", @@ -1630,7 +1745,9 @@ "暂无监控数据": "監視データはありません", "暂无系统公告": "システムからのお知らせはありません", "暂无缺失模型": "欠落しているモデルはありません", + "暂无自动分组,点击下方按钮添加": "自動グループがありません。下のボタンをクリックして追加してください。", "暂无自定义 OAuth 提供商": "カスタムOAuthプロバイダーはありません", + "暂无规则,点击下方按钮添加": "ルールがありません。下のボタンをクリックして追加してください。", "暂无订阅套餐": "利用可能なサブスクリプションプランがありません", "暂无订阅记录": "サブスクリプション記録がありません", "暂无请求数据": "リクエストデータはありません", @@ -1666,8 +1783,21 @@ "更新配置后,容器可能需要重启以应用新的设置。请确保您了解这些更改的影响。": "After updating the configuration, the container may need to restart to apply the new settings. Please ensure you understand the impact of these changes.", "更新配置失败": "Failed to update configuration", "更新预填组": "事前入力グループの更新", + "最低": "最低", + "最低充值美元数量": "最低チャージUSD額", + "最后使用时间": "最終利用日時", + "最后更新": "Last Updated", + "最后请求": "最終リクエスト日時", + "最大GPU数量": "Max Number of GPUs", + "最大可用": "Max Available", + "最大条目数": "最大エントリ数", + "最终抵扣": "最終控除", + "最近一次": "最新", + "最近事件": "Recent Events", + "最高优先级": "最高優先", "月": "月", "有 Reasoning": "推論あり", + "有序字符串数组": "順序付き文字列配列", "有效期": "有効期限", "有效期单位": "有効期限の単位", "有效期数值": "有効期限の値", @@ -1710,8 +1840,9 @@ "未绑定": "未連携", "未获取到授权码": "認可コードの取得に失敗しました", "未设置": "未設定", - "未设置倍率模型": "倍率が未設定のモデル", + "未设置价格": "価格未設定", "未设置价格模型": "価格が未設定のモデル", + "未设置倍率模型": "倍率が未設定のモデル", "未设置路径": "パスが設定されていません", "未配置模型": "未設定モデル", "未配置的模型列表": "未設定のモデルリスト", @@ -1719,8 +1850,8 @@ "本地数据存储": "ローカルストレージ", "本地计费": "Local billing", "本月获得": "今月の獲得", - "本设备:手机指纹/面容,外接:USB安全密钥": "内蔵:スマートフォンの指紋/顔認証、外部:USBセキュリティキー", "本设备内置": "このデバイス", + "本设备:手机指纹/面容,外接:USB安全密钥": "内蔵:スマートフォンの指紋/顔認証、外部:USBセキュリティキー", "本项目根据": "本プロジェクトは", "机密环境变量": "Secret Environment Variables", "机密环境变量将被加密存储,适用于存储密码、API密钥等敏感信息。": "Secret environment variables will be stored encrypted, suitable for storing passwords, API keys and other sensitive information.", @@ -1729,12 +1860,12 @@ "权限设置": "権限設定", "条": "件", "条 - 第": "~", - "条,共": "件、合計", "条件取反": "条件を反転", "条件数": "条件数", "条件规则": "条件ルール", "条件项设置": "条件項目設定", "条日志已清理!": "件のログがクリアされました", + "条,共": "件、合計", "来源": "ソース", "来源于 IO.NET 部署": "From IO.NET Deployment", "来源端点": "ソースエンドポイント", @@ -1748,8 +1879,10 @@ "查看所有可用的AI模型供应商,包括众多知名供应商的模型。": "有名プロバイダーをはじめ、利用可能なすべてのAIモデルプロバイダーを一覧表示します。", "查看日志": "View Logs", "查看渠道密钥": "APIキーの詳細", + "查看示例": "例を見る", "查看详情": "View Details", "查询": "検索", + "标准价格": "標準価格", "标签": "タグ", "标签不能为空!": "タグは空にできません", "标签信息": "タグ情報", @@ -1759,6 +1892,8 @@ "标签聚合": "タグ別表示", "标签聚合模式": "タグ別表示モード", "标识颜色": "識別カラー", + "核心概念": "基本概念", + "核心配置": "基本設定", "核采样,控制词汇选择的多样性": "ニュークリアスサンプリング、語彙選択の多様性を制御", "根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。": "Anthropic の仕様により、/v1/messages の入力 tokens は非キャッシュ入力のみを集計し、キャッシュ読み取り/書き込み tokens は含みません。", "根据模型名称和匹配规则查找模型元数据,优先级:精确 > 前缀 > 后缀 > 包含": "モデル名とマッチングルールに基づきモデルメタデータを検索します。優先度:完全一致 > プレフィックス > サフィックス > 部分一致", @@ -1766,27 +1901,34 @@ "格式化 JSON": "JSON を整形", "格式正确": "有効な形式", "格式示例:": "フォーマット例:", - "前:": "前:", - "配置:": "設定:", - "后:": "後:", "格式错误": "無効な形式", "检查更新": "更新を確認", "检测到 FluentRead(流畅阅读)": "FluentReadが検出されました", + "检测到剪贴板中的连接信息": "クリップボードに接続情報が検出されました", "检测到多个密钥,您可以单独复制每个密钥,或点击复制全部获取完整内容。": "複数のAPIキーが検出されました。各キーを個別にコピーするか、「すべてコピー」をクリックして全内容を取得できます。", "检测到该消息后有AI回复,是否删除后续回复并重新生成?": "このメッセージの後にAIからの返信があります。後続の返信を削除して再生成しますか?", "检测必须等待绘图成功才能进行放大等操作": "アップスケールなどの操作を行うには、画像生成が成功するまで待つ必要があります", + "概览": "概要", "模型": "モデル", + "模型 {{name}} 缺少输入价格,无法计算补全/缓存/图片/音频价格对应的倍率": "モデル {{name}} に入力価格がないため、補完・キャッシュ・画像・音声価格に対応する倍率を計算できません。", + "模型 {{name}} 缺少音频输入价格,无法计算音频补全倍率": "モデル {{name}} に音声入力価格がないため、音声補完倍率を計算できません。", "模型: {{ratio}}": "モデル:{{ratio}}", "模型专用区域": "モデル別リージョン設定", "模型价格": "モデル料金", + "模型价格 {{price}}": "モデル価格 {{price}}", + "模型价格 {{symbol}}{{price}} / 次": "モデル価格 {{symbol}}{{price}} / リクエスト", + "模型价格 {{symbol}}{{price}} / 次 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "モデル価格 {{symbol}}{{price}} / リクエスト * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}": "モデル料金 {{symbol}}{{price}}、{{ratioType}} {{ratio}}", + "模型价格:{{symbol}}{{price}}": "モデル価格:{{symbol}}{{price}}", "模型价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "モデル料金:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}", - "按次:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "リクエストごと:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}", + "模型价格:{{symbol}}{{price}} / 次": "モデル価格:{{symbol}}{{price}} / リクエスト", "模型倍率": "モデル倍率", "模型倍率 {{modelRatio}}": "Model ratio {{modelRatio}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}}": "モデル倍率 {{modelRatio}}、キャッシュ倍率 {{cacheRatio}}、補完倍率 {{completionRatio}}、{{ratioType}} {{ratio}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}},Web 搜索调用 {{webSearchCallCount}} 次": "モデル倍率 {{modelRatio}}、キャッシュ倍率 {{cacheRatio}}、補完倍率 {{completionRatio}}、{{ratioType}} {{ratio}}、Web検索APIコール {{webSearchCallCount}} 回", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},图片输入倍率 {{imageRatio}},{{ratioType}} {{ratio}}": "モデル倍率 {{modelRatio}}、キャッシュ倍率 {{cacheRatio}}、補完倍率 {{completionRatio}}、画像入力倍率 {{imageRatio}}、{{ratioType}} {{ratio}}", + "模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},音频倍率 {{audioRatio}},音频补全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}": "モデル倍率 {{modelRatio}}、補完倍率 {{completionRatio}}、音声倍率 {{audioRatio}}、音声補完倍率 {{audioCompletionRatio}}、{{cachePart}}{{ratioType}} {{ratio}}", + "模型倍率 {{modelRatio}},输出倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},{{ratioType}} {{ratio}}": "モデル倍率 {{modelRatio}}、出力倍率 {{completionRatio}}、キャッシュ倍率 {{cacheRatio}}、{{ratioType}} {{ratio}}", "模型倍率 {{modelRatio}},输出倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},缓存创建倍率 {{cacheCreationRatio}},{{ratioType}} {{ratio}}": "モデル倍率 {{modelRatio}}、補完倍率 {{completionRatio}}、キャッシュ倍率 {{cacheRatio}}、キャッシュ作成倍率 {{cacheCreationRatio}}、{{ratioType}} {{ratio}}", "模型倍率值": "モデル倍率", "模型倍率和补全倍率": "モデル倍率と補完倍率", @@ -1804,6 +1946,7 @@ "模型名称已存在": "そのモデル名はすでに存在します", "模型固定价格": "モデル固定料金", "模型图标": "モデルアイコン", + "模型定价设置": "モデル料金設定", "模型定价,需要登录访问": "モデル料金(アクセスにはログインが必要です)", "模型广场": "モデルマーケットプレイス", "模型拉取失败: {{error}}": "Failed to pull model: {{error}}", @@ -1813,8 +1956,8 @@ "模型更新成功!": "モデルの更新に成功しました!", "模型未加入列表,可能无法调用": "Model not in the list; requests may fail", "模型正则": "モデル正規表現", - "模型正则(每行一个)": "モデル正規表現(1行に1つ)", "模型正则不能为空": "モデル正規表現は空にできません", + "模型正则(每行一个)": "モデル正規表現(1行に1つ)", "模型消耗分布": "モデル消費分布", "模型消耗趋势": "モデル消費推移", "模型版本": "モデルバージョン", @@ -1824,6 +1967,7 @@ "模型管理": "モデル管理", "模型组": "モデルグループ", "模型补全倍率(仅对自定义模型有效)": "モデル補完倍率(カスタムモデルにのみ有効)", + "模型计费编辑器": "モデル料金エディタ", "模型请求速率限制": "モデルのレート制限", "模型调用次数占比": "モデル呼び出し回数割合", "模型调用次数排行": "モデル呼び出し回数ランキング", @@ -1854,6 +1998,7 @@ "正在跟随最新日志": "Following latest logs", "正在跳转 GitHub...": "GitHub にリダイレクトしています...", "正在跳转...": "リダイレクト中...", + "正常情况下,令牌的计费倍率由令牌所选的分组决定。特殊倍率可以根据「用户所在分组」进一步覆盖这个倍率。": "通常、トークンの課金レートは選択したグループで決まります。特殊レートを使えば、ユーザーの所属グループに基づいてこのレートを上書きできます。", "此代理仅用于图片请求转发,Webhook通知发送等,AI API请求仍然由服务器直接发出,可在渠道设置中单独配置代理": "このプロキシは、画像リクエストの転送やWebhook通知の送信などにのみ使用されます。AI APIリクエストは引き続きサーバーから直接送信されます。プロキシが必要な場合は、チャネル設定で個別に設定してください", "此修改将不可逆": "この変更は元に戻すことはできません。", "此操作不可恢复,请仔细确认时间后再操作!": "この操作は元に戻すことができません。時刻を慎重にご確認の上、実行してください", @@ -1868,9 +2013,11 @@ "此操作将解绑用户当前的 Passkey,下次登录需要重新注册。": "この操作は、ユーザーの現在のPasskeyとの連携を解除します。次回ログイン時に再登録が必要になります。", "此操作将降低用户的权限级别": "この操作はユーザーの権限レベルを降格させます", "此支付方式最低充值金额为": "このチャージ方法の最低チャージ額:", + "此时用户创建令牌时只能看到 standard 和 premium:": "この場合、ユーザーはトークン作成時にstandardとpremiumのみ表示されます:", "此渠道由 IO.NET 自动同步,类型、密钥和 API 地址已锁定。": "This channel is automatically synchronized by IO.NET, type, key and API address are locked.", "此设置用于系统内部计算,默认值500000是为了精确到6位小数点设计,不推荐修改。": "この設定はシステム内部の計算用です。デフォルト値の500000は小数点以下6桁までの精度を確保するために設計されており、変更は推奨されません", "此页面仅显示未设置价格或倍率的模型,设置后将自动从列表中移除": "このページには料金や倍率が未設定のモデルのみが表示され、設定後にリストから自動的に削除されます", + "此页面仅显示未设置价格或基础倍率的模型,设置后会自动从列表中移出": "このページには価格または基本倍率が未設定のモデルのみ表示され、設定後は一覧から自動的に消えます。", "此项只读,需要用户通过个人设置页面的相关绑定按钮进行绑定,不可直接修改": "読み取り専用です。変更は個人設定の連携ボタンから行います。直接編集できません", "此项可选,用于修改请求体中的模型名称,为一个 JSON 字符串,键为请求中模型名称,值为要替换的模型名称,例如:": "(オプション)リクエストボディ内のモデル名を変更する場合に使用します。JSON文字列で入力してください。キー:リクエスト内のモデル名、値:置換後のモデル名。例:", "此项可选,用于修改请求体中的模型名称,为一个 JSON 字符串,键为请求中模型名称,值为要替换的模型名称,留空则不更改": "(オプション)リクエストボディ内のモデル名を変更する場合に使用します。JSON文字列で入力してください。キー:リクエスト内のモデル名、値:置換後のモデル名。空欄の場合は変更されません", @@ -1878,6 +2025,7 @@ "此项可选,用于覆盖请求参数。不支持覆盖 stream 参数": "(オプション)リクエストヘッダーのパラメータを上書きする場合に使用します。stream パラメータの上書きはサポート対象外です。", "此项可选,用于覆盖请求头参数": "(オプション)リクエストヘッダーのパラメータを上書きする場合に使用します", "此项可选,用于通过自定义API地址来进行 API 调用,末尾不要带/v1和/": "(オプション)カスタムベースURLでのAPIコール用。末尾に/v1, /は含めません", + "每个分组代表一个价格档位。管理员创建分组后,可以选择哪些档位对用户开放自选。": "各グループは1つの料金プランを表します。管理者がグループを作成後、どのプランをユーザーに公開するか選択できます。", "每个用户最多可创建的令牌数量,默认 1000,设置过大可能会影响性能": "各ユーザーが作成できるトークンの最大数、デフォルト1000。大きすぎるとパフォーマンスに影響する場合があります", "每周": "毎週", "每天": "毎日", @@ -1886,16 +2034,21 @@ "每日签到": "毎日のチェックイン", "每日签到可获得随机额度奖励": "毎日のチェックインでランダムなクォータ報酬を獲得できます", "每月": "毎月", + "每美元对应 Token 数": "1米ドルあたりのトークン数", "每隔多少分钟测试一次所有通道": "すべてのチャネルのテスト間隔(分)", "永不过期": "無期限", "永久删除您的两步验证设置": "2要素認証設定を永久に削除", "永久删除所有备用码(包括未使用的)": "すべてのバックアップコード(未使用分を含む)を永久に削除", + "汇率": "為替レート", + "沙盒环境 RSA 私钥 Base64 (PKCS#8 DER)": "サンドボックス RSA 秘密鍵 Base64 (PKCS#8 DER)", + "沙盒环境 Waffo 公钥 Base64 (X.509 DER)": "サンドボックス Waffo 公開鍵 Base64 (X.509 DER)", "没有匹配的字段": "一致するフィールドがありません", "没有匹配的日志条目": "No matching log entries", "没有匹配的规则": "一致するルールがありません", "没有可用令牌用于填充": "利用可能なトークンがありません", "没有可用模型": "利用可能なモデルがありません", "没有找到匹配的模型": "マッチングするモデルが見つかりませんでした", + "没有未设置定价的模型": "価格未設定のモデルはありません", "没有未设置的模型": "未設定のモデルはありません", "没有条件时,默认总是执行该操作。": "条件が設定されていない場合、デフォルトで常にこの操作が実行されます。", "没有模型可以复制": "コピーできるモデルがありません", @@ -1904,8 +2057,8 @@ "注册": "サインアップ", "注册 Passkey": "Passkeyの登録", "注意": "ご注意", - "注意:JSON中重复的键只会保留最后一个同名键的值": "ご注意:JSONでは、キーが重複している場合、最後の同名キーの値のみが保持されます", "注意非Chat API,请务必填写正确的API地址,否则可能导致无法使用": "ご注意:Chat API以外の場合、必ず正しいベースURLを入力してください。正しく入力しないと、利用できません", + "注意:JSON中重复的键只会保留最后一个同名键的值": "ご注意:JSONでは、キーが重複している場合、最後の同名キーの値のみが保持されます", "注销": "ログアウト", "注销成功!": "ログアウトしました", "活跃文件": "アクティブファイル", @@ -1943,6 +2096,7 @@ "深色": "ダーク", "深色模式": "ダークモード", "添加": "追加", + "添加 (+:)": "追加 (+:)", "添加 OAuth 提供商": "OAuthプロバイダーを追加", "添加API": "API追加", "添加产品": "Add Product", @@ -1950,6 +2104,7 @@ "添加兑换码": "新規引き換えコード作成", "添加公告": "お知らせ追加", "添加分类": "分類追加", + "添加分组": "グループを追加", "添加后提交": "Submit after adding", "添加启动参数": "Add Startup Args", "添加启动命令": "Add Startup Command", @@ -1961,6 +2116,7 @@ "添加环境变量": "Add Environment Variable", "添加用户": "新規ユーザー追加", "添加聊天配置": "チャット設定追加", + "添加规则": "ルールを追加", "添加键值对": "キー/値ペア追加", "添加问答": "FAQ追加", "添加额度": "残高追加", @@ -1979,8 +2135,8 @@ "渠道 ID": "チャネルID", "渠道ID,名称,密钥,API地址": "チャネルID\\名称\\キー\\ベースURL", "渠道亲和性": "チャネル親和性", - "渠道亲和性:上游缓存命中": "チャネルアフィニティ:上流キャッシュヒット", "渠道亲和性会基于从请求上下文或 JSON Body 提取的 Key,优先复用上一次成功的渠道。": "チャネルアフィニティは、リクエストコンテキストまたはJSON Bodyから抽出されたキーに基づいて、前回成功したチャネルを優先的に再利用します。", + "渠道亲和性:上游缓存命中": "チャネルアフィニティ:上流キャッシュヒット", "渠道优先级": "チャネル優先度", "渠道信息": "チャネル情報", "渠道创建成功!": "チャネルの作成に成功しました", @@ -1998,6 +2154,7 @@ "渠道的模型测试": "チャネルのモデルテスト", "渠道的高级配置选项": "チャネルの詳細設定", "渠道管理": "チャネル管理", + "渠道行为": "チャネル動作", "渠道额外设置": "チャネル詳細設定", "源地址": "ベースURL", "满足任一条件(OR)": "いずれかの条件を満たす(OR)", @@ -2015,6 +2172,8 @@ "点击预览音乐": "音楽をプレビュー", "点击验证按钮,使用您的生物特征或安全密钥": "認証ボタンをクリックし、生体情報またはセキュリティキーを使用してください", "版权所有": "All rights reserved", + "特殊倍率": "特殊レート", + "特殊可用分组规则": "特殊利用可能グループルール", "状态": "ステータス", "状态码": "ステータスコード", "状态码复写": "ステータスコードの上書き", @@ -2022,6 +2181,8 @@ "状态筛选": "ステータスフィルター", "状态页面Slug": "ステータスページスラッグ", "环境变量": "Environment Variables", + "生产环境 RSA 私钥 Base64 (PKCS#8 DER)": "本番環境 RSA 秘密鍵 Base64 (PKCS#8 DER)", + "生产环境 Waffo 公钥 Base64 (X.509 DER)": "本番環境 Waffo 公開鍵 Base64 (X.509 DER)", "生成令牌": "トークン生成", "生成并填入": "生成して入力", "生成数量": "生成数", @@ -2052,20 +2213,25 @@ "用户信息": "ユーザー情報", "用户信息更新成功!": "ユーザー情報の更新に成功しました", "用户信息缺失": "ユーザー情報がありません", - "用户最大令牌数量": "ユーザーあたりの最大トークン数", "用户分组": "ユーザーグループ", "用户分组和额度管理": "ユーザーグループとクォータの管理", + "用户分组的联动作用": "ユーザーグループの連動効果", "用户分组配置": "ユーザーグループ設定", + "用户创建令牌 → 选择分组下拉框:": "ユーザーがトークン作成 → グループ選択ドロップダウン:", + "用户创建令牌时选择的分组,决定该令牌的实际计费倍率。一个用户可以创建多个令牌,使用不同分组。": "トークン作成時に選択するグループが実際の課金レートを決定します。1人のユーザーが複数のトークンを異なるグループで作成できます。", "用户协议": "ユーザー利用規約", "用户协议已更新": "ユーザー利用規約が更新されました", "用户协议更新失败": "ユーザー利用規約の更新に失敗しました", - "用户可选分组": "利用可能なグループ", + "用户可选": "ユーザー選択可", + "用户可选分组": "ユーザー選択可能グループ", + "用户可选分组的名称和描述(只包含勾选了用户可选的分组)": "ユーザーが選択可能なグループの名前と説明(チェック済みのグループのみ)", "用户名": "ユーザー名", "用户名字段(可选)": "ユーザー名フィールド(オプション)", "用户名或邮箱": "ユーザー名かメールアドレス", "用户名称": "ユーザー名", "用户控制面板,管理账户": "ユーザーコンソールでアカウントを管理します", "用户新建令牌时可选的分组,格式为 JSON 字符串,例如:{\"vip\": \"VIP 用户\", \"test\": \"测试\"},表示用户可以选择 vip 分组和 test 分组": "ユーザーが新規トークンを作成する際に利用可能なグループです。JSON文字列の形式で入力してください。例:{\"vip\": \"VIPユーザー\", \"test\": \"テスト\"} は、ユーザーがvipグループとtestグループを選択できることを示します。", + "用户最大令牌数量": "ユーザーあたりの最大トークン数", "用户每周期最多请求完成次数": "期間ごとのユーザー最大成功リクエスト数", "用户每周期最多请求次数": "期間ごとのユーザー最大リクエスト数", "用户注册时看到的网站名称,比如'我的网站'": "ユーザーがサインアップ時に表示されるウェブサイト名です。例:「マイサイト」", @@ -2077,6 +2243,7 @@ "用户账户管理": "ユーザーアカウント管理", "用时/首字": "所要時間 / 初回トークン", "由全站货币展示设置统一控制": "サイト全体の通貨表示設定で統一して管理", + "由管理员分配,决定用户身份等级(如 default、vip)。": "管理者が割り当て、ユーザーの等級を決定します(例:default、vip)。", "由订阅抵扣": "サブスクリプションで相殺", "界面语言和其他个人偏好": "インターフェース言語とその他の個人設定", "留空使用系统临时目录": "空欄でシステム一時ディレクトリを使用", @@ -2093,11 +2260,13 @@ "监控设置": "監視設定", "目录总大小": "ディレクトリ合計サイズ", "目录文件数": "ディレクトリファイル数", + "目标分组": "対象グループ", "目标用户:{{username}}": "対象ユーザー:{{username}}", "目标端点": "ターゲットエンドポイント", "目标路径(可选)": "ターゲットパス(オプション)", "直接提交": "Submit directly", "直接编辑 JSON 文本,保存时会校验格式。": "JSONテキストを直接編集します。保存時にフォーマットが検証されます。", + "直接追加(和添加类似,但无前缀)": "直接付加(追加と類似、プレフィックスなし)", "相关项目": "関連プロジェクト", "相当于删除用户,此修改将不可逆": "ユーザーの削除に相当します。この変更は元に戻すことはできません", "矛盾": "競合", @@ -2107,7 +2276,6 @@ "硬件类型": "Hardware Type", "硬件配置": "Hardware Configuration", "确定": "確認", - "确定?": "確認", "确定删除此组?": "このグループを削除してもよろしいですか?", "确定导入": "インポート", "确定是否要修复数据库一致性?": "データベースの整合性を修復してもよろしいですか?", @@ -2149,12 +2317,15 @@ "确定要降级此用户吗?": "このユーザーを降格させてもよろしいですか?", "确定重置": "リセットの確認", "确定重置模型倍率吗?": "モデル倍率をリセットしますか?", + "确定?": "確認", "确认": "確認", "确认作废": "無効化の確認", "确认关闭提示": "閉じる確認", "确认冲突项修改": "競合項目の変更の確認", "确认删除": "削除の確認", "确认删除模型": "Confirm Delete Model", + "确认删除该分组?": "このグループを削除しますか?", + "确认删除该规则?": "このルールを削除しますか?", "确认取消密码登录": "パスワードログイン無効化の確認", "确认启用": "有効化を確認", "确认密码": "パスワード(確認用)", @@ -2164,11 +2335,12 @@ "确认操作": "Confirm Operation", "确认新密码": "新しいパスワードの確認", "确认清理不活跃的磁盘缓存?": "非アクティブなディスクキャッシュをクリーンアップしますか?", + "确认清理日志文件?": "ログファイルのクリーンアップを確認しますか?", "确认清空全部渠道亲和性缓存": "すべてのチャネルアフィニティキャッシュのクリアを確認", "确认清空该规则缓存": "このルールのキャッシュクリアを確認", "确认清除历史日志": "履歴のクリアの確認", - "确认清理日志文件?": "ログファイルのクリーンアップを確認しますか?", "确认禁用": "無効化の確認", + "确认移除?": "削除しますか?", "确认补单": "手動チャージの確認", "确认解绑": "連携解除の確認", "确认解绑 Passkey": "Passkey連携解除の確認", @@ -2180,16 +2352,13 @@ "磁盘使用率超过此值时拒绝请求": "ディスク使用率がこの値を超えた場合にリクエストを拒否", "磁盘可用空间小于缓存最大总量设置": "ディスクの空き容量がキャッシュの最大合計サイズ設定より少ないです", "磁盘命中": "ディスクヒット", - "磁盘缓存最大总量 (MB)": "ディスクキャッシュ最大合計 (MB)", "磁盘缓存占用的最大空间": "ディスクキャッシュが占める最大容量", "磁盘缓存已清理": "ディスクキャッシュがクリアされました", + "磁盘缓存最大总量 (MB)": "ディスクキャッシュ最大合計 (MB)", "磁盘缓存设置(磁盘换内存)": "ディスクキャッシュ設定(ディスク/メモリ交換)", "磁盘缓存阈值 (MB)": "ディスクキャッシュ閾値 (MB)", "示例": "サンプル", "示例:{\"default\": [200, 100], \"vip\": [0, 1000]}。": "例:{\"default\": [200, 100], \"vip\": [0, 1000]}。", - "视频": "動画", - "视频Remix": "動画リミックス", - "视频无法在当前浏览器中播放,这可能是由于:": "The video cannot be played in this browser, possibly because:", "禁用": "無効にする", "禁用 store 透传": "ストアパススルーを無効にする", "禁用2FA失败": "2要素認証の無効化に失敗しました", @@ -2207,12 +2376,19 @@ "私有镜像仓库的密码": "Password for private image registry", "私有镜像仓库的用户名": "Username for private image registry", "秒": "秒", - "移除 functionResponse.id 字段": "functionResponse.idフィールドを削除", + "移除": "削除", + "移除 (-:)": "削除 (-:)", "移除 One API 的版权标识必须首先获得授权,项目维护需要花费大量精力,如果本项目对你有意义,请主动支持本项目": "One APIの著作権表示を削除するには、事前の許可が必要です。プロジェクトの維持には多大な労力がかかります。もしこのプロジェクトがあなたにとって有意義でしたら、積極的なご支援をお願いいたします", + "移除 functionResponse.id 字段": "functionResponse.idフィールドを削除", + "空": "空", "窗口处理": "ウィンドウ処理", "窗口等待": "ウィンドウ待機中", "立即签到": "今すぐチェックイン", "立即订阅": "今すぐサブスクリプション", + "站点所有额度将以原始 Token 数显示,不做货币换算": "サイトのすべてのクォータは通貨換算なしで元のトークン数で表示されます", + "站点所有额度将以美元 ($) 显示": "サイトのすべてのクォータは米ドル ($) で表示されます", + "站点所有额度将按汇率换算为人民币 (¥) 显示": "サイトのすべてのクォータは為替レートで人民元 (¥) に換算して表示されます", + "站点所有额度将按汇率换算为自定义货币显示": "サイトのすべてのクォータは為替レートでカスタム通貨に換算して表示されます", "站点额度展示类型及汇率": "サイトの残高表示タイプと為替レート", "端口号必须在1-65535之间": "Port number must be between 1-65535", "端口配置详细说明": "ポート設定の詳細説明", @@ -2236,37 +2412,41 @@ "等待中": "待機中", "等待获取邮箱信息...": "メールアドレス情報を取得中...", "筛选": "フィルター", - "签到最大额度": "チェックイン最大クォータ", - "签到最小额度": "チェックイン最小クォータ", "签到功能允许用户每日签到获取随机额度奖励": "チェックイン機能により、ユーザーは毎日チェックインしてランダムなクォータ報酬を獲得できます", "签到失败": "チェックインに失敗しました", "签到奖励将直接添加到您的账户余额": "チェックイン報酬は直接アカウント残高に追加されます", "签到奖励的最大额度": "チェックイン報酬の最大クォータ", "签到奖励的最小额度": "チェックイン報酬の最小クォータ", "签到成功!获得": "チェックイン成功!獲得", + "签到最大额度": "チェックイン最大クォータ", + "签到最小额度": "チェックイン最小クォータ", "签到设置": "チェックイン設定", + "简单来说:同一个令牌分组,不同等级的用户可以享受不同的价格。": "簡単に言えば:同じトークングループでも、異なる等級のユーザーが異なる価格を享受できます。", "简洁": "シンプル", - "简洁模式:按 type 全量清理对象,例如 redacted_thinking。": "シンプルモード:typeごとにすべてのオブジェクトをプルーニングします(例:redacted_thinking)。", "简洁模式仅返回 message;状态码和错误类型将使用系统默认值。": "シンプルモードはメッセージのみを返します。ステータスコードとエラータイプはシステムのデフォルト値を使用します。", + "简洁模式:按 type 全量清理对象,例如 redacted_thinking。": "シンプルモード:typeごとにすべてのオブジェクトをプルーニングします(例:redacted_thinking)。", "管理": "管理", "管理 Ollama 模型的拉取和删除": "Manage Ollama model pulling and deletion", "管理你的 LinuxDO OAuth App": "LinuxDO OAuth Appの管理", "管理员": "管理者", + "管理员分配的优惠分组": "管理者が割り当てる割引グループ", + "管理员分配的基础分组": "管理者が割り当てる基本グループ", "管理员区域": "管理者エリア", "管理员暂时未设置任何关于内容": "管理者はまだ「このサービスについて」のコンテンツを設定していません", "管理员未开启 Creem 充值!": "The administrator has not enabled Creem recharge!", "管理员未开启Stripe充值!": "管理者がStripeチャージを有効にしていません", - "管理员未开启在线充值!": "管理者がオンラインチャージを有効にしていません", "管理员未开启在线充值功能,请联系管理员开启或使用兑换码充值。": "管理者がオンラインチャージ機能を有効にしていません。管理者にお問い合わせいただくか、引き換えコードでチャージしてください。", + "管理员未开启在线充值!": "管理者がオンラインチャージを有効にしていません", "管理员未开启在线支付功能,请联系管理员配置。": "管理者がオンライン決済を有効にしていません。管理者に連絡してください。", "管理员未设置用户可选分组": "管理者がユーザー利用可能なグループを設定していません", + "管理员给用户分配的分组(如 vip)不仅决定用户身份,还会影响后续两个功能:": "ユーザーに割り当てるグループ(例:vip)はユーザーの身分を決定するだけでなく、以下の2つの機能にも影響します:", "管理员设置了外部链接,点击下方按钮访问": "管理者が外部リンクを設定しています。下のボタンをクリックしてアクセスしてください", "管理员账号": "管理アカウント", "管理员账号已经初始化过,请继续设置其他参数": "管理者アカウントは初期化済みです。引き続き他のパラメータを設定してください。", + "管理服务器运行日志文件。日志文件会随运行时间不断累积,建议定期清理以释放磁盘空间。": "サーバーログファイルを管理します。ログファイルは時間とともに蓄積されるため、定期的なクリーンアップでディスク容量を解放することをお勧めします。", "管理模型、标签、端点等预填组": "モデル、タグ、エンドポイントなどの事前入力グループ管理", "管理用户已绑定的第三方账户,支持筛选与解绑": "ユーザーにリンクされたサードパーティアカウントを管理、フィルタリングとバインド解除をサポート", "管理绑定": "バインド管理", - "管理服务器运行日志文件。日志文件会随运行时间不断累积,建议定期清理以释放磁盘空间。": "サーバーログファイルを管理します。ログファイルは時間とともに蓄積されるため、定期的なクリーンアップでディスク容量を解放することをお勧めします。", "类型": "タイプ", "类型(常用)": "タイプ(一般的)", "粘贴图片失败": "画像の貼り付けに失敗しました", @@ -2278,6 +2458,9 @@ "系统公告": "システムからのお知らせ", "系统公告管理,可以发布系统通知和重要消息(最多100个,前端显示最新20条)": "システムからのお知らせ管理:システムに関する通知や重要なお知らせを管理します。(最大100件、フロントエンドには最新20件が表示されます)", "系统内存": "システムメモリ", + "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为人民币,不影响内部计费": "システムは米ドル (USD) を基準通貨として使用しています。ユーザー残高、チャージ金額、モデル価格、使用ログなど、すべての金額表示がこのレートで人民元に換算されます。内部課金には影響しません。", + "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为自定义货币,不影响内部计费": "システムは米ドル (USD) を基準通貨として使用しています。ユーザー残高、チャージ金額、モデル価格、使用ログなど、すべての金額表示がこのレートでカスタム通貨に換算されます。内部課金には影響しません。", + "系统内部计费精度,默认 500000,修改可能导致计费异常,请谨慎操作": "システム内部の課金精度、デフォルト500000。変更すると課金異常が発生する可能性があります — 慎重に操作してください。", "系统初始化": "システム初期化", "系统初始化失败,请重试": "システム初期化に失敗しました。再試行してください", "系统初始化成功,正在跳转...": "システム初期化に成功しました。リダイレクト中...", @@ -2296,11 +2479,11 @@ "系统管理功能": "システム管理機能", "系统设置": "システム設定", "系统访问令牌": "システムアクセストークン", - "约": "約", "索引": "インデックス", "紧凑列表": "コンパクトリスト", "累计签到": "累計チェックイン", "累计获得": "累計獲得", + "约": "約", "线路描述": "チャネルの説明", "组列表": "グループリスト", "组名": "グループ名", @@ -2330,31 +2513,45 @@ "统计次数": "リクエスト数統計", "统计额度": "クォータ統計", "继续": "次へ", - "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Cache {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", "缓存 Tokens": "キャッシュトークン", + "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "キャッシュ {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Cache {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", "缓存: {{cacheRatio}}": "キャッシュ:{{cacheRatio}}", "缓存价格:{{symbol}}{{price}} * {{cacheRatio}} = {{symbol}}{{total}} / 1M tokens (缓存倍率: {{cacheRatio}})": "キャッシュ料金:{{symbol}}{{price}} * {{cacheRatio}} = {{symbol}}{{total}} / 1M tokens(キャッシュ倍率:{{cacheRatio}})", "缓存价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存倍率: {{cacheRatio}})": "キャッシュ料金:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens(キャッシュ倍率:{{cacheRatio}})", "缓存倍率": "キャッシュ倍率", "缓存倍率 {{cacheRatio}}": "Cache ratio {{cacheRatio}}", "缓存写": "キャッシュ書込", - "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", "缓存创建 Tokens": "キャッシュ作成トークン", - "缓存创建: {{cacheCreationRatio}}": "キャッシュ作成:{{cacheCreationRatio}}", + "缓存创建 {{price}} / 1M tokens": "キャッシュ作成 {{price}} / 1M tokens", + "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "キャッシュ作成 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", "缓存创建: 1h {{cacheCreationRatio1h}}": "キャッシュ作成:1h {{cacheCreationRatio1h}}", "缓存创建: 5m {{cacheCreationRatio5m}}": "キャッシュ作成:5m {{cacheCreationRatio5m}}", "缓存创建: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Cache creation: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", - "缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存创建倍率: {{cacheCreationRatio}})": "キャッシュ作成料金:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1Mtokens(キャッシュ作成倍率:{{cacheCreationRatio}})", + "缓存创建: {{cacheCreationRatio}}": "キャッシュ作成:{{cacheCreationRatio}}", + "缓存创建价格": "入力キャッシュ作成価格", + "缓存创建价格 {{symbol}}{{price}} / 1M tokens": "キャッシュ作成価格 {{symbol}}{{price}} / 1M tokens", "缓存创建价格合计:5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens": "Cache creation price total: 5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens", + "缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存创建倍率: {{cacheCreationRatio}})": "キャッシュ作成料金:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1Mtokens(キャッシュ作成倍率:{{cacheCreationRatio}})", + "缓存创建价格:{{symbol}}{{price}} / 1M tokens": "キャッシュ作成価格:{{symbol}}{{price}} / 1M tokens", "缓存创建倍率": "キャッシュ作成倍率", - "缓存创建倍率 {{cacheCreationRatio}}": "Cache creation ratio {{cacheCreationRatio}}", "缓存创建倍率 1h {{cacheCreationRatio1h}}": "キャッシュ作成倍率 1h {{cacheCreationRatio1h}}", "缓存创建倍率 5m {{cacheCreationRatio5m}}": "キャッシュ作成倍率 5m {{cacheCreationRatio5m}}", "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "キャッシュ作成倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", + "缓存创建倍率 {{cacheCreationRatio}}": "Cache creation ratio {{cacheCreationRatio}}", + "缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存创建倍率 {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "キャッシュ作成: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * キャッシュ作成倍率 {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "缓存条目数": "キャッシュエントリ数", "缓存目录": "キャッシュディレクトリ", "缓存目录磁盘空间": "キャッシュディレクトリのディスク容量", "缓存读": "キャッシュ読取", + "缓存读 {{price}} / 1M tokens": "キャッシュ読み取り {{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", + "缓存读取:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "キャッシュ読み取り: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * キャッシュ倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", + "缓存输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "キャッシュ入力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * キャッシュ倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "编辑": "編集", "编辑 OAuth 提供商": "OAuthプロバイダーを編集", "编辑API": "API編集", @@ -2391,10 +2588,13 @@ "聊天链接配置错误,请联系管理员": "チャットURLの設定でエラーが発生しました。管理者にお問い合わせください", "联系我们": "お問い合わせ", "腾讯混元": "Hunyuan", - "自动分组auto,从第一个开始选择": "「auto」グループ(先頭から自動選択)", + "自动分组": "自動グループ", + "自动分组auto,从第一个开始选择": "自動グループauto、最初から順に選択", + "自动分组选择": "自動グループ選択", "自动刷新": "Auto Refresh", "自动刷新中": "Auto refreshing", "自动填充字段": "フィールドを自動入力", + "自动填入": "自動入力", "自动检测": "自動テスト", "自动模式": "自動モード", "自动测试所有通道间隔时间": "すべてのチャネルの自動テスト間隔", @@ -2419,18 +2619,6 @@ "自定义货币": "カスタム通貨", "自定义货币符号": "カスタム通貨記号", "自定义货币符号将显示在所有额度数值前,例如 €1.50": "カスタム通貨記号はすべてのクォータ金額の前に表示されます(例:€1.50)", - "额度展示类型": "クォータ表示タイプ", - "站点所有额度将以美元 ($) 显示": "サイトのすべてのクォータは米ドル ($) で表示されます", - "站点所有额度将按汇率换算为人民币 (¥) 显示": "サイトのすべてのクォータは為替レートで人民元 (¥) に換算して表示されます", - "站点所有额度将以原始 Token 数显示,不做货币换算": "サイトのすべてのクォータは通貨換算なしで元のトークン数で表示されます", - "站点所有额度将按汇率换算为自定义货币显示": "サイトのすべてのクォータは為替レートでカスタム通貨に換算して表示されます", - "汇率": "為替レート", - "每美元对应 Token 数": "1米ドルあたりのトークン数", - "预览效果": "プレビュー", - "请输入汇率": "為替レートを入力してください", - "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为人民币,不影响内部计费": "システムは米ドル (USD) を基準通貨として使用しています。ユーザー残高、チャージ金額、モデル価格、使用ログなど、すべての金額表示がこのレートで人民元に換算されます。内部課金には影響しません。", - "系统内部计费精度,默认 500000,修改可能导致计费异常,请谨慎操作": "システム内部の課金精度、デフォルト500000。変更すると課金異常が発生する可能性があります — 慎重に操作してください。", - "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为自定义货币,不影响内部计费": "システムは米ドル (USD) を基準通貨として使用しています。ユーザー残高、チャージ金額、モデル価格、使用ログなど、すべての金額表示がこのレートでカスタム通貨に換算されます。内部課金には影響しません。", "自定义错误响应": "カスタムエラーレスポンス", "自定义镜像": "Custom Image", "自用模式": "個人モード", @@ -2442,11 +2630,13 @@ "若你的 OIDC Provider 支持 Discovery Endpoint,你可以仅填写 OIDC Well-Known URL,系统会自动获取 OIDC 配置": "お使いのOIDCプロバイダーがディスカバリーエンドポイントに対応している場合、OIDC Well-Known URLを入力するだけで、システムが自動的にOIDC設定を取得します。", "获取 Discovery 配置": "Discovery設定を取得", "获取 Discovery 配置失败:": "Discovery設定の取得に失敗しました:", - "获取 io.net API Key": "Get io.net API Key", "获取 OIDC 配置失败,请检查网络状况和 Well-Known URL 是否正确": "OIDC設定の取得に失敗しました。ネットワーク状況とWell-Known URLが正しいかご確認ください", "获取 OIDC 配置成功!": "OIDC設定の取得に成功しました", "获取 Ollama 版本失败": "Failed to get Ollama version", + "获取 io.net API Key": "Get io.net API Key", "获取2FA状态失败": "2FAステータスの取得に失敗しました", + "获取充值配置失败": "チャージ設定の取得に失敗しました", + "获取充值配置异常": "チャージ設定エラー", "获取初始化状态失败": "初期化ステータスの取得に失敗しました", "获取可用资源失败: ": "Failed to get available resources: ", "获取启用模型失败": "有効なモデルの取得に失敗しました", @@ -2473,10 +2663,14 @@ "获取验证码": "認証コードを取得", "获得": "獲得", "补全": "補完", + "补全 {{completion}} tokens * 输出倍率 {{completionRatio}}": "補完 {{completion}} tokens * 出力倍率 {{completionRatio}}", "补全 {{completion}} tokens / 1M tokens * {{symbol}}{{price}}": "Completion {{completion}} tokens / 1M tokens * {{symbol}}{{price}}", + "补全价格": "補完価格", + "补全价格已锁定": "補完価格はロックされています", "补全价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "補完料金:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens(補完倍率:{{completionRatio}})", "补全价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens": "補完料金:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens", "补全倍率": "補完倍率", + "补全倍率 {{completionRatio}}": "補完倍率 {{completionRatio}}", "补全倍率值": "補完倍率", "补单": "手動チャージ", "补单失败": "手動チャージに失敗しました", @@ -2494,6 +2688,9 @@ "规则名称(可读性更好,也会出现在管理侧日志中)。": "ルール名(読みやすさ向上のため、管理側ログにも表示されます)。", "规则导航": "ルールナビゲーション", "规则未找到,请刷新后重试": "ルールが見つかりません。更新してから再試行してください", + "视频": "動画", + "视频Remix": "動画リミックス", + "视频无法在当前浏览器中播放,这可能是由于:": "The video cannot be played in this browser, possibly because:", "角色": "ロール", "解析响应数据时发生错误": "レスポンスデータの解析時にエラーが発生しました", "解析密钥文件失败: {{msg}}": "APIキーファイルの解析に失敗しました:{{msg}}", @@ -2502,11 +2699,17 @@ "解绑 Passkey": "Passkey連携解除", "解绑后将无法使用 Passkey 登录,确定要继续吗?": "連携解除後は、Passkeyでログインできなくなります。連携を解除してもよろしいですか?", "解绑成功": "バインド解除に成功しました", + "警告": "警告", + "警告:启用保活后,如果已经写入保活数据后渠道出错,系统无法重试,如果必须开启,推荐设置尽可能大的Ping间隔": "警告:キープアライブを有効にした後、データ書き込み後にチャネルエラーが発生した場合、システムは再試行できません。有効化が必須の場合は、Ping間隔を可能な限り長く設定することを推奨します", + "警告:禁用两步验证将永久删除您的验证设置和所有备用码,此操作不可撤销!": "警告:2要素認証を無効にすると、認証設定とすべてのバックアップコードが永久に削除されます。この操作は元に戻すことができません", "计价币种": "Pricing Currency", "计算中": "Calculating", "计算成本": "Calculate Cost", "计算费用中...": "Calculating fees...", + "计费乘数,倍率越低费用越低。例如倍率 0.5 表示半价。": "課金倍率。レートが低いほど費用が低くなります。例:レート0.5は半額を意味します。", "计费开始": "Billing Start", + "计费方式": "課金方式", + "计费显示模式": "課金表示モード", "计费模式": "Billing mode", "计费类型": "課金タイプ", "计费过程": "課金プロセス", @@ -2566,6 +2769,7 @@ "该数据可能不可信,请谨慎使用": "このデータは信頼できない可能性があるため、ご利用の際はご注意ください", "该服务器地址将影响支付回调地址以及默认首页展示的地址,请确保正确配置": "このサーバーURLは決済コールバックアドレスおよびデフォルトホームのアドレスに影響するため、正しく設定されていることをご確認ください", "该模型存在固定价格与倍率计费方式冲突,请确认选择": "このモデルは固定料金と倍率による課金方式が競合しているため、選択内容をご確認ください", + "该模型补全倍率由后端固定为 {{ratio}}。补全价格不能在这里修改。": "このモデルの補完倍率はバックエンドで {{ratio}} に固定されています。ここでは補完価格を変更できません。", "该渠道已开启请求透传,参数覆写、模型重定向等 NewAPI 内置功能将失效,非最佳实践。": "このチャネルではリクエストのパススルーが有効です。パラメータ上書きやモデルリダイレクトなどの NewAPI 内蔵機能は無効になります。ベストプラクティスではありません。", "该渠道已开启请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "このチャネルではリクエストのパススルーが有効です。パラメータ上書き、モデルリダイレクト、チャネル適応などの NewAPI 内蔵機能は無効になります。ベストプラクティスではありません。これにより問題が発生しても issue を投稿しないでください。", "该规则未启用“作用域:包含规则名称”,无法按规则清空缓存。": "このルールは「スコープ:ルール名を含む」が有効になっていないため、ルールごとのキャッシュクリアができません。", @@ -2573,27 +2777,31 @@ "该规则的缓存保留时长;0 表示使用默认 TTL:": "このルールのキャッシュ保持期間。0はデフォルトTTLを使用:", "该记录不包含可用的 token 统计口径。": "このレコードには利用可能なトークン統計がありません。", "详情": "詳細", + "详见「特殊倍率」和「可用分组」标签页。": "詳しくは「特殊レート」と「利用可能グループ」タブをご覧ください。", "语言偏好": "言語設定", "语言偏好已保存": "言語設定が保存されました", "语音输入": "音声入力", "语音输出": "音声出力", "说明": "説明", + "说明信息": "説明", "说明:": "説明:", "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。": "注意: このページのテストは非ストリーミングリクエストです。チャネルがストリーミング応答のみ対応の場合、テストが失敗することがあります。実際の利用結果を優先してください。", "说明:生成结果是可直接粘贴到渠道密钥里的 JSON(包含 access_token / refresh_token / account_id)。": "注:生成結果はチャネルキーに直接貼り付けられるJSON(access_token / refresh_token / account_idを含む)です。", - "说明信息": "説明", "请上传密钥文件": "APIキーファイルをアップロードしてください", "请上传密钥文件!": "APIキーファイルをアップロードしてください", "请为渠道命名": "チャネル名を入力してください", "请使用 Project 为 io.cloud 的密钥": "Please use a key with Project set to io.cloud", + "请先勾选需要批量设置的模型": "一括設定したいモデルを先に選択してください", "请先在设置中启用图片功能": "まず設定で画像機能を有効にしてください", "请先填写 API Key": "Please fill in API Key first", "请先填写 Discovery URL 或 Issuer URL": "まずDiscovery URLまたはIssuer URLを入力してください", "请先填写 Issuer URL,以自动生成完整的端点 URL": "完全なエンドポイントURLを自動生成するには、まずIssuer URLを入力してください", "请先填写 Ollama API 地址": "Please fill in Ollama API address first", "请先填写服务器地址": "まずサーバーURLを入力してください", + "请先开启并填写音频输入价格。": "先に音声入力価格を有効にして入力してください。", "请先粘贴回调 URL": "まずコールバックURLを貼り付けてください", "请先输入密钥": "まずAPIキーを入力してください", + "请先选择一个作为模板的模型": "まずテンプレートとして使うモデルを選択してください", "请先选择一条规则": "まずルールを選択してください", "请先选择同步渠道": "まず同期するチャネルを選択してください", "请先选择模型!": "まずモデルを選択してください", @@ -2634,6 +2842,7 @@ "请求超时,请刷新页面后重新发起 GitHub 登录": "タイムアウトしました。ページをリロードして GitHub ログインをやり直してください", "请求路径": "Request path", "请求转换": "リクエスト変換", + "请求配置": "リクエスト設定", "请求预扣费额度": "リクエスト時の事前差し引きクォータ", "请点击我": "こちらをクリック", "请确认以下设置信息,点击\"初始化系统\"开始配置": "以下の設定内容をご確認の上、「システム初期化」をクリックして設定を開始してください", @@ -2653,18 +2862,18 @@ "请至少选择一个渠道": "チャネルを少なくとも1つ選択してください", "请输入 API Key,一行一个,格式:APIKey|Region": "Enter API Key, one per line, format: APIKey|Region", "请输入 API Key,格式:APIKey|Region": "Enter API Key, format: APIKey|Region", - "请输入 Authorization Endpoint": "Authorization Endpointを入力してください", "请输入 AZURE_OPENAI_ENDPOINT,例如:https://docs-test-001.openai.azure.com": "AZURE_OPENAI_ENDPOINTを入力してください(例:https://docs-test-001.openai.azure.com)", + "请输入 Authorization Endpoint": "Authorization Endpointを入力してください", "请输入 Client ID": "Client IDを入力してください", "请输入 Client Secret": "Client Secretを入力してください", - "请输入 io.net API Key": "Please enter io.net API Key", - "请输入 io.net API Key(敏感信息不显示)": "Please enter io.net API Key (sensitive information not displayed)", "请输入 JSON 格式的 OAuth 凭据,例如:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}": "JSON形式のOAuth資格情報を入力してください。例:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}", "请输入 JSON 格式的密钥内容,例如:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}": "JSON形式のAPIキーを入力してください。例:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}", "请输入 OIDC 的 Well-Known URL": "OIDCのWell-Known URLを入力してください", "请输入 Slug": "Slugを入力してください", "请输入 Token Endpoint": "Token Endpointを入力してください", "请输入 User Info Endpoint": "User Info Endpointを入力してください", + "请输入 io.net API Key": "Please enter io.net API Key", + "请输入 io.net API Key(敏感信息不显示)": "Please enter io.net API Key (sensitive information not displayed)", "请输入6位验证码或8位备用码": "6桁の認証コードまたは8桁のバックアップコードを入力してください", "请输入API地址": "ベースURLを入力してください", "请输入API地址!": "ベースURLを入力してください!", @@ -2674,9 +2883,9 @@ "请输入Gotify服务器地址": "GotifyサーバーURLを入力してください", "请输入Gotify服务器地址,例如: https://gotify.example.com": "GotifyサーバーURLを入力してください(例: https://gotify.example.com)", "请输入JSON数组,如 [\"model-a\",\"model-b\"]": "JSON配列を入力してください(例:[\"model-a\",\"model-b\"])", + "请输入URL链接": "URLを入力してください", "请输入Uptime Kuma地址": "Uptime Kumaアドレスを入力してください", "请输入Uptime Kuma服务地址,如:https://status.example.com": "Uptime Kumaサービスアドレスを入力してください(例: https://status.example.com)", - "请输入URL链接": "URLを入力してください", "请输入Webhook地址": "Webhook URLを入力してください", "请输入Webhook地址,例如: https://example.com/webhook": "Webhook URLを入力してください(例:https://example.com/webhook)", "请输入你的账户名以确认删除!": "削除を確認するには、アカウント名を入力してください", @@ -2701,14 +2910,14 @@ "请输入备注(仅管理员可见)": "備考を入力してください(管理者のみ閲覧可能です)", "请输入套餐标题": "プラン名を入力してください", "请输入完整的 JSON 格式密钥内容": "完全なJSON形式のAPIキーを入力してください", - "请输入完整的URL,例如:https://api.openai.com/v1/chat/completions": "完全なURLを入力してください(例:https://api.openai.com/v1/chat/completions)", "请输入完整的URL链接": "完全なURLを入力してください", + "请输入完整的URL,例如:https://api.openai.com/v1/chat/completions": "完全なURLを入力してください(例:https://api.openai.com/v1/chat/completions)", "请输入容器名称": "Please enter container name", "请输入密码": "パスワードを入力してください", "请输入密钥": "APIキーを入力してください", + "请输入密钥!": "APIキーを入力してください", "请输入密钥,一行一个": "APIキーを入力してください(1行に1つずつ)", "请输入密钥,一行一个,格式:AccessKey|SecretAccessKey|Region": "Enter keys one per line, format: AccessKey|SecretAccessKey|Region", - "请输入密钥!": "APIキーを入力してください", "请输入延长时长": "Please enter extension duration", "请输入总额度": "総クォータを入力してください", "请输入您的密码": "パスワードを入力してください", @@ -2739,6 +2948,7 @@ "请输入模型名称,例如: llama3.2, qwen2.5:7b": "Please enter model name, e.g.: llama3.2, qwen2.5:7b", "请输入模型名称,如:gpt-4": "モデル名を入力してください(例: gpt-4)", "请输入模型描述": "モデルの説明を入力してください", + "请输入汇率": "為替レートを入力してください", "请输入消息内容...": "メッセージを入力してください...", "请输入状态页面Slug": "ステータスページスラッグを入力してください", "请输入状态页面的Slug,如:my-status": "ステータスページスラッグを入力してください(例: my-status)", @@ -2760,9 +2970,9 @@ "请输入认证器验证码或备用码": "オーセンティケーターの認証コードまたはバックアップコードを入力してください", "请输入说明": "説明を入力してください", "请输入运行时长": "Please enter runtime duration", - "请输入邮箱!": "メールアドレスを入力してください", "请输入邮箱地址": "メールアドレスを入力してください", "请输入邮箱验证码!": "メール認証コードを入力してください", + "请输入邮箱!": "メールアドレスを入力してください", "请输入部署名称": "Please enter deployment name", "请输入部署名称以完成二次确认": "Enter deployment name to complete secondary confirmation", "请输入部署地区,例如:us-central1\n支持使用模型映射格式\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}": "デプロイ先リージョンを入力してください(例:us-central1)\nモデルマッピング形式に対応しています\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}", @@ -2810,9 +3020,6 @@ "调用次数排行": "呼び出し回数ランキング", "调试信息": "デバッグ情報", "谨慎": "注意", - "警告": "警告", - "警告:启用保活后,如果已经写入保活数据后渠道出错,系统无法重试,如果必须开启,推荐设置尽可能大的Ping间隔": "警告:キープアライブを有効にした後、データ書き込み後にチャネルエラーが発生した場合、システムは再試行できません。有効化が必須の場合は、Ping間隔を可能な限り長く設定することを推奨します", - "警告:禁用两步验证将永久删除您的验证设置和所有备用码,此操作不可撤销!": "警告:2要素認証を無効にすると、認証設定とすべてのバックアップコードが永久に削除されます。この操作は元に戻すことができません", "豆包": "豆包", "账单": "請求情報", "账户充值": "アカウントチャージ", @@ -2831,6 +3038,7 @@ "购买套餐后即可享受模型权益": "プラン購入後にモデル特典を利用できます", "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。": "購入または手動での追加によりこのグループにアップグレードされます。プランの失効/期限切れ、無効化/削除後は元のグループに戻ります。反映には数分かかる場合があります。", "购买订阅套餐": "サブスクリプションプランを購入", + "购买订阅获得模型额度/次数": "サブスクリプション購入でモデルのクォータ/回数を取得", "费用信息": "Cost Information", "费用预估": "Cost Estimate", "资源消耗": "リソース消費", @@ -2841,6 +3049,7 @@ "跟随日志": "Follow Logs", "跟随系统主题设置": "システムテーマ", "跨分组": "グループ間", + "跨分组特殊倍率": "クロスグループ特殊レート", "跨分组重试": "グループ間リトライ", "路径正则": "パス正規表現", "路径正则(每行一个)": "パス正規表現(1行に1つ)", @@ -2853,9 +3062,12 @@ "输入 OIDC 的 Client ID": "OIDCのClient IDを入力してください", "输入 OIDC 的 Token Endpoint": "OIDCのToken Endpointを入力してください", "输入 OIDC 的 Userinfo Endpoint": "OIDCのUserinfo Endpointを入力してください", + "输入 {{price}} / 1M tokens": "入力 {{price}} / 1M tokens", "输入IP地址后回车,如:8.8.8.8": "IPアドレスを入力してEnter(例:8.8.8.8)", "输入JSON对象": "JSONオブジェクトを入力してください", "输入价格": "入力価格", + "输入价格 {{symbol}}{{price}} / 1M tokens": "入力価格 {{symbol}}{{price}} / 1M tokens", + "输入价格:{{symbol}}{{price}} / 1M tokens": "入力価格:{{symbol}}{{price}} / 1M tokens", "输入价格:{{symbol}}{{price}} / 1M tokens{{audioPrice}}": "入力料金:{{symbol}}{{price}} / 1M tokens{{audioPrice}}", "输入你注册的 LinuxDO OAuth APP 的 ID": "登録したLinuxDO OAuth APPのIDを入力してください", "输入你的账户名{{username}}以确认删除": "削除確認: アカウント名{{username}}を入力してください", @@ -2865,6 +3077,7 @@ "输入数字": "数値を入力してください", "输入标签或使用\",\"分隔多个标签": "タグを入力し、複数の場合は「,」で区切ってください。", "输入模型倍率": "モデル倍率を入力してください", + "输入模型名称,例如 gpt-4.1": "モデル名を入力してください。例: gpt-4.1", "输入每次价格": "1回あたりの料金を入力してください", "输入端口后回车,如:80 或 8000-8999": "ポートを入力してEnter(例: 80 または 8000-8999)", "输入系统提示词,用户的系统提示词将优先于此设置": "システムプロンプトを入力してください。ユーザーのシステムプロンプトがこの設定より優先されます", @@ -2882,8 +3095,13 @@ "输出": "出力", "输出 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}}) * {{ratioType}} {{ratio}}": "補完 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}}) * {{ratioType}} {{ratio}}", "输出价格": "補完料金", + "输出价格 {{symbol}}{{price}} / 1M tokens": "補完料金 {{symbol}}{{price}} / 1M tokens", "输出价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "補完料金:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (補完倍率:{{completionRatio}})", + "输出价格:{{symbol}}{{price}} / 1M tokens": "補完料金:{{symbol}}{{price}} / 1M tokens", + "输出价格:{{symbol}}{{total}} / 1M tokens": "補完料金:{{symbol}}{{total}} / 1M tokens", "输出倍率 {{completionRatio}}": "Output ratio {{completionRatio}}", + "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "出力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * 補完倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", + "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 输出倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "出力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * 出力倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "边栏设置": "サイドバー設定", "过期于": "有効期限", "过期时间": "有効期限", @@ -2897,6 +3115,8 @@ "运行时长(小时)": "Runtime Duration (hours)", "返回修改": "Go back and edit", "返回登录": "ログインに戻る", + "这个界面默认按价格填写,保存时会自动换算回后端需要的倍率 JSON。": "この画面では価格を基準に入力し、保存時にバックエンドが必要とする倍率 JSON に自動変換されます。", + "这些价格都是可选项,不填也可以。": "これらの価格はすべて任意項目で、未入力でも構いません。", "这将删除超过 10 分钟未使用的临时缓存文件": "10分以上使用されていない一時キャッシュファイルを削除します", "这是基础金额,实际扣费 = 基础金额 x 系统分组倍率。": "これは基本金額です。実際の課金 = 基本金額 × システムグループ倍率。", "这是重复键中的最后一个,其值将被使用": "重複するキーのうち、最後のキーの値が使用されます", @@ -2907,18 +3127,24 @@ "违规扣费": "違反課金", "违规扣费金额": "違反課金金額", "连接保活设置": "接続キープアライブ設定", + "连接信息已填入": "接続情報を入力しました", "连接已断开": "接続が切断されました", "连接测试中...": "Testing connection...", + "追加": "付加", "追加到现有密钥": "既存APIキーへの追加", "追加模式:将新密钥添加到现有密钥列表末尾": "追加モード:新しいAPIキーを既存のAPIキーリストの末尾に追加します", "追加模式:新密钥将添加到现有密钥列表的末尾": "追加モード:新しいAPIキーを、既存のAPIキーリストの末尾に追加します", "追加模板": "テンプレートを追加", "退出": "ログアウト", "退款": "返金", + "适合 MJ / 任务类等按次收费模型。": "MJ やその他のリクエスト単位課金モデルに適しています。", + "适合同系列模型一起定价,例如把 gpt-5.1 的价格批量同步到 gpt-5.1-high、gpt-5.1-low 等模型。": "同系列モデルをまとめて価格設定するのに適しています。例えば gpt-5.1 の価格を gpt-5.1-high、gpt-5.1-low などへ一括同期できます。", "适用于个人使用的场景,不需要设置模型价格": "個人利用のシナリオに適しており、モデル料金の設定は不要です", "适用于为多个用户提供服务的场景": "複数のユーザーにサービスを提供するシナリオに適しています", "适用于展示系统功能的场景,提供基础功能演示": "システムの機能を紹介するシナリオに適しており、基本的な機能のデモンストレーションを提供します", "适配 -thinking、-thinking-预算数字 和 -nothinking 后缀": "-thinking、-thinking-予算数値、-nothinking、および -low/-medium/-high サフィックスに対応", + "选择 premium 创建的令牌,调用 API 时费用为 standard 的 50%。": "premiumで作成したトークンでAPI呼び出し時の費用はstandardの50%です。", + "选择使用分组": "使用グループを選択", "选择充值额度": "チャージ額を選択", "选择分组": "グループを選択", "选择同步来源": "同期ソースを選択", @@ -2936,6 +3162,7 @@ "选择模型后可一键填充当前选中令牌(或本页第一个令牌)。": "モデルを選択後、現在選択中のトークン(またはこのページの最初のトークン)をクイック入力できます。", "选择模型开始对话": "モデルを選択してチャットを開始", "选择状态": "Select Status", + "选择用户分组": "ユーザーグループを選択", "选择硬件类型": "Select Hardware Type", "选择端点类型": "エンドポイントタイプを選択", "选择系统运行模式": "システムの動作モードを選択", @@ -2960,8 +3187,10 @@ "通知类型 (quota_exceed: 额度预警)": "通知タイプ(quota_exceed: クォータアラート)", "通知邮箱": "通知メールアドレス", "通知配置": "通知設定", + "通过分组可以实现不同用户等级的差异化定价,例如 VIP 用户享受更低的 API 调用费用。": "グループにより異なるユーザー等級の差別化料金を実現できます。例えばVIPユーザーがより低いAPI呼び出し費用を享受できます。", "通过划转功能将奖励额度转入到您的账户余额中": "振替機能を利用して、特典をアカウントの残高に振り替えることができます", "通过密码注册时需要进行邮箱验证": "パスワードでのサインアップ時にメールアドレスの確認を必須にする", + "通过此功能,可以根据用户所在分组,为不同等级的用户展示不同的可选列表。": "この機能により、ユーザーの所属グループに基づいて、異なる等級のユーザーに異なる選択リストを表示できます。", "通道 ${name} 余额更新成功!": "チャネル「${name}」のクォータを更新しました。", "通道 ${name} 测试成功,模型 ${model} 耗时 ${time.toFixed(2)} 秒。": "チャネル「${name}」のテストに成功しました。モデル「${model}」の所要時間 ${time.toFixed(2)} 秒。", "通道 ${name} 测试成功,耗时 ${time.toFixed(2)} 秒。": "チャネル「${name}」のテストに成功しました。所要時間 ${time.toFixed(2)} 秒。", @@ -3015,6 +3244,7 @@ "配置 Telegram 登录": "Telegram ログイン設定", "配置 Turnstile": "Turnstile 設定", "配置 WeChat Server": "WeChatサーバー設定", + "配置后的效果:": "設定後の効果:", "配置和消息已全部重置": "設定とメッセージがすべてリセットされました", "配置套餐的有效时长": "プランの有効期間を設定", "配置如何从用户信息 API 响应中提取用户数据,支持 JSONPath 语法": "ユーザー情報APIレスポンスからユーザーデータを抽出する方法を設定、JSONPath構文をサポート", @@ -3027,10 +3257,12 @@ "配置有效的 io.net API Key": "Configure a valid io.net API Key", "配置服务器端请求伪造(SSRF)防护,用于保护内网资源安全": "内部ネットワークリソースを保護するため、サーバーサイド・リクエスト・フォージェリ(SSRF)保護を設定します", "配置模型部署服务提供商的API密钥和启用状态": "Configure the API key and enabled status of the model deployment service provider", + "配置特殊倍率后:": "特殊レート設定後:", "配置登录注册": "ログイン・サインアップ設定", "配置自定义 OAuth 提供商,支持 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 协议的身份提供商": "カスタムOAuthプロバイダーを設定。GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORYなどのOAuth 2.0互換IDプロバイダーをサポート", "配置说明": "設定の説明", "配置邮箱域名白名单": "メールドメインのホワイトリスト設定", + "配置:": "設定:", "重启部署失败": "Failed to restart deployment", "重命名部署": "Rename Deployment", "重复提交": "二重送信", @@ -3074,6 +3306,7 @@ "键为端点类型,值为路径和方法对象": "キー:エンドポイントタイプ、値:パスとメソッドのオブジェクト", "键为请求中的模型名称,值为要替换的模型名称": "キー:リクエスト内のモデル名、値:置換後のモデル名", "键名": "キー名", + "键的前缀 +: 表示添加,-: 表示移除,无前缀表示追加。值为分组描述(移除时填 \"remove\")。": "キーのプレフィックス +: は追加、-: は削除、プレフィックスなしは付加を意味します。値はグループの説明(削除時は \"remove\")。", "镜像仓库密码": "Image Registry Password", "镜像仓库用户名": "Image Registry Username", "镜像仓库配置": "Image Registry Configuration", @@ -3089,15 +3322,15 @@ "限制周期统一使用上方配置的“限制周期”值。": "制限期間は、一律で上記にて設定された「制限期間」の値を使用します。", "限流": "レート制限", "限购": "購入制限", + "随机": "ランダム", + "随机模式": "ランダムモード", + "随机种子 (留空为随机)": "ランダムシード(空欄でランダム)", "隐私政策": "プライバシーポリシー", "隐私政策已更新": "プライバシーポリシーが更新されました", "隐私政策更新失败": "プライバシーポリシーの更新に失敗しました", "隐私设置": "プライバシー設定", "隐藏操作项": "操作項目を非表示", "隐藏调试": "デバッグを非表示", - "随机": "ランダム", - "随机模式": "ランダムモード", - "随机种子 (留空为随机)": "ランダムシード(空欄でランダム)", "零一万物": "Yi", "需要安全验证": "セキュリティ認証が必要です", "需要添加的额度(支持负数)": "追加する残高(マイナス値も可)", @@ -3107,14 +3340,21 @@ "非必要,不建议启用模型限制": "必須ではないため、モデル制限の有効化は推奨しません", "非流": "非ストリーミング", "音乐预览": "音楽プレビュー", + "音频倍率 {{audioRatio}}": "音声倍率 {{audioRatio}}", "音频倍率(仅部分模型支持该计费)": "オーディオ倍率(一部のモデルのみこの課金に対応)", "音频提示 {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}": "オーディオプロンプト {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + オーディオ補完 {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}", "音频提示价格:{{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens (音频倍率: {{audioRatio}})": "オーディオプロンプト料金:{{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens(オーディオ倍率:{{audioRatio}})", "音频无法播放": "音声を再生できません", + "音频补全价格": "音声補完価格", "音频补全价格:{{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens (音频补全倍率: {{audioCompRatio}})": "オーディオ補完料金:{{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens(オーディオ補完倍率:{{audioCompRatio}})", + "音频补全价格:{{symbol}}{{price}} / 1M tokens": "音声補完価格:{{symbol}}{{price}} / 1M tokens", "音频补全倍率(仅部分模型支持该计费)": "オーディオ補完倍率(一部のモデルのみこの課金に対応)", + "音频输入价格": "音声入力価格", + "音频输入价格:{{symbol}}{{price}} / 1M tokens": "音声入力価格:{{symbol}}{{price}} / 1M tokens", "音频输入相关的倍率设置,键为模型名称,值为倍率": "オーディオ入力に関する倍率設定です。キー:モデル名、値:倍率。", + "音频输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "音声入力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * 音声倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "音频输出补全相关的倍率设置,键为模型名称,值为倍率": "オーディオ補完に関する倍率設定です。キー:モデル名、値:倍率。", + "音频输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * 音频补全倍率 {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "音声出力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * 音声倍率 {{audioRatio}} * 音声補完倍率 {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "页脚": "フッター", "页面未找到,请检查您的浏览器地址是否正确": "ページが見つかりませんでした。ブラウザのアドレスが正しいかご確認ください", "顶栏管理": "トップバー管理", @@ -3127,17 +3367,21 @@ "预填组管理": "事前入力グループ管理", "预扣": "仮控除", "预览失败": "プレビューに失敗しました", + "预览效果": "プレビュー", "预览更新": "更新のプレビュー", "预览模板": "テンプレートをプレビュー", "预览请求体": "リクエストボディのプレビュー", + "预警阈值必须为正数": "アラートしきい値は0より大きい必要があります", "预计结束": "Estimated End", "预设模板": "プリセットテンプレート", - "预警阈值必须为正数": "アラートしきい値は0より大きい必要があります", "频率惩罚,减少重复词汇的出现": "頻度ペナルティ、単語の繰り返しを減少", "频率限制的周期(分钟)": "レート制限の期間(分)", "颜色": "カラー", + "额外价格项": "追加価格項目", + "额外设置": "追加設定", "额度": "クォータ", "额度充值": "クォータ補充", + "额度展示类型": "クォータ表示タイプ", "额度必须大于0": "クォータは0より大きい必要があります", "额度提醒阈值": "クォータアラートしきい値", "额度查询接口返回令牌额度而非用户额度": "クォータ取得APIは、ユーザークォータではなくトークンクォータを返します", @@ -3158,161 +3402,30 @@ "验证身份": "本人認証", "验证配置错误": "認証設定のエラー", "高级": "高度な設定", + "高级套餐,半价优惠": "プレミアムプラン、50%オフ", "高级文本编辑": "高度なテキスト編集", "高级设置": "詳細設定", "高级选项": "高度なオプション", "高级配置": "Advanced Configuration", - "核心配置": "基本設定", - "创建渠道所需的基本信息": "チャネル作成に必要な基本情報", - "请求配置": "リクエスト設定", - "渠道行为": "チャネル動作", - "额外设置": "追加設定", - "上游模型管理": "上流モデル管理", "黑名单": "ブラックリスト", "默认": "デフォルト", "默认 API 版本": "デフォルトAPIバージョン", "默认 Responses API 版本,为空则使用上方版本": "デフォルトのレスポンスAPIバージョン。未入力の場合、上記のバージョンが使用されます。", "默认 TTL(秒)": "デフォルトTTL(秒)", "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)": "デフォルトは5mのキャッシュ作成倍率です。1hのキャッシュ作成倍率は固定乗数で自動計算されます(現在は1.6倍)", + "默认使用auto分组": "デフォルトでautoグループを使用", "默认使用系统名称": "デフォルトのシステム名称", "默认助手消息": "こんにちは!何かお手伝いできることはありますか?", "默认区域": "デフォルトリージョン", "默认区域,如: us-central1": "デフォルトリージョン(例:us-central1)", + "默认情况下,所有用户创建令牌时看到的可选分组列表是一样的(即「用户可选」列勾选的分组)。": "デフォルトでは、全ユーザーがトークン作成時に同じ選択可能グループリストを見ます(「ユーザー選択可」列がチェックされたグループ)。", "默认折叠侧边栏": "サイドバーをデフォルトで折りたたむ", "默认测试模型": "デフォルトテストモデル", "默认用户消息": "こんにちは", "默认补全倍率": "デフォルト補完倍率", - "提示:端点映射仅用于模型广场展示,不会影响模型真实调用。如需配置真实调用,请前往「渠道管理」。": "注意: エンドポイントマッピングは「モデル広場」での表示専用で、実際の呼び出しには影響しません。実際の呼び出し設定は「チャネル管理」で行ってください。", - "购买订阅获得模型额度/次数": "サブスクリプション購入でモデルのクォータ/回数を取得", - "生产环境 RSA 私钥 Base64 (PKCS#8 DER)": "本番環境 RSA 秘密鍵 Base64 (PKCS#8 DER)", - "沙盒环境 RSA 私钥 Base64 (PKCS#8 DER)": "サンドボックス RSA 秘密鍵 Base64 (PKCS#8 DER)", - "生产环境 Waffo 公钥 Base64 (X.509 DER)": "本番環境 Waffo 公開鍵 Base64 (X.509 DER)", - "沙盒环境 Waffo 公钥 Base64 (X.509 DER)": "サンドボックス Waffo 公開鍵 Base64 (X.509 DER)", - "支付方式类型": "決済方法タイプ", - "支付方式名称": "決済方法名", - "获取充值配置失败": "チャージ設定の取得に失敗しました", - "获取充值配置异常": "チャージ設定エラー", - "分组相关设置": "グループ関連設定", - "保存分组相关设置": "グループ関連設定を保存", - "此页面仅显示未设置价格或基础倍率的模型,设置后会自动从列表中移出": "このページには価格または基本倍率が未設定のモデルのみ表示され、設定後は一覧から自動的に消えます。", - "没有未设置定价的模型": "価格未設定のモデルはありません", - "当前没有未设置定价的模型": "現在、価格未設定のモデルはありません", - "模型计费编辑器": "モデル料金エディタ", - "价格摘要": "価格概要", - "当前提示": "現在のヒント", - "这个界面默认按价格填写,保存时会自动换算回后端需要的倍率 JSON。": "この画面では価格を基準に入力し、保存時にバックエンドが必要とする倍率 JSON に自動変換されます。", - "当前未启用,需要时再打开即可。": "この項目は現在無効です。必要なときに有効にしてください。", - "下面展示这个模型保存后会写入哪些后端字段,便于和原始 JSON 编辑框保持一致。": "保存後にこのモデルでどのバックエンド項目に書き込まれるかを以下に表示します。元の JSON エディタとの整合確認に便利です。", - "补全价格已锁定": "補完価格はロックされています", - "后端固定倍率:{{ratio}}。该字段仅展示换算后的价格。": "バックエンド固定倍率: {{ratio}}。この項目は変換後の価格表示のみです。", - "这些价格都是可选项,不填也可以。": "これらの価格はすべて任意項目で、未入力でも構いません。", - "请先开启并填写音频输入价格。": "先に音声入力価格を有効にして入力してください。", - "输入模型名称,例如 gpt-4.1": "モデル名を入力してください。例: gpt-4.1", - "当前模型同时存在按次价格和倍率配置,保存时会按当前计费方式覆盖。": "このモデルには従量価格と倍率設定が同時に存在しています。保存すると現在の課金方式に従って上書きされます。", - "当前模型存在未显式设置输入倍率的扩展倍率;填写输入价格后会自动换算为价格字段。": "このモデルには入力倍率が明示されていない拡張倍率があります。入力価格を設定すると価格項目へ自動換算されます。", - "按量计费下需要先填写输入价格,才能保存其它价格项。": "従量課金では、他の価格項目を保存する前に入力価格を設定する必要があります。", - "填写音频补全价格前,需要先填写音频输入价格。": "音声補完価格を入力する前に、先に音声入力価格を入力してください。", - "模型 {{name}} 缺少输入价格,无法计算补全/缓存/图片/音频价格对应的倍率": "モデル {{name}} に入力価格がないため、補完・キャッシュ・画像・音声価格に対応する倍率を計算できません。", - "模型 {{name}} 缺少音频输入价格,无法计算音频补全倍率": "モデル {{name}} に音声入力価格がないため、音声補完倍率を計算できません。", - "批量应用当前模型价格": "現在のモデル価格を一括適用", - "请先选择一个作为模板的模型": "まずテンプレートとして使うモデルを選択してください", - "请先勾选需要批量设置的模型": "一括設定したいモデルを先に選択してください", - "已将模型 {{name}} 的价格配置批量应用到 {{count}} 个模型": "モデル {{name}} の価格設定を {{count}} 個のモデルに一括適用しました", - "将把当前编辑中的模型 {{name}} 的价格配置,批量应用到已勾选的 {{count}} 个模型。": "現在編集中のモデル {{name}} の価格設定を、選択済みの {{count}} 個のモデルに一括適用します。", - "适合同系列模型一起定价,例如把 gpt-5.1 的价格批量同步到 gpt-5.1-high、gpt-5.1-low 等模型。": "同系列モデルをまとめて価格設定するのに適しています。例えば gpt-5.1 の価格を gpt-5.1-high、gpt-5.1-low などへ一括同期できます。", - "已勾选": "選択済み", - "当前编辑": "編集中", - "已勾选 {{count}} 个模型": "{{count}} 個のモデルを選択済み", - "计费方式": "課金方式", - "未设置价格": "価格未設定", - "保存预览": "保存プレビュー", - "基础价格": "基本価格", - "扩展价格": "追加価格", - "额外价格项": "追加価格項目", - "补全价格": "補完価格", - "缓存读取价格": "入力キャッシュ読み取り価格", - "缓存创建价格": "入力キャッシュ作成価格", - "图片输入价格": "画像入力価格", - "音频输入价格": "音声入力価格", - "音频补全价格": "音声補完価格", - "适合 MJ / 任务类等按次收费模型。": "MJ やその他のリクエスト単位課金モデルに適しています。", - "该模型补全倍率由后端固定为 {{ratio}}。补全价格不能在这里修改。": "このモデルの補完倍率はバックエンドで {{ratio}} に固定されています。ここでは補完価格を変更できません。", - "计费显示模式": "課金表示モード", - "价格模式(默认)": "価格モード(デフォルト)", - "模型价格 {{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", - "缓存创建价格:{{symbol}}{{price}} / 1M tokens": "キャッシュ作成価格:{{symbol}}{{price}} / 1M tokens", - "缓存创建价格 {{symbol}}{{price}} / 1M tokens": "キャッシュ作成価格 {{symbol}}{{price}} / 1M tokens", - "5m缓存创建价格:{{symbol}}{{price}} / 1M tokens": "5m キャッシュ作成価格:{{symbol}}{{price}} / 1M tokens", - "5m缓存创建价格 {{symbol}}{{price}} / 1M tokens": "5m キャッシュ作成価格 {{symbol}}{{price}} / 1M tokens", - "1h缓存创建价格:{{symbol}}{{price}} / 1M tokens": "1h キャッシュ作成価格:{{symbol}}{{price}} / 1M tokens", - "1h缓存创建价格 {{symbol}}{{price}} / 1M tokens": "1h キャッシュ作成価格 {{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}} 回", - "文件搜索调用 {{fileSearchCallCount}} 次": "ファイル検索呼び出し {{fileSearchCallCount}} 回", - "图片倍率 {{imageRatio}}": "画像倍率 {{imageRatio}}", - "音频倍率 {{audioRatio}}": "音声倍率 {{audioRatio}}", - "普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "通常入力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "缓存输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "キャッシュ入力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * キャッシュ倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 图片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "画像入力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * 画像倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "音声入力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * 音声倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "出力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * 補完倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "Web 搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Web 検索: {{count}} / 1K * 単価 {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "文件搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "ファイル検索: {{count}} / 1K * 単価 {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片生成:1 次 * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "画像生成: 1 回 * 単価 {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "合计:{{total}}": "合計: {{total}}", - "模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},音频倍率 {{audioRatio}},音频补全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}": "モデル倍率 {{modelRatio}}、補完倍率 {{completionRatio}}、音声倍率 {{audioRatio}}、音声補完倍率 {{audioCompletionRatio}}、{{cachePart}}{{ratioType}} {{ratio}}", - "文字输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "テキスト出力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * 補完倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输出:{{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}}", - "缓存读取:{{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", - "复制密钥": "キーをコピー", - "复制连接信息": "接続情報をコピー", - "检测到剪贴板中的连接信息": "クリップボードに接続情報が検出されました", - "自动填入": "自動入力", - "忽略": "無視", - "从剪贴板粘贴配置": "クリップボードから貼り付け", - "剪贴板中未检测到连接信息": "クリップボードに接続情報が見つかりません", - "连接信息已填入": "接続情報を入力しました", - "无法读取剪贴板": "クリップボードを読み取れません" + "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(現在、Epay APIのみに対応しています。デフォルトで、上記のサーバーURLがコールバックアドレスとして使用されます。)", + ",当前无生效订阅,将自动使用钱包": "、有効なサブスクリプションがないため、自動的にウォレットを使用します", + ",时间:": "、時間:", + ",点击更新": "、クリックして更新してください" } } diff --git a/web/src/i18n/locales/ru.json b/web/src/i18n/locales/ru.json index f0590538..4d27be12 100644 --- a/web/src/i18n/locales/ru.json +++ b/web/src/i18n/locales/ru.json @@ -1,56 +1,55 @@ { "translation": { - " + Web搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_one": " + Web-поиск {{count}} раз / 1K раз * {{symbol}}{{price}} * {{ratioType}} {{ratio}}", " + Web搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_few": " + Web-поиск {{count}} раза / 1K раз * {{symbol}}{{price}} * {{ratioType}} {{ratio}}", " + Web搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_many": " + Web-поиск {{count}} раз / 1K раз * {{symbol}}{{price}} * {{ratioType}} {{ratio}}", + " + Web搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_one": " + Web-поиск {{count}} раз / 1K раз * {{symbol}}{{price}} * {{ratioType}} {{ratio}}", " + Web搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_other": " + Web-поиск {{count}} раз / 1K раз * {{symbol}}{{price}} * {{ratioType}} {{ratio}}", " + 图片生成调用 {{symbol}}{{price}} / 1次 * {{ratioType}} {{ratio}}": " + Генерация изображения {{symbol}}{{price}} / 1 вызов * {{ratioType}} {{ratio}}", - " + 文件搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_one": " + Поиск файлов {{count}} раз / 1K раз * {{symbol}}{{price}} * {{ratioType}} {{ratio}}", " + 文件搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_few": " + Поиск файлов {{count}} раза / 1K раз * {{symbol}}{{price}} * {{ratioType}} {{ratio}}", " + 文件搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_many": " + Поиск файлов {{count}} раз / 1K раз * {{symbol}}{{price}} * {{ratioType}} {{ratio}}", + " + 文件搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_one": " + Поиск файлов {{count}} раз / 1K раз * {{symbol}}{{price}} * {{ratioType}} {{ratio}}", " + 文件搜索 {{count}}次 / 1K 次 * {{symbol}}{{price}} * {{ratioType}} {{ratio}}_other": " + Поиск файлов {{count}} раз / 1K раз * {{symbol}}{{price}} * {{ratioType}} {{ratio}}", " 个模型设置相同的值": " моделей с одинаковыми значениями настроек", " 吗?": "?", " 秒": " сек", " 秒。": " сек.", - ",当前无生效订阅,将自动使用钱包": ", нет активной подписки, автоматически будет использоваться кошелек.", - ",时间:": ", время: ", - ",点击更新": ", нажмите для обновления", - "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(В настоящее время поддерживается только интерфейс YiPay, по умолчанию используется адрес сервера выше в качестве адреса обратного вызова!)", - "(筛选后显示 {{count}} 条)_one": "(Showing {{count}} item after filtering)", + "$/1M tokens": "$/1M токенов", "(筛选后显示 {{count}} 条)_few": "(Показано {{count}} элемента после фильтрации)", "(筛选后显示 {{count}} 条)_many": "(Показано {{count}} элементов после фильтрации)", + "(筛选后显示 {{count}} 条)_one": "(Showing {{count}} item after filtering)", "(筛选后显示 {{count}} 条)_other": "(Showing {{count}} items after filtering)", "(输入 {{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}}", - "[最多请求次数]和[最多请求完成次数]的最大值为2147483647。": "[Максимальное количество запросов] и [Максимальное количество выполненных запросов] имеют максимальное значение 2147483647.", - "[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。": "[Максимальное количество запросов] должно быть больше или равно 0, [Максимальное количество выполненных запросов] должно быть больше или равно 1.", - "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", - "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", - "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", - "{{name}} ID": "{{name}} ID", - "{{ratioType}} {{ratio}}": "{{ratioType}} {{ratio}}", - "• 视频服务商的跨域限制": "• Ограничения кросс-доменных запросов со стороны видеосервиса", - "• 防盗链保护机制": "• Защита от хотлинков", - "• 需要特定的请求头或认证": "• Требуются специальные заголовки или авторизация", - "© {{currentYear}}": "© {{currentYear}}", - "| 基于": "| Основано на", - "$/1M tokens": "$/1M токенов", + "(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}": "(Ввод {{nonImageInput}} токенов + ввод изображения {{imageInput}} токенов / 1M токенов * {{symbol}}{{price}}", "0 - 最低": "0 - Минимум", "0 表示不限": "0 означает без лимита", "0.002-1之间的小数": "Десятичное число между 0.002-1", "0.1以上的小数": "Десятичное число выше 0.1", "1) 点击「打开授权页面」完成登录;2) 浏览器会跳转到 localhost(页面打不开也没关系);3) 复制地址栏完整 URL 粘贴到下方;4) 点击「生成并填入」。": "1) Нажмите «Открыть страницу авторизации» для входа; 2) Браузер перенаправит на localhost (ничего страшного, если страница не откроется); 3) Скопируйте полный URL из адресной строки и вставьте ниже; 4) Нажмите «Сгенерировать и заполнить».", + "1. 管理员在此创建分组并设置倍率": "1. Admin creates groups and sets ratios here", "10 - 最高": "10 - Максимум", + "1h缓存创建 {{price}} / 1M tokens": "Создание кэша 1h {{price}} / 1M tokens", + "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Создание кэша 1h {{tokens}} токенов / 1M токенов * {{symbol}}{{price}}", "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Создание кеша 1ч {{tokens}} токенов / 1M токенов * {{symbol}}{{price}} (множитель: {{ratio}})", + "1h缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Цена создания кеша 1h {{symbol}}{{price}} / 1M tokens", "1h缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (1h缓存创建倍率: {{cacheCreationRatio1h}})": "Цена создания кеша за 1ч: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M токенов (множитель создания 1ч: {{cacheCreationRatio1h}})", + "1h缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Цена создания кеша 1h: {{symbol}}{{price}} / 1M tokens", + "1h缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 1h缓存创建倍率 {{cacheCreationRatio1h}} * {{ratioType}} {{ratio}} = {{amount}}": "Создание кэша 1h: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * коэффициент создания кэша 1h {{cacheCreationRatio1h}} * {{ratioType}} {{ratio}} = {{amount}}", "2 - 低": "2 - Низкий", + "2. 管理员在用户管理中将用户分配到对应分组(如 vip)": "2. Admin assigns users to groups in User Management (e.g., vip)", "2025年5月10日后添加的渠道,不需要再在部署的时候移除模型名称中的\".\"": "Каналы, добавленные после 10 мая 2025 года, не требуют удаления \".\" из имен моделей при развертывании", + "3. 用户创建令牌时,下拉菜单中出现勾选了「用户可选」的分组": "3. When users create tokens, groups with \"User Selectable\" checked appear in the dropdown", "360智脑": "360 ZhiNao", + "4. 令牌使用所选分组的倍率进行计费": "4. Token uses the selected group's ratio for billing", "5 - 正常(默认)": "5 - Нормальный (по умолчанию)", + "5m缓存创建 {{price}} / 1M tokens": "Создание кэша 5m {{price}} / 1M tokens", + "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Создание кэша 5m {{tokens}} токенов / 1M токенов * {{symbol}}{{price}}", "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Создание кеша 5м {{tokens}} токенов / 1M токенов * {{symbol}}{{price}} (множитель: {{ratio}})", + "5m缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Цена создания кеша 5m {{symbol}}{{price}} / 1M tokens", "5m缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (5m缓存创建倍率: {{cacheCreationRatio5m}})": "Цена создания кеша за 5м: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M токенов (множитель создания 5м: {{cacheCreationRatio5m}})", + "5m缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Цена создания кеша 5m: {{symbol}}{{price}} / 1M tokens", + "5m缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 5m缓存创建倍率 {{cacheCreationRatio5m}} * {{ratioType}} {{ratio}} = {{amount}}": "Создание кэша 5m: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * коэффициент создания кэша 5m {{cacheCreationRatio5m}} * {{ratioType}} {{ratio}} = {{amount}}", "8 - 高": "8 - Высокий", "AGPL v3.0协议": "Лицензия AGPL v3.0", "AI 对话": "AI диалог", @@ -72,41 +71,36 @@ "API地址": "Адрес API", "API渠道配置": "Конфигурация каналов API", "API端点": "Конечная точка API", - "Authorization callback URL 填": "URL обратного вызова авторизации:", "Authorization Endpoint": "Конечная точка авторизации", - "auto分组调用链路": "Цепочка вызовов автоматической группировки", + "Authorization callback URL 填": "URL обратного вызова авторизации:", "Bark推送URL": "URL для push-уведомлений Bark", "Bark推送URL必须以http://或https://开头": "URL для push-уведомлений Bark должен начинаться с http:// или https://", "Bark通知": "Уведомления Bark", "Basic Auth 头": "Заголовок Basic Auth", + "CPU 使用率超过此值时拒绝请求": "Отклонять запросы, когда использование CPU превышает это значение", + "CPU 阈值 (%)": "Порог CPU (%)", "Cached tokens": "Cached tokens", "Cached tokens 占比口径由后端返回:Claude 语义按 cached/(prompt+cached),其余按 cached/prompt。": "Доля кэшированных токенов возвращается бэкендом: семантика Claude считает cached/(prompt+cached), остальные — cached/prompt.", "Changing batch type to:": "Изменение типа пакета на:", "ChatCompletions→Responses 兼容配置": "Настройка совместимости ChatCompletions→Responses", "ChatCompletions→Responses 兼容配置(Beta)": "Совместимость ChatCompletions→Responses (бета)", "Claude 强制 beta=true": "Claude принудительно beta=true", + "Claude会在原有请求头基础上追加这些值,不会覆盖已有同名请求头;重复值会自动忽略。": "Claude добавляет эти значения поверх существующих заголовков запроса. Уже существующие заголовки не перезаписываются, а дублирующиеся значения автоматически игнорируются.", "Claude思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Адаптация мышления Claude BudgetTokens = MaxTokens * процент BudgetTokens", "Claude设置": "Настройки Claude", "Claude请求头覆盖": "Переопределение заголовков запроса Claude", "Claude请求头追加": "Добавление заголовков запроса Claude", - "Claude会在原有请求头基础上追加这些值,不会覆盖已有同名请求头;重复值会自动忽略。": "Claude добавляет эти значения поверх существующих заголовков запроса. Уже существующие заголовки не перезаписываются, а дублирующиеся значения автоматически игнорируются.", "Client ID": "ID клиента", "Client Secret": "Секрет клиента", "Codex 授权": "Авторизация Codex", "Codex 渠道不支持批量创建": "Канал Codex не поддерживает пакетное создание", - "common.changeLanguage": "common.changeLanguage", "Completion tokens": "Completion tokens", "Configuration": "Конфигурация", - "context_int/context_string 从请求上下文读取;gjson 从入口请求的 JSON body 按 gjson path 读取。": "context_int/context_string читаются из контекста запроса; gjson читает из JSON body входящего запроса по gjson path.", - "CPU 使用率超过此值时拒绝请求": "Отклонять запросы, когда использование CPU превышает это значение", - "CPU 阈值 (%)": "Порог CPU (%)", "Creem API 密钥,敏感信息不显示": "API-ключ Creem, чувствительные данные не отображаются", "Creem Setting Tips": "Creem поддерживает только преднастроенные товары с фиксированной суммой. Эти товары и их цены нужно заранее создать и настроить на сайте Creem, поэтому пополнения с произвольной суммой не поддерживаются. Настройте название и цену товара в Creem, получите идентификатор товара и укажите его ниже. Затем задайте сумму пополнения и отображаемую цену в new-api.", "Creem 介绍": "О сервисе Creem", "Creem 充值": "Пополнение через Creem", "Creem 设置": "Настройки Creem", - "default为默认设置,可单独设置每个分类的安全等级": "default - это настройка по умолчанию, можно отдельно установить уровень безопасности для каждой категории", - "default为默认设置,可单独设置每个模型的版本": "default - это настройка по умолчанию, можно отдельно установить версию для каждой модели", "Dify渠道只适配chatflow和agent,并且agent不支持图片!": "Канал Dify адаптирован только для chatflow и agent, и agent не поддерживает изображения!", "Discord": "Discord", "Discord Client ID": "ID клиента Discord", @@ -116,10 +110,11 @@ "Discovery scopes": "Discovery scopes", "Discovery 建议 scopes:": "Рекомендуемые Discovery scopes:", "EUR (欧元)": "EUR (евро)", - "false": "false", "GC 已执行": "GC выполнен", "GC 执行失败": "Ошибка выполнения GC", "GC 次数": "Количество GC", + "GPU/容器": "GPU/Container", + "GPU数量": "Number of GPUs", "Gemini安全设置": "Настройки безопасности Gemini", "Gemini思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Адаптация мышления Gemini BudgetTokens = MaxTokens * процент BudgetTokens", "Gemini思考适配设置": "Настройки адаптации мышления Gemini", @@ -134,14 +129,10 @@ "Gotify服务器地址": "Адрес сервера Gotify", "Gotify服务器地址必须以http://或https://开头": "Адрес сервера Gotify должен начинаться с http:// или https://", "Gotify通知": "Уведомления Gotify", - "GPU/容器": "GPU/Container", - "GPU数量": "Number of GPUs", "Grok设置": "Настройки Grok", "Haiku 模型": "Модель Haiku", "Homepage URL 填": "URL домашней страницы:", "ID": "ID", - "include_obfuscation 用于控制 Responses 流混淆字段。默认关闭以避免客户端关闭该安全保护": "include_obfuscation управляет полями обфускации в потоке Responses. Отключено по умолчанию, чтобы клиенты не отключали эту защиту", - "inference_geo 字段用于控制 Claude 数据驻留推理区域。默认关闭以避免未经授权透传地域信息": "Поле inference_geo управляет регионом размещения данных инференса Claude. Отключено по умолчанию для предотвращения несанкционированной передачи географической информации", "IP": "IP", "IP白名单": "IP Whitelist", "IP白名单(支持CIDR表达式)": "Белый список IP (поддерживает выражения CIDR)", @@ -151,6 +142,7 @@ "JSON 已格式化": "JSON отформатирован", "JSON 文本": "Текст JSON", "JSON 无效": "Недопустимый JSON", + "JSON 格式参考": "JSON Reference", "JSON 模式": "Режим JSON", "JSON 模式支持手动输入或上传服务账号 JSON": "Режим JSON поддерживает ручной ввод или загрузку JSON сервисного аккаунта", "JSON格式密钥,请确保格式正确": "Ключ в формате JSON, убедитесь в правильности формата", @@ -168,8 +160,8 @@ "LinuxDO": "LinuxDO", "LinuxDO ID": "ID LinuxDO", "Logo 图片地址": "Адрес изображения логотипа", - "Midjourney 任务记录": "Записи задач Midjourney", "MIT许可证": "Лицензия MIT", + "Midjourney 任务记录": "Записи задач Midjourney", "New API项目仓库地址:": "Адрес репозитория проекта New API:", "NewAPI 默认不会将入口请求的 User-Agent 透传到上游渠道;该条件仅用于识别访问本站点的客户端。": "NewAPI по умолчанию не передаёт User-Agent входящего запроса в вышестоящие каналы; это условие используется только для идентификации клиентов, обращающихся к данному сайту.", "OAuth Client ID": "OAuth Client ID", @@ -180,6 +172,7 @@ "Ollama 模型管理": "Ollama Model Management", "Ollama 版本信息": "Ollama Version Info", "Opus 模型": "Модель Opus", + "POST 参数": "Параметры POST", "Passkey": "Passkey", "Passkey 已解绑": "Passkey отвязан", "Passkey 已重置": "Passkey сброшен", @@ -188,53 +181,49 @@ "Passkey 注册成功": "Регистрация Passkey успешна", "Passkey 登录": "Вход через Passkey", "Ping间隔(秒)": "Интервал Ping (секунды)", - "POST 参数": "Параметры POST", - "price_xxx 的商品价格 ID,新建产品后可获得": "ID цены товара price_xxx, можно получить после создания нового продукта", "Prompt cache hit tokens": "Prompt cache hit tokens", "Prompt tokens": "Prompt tokens", "Reasoning Effort": "Усилие рассуждения", "Request ID": "Request ID", - "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "Поле safety_identifier помогает OpenAI идентифицировать пользователей приложений, которые могут нарушать политику использования. По умолчанию отключено для защиты конфиденциальности пользователей", - "Scopes(可选)": "Scopes (необязательно)", - "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "Поле service_tier используется для указания уровня сервиса, позволяет передавать параметры, которые могут привести к фактической оплате выше ожидаемой. По умолчанию отключено для избежания дополнительных расходов", - "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "Ключ Stripe sk_xxx или rk_xxx, конфиденциальная информация не отображается", "SMTP 发送者邮箱": "Email отправителя SMTP", "SMTP 服务器地址": "Адрес сервера SMTP", "SMTP 端口": "Порт SMTP", "SMTP 访问凭证": "Учетные данные доступа SMTP", "SMTP 账户": "Учетная запись SMTP", - "Sonnet 模型": "Модель Sonnet", "SSE 事件": "Событие SSE", "SSE数据流": "Поток данных SSE", "SSRF防护开关详细说明": "Подробное описание переключателя защиты SSRF", "SSRF防护设置": "Настройки защиты SSRF", "SSRF防护详细说明": "Подробное описание защиты SSRF", - "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "Поле store используется для авторизации OpenAI хранить данные запросов для оценки и оптимизации продукта. По умолчанию отключено, после включения может привести к неработоспособности Codex", + "Scopes(可选)": "Scopes (необязательно)", + "Sonnet 模型": "Модель Sonnet", "Stripe 设置": "Настройки Stripe", "Stripe/Creem 商品ID(可选)": "ID продукта Stripe/Creem (необязательно)", "Stripe/Creem 需在第三方平台创建商品并填入 ID": "Товары Stripe/Creem нужно создать на сторонней платформе и указать их ID", + "TTL(秒)": "TTL (секунды)", + "TTL(秒,0 表示默认)": "TTL (секунды, 0 — по умолчанию)", "Telegram": "Telegram", "Telegram Bot Token": "Токен бота Telegram", "Telegram Bot 名称": "Имя бота Telegram", "Telegram ID": "ID Telegram", "Token Endpoint": "Конечная точка токена", - "token 会按倍率换算成“额度/次数”,请求结束后再做差额结算(补扣/返还)。": "Токены конвертируются в квоту/количество использований по коэффициенту. После завершения запроса производится расчёт разницы (дополнительное списание/возврат).", "Total tokens": "Total tokens", - "true": "true", - "TTL(秒,0 表示默认)": "TTL (секунды, 0 — по умолчанию)", - "TTL(秒)": "TTL (секунды)", "Turnstile Secret Key": "Секретный ключ Turnstile", "Turnstile Site Key": "Ключ сайта Turnstile", - "Unix时间戳": "Временная метка Unix", - "Uptime Kuma地址": "Адрес Uptime Kuma", - "Uptime Kuma监控分类管理,可以配置多个监控分类用于服务状态展示(最多20个)": "Управление категориями мониторинга Uptime Kuma, можно настроить несколько категорий мониторинга для отображения статуса сервисов (максимум 20)", "URL 标识,只能包含小写字母、数字和连字符": "Идентификатор URL, допускаются только строчные буквы, цифры и дефисы", "URL链接": "URL ссылка", "USD (美元)": "USD (доллар США)", + "Unix时间戳": "Временная метка Unix", + "Uptime Kuma地址": "Адрес Uptime Kuma", + "Uptime Kuma监控分类管理,可以配置多个监控分类用于服务状态展示(最多20个)": "Управление категориями мониторинга Uptime Kuma, можно настроить несколько категорий мониторинга для отображения статуса сервисов (максимум 20)", "User Info Endpoint": "Конечная точка информации о пользователе", "User-Agent include(每行一个,可不写)": "User-Agent include (по одному в строке, необязательно)", "Value 正则": "Regex значения", "Vertex AI 不支持 functionResponse.id 字段,开启后将自动移除该字段": "Vertex AI не поддерживает поле functionResponse.id. При включении это поле будет автоматически удалено", + "WeChat Server 服务器地址": "Адрес сервера WeChat Server", + "WeChat Server 访问凭证": "Учетные данные доступа WeChat Server", + "Web 搜索调用 {{webSearchCallCount}} 次": "Web-поиск вызван {{webSearchCallCount}} раз", + "Web 搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Web-поиск: {{count}} / 1K * цена за единицу {{price}} * {{ratioType}} {{ratio}} = {{amount}}", "Webhook 密钥": "Секрет вебхука", "Webhook 签名密钥": "Ключ подписи Webhook", "Webhook地址": "Адрес Webhook", @@ -242,49 +231,89 @@ "Webhook请求结构说明": "Описание структуры запроса Webhook", "Webhook通知": "Уведомления Webhook", "Web搜索价格:{{symbol}}{{price}} / 1K 次": "Цена Web-поиска: {{symbol}}{{price}} / 1K раз", - "WeChat Server 服务器地址": "Адрес сервера WeChat Server", - "WeChat Server 访问凭证": "Учетные данные доступа WeChat Server", "Well-Known URL": "Well-Known URL", "Well-Known URL 必须以 http:// 或 https:// 开头": "Well-Known URL должен начинаться с http:// или https://", - "whsec_xxx 的 Webhook 签名密钥,敏感信息不显示": "Ключ подписи Webhook whsec_xxx, конфиденциальная информация не отображается", "Worker地址": "Адрес Worker", "Worker密钥": "Ключ Worker", + "[最多请求次数]和[最多请求完成次数]的最大值为2147483647。": "[Максимальное количество запросов] и [Максимальное количество выполненных запросов] имеют максимальное значение 2147483647.", + "[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。": "[Максимальное количество запросов] должно быть больше или равно 0, [Максимальное количество выполненных запросов] должно быть больше или равно 1.", + "auto分组调用链路": "Цепочка вызовов автоматической группировки", + "common.changeLanguage": "common.changeLanguage", + "context_int/context_string 从请求上下文读取;gjson 从入口请求的 JSON body 按 gjson path 读取。": "context_int/context_string читаются из контекста запроса; gjson читает из JSON body входящего запроса по gjson path.", + "default 和 vip 只能由管理员在「用户管理」中分配给用户。适用于按用户等级定价、内部测试等不希望用户自主选择的场景。": "default and vip can only be assigned to users by admin in \"User Management\". Suitable for tiered pricing, internal testing, or other scenarios where user self-selection is not desired.", + "default为默认设置,可单独设置每个分类的安全等级": "default - это настройка по умолчанию, можно отдельно установить уровень безопасности для каждой категории", + "default为默认设置,可单独设置每个模型的版本": "default - это настройка по умолчанию, можно отдельно установить версию для каждой модели", + "false": "false", + "include_obfuscation 用于控制 Responses 流混淆字段。默认关闭以避免客户端关闭该安全保护": "include_obfuscation управляет полями обфускации в потоке Responses. Отключено по умолчанию, чтобы клиенты не отключали эту защиту", + "inference_geo 字段用于控制 Claude 数据驻留推理区域。默认关闭以避免未经授权透传地域信息": "Поле inference_geo управляет регионом размещения данных инференса Claude. Отключено по умолчанию для предотвращения несанкционированной передачи географической информации", + "price_xxx 的商品价格 ID,新建产品后可获得": "ID цены товара price_xxx, можно получить после создания нового продукта", + "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "Поле safety_identifier помогает OpenAI идентифицировать пользователей приложений, которые могут нарушать политику использования. По умолчанию отключено для защиты конфиденциальности пользователей", + "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "Поле service_tier используется для указания уровня сервиса, позволяет передавать параметры, которые могут привести к фактической оплате выше ожидаемой. По умолчанию отключено для избежания дополнительных расходов", + "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "Ключ Stripe sk_xxx или rk_xxx, конфиденциальная информация не отображается", + "standard 已被移除,vip 用户看不到": "standard has been removed, vip users cannot see it", + "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "Поле store используется для авторизации OpenAI хранить данные запросов для оценки и оптимизации продукта. По умолчанию отключено, после включения может привести к неработоспособности Codex", + "token 会按倍率换算成“额度/次数”,请求结束后再做差额结算(补扣/返还)。": "Токены конвертируются в квоту/количество использований по коэффициенту. После завершения запроса производится расчёт разницы (дополнительное списание/возврат).", + "true": "true", + "whsec_xxx 的 Webhook 签名密钥,敏感信息不显示": "Ключ подписи Webhook whsec_xxx, конфиденциальная информация не отображается", + "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", + "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", + "{{name}} ID": "{{name}} ID", + "{{ratioType}} {{ratio}}": "{{ratioType}} {{ratio}}", + "{{ratioType}} {{ratio}}x": "{{ratioType}} {{ratio}}x", + "| 基于": "| Основано на", + "© {{currentYear}}": "© {{currentYear}}", + "• 视频服务商的跨域限制": "• Ограничения кросс-доменных запросов со стороны видеосервиса", + "• 防盗链保护机制": "• Защита от хотлинков", + "• 需要特定的请求头或认证": "• Требуются специальные заголовки или авторизация", + "「用户可选」决定用户创建令牌时能否自主选择该分组。未勾选的分组只能由管理员在后台分配给用户,不会出现在用户的令牌创建页面中。": "\"User Selectable\" controls whether users can choose this group when creating tokens. Unchecked groups can only be assigned by admin and won't appear in the token creation page.", "一个月": "Один месяц", "一天": "Один день", "一小时": "Один час", "一次调用消耗多少刀,优先级大于模型倍率": "Сколько долларов потребляется за один вызов, приоритет выше чем коэффициент модели", - "一行一个,不区分大小写": "Один элемент на строку, без учета регистра", "一行一个屏蔽词,不需要符号分割": "Одно запрещенное слово на строку, не требуют разделителей", + "一行一个,不区分大小写": "Один элемент на строку, без учета регистра", "一键填充到 FluentRead": "Однократное заполнение в FluentRead", + "三种操作的区别:": "Differences between the three operations:", "上一个表单块": "Предыдущий блок формы", "上一步": "Предыдущий шаг", "上次保存: ": "Последнее сохранение: ", "上游倍率同步": "Синхронизация множителей upstream", + "上游模型管理": "Управление моделями апстрима", "上游返回": "Ответ апстрима", "下一个表单块": "Следующий блок формы", "下一步": "Следующий шаг", "下午好": "Добрый день", "下载日志": "Download Logs", + "下面展示这个模型保存后会写入哪些后端字段,便于和原始 JSON 编辑框保持一致。": "Ниже показано, какие backend-поля будут записаны после сохранения, чтобы их было удобно сверять с редакторами исходного JSON.", + "不会出现": "will not appear", "不再提醒": "Больше не напоминать", + "不勾选用户可选": "Not user-selectable", "不升级": "Не повышать", + "不变": "unchanged", "不同用户分组的价格信息": "Информация о ценах для разных групп пользователей", "不填则为模型列表第一个": "Если не заполнено, используется первая модель из списка", "不建议使用": "Не рекомендуется использовать", "不支持": "Не поддерживается", "不是合法的 JSON 字符串": "Недопустимая JSON строка", "不更改": "Не изменять", + "不配置特殊倍率时:": "Without special ratios:", + "不配置规则时,所有用户看到的下拉框一样:": "Without rules, all users see the same dropdown:", "不重置": "Без сброса", + "不重试": "Не повторять", "不限": "Без ограничений", "不限制": "Без ограничений", "与本地相同": "Так же как локально", "专属倍率": "Специальный коэффициент", + "专属分组": "Exclusive group", + "两个分组都勾选了「用户可选」,所以用户创建令牌时可以看到这两个选项:": "Both groups have \"User Selectable\" checked, so users can see these two options when creating tokens:", "两次输入的密码不一致": "Введенные пароли не совпадают", "两次输入的密码不一致!": "Введенные пароли не совпадают!", "两步验证": "Двухфакторная аутентификация", - "两步验证(2FA)为您的账户提供额外的安全保护。启用后,登录时需要输入密码和验证器应用生成的验证码。": "Двухфакторная аутентификация (2FA) предоставляет дополнительную защиту для вашего аккаунта. После включения, при входе потребуется вводить пароль и код подтверждения из приложения аутентификатора.", "两步验证启用成功!": "Двухфакторная аутентификация успешно включена!", "两步验证已禁用": "Двухфакторная аутентификация отключена", "两步验证设置": "Настройки двухфакторной аутентификации", + "两步验证(2FA)为您的账户提供额外的安全保护。启用后,登录时需要输入密码和验证器应用生成的验证码。": "Двухфакторная аутентификация (2FA) предоставляет дополнительную защиту для вашего аккаунта. После включения, при входе потребуется вводить пароль и код подтверждения из приложения аутентификатора.", "个": "шт.", "个GPU": " GPUs", "个人中心": "Личный кабинет", @@ -302,6 +331,7 @@ "个生效中": "активных", "个部署吗?此操作不可逆。": " deployments? This operation cannot be undone.", "中午好": "Добрый день", + "为 vip 用户配置规则:": "Configure rules for vip users:", "为一个 JSON 对象,例如:{\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}": "Является JSON объектом, например: {\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}", "为一个 JSON 数组,例如:[10, 20, 50, 100, 200, 500]": "Является JSON массивом, например: [10, 20, 50, 100, 200, 500]", "为一个 JSON 文本": "Является JSON текстом", @@ -316,7 +346,9 @@ "为一个 JSON 文本,键为组名称,值为倍率": "Является JSON текстом, ключ - имя группы, значение - коэффициент", "为了保护账户安全,请验证您的两步验证码。": "Для защиты безопасности вашего аккаунта, пожалуйста, подтвердите ваш код двухфакторной аутентификации.", "为了保护账户安全,请验证您的身份。": "Для защиты безопасности вашего аккаунта, пожалуйста, подтвердите вашу личность.", + "为什么 default 不勾选「用户可选」?": "Why is default not set as \"User Selectable\"?", "为保证匹配准确,请确保客户端直连本站点(避免反向代理/网关改写 User-Agent)。": "Для точного сопоставления убедитесь, что клиент подключается напрямую к этому сайту (избегайте обратных прокси/шлюзов, которые перезаписывают User-Agent).", + "为特定用户分组配置可用分组的增减规则。「添加」为该分组新增可用分组,「移除」移除默认可用分组,「追加」直接追加分组": "Configure add/remove rules for specific user groups. \"Add\" adds a new selectable group, \"Remove\" removes a default selectable group, \"Append\" directly appends a group", "为空则默认使用服务器地址,多个 Origin 用逗号分隔,例如 https://newapi.pro,https://newapi.com ,注意不能携带[],需使用https": "Если пусто, используется адрес сервера по умолчанию. Несколько Origin разделяются запятыми, например https://newapi.pro,https://newapi.com. Обратите внимание, что нельзя использовать [], необходимо использовать https", "主模型": "Основная модель", "主页链接填": "Введите ссылку на главную страницу", @@ -327,6 +359,8 @@ "产品名称": "Название продукта", "产品配置": "Конфигурация продукта", "产品配置错误,请联系管理员": "Ошибка конфигурации продукта, обратитесь к администратору", + "享受 8 折": "20% off", + "什么是分组?": "What are groups?", "仅为使用OpenAI格式的Gemini/Vertex渠道填充thoughtSignature": "Заполнять thoughtSignature только для каналов Gemini/Vertex, использующих формат OpenAI", "仅会覆盖你勾选的字段,未勾选的字段保持本地不变。": "Будут перезаписаны только отмеченные поля, неотмеченные поля останутся без изменений локально.", "仅供参考,以实际扣费为准": "Только для справки, фактическое списание может отличаться", @@ -351,14 +385,19 @@ "今日关闭": "Закрыть сегодня", "今日已签到": "Зарегистрирован сегодня", "今日已签到,累计签到": "Зарегистрирован сегодня, всего регистраций", + "从 0.5 降到 0.3": "reduced from 0.5 to 0.3", + "从剪贴板粘贴配置": "Вставить конфигурацию", "从官方模型库同步": "Синхронизировать из официальной библиотеки моделей", "从认证器应用中获取验证码,或使用备用码": "Получите код подтверждения из приложения аутентификатора или используйте резервный код", "从配置文件同步": "Синхронизировать из файла конфигурации", + "从默认列表中去掉一个分组": "Remove a group from the default list", "代理地址": "Адрес прокси", "代理设置": "Настройки прокси", "代码已复制到剪贴板": "Код скопирован в буфер обмена", "令牌": "Токен", "令牌分组": "Группа токенов", + "令牌分组设为 auto 时,按以下顺序依次尝试选择可用分组,排在前面的优先级更高": "When token group is set to auto, groups are selected in order of priority, with higher priority groups listed first", + "令牌分组设为 auto 时,系统按优先级顺序自动选择一个可用分组。": "When token group is set to auto, the system automatically selects an available group by priority.", "令牌分组,默认为用户的分组": "Группа токенов, по умолчанию используется группа пользователя", "令牌创建成功,请在列表页面点击复制获取令牌!": "Токен успешно создан, пожалуйста, нажмите копировать на странице списка для получения токена!", "令牌名称": "Имя токена", @@ -371,9 +410,9 @@ "以及": "а также", "仪表盘设置": "Настройки панели управления", "价格": "Цена", - "价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}}": "Price: {{symbol}}{{price}} * {{ratioType}}: {{ratio}}", - "价格:${{price}} * {{ratioType}}:{{ratio}}": "Цена: ${{price}} * {{ratioType}}: {{ratio}}", + "价格摘要": "Сводка цен", "价格暂时不可用,请稍后重试": "Price temporarily unavailable, please try again later", + "价格模式(默认)": "Режим цен (по умолчанию)", "价格计算中...": "Calculating price...", "价格计算失败": "Price calculation failed", "价格计算失败: ": "Price calculation failed: ", @@ -381,6 +420,8 @@ "价格设置方式": "Способ настройки цен", "价格重新计算中...": "Recalculating price...", "价格预估": "Price Estimate", + "价格:${{price}} * {{ratioType}}:{{ratio}}": "Цена: ${{price}} * {{ratioType}}: {{ratio}}", + "价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}}": "Price: {{symbol}}{{price}} * {{ratioType}}: {{ratio}}", "任一满足(OR)": "Любое совпадение (OR)", "任务 ID": "ID задачи", "任务ID": "ID задачи", @@ -403,7 +444,6 @@ "作用域:包含规则名称": "Область действия: включить имя правила", "你似乎并没有修改什么": "Похоже, вы ничего не изменили", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "Вы можете добавить их вручную в разделе «Пользовательские названия моделей», нажать «Заполнить», затем отправить или воспользоваться действиями ниже для автоматической обработки.", - "使用 {{name}} 继续": "Продолжить с {{name}}", "使用 Discord 继续": "Продолжить через Discord", "使用 GitHub 继续": "Продолжить с GitHub", "使用 JSON 对象格式,格式为:{\"组名\": [最多请求次数, 最多请求完成次数]}": "Используйте формат объекта JSON, формат: {\"Имя группы\": [Максимальное количество запросов, Максимальное количество выполненных запросов]}", @@ -412,36 +452,42 @@ "使用 Passkey 实现免密且更安全的登录体验": "Используйте Passkey для безпарольного и более безопасного входа", "使用 Passkey 登录": "Войти с Passkey", "使用 Passkey 验证": "Проверить с Passkey", + "使用 {{name}} 继续": "Продолжить с {{name}}", "使用 微信 继续": "Продолжить с WeChat", "使用 用户名 注册": "Зарегистрироваться с именем пользователя", "使用 邮箱或用户名 登录": "Войти с email или именем пользователя", "使用ID排序": "Сортировать по ID", + "使用分组": "Using Group", "使用日志": "Журнал использования", "使用模式": "Режим использования", "使用统计": "Статистика использования", - "使用认证器应用(如 Google Authenticator、Microsoft Authenticator)扫描下方二维码:": "Отсканируйте QR-код ниже с помощью приложения аутентификатора (например, Google Authenticator, Microsoft Authenticator):", "使用认证器应用扫描二维码": "Отсканировать QR-код с помощью приложения аутентификатора", + "使用认证器应用(如 Google Authenticator、Microsoft Authenticator)扫描下方二维码:": "Отсканируйте QR-код ниже с помощью приложения аутентификатора (например, Google Authenticator, Microsoft Authenticator):", + "使用说明": "Guide", "例如 /var/cache/new-api": "напр.: /var/cache/new-api", - "例如 €, £, Rp, ₩, ₹...": "Например €, £, Rp, ₩, ₹...", "例如 https://docs.newapi.pro": "Например https://docs.newapi.pro", - "例如:": "например:", + "例如 €, £, Rp, ₩, ₹...": "Например €, £, Rp, ₩, ₹...", "例如: /bin/bash -c \"python app.py\"": "e.g.: /bin/bash -c \"python app.py\"", "例如: nginx:latest": "e.g.: nginx:latest", "例如: socks5://user:pass@host:port": "например: socks5://user:pass@host:port", + "例如发卡网站的购买链接": "например ссылка на покупку на сайте карт", + "例如(全渠道):": "Пример (все каналы):", + "例如(指定渠道):": "Пример (указанные каналы):", + "例如:": "например:", "例如:-c": "e.g.: -c", "例如:/bin/bash": "e.g.: /bin/bash", "例如:0001": "например: 0001", "例如:1000": "например: 1000", "例如:100000": "Например: 100000", - "例如:2,就是最低充值2$": "например: 2, это минимальное пополнение 2$", "例如:2000": "например: 2000", + "例如:2,就是最低充值2$": "например: 2, это минимальное пополнение 2$", "例如:4.99": "Например: 4.99", "例如:401, 403, 429, 500-599": "напр.: 401, 403, 429, 500-599", "例如:7,就是7元/美金": "например: 7, это 7 юаней/доллар США", + "例如:GitHub Enterprise": "напр.: GitHub Enterprise", "例如:email": "напр.: email", "例如:example.com": "например: example.com", "例如:github / si:google / https://example.com/logo.png / 🐱": "напр.: github / si:google / https://example.com/logo.png / 🐱", - "例如:GitHub Enterprise": "напр.: GitHub Enterprise", "例如:github-enterprise": "напр.: github-enterprise", "例如:https://example.com/.well-known/openid-configuration": "напр.: https://example.com/.well-known/openid-configuration", "例如:https://gitea.example.com": "напр.: https://gitea.example.com", @@ -456,9 +502,6 @@ "例如:该请求不满足准入策略": "напр.: Этот запрос не соответствует политике допуска", "例如:适合轻度使用": "Например: для легкого использования", "例如:需要等级 {{required}},你当前等级 {{current}}": "напр.: Требуется уровень {{required}}, ваш текущий уровень {{current}}", - "例如(全渠道):": "Пример (все каналы):", - "例如(指定渠道):": "Пример (указанные каналы):", - "例如发卡网站的购买链接": "например ссылка на покупку на сайте карт", "供应商": "Поставщик", "供应商介绍": "Описание поставщика", "供应商信息:": "Информация о поставщике:", @@ -480,11 +523,12 @@ "保存 Turnstile 设置": "Сохранить настройки Turnstile", "保存 WeChat Server 设置": "Сохранить настройки WeChat Server", "保存分组倍率设置": "Сохранить настройки коэффициентов групп", + "保存分组相关设置": "Сохранить настройки, связанные с группами", "保存备用码": "Сохранить резервные коды", "保存备用码以备不时之需": "Сохраните резервные коды на случай необходимости", "保存失败": "Не удалось сохранить", - "保存失败,请重试": "Не удалось сохранить, попробуйте еще раз", "保存失败:": "Не удалось сохранить:", + "保存失败,请重试": "Не удалось сохранить, попробуйте еще раз", "保存屏蔽词过滤设置": "Сохранить настройки фильтрации запрещенных слов", "保存性能设置": "Сохранить настройки производительности", "保存成功": "Успешно сохранено", @@ -499,7 +543,9 @@ "保存设置": "Сохранить настройки", "保存通用设置": "Сохранить общие настройки", "保存邮箱域名白名单设置": "Сохранить настройки белого списка доменов email", + "保存预览": "Предпросмотр сохранения", "保存额度设置": "Сохранить настройки лимитов", + "保留": "kept", "保留原值(目标已有值时不覆盖)": "Сохранить исходное значение (не перезаписывать, если цель уже имеет значение)", "保留天数": "Дней для хранения", "保留文件数": "Файлов для хранения", @@ -516,18 +562,20 @@ "倍率信息": "Информация о коэффициентах", "倍率是为了方便换算不同价格的模型": "Коэффициенты предназначены для удобного пересчета моделей с разными ценами", "倍率模式": "Режим коэффициентов", + "倍率用于计费乘数,勾选「用户可选」后用户可在创建令牌时选择该分组": "Ratio is the billing multiplier. Check \"User Selectable\" to let users pick this group when creating tokens", "倍率类型": "Тип коэффициента", + "假设再加两个分组 default 和 vip,但不勾选用户可选:": "Now add two more groups default and vip, but without checking User Selectable:", "偏好设置": "Настройки", "停止测试": "Остановить тест", "停止重试": "Остановить повтор", "停用": "Отключить", "允许 AccountFilter 参数": "Разрешить параметр AccountFilter", "允许 HTTP 协议图片请求(适用于自部署代理)": "Разрешить запросы изображений по протоколу HTTP (применимо для самостоятельно развернутых прокси)", + "允许 Turnstile 用户校验": "Разрешить проверку пользователей Turnstile", "允许 inference_geo 透传": "Разрешить передачу inference_geo", "允许 safety_identifier 透传": "Разрешить сквозную передачу safety_identifier", "允许 service_tier 透传": "Разрешить сквозную передачу service_tier", "允许 stream_options.include_obfuscation 透传": "Разрешить передачу stream_options.include_obfuscation", - "允许 Turnstile 用户校验": "Разрешить проверку пользователей Turnstile", "允许不安全的 Origin(HTTP)": "Разрешить небезопасные Origin (HTTP)", "允许回调(会泄露服务器 IP 地址)": "Разрешить обратные вызовы (может раскрыть IP-адрес сервера)", "允许在 Stripe 支付中输入促销码": "Разрешить ввод промокодов при оплате через Stripe", @@ -548,13 +596,13 @@ "允许重试": "Разрешить повтор", "元": "Юань", "充值": "Пополнить", - "充值价格(x元/美金)": "Цена пополнения (x юаней/доллар США)", "充值价格显示": "Отображение цены пополнения", + "充值价格(x元/美金)": "Цена пополнения (x юаней/доллар США)", "充值分组倍率": "Коэффициенты групп пополнения", "充值分组倍率不是合法的 JSON 字符串": "Коэффициенты групп пополнения не являются допустимой JSON строкой", "充值数量": "Количество пополнения", - "充值数量,最低 ": "Количество пополнения, минимум ", "充值数量不能小于": "Количество пополнения не может быть меньше", + "充值数量,最低 ": "Количество пополнения, минимум ", "充值方式设置": "Настройки способов пополнения", "充值方式设置不是合法的 JSON 字符串": "Настройки способов пополнения не являются допустимой JSON строкой", "充值确认": "Подтверждение пополнения", @@ -570,8 +618,8 @@ "兑换成功!": "Обмен успешен!", "兑换码充值": "Пополнение кодом купона", "兑换码创建成功": "Код купона успешно создан", - "兑换码创建成功,是否下载兑换码?": "Код купона успешно создан, скачать код купона?", "兑换码创建成功!": "Код купона успешно создан!", + "兑换码创建成功,是否下载兑换码?": "Код купона успешно создан, скачать код купона?", "兑换码将以文本文件的形式下载,文件名为兑换码的名称。": "Код купона будет загружен в виде текстового файла, имя файла - название кода купона.", "兑换码更新成功!": "Код купона успешно обновлен!", "兑换码生成管理": "Управление генерацией кодов купонов", @@ -601,18 +649,18 @@ "公告更新失败": "Не удалось обновить объявление", "公告类型": "Тип объявления", "共": "Всего", - "共 {{count}} 个密钥_one": "Всего {{count}} ключ", "共 {{count}} 个密钥_few": "Всего {{count}} ключа", "共 {{count}} 个密钥_many": "Всего {{count}} ключей", + "共 {{count}} 个密钥_one": "Всего {{count}} ключ", "共 {{count}} 个密钥_other": "Всего {{count}} ключей", "共 {{count}} 个模型": "Всего {{count}} моделей", - "共 {{count}} 个模型_one": "{{count}} модель", "共 {{count}} 个模型_few": "{{count}} модели", "共 {{count}} 个模型_many": "{{count}} моделей", + "共 {{count}} 个模型_one": "{{count}} модель", "共 {{count}} 个模型_other": "{{count}} моделей", - "共 {{count}} 条日志_one": "{{count}} log entry", "共 {{count}} 条日志_few": "{{count}} записи журнала", "共 {{count}} 条日志_many": "{{count}} записей журнала", + "共 {{count}} 条日志_one": "{{count}} log entry", "共 {{count}} 条日志_other": "{{count}} log entries", "共 {{total}} 项,当前显示 {{start}}-{{end}} 项": "Всего {{total}} элементов, отображаются {{start}}-{{end}}", "关": "Выкл", @@ -624,8 +672,8 @@ "关闭": "Закрыть", "关闭侧边栏": "Закрыть боковую панель", "关闭公告": "Закрыть объявление", - "关闭后,此模型将不会被“同步官方”自动覆盖或创建": "После отключения эта модель не будет автоматически перезаписана или создана при \"синхронизации с официальной\"", "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?": "После закрытия это уведомление больше не будет показываться (только в этом браузере). Закрыть?", + "关闭后,此模型将不会被“同步官方”自动覆盖或创建": "После отключения эта модель не будет автоматически перезаписана или создана при \"синхронизации с официальной\"", "关闭弹窗,已停止批量测试": "Окно закрыто, массовое тестирование остановлено", "关闭提示": "Закрыть уведомление", "其他": "Другое", @@ -643,17 +691,6 @@ "内置": "Встроенный", "内置 Ollama 镜像": "Built-in Ollama Image", "再次输入部署名称": "Enter Deployment Name Again", - "最低": "Минимум", - "最低充值美元数量": "Минимальная сумма пополнения в долларах", - "最后使用时间": "Время последнего использования", - "最后更新": "Last Updated", - "最后请求": "Последний запрос", - "最大GPU数量": "Max Number of GPUs", - "最大可用": "Max Available", - "最大条目数": "Макс. кол-во записей", - "最终抵扣": "Итоговое списание", - "最近一次": "Последний", - "最近事件": "Recent Events", "写": "Запись", "准入策略": "Политика допуска", "准入策略 JSON(可选)": "JSON политики допуска (необязательно)", @@ -662,14 +699,23 @@ "凭证已刷新": "Учётные данные обновлены", "分类名称": "Название категории", "分组": "Группа", + "分组JSON设置": "Group JSON Settings", "分组与模型定价设置": "Настройки групп и ценообразования моделей", "分组价格": "Цена группы", "分组倍率": "Коэффициент группы", "分组倍率设置": "Настройки коэффициента группы", "分组倍率设置,可以在此处新增分组或修改现有分组的倍率,格式为 JSON 字符串,例如:{\"vip\": 0.5, \"test\": 1},表示 vip 分组的倍率为 0.5,test 分组的倍率为 1": "Настройки коэффициента группы, здесь можно добавить новые группы или изменить Коэффициенты существующих групп, формат - JSON строка, например: {\"vip\": 0.5, \"test\": 1}, что означает коэффициент группы vip равен 0.5, коэффициент группы test равен 1", + "分组名": "Group", + "分组名称": "Group Name", + "分组名称到倍率的映射": "Mapping of group names to ratios", + "分组描述": "Group Description", + "分组是用于控制计费倍率和模型访问权限的核心概念。每个用户属于一个分组,每个令牌也可以指定使用某个分组。": "Groups are a core concept for controlling billing ratios and model access. Each user belongs to a group, and each token can be assigned to a specific group.", "分组特殊倍率": "Специальный коэффициент группы", "分组特殊可用分组": "Доступные специальные группы", + "分组相关设置": "Настройки, связанные с группами", + "分组管理": "Group Management", "分组设置": "Настройки группы", + "分组设置使用说明": "Group Settings Guide", "分组速率配置优先级高于全局速率限制。": "Конфигурация скорости группы имеет более высокий приоритет, чем глобальные ограничения скорости.", "分组速率限制": "Ограничение скорости группы", "分钟": "минут", @@ -684,7 +730,9 @@ "列出的模型将不会自动添加或移除-thinking/-nothinking 后缀": "Для этих моделей суффиксы -thinking/-nothinking не будут добавляться или удаляться автоматически.", "列设置": "Настройки столбцов", "创建": "Create", + "创建令牌可选": "Selectable when creating tokens", "创建令牌默认选择auto分组,初始令牌也将设为auto(否则留空,为用户默认分组)": "При создании токена по умолчанию выбирается группа auto, начальный токен также будет установлен в auto (иначе оставить пустым для группы пользователя по умолчанию)", + "创建和管理分组": "Create and Manage Groups", "创建失败": "Не удалось создать", "创建成功": "Успешно создано", "创建或选择密钥时,将 Project 设置为 io.cloud": "When creating or selecting a key, set Project to io.cloud", @@ -696,6 +744,7 @@ "创建新的订阅套餐": "Создать новый план подписки", "创建新的预填组": "Создать новую группу предварительного заполнения", "创建时间": "Время создания", + "创建渠道所需的基本信息": "Основная информация для создания канала", "创建用户": "Создать пользователя", "初始化失败,请重试": "Инициализация не удалась, попробуйте еще раз", "初始化系统": "Инициализация системы", @@ -729,13 +778,15 @@ "前往设置": "Go to Settings", "前往设置页面": "Go to Settings Page", "前缀": "Префикс", - "副本数量": "Number of Replicas", + "前:": "До:", "剩余": "Remaining", "剩余备用码:": "Оставшиеся резервные коды:", "剩余时间": "Remaining Time", "剩余额度": "Оставшаяся квота", - "剩余额度/总额度": "Оставшаяся квота/Общая квота", "剩余额度$": "Оставшаяся квота$", + "剩余额度/总额度": "Оставшаяся квота/Общая квота", + "剪贴板中未检测到连接信息": "Данные подключения не найдены в буфере обмена", + "副本数量": "Number of Replicas", "功能特性": "Функциональные возможности", "加入渠道": "Join Channel", "加入预填组": "Присоединиться к группе предварительного заполнения", @@ -756,6 +807,7 @@ "加载详情中...": "Loading details...", "加载账单失败": "Не удалось загрузить счёт", "加载隐私政策内容失败...": "Не удалось загрузить содержимое политики конфиденциальности...", + "勾选后,该分组会出现在用户创建令牌时的下拉菜单中。未勾选的分组只能由管理员分配,用户自己无法选择。": "When checked, this group appears in the dropdown when users create tokens. Unchecked groups can only be assigned by admin.", "包含": "Включает", "包含来自未知或未标明供应商的AI模型,这些模型可能来自小型供应商或开源项目。": "Включает модели ИИ от неизвестных или неуказанных поставщиков, эти модели могут быть от небольших поставщиков или проектов с открытым исходным кодом.", "包括失败请求的次数,0代表不限制": "Включает количество неудачных запросов, 0 означает без ограничений", @@ -768,6 +820,7 @@ "单GPU小时费率": "Per GPU Hour Rate", "历史消耗": "Историческое потребление", "原价": "Первоначальная цена", + "原价,和普通用户一样": "original price, same as regular users", "原因:": "Причина:", "原密码": "Старый пароль", "原生格式": "Нативный формат", @@ -802,6 +855,9 @@ "只包括请求成功的次数": "Включать только успешные запросы", "只支持HTTPS,系统将以POST方式发送通知,请确保地址可以接收POST请求": "Поддерживается только HTTPS, система будет отправлять уведомления методом POST, убедитесь, что адрес может принимать POST-запросы", "只有当用户设置开启IP记录时,才会进行请求和错误类型日志的IP记录": "IP-адреса в журналах запросов и ошибок записываются только когда пользователь включил запись IP-адресов в настройках", + "只有配置了规则的组合才会覆盖,未配置的组合仍使用令牌分组的基础倍率。": "Only configured combinations are overridden. Unconfigured combinations still use the token group's base ratio.", + "可以根据用户分组增减令牌可选的分组范围。例如 vip 用户额外开放 premium 分组,或移除某个分组的选择权。": "Adjust the selectable group range based on user group. E.g., grant vip users access to premium, or remove access to a group.", + "可以根据用户分组设置不同的计费倍率。例如 vip 用户使用 standard 令牌时倍率从 1.0 降为 0.8。": "Set different billing ratios based on user group. E.g., vip users using standard tokens get ratio 0.8 instead of 1.0.", "可信": "Доверенный", "可在设置页面设置关于内容,支持 HTML & Markdown": "Можно установить содержимое страницы \"О нас\" на странице настроек, поддерживается HTML и Markdown", "可手动填写,多个 scope 用空格分隔": "Можно заполнить вручную, несколько scope разделяются пробелами", @@ -818,14 +874,16 @@ "可视化": "Визуализация", "可视化倍率设置": "Визуальные настройки коэффициента", "可视化编辑": "Визуальное редактирование", - "可选,公告的补充说明": "Необязательно, дополнительное описание объявления", - "可选,用于复现结果": "Необязательно, для воспроизводимых результатов", - "可选:基于用户信息 JSON 做组合条件准入,条件不满足时返回自定义提示": "Необязательно: Допуск на основе комбинированных условий из JSON пользовательской информации; при несоответствии условиям возвращается пользовательское сообщение", - "可选:用于自动生成端点或 Discovery URL": "Необязательно: Используется для автоматической генерации конечных точек или Discovery URL", "可选。匹配入口请求的 User-Agent;任意一行作为子串匹配(忽略大小写)即命中。": "Необязательно. Сопоставление User-Agent входящего запроса; любая строка, совпадающая как подстрока (без учёта регистра), считается совпадением.", "可选。对提取到的亲和 Key 做正则校验;不填表示不校验。": "Необязательно. Проверка извлечённого ключа аффинити по regex; пустое поле — без проверки.", "可选。对请求路径进行匹配;不填表示匹配所有路径。": "Необязательно. Сопоставление пути запроса; пустое поле — совпадение со всеми путями.", "可选值": "Дополнительные значения", + "可选,公告的补充说明": "Необязательно, дополнительное описание объявления", + "可选,用于复现结果": "Необязательно, для воспроизводимых результатов", + "可选:基于用户信息 JSON 做组合条件准入,条件不满足时返回自定义提示": "Необязательно: Допуск на основе комбинированных условий из JSON пользовательской информации; при несоответствии условиям возвращается пользовательское сообщение", + "可选:用于自动生成端点或 Discovery URL": "Необязательно: Используется для автоматической генерации конечных точек или Discovery URL", + "合计:{{total}}": "Итого: {{total}}", + "合计:文字部分 {{textTotal}} + 音频部分 {{audioTotal}} = {{total}}": "Итого: текстовая часть {{textTotal}} + аудиочасть {{audioTotal}} = {{total}}", "同时重置消息": "Одновременно сбросить сообщения", "同步": "Синхронизация", "同步到渠道": "Sync to Channel", @@ -840,8 +898,12 @@ "名称+密钥": "Название+ключ", "名称不能为空": "Название не может быть пустым", "名称匹配类型": "Тип соответствия названия", + "后端固定倍率:{{ratio}}。该字段仅展示换算后的价格。": "Фиксированный backend-коэффициент: {{ratio}}. Это поле только показывает вычисленную цену.", "后端请求失败": "Запрос к бэкенду не удался", "后缀": "Суффикс", + "后:": "После:", + "向右展开": "Развернуть вправо", + "向左展开": "Развернуть влево", "否": "Нет", "启动": "Start", "启动参数 (Args)": "Startup Args", @@ -852,10 +914,10 @@ "启动部署失败": "Failed to start deployment", "启动配置": "Startup Configuration", "启用": "Включить", + "启用 Prompt 检查": "Включить проверку Prompt", "启用 io.net 部署": "Enable io.net Deployment", "启用 io.net 部署开关": "Enable io.net Deployment Switch", "启用 io.net 部署时必须填写 API Key": "API Key is required when enabling io.net deployment", - "启用 Prompt 检查": "Включить проверку Prompt", "启用2FA失败": "Не удалось включить 2FA", "启用Claude思考适配(-thinking后缀)": "Включить адаптацию мышления Claude (суффикс -thinking)", "启用FunctionCall思维签名填充": "Включить автозаполнение thoughtSignature для FunctionCall", @@ -911,14 +973,22 @@ "图标使用 react-icons(Simple Icons)或 URL/emoji,例如:github、gitlab、si:google": "Иконка: react-icons (Simple Icons) или URL/emoji, напр.: github, gitlab, si:google", "图标使用@lobehub/icons库,如:OpenAI、Claude.Color,支持链式参数:OpenAI.Avatar.type={'platform'}、OpenRouter.Avatar.shape={'square'},查询所有可用图标请 ": "Используйте библиотеку @lobehub/icons, например: OpenAI, Claude.Color, поддерживаются цепочечные параметры: OpenAI.Avatar.type={'platform'}, OpenRouter.Avatar.shape={'square'}, для просмотра всех доступных иконок, пожалуйста, ", "图混合": "Смешивание изображений", + "图片倍率 {{imageRatio}}": "Коэффициент изображения {{imageRatio}}", "图片功能在自定义请求体模式下不可用": "Функция изображений недоступна в режиме пользовательского запроса", "图片地址": "URL изображения", "图片已添加": "Изображение добавлено", "图片生成调用:{{symbol}}{{price}} / 1次": "Вызов генерации изображения: {{symbol}}{{price}} / 1 раз", + "图片生成:1 次 * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Генерация изображения: 1 вызов * цена за единицу {{price}} * {{ratioType}} {{ratio}} = {{amount}}", + "图片输入 {{price}} / 1M tokens": "Ввод изображения {{price}} / 1M tokens", "图片输入: {{imageRatio}}": "Ввод изображения: {{imageRatio}}", + "图片输入价格": "Цена входного изображения", + "图片输入价格 {{symbol}}{{price}} / 1M tokens": "Цена входного изображения {{symbol}}{{price}} / 1M tokens", "图片输入价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (图片倍率: {{imageRatio}})": "Цена ввода изображения: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M токенов (коэффициент изображения: {{imageRatio}})", + "图片输入价格:{{symbol}}{{price}} / 1M tokens": "Цена входного изображения: {{symbol}}{{price}} / 1M tokens", + "图片输入价格:{{symbol}}{{total}} / 1M tokens": "Цена входного изображения: {{symbol}}{{total}} / 1M tokens", "图片输入倍率(仅部分模型支持该计费)": "Коэффициент ввода изображения (только некоторые модели поддерживают эту тарификацию)", "图片输入相关的倍率设置,键为模型名称,值为倍率,仅部分模型支持该计费": "Настройки коэффициента, связанные с вводом изображения, ключ - название модели, значение - коэффициент, только некоторые модели поддерживают эту тарификацию", + "图片输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 图片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Ввод изображения: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * коэффициент изображения {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "图生文": "Изображение в текст", "图生视频": "Изображение в видео", "在Gotify服务器创建应用后获得的令牌,用于发送通知": "Токен, полученный после создания приложения на сервере Gotify, используется для отправки уведомлений", @@ -934,20 +1004,27 @@ "在此输入系统名称": "Введите здесь название системы", "在此输入隐私政策内容,支持 Markdown & HTML 代码": "Введите здесь содержимое политики конфиденциальности, поддерживается Markdown & HTML код", "在此输入首页内容,支持 Markdown & HTML 代码,设置后首页的状态信息将不再显示。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为首页": "Введите здесь содержание главной страницы, поддерживается код Markdown и HTML. После настройки информация о состоянии на главной странице больше не будет отображаться. Если введена ссылка, она будет использована как атрибут src для iframe, что позволяет установить любую веб-страницу как главную страницу", + "在默认列表基础上新增一个分组": "Add a new group to the default list", + "场景:站点提供两个价格档位,用户可以按需选择": "Scenario: site offers two pricing tiers, users can choose as needed", + "场景:站点有 standard 和 premium 两个用户可选分组。希望 vip 用户额外看到 exclusive 分组,同时不再看到 standard 分组": "Scenario: site has standard and premium as selectable groups. Want vip users to see exclusive but not standard", + "场景:站点有 standard(倍率 1.0)和 premium(倍率 0.5)两个分组,希望 vip 用户使用 standard 令牌时也能享受折扣": "Scenario: site has standard (ratio 1.0) and premium (ratio 0.5). Want vip users to get a discount on standard tokens too", + "场景:设置自动选择优先级": "Scenario: set auto-selection priority", "域名IP过滤详细说明": "Рекомендуется: при включении домены разрешаются через DNS, а полученные IP-адреса проверяются на принадлежность к частным диапазонам, что эффективно предотвращает атаки DNS rebinding, обходящие защиту SSRF. Примечание: домен может разрешаться в несколько адресов IPv4/IPv6. Если вы настроили список фильтрации IP, убедитесь, что он покрывает эти адреса, иначе доступ может быть нарушен.", "域名白名单": "Белый список доменов", "域名黑名单": "Чёрный список доменов", "基本信息": "Основная информация", + "基础价格": "Базовые цены", + "基础用户": "Basic user", "填充 Codex CLI / Claude CLI 模版": "Заполнить шаблон Codex CLI / Claude CLI", "填充新模板": "Заполнить новый шаблон", "填充旧模板": "Заполнить старый шаблон", "填充模板": "Заполнить шаблон", + "填充模板(全渠道)": "Заполнить шаблон (все каналы)", + "填充模板(指定渠道)": "Заполнить шаблон (выбранные каналы)", "填充模板:等级+激活": "Заполнить шаблон: Уровень + Активация", "填充模板:等级提示": "Заполнить шаблон: Промпт уровня", "填充模板:组织或角色": "Заполнить шаблон: Организация или роль", "填充模板:组织提示": "Заполнить шаблон: Промпт организации", - "填充模板(全渠道)": "Заполнить шаблон (все каналы)", - "填充模板(指定渠道)": "Заполнить шаблон (выбранные каналы)", "填入": "Заполнить", "填入 CC Switch": "Заполнить CC Switch", "填入所有模型": "Заполнить все модели", @@ -964,6 +1041,7 @@ "填写带https的域名,逗号分隔": "Введите домены с https, разделённые запятыми", "填写用户协议内容后,用户注册时将被要求勾选已阅读用户协议": "После заполнения содержимого пользовательского соглашения, пользователям потребуется отметить, что они прочитали пользовательское соглашение при регистрации", "填写隐私政策内容后,用户注册时将被要求勾选已阅读隐私政策": "После заполнения содержимого политики конфиденциальности, пользователям потребуется отметить, что они прочитали политику конфиденциальности при регистрации", + "填写音频补全价格前,需要先填写音频输入价格。": "Перед указанием цены аудио-завершения сначала задайте цену аудио-ввода.", "处理中": "Processing", "备份支持": "Поддержка резервного копирования", "备份状态": "Состояние резервного копирования", @@ -979,6 +1057,7 @@ "复制失败": "Не удалось скопировать", "复制失败,请手动复制": "Не удалось скопировать, пожалуйста, скопируйте вручную", "复制失败,请手动选择文本复制": "Copy failed, please manually select and copy the text", + "复制密钥": "Копировать ключ", "复制已选": "Копировать выбранное", "复制应用的令牌(Token)并填写到上方的应用令牌字段": "Скопируйте токен приложения и вставьте в поле токена приложения выше", "复制成功": "Скопировано успешно", @@ -991,6 +1070,7 @@ "复制渠道的所有信息": "Копировать всю информацию о канале", "复制版本号": "Copy Version", "复制生成的密钥并粘贴到此处": "Copy the generated key and paste it here", + "复制连接信息": "Копировать данные подключения", "复制链接": "Скопировать ссылку", "外接设备": "Внешнее устройство", "多个命令用空格分隔": "Multiple commands separated by spaces", @@ -1004,7 +1084,6 @@ "失败原因": "Причина ошибки", "失败后不重试": "Не повторять после ошибки", "失败后是否重试": "Повторить при ошибке", - "不重试": "Не повторять", "失败时自动禁用通道": "Автоматически отключать канал при неудаче", "失败重试次数": "Количество повторных попыток при неудаче", "奖励说明": "Описание награды", @@ -1014,13 +1093,13 @@ "套餐标题": "Название плана", "套餐标题不能为空": "Название тарифа не может быть пустым", "套餐的基本信息和定价": "Основная информация и цена плана", - "如:大带宽批量分析图片推荐": "Например: рекомендуется для пакетного анализа изображений с большой пропускной способностью", - "如:香港线路": "Например: Гонконгская линия", "如果亲和到的渠道失败,重试到其他渠道成功后,将亲和更新到成功的渠道。": "Если канал аффинити не сработал, после успешного повтора на другом канале аффинити будет обновлена на успешный канал.", "如果你对接的是上游One API或者New API等转发项目,请使用OpenAI类型,不要使用此类型,除非你知道你在做什么。": "Если вы интегрируетесь с восходящими проектами пересылки, такими как One API или New API, используйте тип OpenAI, не используйте этот тип, если вы не знаете, что делаете.", "如果用户请求中包含系统提示词,则使用此设置拼接到用户的系统提示词前面": "Если запрос пользователя содержит системный промпт, используйте эту настройку для добавления перед системным промптом пользователя", "如果镜像为私有,请填写密码或Token": "If the image is private, please fill in the password or token", "如果镜像为私有,请填写用户名": "If the image is private, please fill in the username", + "如:大带宽批量分析图片推荐": "Например: рекомендуется для пакетного анализа изображений с большой пропускной способностью", + "如:香港线路": "Например: Гонконгская линия", "始终使用浅色主题": "Всегда использовать светлую тему", "始终使用深色主题": "Всегда использовать темную тему", "字段映射": "Сопоставление полей", @@ -1029,6 +1108,7 @@ "字段透传控制": "Управление прозрачной передачей полей", "字段速查": "Быстрый поиск полей", "存在惩罚,鼓励讨论新话题": "Штраф за присутствие, поощряет новые темы", + "存在重复的分组名称:": "Duplicate group names: ", "存在重复的键名:": "Обнаружены повторяющиеся имена ключей:", "安全提醒": "Напоминание о безопасности", "安全设置": "Настройки безопасности", @@ -1040,6 +1120,7 @@ "完成硬件类型、部署位置、副本数量等配置后,将自动计算价格": "Price will be automatically calculated after completing hardware type, deployment location, number of replicas and other configurations", "完成设置并启用两步验证": "Завершить настройки и включить двухфакторную аутентификацию", "完成进度": "Completion Progress", + "完整流程:": "Full workflow:", "完整的 Base URL,支持变量{model}": "Полный Base URL, поддерживает переменную {model}", "官方": "Официальный", "官方文档": "Официальная документация", @@ -1052,6 +1133,7 @@ "实付金额": "Фактически оплаченная сумма", "实付金额:": "Фактически оплаченная сумма:", "实际模型": "Фактическая модель", + "实际结算金额:{{symbol}}{{total}}(已包含分组价格调整)": "Фактическое списание: {{symbol}}{{total}} (включая групповую ценовую корректировку)", "实际请求体": "Фактическое тело запроса", "容器": "Container", "容器ID": "Container ID", @@ -1085,7 +1167,6 @@ "密钥": "Ключ", "密钥 JSON 必须包含 access_token": "JSON ключа должен содержать access_token", "密钥 JSON 必须包含 account_id": "JSON ключа должен содержать account_id", - "密钥(编辑模式下,保存的密钥不会显示)": "Токен (в режиме редактирования сохраненные токены не отображаются)", "密钥去重": "Удаление дубликатов ключей", "密钥将以Bearer方式添加到请求头中,用于验证webhook请求的合法性": "Ключ будет добавлен в заголовок запроса методом Bearer для проверки легитимности webhook-запросов", "密钥已删除": "Ключ удален", @@ -1103,10 +1184,12 @@ "密钥获取成功": "Ключ успешно получен", "密钥输入方式": "Способ ввода ключа", "密钥预览": "Предпросмотр ключа", + "密钥(编辑模式下,保存的密钥不会显示)": "Токен (в режиме редактирования сохраненные токены не отображаются)", "对于官方渠道,new-api已经内置地址,除非是第三方代理站点或者Azure的特殊接入地址,否则不需要填写": "Для официальных каналов new-api уже имеет встроенные адреса, если это не сторонние прокси-сайты или специальные адреса доступа Azure, заполнять не нужно", "对免费模型启用预消耗": "Включить предварительное списание для бесплатных моделей", "对域名启用 IP 过滤(推荐开启)": "Включить IP-фильтрацию для доменов (рекомендуется)", "对外运营模式": "Режим внешней эксплуатации", + "对比:不勾选「用户可选」的场景": "Comparison: groups without \"User Selectable\"", "对象清理规则": "Правила очистки объектов", "导入": "Импорт", "导入的配置将覆盖当前设置,是否继续?": "Импортируемая конфигурация перезапишет текущие настройки, продолжить?", @@ -1120,11 +1203,12 @@ "将为选中的 ": "Будет выбрано ", "将仅保留第一个密钥文件,其余文件将被移除,是否继续?": "Будет сохранен только первый файл ключей, остальные файлы будут удалены, продолжить?", "将删除": "Будет удалено", + "将删除 {{value}} 天前的日志文件。": "Файлы журналов старше {{value}} дней будут удалены.", "将删除已使用、已禁用及过期的兑换码,此操作不可撤销。": "Будут удалены использованные, отключенные и просроченные коды обмена, эта операция необратима.", "将删除所有仍在内存中的渠道亲和性缓存条目。": "Будут удалены все записи кэша аффинити каналов, оставшиеся в памяти.", - "将删除 {{value}} 天前的日志文件。": "Файлы журналов старше {{value}} дней будут удалены.", "将只保留最近 {{value}} 个日志文件,其余将被删除。": "Будут сохранены только последние {{value}} файлов журналов; остальные будут удалены.", "将大请求体临时存储到磁盘": "Временное сохранение больших тел запросов на диск", + "将把当前编辑中的模型 {{name}} 的价格配置,批量应用到已勾选的 {{count}} 个模型。": "Ценовая конфигурация редактируемой модели {{name}} будет применена к {{count}} выбранным моделям.", "将清除所有保存的配置并恢复默认设置,此操作不可撤销。是否继续?": "Будут очищены все сохраненные конфигурации и восстановлены настройки по умолчанию, эта операция необратима. Продолжить?", "将清除选定时间之前的所有日志": "Будут очищены все логи до выбранного времени", "将追加 2 条规则到现有规则列表。": "2 правила будут добавлены к существующему списку правил.", @@ -1137,12 +1221,13 @@ "展开": "Развернуть", "展开更多": "Развернуть больше", "展示价格": "Отображаемая цена", + "嵌套映射:用户分组 → 使用分组 → 倍率": "Nested mapping: user group → using group → ratio", "左侧边栏个人设置": "Персональные настройки левой боковой панели", - "已为 {{count}} 个模型设置{{type}}_one": "Установлено {{type}} для {{count}} модели", + "已为 ${count} 个渠道设置标签!": "Установлены метки для ${count} каналов!", "已为 {{count}} 个模型设置{{type}}_few": "Установлено {{type}} для {{count}} моделей", "已为 {{count}} 个模型设置{{type}}_many": "Установлено {{type}} для {{count}} моделей", + "已为 {{count}} 个模型设置{{type}}_one": "Установлено {{type}} для {{count}} модели", "已为 {{count}} 个模型设置{{type}}_other": "Установлено {{type}} для {{count}} моделей", - "已为 ${count} 个渠道设置标签!": "Установлены метки для ${count} каналов!", "已从 Discovery 自动填充配置": "Конфигурация автозаполнена из Discovery", "已从 Discovery 获取配置,可继续手动修改所有字段。": "Конфигурация получена из Discovery. Все поля можно продолжить редактировать вручную.", "已作废": "Аннулировано", @@ -1157,18 +1242,20 @@ "已切换至最优倍率视图,每个模型使用其最低倍率分组": "Переключено на оптимальный вид множителей, каждая модель использует свою группу с минимальным множителем", "已初始化": "Инициализировано", "已删除": "Удалено", + "已删除 ${data} 个通道!": "Удалено ${data} каналов!", "已删除 {{count}} 个令牌!": "Удалено {{count}} токенов!", - "已删除 {{count}} 个令牌!_one": "Удалён {{count}} токен!", "已删除 {{count}} 个令牌!_few": "Удалено {{count}} токена!", "已删除 {{count}} 个令牌!_many": "Удалено {{count}} токенов!", + "已删除 {{count}} 个令牌!_one": "Удалён {{count}} токен!", "已删除 {{count}} 个令牌!_other": "Удалено {{count}} токенов!", - "已删除 {{count}} 条失效兑换码_one": "Удален {{count}} недействительный код купона", "已删除 {{count}} 条失效兑换码_few": "Удалено {{count}} недействительных кода купона", "已删除 {{count}} 条失效兑换码_many": "Удалено {{count}} недействительных кодов купонов", + "已删除 {{count}} 条失效兑换码_one": "Удален {{count}} недействительный код купона", "已删除 {{count}} 条失效兑换码_other": "Удалено {{count}} недействительных кодов купонов", - "已删除 ${data} 个通道!": "Удалено ${data} каналов!", "已删除所有禁用渠道,共计 ${data} 个": "Удалены все отключенные каналы, всего ${data}", "已删除消息及其回复": "Сообщение и его ответы удалены", + "已勾选": "Выбрано", + "已勾选 {{count}} 个模型": "Выбрано моделей: {{count}}", "已发起支付": "Оплата инициирована", "已发送到 Fluent": "Отправлено в Fluent", "已取消 Passkey 注册": "Регистрация Passkey отменена", @@ -1184,8 +1271,6 @@ "已复制": "Скопировано", "已复制 ${count} 个模型": "Скопировано ${count} моделей", "已复制 ID 到剪贴板": "ID copied to clipboard", - "已复制:": "Скопировано: ", - "已复制:{{name}}": "Скопировано: {{name}}", "已复制全部数据": "Все данные скопированы", "已复制到剪切板": "Скопировано в буфер обмена", "已复制到剪贴板": "Скопировано в буфер обмена", @@ -1194,16 +1279,19 @@ "已复制模型名称": "Название модели скопировано", "已复制版本号": "Version copied", "已复制自动生成的 API Key": "Auto-generated API Key copied", + "已复制:": "Скопировано: ", + "已复制:{{name}}": "Скопировано: {{name}}", "已完成": "Completed", + "已将模型 {{name}} 的价格配置批量应用到 {{count}} 个模型": "Ценовая конфигурация модели {{name}} массово применена к {{count}} моделям", "已开启全局请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "Глобальная сквозная передача запросов включена. Встроенные возможности NewAPI, такие как переопределение параметров, перенаправление моделей и адаптация канала, будут отключены. Это не является лучшей практикой. Если из-за этого возникнут проблемы, пожалуйста, не создавайте issue.", "已成功开始测试所有已启用通道,请刷新页面查看结果。": "Успешно начато тестирование всех включенных каналов, обновите страницу для просмотра результатов.", "已打开授权页面": "Страница авторизации открыта", "已打开支付页面": "Страница оплаты открыта", "已提交": "Отправлено", "已支付金额": "Amount Paid", - "已新增 {{count}} 个模型:{{list}}_one": "Добавлена {{count}} модель: {{list}}", "已新增 {{count}} 个模型:{{list}}_few": "Добавлено {{count}} модели: {{list}}", "已新增 {{count}} 个模型:{{list}}_many": "Добавлено {{count}} моделей: {{list}}", + "已新增 {{count}} 个模型:{{list}}_one": "Добавлена {{count}} модель: {{list}}", "已新增 {{count}} 个模型:{{list}}_other": "Добавлено {{count}} моделей: {{list}}", "已更新完毕所有已启用通道余额!": "Балансы всех включенных каналов обновлены!", "已有保存的配置": "Сохраненные конфигурации уже существуют", @@ -1213,14 +1301,14 @@ "已服务": "Served", "已注销": "Выход выполнен", "已添加": "Добавлено", - "已添加 {{count}} 个模板_one": "Добавлен {{count}} шаблон", "已添加 {{count}} 个模板_few": "Добавлено {{count}} шаблона", "已添加 {{count}} 个模板_many": "Добавлено {{count}} шаблонов", + "已添加 {{count}} 个模板_one": "Добавлен {{count}} шаблон", "已添加 {{count}} 个模板_other": "Добавлено {{count}} шаблонов", "已添加到白名单": "Добавлено в белый список", + "已清理 {{count}} 个日志文件,释放 {{size}}": "Очищено {{count}} файлов журналов, освобождено {{size}}", "已清空": "Очищено", "已清空测试结果": "Результаты тестов очищены", - "已清理 {{count}} 个日志文件,释放 {{size}}": "Очищено {{count}} файлов журналов, освобождено {{size}}", "已生成授权凭据": "Учётные данные авторизации сгенерированы", "已用": "Used", "已用/剩余": "Использовано/Осталось", @@ -1237,12 +1325,12 @@ "已达到购买上限": "Достигнут лимит покупок", "已过期": "Просрочено", "已运行时间": "Uptime", - "已选择 {{count}} 个模型_one": "Выбрана {{count}} модель", + "已选择 ${count} 个渠道": "Выбрано ${count} каналов", "已选择 {{count}} 个模型_few": "Выбрано {{count}} модели", "已选择 {{count}} 个模型_many": "Выбрано {{count}} моделей", + "已选择 {{count}} 个模型_one": "Выбрана {{count}} модель", "已选择 {{count}} 个模型_other": "Выбрано {{count}} моделей", "已选择 {{selected}} / {{total}}": "Выбрано {{selected}} / {{total}}", - "已选择 ${count} 个渠道": "Выбрано ${count} каналов", "已重置为默认配置": "Сброшено на конфигурацию по умолчанию", "已销毁": "Destroyed", "币种": "Валюта", @@ -1264,15 +1352,19 @@ "延长容器时长将会产生额外费用,请确认您有足够的账户余额。": "Extending container duration will incur additional charges, please ensure you have sufficient account balance.", "延长操作一旦确认无法撤销,费用将立即扣除。": "Once confirmed, the extension operation cannot be undone, and charges will be deducted immediately.", "延长时长": "Extension Duration", - "延长时长(小时)": "Extension Duration (hours)", "延长时长不能超过720小时(30天)": "Extension duration cannot exceed 720 hours (30 days)", "延长时长失败": "Failed to extend duration", "延长时长至少为1小时": "Extension duration must be at least 1 hour", + "延长时长(小时)": "Extension Duration (hours)", "建立连接时发生错误": "Ошибка при установке соединения", "建议在生产环境中使用 MySQL 或 PostgreSQL 数据库,或确保 SQLite 数据库文件已映射到宿主机的持久化存储。": "Рекомендуется использовать базы данных MySQL или PostgreSQL в производственной среде, или убедиться, что файл базы данных SQLite сопоставлен с постоянным хранилищем хоста.", "开": "Вкл", + "开启「默认使用 auto 分组」后,新建令牌和初始令牌都会自动设为 auto。": "After enabling \"Default to auto group\", new tokens and initial tokens will be set to auto.", "开启之后会清除用户提示词中的": "После включения будет очищено в промптах пользователя:", "开启之后将上游地址替换为服务器地址": "После включения адреса восходящих каналов будут заменены на адрес сервера", + "开启后不限制:必须设置模型倍率": "После включения без ограничений: необходимо установить множители моделей", + "开启后创建令牌默认选择auto分组,初始令牌也将设为auto": "When enabled, new tokens default to auto group, initial tokens are also set to auto", + "开启后未登录用户无法访问模型广场": "После включения незарегистрированные пользователи не смогут получить доступ к площади моделей", "开启后,using_group 会参与 cache key(不同分组隔离)。": "При включении using_group будет частью ключа кэша (изоляция по группам).", "开启后,仅\"消费\"和\"错误\"日志将记录您的客户端IP地址": "После включения, только логи \"потребление\" и \"ошибки\" будут записывать IP-адрес вашего клиента", "开启后,对免费模型(倍率为0,或者价格为0)的模型也会预消耗额度": "После включения бесплатные модели (коэффициент 0 или цена 0) тоже будут предварительно расходовать квоту", @@ -1283,8 +1375,6 @@ "开启后,规则名称会参与 cache key(不同规则隔离)。": "При включении имя правила будет частью ключа кэша (изоляция по правилам).", "开启后,该渠道请求 Claude 时将强制追加 ?beta=true(无需客户端手动传参)": "При включении запросы к Claude через этот канал будут принудительно дополнены ?beta=true (клиенту не нужно передавать этот параметр вручную)", "开启后,违规请求将额外扣费。": "При включении за нарушающие запросы будет взиматься дополнительная плата.", - "开启后不限制:必须设置模型倍率": "После включения без ограничений: необходимо установить множители моделей", - "开启后未登录用户无法访问模型广场": "После включения незарегистрированные пользователи не смогут получить доступ к площади моделей", "开启批量操作": "Включить пакетные операции", "开始": "Начало", "开始同步": "Начать синхронизацию", @@ -1298,6 +1388,7 @@ "强制要求": "Обязательное требование", "强变换": "Сильное преобразование", "当上游通道返回错误中包含这些关键词时(不区分大小写),自动禁用通道": "Автоматически отключать канал, когда в ошибке от восходящего канала содержатся эти ключевые слова (без учета регистра)", + "当令牌分组设为 auto 时,系统按列表顺序依次选择可用分组。排在前面的优先级更高。": "When token group is set to auto, the system selects groups in list order. Groups listed first have higher priority.", "当前 API 密钥已过期,请在设置中更新。": "Current API key has expired, please update it in settings.", "当前 Ollama 版本为 ${version}": "Current Ollama version is ${version}", "当前仅 OpenAI / Claude 语义支持缓存 token 统计,其他通道将隐藏 token 相关字段。": "В настоящее время только семантика OpenAI / Claude поддерживает статистику кэшированных токенов. Другие каналы скроют поля, связанные с токенами.", @@ -1307,15 +1398,21 @@ "当前分组为 auto,会自动选择最优分组,当一个组不可用时自动降级到下一个组(熔断机制)": "Текущая группа - auto, автоматически выбирается оптимальная группа, когда одна группа недоступна, автоматически переключается на следующую (механизм предохранителя)", "当前剩余": "Currently Remaining", "当前参数覆盖不是合法的 JSON": "Текущее переопределение параметров не является допустимым JSON", + "当前提示": "Текущие подсказки", "当前旧格式 JSON 不合法,无法追加模板": "Текущий JSON устаревшего формата недопустим, невозможно добавить шаблон", "当前旧格式不是 JSON 对象,无法追加模板": "Текущий устаревший формат не является JSON-объектом, невозможно добавить шаблон", "当前时间": "Текущее время", + "当前未启用,需要时再打开即可。": "Это поле сейчас отключено. Включите его при необходимости.", "当前未开启Midjourney回调,部分项目可能无法获得绘图结果,可在运营设置中开启。": "В настоящее время обратный вызов Midjourney отключен, некоторые проекты могут не получить результаты рисования, можно включить в настройках эксплуатации.", "当前查看的分组为:{{group}},倍率为:{{ratio}}": "Текущая просматриваемая группа: {{group}}, коэффициент: {{ratio}}", "当前模型列表为该标签下所有渠道模型列表最长的一个,并非所有渠道的并集,请注意可能导致某些渠道模型丢失。": "Текущий список моделей является самым длинным списком моделей всех каналов под этой меткой, а не объединением всех каналов, обратите внимание, что это может привести к потере моделей некоторых каналов.", + "当前模型同时存在按次价格和倍率配置,保存时会按当前计费方式覆盖。": "У этой модели одновременно задана цена за запрос и конфигурация коэффициентов. При сохранении данные будут перезаписаны согласно текущему режиму тарификации.", + "当前模型存在未显式设置输入倍率的扩展倍率;填写输入价格后会自动换算为价格字段。": "У этой модели есть дополнительные коэффициенты без явно заданного входного коэффициента; после ввода входной цены они будут автоматически преобразованы в ценовые поля.", + "当前没有未设置定价的模型": "Сейчас нет моделей без цены", "当前版本": "Текущая версия", "当前状态": "Current Status", "当前缓存大小": "Текущий размер кэша", + "当前编辑": "Текущее редактирование", "当前规则不支持写入到该位置": "Текущее правило не поддерживает запись в это расположение", "当前规则未设置参数覆盖模板": "У текущего правила не задан шаблон переопределения параметров", "当前计费": "Текущая тарификация", @@ -1323,6 +1420,7 @@ "当前设置类型: ": "Текущий тип настроек: ", "当前跟随系统": "Следовать системе", "当前配置无法连接到 io.net。": "Unable to connect to io.net with current configuration.", + "当某个分组的用户使用另一个分组的令牌时,可设置特殊倍率覆盖基础倍率。例如:vip 分组的用户使用 default 分组时倍率为 0.5": "When a user in one group uses a token from another group, a special ratio can override the base ratio. E.g., vip users using default group get ratio 0.5", "当模型没有设置价格时仍接受调用,仅当您信任该网站时使用,可能会产生高额费用": "Принимать вызовы моделей без установленной цены, использовать только если вы доверяете сайту, могут возникнуть высокие расходы", "当运行通道全部测试时,超过此时间将自动禁用通道": "При тестировании всех работающих каналов, превышение этого времени автоматически отключит канал", "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知": "Когда оставшаяся квота кошелька или подписки ниже этого значения, система отправит уведомление выбранным способом", @@ -1339,6 +1437,7 @@ "忘记密码?": "Забыли пароль?", "快速开始": "Быстрый старт", "快速选择": "Quick Select", + "忽略": "Игнорировать", "思考中...": "Размышляю...", "思考内容转换": "Преобразование содержимого размышлений", "思考过程": "Процесс размышлений", @@ -1378,6 +1477,7 @@ "或手动输入密钥:": "или введите ключ вручную: ", "所有上游数据均可信": "Все восходящие данные доверенные", "所有密钥已复制到剪贴板": "Все ключи скопированы в буфер обмена", + "所有用户": "All users", "所有编辑均为覆盖操作,留空则不更改": "Все редактирования являются операциями перезаписи, если оставить поле пустым, изменения не будут применены", "所选模板已存在": "Выбранный шаблон уже существует", "手动禁用": "Отключить вручную", @@ -1389,6 +1489,7 @@ "扣费": "Списание", "执行 GC": "Выполнить GC", "执行中": "Выполняется", + "扩展价格": "Дополнительные цены", "扫描二维码": "Сканировать QR-код", "批量创建": "Пакетное создание", "批量创建时会在名称后自动添加随机后缀": "При пакетном создании к имени автоматически добавляется случайный суффикс", @@ -1398,6 +1499,7 @@ "批量删除失败": "Пакетное удаление не удалось", "批量删除成功": "Batch deletion successful", "批量删除模型": "Пакетное удаление моделей", + "批量应用当前模型价格": "Массово применить цену текущей модели", "批量操作": "Пакетные операции", "批量操作失败": "Batch operation failed", "批量操作完成: {{success}}个成功, {{failed}}个失败": "Batch operation completed: {{success}} succeeded, {{failed}} failed", @@ -1421,13 +1523,17 @@ "按倍率类型筛选": "Фильтровать по типу коэффициента", "按倍率设置": "Настроить по множителю", "按次": "За запрос", + "按次 {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "За запрос {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "按次计费": "Оплата за запрос", + "按次:{{symbol}}{{price}}": "За запрос: {{symbol}}{{price}}", + "按次:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "За запрос: {{symbol}}{{price}} * {{ratioType}}: {{ratio}} = {{symbol}}{{total}}", "按照如下格式输入:AccessKey|SecretAccessKey|Region": "Введите в формате: AccessKey|SecretAccessKey|Region", "按量计费": "Оплата по объему", + "按量计费下需要先填写输入价格,才能保存其它价格项。": "При тарификации по объему сначала нужно указать входную цену, чтобы сохранить остальные ценовые поля.", "按顺序替换content中的变量占位符": "Последовательно заменять переменные-заполнители в content", "换脸": "Замена лица", - "授权,需在遵守": "Авторизация, необходимо соблюдать", "授权失败": "Авторизация не удалась", + "授权,需在遵守": "Авторизация, необходимо соблюдать", "排序": "Порядок", "排队中": "В очереди", "接受未设置价格模型": "Принимать модели без установленной цены", @@ -1438,8 +1544,8 @@ "控制输出的随机性和创造性": "Управляет случайностью и креативностью вывода", "控制顶栏模块显示状态,全局生效": "Управление состоянием отображения модулей верхней панели, действует глобально", "推荐": "Рекомендуется", - "推荐:用户可以选择是否使用指纹等验证": "Рекомендуется: пользователи могут выбирать, использовать ли проверку по отпечатку пальца и другие методы", "推荐使用(用户可选)": "Рекомендуется использовать (по выбору пользователя)", + "推荐:用户可以选择是否使用指纹等验证": "Рекомендуется: пользователи могут выбирать, использовать ли проверку по отпечатку пальца и другие методы", "描述": "Описание", "提交": "Отправить", "提交时间": "Время отправки", @@ -1449,13 +1555,14 @@ "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "Промпт {{input}} токенов / 1M токенов * {{symbol}}{{price}}", "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Ввод {{input}} токенов / 1M токенов * {{symbol}}{{price}} + Вывод {{completion}} токенов / 1M токенов * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 缓存创建 {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Ввод {{nonCacheInput}} токенов / 1M токенов * {{symbol}}{{price}} + Кэш {{cacheInput}} токенов / 1M токенов * {{symbol}}{{cachePrice}} + Создание кэша {{cacheCreationInput}} токенов / 1M токенов * {{symbol}}{{cacheCreationPrice}} + Вывод {{completion}} токенов / 1M токенов * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "提示价格:{{symbol}}{{price}} / 1M tokens": "Цена промпта: {{symbol}}{{price}} / 1M токенов", + "提示缓存倍率": "Коэффициент кэша промптов", "提示:如需备份数据,只需复制上述目录即可": "Промпт: для резервного копирования данных просто скопируйте указанный выше каталог", "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。": "Примечание: эта настройка влияет только на отображение моделей в «Маркетплейсе моделей» и не влияет на фактический вызов или маршрутизацию. Чтобы настроить реальное поведение вызовов, перейдите в «Управление каналами».", + "提示:端点映射仅用于模型广场展示,不会影响模型真实调用。如需配置真实调用,请前往「渠道管理」。": "Примечание: сопоставление эндпоинтов используется только для отображения в «Маркетплейсе моделей» и не влияет на реальный вызов. Чтобы настроить реальное поведение вызовов, перейдите в «Управление каналами».", "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。": "Примечание: это бета-функция. Структура конфигурации и поведение могут измениться в будущем. Не используйте в продакшене.", "提示:语言偏好会同步到您登录的所有设备,并影响API返回的错误消息语言。": "Подсказка: Языковые настройки синхронизируются на всех ваших устройствах и влияют на язык сообщений об ошибках API.", "提示:链接中的{key}将被替换为API密钥,{address}将被替换为服务器地址": "Промпт: {key} в ссылке будет заменен на API-ключ, {address} будет заменен на адрес сервера", - "提示价格:{{symbol}}{{price}} / 1M tokens": "Цена промпта: {{symbol}}{{price}} / 1M токенов", - "提示缓存倍率": "Коэффициент кэша промптов", "搜索供应商": "Поиск поставщиков", "搜索关键字": "Поиск по ключевым словам", "搜索失败": "Search failed", @@ -1484,6 +1591,8 @@ "支付失败": "Оплата не удалась", "支付宝": "Alipay", "支付方式": "Способ оплаты", + "支付方式名称": "Название метода оплаты", + "支付方式类型": "Тип метода оплаты", "支付渠道": "Платежные каналы", "支付设置": "Настройки оплаты", "支付请求失败": "Запрос на оплату не удался", @@ -1509,8 +1618,6 @@ "收益统计": "Статистика доходов", "收起": "Свернуть", "收起侧边栏": "Свернуть боковую панель", - "向左展开": "Развернуть влево", - "向右展开": "Развернуть вправо", "收起内容": "Свернуть содержимое", "放大": "Увеличить", "放大编辑": "Увеличить и редактировать", @@ -1529,14 +1636,19 @@ "数据管理和日志查看": "Управление данными и просмотр журналов", "文件上传": "Загрузка файла", "文件搜索价格:{{symbol}}{{price}} / 1K 次": "Цена поиска файлов: {{symbol}}{{price}} / 1K запросов", + "文件搜索调用 {{fileSearchCallCount}} 次": "Поиск файлов вызван {{fileSearchCallCount}} раз", + "文件搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Поиск файлов: {{count}} / 1K * цена за единицу {{price}} * {{ratioType}} {{ratio}} = {{amount}}", "文字提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 文字补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} = {{symbol}}{{total}}": "Текстовый ввод {{input}} токенов / 1M токенов * {{symbol}}{{price}} + Текстовый вывод {{completion}} токенов / 1M токенов * {{symbol}}{{compPrice}} = {{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}}": "Текстовый промпт {{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}}", "文字提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 文字补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} = {{symbol}}{{total}}": "Текстовый ввод {{nonCacheInput}} токенов / 1M токенов * {{symbol}}{{price}} + Кэш {{cacheInput}} токенов / 1M токенов * {{symbol}}{{cachePrice}} + Текстовый вывод {{completion}} токенов / 1M токенов * {{symbol}}{{compPrice}} = {{symbol}}{{total}}", "文字输入": "Текстовый ввод", "文字输出": "Текстовый вывод", + "文字输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Текстовый вывод: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * коэффициент завершения {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "文心一言": "Wenxin Yiyan", "文档": "Документация", "文档地址": "Адрес документации", "文生视频": "Текст в видео", + "新增": "added", "新增 Key 来源": "Добавить источник ключа", "新增供应商": "Добавить поставщика", "新增失败": "Не удалось добавить", @@ -1552,9 +1664,9 @@ "新建容器部署": "Create Container Deployment", "新建数量": "Количество для создания", "新建组": "Создать группу", + "新格式模板": "Шаблон нового формата", "新格式(支持条件判断与json自定义):": "Новый формат (поддерживает условные суждения и пользовательскую настройку json):", "新格式(规则 + 条件)": "Новый формат (Правила + Условия)", - "新格式模板": "Шаблон нового формата", "新版本": "Новая версия", "新用户使用邀请码奖励额度": "Квота вознаграждения для новых пользователей, использующих приглашение", "新用户初始额度": "Начальная квота для новых пользователей", @@ -1571,6 +1683,7 @@ "无法复制到剪贴板,请手动复制": "Не удалось скопировать в буфер обмена, пожалуйста, скопируйте вручную", "无法添加图片": "Невозможно добавить изображение", "无法获取容器详情": "Unable to get container details", + "无法读取剪贴板": "Не удалось прочитать буфер обмена", "无法连接 io.net": "Unable to connect to io.net", "无生效": "Нет активных", "无邀请人": "Нет приглашающего", @@ -1581,19 +1694,19 @@ "日志已下载": "Logs downloaded", "日志已加载": "Logs loaded", "日志已复制到剪贴板": "Logs copied to clipboard", + "日志总大小": "Общий размер журналов", + "日志文件数": "Количество файлов журналов", + "日志时间范围": "Диапазон дат журналов", "日志流": "Log Stream", "日志清理失败:": "Очистка журнала не удалась: ", + "日志目录": "Каталог журналов", "日志类型": "Тип журнала", "日志设置": "Настройки журнала", "日志详情": "Детали журнала", - "日志目录": "Каталог журналов", - "日志文件数": "Количество файлов журналов", - "日志时间范围": "Диапазон дат журналов", - "日志总大小": "Общий размер журналов", - "旧格式(JSON 对象)": "Устаревший формат (JSON-объект)", - "旧格式(直接覆盖):": "Старый формат (прямая перезапись):", "旧格式必须是 JSON 对象": "Устаревший формат должен быть JSON-объектом", "旧格式模板": "Шаблон старого формата", + "旧格式(JSON 对象)": "Устаревший формат (JSON-объект)", + "旧格式(直接覆盖):": "Старый формат (прямая перезапись):", "旧的备用码已失效,请保存新的备用码": "Старые резервные коды больше не действительны, пожалуйста, сохраните новые резервные коды", "早上好": "Доброе утро", "时间": "Время", @@ -1610,18 +1723,19 @@ "是否自动禁用": "Автоматически отключать", "是否要求指纹/面容等生物识别": "Требовать биометрическую аутентификацию (отпечаток пальца/лицо и т.д.)", "显示倍率": "Отображать коэффициент", - "显示最新20条": "Отображать последние 20 записей", "显示名称": "Отображаемое имя", "显示名称字段(可选)": "Поле отображаемого имени (необязательно)", "显示完整内容": "Отображать полное содержимое", "显示操作项": "Отображать элементы операций", "显示更多": "Отображать больше", + "显示最新20条": "Отображать последние 20 записей", "显示第": "Отображать", "显示设置": "Настройки отображения", "显示调试": "Отображать отладку", "晚上好": "Добрый вечер", "普通环境变量": "Regular Environment Variables", "普通用户": "Обычный пользователь", + "普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Обычный ввод: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "智能体ID": "ID интеллектуального агента", "智能熔断": "Интеллектуальный предохранитель", "智谱": "Zhipu", @@ -1633,6 +1747,7 @@ "暂无保存的配置": "Нет сохраненных конфигураций", "暂无充值记录": "Нет записей о пополнении", "暂无公告": "Нет объявлений", + "暂无分组,点击下方按钮添加": "No groups yet. Click the button below to add one.", "暂无匹配模型": "Нет соответствующих моделей", "暂无可复制 JSON": "Нет доступного JSON для копирования", "暂无可复制的版本信息": "No version information to copy", @@ -1659,7 +1774,9 @@ "暂无监控数据": "Нет данных мониторинга", "暂无系统公告": "Нет системных объявлений", "暂无缺失模型": "Нет отсутствующих моделей", + "暂无自动分组,点击下方按钮添加": "No auto groups yet. Click the button below to add one.", "暂无自定义 OAuth 提供商": "Нет пользовательских OAuth-провайдеров", + "暂无规则,点击下方按钮添加": "No rules yet. Click the button below to add one.", "暂无订阅套餐": "Нет тарифных планов", "暂无订阅记录": "Нет записей подписок", "暂无请求数据": "Нет данных запросов", @@ -1695,8 +1812,21 @@ "更新配置后,容器可能需要重启以应用新的设置。请确保您了解这些更改的影响。": "After updating the configuration, the container may need to restart to apply the new settings. Please ensure you understand the impact of these changes.", "更新配置失败": "Failed to update configuration", "更新预填组": "Обновить предварительно заполненную группу", + "最低": "Минимум", + "最低充值美元数量": "Минимальная сумма пополнения в долларах", + "最后使用时间": "Время последнего использования", + "最后更新": "Last Updated", + "最后请求": "Последний запрос", + "最大GPU数量": "Max Number of GPUs", + "最大可用": "Max Available", + "最大条目数": "Макс. кол-во записей", + "最终抵扣": "Итоговое списание", + "最近一次": "Последний", + "最近事件": "Recent Events", + "最高优先级": "highest priority", "月": "мес.", "有 Reasoning": "Есть рассуждение", + "有序字符串数组": "Ordered string array", "有效期": "Срок действия", "有效期单位": "Единица срока", "有效期数值": "Значение срока", @@ -1739,8 +1869,9 @@ "未绑定": "Не привязано", "未获取到授权码": "Код авторизации не получен", "未设置": "Не настроено", - "未设置倍率模型": "Модели с неустановленным множителем", + "未设置价格": "Цена не задана", "未设置价格模型": "Модели с неустановленной ценой", + "未设置倍率模型": "Модели с неустановленным множителем", "未设置路径": "Путь не настроен", "未配置模型": "Ненастроенные модели", "未配置的模型列表": "Список ненастроенных моделей", @@ -1748,8 +1879,8 @@ "本地数据存储": "Локальное хранение данных", "本地计费": "Локальная тарификация", "本月获得": "В этом месяце", - "本设备:手机指纹/面容,外接:USB安全密钥": "Это устройство: отпечаток пальца/лицо телефона, внешнее: USB-ключ безопасности", "本设备内置": "Встроенное в это устройство", + "本设备:手机指纹/面容,外接:USB安全密钥": "Это устройство: отпечаток пальца/лицо телефона, внешнее: USB-ключ безопасности", "本项目根据": "Этот проект основан на", "机密环境变量": "Secret Environment Variables", "机密环境变量将被加密存储,适用于存储密码、API密钥等敏感信息。": "Secret environment variables will be stored encrypted, suitable for storing passwords, API keys and other sensitive information.", @@ -1758,12 +1889,12 @@ "权限设置": "Настройки прав доступа", "条": "запись", "条 - 第": "запись -", - "条,共": "записей, всего", "条件取反": "Инвертировать условие", "条件数": "Условия", "条件规则": "Правила условий", "条件项设置": "Настройки элементов условий", "条日志已清理!": "записей журнала очищено!", + "条,共": "записей, всего", "来源": "Источник", "来源于 IO.NET 部署": "From IO.NET Deployment", "来源端点": "Конечная точка источника", @@ -1777,8 +1908,10 @@ "查看所有可用的AI模型供应商,包括众多知名供应商的模型。": "Просмотреть всех доступных поставщиков моделей ИИ, включая модели от многих известных поставщиков.", "查看日志": "View Logs", "查看渠道密钥": "Просмотр ключа канала", + "查看示例": "View Example", "查看详情": "View Details", "查询": "Запрос", + "标准价格": "Standard price", "标签": "Метка", "标签不能为空!": "Метка не может быть пустой!", "标签信息": "Информация о метке", @@ -1788,6 +1921,8 @@ "标签聚合": "Агрегация меток", "标签聚合模式": "Режим агрегации меток", "标识颜色": "Цвет идентификатора", + "核心概念": "Key Concepts", + "核心配置": "Основные настройки", "核采样,控制词汇选择的多样性": "Ядерная выборка, управляет разнообразием выбора слов", "根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。": "Согласно соглашению Anthropic, входные токены /v1/messages учитывают только некэшированный ввод и не включают токены чтения/записи кэша.", "根据模型名称和匹配规则查找模型元数据,优先级:精确 > 前缀 > 后缀 > 包含": "Поиск метаданных модели по имени и правилам соответствия, приоритет: точный > префикс > суффикс > содержит", @@ -1795,27 +1930,34 @@ "格式化 JSON": "Форматировать JSON", "格式正确": "Действительный формат", "格式示例:": "Пример формата: ", - "前:": "До:", - "配置:": "Конфиг:", - "后:": "После:", "格式错误": "Недействительный формат", "检查更新": "Проверить обновления", "检测到 FluentRead(流畅阅读)": "Обнаружен FluentRead (плавное чтение)", + "检测到剪贴板中的连接信息": "В буфере обмена обнаружены данные подключения", "检测到多个密钥,您可以单独复制每个密钥,或点击复制全部获取完整内容。": "Обнаружено несколько ключей, вы можете скопировать каждый ключ отдельно или нажать \"Копировать все\" для получения полного содержимого.", "检测到该消息后有AI回复,是否删除后续回复并重新生成?": "Обнаружен ответ ИИ после этого сообщения, удалить ли последующие ответы и сгенерировать заново?", "检测必须等待绘图成功才能进行放大等操作": "Обнаружение должно ждать успешного вывода рисования для выполнения операций увеличения и т.д.", + "概览": "Overview", "模型": "Модель", + "模型 {{name}} 缺少输入价格,无法计算补全/缓存/图片/音频价格对应的倍率": "У модели {{name}} отсутствует входная цена, поэтому невозможно вычислить коэффициенты для завершения, кэша, изображений и аудио.", + "模型 {{name}} 缺少音频输入价格,无法计算音频补全倍率": "У модели {{name}} отсутствует цена аудио-ввода, поэтому невозможно вычислить коэффициент аудио-завершения.", "模型: {{ratio}}": "Модель: {{ratio}}", "模型专用区域": "Специальная область моделей", "模型价格": "Цена модели", + "模型价格 {{price}}": "Цена модели {{price}}", + "模型价格 {{symbol}}{{price}} / 次": "Цена модели {{symbol}}{{price}} / запрос", + "模型价格 {{symbol}}{{price}} / 次 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Цена модели {{symbol}}{{price}} / запрос * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}": "Цена модели {{symbol}}{{price}}, {{ratioType}} {{ratio}}", + "模型价格:{{symbol}}{{price}}": "Цена модели: {{symbol}}{{price}}", "模型价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "Цена модели: {{symbol}}{{price}} * {{ratioType}}: {{ratio}} = {{symbol}}{{total}}", - "按次:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "За запрос: {{symbol}}{{price}} * {{ratioType}}: {{ratio}} = {{symbol}}{{total}}", + "模型价格:{{symbol}}{{price}} / 次": "Цена модели: {{symbol}}{{price}} / запрос", "模型倍率": "Коэффициент модели", "模型倍率 {{modelRatio}}": "Коэффициент модели {{modelRatio}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}}": "Коэффициент модели {{modelRatio}}, коэффициент кэша {{cacheRatio}}, коэффициент вывода {{completionRatio}}, {{ratioType}} {{ratio}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}},Web 搜索调用 {{webSearchCallCount}} 次": "Коэффициент модели {{modelRatio}}, коэффициент кэша {{cacheRatio}}, коэффициент вывода {{completionRatio}}, {{ratioType}} {{ratio}}, вызовы веб-поиска {{webSearchCallCount}} раз", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},图片输入倍率 {{imageRatio}},{{ratioType}} {{ratio}}": "Коэффициент модели {{modelRatio}}, коэффициент кэша {{cacheRatio}}, коэффициент вывода {{completionRatio}}, коэффициент ввода изображений {{imageRatio}}, {{ratioType}} {{ratio}}", + "模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},音频倍率 {{audioRatio}},音频补全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}": "Коэффициент модели {{modelRatio}}, коэффициент завершения {{completionRatio}}, аудио-коэффициент {{audioRatio}}, коэффициент аудиозавершения {{audioCompletionRatio}}, {{cachePart}}{{ratioType}} {{ratio}}", + "模型倍率 {{modelRatio}},输出倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},{{ratioType}} {{ratio}}": "Коэффициент модели {{modelRatio}}, коэффициент вывода {{completionRatio}}, коэффициент кэша {{cacheRatio}}, {{ratioType}} {{ratio}}", "模型倍率 {{modelRatio}},输出倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},缓存创建倍率 {{cacheCreationRatio}},{{ratioType}} {{ratio}}": "Коэффициент модели {{modelRatio}}, коэффициент вывода {{completionRatio}}, коэффициент кэша {{cacheRatio}}, коэффициент создания кэша {{cacheCreationRatio}}, {{ratioType}} {{ratio}}", "模型倍率值": "Значение коэффициента модели", "模型倍率和补全倍率": "Коэффициент модели и коэффициент вывода", @@ -1833,6 +1975,7 @@ "模型名称已存在": "Название модели уже существует", "模型固定价格": "Фиксированная цена модели", "模型图标": "Иконка модели", + "模型定价设置": "Model Pricing", "模型定价,需要登录访问": "Ценообразование моделей, требуется вход для доступа", "模型广场": "Площадка моделей", "模型拉取失败: {{error}}": "Failed to pull model: {{error}}", @@ -1842,8 +1985,8 @@ "模型更新成功!": "Модель успешно обновлена!", "模型未加入列表,可能无法调用": "Модель не добавлена в список, вызовы могут не работать", "模型正则": "Regex модели", - "模型正则(每行一个)": "Regex модели (по одному в строке)", "模型正则不能为空": "Regex модели не может быть пустым", + "模型正则(每行一个)": "Regex модели (по одному в строке)", "模型消耗分布": "Распределение потребления моделей", "模型消耗趋势": "Тенденции потребления моделей", "模型版本": "Версия модели", @@ -1853,6 +1996,7 @@ "模型管理": "Управление моделями", "模型组": "Группа моделей", "模型补全倍率(仅对自定义模型有效)": "Коэффициент вывода модели (действует только для пользовательских моделей)", + "模型计费编辑器": "Редактор тарификации моделей", "模型请求速率限制": "Ограничение скорости запросов модели", "模型调用次数占比": "Доля вызовов модели", "模型调用次数排行": "Рейтинг вызовов модели", @@ -1883,6 +2027,7 @@ "正在跟随最新日志": "Following latest logs", "正在跳转 GitHub...": "Перенаправление на GitHub...", "正在跳转...": "Переход...", + "正常情况下,令牌的计费倍率由令牌所选的分组决定。特殊倍率可以根据「用户所在分组」进一步覆盖这个倍率。": "Normally, a token's billing ratio is determined by its selected group. Special ratios can override this based on the user's group.", "此代理仅用于图片请求转发,Webhook通知发送等,AI API请求仍然由服务器直接发出,可在渠道设置中单独配置代理": "Этот прокси используется только для пересылки изображений, отправки уведомлений Webhook и т.д., AI API запросы по-прежнему отправляются напрямую сервером, прокси можно настроить отдельно в настройках канала", "此修改将不可逆": "Это изменение будет необратимым", "此操作不可恢复,请仔细确认时间后再操作!": "Эта операция необратима, пожалуйста, внимательно подтвердите время перед выполнением!", @@ -1897,9 +2042,11 @@ "此操作将解绑用户当前的 Passkey,下次登录需要重新注册。": "Эта операция отвяжет текущий Passkey пользователя, при следующем входе потребуется повторная регистрация.", "此操作将降低用户的权限级别": "Эта операция понизит уровень прав пользователя", "此支付方式最低充值金额为": "Минимальная сумма пополнения для этого способа оплаты составляет", + "此时用户创建令牌时只能看到 standard 和 premium:": "Users can now only see standard and premium when creating tokens:", "此渠道由 IO.NET 自动同步,类型、密钥和 API 地址已锁定。": "This channel is automatically synchronized by IO.NET, type, key and API address are locked.", "此设置用于系统内部计算,默认值500000是为了精确到6位小数点设计,不推荐修改。": "Этот параметр используется для внутренних вычислений системы, значение по умолчанию 500000 разработано для точности до 6 знаков после запятой, не рекомендуется изменять.", "此页面仅显示未设置价格或倍率的模型,设置后将自动从列表中移除": "Эта страница отображает только модели с неустановленной ценой или коэффициентом, после настройки они автоматически удалятся из списка", + "此页面仅显示未设置价格或基础倍率的模型,设置后会自动从列表中移出": "На этой странице показаны только модели без цены или базового коэффициента. После сохранения они будут автоматически удалены из списка.", "此项只读,需要用户通过个人设置页面的相关绑定按钮进行绑定,不可直接修改": "Этот параметр только для чтения, пользователю необходимо выполнить привязку через соответствующие кнопки на странице личных настроек, прямое изменение невозможно", "此项可选,用于修改请求体中的模型名称,为一个 JSON 字符串,键为请求中模型名称,值为要替换的模型名称,例如:": "Этот параметр необязательный, используется для изменения имени модели в теле запроса, представляет собой JSON строку, где ключ - это имя модели в запросе, а значение - имя модели для замены, например:", "此项可选,用于修改请求体中的模型名称,为一个 JSON 字符串,键为请求中模型名称,值为要替换的模型名称,留空则不更改": "Этот параметр необязательный, используется для изменения имени модели в теле запроса, представляет собой JSON строку, где ключ - это имя модели в запросе, а значение - имя модели для замены, если оставить пустым, изменения не применяются", @@ -1907,6 +2054,7 @@ "此项可选,用于覆盖请求参数。不支持覆盖 stream 参数": "Этот параметр необязательный, используется для переопределения параметров запроса. Не поддерживает переопределение параметра stream", "此项可选,用于覆盖请求头参数": "Этот параметр необязательный, используется для переопределения параметров заголовка запроса", "此项可选,用于通过自定义API地址来进行 API 调用,末尾不要带/v1和/": "Этот параметр необязательный, используется для выполнения API вызовов через пользовательский адрес API, в конце не должно быть /v1 и /", + "每个分组代表一个价格档位。管理员创建分组后,可以选择哪些档位对用户开放自选。": "Each group represents a pricing tier. After creating groups, admins can choose which tiers are open for user self-selection.", "每个用户最多可创建的令牌数量,默认 1000,设置过大可能会影响性能": "Максимальное количество токенов, которое может создать каждый пользователь, по умолчанию 1000. Слишком большое значение может повлиять на производительность", "每周": "Еженедельно", "每天": "Ежедневно", @@ -1915,16 +2063,21 @@ "每日签到": "Ежедневная регистрация", "每日签到可获得随机额度奖励": "Ежедневная регистрация награждает случайной квотой", "每月": "Ежемесячно", + "每美元对应 Token 数": "Токенов за 1 доллар", "每隔多少分钟测试一次所有通道": "Как часто тестировать все каналы (в минутах)", "永不过期": "Никогда не истекает", "永久删除您的两步验证设置": "Окончательно удалить настройки двухфакторной аутентификации", "永久删除所有备用码(包括未使用的)": "Окончательно удалить все резервные коды (включая неиспользованные)", + "汇率": "Обменный курс", + "沙盒环境 RSA 私钥 Base64 (PKCS#8 DER)": "RSA закрытый ключ Base64 (PKCS#8 DER) песочницы", + "沙盒环境 Waffo 公钥 Base64 (X.509 DER)": "Открытый ключ Waffo Base64 (X.509 DER) песочницы", "没有匹配的字段": "Нет совпадающих полей", "没有匹配的日志条目": "No matching log entries", "没有匹配的规则": "Нет совпадающих правил", "没有可用令牌用于填充": "Нет доступных токенов для заполнения", "没有可用模型": "Нет доступных моделей", "没有找到匹配的模型": "Не найдено соответствующих моделей", + "没有未设置定价的模型": "Нет моделей без цены", "没有未设置的模型": "Нет неустановленных моделей", "没有条件时,默认总是执行该操作。": "При отсутствии условий операция всегда выполняется по умолчанию.", "没有模型可以复制": "Нет моделей для копирования", @@ -1933,8 +2086,8 @@ "注册": "Регистрация", "注册 Passkey": "Регистрация Passkey", "注意": "Внимание", - "注意:JSON中重复的键只会保留最后一个同名键的值": "Внимание: в JSON повторяющиеся ключи сохранят только значение последнего ключа с тем же именем", "注意非Chat API,请务必填写正确的API地址,否则可能导致无法使用": "Внимание: это не Chat API, обязательно укажите правильный адрес API, иначе это может привести к невозможности использования", + "注意:JSON中重复的键只会保留最后一个同名键的值": "Внимание: в JSON повторяющиеся ключи сохранят только значение последнего ключа с тем же именем", "注销": "Выйти", "注销成功!": "Выход выполнен успешно!", "活跃文件": "Активные файлы", @@ -1972,6 +2125,7 @@ "深色": "Тёмная", "深色模式": "Тёмный режим", "添加": "Добавить", + "添加 (+:)": "Add (+:)", "添加 OAuth 提供商": "Добавить OAuth-провайдера", "添加API": "Добавить API", "添加产品": "Добавить продукт", @@ -1979,6 +2133,7 @@ "添加兑换码": "Добавить код купона", "添加公告": "Добавить объявление", "添加分类": "Добавить категорию", + "添加分组": "Add Group", "添加后提交": "Отправить после добавления", "添加启动参数": "Add Startup Args", "添加启动命令": "Add Startup Command", @@ -1990,6 +2145,7 @@ "添加环境变量": "Add Environment Variable", "添加用户": "Добавить пользователя", "添加聊天配置": "Добавить конфигурацию чата", + "添加规则": "Add Rule", "添加键值对": "Добавить пару ключ-значение", "添加问答": "Добавить вопрос-ответ", "添加额度": "Добавить лимит", @@ -2008,8 +2164,8 @@ "渠道 ID": "ID канала", "渠道ID,名称,密钥,API地址": "ID Канала, имя, Токен, адрес API", "渠道亲和性": "Аффинитет канала", - "渠道亲和性:上游缓存命中": "Аффинити канала: попадание в кэш вышестоящего", "渠道亲和性会基于从请求上下文或 JSON Body 提取的 Key,优先复用上一次成功的渠道。": "Аффинити канала повторно использует последний успешный канал на основе ключей, извлечённых из контекста запроса или JSON body.", + "渠道亲和性:上游缓存命中": "Аффинити канала: попадание в кэш вышестоящего", "渠道优先级": "Приоритет канала", "渠道信息": "Информация о канале", "渠道创建成功!": "Канал создан успешно!", @@ -2027,6 +2183,7 @@ "渠道的模型测试": "Тестирование моделей канала", "渠道的高级配置选项": "Расширенные параметры конфигурации канала", "渠道管理": "Управление каналами", + "渠道行为": "Поведение канала", "渠道额外设置": "Дополнительные настройки канала", "源地址": "Исходный адрес", "满足任一条件(OR)": "Совпадение любого условия (OR)", @@ -2044,6 +2201,8 @@ "点击预览音乐": "Нажмите для прослушивания музыки", "点击验证按钮,使用您的生物特征或安全密钥": "Нажмите кнопку проверки, используйте ваши биометрические данные или ключ безопасности", "版权所有": "Все права защищены", + "特殊倍率": "Special Ratios", + "特殊可用分组规则": "Special Usable Group Rules", "状态": "Статус", "状态码": "Код состояния", "状态码复写": "Перезапись кода состояния", @@ -2051,6 +2210,8 @@ "状态筛选": "Фильтр по статусу", "状态页面Slug": "Slug страницы статуса", "环境变量": "Environment Variables", + "生产环境 RSA 私钥 Base64 (PKCS#8 DER)": "RSA закрытый ключ Base64 (PKCS#8 DER) производственной среды", + "生产环境 Waffo 公钥 Base64 (X.509 DER)": "Открытый ключ Waffo Base64 (X.509 DER) производственной среды", "生成令牌": "Сгенерировать токен", "生成并填入": "Сгенерировать и заполнить", "生成数量": "Количество для генерации", @@ -2081,20 +2242,25 @@ "用户信息": "Информация о пользователе", "用户信息更新成功!": "Информация о пользователе обновлена успешно!", "用户信息缺失": "Информация о пользователе отсутствует", - "用户最大令牌数量": "Максимальное количество токенов на пользователя", "用户分组": "Группы пользователей", "用户分组和额度管理": "Управление группами пользователей и лимитами", + "用户分组的联动作用": "How user group affects other features", "用户分组配置": "Конфигурация групп пользователей", + "用户创建令牌 → 选择分组下拉框:": "User creates token → group dropdown:", + "用户创建令牌时选择的分组,决定该令牌的实际计费倍率。一个用户可以创建多个令牌,使用不同分组。": "The group selected when creating a token determines its billing ratio. A user can create multiple tokens using different groups.", "用户协议": "Пользовательское соглашение", "用户协议已更新": "Пользовательское соглашение обновлено", "用户协议更新失败": "Не удалось обновить пользовательское соглашение", + "用户可选": "User Selectable", "用户可选分组": "Доступные для выбора группы пользователей", + "用户可选分组的名称和描述(只包含勾选了用户可选的分组)": "Names and descriptions of user-selectable groups (only includes checked groups)", "用户名": "Имя пользователя", "用户名字段(可选)": "Поле имени пользователя (необязательно)", "用户名或邮箱": "Имя пользователя или email", "用户名称": "Имя пользователя", "用户控制面板,管理账户": "Панель управления пользователя, управление аккаунтом", "用户新建令牌时可选的分组,格式为 JSON 字符串,例如:{\"vip\": \"VIP 用户\", \"test\": \"测试\"},表示用户可以选择 vip 分组和 test 分组": "Группы, доступные для выбора при создании токена пользователем, формат JSON строки, например: {\"vip\": \"VIP пользователь\", \"test\": \"тест\"}, означает, что пользователь может выбрать группу vip и группу test", + "用户最大令牌数量": "Максимальное количество токенов на пользователя", "用户每周期最多请求完成次数": "Максимальное количество выполненных запросов пользователя за период", "用户每周期最多请求次数": "Максимальное количество запросов пользователя за период", "用户注册时看到的网站名称,比如'我的网站'": "Название сайта, которое видят пользователи при регистрации, например 'Мой сайт'", @@ -2106,6 +2272,7 @@ "用户账户管理": "Управление аккаунтами пользователей", "用时/首字": "Время/первый символ", "由全站货币展示设置统一控制": "Управляется глобальными настройками отображения валюты", + "由管理员分配,决定用户身份等级(如 default、vip)。": "Assigned by admin, determines user tier (e.g., default, vip).", "由订阅抵扣": "Списано по подписке", "界面语言和其他个人偏好": "Язык интерфейса и другие личные предпочтения", "留空使用系统临时目录": "Оставьте пустым для использования системной временной директории", @@ -2122,11 +2289,13 @@ "监控设置": "Настройки мониторинга", "目录总大小": "Общий размер директории", "目录文件数": "Количество файлов в директории", + "目标分组": "Target Group", "目标用户:{{username}}": "Целевой пользователь: {{username}}", "目标端点": "Целевая конечная точка", "目标路径(可选)": "Целевой путь (необязательно)", "直接提交": "Отправить напрямую", "直接编辑 JSON 文本,保存时会校验格式。": "Редактируйте текст JSON напрямую; формат будет проверен при сохранении.", + "直接追加(和添加类似,但无前缀)": "Directly append (similar to Add, but without prefix)", "相关项目": "Связанные проекты", "相当于删除用户,此修改将不可逆": "Эквивалентно удалению пользователя, это изменение будет необратимым", "矛盾": "Противоречие", @@ -2136,7 +2305,6 @@ "硬件类型": "Hardware Type", "硬件配置": "Hardware Configuration", "确定": "Подтвердить", - "确定?": "Подтвердить?", "确定删除此组?": "Удалить эту группу?", "确定导入": "Подтвердить импорт", "确定是否要修复数据库一致性?": "Подтвердить, нужно ли восстановить согласованность базы данных?", @@ -2154,13 +2322,13 @@ "确定要充值 $": "Подтвердить пополнение на $", "确定要删除供应商 \"{{name}}\" 吗?此操作不可撤销。": "Подтвердить удаление поставщика \"{{name}}\"? Это действие нельзя отменить.", "确定要删除所有已自动禁用的密钥吗?": "Подтвердить удаление всех автоматически отключенных ключей?", - "确定要删除所选的 {{count}} 个令牌吗?_one": "Подтвердить удаление выбранного {{count}} токена?", "确定要删除所选的 {{count}} 个令牌吗?_few": "Подтвердить удаление выбранных {{count}} токенов?", "确定要删除所选的 {{count}} 个令牌吗?_many": "Подтвердить удаление выбранных {{count}} токенов?", + "确定要删除所选的 {{count}} 个令牌吗?_one": "Подтвердить удаление выбранного {{count}} токена?", "确定要删除所选的 {{count}} 个令牌吗?_other": "Подтвердить удаление выбранных {{count}} токенов?", - "确定要删除所选的 {{count}} 个模型吗?_one": "Подтвердить удаление выбранной {{count}} модели?", "确定要删除所选的 {{count}} 个模型吗?_few": "Подтвердить удаление выбранных {{count}} моделей?", "确定要删除所选的 {{count}} 个模型吗?_many": "Подтвердить удаление выбранных {{count}} моделей?", + "确定要删除所选的 {{count}} 个模型吗?_one": "Подтвердить удаление выбранной {{count}} модели?", "确定要删除所选的 {{count}} 个模型吗?_other": "Подтвердить удаление выбранных {{count}} моделей?", "确定要删除此 OAuth 提供商吗?": "Вы уверены, что хотите удалить этого OAuth-провайдера?", "确定要删除此API信息吗?": "Подтвердить удаление этой информации API?", @@ -2182,12 +2350,15 @@ "确定要降级此用户吗?": "Подтвердить понижение этого пользователя?", "确定重置": "Подтвердить сброс", "确定重置模型倍率吗?": "Подтвердить сброс коэффициента модели?", + "确定?": "Подтвердить?", "确认": "Подтверждение", "确认作废": "Подтвердить аннулирование", "确认关闭提示": "Подтвердить закрытие", "确认冲突项修改": "Подтвердить изменение конфликтующих элементов", "确认删除": "Подтвердить удаление", "确认删除模型": "Confirm Delete Model", + "确认删除该分组?": "Confirm delete this group?", + "确认删除该规则?": "Confirm delete this rule?", "确认取消密码登录": "Подтвердить отмену входа по паролю", "确认启用": "Подтвердить включение", "确认密码": "Подтвердить пароль", @@ -2197,11 +2368,12 @@ "确认操作": "Confirm Operation", "确认新密码": "Подтвердить новый пароль", "确认清理不活跃的磁盘缓存?": "Подтвердить очистку неактивного дискового кэша?", + "确认清理日志文件?": "Подтвердить очистку файлов журналов?", "确认清空全部渠道亲和性缓存": "Подтвердить очистку всего кэша аффинити каналов", "确认清空该规则缓存": "Подтвердить очистку кэша этого правила", "确认清除历史日志": "Подтвердить очистку истории логов", - "确认清理日志文件?": "Подтвердить очистку файлов журналов?", "确认禁用": "Подтвердить отключение", + "确认移除?": "Confirm remove?", "确认补单": "Подтвердить дополнение заказа", "确认解绑": "Подтвердить отвязку", "确认解绑 Passkey": "Подтвердить отвязку Passkey", @@ -2213,16 +2385,13 @@ "磁盘使用率超过此值时拒绝请求": "Отклонять запросы, когда использование диска превышает это значение", "磁盘可用空间小于缓存最大总量设置": "Доступное дисковое пространство меньше настройки максимального размера кэша", "磁盘命中": "Попадания на диск", - "磁盘缓存最大总量 (MB)": "Максимальный объём дискового кэша (МБ)", "磁盘缓存占用的最大空间": "Максимальное пространство, занимаемое дисковым кэшем", "磁盘缓存已清理": "Дисковый кэш очищен", + "磁盘缓存最大总量 (MB)": "Максимальный объём дискового кэша (МБ)", "磁盘缓存设置(磁盘换内存)": "Настройки дискового кэша (обмен диска/памяти)", "磁盘缓存阈值 (MB)": "Порог дискового кэша (МБ)", "示例": "Пример", "示例:{\"default\": [200, 100], \"vip\": [0, 1000]}。": "Пример: {\"default\": [200, 100], \"vip\": [0, 1000]}.", - "视频": "Видео", - "视频Remix": "Видео ремикс", - "视频无法在当前浏览器中播放,这可能是由于:": "Видео нельзя воспроизвести в этом браузере, возможные причины:", "禁用": "Отключить", "禁用 store 透传": "Отключить сквозную передачу store", "禁用2FA失败": "Ошибка отключения 2FA", @@ -2240,12 +2409,19 @@ "私有镜像仓库的密码": "Password for private image registry", "私有镜像仓库的用户名": "Username for private image registry", "秒": "секунда", - "移除 functionResponse.id 字段": "Удалить поле functionResponse.id", + "移除": "Remove", + "移除 (-:)": "Remove (-:)", "移除 One API 的版权标识必须首先获得授权,项目维护需要花费大量精力,如果本项目对你有意义,请主动支持本项目": "Удаление авторских знаков One API требует предварительного разрешения, поддержка проекта требует больших усилий, если этот проект важен для вас, пожалуйста, поддержите его", + "移除 functionResponse.id 字段": "Удалить поле functionResponse.id", + "空": "Пусто", "窗口处理": "Обработка окна", "窗口等待": "Ожидание окна", "立即签到": "Зарегистрироваться сейчас", "立即订阅": "Оформить сейчас", + "站点所有额度将以原始 Token 数显示,不做货币换算": "Все квоты сайта будут отображаться в виде необработанного количества токенов без валютной конвертации", + "站点所有额度将以美元 ($) 显示": "Все квоты сайта будут отображаться в долларах США ($)", + "站点所有额度将按汇率换算为人民币 (¥) 显示": "Все квоты сайта будут конвертированы в юани (¥) по курсу обмена", + "站点所有额度将按汇率换算为自定义货币显示": "Все квоты сайта будут конвертированы в пользовательскую валюту по курсу обмена", "站点额度展示类型及汇率": "Тип отображения квот сайта и обменные курсы", "端口号必须在1-65535之间": "Port number must be between 1-65535", "端口配置详细说明": "Ограничение внешних запросов только к указанным портам. Поддерживает отдельные порты (80, 443) или диапазоны портов (8000-8999). Пустой список разрешает все порты. По умолчанию включает распространенные веб-порты.", @@ -2269,37 +2445,41 @@ "等待中": "Ожидание", "等待获取邮箱信息...": "Ожидание получения информации об email...", "筛选": "Фильтр", - "签到最大额度": "Максимальная квота регистрации", - "签到最小额度": "Минимальная квота регистрации", "签到功能允许用户每日签到获取随机额度奖励": "Функция регистрации позволяет пользователям регистрироваться ежедневно для получения случайных наград в виде квоты", "签到失败": "Регистрация не удалась", "签到奖励将直接添加到您的账户余额": "Награды за регистрацию будут напрямую добавлены на баланс вашего счета", "签到奖励的最大额度": "Максимальная квота для наград за регистрацию", "签到奖励的最小额度": "Минимальная квота для наград за регистрацию", "签到成功!获得": "Регистрация успешна! Получено", + "签到最大额度": "Максимальная квота регистрации", + "签到最小额度": "Минимальная квота регистрации", "签到设置": "Настройки регистрации", + "简单来说:同一个令牌分组,不同等级的用户可以享受不同的价格。": "In short: same token group, different user tiers can enjoy different prices.", "简洁": "Простой", - "简洁模式:按 type 全量清理对象,例如 redacted_thinking。": "Простой режим: очистка всех объектов по типу, напр. redacted_thinking.", "简洁模式仅返回 message;状态码和错误类型将使用系统默认值。": "Простой режим возвращает только сообщение; код состояния и тип ошибки будут использовать системные значения по умолчанию.", + "简洁模式:按 type 全量清理对象,例如 redacted_thinking。": "Простой режим: очистка всех объектов по типу, напр. redacted_thinking.", "管理": "Управление", "管理 Ollama 模型的拉取和删除": "Manage Ollama model pulling and deletion", "管理你的 LinuxDO OAuth App": "Управление вашим LinuxDO OAuth App", "管理员": "Администратор", + "管理员分配的优惠分组": "Admin-assigned discount group", + "管理员分配的基础分组": "Admin-assigned base group", "管理员区域": "Область администратора", "管理员暂时未设置任何关于内容": "Администратор пока не установил никакой информации о проекте", "管理员未开启 Creem 充值!": "Администратор не включил пополнение через Creem!", "管理员未开启Stripe充值!": "Администратор не включил пополнение через Stripe!", - "管理员未开启在线充值!": "Администратор не включил онлайн пополнение!", "管理员未开启在线充值功能,请联系管理员开启或使用兑换码充值。": "Администратор не включил функцию онлайн пополнения, свяжитесь с администратором для включения или используйте коды купонов для пополнения.", + "管理员未开启在线充值!": "Администратор не включил онлайн пополнение!", "管理员未开启在线支付功能,请联系管理员配置。": "Онлайн-оплата не включена администратором. Пожалуйста, свяжитесь с администратором.", "管理员未设置用户可选分组": "Администратор не установил доступные для выбора группы пользователей", + "管理员给用户分配的分组(如 vip)不仅决定用户身份,还会影响后续两个功能:": "The group assigned to a user (e.g., vip) not only determines their identity, but also affects the following two features:", "管理员设置了外部链接,点击下方按钮访问": "Администратор установил внешнюю ссылку, нажмите кнопку ниже для доступа", "管理员账号": "Аккаунт администратора", "管理员账号已经初始化过,请继续设置其他参数": "Аккаунт администратора уже инициализирован, продолжите настройку других параметров", + "管理服务器运行日志文件。日志文件会随运行时间不断累积,建议定期清理以释放磁盘空间。": "Управление файлами журналов сервера. Файлы журналов накапливаются со временем; рекомендуется регулярная очистка для освобождения дискового пространства.", "管理模型、标签、端点等预填组": "Управление предзаполненными группами моделей, тегов, конечных точек и т.д.", "管理用户已绑定的第三方账户,支持筛选与解绑": "Управление привязанными сторонними аккаунтами пользователей с поддержкой фильтрации и отвязки", "管理绑定": "Управление привязками", - "管理服务器运行日志文件。日志文件会随运行时间不断累积,建议定期清理以释放磁盘空间。": "Управление файлами журналов сервера. Файлы журналов накапливаются со временем; рекомендуется регулярная очистка для освобождения дискового пространства.", "类型": "Тип", "类型(常用)": "Тип (часто используемые)", "粘贴图片失败": "Ошибка вставки изображения", @@ -2311,6 +2491,9 @@ "系统公告": "Системные объявления", "系统公告管理,可以发布系统通知和重要消息(最多100个,前端显示最新20条)": "Управление системными объявлениями, позволяет публиковать системные уведомления и важные сообщения (максимум 100, на интерфейсе отображаются последние 20)", "系统内存": "Системная память", + "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为人民币,不影响内部计费": "Система использует USD как базовую валюту ценообразования. Баланс пользователя, суммы пополнения, цены моделей, журналы использования — все отображаемые суммы конвертируются в юани по этому курсу. Внутренняя тарификация не затрагивается.", + "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为自定义货币,不影响内部计费": "Система использует USD как базовую валюту ценообразования. Баланс пользователя, суммы пополнения, цены моделей, журналы использования — все отображаемые суммы конвертируются в пользовательскую валюту по этому курсу. Внутренняя тарификация не затрагивается.", + "系统内部计费精度,默认 500000,修改可能导致计费异常,请谨慎操作": "Внутренняя точность тарификации, по умолчанию 500000. Изменение может привести к аномалиям тарификации — действуйте осторожно.", "系统初始化": "Инициализация системы", "系统初始化失败,请重试": "Инициализация системы не удалась, попробуйте снова", "系统初始化成功,正在跳转...": "Инициализация системы прошла успешно, выполняется перенаправление...", @@ -2329,11 +2512,11 @@ "系统管理功能": "Функции системного управления", "系统设置": "Системные настройки", "系统访问令牌": "Токен доступа к системе", - "约": "Приблизительно", "索引": "Индекс", "紧凑列表": "Компактный список", "累计签到": "Всего регистраций", "累计获得": "Всего получено", + "约": "Приблизительно", "线路描述": "Описание маршрута", "组列表": "Список групп", "组名": "Имя группы", @@ -2363,31 +2546,45 @@ "统计次数": "Статистика количества", "统计额度": "Статистика лимитов", "继续": "Продолжить", - "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Кэш {{tokens}} токенов / 1M токенов * {{symbol}}{{price}} (множитель: {{ratio}})", "缓存 Tokens": "Кэширование токенов", + "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Кэш {{tokens}} токенов / 1M токенов * {{symbol}}{{price}}", + "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Кэш {{tokens}} токенов / 1M токенов * {{symbol}}{{price}} (множитель: {{ratio}})", "缓存: {{cacheRatio}}": "Кэш: {{cacheRatio}}", "缓存价格:{{symbol}}{{price}} * {{cacheRatio}} = {{symbol}}{{total}} / 1M tokens (缓存倍率: {{cacheRatio}})": "Цена кэша: {{symbol}}{{price}} * {{cacheRatio}} = {{symbol}}{{total}} / 1M токенов (коэффициент кэширования: {{cacheRatio}})", "缓存价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存倍率: {{cacheRatio}})": "Цена кэша: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M токенов (коэффициент кэширования: {{cacheRatio}})", "缓存倍率": "Коэффициент кэширования", "缓存倍率 {{cacheRatio}}": "Коэффициент кэша {{cacheRatio}}", "缓存写": "Запись в кэш", - "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Создание кэша {{tokens}} токенов / 1M токенов * {{symbol}}{{price}} (множитель: {{ratio}})", "缓存创建 Tokens": "Создание кэша токенов", - "缓存创建: {{cacheCreationRatio}}": "Создание кэша: {{cacheCreationRatio}}", + "缓存创建 {{price}} / 1M tokens": "Создание кэша {{price}} / 1M tokens", + "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Создание кэша {{tokens}} токенов / 1M токенов * {{symbol}}{{price}}", + "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Создание кэша {{tokens}} токенов / 1M токенов * {{symbol}}{{price}} (множитель: {{ratio}})", "缓存创建: 1h {{cacheCreationRatio1h}}": "Создание кэша: 1h {{cacheCreationRatio1h}}", "缓存创建: 5m {{cacheCreationRatio5m}}": "Создание кэша: 5m {{cacheCreationRatio5m}}", "缓存创建: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Создание кэша: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", - "缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存创建倍率: {{cacheCreationRatio}})": "Цена создания кэша: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M токенов (коэффициент создания кэша: {{cacheCreationRatio}})", + "缓存创建: {{cacheCreationRatio}}": "Создание кэша: {{cacheCreationRatio}}", + "缓存创建价格": "Цена создания входного кеша", + "缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Цена создания кеша {{symbol}}{{price}} / 1M tokens", "缓存创建价格合计:5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens": "Итого цена создания кэша: 5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M токенов", + "缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存创建倍率: {{cacheCreationRatio}})": "Цена создания кэша: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M токенов (коэффициент создания кэша: {{cacheCreationRatio}})", + "缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Цена создания кеша: {{symbol}}{{price}} / 1M tokens", "缓存创建倍率": "Коэффициент создания кэша", - "缓存创建倍率 {{cacheCreationRatio}}": "Коэффициент создания кэша {{cacheCreationRatio}}", "缓存创建倍率 1h {{cacheCreationRatio1h}}": "Множитель создания кэша 1h {{cacheCreationRatio1h}}", "缓存创建倍率 5m {{cacheCreationRatio5m}}": "Множитель создания кэша 5m {{cacheCreationRatio5m}}", "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Коэффициент создания кэша 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", + "缓存创建倍率 {{cacheCreationRatio}}": "Коэффициент создания кэша {{cacheCreationRatio}}", + "缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存创建倍率 {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Создание кэша: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * коэффициент создания кэша {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "缓存条目数": "Количество записей кэша", "缓存目录": "Директория кэша", "缓存目录磁盘空间": "Дисковое пространство директории кэша", "缓存读": "Чтение кэша", + "缓存读 {{price}} / 1M tokens": "Чтение кеша {{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", + "缓存读取:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Чтение кэша: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * коэффициент кэша {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", + "缓存输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Кэшированный ввод: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * коэффициент кэша {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "编辑": "Редактировать", "编辑 OAuth 提供商": "Редактировать OAuth-провайдера", "编辑API": "Редактировать API", @@ -2424,10 +2621,13 @@ "聊天链接配置错误,请联系管理员": "Ошибка конфигурации ссылки чата, свяжитесь с администратором", "联系我们": "Свяжитесь с нами", "腾讯混元": "Tencent Hunyuan", + "自动分组": "Auto Group", "自动分组auto,从第一个开始选择": "Автоматическая группировка auto, выбор начинается с первого", + "自动分组选择": "Auto Group Selection", "自动刷新": "Auto Refresh", "自动刷新中": "Auto refreshing", "自动填充字段": "Автозаполнение полей", + "自动填入": "Заполнить", "自动检测": "Автоматическое обнаружение", "自动模式": "Автоматический режим", "自动测试所有通道间隔时间": "Интервал автоматического тестирования всех каналов", @@ -2452,18 +2652,6 @@ "自定义货币": "Пользовательская валюта", "自定义货币符号": "Пользовательский символ валюты", "自定义货币符号将显示在所有额度数值前,例如 €1.50": "Пользовательский символ валюты будет отображаться перед всеми суммами квот, например €1.50", - "额度展示类型": "Тип отображения квоты", - "站点所有额度将以美元 ($) 显示": "Все квоты сайта будут отображаться в долларах США ($)", - "站点所有额度将按汇率换算为人民币 (¥) 显示": "Все квоты сайта будут конвертированы в юани (¥) по курсу обмена", - "站点所有额度将以原始 Token 数显示,不做货币换算": "Все квоты сайта будут отображаться в виде необработанного количества токенов без валютной конвертации", - "站点所有额度将按汇率换算为自定义货币显示": "Все квоты сайта будут конвертированы в пользовательскую валюту по курсу обмена", - "汇率": "Обменный курс", - "每美元对应 Token 数": "Токенов за 1 доллар", - "预览效果": "Предпросмотр", - "请输入汇率": "Пожалуйста, введите обменный курс", - "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为人民币,不影响内部计费": "Система использует USD как базовую валюту ценообразования. Баланс пользователя, суммы пополнения, цены моделей, журналы использования — все отображаемые суммы конвертируются в юани по этому курсу. Внутренняя тарификация не затрагивается.", - "系统内部计费精度,默认 500000,修改可能导致计费异常,请谨慎操作": "Внутренняя точность тарификации, по умолчанию 500000. Изменение может привести к аномалиям тарификации — действуйте осторожно.", - "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为自定义货币,不影响内部计费": "Система использует USD как базовую валюту ценообразования. Баланс пользователя, суммы пополнения, цены моделей, журналы использования — все отображаемые суммы конвертируются в пользовательскую валюту по этому курсу. Внутренняя тарификация не затрагивается.", "自定义错误响应": "Пользовательский ответ об ошибке", "自定义镜像": "Custom Image", "自用模式": "Режим личного использования", @@ -2475,11 +2663,13 @@ "若你的 OIDC Provider 支持 Discovery Endpoint,你可以仅填写 OIDC Well-Known URL,系统会自动获取 OIDC 配置": "Если ваш OIDC Provider поддерживает Discovery Endpoint, вы можете указать только OIDC Well-Known URL, и система автоматически получит OIDC конфигурацию", "获取 Discovery 配置": "Получить конфигурацию Discovery", "获取 Discovery 配置失败:": "Не удалось получить конфигурацию Discovery: ", - "获取 io.net API Key": "Get io.net API Key", "获取 OIDC 配置失败,请检查网络状况和 Well-Known URL 是否正确": "Не удалось получить OIDC конфигурацию, проверьте состояние сети и правильность Well-Known URL", "获取 OIDC 配置成功!": "OIDC конфигурация успешно получена!", "获取 Ollama 版本失败": "Failed to get Ollama version", + "获取 io.net API Key": "Get io.net API Key", "获取2FA状态失败": "Не удалось получить статус 2FA", + "获取充值配置失败": "Не удалось получить конфигурацию пополнения", + "获取充值配置异常": "Ошибка конфигурации пополнения", "获取初始化状态失败": "Не удалось получить статус инициализации", "获取可用资源失败: ": "Failed to get available resources: ", "获取启用模型失败": "Не удалось получить включенные модели", @@ -2506,10 +2696,14 @@ "获取验证码": "Получить код подтверждения", "获得": "Получено", "补全": "Вывод", + "补全 {{completion}} tokens * 输出倍率 {{completionRatio}}": "Дополнение {{completion}} токенов * коэффициент вывода {{completionRatio}}", "补全 {{completion}} tokens / 1M tokens * {{symbol}}{{price}}": "Дополнение {{completion}} токенов / 1M токенов * {{symbol}}{{price}}", + "补全价格": "Цена завершения", + "补全价格已锁定": "Цена завершения заблокирована", "补全价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "Цена вывода: {{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M токенов (коэффициент вывода: {{completionRatio}})", "补全价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens": "Цена вывода: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M токенов", "补全倍率": "Коэффициент вывода", + "补全倍率 {{completionRatio}}": "Коэффициент вывода {{completionRatio}}", "补全倍率值": "Значение коэффициента вывода", "补单": "Вывод заказа", "补单失败": "Не удалось дополнить заказ", @@ -2527,6 +2721,9 @@ "规则名称(可读性更好,也会出现在管理侧日志中)。": "Имя правила (для лучшей читаемости, также отображается в журналах администрирования).", "规则导航": "Навигация по правилам", "规则未找到,请刷新后重试": "Правило не найдено, обновите страницу и попробуйте снова", + "视频": "Видео", + "视频Remix": "Видео ремикс", + "视频无法在当前浏览器中播放,这可能是由于:": "Видео нельзя воспроизвести в этом браузере, возможные причины:", "角色": "Роль", "解析响应数据时发生错误": "Произошла ошибка при разборе данных ответа", "解析密钥文件失败: {{msg}}": "Не удалось разобрать файл ключа: {{msg}}", @@ -2535,11 +2732,17 @@ "解绑 Passkey": "Отвязать Passkey", "解绑后将无法使用 Passkey 登录,确定要继续吗?": "После отвязки невозможно будет использовать Passkey для входа, продолжить?", "解绑成功": "Успешно отвязано", + "警告": "Предупреждение", + "警告:启用保活后,如果已经写入保活数据后渠道出错,系统无法重试,如果必须开启,推荐设置尽可能大的Ping间隔": "Предупреждение: после включения поддержания активности, если канал выдаёт ошибку после записи данных поддержания активности, система не может повторить попытку, если необходимо включить, рекомендуется установить максимально возможный интервал Ping", + "警告:禁用两步验证将永久删除您的验证设置和所有备用码,此操作不可撤销!": "Предупреждение: отключение двухфакторной аутентификации навсегда удалит ваши настройки проверки и все резервные коды, эта операция необратима!", "计价币种": "Pricing Currency", "计算中": "Calculating", "计算成本": "Calculate Cost", "计算费用中...": "Calculating fees...", + "计费乘数,倍率越低费用越低。例如倍率 0.5 表示半价。": "Billing multiplier — the lower the ratio, the lower the cost. E.g., ratio 0.5 means half price.", "计费开始": "Billing Start", + "计费方式": "Режим тарификации", + "计费显示模式": "Режим отображения тарификации", "计费模式": "Режим тарификации", "计费类型": "Тип выставления счёта", "计费过程": "Процесс выставления счёта", @@ -2599,6 +2802,7 @@ "该数据可能不可信,请谨慎使用": "Эти данные могут быть недостоверными, используйте с осторожностью", "该服务器地址将影响支付回调地址以及默认首页展示的地址,请确保正确配置": "Этот адрес сервера повлияет на адрес обратного вызова оплаты и адрес отображения главной страницы по умолчанию, убедитесь в правильной конфигурации", "该模型存在固定价格与倍率计费方式冲突,请确认选择": "Эта модель имеет конфликт между фиксированной ценой и способом выставления счёта по коэффициенту, подтвердите выбор", + "该模型补全倍率由后端固定为 {{ratio}}。补全价格不能在这里修改。": "Коэффициент завершения для этой модели зафиксирован на уровне {{ratio}} на бэкенде. Цену завершения нельзя изменить здесь.", "该渠道已开启请求透传,参数覆写、模型重定向等 NewAPI 内置功能将失效,非最佳实践。": "Для этого канала включена сквозная передача запросов; встроенные функции NewAPI, такие как переопределение параметров и перенаправление моделей, будут отключены. Это не является лучшей практикой.", "该渠道已开启请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "Для этого канала включена сквозная передача запросов. Встроенные возможности NewAPI, такие как переопределение параметров, перенаправление моделей и адаптация канала, будут отключены. Это не является лучшей практикой. Если из-за этого возникнут проблемы, пожалуйста, не создавайте issue.", "该规则未启用“作用域:包含规则名称”,无法按规则清空缓存。": "У этого правила не включена «Область действия: включить имя правила», очистка кэша по правилу невозможна.", @@ -2606,27 +2810,31 @@ "该规则的缓存保留时长;0 表示使用默认 TTL:": "Время хранения кэша для этого правила; 0 — использовать TTL по умолчанию: ", "该记录不包含可用的 token 统计口径。": "Эта запись не содержит доступной статистики токенов.", "详情": "Подробности", + "详见「特殊倍率」和「可用分组」标签页。": "See \"Special Ratios\" and \"Usable Groups\" tabs for details.", "语言偏好": "Языковые настройки", "语言偏好已保存": "Языковые настройки сохранены", "语音输入": "Голосовой ввод", "语音输出": "Голосовой вывод", "说明": "Описание", + "说明信息": "Информация об описании", "说明:": "Описание:", "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。": "Примечание: тесты на этой странице используют нестриминговые запросы. Если канал поддерживает только стриминговые ответы, тест может завершиться неудачей. Ориентируйтесь на реальное использование.", "说明:生成结果是可直接粘贴到渠道密钥里的 JSON(包含 access_token / refresh_token / account_id)。": "Примечание: Результат — это JSON, который можно вставить непосредственно в ключ канала (содержит access_token / refresh_token / account_id).", - "说明信息": "Информация об описании", "请上传密钥文件": "Пожалуйста, загрузите файл ключа", "请上传密钥文件!": "Пожалуйста, загрузите файл ключа!", "请为渠道命名": "Пожалуйста, назовите канал", "请使用 Project 为 io.cloud 的密钥": "Please use a key with Project set to io.cloud", + "请先勾选需要批量设置的模型": "Сначала отметьте модели для массовой настройки", "请先在设置中启用图片功能": "Сначала включите функцию изображений в настройках", "请先填写 API Key": "Please fill in API Key first", "请先填写 Discovery URL 或 Issuer URL": "Сначала заполните Discovery URL или Issuer URL", "请先填写 Issuer URL,以自动生成完整的端点 URL": "Сначала заполните Issuer URL для автогенерации полных URL конечных точек", "请先填写 Ollama API 地址": "Please fill in Ollama API address first", "请先填写服务器地址": "Пожалуйста, сначала заполните адрес сервера", + "请先开启并填写音频输入价格。": "Сначала включите и заполните цену аудио-ввода.", "请先粘贴回调 URL": "Сначала вставьте URL обратного вызова", "请先输入密钥": "Пожалуйста, сначала введите ключ", + "请先选择一个作为模板的模型": "Сначала выберите модель-шаблон", "请先选择一条规则": "Сначала выберите правило", "请先选择同步渠道": "Пожалуйста, сначала выберите канал синхронизации", "请先选择模型!": "Пожалуйста, сначала выберите модель!", @@ -2667,6 +2875,7 @@ "请求超时,请刷新页面后重新发起 GitHub 登录": "Время ожидания истекло, обновите страницу и снова запустите вход через GitHub", "请求路径": "Путь запроса", "请求转换": "Преобразование запроса", + "请求配置": "Настройки запросов", "请求预扣费额度": "Запрос суммы предварительного удержания", "请点击我": "Пожалуйста, нажмите на меня", "请确认以下设置信息,点击\"初始化系统\"开始配置": "Пожалуйста, подтвердите следующую информацию о настройках, нажмите \"Инициализация системы\" для начала конфигурации", @@ -2686,18 +2895,18 @@ "请至少选择一个渠道": "Пожалуйста, выберите хотя бы один канал", "请输入 API Key,一行一个,格式:APIKey|Region": "Введите API Key, по одному в строке, формат: APIKey|Region", "请输入 API Key,格式:APIKey|Region": "Введите API Key в формате: APIKey|Region", - "请输入 Authorization Endpoint": "Введите Authorization Endpoint", "请输入 AZURE_OPENAI_ENDPOINT,例如:https://docs-test-001.openai.azure.com": "Пожалуйста, введите AZURE_OPENAI_ENDPOINT, например: https://docs-test-001.openai.azure.com", + "请输入 Authorization Endpoint": "Введите Authorization Endpoint", "请输入 Client ID": "Введите Client ID", "请输入 Client Secret": "Введите Client Secret", - "请输入 io.net API Key": "Please enter io.net API Key", - "请输入 io.net API Key(敏感信息不显示)": "Please enter io.net API Key (sensitive information not displayed)", "请输入 JSON 格式的 OAuth 凭据,例如:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}": "Введите учётные данные OAuth в формате JSON, напр.:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}", "请输入 JSON 格式的密钥内容,例如:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}": "Пожалуйста, введите содержимое ключа в формате JSON, например:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}", "请输入 OIDC 的 Well-Known URL": "Пожалуйста, введите Well-Known URL OIDC", "请输入 Slug": "Введите Slug", "请输入 Token Endpoint": "Введите Token Endpoint", "请输入 User Info Endpoint": "Введите User Info Endpoint", + "请输入 io.net API Key": "Please enter io.net API Key", + "请输入 io.net API Key(敏感信息不显示)": "Please enter io.net API Key (sensitive information not displayed)", "请输入6位验证码或8位备用码": "Пожалуйста, введите 6-значный код подтверждения или 8-значный резервный код", "请输入API地址": "Пожалуйста, введите адрес API", "请输入API地址!": "Пожалуйста, введите адрес API!", @@ -2707,9 +2916,9 @@ "请输入Gotify服务器地址": "Пожалуйста, введите адрес сервера Gotify", "请输入Gotify服务器地址,例如: https://gotify.example.com": "Пожалуйста, введите адрес сервера Gotify, например: https://gotify.example.com", "请输入JSON数组,如 [\"model-a\",\"model-b\"]": "Введите JSON-массив, например [\"model-a\",\"model-b\"]", + "请输入URL链接": "Пожалуйста, введите URL-ссылку", "请输入Uptime Kuma地址": "Пожалуйста, введите адрес Uptime Kuma", "请输入Uptime Kuma服务地址,如:https://status.example.com": "Пожалуйста, введите адрес службы Uptime Kuma, например: https://status.example.com", - "请输入URL链接": "Пожалуйста, введите URL-ссылку", "请输入Webhook地址": "Пожалуйста, введите адрес Webhook", "请输入Webhook地址,例如: https://example.com/webhook": "Пожалуйста, введите адрес Webhook, например: https://example.com/webhook", "请输入你的账户名以确认删除!": "Пожалуйста, введите имя вашей учётной записи для подтверждения удаления!", @@ -2734,14 +2943,14 @@ "请输入备注(仅管理员可见)": "Пожалуйста, введите примечание (видимо только администратору)", "请输入套餐标题": "Введите название плана", "请输入完整的 JSON 格式密钥内容": "Пожалуйста, введите полное содержимое ключа в формате JSON", - "请输入完整的URL,例如:https://api.openai.com/v1/chat/completions": "Пожалуйста, введите полный URL, например: https://api.openai.com/v1/chat/completions", "请输入完整的URL链接": "Пожалуйста, введите полную URL-ссылку", + "请输入完整的URL,例如:https://api.openai.com/v1/chat/completions": "Пожалуйста, введите полный URL, например: https://api.openai.com/v1/chat/completions", "请输入容器名称": "Please enter container name", "请输入密码": "Пожалуйста, введите пароль", "请输入密钥": "Пожалуйста, введите ключ", + "请输入密钥!": "Пожалуйста, введите ключ!", "请输入密钥,一行一个": "Пожалуйста, введите ключи, по одному в строке", "请输入密钥,一行一个,格式:AccessKey|SecretAccessKey|Region": "Введите ключи по одному в строке в формате: AccessKey|SecretAccessKey|Region", - "请输入密钥!": "Пожалуйста, введите ключ!", "请输入延长时长": "Please enter extension duration", "请输入总额度": "Введите общий лимит", "请输入您的密码": "Пожалуйста, введите ваш пароль", @@ -2772,6 +2981,7 @@ "请输入模型名称,例如: llama3.2, qwen2.5:7b": "Please enter model name, e.g.: llama3.2, qwen2.5:7b", "请输入模型名称,如:gpt-4": "Пожалуйста, введите имя модели, например: gpt-4", "请输入模型描述": "Пожалуйста, введите описание модели", + "请输入汇率": "Пожалуйста, введите обменный курс", "请输入消息内容...": "Пожалуйста, введите содержание сообщения...", "请输入状态页面Slug": "Пожалуйста, введите Slug страницы состояния", "请输入状态页面的Slug,如:my-status": "Пожалуйста, введите Slug страницы состояния, например: my-status", @@ -2793,9 +3003,9 @@ "请输入认证器验证码或备用码": "Пожалуйста, введите код подтверждения аутентификатора или резервный код", "请输入说明": "Пожалуйста, введите описание", "请输入运行时长": "Please enter runtime duration", - "请输入邮箱!": "Пожалуйста, введите адрес электронной почты!", "请输入邮箱地址": "Пожалуйста, введите адрес электронной почты", "请输入邮箱验证码!": "Пожалуйста, введите код подтверждения электронной почты!", + "请输入邮箱!": "Пожалуйста, введите адрес электронной почты!", "请输入部署名称": "Please enter deployment name", "请输入部署名称以完成二次确认": "Enter deployment name to complete secondary confirmation", "请输入部署地区,例如:us-central1\n支持使用模型映射格式\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}": "Пожалуйста, введите регион развертывания, например: us-central1\nПоддерживается формат сопоставления моделей\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}", @@ -2843,9 +3053,6 @@ "调用次数排行": "Рейтинг количества вызовов", "调试信息": "Отладочная информация", "谨慎": "Осторожно", - "警告": "Предупреждение", - "警告:启用保活后,如果已经写入保活数据后渠道出错,系统无法重试,如果必须开启,推荐设置尽可能大的Ping间隔": "Предупреждение: после включения поддержания активности, если канал выдаёт ошибку после записи данных поддержания активности, система не может повторить попытку, если необходимо включить, рекомендуется установить максимально возможный интервал Ping", - "警告:禁用两步验证将永久删除您的验证设置和所有备用码,此操作不可撤销!": "Предупреждение: отключение двухфакторной аутентификации навсегда удалит ваши настройки проверки и все резервные коды, эта операция необратима!", "豆包": "Doubao", "账单": "Счёт", "账户充值": "Пополнение счёта", @@ -2864,6 +3071,7 @@ "购买套餐后即可享受模型权益": "После покупки плана доступны преимущества моделей", "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。": "Покупка или ручное добавление подписки повысит группу до этой. При истечении/аннулировании/удалении плана произойдет возврат к предыдущей группе. Возврат обычно занимает несколько минут.", "购买订阅套餐": "Купить план подписки", + "购买订阅获得模型额度/次数": "Купите подписку, чтобы получить лимит/количество использования моделей", "费用信息": "Cost Information", "费用预估": "Cost Estimate", "资源消耗": "Потребление ресурсов", @@ -2874,6 +3082,7 @@ "跟随日志": "Follow Logs", "跟随系统主题设置": "Следовать настройкам темы системы", "跨分组": "Межгрупповой", + "跨分组特殊倍率": "Cross-Group Special Ratios", "跨分组重试": "Повторная попытка между группами", "路径正则": "Regex пути", "路径正则(每行一个)": "Regex пути (по одному в строке)", @@ -2886,9 +3095,12 @@ "输入 OIDC 的 Client ID": "Введите Client ID OIDC", "输入 OIDC 的 Token Endpoint": "Введите Token Endpoint OIDC", "输入 OIDC 的 Userinfo Endpoint": "Введите Userinfo Endpoint OIDC", + "输入 {{price}} / 1M tokens": "Вход {{price}} / 1M tokens", "输入IP地址后回车,如:8.8.8.8": "Введите IP-адрес и нажмите Enter, например: 8.8.8.8", "输入JSON对象": "Введите JSON-объект", "输入价格": "Цена ввода", + "输入价格 {{symbol}}{{price}} / 1M tokens": "Цена ввода {{symbol}}{{price}} / 1M tokens", + "输入价格:{{symbol}}{{price}} / 1M tokens": "Цена ввода: {{symbol}}{{price}} / 1M tokens", "输入价格:{{symbol}}{{price}} / 1M tokens{{audioPrice}}": "Цена ввода: {{symbol}}{{price}} / 1M tokens{{audioPrice}}", "输入你注册的 LinuxDO OAuth APP 的 ID": "Введите ID вашего зарегистрированного LinuxDO OAuth APP", "输入你的账户名{{username}}以确认删除": "Введите имя вашей учётной записи {{username}} для подтверждения удаления", @@ -2898,6 +3110,7 @@ "输入数字": "Введите число", "输入标签或使用\",\"分隔多个标签": "Введите теги или используйте \",\" для разделения нескольких тегов", "输入模型倍率": "Введите коэффициент модели", + "输入模型名称,例如 gpt-4.1": "Введите имя модели, например gpt-4.1", "输入每次价格": "Введите цену за использование", "输入端口后回车,如:80 或 8000-8999": "Введите порт и нажмите Enter, например: 80 или 8000-8999", "输入系统提示词,用户的系统提示词将优先于此设置": "Введите системный промпт, системные промпты пользователя будут иметь приоритет над этой настройкой", @@ -2915,8 +3128,13 @@ "输出": "Вывод", "输出 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}}) * {{ratioType}} {{ratio}}": "Вывод {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}}) * {{ratioType}} {{ratio}}", "输出价格": "Цена вывода", + "输出价格 {{symbol}}{{price}} / 1M tokens": "Цена вывода {{symbol}}{{price}} / 1M tokens", "输出价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "Цена вывода: {{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M токенов (коэффициент вывода: {{completionRatio}})", + "输出价格:{{symbol}}{{price}} / 1M tokens": "Цена вывода: {{symbol}}{{price}} / 1M tokens", + "输出价格:{{symbol}}{{total}} / 1M tokens": "Цена вывода: {{symbol}}{{total}} / 1M tokens", "输出倍率 {{completionRatio}}": "Коэффициент вывода {{completionRatio}}", + "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Вывод: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * коэффициент завершения {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", + "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 输出倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Вывод: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * коэффициент вывода {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "边栏设置": "Настройки боковой панели", "过期于": "Истекает", "过期时间": "Время истечения", @@ -2930,6 +3148,8 @@ "运行时长(小时)": "Runtime Duration (hours)", "返回修改": "Вернуться и исправить", "返回登录": "Вернуться к входу", + "这个界面默认按价格填写,保存时会自动换算回后端需要的倍率 JSON。": "В этом интерфейсе значения по умолчанию задаются через цены, а при сохранении они автоматически преобразуются в JSON коэффициентов, требуемый backend.", + "这些价格都是可选项,不填也可以。": "Все эти цены необязательны и могут быть оставлены пустыми.", "这将删除超过 10 分钟未使用的临时缓存文件": "Это удалит временные файлы кэша, которые не использовались более 10 минут", "这是基础金额,实际扣费 = 基础金额 x 系统分组倍率。": "Это базовая сумма. Фактическое удержание = базовая сумма × коэффициент системной группы.", "这是重复键中的最后一个,其值将被使用": "Это последний ключ в повторяющихся, его значение будет использовано", @@ -2940,18 +3160,24 @@ "违规扣费": "Удержание за нарушение", "违规扣费金额": "Сумма удержания за нарушение", "连接保活设置": "Настройки поддержания соединения", + "连接信息已填入": "Данные подключения применены", "连接已断开": "Соединение разорвано", "连接测试中...": "Testing connection...", + "追加": "Append", "追加到现有密钥": "Добавить к существующим ключам", "追加模式:将新密钥添加到现有密钥列表末尾": "Режим добавления: добавление новых ключей в конец списка существующих ключей", "追加模式:新密钥将添加到现有密钥列表的末尾": "Режим добавления: новые ключи будут добавлены в конец списка существующих ключей", "追加模板": "Добавить шаблон", "退出": "Выход", "退款": "Возврат", + "适合 MJ / 任务类等按次收费模型。": "Подходит для MJ и других моделей с тарификацией за запрос.", + "适合同系列模型一起定价,例如把 gpt-5.1 的价格批量同步到 gpt-5.1-high、gpt-5.1-low 等模型。": "Подходит для совместной настройки цен вариантов одной модели, например синхронизации цены gpt-5.1 с gpt-5.1-high, gpt-5.1-low и похожими моделями.", "适用于个人使用的场景,不需要设置模型价格": "Подходит для сценариев личного использования, не требует установки цен на модели", "适用于为多个用户提供服务的场景": "Подходит для сценариев предоставления услуг нескольким пользователям", "适用于展示系统功能的场景,提供基础功能演示": "Подходит для сценариев демонстрации системных функций, предоставляет демонстрацию базовых функций", "适配 -thinking、-thinking-预算数字 和 -nothinking 后缀": "Адаптация суффиксов -thinking, -thinking-бюджетные-цифры, -nothinking и -low/-medium/-high", + "选择 premium 创建的令牌,调用 API 时费用为 standard 的 50%。": "Tokens created with premium cost 50% of standard when calling APIs.", + "选择使用分组": "Select using group", "选择充值额度": "Выберите сумму пополнения", "选择分组": "Выберите группу", "选择同步来源": "Выберите источник синхронизации", @@ -2969,6 +3195,7 @@ "选择模型后可一键填充当前选中令牌(或本页第一个令牌)。": "После выбора модели можно одним нажатием заполнить текущий выбранный токен (или первый токен на этой странице).", "选择模型开始对话": "Выберите модель для начала диалога", "选择状态": "Select Status", + "选择用户分组": "Select user group", "选择硬件类型": "Select Hardware Type", "选择端点类型": "Выберите тип конечной точки", "选择系统运行模式": "Выберите режим работы системы", @@ -2993,8 +3220,10 @@ "通知类型 (quota_exceed: 额度预警)": "Тип уведомления (quota_exceed: предупреждение о превышении квоты)", "通知邮箱": "Email для уведомлений", "通知配置": "Конфигурация уведомлений", + "通过分组可以实现不同用户等级的差异化定价,例如 VIP 用户享受更低的 API 调用费用。": "Groups enable differentiated pricing for different user tiers. For example, VIP users can enjoy lower API costs.", "通过划转功能将奖励额度转入到您的账户余额中": "Через функцию перевода переведите вознаграждение на баланс вашей учётной записи", "通过密码注册时需要进行邮箱验证": "При регистрации через пароль требуется проверка электронной почты", + "通过此功能,可以根据用户所在分组,为不同等级的用户展示不同的可选列表。": "This feature allows showing different selectable group lists to users of different tiers.", "通道 ${name} 余额更新成功!": "Баланс канала ${name} успешно обновлен!", "通道 ${name} 测试成功,模型 ${model} 耗时 ${time.toFixed(2)} 秒。": "Канал ${name} успешно протестирован, модель ${model} заняла ${time.toFixed(2)} секунд.", "通道 ${name} 测试成功,耗时 ${time.toFixed(2)} 秒。": "Канал ${name} успешно протестирован, заняло ${time.toFixed(2)} секунд.", @@ -3048,6 +3277,7 @@ "配置 Telegram 登录": "Настроить вход через Telegram", "配置 Turnstile": "Настроить Turnstile", "配置 WeChat Server": "Настроить WeChat Server", + "配置后的效果:": "After configuration:", "配置和消息已全部重置": "Конфигурация и сообщения полностью сброшены", "配置套餐的有效时长": "Настроить срок действия плана", "配置如何从用户信息 API 响应中提取用户数据,支持 JSONPath 语法": "Настройте извлечение данных пользователя из ответа API информации о пользователе, поддерживается синтаксис JSONPath", @@ -3060,10 +3290,12 @@ "配置有效的 io.net API Key": "Configure a valid io.net API Key", "配置服务器端请求伪造(SSRF)防护,用于保护内网资源安全": "Настроить защиту от подделки запросов на стороне сервера (SSRF) для защиты безопасности внутренних сетевых ресурсов", "配置模型部署服务提供商的API密钥和启用状态": "Configure the API key and enabled status of the model deployment service provider", + "配置特殊倍率后:": "After configuring special ratios:", "配置登录注册": "Настроить вход и регистрацию", "配置自定义 OAuth 提供商,支持 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 协议的身份提供商": "Настройте пользовательских OAuth-провайдеров, поддерживаются GitHub Enterprise, GitLab, Gitea, Nextcloud, Keycloak, ORY и другие провайдеры идентификации, совместимые с OAuth 2.0", "配置说明": "Описание конфигурации", "配置邮箱域名白名单": "Настроить белый список доменов электронной почты", + "配置:": "Конфиг:", "重启部署失败": "Failed to restart deployment", "重命名部署": "Rename Deployment", "重复提交": "Повторная отправка", @@ -3107,6 +3339,7 @@ "键为端点类型,值为路径和方法对象": "Ключ - тип конечной точки, значение - объект пути и метода", "键为请求中的模型名称,值为要替换的模型名称": "Ключ - имя модели в запросе, значение - имя модели для замены", "键名": "Имя ключа", + "键的前缀 +: 表示添加,-: 表示移除,无前缀表示追加。值为分组描述(移除时填 \"remove\")。": "Key prefix +: means add, -: means remove, no prefix means append. Value is the group description (use \"remove\" for removal).", "镜像仓库密码": "Image Registry Password", "镜像仓库用户名": "Image Registry Username", "镜像仓库配置": "Image Registry Configuration", @@ -3122,15 +3355,15 @@ "限制周期统一使用上方配置的“限制周期”值。": "Период ограничения равномерно использует значение 'Период ограничения', настроенное выше.", "限流": "Ограничение скорости", "限购": "Лимит", + "随机": "Случайный", + "随机模式": "Случайный режим", + "随机种子 (留空为随机)": "Случайное зерно (оставьте пустым для случайного)", "隐私政策": "Политика конфиденциальности", "隐私政策已更新": "Политика конфиденциальности обновлена", "隐私政策更新失败": "Не удалось обновить политику конфиденциальности", "隐私设置": "Настройки конфиденциальности", "隐藏操作项": "Скрыть элементы операций", "隐藏调试": "Скрыть отладку", - "随机": "Случайный", - "随机模式": "Случайный режим", - "随机种子 (留空为随机)": "Случайное зерно (оставьте пустым для случайного)", "零一万物": "01.AI", "需要安全验证": "Требуется проверка безопасности", "需要添加的额度(支持负数)": "Квота для добавления (поддерживаются отрицательные значения)", @@ -3140,14 +3373,21 @@ "非必要,不建议启用模型限制": "Необязательно, не рекомендуется включать ограничения моделей", "非流": "Без потока", "音乐预览": "Предварительное прослушивание", + "音频倍率 {{audioRatio}}": "Аудио-коэффициент {{audioRatio}}", "音频倍率(仅部分模型支持该计费)": "Аудиокоэффициент (только некоторые модели поддерживают эту тарификацию)", "音频提示 {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}": "Аудиоввод {{input}} токенов / 1M токенов * {{symbol}}{{audioInputPrice}} + Аудиозавершение {{completion}} токенов / 1M токенов * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}", "音频提示价格:{{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens (音频倍率: {{audioRatio}})": "Цена аудиоввода: {{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M токенов (аудиокоэффициент: {{audioRatio}})", "音频无法播放": "Не удалось воспроизвести аудио", + "音频补全价格": "Цена завершения аудио", "音频补全价格:{{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens (音频补全倍率: {{audioCompRatio}})": "Цена аудиовывода: {{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M токенов (коэффициент аудиовывода: {{audioCompRatio}})", + "音频补全价格:{{symbol}}{{price}} / 1M tokens": "Цена завершения аудио: {{symbol}}{{price}} / 1M tokens", "音频补全倍率(仅部分模型支持该计费)": "Коэффициент аудиовывода (только некоторые модели поддерживают эту тарификацию)", + "音频输入价格": "Цена входного аудио", + "音频输入价格:{{symbol}}{{price}} / 1M tokens": "Цена входного аудио: {{symbol}}{{price}} / 1M tokens", "音频输入相关的倍率设置,键为模型名称,值为倍率": "Настройки коэффициентов, связанные с аудиовводом, ключ - имя модели, значение - коэффициент", + "音频输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Аудиоввод: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * аудио-коэффициент {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "音频输出补全相关的倍率设置,键为模型名称,值为倍率": "Настройки коэффициентов, связанные с аудиовыводом и завершением, ключ - имя модели, значение - коэффициент", + "音频输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * 音频补全倍率 {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Аудиовывод: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * аудио-коэффициент {{audioRatio}} * коэффициент аудиозавершения {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "页脚": "Подвал", "页面未找到,请检查您的浏览器地址是否正确": "Страница не найдена, пожалуйста, проверьте правильность адреса в браузере", "顶栏管理": "Управление верхней панелью", @@ -3160,17 +3400,21 @@ "预填组管理": "Управление группами предварительного заполнения", "预扣": "Предварительное списание", "预览失败": "Ошибка предварительного просмотра", + "预览效果": "Предпросмотр", "预览更新": "Обновление предварительного просмотра", "预览模板": "Предпросмотр шаблона", "预览请求体": "Предварительный просмотр тела запроса", + "预警阈值必须为正数": "Порог предупреждения должен быть положительным числом", "预计结束": "Estimated End", "预设模板": "Предустановленный шаблон", - "预警阈值必须为正数": "Порог предупреждения должен быть положительным числом", "频率惩罚,减少重复词汇的出现": "Штраф за частоту, уменьшает повторение слов", "频率限制的周期(分钟)": "Период ограничения частоты (минуты)", "颜色": "Цвет", + "额外价格项": "Дополнительные ценовые позиции", + "额外设置": "Дополнительные настройки", "额度": "Квота", "额度充值": "Пополнение квоты", + "额度展示类型": "Тип отображения квоты", "额度必须大于0": "Квота должна быть больше 0", "额度提醒阈值": "Порог напоминания о квоте", "额度查询接口返回令牌额度而非用户额度": "Интерфейс запроса квоты возвращает квоту токенов, а не квоту пользователя", @@ -3191,161 +3435,30 @@ "验证身份": "Подтвердить личность", "验证配置错误": "Ошибка конфигурации проверки", "高级": "Расширенные", + "高级套餐,半价优惠": "Premium plan, 50% off", "高级文本编辑": "Расширенное текстовое редактирование", "高级设置": "Расширенные настройки", "高级选项": "Расширенные параметры", "高级配置": "Advanced Configuration", - "核心配置": "Основные настройки", - "创建渠道所需的基本信息": "Основная информация для создания канала", - "请求配置": "Настройки запросов", - "渠道行为": "Поведение канала", - "额外设置": "Дополнительные настройки", - "上游模型管理": "Управление моделями апстрима", "黑名单": "Черный список", "默认": "По умолчанию", "默认 API 版本": "Версия API по умолчанию", "默认 Responses API 版本,为空则使用上方版本": "Версия Responses API по умолчанию, если пусто, используется версия выше", "默认 TTL(秒)": "TTL по умолчанию (секунды)", "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)": "По умолчанию используется коэффициент создания кэша 5m; коэффициент создания кэша 1h автоматически вычисляется фиксированным умножением (сейчас 1.6x)", + "默认使用auto分组": "Default to auto group", "默认使用系统名称": "Использовать системное имя по умолчанию", "默认助手消息": "Здравствуйте! Чем я могу вам помочь?", "默认区域": "Регион по умолчанию", "默认区域,如: us-central1": "Регион по умолчанию, например: us-central1", + "默认情况下,所有用户创建令牌时看到的可选分组列表是一样的(即「用户可选」列勾选的分组)。": "By default, all users see the same selectable group list when creating tokens (i.e., groups with \"User Selectable\" checked).", "默认折叠侧边栏": "Сворачивать боковую панель по умолчанию", "默认测试模型": "Модель для тестирования по умолчанию", "默认用户消息": "Здравствуйте", "默认补全倍率": "Коэффициент завершения по умолчанию", - "提示:端点映射仅用于模型广场展示,不会影响模型真实调用。如需配置真实调用,请前往「渠道管理」。": "Примечание: сопоставление эндпоинтов используется только для отображения в «Маркетплейсе моделей» и не влияет на реальный вызов. Чтобы настроить реальное поведение вызовов, перейдите в «Управление каналами».", - "购买订阅获得模型额度/次数": "Купите подписку, чтобы получить лимит/количество использования моделей", - "生产环境 RSA 私钥 Base64 (PKCS#8 DER)": "RSA закрытый ключ Base64 (PKCS#8 DER) производственной среды", - "沙盒环境 RSA 私钥 Base64 (PKCS#8 DER)": "RSA закрытый ключ Base64 (PKCS#8 DER) песочницы", - "生产环境 Waffo 公钥 Base64 (X.509 DER)": "Открытый ключ Waffo Base64 (X.509 DER) производственной среды", - "沙盒环境 Waffo 公钥 Base64 (X.509 DER)": "Открытый ключ Waffo Base64 (X.509 DER) песочницы", - "支付方式类型": "Тип метода оплаты", - "支付方式名称": "Название метода оплаты", - "获取充值配置失败": "Не удалось получить конфигурацию пополнения", - "获取充值配置异常": "Ошибка конфигурации пополнения", - "分组相关设置": "Настройки, связанные с группами", - "保存分组相关设置": "Сохранить настройки, связанные с группами", - "此页面仅显示未设置价格或基础倍率的模型,设置后会自动从列表中移出": "На этой странице показаны только модели без цены или базового коэффициента. После сохранения они будут автоматически удалены из списка.", - "没有未设置定价的模型": "Нет моделей без цены", - "当前没有未设置定价的模型": "Сейчас нет моделей без цены", - "模型计费编辑器": "Редактор тарификации моделей", - "价格摘要": "Сводка цен", - "当前提示": "Текущие подсказки", - "这个界面默认按价格填写,保存时会自动换算回后端需要的倍率 JSON。": "В этом интерфейсе значения по умолчанию задаются через цены, а при сохранении они автоматически преобразуются в JSON коэффициентов, требуемый backend.", - "当前未启用,需要时再打开即可。": "Это поле сейчас отключено. Включите его при необходимости.", - "下面展示这个模型保存后会写入哪些后端字段,便于和原始 JSON 编辑框保持一致。": "Ниже показано, какие backend-поля будут записаны после сохранения, чтобы их было удобно сверять с редакторами исходного JSON.", - "补全价格已锁定": "Цена завершения заблокирована", - "后端固定倍率:{{ratio}}。该字段仅展示换算后的价格。": "Фиксированный backend-коэффициент: {{ratio}}. Это поле только показывает вычисленную цену.", - "这些价格都是可选项,不填也可以。": "Все эти цены необязательны и могут быть оставлены пустыми.", - "请先开启并填写音频输入价格。": "Сначала включите и заполните цену аудио-ввода.", - "输入模型名称,例如 gpt-4.1": "Введите имя модели, например gpt-4.1", - "当前模型同时存在按次价格和倍率配置,保存时会按当前计费方式覆盖。": "У этой модели одновременно задана цена за запрос и конфигурация коэффициентов. При сохранении данные будут перезаписаны согласно текущему режиму тарификации.", - "当前模型存在未显式设置输入倍率的扩展倍率;填写输入价格后会自动换算为价格字段。": "У этой модели есть дополнительные коэффициенты без явно заданного входного коэффициента; после ввода входной цены они будут автоматически преобразованы в ценовые поля.", - "按量计费下需要先填写输入价格,才能保存其它价格项。": "При тарификации по объему сначала нужно указать входную цену, чтобы сохранить остальные ценовые поля.", - "填写音频补全价格前,需要先填写音频输入价格。": "Перед указанием цены аудио-завершения сначала задайте цену аудио-ввода.", - "模型 {{name}} 缺少输入价格,无法计算补全/缓存/图片/音频价格对应的倍率": "У модели {{name}} отсутствует входная цена, поэтому невозможно вычислить коэффициенты для завершения, кэша, изображений и аудио.", - "模型 {{name}} 缺少音频输入价格,无法计算音频补全倍率": "У модели {{name}} отсутствует цена аудио-ввода, поэтому невозможно вычислить коэффициент аудио-завершения.", - "批量应用当前模型价格": "Массово применить цену текущей модели", - "请先选择一个作为模板的模型": "Сначала выберите модель-шаблон", - "请先勾选需要批量设置的模型": "Сначала отметьте модели для массовой настройки", - "已将模型 {{name}} 的价格配置批量应用到 {{count}} 个模型": "Ценовая конфигурация модели {{name}} массово применена к {{count}} моделям", - "将把当前编辑中的模型 {{name}} 的价格配置,批量应用到已勾选的 {{count}} 个模型。": "Ценовая конфигурация редактируемой модели {{name}} будет применена к {{count}} выбранным моделям.", - "适合同系列模型一起定价,例如把 gpt-5.1 的价格批量同步到 gpt-5.1-high、gpt-5.1-low 等模型。": "Подходит для совместной настройки цен вариантов одной модели, например синхронизации цены gpt-5.1 с gpt-5.1-high, gpt-5.1-low и похожими моделями.", - "已勾选": "Выбрано", - "当前编辑": "Текущее редактирование", - "已勾选 {{count}} 个模型": "Выбрано моделей: {{count}}", - "计费方式": "Режим тарификации", - "未设置价格": "Цена не задана", - "保存预览": "Предпросмотр сохранения", - "基础价格": "Базовые цены", - "扩展价格": "Дополнительные цены", - "额外价格项": "Дополнительные ценовые позиции", - "补全价格": "Цена завершения", - "缓存读取价格": "Цена чтения входного кеша", - "缓存创建价格": "Цена создания входного кеша", - "图片输入价格": "Цена входного изображения", - "音频输入价格": "Цена входного аудио", - "音频补全价格": "Цена завершения аудио", - "适合 MJ / 任务类等按次收费模型。": "Подходит для MJ и других моделей с тарификацией за запрос.", - "该模型补全倍率由后端固定为 {{ratio}}。补全价格不能在这里修改。": "Коэффициент завершения для этой модели зафиксирован на уровне {{ratio}} на бэкенде. Цену завершения нельзя изменить здесь.", - "计费显示模式": "Режим отображения тарификации", - "价格模式(默认)": "Режим цен (по умолчанию)", - "模型价格 {{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", - "缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Цена создания кеша: {{symbol}}{{price}} / 1M tokens", - "缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Цена создания кеша {{symbol}}{{price}} / 1M tokens", - "5m缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Цена создания кеша 5m: {{symbol}}{{price}} / 1M tokens", - "5m缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Цена создания кеша 5m {{symbol}}{{price}} / 1M tokens", - "1h缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Цена создания кеша 1h: {{symbol}}{{price}} / 1M tokens", - "1h缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Цена создания кеша 1h {{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}} раз", - "文件搜索调用 {{fileSearchCallCount}} 次": "Поиск файлов вызван {{fileSearchCallCount}} раз", - "图片倍率 {{imageRatio}}": "Коэффициент изображения {{imageRatio}}", - "音频倍率 {{audioRatio}}": "Аудио-коэффициент {{audioRatio}}", - "普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Обычный ввод: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "缓存输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Кэшированный ввод: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * коэффициент кэша {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 图片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Ввод изображения: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * коэффициент изображения {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Аудиоввод: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * аудио-коэффициент {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Вывод: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * коэффициент завершения {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "Web 搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Web-поиск: {{count}} / 1K * цена за единицу {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "文件搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Поиск файлов: {{count}} / 1K * цена за единицу {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片生成:1 次 * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Генерация изображения: 1 вызов * цена за единицу {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "合计:{{total}}": "Итого: {{total}}", - "模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},音频倍率 {{audioRatio}},音频补全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}": "Коэффициент модели {{modelRatio}}, коэффициент завершения {{completionRatio}}, аудио-коэффициент {{audioRatio}}, коэффициент аудиозавершения {{audioCompletionRatio}}, {{cachePart}}{{ratioType}} {{ratio}}", - "文字输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Текстовый вывод: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * коэффициент завершения {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输出:{{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}}", - "缓存读取:{{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", - "复制密钥": "Копировать ключ", - "复制连接信息": "Копировать данные подключения", - "检测到剪贴板中的连接信息": "В буфере обмена обнаружены данные подключения", - "自动填入": "Заполнить", - "忽略": "Игнорировать", - "从剪贴板粘贴配置": "Вставить конфигурацию", - "剪贴板中未检测到连接信息": "Данные подключения не найдены в буфере обмена", - "连接信息已填入": "Данные подключения применены", - "无法读取剪贴板": "Не удалось прочитать буфер обмена" + "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(В настоящее время поддерживается только интерфейс YiPay, по умолчанию используется адрес сервера выше в качестве адреса обратного вызова!)", + ",当前无生效订阅,将自动使用钱包": ", нет активной подписки, автоматически будет использоваться кошелек.", + ",时间:": ", время: ", + ",点击更新": ", нажмите для обновления" } } diff --git a/web/src/i18n/locales/vi.json b/web/src/i18n/locales/vi.json index 936ebc8d..4a2b05e1 100644 --- a/web/src/i18n/locales/vi.json +++ b/web/src/i18n/locales/vi.json @@ -9,41 +9,40 @@ " 吗?": " không?", " 秒": " giây", " 秒。": " giây.", - ",当前无生效订阅,将自动使用钱包": ", hiện không có gói đăng ký hiệu lực, sẽ tự động dùng ví.", - ",时间:": ", thời gian:", - ",点击更新": ", nhấn để cập nhật", - "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(Hiện tại chỉ hỗ trợ giao diện Epay, địa chỉ máy chủ phía trên được sử dụng làm địa chỉ gọi lại theo mặc định!)", + "$/1M tokens": "$/1M tokens", "(筛选后显示 {{count}} 条)_other": "(Showing {{count}} items after filtering)", "(输入 {{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}}", - "[最多请求次数]和[最多请求完成次数]的最大值为2147483647。": "Giá trị tối đa của [Số lần yêu cầu tối đa] và [Số lần hoàn thành yêu cầu tối đa] là 2147483647.", - "[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。": "[Số lần yêu cầu tối đa] phải lớn hơn hoặc bằng 0, [Số lần hoàn thành yêu cầu tối đa] phải lớn hơn hoặc bằng 1.", - "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", - "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", - "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", - "{{name}} ID": "{{name}} ID", - "{{ratioType}} {{ratio}}": "{{ratioType}} {{ratio}}", - "• 视频服务商的跨域限制": "• Cross-origin limitations from the video provider", - "• 防盗链保护机制": "• Hotlink protection mechanisms", - "• 需要特定的请求头或认证": "• Specific headers or authentication are required", - "© {{currentYear}}": "© {{currentYear}}", - "| 基于": " | Dựa trên ", - "$/1M tokens": "$/1M tokens", + "(输入 {{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}}", "0 - 最低": "0 - Thấp nhất", "0 表示不限": "0 nghĩa là không giới hạn", "0.002-1之间的小数": "Số thập phân giữa 0.002-1", "0.1以上的小数": "Số thập phân trên 0.1", "1) 点击「打开授权页面」完成登录;2) 浏览器会跳转到 localhost(页面打不开也没关系);3) 复制地址栏完整 URL 粘贴到下方;4) 点击「生成并填入」。": "1) Nhấn \"Mở trang xác thực\" để đăng nhập; 2) Trình duyệt sẽ chuyển hướng đến localhost (không sao nếu trang không mở được); 3) Sao chép URL đầy đủ từ thanh địa chỉ và dán vào bên dưới; 4) Nhấn \"Tạo và điền\".", + "1. 管理员在此创建分组并设置倍率": "1. Admin creates groups and sets ratios here", "10 - 最高": "10 - Cao nhất", + "1h缓存创建 {{price}} / 1M tokens": "Tạo bộ nhớ đệm 1h {{price}} / 1M tokens", + "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Tạo bộ nhớ đệm 1h {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "1h cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", + "1h缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Giá tạo bộ nhớ đệm 1h {{symbol}}{{price}} / 1M tokens", "1h缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (1h缓存创建倍率: {{cacheCreationRatio1h}})": "1h cache creation price: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (1h cache creation ratio: {{cacheCreationRatio1h}})", + "1h缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Giá tạo bộ nhớ đệm 1h: {{symbol}}{{price}} / 1M tokens", + "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}}", "2 - 低": "2 - Thấp", + "2. 管理员在用户管理中将用户分配到对应分组(如 vip)": "2. Admin assigns users to groups in User Management (e.g., vip)", "2025年5月10日后添加的渠道,不需要再在部署的时候移除模型名称中的\".\"": "Các kênh được thêm sau ngày 10 tháng 5 năm 2025 không cần xóa dấu chấm trong tên mô hình khi triển khai", + "3. 用户创建令牌时,下拉菜单中出现勾选了「用户可选」的分组": "3. When users create tokens, groups with \"User Selectable\" checked appear in the dropdown", "360智脑": "360 AI Brain", + "4. 令牌使用所选分组的倍率进行计费": "4. Token uses the selected group's ratio for billing", "5 - 正常(默认)": "5 - Bình thường (mặc định)", + "5m缓存创建 {{price}} / 1M tokens": "Tạo bộ nhớ đệm 5m {{price}} / 1M tokens", + "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Tạo bộ nhớ đệm 5m {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "5m cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", + "5m缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Giá tạo bộ nhớ đệm 5m {{symbol}}{{price}} / 1M tokens", "5m缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (5m缓存创建倍率: {{cacheCreationRatio5m}})": "5m cache creation price: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (5m cache creation ratio: {{cacheCreationRatio5m}})", + "5m缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Giá tạo bộ nhớ đệm 5m: {{symbol}}{{price}} / 1M tokens", + "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}}", "8 - 高": "8 - Cao", "AGPL v3.0协议": "Giấy phép AGPL v3.0", "AI 对话": "Trò chuyện AI", @@ -65,41 +64,36 @@ "API地址": "Base URL", "API渠道配置": "Cấu hình kênh API", "API端点": "Điểm cuối API", - "Authorization callback URL 填": "Điền URL gọi lại ủy quyền", "Authorization Endpoint": "Điểm cuối ủy quyền", - "auto分组调用链路": "chuỗi gọi nhóm tự động", + "Authorization callback URL 填": "Điền URL gọi lại ủy quyền", "Bark推送URL": "URL đẩy Bark", "Bark推送URL必须以http://或https://开头": "URL đẩy Bark phải bắt đầu bằng http:// hoặc https://", "Bark通知": "Thông báo Bark", "Basic Auth 头": "Header Basic Auth", + "CPU 使用率超过此值时拒绝请求": "Từ chối yêu cầu khi sử dụng CPU vượt quá giá trị này", + "CPU 阈值 (%)": "Ngưỡng CPU (%)", "Cached tokens": "Cached tokens", "Cached tokens 占比口径由后端返回:Claude 语义按 cached/(prompt+cached),其余按 cached/prompt。": "Tỷ lệ cached tokens được trả về từ backend: ngữ nghĩa Claude tính theo cached/(prompt+cached), còn lại tính theo cached/prompt.", "Changing batch type to:": "Đang thay đổi loại hàng loạt thành:", "ChatCompletions→Responses 兼容配置": "Cấu hình tương thích ChatCompletions→Responses", "ChatCompletions→Responses 兼容配置(Beta)": "Tương thích ChatCompletions→Responses (Beta)", "Claude 强制 beta=true": "Claude buộc beta=true", + "Claude会在原有请求头基础上追加这些值,不会覆盖已有同名请求头;重复值会自动忽略。": "Claude sẽ thêm các giá trị này vào các tiêu đề yêu cầu hiện có. Các tiêu đề cùng tên sẽ không bị ghi đè và các giá trị trùng lặp sẽ tự động bị bỏ qua.", "Claude思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Thích ứng tư duy Claude BudgetTokens = MaxTokens * Tỷ lệ phần trăm BudgetTokens", "Claude设置": "Cài đặt Claude", "Claude请求头覆盖": "Ghi đè tiêu đề yêu cầu Claude", "Claude请求头追加": "Thêm tiêu đề yêu cầu Claude", - "Claude会在原有请求头基础上追加这些值,不会覆盖已有同名请求头;重复值会自动忽略。": "Claude sẽ thêm các giá trị này vào các tiêu đề yêu cầu hiện có. Các tiêu đề cùng tên sẽ không bị ghi đè và các giá trị trùng lặp sẽ tự động bị bỏ qua.", "Client ID": "Client ID", "Client Secret": "Client Secret", "Codex 授权": "Xác thực Codex", "Codex 渠道不支持批量创建": "Kênh Codex không hỗ trợ tạo hàng loạt", - "common.changeLanguage": "Thay đổi ngôn ngữ", "Completion tokens": "Completion tokens", "Configuration": "Cấu hình", - "context_int/context_string 从请求上下文读取;gjson 从入口请求的 JSON body 按 gjson path 读取。": "context_int/context_string đọc từ context yêu cầu; gjson đọc từ JSON body yêu cầu đầu vào theo gjson path.", - "CPU 使用率超过此值时拒绝请求": "Từ chối yêu cầu khi sử dụng CPU vượt quá giá trị này", - "CPU 阈值 (%)": "Ngưỡng CPU (%)", "Creem API 密钥,敏感信息不显示": "Khóa API Creem, thông tin nhạy cảm không được hiển thị", "Creem Setting Tips": "Creem chỉ hỗ trợ các sản phẩm có số tiền cố định được thiết lập sẵn. Các sản phẩm này và giá của chúng cần được tạo và cấu hình trước trên trang web Creem, vì vậy việc nạp tiền số tiền động tùy chỉnh không được hỗ trợ. Cấu hình tên sản phẩm và giá trên Creem, lấy ID sản phẩm, sau đó điền vào sản phẩm bên dưới. Đặt số tiền nạp và giá hiển thị cho sản phẩm này trong API mới.", "Creem 介绍": "Creem là đối tác thanh toán mà bạn luôn xứng đáng có được, chúng tôi phấn đấu cho sự đơn giản và thẳng thắn trên các API của mình.", "Creem 充值": "Nạp tiền Creem", "Creem 设置": "Cài đặt Creem", - "default为默认设置,可单独设置每个分类的安全等级": "\"default\" là cài đặt mặc định, và mỗi danh mục có thể được đặt riêng", - "default为默认设置,可单独设置每个模型的版本": "\"default\" là cài đặt mặc định, và mỗi mô hình có thể được đặt riêng", "Dify渠道只适配chatflow和agent,并且agent不支持图片!": "Kênh Dify chỉ hỗ trợ chatflow và agent, và agent không hỗ trợ hình ảnh!", "Discord": "Discord", "Discord Client ID": "Discord Client ID", @@ -109,10 +103,11 @@ "Discovery scopes": "Discovery scopes", "Discovery 建议 scopes:": "Discovery scopes được đề xuất:", "EUR (欧元)": "EUR (Euro)", - "false": "sai", "GC 已执行": "GC đã thực thi", "GC 执行失败": "Thực thi GC thất bại", "GC 次数": "Số lần GC", + "GPU/容器": "GPU/Container", + "GPU数量": "Number of GPUs", "Gemini安全设置": "Cài đặt an toàn Gemini", "Gemini思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Thích ứng tư duy Gemini BudgetTokens = MaxTokens * Tỷ lệ phần trăm BudgetTokens", "Gemini思考适配设置": "Cài đặt thích ứng tư duy Gemini", @@ -127,14 +122,10 @@ "Gotify服务器地址": "Địa chỉ máy chủ Gotify", "Gotify服务器地址必须以http://或https://开头": "Địa chỉ máy chủ Gotify phải bắt đầu bằng http:// hoặc https://", "Gotify通知": "Thông báo Gotify", - "GPU/容器": "GPU/Container", - "GPU数量": "Number of GPUs", "Grok设置": "Cài đặt Grok", "Haiku 模型": "Model Haiku", "Homepage URL 填": "Điền URL trang chủ", "ID": "ID", - "include_obfuscation 用于控制 Responses 流混淆字段。默认关闭以避免客户端关闭该安全保护": "include_obfuscation kiểm soát trường làm mờ trong luồng Responses. Mặc định tắt để tránh client vô hiệu hóa bảo vệ bảo mật này", - "inference_geo 字段用于控制 Claude 数据驻留推理区域。默认关闭以避免未经授权透传地域信息": "Trường inference_geo kiểm soát vùng lưu trữ dữ liệu suy luận của Claude. Mặc định tắt để ngăn truyền thông tin địa lý trái phép", "IP": "IP", "IP白名单": "IP Whitelist", "IP白名单(支持CIDR表达式)": "Danh sách trắng IP (hỗ trợ biểu thức CIDR)", @@ -144,6 +135,7 @@ "JSON 已格式化": "JSON đã được định dạng", "JSON 文本": "Văn bản JSON", "JSON 无效": "JSON không hợp lệ", + "JSON 格式参考": "JSON Reference", "JSON 模式": "Chế độ JSON", "JSON 模式支持手动输入或上传服务账号 JSON": "Chế độ JSON hỗ trợ nhập thủ công hoặc tải lên JSON tài khoản dịch vụ", "JSON格式密钥,请确保格式正确": "Khóa định dạng JSON, vui lòng đảm bảo định dạng chính xác", @@ -161,8 +153,8 @@ "LinuxDO": "LinuxDO", "LinuxDO ID": "LinuxDO ID", "Logo 图片地址": "Địa chỉ hình ảnh Logo", - "Midjourney 任务记录": "Hồ sơ tác vụ Midjourney", "MIT许可证": "Giấy phép MIT", + "Midjourney 任务记录": "Hồ sơ tác vụ Midjourney", "New API项目仓库地址:": "Địa chỉ kho dự án New API: ", "NewAPI 默认不会将入口请求的 User-Agent 透传到上游渠道;该条件仅用于识别访问本站点的客户端。": "NewAPI mặc định không truyền User-Agent của yêu cầu đến kênh upstream; điều kiện này chỉ dùng để nhận diện client truy cập trang web này.", "OAuth Client ID": "OAuth Client ID", @@ -173,6 +165,7 @@ "Ollama 模型管理": "Ollama Model Management", "Ollama 版本信息": "Ollama Version Info", "Opus 模型": "Model Opus", + "POST 参数": "Tham số POST", "Passkey": "Passkey", "Passkey 已解绑": "Đã xóa Passkey", "Passkey 已重置": "Passkey đã được đặt lại", @@ -181,54 +174,50 @@ "Passkey 注册成功": "Đăng ký Passkey thành công", "Passkey 登录": "Đăng nhập Passkey", "Ping间隔(秒)": "Khoảng thời gian Ping (giây)", - "POST 参数": "Tham số POST", - "price_xxx 的商品价格 ID,新建产品后可获得": "ID giá sản phẩm cho price_xxx, có sẵn sau khi tạo sản phẩm mới", "Prompt cache hit tokens": "Prompt cache hit tokens", "Prompt tokens": "Prompt tokens", "Reasoning Effort": "Nỗ lực suy luận", "Recharge Quota": "Hạn ngạch nạp tiền", "Request ID": "Request ID", - "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "Trường safety_identifier giúp OpenAI xác định người dùng ứng dụng có thể vi phạm chính sách sử dụng. Tắt theo mặc định để bảo vệ quyền riêng tư của người dùng", - "Scopes(可选)": "Scopes (tùy chọn)", - "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "Trường service_tier được sử dụng để chỉ định cấp độ dịch vụ. Cho phép truyền qua có thể dẫn đến việc tính phí thực tế cao hơn dự kiến. Tắt theo mặc định để tránh phí bổ sung", - "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "Khóa Stripe cho sk_xxx hoặc rk_xxx, thông tin nhạy cảm không được hiển thị", "SMTP 发送者邮箱": "Email người gửi SMTP", "SMTP 服务器地址": "Địa chỉ máy chủ SMTP", "SMTP 端口": "Cổng SMTP", "SMTP 访问凭证": "Thông tin xác thực truy cập SMTP", "SMTP 账户": "Tài khoản SMTP", - "Sonnet 模型": "Model Sonnet", "SSE 事件": "Sự kiện SSE", "SSE数据流": "Luồng dữ liệu SSE", "SSRF防护开关详细说明": "Công tắc chính kiểm soát xem bảo vệ SSRF có được bật hay không. Khi tắt, tất cả các kiểm tra SSRF sẽ bị bỏ qua, cho phép truy cập vào bất kỳ URL nào. ⚠️ Chỉ tắt tính năng này trong môi trường hoàn toàn tin cậy.", "SSRF防护设置": "Cài đặt bảo vệ SSRF", "SSRF防护详细说明": "Bảo vệ SSRF ngăn chặn người dùng độc hại sử dụng máy chủ của bạn để truy cập tài nguyên mạng nội bộ. Cấu hình danh sách trắng cho các tên miền/IP đáng tin cậy và hạn chế các cổng được phép. Áp dụng cho tải xuống tệp, webhook và thông báo.", - "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "Trường store ủy quyền cho OpenAI lưu trữ dữ liệu yêu cầu để đánh giá và tối ưu hóa sản phẩm. Tắt theo mặc định. Bật có thể khiến Codex hoạt động không chính xác", + "Scopes(可选)": "Scopes (tùy chọn)", + "Sonnet 模型": "Model Sonnet", "Stripe 设置": "Cài đặt Stripe", "Stripe/Creem 商品ID(可选)": "ID sản phẩm Stripe/Creem (tùy chọn)", "Stripe/Creem 需在第三方平台创建商品并填入 ID": "Sản phẩm Stripe/Creem phải được tạo trên nền tảng bên thứ ba và điền ID", + "TTL(秒)": "TTL (giây)", + "TTL(秒,0 表示默认)": "TTL (giây, 0 là mặc định)", "Telegram": "Telegram", "Telegram Bot Token": "Telegram Bot Token", "Telegram Bot 名称": "Tên Telegram Bot", "Telegram ID": "Telegram ID", "Token Endpoint": "Token Endpoint", - "token 会按倍率换算成“额度/次数”,请求结束后再做差额结算(补扣/返还)。": "Token được quy đổi thành hạn mức/số lần theo tỷ lệ. Sau khi yêu cầu hoàn tất, chênh lệch sẽ được quyết toán (trừ thêm/hoàn trả).", "Total tokens": "Total tokens", - "true": "đúng", - "TTL(秒,0 表示默认)": "TTL (giây, 0 là mặc định)", - "TTL(秒)": "TTL (giây)", "Turnstile Secret Key": "Turnstile Secret Key", "Turnstile Site Key": "Turnstile Site Key", - "Unix时间戳": "Dấu thời gian Unix", - "Uptime Kuma地址": "Địa chỉ Uptime Kuma", - "Uptime Kuma监控分类管理,可以配置多个监控分类用于服务状态展示(最多20个)": "Quản lý danh mục giám sát Uptime Kuma, bạn có thể cấu hình nhiều danh mục giám sát để hiển thị trạng thái dịch vụ (tối đa 20)", "URL 标识,只能包含小写字母、数字和连字符": "Định danh URL, chỉ cho phép chữ thường, số và dấu gạch ngang", "URL链接": "Liên kết URL", "USD (美元)": "USD (Đô la Mỹ)", + "Unix时间戳": "Dấu thời gian Unix", + "Uptime Kuma地址": "Địa chỉ Uptime Kuma", + "Uptime Kuma监控分类管理,可以配置多个监控分类用于服务状态展示(最多20个)": "Quản lý danh mục giám sát Uptime Kuma, bạn có thể cấu hình nhiều danh mục giám sát để hiển thị trạng thái dịch vụ (tối đa 20)", "User Info Endpoint": "User Info Endpoint", "User-Agent include(每行一个,可不写)": "User-Agent include (mỗi dòng một mục, tùy chọn)", "Value 正则": "Regex giá trị", "Vertex AI 不支持 functionResponse.id 字段,开启后将自动移除该字段": "Vertex AI không hỗ trợ trường functionResponse.id. Khi bật, trường này sẽ tự động bị xóa", + "WeChat Server 服务器地址": "Địa chỉ máy chủ WeChat Server", + "WeChat Server 访问凭证": "Thông tin xác thực truy cập WeChat Server", + "Web 搜索调用 {{webSearchCallCount}} 次": "Đã gọi tìm kiếm Web {{webSearchCallCount}} lần", + "Web 搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Tìm kiếm Web: {{count}} / 1K * đơn giá {{price}} * {{ratioType}} {{ratio}} = {{amount}}", "Webhook 密钥": "Khóa Webhook", "Webhook 签名密钥": "Khóa chữ ký Webhook", "Webhook地址": "URL Webhook", @@ -236,49 +225,89 @@ "Webhook请求结构说明": "Mô tả cấu trúc yêu cầu Webhook", "Webhook通知": "Thông báo Webhook", "Web搜索价格:{{symbol}}{{price}} / 1K 次": "Giá tìm kiếm Web: {{symbol}}{{price}} / 1K yêu cầu", - "WeChat Server 服务器地址": "Địa chỉ máy chủ WeChat Server", - "WeChat Server 访问凭证": "Thông tin xác thực truy cập WeChat Server", "Well-Known URL": "Well-Known URL", "Well-Known URL 必须以 http:// 或 https:// 开头": "Well-Known URL phải bắt đầu bằng http:// hoặc https://", - "whsec_xxx 的 Webhook 签名密钥,敏感信息不显示": "Khóa chữ ký Webhook cho whsec_xxx, thông tin nhạy cảm không được hiển thị", "Worker地址": "Địa chỉ Worker", "Worker密钥": "Khóa Worker", + "[最多请求次数]和[最多请求完成次数]的最大值为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.", + "auto分组调用链路": "chuỗi gọi nhóm tự động", + "common.changeLanguage": "Thay đổi ngôn ngữ", + "context_int/context_string 从请求上下文读取;gjson 从入口请求的 JSON body 按 gjson path 读取。": "context_int/context_string đọc từ context yêu cầu; gjson đọc từ JSON body yêu cầu đầu vào theo gjson path.", + "default 和 vip 只能由管理员在「用户管理」中分配给用户。适用于按用户等级定价、内部测试等不希望用户自主选择的场景。": "default and vip can only be assigned to users by admin in \"User Management\". Suitable for tiered pricing, internal testing, or other scenarios where user self-selection is not desired.", + "default为默认设置,可单独设置每个分类的安全等级": "\"default\" là cài đặt mặc định, và mỗi danh mục có thể được đặt riêng", + "default为默认设置,可单独设置每个模型的版本": "\"default\" là cài đặt mặc định, và mỗi mô hình có thể được đặt riêng", + "false": "sai", + "include_obfuscation 用于控制 Responses 流混淆字段。默认关闭以避免客户端关闭该安全保护": "include_obfuscation kiểm soát trường làm mờ trong luồng Responses. Mặc định tắt để tránh client vô hiệu hóa bảo vệ bảo mật này", + "inference_geo 字段用于控制 Claude 数据驻留推理区域。默认关闭以避免未经授权透传地域信息": "Trường inference_geo kiểm soát vùng lưu trữ dữ liệu suy luận của Claude. Mặc định tắt để ngăn truyền thông tin địa lý trái phép", + "price_xxx 的商品价格 ID,新建产品后可获得": "ID giá sản phẩm cho price_xxx, có sẵn sau khi tạo sản phẩm mới", + "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "Trường safety_identifier giúp OpenAI xác định người dùng ứng dụng có thể vi phạm chính sách sử dụng. Tắt theo mặc định để bảo vệ quyền riêng tư của người dùng", + "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "Trường service_tier được sử dụng để chỉ định cấp độ dịch vụ. Cho phép truyền qua có thể dẫn đến việc tính phí thực tế cao hơn dự kiến. Tắt theo mặc định để tránh phí bổ sung", + "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "Khóa Stripe cho sk_xxx hoặc rk_xxx, thông tin nhạy cảm không được hiển thị", + "standard 已被移除,vip 用户看不到": "standard has been removed, vip users cannot see it", + "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "Trường store ủy quyền cho OpenAI lưu trữ dữ liệu yêu cầu để đánh giá và tối ưu hóa sản phẩm. Tắt theo mặc định. Bật có thể khiến Codex hoạt động không chính xác", + "token 会按倍率换算成“额度/次数”,请求结束后再做差额结算(补扣/返还)。": "Token được quy đổi thành hạn mức/số lần theo tỷ lệ. Sau khi yêu cầu hoàn tất, chênh lệch sẽ được quyết toán (trừ thêm/hoàn trả).", + "true": "đúng", + "whsec_xxx 的 Webhook 签名密钥,敏感信息不显示": "Khóa chữ ký Webhook cho whsec_xxx, thông tin nhạy cảm không được hiển thị", + "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", + "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", + "{{name}} ID": "{{name}} ID", + "{{ratioType}} {{ratio}}": "{{ratioType}} {{ratio}}", + "{{ratioType}} {{ratio}}x": "{{ratioType}} {{ratio}}x", + "| 基于": " | Dựa trên ", + "© {{currentYear}}": "© {{currentYear}}", + "• 视频服务商的跨域限制": "• Cross-origin limitations from the video provider", + "• 防盗链保护机制": "• Hotlink protection mechanisms", + "• 需要特定的请求头或认证": "• Specific headers or authentication are required", + "「用户可选」决定用户创建令牌时能否自主选择该分组。未勾选的分组只能由管理员在后台分配给用户,不会出现在用户的令牌创建页面中。": "\"User Selectable\" controls whether users can choose this group when creating tokens. Unchecked groups can only be assigned by admin and won't appear in the token creation page.", "一个月": "Một tháng", "一天": "Một ngày", "一小时": "Một giờ", "一次调用消耗多少刀,优先级大于模型倍率": "Một cuộc gọi tốn bao nhiêu USD, ưu tiên hơn tỷ lệ mô hình", - "一行一个,不区分大小写": "Mỗi dòng một cái, không phân biệt chữ hoa chữ thường", "一行一个屏蔽词,不需要符号分割": "Mỗi dòng một từ bị chặn, không cần ký hiệu phân cách", + "一行一个,不区分大小写": "Mỗi dòng một cái, không phân biệt chữ hoa chữ thường", "一键填充到 FluentRead": "Điền vào FluentRead bằng một cú nhấp chuột", + "三种操作的区别:": "Differences between the three operations:", "上一个表单块": "Khối biểu mẫu trước", "上一步": "Trước", "上次保存: ": "Lần lưu cuối: ", "上游倍率同步": "Đồng bộ hóa tỷ lệ thượng nguồn", + "上游模型管理": "Quản lý mô hình thượng nguồn", "上游返回": "Upstream response", "下一个表单块": "Khối biểu mẫu tiếp theo", "下一步": "Tiếp theo", "下午好": "Chào buổi chiều", "下载日志": "Download Logs", + "下面展示这个模型保存后会写入哪些后端字段,便于和原始 JSON 编辑框保持一致。": "Bên dưới hiển thị các trường backend sẽ được ghi sau khi lưu, giúp bạn dễ đối chiếu với ô chỉnh sửa JSON gốc.", + "不会出现": "will not appear", "不再提醒": "Không nhắc lại", + "不勾选用户可选": "Not user-selectable", "不升级": "Không nâng cấp", + "不变": "unchanged", "不同用户分组的价格信息": "Thông tin giá cho các nhóm người dùng khác nhau", "不填则为模型列表第一个": "Mô hình đầu tiên trong danh sách nếu để trống", "不建议使用": "Không khuyến khích sử dụng", "不支持": "Không hỗ trợ", "不是合法的 JSON 字符串": "Không phải là chuỗi JSON hợp lệ", "不更改": "Không thay đổi", + "不配置特殊倍率时:": "Without special ratios:", + "不配置规则时,所有用户看到的下拉框一样:": "Without rules, all users see the same dropdown:", "不重置": "Không đặt lại", + "不重试": "Không thử lại", "不限": "Không giới hạn", "不限制": "Không giới hạn", "与本地相同": "Giống như cục bộ", "专属倍率": "Tỷ lệ nhóm độc quyền", + "专属分组": "Exclusive group", + "两个分组都勾选了「用户可选」,所以用户创建令牌时可以看到这两个选项:": "Both groups have \"User Selectable\" checked, so users can see these two options when creating tokens:", "两次输入的密码不一致": "Hai mật khẩu đã nhập không khớp", "两次输入的密码不一致!": "Mật khẩu nhập hai lần không nhất quán!", "两步验证": "Xác thực hai yếu tố", - "两步验证(2FA)为您的账户提供额外的安全保护。启用后,登录时需要输入密码和验证器应用生成的验证码。": "Xác thực hai yếu tố (2FA) cung cấp bảo vệ bảo mật bổ sung cho tài khoản của bạn. Sau khi bật, bạn cần nhập mật khẩu và mã xác minh được tạo bởi ứng dụng xác thực khi đăng nhập.", "两步验证启用成功!": "Đã bật xác thực hai yếu tố thành công!", "两步验证已禁用": "Xác thực hai yếu tố đã bị vô hiệu hóa", "两步验证设置": "Cài đặt xác thực hai yếu tố", + "两步验证(2FA)为您的账户提供额外的安全保护。启用后,登录时需要输入密码和验证器应用生成的验证码。": "Xác thực hai yếu tố (2FA) cung cấp bảo vệ bảo mật bổ sung cho tài khoản của bạn. Sau khi bật, bạn cần nhập mật khẩu và mã xác minh được tạo bởi ứng dụng xác thực khi đăng nhập.", "个": "cái", "个GPU": " GPUs", "个人中心": "Trung tâm cá nhân", @@ -296,6 +325,7 @@ "个生效中": "gói đăng ký đang hiệu lực", "个部署吗?此操作不可逆。": " deployments? This operation cannot be undone.", "中午好": "Chào buổi trưa", + "为 vip 用户配置规则:": "Configure rules for vip users:", "为一个 JSON 对象,例如:{\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}": "Là một đối tượng JSON, ví dụ: {\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}", "为一个 JSON 数组,例如:[10, 20, 50, 100, 200, 500]": "Là một mảng JSON, ví dụ: [10, 20, 50, 100, 200, 500]", "为一个 JSON 文本": "Là một văn bản JSON", @@ -310,7 +340,9 @@ "为一个 JSON 文本,键为组名称,值为倍率": "Là một văn bản JSON với tên nhóm làm khóa và tỷ lệ làm giá trị", "为了保护账户安全,请验证您的两步验证码。": "Để bảo vệ an toàn tài khoản, vui lòng xác minh mã xác thực hai yếu tố của bạn.", "为了保护账户安全,请验证您的身份。": "Để bảo vệ an toàn tài khoản, vui lòng xác minh danh tính của bạn.", + "为什么 default 不勾选「用户可选」?": "Why is default not set as \"User Selectable\"?", "为保证匹配准确,请确保客户端直连本站点(避免反向代理/网关改写 User-Agent)。": "Để đảm bảo khớp chính xác, hãy đảm bảo client kết nối trực tiếp đến trang web này (tránh reverse proxy/gateway ghi đè User-Agent).", + "为特定用户分组配置可用分组的增减规则。「添加」为该分组新增可用分组,「移除」移除默认可用分组,「追加」直接追加分组": "Configure add/remove rules for specific user groups. \"Add\" adds a new selectable group, \"Remove\" removes a default selectable group, \"Append\" directly appends a group", "为空则默认使用服务器地址,多个 Origin 用逗号分隔,例如 https://newapi.pro,https://newapi.com ,注意不能携带[],需使用https": "Nếu để trống, mặc định sử dụng địa chỉ máy chủ. Nhiều Origin được phân tách bằng dấu phẩy, ví dụ: https://newapi.pro,https://newapi.com. Lưu ý: không được chứa [], phải sử dụng https", "主模型": "Model chính", "主页链接填": "Nhập liên kết trang chủ", @@ -321,6 +353,8 @@ "产品名称": "Tên sản phẩm", "产品配置": "Cấu hình sản phẩm", "产品配置错误,请联系管理员": "Product configuration error, please contact the administrator", + "享受 8 折": "20% off", + "什么是分组?": "What are groups?", "仅为使用OpenAI格式的Gemini/Vertex渠道填充thoughtSignature": "Chỉ điền thoughtSignature cho các kênh Gemini/Vertex sử dụng định dạng OpenAI", "仅会覆盖你勾选的字段,未勾选的字段保持本地不变。": "Chỉ các trường được chọn mới bị ghi đè, các trường không được chọn vẫn giữ nguyên cục bộ.", "仅供参考,以实际扣费为准": "Chỉ mang tính tham khảo, việc khấu trừ thực tế sẽ được ưu tiên", @@ -345,14 +379,19 @@ "今日关闭": "Đóng hôm nay", "今日已签到": "Đã đăng nhập hôm nay", "今日已签到,累计签到": "Đã đăng nhập hôm nay, tổng số lần đăng nhập", + "从 0.5 降到 0.3": "reduced from 0.5 to 0.3", + "从剪贴板粘贴配置": "Dán cấu hình", "从官方模型库同步": "Đồng bộ từ thư viện mô hình chính thức", "从认证器应用中获取验证码,或使用备用码": "Lấy mã xác minh từ ứng dụng xác thực, hoặc sử dụng mã dự phòng", "从配置文件同步": "Đồng bộ từ tệp cấu hình", + "从默认列表中去掉一个分组": "Remove a group from the default list", "代理地址": "Địa chỉ proxy", "代理设置": "Cài đặt proxy", "代码已复制到剪贴板": "Mã đã được sao chép vào khay nhớ tạm", "令牌": "Mã thông báo", "令牌分组": "Nhóm mã thông báo", + "令牌分组设为 auto 时,按以下顺序依次尝试选择可用分组,排在前面的优先级更高": "When token group is set to auto, groups are selected in order of priority, with higher priority groups listed first", + "令牌分组设为 auto 时,系统按优先级顺序自动选择一个可用分组。": "When token group is set to auto, the system automatically selects an available group by priority.", "令牌分组,默认为用户的分组": "Nhóm mã thông báo, mặc định là nhóm của bạn", "令牌创建成功,请在列表页面点击复制获取令牌!": "Tạo mã thông báo thành công, vui lòng nhấp vào sao chép trên trang danh sách để lấy mã thông báo!", "令牌名称": "Tên mã thông báo", @@ -365,9 +404,9 @@ "以及": "và", "仪表盘设置": "Cài đặt bảng điều khiển", "价格": "Giá cả", - "价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}}": "Price: {{symbol}}{{price}} * {{ratioType}}: {{ratio}}", - "价格:${{price}} * {{ratioType}}:{{ratio}}": "Giá: ${{price}} * {{ratioType}}: {{ratio}}", + "价格摘要": "Tóm tắt giá", "价格暂时不可用,请稍后重试": "Price temporarily unavailable, please try again later", + "价格模式(默认)": "Chế độ giá (mặc định)", "价格计算中...": "Calculating price...", "价格计算失败": "Price calculation failed", "价格计算失败: ": "Price calculation failed: ", @@ -375,6 +414,8 @@ "价格设置方式": "Phương thức cấu hình giá", "价格重新计算中...": "Recalculating price...", "价格预估": "Price Estimate", + "价格:${{price}} * {{ratioType}}:{{ratio}}": "Giá: ${{price}} * {{ratioType}}: {{ratio}}", + "价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}}": "Price: {{symbol}}{{price}} * {{ratioType}}: {{ratio}}", "任一满足(OR)": "Bất kỳ khớp (OR)", "任务 ID": "ID tác vụ", "任务ID": "ID tác vụ", @@ -397,7 +438,6 @@ "作用域:包含规则名称": "Phạm vi: Bao gồm tên quy tắc", "你似乎并没有修改什么": "Bạn dường như không sửa đổi gì cả", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "You can manually add them under “Custom model names”, click Fill and submit, or use the actions below to handle them automatically.", - "使用 {{name}} 继续": "Tiếp tục với {{name}}", "使用 Discord 继续": "Continue with Discord", "使用 GitHub 继续": "Tiếp tục với GitHub", "使用 JSON 对象格式,格式为:{\"组名\": [最多请求次数, 最多请求完成次数]}": "Sử dụng định dạng đối tượng JSON, định dạng: {\"group_name\": [max_requests, max_completions]}", @@ -406,36 +446,42 @@ "使用 Passkey 实现免密且更安全的登录体验": "Sử dụng Passkey để trải nghiệm đăng nhập không cần mật khẩu và an toàn hơn", "使用 Passkey 登录": "Đăng nhập bằng Passkey", "使用 Passkey 验证": "Xác minh bằng Passkey", + "使用 {{name}} 继续": "Tiếp tục với {{name}}", "使用 微信 继续": "Tiếp tục với WeChat", "使用 用户名 注册": "Đăng ký bằng Tên người dùng", "使用 邮箱或用户名 登录": "Đăng nhập bằng Email hoặc Tên người dùng", "使用ID排序": "Sắp xếp theo ID", + "使用分组": "Using Group", "使用日志": "Nhật ký sử dụng", "使用模式": "Chế độ sử dụng", "使用统计": "Thống kê sử dụng", - "使用认证器应用(如 Google Authenticator、Microsoft Authenticator)扫描下方二维码:": "Sử dụng ứng dụng xác thực (như Google Authenticator, Microsoft Authenticator) để quét mã QR bên dưới:", "使用认证器应用扫描二维码": "Quét mã QR bằng ứng dụng xác thực", + "使用认证器应用(如 Google Authenticator、Microsoft Authenticator)扫描下方二维码:": "Sử dụng ứng dụng xác thực (như Google Authenticator, Microsoft Authenticator) để quét mã QR bên dưới:", + "使用说明": "Guide", "例如 /var/cache/new-api": "VD: /var/cache/new-api", - "例如 €, £, Rp, ₩, ₹...": "Ví dụ, €, £, Rp, ₩, ₹...", "例如 https://docs.newapi.pro": "Ví dụ, https://docs.newapi.pro", - "例如:": "Ví dụ:", + "例如 €, £, Rp, ₩, ₹...": "Ví dụ, €, £, Rp, ₩, ₹...", "例如: /bin/bash -c \"python app.py\"": "e.g.: /bin/bash -c \"python app.py\"", "例如: nginx:latest": "e.g.: nginx:latest", "例如: socks5://user:pass@host:port": "ví dụ: socks5://user:pass@host:port", + "例如发卡网站的购买链接": "Ví dụ, liên kết mua hàng từ trang web phát hành thẻ", + "例如(全渠道):": "Ví dụ (tất cả kênh):", + "例如(指定渠道):": "Ví dụ (kênh chỉ định):", + "例如:": "Ví dụ:", "例如:-c": "e.g.: -c", "例如:/bin/bash": "e.g.: /bin/bash", "例如:0001": "ví dụ: 0001", "例如:1000": "ví dụ: 1000", "例如:100000": "Ví dụ: 100000", - "例如:2,就是最低充值2$": "ví dụ: 2, nghĩa là nạp tối thiểu $2", "例如:2000": "ví dụ: 2000", + "例如:2,就是最低充值2$": "ví dụ: 2, nghĩa là nạp tối thiểu $2", "例如:4.99": "Ví dụ: 4.99", "例如:401, 403, 429, 500-599": "VD: 401, 403, 429, 500-599", "例如:7,就是7元/美金": "ví dụ: 7, nghĩa là 7 tệ mỗi USD", + "例如:GitHub Enterprise": "VD: GitHub Enterprise", "例如:email": "VD: email", "例如:example.com": "ví dụ: example.com", "例如:github / si:google / https://example.com/logo.png / 🐱": "VD: github / si:google / https://example.com/logo.png / 🐱", - "例如:GitHub Enterprise": "VD: GitHub Enterprise", "例如:github-enterprise": "VD: github-enterprise", "例如:https://example.com/.well-known/openid-configuration": "VD: https://example.com/.well-known/openid-configuration", "例如:https://gitea.example.com": "VD: https://gitea.example.com", @@ -450,9 +496,6 @@ "例如:该请求不满足准入策略": "VD: Yêu cầu này không đáp ứng chính sách tiếp nhận", "例如:适合轻度使用": "Ví dụ: Phù hợp dùng nhẹ", "例如:需要等级 {{required}},你当前等级 {{current}}": "VD: Yêu cầu cấp {{required}}, cấp hiện tại của bạn là {{current}}", - "例如(全渠道):": "Ví dụ (tất cả kênh):", - "例如(指定渠道):": "Ví dụ (kênh chỉ định):", - "例如发卡网站的购买链接": "Ví dụ, liên kết mua hàng từ trang web phát hành thẻ", "供应商": "Nhà cung cấp", "供应商介绍": "Giới thiệu nhà cung cấp", "供应商信息:": "Thông tin nhà cung cấp:", @@ -474,11 +517,12 @@ "保存 Turnstile 设置": "Lưu cài đặt Turnstile", "保存 WeChat Server 设置": "Lưu cài đặt WeChat Server", "保存分组倍率设置": "Lưu cài đặt tỷ lệ nhóm", + "保存分组相关设置": "Lưu cài đặt liên quan đến nhóm", "保存备用码": "Lưu mã dự phòng", "保存备用码以备不时之需": "Lưu mã dự phòng cho trường hợp khẩn cấp", "保存失败": "Lưu thất bại", - "保存失败,请重试": "Lưu thất bại, vui lòng thử lại", "保存失败:": "Lưu thất bại:", + "保存失败,请重试": "Lưu thất bại, vui lòng thử lại", "保存屏蔽词过滤设置": "Lưu cài đặt lọc từ bị chặn", "保存性能设置": "Lưu cài đặt hiệu suất", "保存成功": "Lưu thành công", @@ -493,7 +537,9 @@ "保存设置": "Lưu cài đặt", "保存通用设置": "Lưu cài đặt chung", "保存邮箱域名白名单设置": "Lưu cài đặt danh sách trắng tên miền email", + "保存预览": "Xem trước khi lưu", "保存额度设置": "Lưu cài đặt hạn ngạch", + "保留": "kept", "保留原值(目标已有值时不覆盖)": "Giữ giá trị gốc (không ghi đè nếu mục tiêu đã có giá trị)", "保留天数": "Số ngày giữ lại", "保留文件数": "Số tệp giữ lại", @@ -510,18 +556,20 @@ "倍率信息": "Thông tin tỷ lệ", "倍率是为了方便换算不同价格的模型": "Độ phóng đại là để tạo điều kiện chuyển đổi các mô hình có giá khác nhau.", "倍率模式": "Chế độ tỷ lệ", + "倍率用于计费乘数,勾选「用户可选」后用户可在创建令牌时选择该分组": "Ratio is the billing multiplier. Check \"User Selectable\" to let users pick this group when creating tokens", "倍率类型": "Loại tỷ lệ", + "假设再加两个分组 default 和 vip,但不勾选用户可选:": "Now add two more groups default and vip, but without checking User Selectable:", "偏好设置": "Tùy chọn", "停止测试": "Dừng kiểm tra", "停止重试": "Dừng thử lại", "停用": "Vô hiệu hóa", "允许 AccountFilter 参数": "Cho phép tham số AccountFilter", "允许 HTTP 协议图片请求(适用于自部署代理)": "Cho phép yêu cầu hình ảnh giao thức HTTP (đối với proxy tự triển khai)", + "允许 Turnstile 用户校验": "Cho phép xác minh người dùng Turnstile", "允许 inference_geo 透传": "Cho phép truyền inference_geo", "允许 safety_identifier 透传": "Cho phép safety_identifier truyền qua", "允许 service_tier 透传": "Cho phép service_tier truyền qua", "允许 stream_options.include_obfuscation 透传": "Cho phép truyền stream_options.include_obfuscation", - "允许 Turnstile 用户校验": "Cho phép xác minh người dùng Turnstile", "允许不安全的 Origin(HTTP)": "Cho phép Origin không an toàn (HTTP)", "允许回调(会泄露服务器 IP 地址)": "Cho phép gọi lại (sẽ làm lộ địa chỉ IP máy chủ)", "允许在 Stripe 支付中输入促销码": "Cho phép nhập mã khuyến mãi khi thanh toán Stripe", @@ -542,13 +590,13 @@ "允许重试": "Cho phép thử lại", "元": "CNY", "充值": "Nạp tiền", - "充值价格(x元/美金)": "Giá nạp (x tệ/đô la)", "充值价格显示": "Giá nạp", + "充值价格(x元/美金)": "Giá nạp (x tệ/đô la)", "充值分组倍率": "Tỷ lệ nhóm nạp tiền", "充值分组倍率不是合法的 JSON 字符串": "Tỷ lệ nhóm nạp tiền không phải là chuỗi JSON hợp lệ", "充值数量": "Số lượng nạp", - "充值数量,最低 ": "Số lượng nạp, tối thiểu", "充值数量不能小于": "Số tiền nạp không được nhỏ hơn", + "充值数量,最低 ": "Số lượng nạp, tối thiểu", "充值方式设置": "Cài đặt phương thức nạp tiền", "充值方式设置不是合法的 JSON 字符串": "Cài đặt phương thức nạp tiền không phải là chuỗi JSON hợp lệ", "充值确认": "Xác nhận nạp tiền", @@ -564,8 +612,8 @@ "兑换成功!": "Đổi thành công!", "兑换码充值": "Nạp tiền bằng mã đổi thưởng", "兑换码创建成功": "Đã tạo mã đổi thưởng", - "兑换码创建成功,是否下载兑换码?": "Tạo mã đổi thưởng thành công. Bạn có muốn tải xuống không?", "兑换码创建成功!": "Tạo mã đổi thưởng thành công!", + "兑换码创建成功,是否下载兑换码?": "Tạo mã đổi thưởng thành công. Bạn có muốn tải xuống không?", "兑换码将以文本文件的形式下载,文件名为兑换码的名称。": "Mã đổi thưởng sẽ được tải xuống dưới dạng tệp văn bản, với tên tệp là tên mã đổi thưởng.", "兑换码更新成功!": "Cập nhật mã đổi thưởng thành công!", "兑换码生成管理": "Quản lý tạo mã đổi thưởng", @@ -610,8 +658,8 @@ "关闭": "Đóng", "关闭侧边栏": "Đóng thanh bên", "关闭公告": "Đóng thông báo", - "关闭后,此模型将不会被“同步官方”自动覆盖或创建": "Sau khi đóng, mô hình này sẽ không tự động bị ghi đè hoặc tạo bởi \"Đồng bộ chính thức\"", "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?": "Sau khi đóng, thông báo này sẽ không còn hiển thị nữa (chỉ với trình duyệt này). Bạn có chắc muốn đóng không?", + "关闭后,此模型将不会被“同步官方”自动覆盖或创建": "Sau khi đóng, mô hình này sẽ không tự động bị ghi đè hoặc tạo bởi \"Đồng bộ chính thức\"", "关闭弹窗,已停止批量测试": "Đã đóng hộp thoại, đã dừng kiểm tra hàng loạt", "关闭提示": "Đóng thông báo", "其他": "Khác", @@ -629,17 +677,6 @@ "内置": "Tích hợp sẵn", "内置 Ollama 镜像": "Built-in Ollama Image", "再次输入部署名称": "Enter Deployment Name Again", - "最低": "thấp nhất", - "最低充值美元数量": "Số tiền nạp đô la tối thiểu", - "最后使用时间": "Thời gian sử dụng cuối cùng", - "最后更新": "Last Updated", - "最后请求": "Yêu cầu cuối cùng", - "最大GPU数量": "Max Number of GPUs", - "最大可用": "Max Available", - "最大条目数": "Số mục tối đa", - "最终抵扣": "Khấu trừ cuối cùng", - "最近一次": "Lần gần nhất", - "最近事件": "Recent Events", "写": "Ghi", "准入策略": "Chính sách tiếp nhận", "准入策略 JSON(可选)": "JSON chính sách tiếp nhận (tùy chọn)", @@ -648,14 +685,23 @@ "凭证已刷新": "Thông tin xác thực đã được làm mới", "分类名称": "Tên danh mục", "分组": "Nhóm", + "分组JSON设置": "Group JSON Settings", "分组与模型定价设置": "Cài đặt giá nhóm và mô hình", "分组价格": "Giá nhóm", "分组倍率": "Tỷ lệ nhóm", "分组倍率设置": "Cài đặt tỷ lệ nhóm", "分组倍率设置,可以在此处新增分组或修改现有分组的倍率,格式为 JSON 字符串,例如:{\"vip\": 0.5, \"test\": 1},表示 vip 分组的倍率为 0.5,test 分组的倍率为 1": "Cài đặt tỷ lệ nhóm, bạn có thể thêm nhóm mới hoặc sửa đổi tỷ lệ nhóm hiện có tại đây, định dạng dưới dạng chuỗi JSON, ví dụ: {\"vip\": 0.5, \"test\": 1}, cho biết tỷ lệ nhóm vip là 0.5, tỷ lệ nhóm test là 1", + "分组名": "Group", + "分组名称": "Group Name", + "分组名称到倍率的映射": "Mapping of group names to ratios", + "分组描述": "Group Description", + "分组是用于控制计费倍率和模型访问权限的核心概念。每个用户属于一个分组,每个令牌也可以指定使用某个分组。": "Groups are a core concept for controlling billing ratios and model access. Each user belongs to a group, and each token can be assigned to a specific group.", "分组特殊倍率": "Tỷ lệ đặc biệt của nhóm", "分组特殊可用分组": "Available special groups", + "分组相关设置": "Cài đặt liên quan đến nhóm", + "分组管理": "Group Management", "分组设置": "Cài đặt nhóm", + "分组设置使用说明": "Group Settings Guide", "分组速率配置优先级高于全局速率限制。": "Ưu tiên cấu hình tốc độ nhóm cao hơn giới hạn tốc độ toàn cầu.", "分组速率限制": "Giới hạn tốc độ nhóm", "分钟": "phút", @@ -670,7 +716,9 @@ "列出的模型将不会自动添加或移除-thinking/-nothinking 后缀": "Các mô hình được liệt kê sẽ không tự động thêm hoặc xóa hậu tố -thinking/-nothinking.", "列设置": "Cài đặt cột", "创建": "Create", + "创建令牌可选": "Selectable when creating tokens", "创建令牌默认选择auto分组,初始令牌也将设为auto(否则留空,为用户默认分组)": "Tạo mã thông báo với nhóm auto theo mặc định, mã thông báo ban đầu cũng sẽ được đặt thành auto (nếu không để trống cho nhóm mặc định của người dùng)", + "创建和管理分组": "Create and Manage Groups", "创建失败": "Tạo thất bại", "创建成功": "Tạo thành công", "创建或选择密钥时,将 Project 设置为 io.cloud": "When creating or selecting a key, set Project to io.cloud", @@ -682,6 +730,7 @@ "创建新的订阅套餐": "Tạo gói đăng ký mới", "创建新的预填组": "Tạo nhóm điền sẵn mới", "创建时间": "Thời gian tạo", + "创建渠道所需的基本信息": "Thông tin cơ bản cần thiết để tạo kênh", "创建用户": "Tạo người dùng", "初始化失败,请重试": "Khởi tạo thất bại, vui lòng thử lại", "初始化系统": "Khởi tạo hệ thống", @@ -715,13 +764,15 @@ "前往设置": "Go to Settings", "前往设置页面": "Go to Settings Page", "前缀": "Tiền tố", - "副本数量": "Number of Replicas", + "前:": "Trước:", "剩余": "Remaining", "剩余备用码:": "Mã dự phòng còn lại: ", "剩余时间": "Remaining Time", "剩余额度": "Hạn ngạch còn lại", - "剩余额度/总额度": "Còn lại/Tổng cộng", "剩余额度$": "Hạn ngạch còn lại $", + "剩余额度/总额度": "Còn lại/Tổng cộng", + "剪贴板中未检测到连接信息": "Không tìm thấy thông tin kết nối trong bộ nhớ tạm", + "副本数量": "Number of Replicas", "功能特性": "Tính năng", "加入渠道": "Join Channel", "加入预填组": "Tham gia nhóm điền sẵn", @@ -742,6 +793,7 @@ "加载详情中...": "Loading details...", "加载账单失败": "Tải hóa đơn thất bại", "加载隐私政策内容失败...": "Tải nội dung chính sách bảo mật thất bại...", + "勾选后,该分组会出现在用户创建令牌时的下拉菜单中。未勾选的分组只能由管理员分配,用户自己无法选择。": "When checked, this group appears in the dropdown when users create tokens. Unchecked groups can only be assigned by admin.", "包含": "Chứa", "包含来自未知或未标明供应商的AI模型,这些模型可能来自小型供应商或开源项目。": "Bao gồm các mô hình AI từ các nhà cung cấp không xác định hoặc không được đánh dấu, có thể đến từ các nhà cung cấp nhỏ hoặc các dự án mã nguồn mở.", "包括失败请求的次数,0代表不限制": "Bao gồm số lần yêu cầu thất bại, 0 nghĩa là không giới hạn", @@ -754,6 +806,7 @@ "单GPU小时费率": "Per GPU Hour Rate", "历史消耗": "Tiêu thụ", "原价": "Giá gốc", + "原价,和普通用户一样": "original price, same as regular users", "原因:": "Lý do: ", "原密码": "Mật khẩu cũ", "原生格式": "Định dạng gốc", @@ -788,6 +841,9 @@ "只包括请求成功的次数": "Chỉ bao gồm số lần yêu cầu thành công", "只支持HTTPS,系统将以POST方式发送通知,请确保地址可以接收POST请求": "Chỉ hỗ trợ HTTPS, hệ thống sẽ gửi thông báo qua POST, vui lòng đảm bảo địa chỉ có thể nhận yêu cầu POST", "只有当用户设置开启IP记录时,才会进行请求和错误类型日志的IP记录": "Chỉ khi người dùng đặt ghi IP, việc ghi IP của nhật ký yêu cầu và loại lỗi mới được thực hiện", + "只有配置了规则的组合才会覆盖,未配置的组合仍使用令牌分组的基础倍率。": "Only configured combinations are overridden. Unconfigured combinations still use the token group's base ratio.", + "可以根据用户分组增减令牌可选的分组范围。例如 vip 用户额外开放 premium 分组,或移除某个分组的选择权。": "Adjust the selectable group range based on user group. E.g., grant vip users access to premium, or remove access to a group.", + "可以根据用户分组设置不同的计费倍率。例如 vip 用户使用 standard 令牌时倍率从 1.0 降为 0.8。": "Set different billing ratios based on user group. E.g., vip users using standard tokens get ratio 0.8 instead of 1.0.", "可信": "Đáng tin cậy", "可在设置页面设置关于内容,支持 HTML & Markdown": "Nội dung Giới thiệu có thể được đặt trên trang cài đặt, hỗ trợ HTML & Markdown", "可手动填写,多个 scope 用空格分隔": "Có thể điền thủ công, nhiều scope phân cách bằng dấu cách", @@ -804,14 +860,16 @@ "可视化": "Trực quan hóa", "可视化倍率设置": "Cài đặt tỷ lệ mô hình trực quan", "可视化编辑": "Chỉnh sửa trực quan", - "可选,公告的补充说明": "Tùy chọn, thông tin bổ sung cho thông báo", - "可选,用于复现结果": "Tùy chọn, để tái tạo kết quả", - "可选:基于用户信息 JSON 做组合条件准入,条件不满足时返回自定义提示": "Tùy chọn: Tiếp nhận dựa trên điều kiện kết hợp từ JSON thông tin người dùng; trả về thông báo tùy chỉnh khi điều kiện không được đáp ứng", - "可选:用于自动生成端点或 Discovery URL": "Tùy chọn: Dùng để tự động tạo endpoint hoặc Discovery URL", "可选。匹配入口请求的 User-Agent;任意一行作为子串匹配(忽略大小写)即命中。": "Tùy chọn. Khớp User-Agent của yêu cầu đầu vào; bất kỳ dòng nào khớp dưới dạng chuỗi con (không phân biệt hoa thường) được tính là trúng.", "可选。对提取到的亲和 Key 做正则校验;不填表示不校验。": "Tùy chọn. Xác thực key ưu ái đã trích xuất bằng regex; để trống để bỏ qua xác thực.", "可选。对请求路径进行匹配;不填表示匹配所有路径。": "Tùy chọn. Khớp đường dẫn yêu cầu; để trống để khớp tất cả đường dẫn.", "可选值": "Giá trị tùy chọn", + "可选,公告的补充说明": "Tùy chọn, thông tin bổ sung cho thông báo", + "可选,用于复现结果": "Tùy chọn, để tái tạo kết quả", + "可选:基于用户信息 JSON 做组合条件准入,条件不满足时返回自定义提示": "Tùy chọn: Tiếp nhận dựa trên điều kiện kết hợp từ JSON thông tin người dùng; trả về thông báo tùy chỉnh khi điều kiện không được đáp ứng", + "可选:用于自动生成端点或 Discovery URL": "Tùy chọn: Dùng để tự động tạo endpoint hoặc Discovery URL", + "合计:{{total}}": "Tổng cộng: {{total}}", + "合计:文字部分 {{textTotal}} + 音频部分 {{audioTotal}} = {{total}}": "Tổng cộng: phần văn bản {{textTotal}} + phần âm thanh {{audioTotal}} = {{total}}", "同时重置消息": "Đặt lại tin nhắn đồng thời", "同步": "Đồng bộ", "同步到渠道": "Sync to Channel", @@ -826,8 +884,12 @@ "名称+密钥": "Tên + Khóa", "名称不能为空": "Tên không được để trống", "名称匹配类型": "Loại khớp tên", + "后端固定倍率:{{ratio}}。该字段仅展示换算后的价格。": "Tỷ lệ cố định từ backend: {{ratio}}. Trường này chỉ hiển thị giá sau khi quy đổi.", "后端请求失败": "Yêu cầu phụ trợ thất bại", "后缀": "Hậu tố", + "后:": "Sau:", + "向右展开": "Mở rộng sang phải", + "向左展开": "Mở rộng sang trái", "否": "Không", "启动": "Start", "启动参数 (Args)": "Startup Args", @@ -838,10 +900,10 @@ "启动部署失败": "Failed to start deployment", "启动配置": "Startup Configuration", "启用": "Bật", + "启用 Prompt 检查": "Bật kiểm tra Prompt", "启用 io.net 部署": "Enable io.net Deployment", "启用 io.net 部署开关": "Enable io.net Deployment Switch", "启用 io.net 部署时必须填写 API Key": "API Key is required when enabling io.net deployment", - "启用 Prompt 检查": "Bật kiểm tra Prompt", "启用2FA失败": "Bật xác thực hai yếu tố thất bại", "启用Claude思考适配(-thinking后缀)": "Bật thích ứng tư duy Claude (hậu tố -thinking)", "启用FunctionCall思维签名填充": "Bật điền chữ ký tư duy FunctionCall", @@ -897,14 +959,22 @@ "图标使用 react-icons(Simple Icons)或 URL/emoji,例如:github、gitlab、si:google": "Icon sử dụng react-icons (Simple Icons) hoặc URL/emoji, VD: github, gitlab, si:google", "图标使用@lobehub/icons库,如:OpenAI、Claude.Color,支持链式参数:OpenAI.Avatar.type={'platform'}、OpenRouter.Avatar.shape={'square'},查询所有可用图标请 ": "Biểu tượng sử dụng thư viện @lobehub/icons, như: OpenAI, Claude.Color, hỗ trợ tham số chuỗi: OpenAI.Avatar.type={'platform'}, OpenRouter.Avatar.shape={'square'}, truy vấn tất cả biểu tượng khả dụng vui lòng ", "图混合": "Pha trộn", + "图片倍率 {{imageRatio}}": "Hệ số hình ảnh {{imageRatio}}", "图片功能在自定义请求体模式下不可用": "Chức năng hình ảnh không khả dụng trong chế độ yêu cầu tùy chỉnh", "图片地址": "URL hình ảnh", "图片已添加": "Hình ảnh đã được thêm", "图片生成调用:{{symbol}}{{price}} / 1次": "Gọi tạo hình ảnh: {{symbol}}{{price}} / 1 lần", + "图片生成:1 次 * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Tạo ảnh: 1 lần gọi * đơn giá {{price}} * {{ratioType}} {{ratio}} = {{amount}}", + "图片输入 {{price}} / 1M tokens": "Đầu vào hình ảnh {{price}} / 1M tokens", "图片输入: {{imageRatio}}": "Đầu vào hình ảnh: {{imageRatio}}", + "图片输入价格": "Giá đầu vào hình ảnh", + "图片输入价格 {{symbol}}{{price}} / 1M tokens": "Giá đầu vào hình ảnh {{symbol}}{{price}} / 1M tokens", "图片输入价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (图片倍率: {{imageRatio}})": "Giá đầu vào hình ảnh: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (Tỷ lệ hình ảnh: {{imageRatio}})", + "图片输入价格:{{symbol}}{{price}} / 1M tokens": "Giá đầu vào hình ảnh: {{symbol}}{{price}} / 1M tokens", + "图片输入价格:{{symbol}}{{total}} / 1M tokens": "Giá đầu vào hình ảnh: {{symbol}}{{total}} / 1M tokens", "图片输入倍率(仅部分模型支持该计费)": "Tỷ lệ đầu vào hình ảnh (chỉ được hỗ trợ bởi một số mô hình để tính phí)", "图片输入相关的倍率设置,键为模型名称,值为倍率,仅部分模型支持该计费": "Cài đặt tỷ lệ liên quan đến đầu vào hình ảnh, khóa là tên mô hình, giá trị là tỷ lệ, chỉ được hỗ trợ bởi một số mô hình để tính phí", + "图片输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 图片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Đầu vào hình ảnh: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * hệ số hình ảnh {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "图生文": "Mô tả", "图生视频": "Hình ảnh sang Video", "在Gotify服务器创建应用后获得的令牌,用于发送通知": "Mã thông báo nhận được sau khi tạo ứng dụng trên máy chủ Gotify, được sử dụng để gửi thông báo", @@ -920,20 +990,27 @@ "在此输入系统名称": "Nhập tên hệ thống tại đây", "在此输入隐私政策内容,支持 Markdown & HTML 代码": "Nhập nội dung chính sách bảo mật tại đây, hỗ trợ mã Markdown & HTML", "在此输入首页内容,支持 Markdown & HTML 代码,设置后首页的状态信息将不再显示。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为首页": "Nhập nội dung trang chủ tại đây, hỗ trợ Markdown", + "在默认列表基础上新增一个分组": "Add a new group to the default list", + "场景:站点提供两个价格档位,用户可以按需选择": "Scenario: site offers two pricing tiers, users can choose as needed", + "场景:站点有 standard 和 premium 两个用户可选分组。希望 vip 用户额外看到 exclusive 分组,同时不再看到 standard 分组": "Scenario: site has standard and premium as selectable groups. Want vip users to see exclusive but not standard", + "场景:站点有 standard(倍率 1.0)和 premium(倍率 0.5)两个分组,希望 vip 用户使用 standard 令牌时也能享受折扣": "Scenario: site has standard (ratio 1.0) and premium (ratio 0.5). Want vip users to get a discount on standard tokens too", + "场景:设置自动选择优先级": "Scenario: set auto-selection priority", "域名IP过滤详细说明": "Khuyến nghị: Khi được bật, tên miền sẽ được phân giải DNS và các IP kết quả sẽ được kiểm tra xem có thuộc dải địa chỉ riêng tư hay không, ngăn chặn hiệu quả các cuộc tấn công DNS rebinding vượt qua bảo vệ SSRF. Lưu ý: Một tên miền có thể phân giải thành nhiều địa chỉ IPv4/IPv6. Nếu bạn đã cấu hình danh sách lọc IP, hãy đảm bảo nó bao gồm các địa chỉ này, nếu không truy cập có thể thất bại.", "域名白名单": "Danh sách trắng tên miền", "域名黑名单": "Danh sách đen tên miền", "基本信息": "Thông tin cơ bản", + "基础价格": "Giá cơ bản", + "基础用户": "Basic user", "填充 Codex CLI / Claude CLI 模版": "Điền mẫu Codex CLI / Claude CLI", "填充新模板": "Điền mẫu mới", "填充旧模板": "Điền mẫu cũ", "填充模板": "Điền mẫu", + "填充模板(全渠道)": "Điền mẫu (tất cả kênh)", + "填充模板(指定渠道)": "Điền mẫu (kênh được chọn)", "填充模板:等级+激活": "Điền mẫu: Cấp + Kích hoạt", "填充模板:等级提示": "Điền mẫu: Prompt cấp", "填充模板:组织或角色": "Điền mẫu: Tổ chức hoặc vai trò", "填充模板:组织提示": "Điền mẫu: Prompt tổ chức", - "填充模板(全渠道)": "Điền mẫu (tất cả kênh)", - "填充模板(指定渠道)": "Điền mẫu (kênh được chọn)", "填入": "Điền", "填入 CC Switch": "Điền CC Switch", "填入所有模型": "Điền tất cả mô hình", @@ -950,6 +1027,7 @@ "填写带https的域名,逗号分隔": "Điền tên miền có https, phân tách bằng dấu phẩy", "填写用户协议内容后,用户注册时将被要求勾选已阅读用户协议": "Sau khi điền nội dung thỏa thuận người dùng, người dùng sẽ được yêu cầu tích vào đã đọc thỏa thuận người dùng khi đăng ký", "填写隐私政策内容后,用户注册时将被要求勾选已阅读隐私政策": "Sau khi điền nội dung chính sách bảo mật, người dùng sẽ được yêu cầu tích vào đã đọc chính sách bảo mật khi đăng ký", + "填写音频补全价格前,需要先填写音频输入价格。": "Trước khi nhập giá hoàn thành âm thanh, hãy nhập giá đầu vào âm thanh trước.", "处理中": "Processing", "备份支持": "Hỗ trợ sao lưu", "备份状态": "Trạng thái sao lưu", @@ -965,6 +1043,7 @@ "复制失败": "Sao chép thất bại", "复制失败,请手动复制": "Sao chép thất bại, vui lòng sao chép thủ công", "复制失败,请手动选择文本复制": "Copy failed, please manually select and copy the text", + "复制密钥": "Sao chép khóa", "复制已选": "Sao chép đã chọn", "复制应用的令牌(Token)并填写到上方的应用令牌字段": "Sao chép mã thông báo ứng dụng và điền vào trường mã thông báo ứng dụng ở trên", "复制成功": "Sao chép thành công", @@ -977,6 +1056,7 @@ "复制渠道的所有信息": "Sao chép tất cả thông tin của kênh", "复制版本号": "Copy Version", "复制生成的密钥并粘贴到此处": "Copy the generated key and paste it here", + "复制连接信息": "Sao chép thông tin kết nối", "复制链接": "Copy link", "外接设备": "Thiết bị ngoại vi", "多个命令用空格分隔": "Multiple commands separated by spaces", @@ -990,7 +1070,6 @@ "失败原因": "Nguyên nhân thất bại", "失败后不重试": "Không thử lại sau khi thất bại", "失败后是否重试": "Thử lại khi thất bại", - "不重试": "Không thử lại", "失败时自动禁用通道": "Tự động vô hiệu hóa kênh khi thất bại", "失败重试次数": "Số lần thử lại thất bại", "奖励说明": "Mô tả phần thưởng", @@ -1000,13 +1079,13 @@ "套餐标题": "Tiêu đề gói", "套餐标题不能为空": "Tên gói không được để trống", "套餐的基本信息和定价": "Thông tin cơ bản và giá của gói", - "如:大带宽批量分析图片推荐": "ví dụ: Phân tích hàng loạt băng thông lớn đề xuất hình ảnh", - "如:香港线路": "ví dụ: Tuyến Hồng Kông", "如果亲和到的渠道失败,重试到其他渠道成功后,将亲和更新到成功的渠道。": "Nếu kênh ưu ái thất bại, sau khi thử lại thành công trên kênh khác, ưu ái sẽ được cập nhật sang kênh thành công.", "如果你对接的是上游One API或者New API等转发项目,请使用OpenAI类型,不要使用此类型,除非你知道你在做什么。": "Nếu bạn đang kết nối với các dự án chuyển tiếp One API hoặc New API thượng nguồn, vui lòng sử dụng loại OpenAI. Đừng sử dụng loại này trừ khi bạn biết mình đang làm gì.", "如果用户请求中包含系统提示词,则使用此设置拼接到用户的系统提示词前面": "Nếu yêu cầu của người dùng chứa từ nhắc hệ thống, cài đặt này sẽ được nối vào trước từ nhắc hệ thống của người dùng", "如果镜像为私有,请填写密码或Token": "If the image is private, please fill in the password or token", "如果镜像为私有,请填写用户名": "If the image is private, please fill in the username", + "如:大带宽批量分析图片推荐": "ví dụ: Phân tích hàng loạt băng thông lớn đề xuất hình ảnh", + "如:香港线路": "ví dụ: Tuyến Hồng Kông", "始终使用浅色主题": "Luôn sử dụng chủ đề sáng", "始终使用深色主题": "Luôn sử dụng chủ đề tối", "字段映射": "Ánh xạ trường", @@ -1015,6 +1094,7 @@ "字段透传控制": "Kiểm soát truyền qua trường", "字段速查": "Tra cứu nhanh trường", "存在惩罚,鼓励讨论新话题": "Phạt sự hiện diện, khuyến khích chủ đề mới", + "存在重复的分组名称:": "Duplicate group names: ", "存在重复的键名:": "Tồn tại tên khóa trùng lặp:", "安全提醒": "Nhắc nhở bảo mật", "安全设置": "Cài đặt bảo mật", @@ -1026,6 +1106,7 @@ "完成硬件类型、部署位置、副本数量等配置后,将自动计算价格": "Price will be automatically calculated after completing hardware type, deployment location, number of replicas and other configurations", "完成设置并启用两步验证": "Hoàn tất thiết lập và bật xác thực hai yếu tố", "完成进度": "Completion Progress", + "完整流程:": "Full workflow:", "完整的 Base URL,支持变量{model}": "Base URL đầy đủ, hỗ trợ biến {model}", "官方": "Chính thức", "官方文档": "Tài liệu chính thức", @@ -1038,6 +1119,7 @@ "实付金额": "Số tiền thanh toán thực tế", "实付金额:": "Số tiền thanh toán thực tế: ", "实际模型": "Mô hình thực tế", + "实际结算金额:{{symbol}}{{total}}(已包含分组价格调整)": "Khoản phí thực tế: {{symbol}}{{total}} (đã bao gồm điều chỉnh giá theo nhóm)", "实际请求体": "Thân yêu cầu thực tế", "容器": "Container", "容器ID": "Container ID", @@ -1071,7 +1153,6 @@ "密钥": "Khóa", "密钥 JSON 必须包含 access_token": "JSON khóa phải bao gồm access_token", "密钥 JSON 必须包含 account_id": "JSON khóa phải bao gồm account_id", - "密钥(编辑模式下,保存的密钥不会显示)": "Khóa (trong chế độ chỉnh sửa, khóa đã lưu sẽ không hiển thị)", "密钥去重": "Loại bỏ khóa trùng lặp", "密钥将以Bearer方式添加到请求头中,用于验证webhook请求的合法性": "Khóa sẽ được thêm vào tiêu đề yêu cầu dưới dạng Bearer để xác minh tính hợp pháp của yêu cầu webhook", "密钥已删除": "Khóa đã bị xóa", @@ -1089,10 +1170,12 @@ "密钥获取成功": "Lấy khóa thành công", "密钥输入方式": "Phương thức nhập khóa", "密钥预览": "Xem trước khóa", + "密钥(编辑模式下,保存的密钥不会显示)": "Khóa (trong chế độ chỉnh sửa, khóa đã lưu sẽ không hiển thị)", "对于官方渠道,new-api已经内置地址,除非是第三方代理站点或者Azure的特殊接入地址,否则不需要填写": "Đối với các kênh chính thức, new-api đã tích hợp sẵn địa chỉ. Trừ khi đó là trang web proxy của bên thứ ba hoặc địa chỉ truy cập đặc biệt của Azure, không cần điền vào", "对免费模型启用预消耗": "Enable pre-consumption for free models", "对域名启用 IP 过滤(推荐开启)": "Bật lọc IP cho tên miền (khuyến nghị)", "对外运营模式": "Chế độ mặc định", + "对比:不勾选「用户可选」的场景": "Comparison: groups without \"User Selectable\"", "对象清理规则": "Quy tắc dọn dẹp đối tượng", "导入": "Nhập", "导入的配置将覆盖当前设置,是否继续?": "Cấu hình đã nhập sẽ ghi đè cài đặt hiện tại, tiếp tục?", @@ -1106,11 +1189,12 @@ "将为选中的 ": "Sẽ đặt cho đã chọn ", "将仅保留第一个密钥文件,其余文件将被移除,是否继续?": "Chỉ tệp khóa đầu tiên sẽ được giữ lại, các tệp còn lại sẽ bị xóa. Tiếp tục?", "将删除": "Đang xóa", + "将删除 {{value}} 天前的日志文件。": "Tệp nhật ký cũ hơn {{value}} ngày sẽ bị xóa.", "将删除已使用、已禁用及过期的兑换码,此操作不可撤销。": "Thao tác này sẽ xóa tất cả các mã đổi thưởng đã sử dụng, bị vô hiệu hóa và hết hạn, thao tác này không thể hoàn tác.", "将删除所有仍在内存中的渠道亲和性缓存条目。": "Sẽ xóa tất cả mục bộ nhớ đệm ưu ái kênh còn trong bộ nhớ.", - "将删除 {{value}} 天前的日志文件。": "Tệp nhật ký cũ hơn {{value}} ngày sẽ bị xóa.", "将只保留最近 {{value}} 个日志文件,其余将被删除。": "Chỉ giữ lại {{value}} tệp nhật ký gần nhất; phần còn lại sẽ bị xóa.", "将大请求体临时存储到磁盘": "Lưu tạm body yêu cầu lớn vào đĩa", + "将把当前编辑中的模型 {{name}} 的价格配置,批量应用到已勾选的 {{count}} 个模型。": "Cấu hình giá của mô hình đang chỉnh sửa {{name}} sẽ được áp dụng hàng loạt cho {{count}} mô hình đã chọn.", "将清除所有保存的配置并恢复默认设置,此操作不可撤销。是否继续?": "Thao tác này sẽ xóa tất cả các cấu hình đã lưu và khôi phục cài đặt mặc định, thao tác này không thể hoàn tác. Tiếp tục?", "将清除选定时间之前的所有日志": "Thao tác này sẽ xóa tất cả nhật ký trước thời gian đã chọn", "将追加 2 条规则到现有规则列表。": "2 quy tắc sẽ được thêm vào danh sách quy tắc hiện có.", @@ -1123,10 +1207,11 @@ "展开": "Mở rộng", "展开更多": "Mở rộng thêm", "展示价格": "Giá hiển thị", + "嵌套映射:用户分组 → 使用分组 → 倍率": "Nested mapping: user group → using group → ratio", "左侧边栏个人设置": "Cài đặt cá nhân ở thanh bên trái", + "已为 ${count} 个渠道设置标签!": "Đã đặt thẻ cho ${count} kênh!", "已为 {{count}} 个模型设置{{type}}_one": "Đã đặt {{type}} cho {{count}} mô hình", "已为 {{count}} 个模型设置{{type}}_other": "Đã đặt {{type}} cho {{count}} mô hình", - "已为 ${count} 个渠道设置标签!": "Đã đặt thẻ cho ${count} kênh!", "已从 Discovery 自动填充配置": "Cấu hình đã được tự động điền từ Discovery", "已从 Discovery 获取配置,可继续手动修改所有字段。": "Đã nhận cấu hình từ Discovery. Bạn có thể tiếp tục chỉnh sửa thủ công tất cả các trường.", "已作废": "Đã vô hiệu", @@ -1141,13 +1226,15 @@ "已切换至最优倍率视图,每个模型使用其最低倍率分组": "Đã chuyển sang chế độ xem tỷ lệ tối ưu, mỗi mô hình sử dụng nhóm tỷ lệ thấp nhất của nó", "已初始化": "Đã khởi tạo", "已删除": "Đã xóa", + "已删除 ${data} 个通道!": "Đã xóa ${data} kênh!", "已删除 {{count}} 个令牌!": "Đã xóa {{count}} mã thông báo!", "已删除 {{count}} 个令牌!_other": "Deleted {{count}} tokens!", "已删除 {{count}} 条失效兑换码_one": "Đã xóa {{count}} mã đổi thưởng hết hạn", "已删除 {{count}} 条失效兑换码_other": "Đã xóa {{count}} mã đổi thưởng hết hạn", - "已删除 ${data} 个通道!": "Đã xóa ${data} kênh!", "已删除所有禁用渠道,共计 ${data} 个": "Đã xóa tất cả các kênh bị vô hiệu hóa, tổng cộng ${data}", "已删除消息及其回复": "Đã xóa tin nhắn và các câu trả lời của nó", + "已勾选": "Đã chọn", + "已勾选 {{count}} 个模型": "Đã chọn {{count}} mô hình", "已发起支付": "Đã khởi tạo thanh toán", "已发送到 Fluent": "Đã gửi đến Fluent", "已取消 Passkey 注册": "Đã hủy đăng ký Passkey", @@ -1163,8 +1250,6 @@ "已复制": "Đã sao chép", "已复制 ${count} 个模型": "Đã sao chép ${count} mô hình", "已复制 ID 到剪贴板": "ID copied to clipboard", - "已复制:": "Đã sao chép:", - "已复制:{{name}}": "Đã sao chép: {{name}}", "已复制全部数据": "Tất cả dữ liệu đã được sao chép", "已复制到剪切板": "Đã sao chép vào khay nhớ tạm", "已复制到剪贴板": "Đã sao chép vào khay nhớ tạm", @@ -1173,7 +1258,10 @@ "已复制模型名称": "Đã sao chép tên mô hình", "已复制版本号": "Version copied", "已复制自动生成的 API Key": "Auto-generated API Key copied", + "已复制:": "Đã sao chép:", + "已复制:{{name}}": "Đã sao chép: {{name}}", "已完成": "Completed", + "已将模型 {{name}} 的价格配置批量应用到 {{count}} 个模型": "Đã áp dụng hàng loạt cấu hình giá của mô hình {{name}} cho {{count}} mô hình", "已开启全局请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "Đã bật truyền qua yêu cầu toàn cục. Các tính năng tích hợp của NewAPI như ghi đè tham số, chuyển hướng mô hình và thích ứng kênh sẽ bị vô hiệu hóa. Đây không phải là thực hành tốt nhất. Nếu phát sinh vấn đề, vui lòng không gửi issue.", "已成功开始测试所有已启用通道,请刷新页面查看结果。": "Đã bắt đầu kiểm tra tất cả các kênh đã bật thành công. Vui lòng làm mới trang để xem kết quả.", "已打开授权页面": "Đã mở trang xác thực", @@ -1192,9 +1280,9 @@ "已添加": "Đã thêm", "已添加 {{count}} 个模板_other": "Đã thêm {{count}} mẫu", "已添加到白名单": "Đã thêm vào danh sách trắng", + "已清理 {{count}} 个日志文件,释放 {{size}}": "Đã dọn dẹp {{count}} tệp nhật ký, giải phóng {{size}}", "已清空": "Đã xóa sạch", "已清空测试结果": "Đã xóa kết quả kiểm tra", - "已清理 {{count}} 个日志文件,释放 {{size}}": "Đã dọn dẹp {{count}} tệp nhật ký, giải phóng {{size}}", "已生成授权凭据": "Đã tạo thông tin xác thực", "已用": "Used", "已用/剩余": "Đã dùng/Còn lại", @@ -1211,10 +1299,10 @@ "已达到购买上限": "Đã đạt giới hạn mua", "已过期": "Đã hết hạn", "已运行时间": "Uptime", + "已选择 ${count} 个渠道": "Đã chọn ${count} kênh", "已选择 {{count}} 个模型_one": "Đã chọn {{count}} mô hình", "已选择 {{count}} 个模型_other": "Đã chọn {{count}} mô hình", "已选择 {{selected}} / {{total}}": "Đã chọn {{selected}} / {{total}}", - "已选择 ${count} 个渠道": "Đã chọn ${count} kênh", "已重置为默认配置": "Đã đặt lại về cấu hình mặc định", "已销毁": "Destroyed", "币种": "Tiền tệ", @@ -1236,15 +1324,19 @@ "延长容器时长将会产生额外费用,请确认您有足够的账户余额。": "Extending container duration will incur additional charges, please ensure you have sufficient account balance.", "延长操作一旦确认无法撤销,费用将立即扣除。": "Once confirmed, the extension operation cannot be undone, and charges will be deducted immediately.", "延长时长": "Extension Duration", - "延长时长(小时)": "Extension Duration (hours)", "延长时长不能超过720小时(30天)": "Extension duration cannot exceed 720 hours (30 days)", "延长时长失败": "Failed to extend duration", "延长时长至少为1小时": "Extension duration must be at least 1 hour", + "延长时长(小时)": "Extension Duration (hours)", "建立连接时发生错误": "Đã xảy ra lỗi khi thiết lập kết nối", "建议在生产环境中使用 MySQL 或 PostgreSQL 数据库,或确保 SQLite 数据库文件已映射到宿主机的持久化存储。": "Khuyên dùng cơ sở dữ liệu MySQL hoặc PostgreSQL trong môi trường sản xuất, hoặc đảm bảo tệp cơ sở dữ liệu SQLite được ánh xạ tới bộ nhớ bền vững của máy chủ.", "开": "mở", + "开启「默认使用 auto 分组」后,新建令牌和初始令牌都会自动设为 auto。": "After enabling \"Default to auto group\", new tokens and initial tokens will be set to auto.", "开启之后会清除用户提示词中的": "Sau khi bật, từ nhắc của người dùng sẽ bị xóa", "开启之后将上游地址替换为服务器地址": "Sau khi bật, địa chỉ thượng nguồn sẽ được thay thế bằng địa chỉ máy chủ", + "开启后不限制:必须设置模型倍率": "Sau khi bật, không giới hạn: phải đặt tỷ lệ mô hình", + "开启后创建令牌默认选择auto分组,初始令牌也将设为auto": "When enabled, new tokens default to auto group, initial tokens are also set to auto", + "开启后未登录用户无法访问模型广场": "Khi bật, người dùng chưa xác thực không thể truy cập thị trường mô hình", "开启后,using_group 会参与 cache key(不同分组隔离)。": "Khi bật, using_group sẽ tham gia vào cache key (cách ly theo nhóm).", "开启后,仅\"消费\"和\"错误\"日志将记录您的客户端IP地址": "Sau khi bật, chỉ nhật ký \"tiêu thụ\" và \"lỗi\" sẽ ghi lại địa chỉ IP máy khách của bạn", "开启后,对免费模型(倍率为0,或者价格为0)的模型也会预消耗额度": "After enabling, free models (ratio 0 or price 0) will also pre-consume quota", @@ -1255,8 +1347,6 @@ "开启后,规则名称会参与 cache key(不同规则隔离)。": "Khi bật, tên quy tắc sẽ tham gia vào cache key (cách ly theo quy tắc).", "开启后,该渠道请求 Claude 时将强制追加 ?beta=true(无需客户端手动传参)": "Khi bật, yêu cầu đến Claude qua kênh này sẽ tự động thêm ?beta=true (client không cần truyền thủ công)", "开启后,违规请求将额外扣费。": "Khi bật, các yêu cầu vi phạm sẽ bị tính phí bổ sung.", - "开启后不限制:必须设置模型倍率": "Sau khi bật, không giới hạn: phải đặt tỷ lệ mô hình", - "开启后未登录用户无法访问模型广场": "Khi bật, người dùng chưa xác thực không thể truy cập thị trường mô hình", "开启批量操作": "Bật chọn hàng loạt", "开始": "Bắt đầu", "开始同步": "Bắt đầu đồng bộ", @@ -1270,6 +1360,7 @@ "强制要求": "Yêu cầu bắt buộc", "强变换": "Biến thể thấp", "当上游通道返回错误中包含这些关键词时(不区分大小写),自动禁用通道": "Khi kênh thượng nguồn trả về lỗi chứa các từ khóa này (không phân biệt chữ hoa chữ thường), tự động vô hiệu hóa kênh", + "当令牌分组设为 auto 时,系统按列表顺序依次选择可用分组。排在前面的优先级更高。": "When token group is set to auto, the system selects groups in list order. Groups listed first have higher priority.", "当前 API 密钥已过期,请在设置中更新。": "Current API key has expired, please update it in settings.", "当前 Ollama 版本为 ${version}": "Current Ollama version is ${version}", "当前仅 OpenAI / Claude 语义支持缓存 token 统计,其他通道将隐藏 token 相关字段。": "Hiện chỉ ngữ nghĩa OpenAI / Claude hỗ trợ thống kê token đệm. Các kênh khác sẽ ẩn các trường liên quan đến token.", @@ -1279,15 +1370,21 @@ "当前分组为 auto,会自动选择最优分组,当一个组不可用时自动降级到下一个组(熔断机制)": "Nhóm hiện tại là auto, nó sẽ tự động chọn nhóm tối ưu và tự động hạ cấp xuống nhóm tiếp theo khi một nhóm không khả dụng (cơ chế ngắt mạch)", "当前剩余": "Currently Remaining", "当前参数覆盖不是合法的 JSON": "Ghi đè tham số hiện tại không phải JSON hợp lệ", + "当前提示": "Gợi ý hiện tại", "当前旧格式 JSON 不合法,无法追加模板": "JSON định dạng cũ hiện tại không hợp lệ, không thể thêm mẫu", "当前旧格式不是 JSON 对象,无法追加模板": "Định dạng cũ hiện tại không phải đối tượng JSON, không thể thêm mẫu", "当前时间": "Thời gian hiện tại", + "当前未启用,需要时再打开即可。": "Trường này hiện đang tắt. Hãy bật khi cần.", "当前未开启Midjourney回调,部分项目可能无法获得绘图结果,可在运营设置中开启。": "Gọi lại Midjourney hiện tại chưa được bật, một số dự án có thể không nhận được kết quả vẽ, có thể bật trong cài đặt vận hành.", "当前查看的分组为:{{group}},倍率为:{{ratio}}": "Nhóm hiện tại: {{group}}, tỷ lệ: {{ratio}}", "当前模型列表为该标签下所有渠道模型列表最长的一个,并非所有渠道的并集,请注意可能导致某些渠道模型丢失。": "Danh sách mô hình hiện tại là danh sách dài nhất trong số tất cả các danh sách mô hình kênh dưới thẻ này, không phải là hợp nhất của tất cả các kênh. Xin lưu ý rằng điều này có thể khiến một số mô hình kênh bị mất.", + "当前模型同时存在按次价格和倍率配置,保存时会按当前计费方式覆盖。": "Mô hình này hiện đồng thời có giá theo lượt gọi và cấu hình tỷ lệ. Khi lưu, dữ liệu sẽ bị ghi đè theo chế độ tính phí hiện tại.", + "当前模型存在未显式设置输入倍率的扩展倍率;填写输入价格后会自动换算为价格字段。": "Mô hình này có các tỷ lệ mở rộng mà chưa đặt rõ tỷ lệ đầu vào; sau khi điền giá đầu vào, chúng sẽ tự động được quy đổi thành trường giá.", + "当前没有未设置定价的模型": "Hiện không có mô hình nào chưa thiết lập giá", "当前版本": "Phiên bản hiện tại", "当前状态": "Current Status", "当前缓存大小": "Kích thước bộ nhớ đệm hiện tại", + "当前编辑": "Đang chỉnh sửa", "当前规则不支持写入到该位置": "Quy tắc hiện tại không hỗ trợ ghi vào vị trí này", "当前规则未设置参数覆盖模板": "Quy tắc hiện tại chưa thiết lập mẫu ghi đè tham số", "当前计费": "Thanh toán hiện tại", @@ -1295,6 +1392,7 @@ "当前设置类型: ": "Loại cài đặt hiện tại: ", "当前跟随系统": "Hiện đang theo hệ thống", "当前配置无法连接到 io.net。": "Unable to connect to io.net with current configuration.", + "当某个分组的用户使用另一个分组的令牌时,可设置特殊倍率覆盖基础倍率。例如:vip 分组的用户使用 default 分组时倍率为 0.5": "When a user in one group uses a token from another group, a special ratio can override the base ratio. E.g., vip users using default group get ratio 0.5", "当模型没有设置价格时仍接受调用,仅当您信任该网站时使用,可能会产生高额费用": "Chấp nhận cuộc gọi ngay cả khi mô hình không có cài đặt giá, chỉ sử dụng khi bạn tin tưởng trang web, điều này có thể phát sinh chi phí cao", "当运行通道全部测试时,超过此时间将自动禁用通道": "Khi chạy tất cả các kiểm tra kênh, kênh sẽ tự động bị vô hiệu hóa khi vượt quá thời gian này", "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知": "Khi hạn ngạch còn lại của ví hoặc gói thuê bao thấp hơn giá trị này, hệ thống sẽ gửi thông báo theo phương thức đã chọn", @@ -1311,6 +1409,7 @@ "忘记密码?": "Quên mật khẩu?", "快速开始": "Bắt đầu nhanh", "快速选择": "Quick Select", + "忽略": "Bỏ qua", "思考中...": "Đang suy nghĩ...", "思考内容转换": "Chuyển đổi nội dung suy nghĩ", "思考过程": "Quá trình suy nghĩ", @@ -1350,6 +1449,7 @@ "或手动输入密钥:": "Hoặc nhập khóa thủ công:", "所有上游数据均可信": "Tất cả dữ liệu thượng nguồn đều đáng tin cậy", "所有密钥已复制到剪贴板": "Tất cả các khóa đã được sao chép vào khay nhớ tạm", + "所有用户": "All users", "所有编辑均为覆盖操作,留空则不更改": "Tất cả các chỉnh sửa là thao tác ghi đè, để trống sẽ không thay đổi", "所选模板已存在": "Mẫu đã chọn đã tồn tại", "手动禁用": "Vô hiệu hóa thủ công", @@ -1361,6 +1461,7 @@ "扣费": "Khấu phí", "执行 GC": "Thực thi GC", "执行中": "đang xử lý", + "扩展价格": "Giá mở rộng", "扫描二维码": "Quét mã QR", "批量创建": "Tạo hàng loạt", "批量创建时会在名称后自动添加随机后缀": "Khi tạo hàng loạt, hậu tố ngẫu nhiên sẽ được tự động thêm vào tên", @@ -1370,6 +1471,7 @@ "批量删除失败": "Xóa hàng loạt thất bại", "批量删除成功": "Batch deletion successful", "批量删除模型": "Xóa mô hình hàng loạt", + "批量应用当前模型价格": "Áp dụng hàng loạt giá của mô hình hiện tại", "批量操作": "Thao tác hàng loạt", "批量操作失败": "Batch operation failed", "批量操作完成: {{success}}个成功, {{failed}}个失败": "Batch operation completed: {{success}} succeeded, {{failed}} failed", @@ -1393,13 +1495,17 @@ "按倍率类型筛选": "Lọc theo loại tỷ lệ", "按倍率设置": "Đặt theo tỷ lệ", "按次": "Theo lượt gọi", + "按次 {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Theo lượt gọi {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "按次计费": "Tính phí theo lượt gọi", + "按次:{{symbol}}{{price}}": "Theo lượt gọi: {{symbol}}{{price}}", + "按次:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "Theo lượt gọi: {{symbol}}{{price}} * {{ratioType}}: {{ratio}} = {{symbol}}{{total}}", "按照如下格式输入:AccessKey|SecretAccessKey|Region": "Enter in the format: AccessKey|SecretAccessKey|Region", "按量计费": "Trả tiền theo mức sử dụng", + "按量计费下需要先填写输入价格,才能保存其它价格项。": "Ở chế độ tính phí theo lượng, cần điền giá đầu vào trước thì mới lưu được các mục giá khác.", "按顺序替换content中的变量占位符": "Thay thế các trình giữ chỗ biến trong nội dung theo thứ tự", "换脸": "Hoán đổi khuôn mặt", - "授权,需在遵守": " và phải được sử dụng tuân thủ ", "授权失败": "Ủy quyền thất bại", + "授权,需在遵守": " và phải được sử dụng tuân thủ ", "排序": "Thứ tự", "排队中": "Đang xếp hàng", "接受未设置价格模型": "Chấp nhận các mô hình không có cài đặt giá", @@ -1410,8 +1516,8 @@ "控制输出的随机性和创造性": "Kiểm soát tính ngẫu nhiên và sáng tạo của đầu ra", "控制顶栏模块显示状态,全局生效": "Kiểm soát trạng thái hiển thị mô-đun tiêu đề, hiệu ứng toàn cầu", "推荐": "Đề xuất", - "推荐:用户可以选择是否使用指纹等验证": "Khuyên dùng: Người dùng có thể chọn sử dụng xác minh vân tay hay không", "推荐使用(用户可选)": "Khuyên dùng (người dùng tùy chọn)", + "推荐:用户可以选择是否使用指纹等验证": "Khuyên dùng: Người dùng có thể chọn sử dụng xác minh vân tay hay không", "描述": "Mô tả", "提交": "Gửi", "提交时间": "Thời gian gửi", @@ -1421,13 +1527,14 @@ "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "Prompt {{input}} tokens / 1M tokens * {{symbol}}{{price}}", "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Gợi ý {{input}} tokens / 1M tokens * {{symbol}}{{price}} + Hoàn thành {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 缓存创建 {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Gợi ý {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + Bộ nhớ đệm {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + Tạo bộ nhớ đệm {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + Hoàn thành {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "提示价格:{{symbol}}{{price}} / 1M tokens": "Giá gợi ý: {{symbol}}{{price}} / 1M tokens", + "提示缓存倍率": "Tỷ lệ bộ nhớ đệm gợi ý", "提示:如需备份数据,只需复制上述目录即可": "Mẹo: Để sao lưu dữ liệu, chỉ cần sao chép thư mục trên", "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。": "Lưu ý: Cấu hình tại đây chỉ ảnh hưởng đến cách hiển thị trong \"Chợ mô hình\" và không ảnh hưởng đến việc gọi hoặc định tuyến thực tế. Nếu cần cấu hình hành vi gọi thực tế, vui lòng thiết lập trong \"Quản lý kênh\".", + "提示:端点映射仅用于模型广场展示,不会影响模型真实调用。如需配置真实调用,请前往「渠道管理」。": "Lưu ý: Ánh xạ endpoint chỉ dùng để hiển thị trong \"Chợ mô hình\" và không ảnh hưởng đến việc gọi thực tế. Để cấu hình gọi thực tế, vui lòng vào \"Quản lý kênh\".", "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。": "Lưu ý: Đây là tính năng beta. Cấu trúc cấu hình và hành vi có thể thay đổi trong tương lai. Không dùng trong môi trường production.", "提示:语言偏好会同步到您登录的所有设备,并影响API返回的错误消息语言。": "Gợi ý: Tùy chọn ngôn ngữ sẽ được đồng bộ trên tất cả thiết bị đã đăng nhập và ảnh hưởng đến ngôn ngữ thông báo lỗi API trả về.", "提示:链接中的{key}将被替换为API密钥,{address}将被替换为服务器地址": "Mẹo: {key} trong liên kết sẽ được thay thế bằng khóa API, {address} sẽ được thay thế bằng địa chỉ máy chủ", - "提示价格:{{symbol}}{{price}} / 1M tokens": "Giá gợi ý: {{symbol}}{{price}} / 1M tokens", - "提示缓存倍率": "Tỷ lệ bộ nhớ đệm gợi ý", "搜索供应商": "Tìm kiếm nhà cung cấp", "搜索关键字": "Từ khóa tìm kiếm", "搜索失败": "Search failed", @@ -1456,6 +1563,8 @@ "支付失败": "Thanh toán thất bại", "支付宝": "Alipay", "支付方式": "Phương thức thanh toán", + "支付方式名称": "Tên phương thức thanh toán", + "支付方式类型": "Loại phương thức thanh toán", "支付渠道": "Kênh thanh toán", "支付设置": "Cài đặt thanh toán", "支付请求失败": "Yêu cầu thanh toán thất bại", @@ -1481,8 +1590,6 @@ "收益统计": "Thống kê thu nhập", "收起": "Thu gọn", "收起侧边栏": "Thu gọn thanh bên", - "向左展开": "Mở rộng sang trái", - "向右展开": "Mở rộng sang phải", "收起内容": "Thu gọn nội dung", "放大": "Upscalers", "放大编辑": "Mở rộng trình chỉnh sửa", @@ -1501,14 +1608,19 @@ "数据管理和日志查看": "Quản lý dữ liệu và xem nhật ký", "文件上传": "Tải lên tệp", "文件搜索价格:{{symbol}}{{price}} / 1K 次": "Giá tìm kiếm tệp: {{symbol}}{{price}} / 1K lần", + "文件搜索调用 {{fileSearchCallCount}} 次": "Đã gọi tìm kiếm tệp {{fileSearchCallCount}} lần", + "文件搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Tìm kiếm tệp: {{count}} / 1K * đơn giá {{price}} * {{ratioType}} {{ratio}} = {{amount}}", "文字提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 文字补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} = {{symbol}}{{total}}": "Gợi ý văn bản {{input}} tokens / 1M tokens * {{symbol}}{{price}} + Hoàn thành văn bản {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} = {{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}}": "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}}", "文字提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 文字补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} = {{symbol}}{{total}}": "Gợi ý văn bản {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + Bộ nhớ đệm {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + Hoàn thành văn bản {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} = {{symbol}}{{total}}", "文字输入": "Đầu vào văn bản", "文字输出": "đầu ra văn bản", + "文字输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Đầu ra văn bản: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * hệ số hoàn thành {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "文心一言": "ERNIE Bot", "文档": "Tài liệu", "文档地址": "Liên kết tài liệu", "文生视频": "Văn bản sang video", + "新增": "added", "新增 Key 来源": "Thêm nguồn Key", "新增供应商": "Thêm nhà cung cấp", "新增失败": "Thêm thất bại", @@ -1524,9 +1636,9 @@ "新建容器部署": "Create Container Deployment", "新建数量": "Số lượng mới", "新建组": "Nhóm mới", + "新格式模板": "Mẫu định dạng mới", "新格式(支持条件判断与json自定义):": "Định dạng mới (hỗ trợ phán đoán điều kiện và tùy chỉnh JSON):", "新格式(规则 + 条件)": "Định dạng mới (Quy tắc + Điều kiện)", - "新格式模板": "Mẫu định dạng mới", "新版本": "Phiên bản mới", "新用户使用邀请码奖励额度": "Hạn ngạch thưởng mã mời người dùng mới", "新用户初始额度": "Hạn ngạch ban đầu cho người dùng mới", @@ -1543,6 +1655,7 @@ "无法复制到剪贴板,请手动复制": "Không thể sao chép vào khay nhớ tạm, vui lòng sao chép thủ công", "无法添加图片": "Không thể thêm hình ảnh", "无法获取容器详情": "Unable to get container details", + "无法读取剪贴板": "Không thể đọc bộ nhớ tạm", "无法连接 io.net": "Unable to connect to io.net", "无生效": "Không có gói đăng ký hiệu lực", "无邀请人": "Không có người mời", @@ -1553,19 +1666,19 @@ "日志已下载": "Logs downloaded", "日志已加载": "Logs loaded", "日志已复制到剪贴板": "Logs copied to clipboard", + "日志总大小": "Tổng kích thước nhật ký", + "日志文件数": "Số lượng tệp nhật ký", + "日志时间范围": "Phạm vi thời gian nhật ký", "日志流": "Log Stream", "日志清理失败:": "Dọn dẹp nhật ký thất bại:", + "日志目录": "Thư mục nhật ký", "日志类型": "Loại nhật ký", "日志设置": "Cài đặt nhật ký", "日志详情": "Chi tiết nhật ký", - "日志目录": "Thư mục nhật ký", - "日志文件数": "Số lượng tệp nhật ký", - "日志时间范围": "Phạm vi thời gian nhật ký", - "日志总大小": "Tổng kích thước nhật ký", - "旧格式(JSON 对象)": "Định dạng cũ (Đối tượng JSON)", - "旧格式(直接覆盖):": "Định dạng cũ (ghi đè trực tiếp):", "旧格式必须是 JSON 对象": "Định dạng cũ phải là đối tượng JSON", "旧格式模板": "Mẫu định dạng cũ", + "旧格式(JSON 对象)": "Định dạng cũ (Đối tượng JSON)", + "旧格式(直接覆盖):": "Định dạng cũ (ghi đè trực tiếp):", "旧的备用码已失效,请保存新的备用码": "Mã dự phòng cũ đã bị vô hiệu hóa, vui lòng lưu mã dự phòng mới", "早上好": "Chào buổi sáng", "时间": "Thời gian", @@ -1582,18 +1695,19 @@ "是否自动禁用": "Có tự động vô hiệu hóa không", "是否要求指纹/面容等生物识别": "Có yêu cầu nhận dạng vân tay/khuôn mặt không", "显示倍率": "Hiển thị tỷ lệ", - "显示最新20条": "Hiển thị 20 mới nhất", "显示名称": "Tên hiển thị", "显示名称字段(可选)": "Trường tên hiển thị (tùy chọn)", "显示完整内容": "Hiển thị nội dung đầy đủ", "显示操作项": "Hiển thị hành động", "显示更多": "Hiển thị thêm", + "显示最新20条": "Hiển thị 20 mới nhất", "显示第": "Đang hiển thị", "显示设置": "Cài đặt hiển thị", "显示调试": "Hiển thị gỡ lỗi", "晚上好": "Chào buổi tối", "普通环境变量": "Regular Environment Variables", "普通用户": "Người dùng thường", + "普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Đầu vào thường: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "智能体ID": "ID tác nhân", "智能熔断": "Dự phòng thông minh", "智谱": "Zhipu AI", @@ -1605,6 +1719,7 @@ "暂无保存的配置": "Không có cấu hình đã lưu", "暂无充值记录": "Không có hồ sơ nạp tiền", "暂无公告": "Không có thông báo", + "暂无分组,点击下方按钮添加": "No groups yet. Click the button below to add one.", "暂无匹配模型": "Không có mô hình phù hợp", "暂无可复制 JSON": "Không có JSON để sao chép", "暂无可复制的版本信息": "No version information to copy", @@ -1631,7 +1746,9 @@ "暂无监控数据": "Không có dữ liệu giám sát", "暂无系统公告": "Không có thông báo hệ thống", "暂无缺失模型": "Không có mô hình bị thiếu", + "暂无自动分组,点击下方按钮添加": "No auto groups yet. Click the button below to add one.", "暂无自定义 OAuth 提供商": "Không có nhà cung cấp OAuth tùy chỉnh", + "暂无规则,点击下方按钮添加": "No rules yet. Click the button below to add one.", "暂无订阅套餐": "Chưa có gói đăng ký", "暂无订阅记录": "Chưa có bản ghi đăng ký", "暂无请求数据": "Không có dữ liệu yêu cầu", @@ -1667,8 +1784,21 @@ "更新配置后,容器可能需要重启以应用新的设置。请确保您了解这些更改的影响。": "After updating the configuration, the container may need to restart to apply the new settings. Please ensure you understand the impact of these changes.", "更新配置失败": "Failed to update configuration", "更新预填组": "Cập nhật nhóm điền sẵn", + "最低": "thấp nhất", + "最低充值美元数量": "Số tiền nạp đô la tối thiểu", + "最后使用时间": "Thời gian sử dụng cuối cùng", + "最后更新": "Last Updated", + "最后请求": "Yêu cầu cuối cùng", + "最大GPU数量": "Max Number of GPUs", + "最大可用": "Max Available", + "最大条目数": "Số mục tối đa", + "最终抵扣": "Khấu trừ cuối cùng", + "最近一次": "Lần gần nhất", + "最近事件": "Recent Events", + "最高优先级": "highest priority", "月": "tháng", "有 Reasoning": "Có lập luận", + "有序字符串数组": "Ordered string array", "有效期": "Thời hạn", "有效期单位": "Đơn vị thời hạn", "有效期数值": "Giá trị thời hạn", @@ -1711,8 +1841,9 @@ "未绑定": "Chưa liên kết", "未获取到授权码": "Không lấy được mã ủy quyền", "未设置": "Chưa thiết lập", - "未设置倍率模型": "Mô hình không có cài đặt tỷ lệ", + "未设置价格": "Chưa thiết lập giá", "未设置价格模型": "Mô hình chưa thiết lập giá", + "未设置倍率模型": "Mô hình không có cài đặt tỷ lệ", "未设置路径": "Chưa cấu hình đường dẫn", "未配置模型": "Không có mô hình được cấu hình", "未配置的模型列表": "Mô hình chưa được cấu hình", @@ -1720,8 +1851,8 @@ "本地数据存储": "Lưu trữ dữ liệu cục bộ", "本地计费": "Local billing", "本月获得": "Tháng này", - "本设备:手机指纹/面容,外接:USB安全密钥": "Tích hợp: vân tay/khuôn mặt điện thoại, Bên ngoài: khóa bảo mật USB", "本设备内置": "Thiết bị tích hợp", + "本设备:手机指纹/面容,外接:USB安全密钥": "Tích hợp: vân tay/khuôn mặt điện thoại, Bên ngoài: khóa bảo mật USB", "本项目根据": "Dự án này được cấp phép theo ", "机密环境变量": "Secret Environment Variables", "机密环境变量将被加密存储,适用于存储密码、API密钥等敏感信息。": "Secret environment variables will be stored encrypted, suitable for storing passwords, API keys and other sensitive information.", @@ -1730,12 +1861,12 @@ "权限设置": "Cài đặt quyền", "条": "mục", "条 - 第": "đến", - "条,共": "của", "条件取反": "Đảo ngược điều kiện", "条件数": "Số điều kiện", "条件规则": "Quy tắc điều kiện", "条件项设置": "Cài đặt mục điều kiện", "条日志已清理!": "nhật ký đã được xóa!", + "条,共": "của", "来源": "Nguồn", "来源于 IO.NET 部署": "From IO.NET Deployment", "来源端点": "Endpoint nguồn", @@ -1749,8 +1880,10 @@ "查看所有可用的AI模型供应商,包括众多知名供应商的模型。": "Xem tất cả các nhà cung cấp mô hình AI khả dụng, bao gồm các mô hình từ nhiều nhà cung cấp nổi tiếng.", "查看日志": "View Logs", "查看渠道密钥": "Xem khóa kênh", + "查看示例": "View Example", "查看详情": "View Details", "查询": "Truy vấn", + "标准价格": "Standard price", "标签": "Nhãn", "标签不能为空!": "Nhãn không được để trống!", "标签信息": "Thông tin thẻ", @@ -1760,6 +1893,8 @@ "标签聚合": "Tổng hợp thẻ", "标签聚合模式": "Bật chế độ thẻ", "标识颜色": "Màu định danh", + "核心概念": "Key Concepts", + "核心配置": "Cấu hình cốt lõi", "核采样,控制词汇选择的多样性": "Lấy mẫu hạt nhân, kiểm soát sự đa dạng của lựa chọn từ vựng", "根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。": "Theo quy ước của Anthropic, input tokens của /v1/messages chỉ tính phần đầu vào không dùng cache và không bao gồm tokens đọc/ghi cache.", "根据模型名称和匹配规则查找模型元数据,优先级:精确 > 前缀 > 后缀 > 包含": "Tìm siêu dữ liệu mô hình dựa trên tên mô hình và quy tắc khớp, ưu tiên: chính xác > tiền tố > hậu tố > chứa", @@ -1767,27 +1902,34 @@ "格式化 JSON": "Định dạng JSON", "格式正确": "Định dạng hợp lệ", "格式示例:": "Ví dụ định dạng:", - "前:": "Trước:", - "配置:": "Cấu hình:", - "后:": "Sau:", "格式错误": "Định dạng không hợp lệ", "检查更新": "Kiểm tra cập nhật", "检测到 FluentRead(流畅阅读)": "Đã phát hiện FluentRead (đọc trôi chảy)", + "检测到剪贴板中的连接信息": "Phát hiện thông tin kết nối trong bộ nhớ tạm", "检测到多个密钥,您可以单独复制每个密钥,或点击复制全部获取完整内容。": "Đã phát hiện nhiều khóa, bạn có thể sao chép từng khóa riêng lẻ hoặc nhấp vào Sao chép tất cả để lấy nội dung đầy đủ.", "检测到该消息后有AI回复,是否删除后续回复并重新生成?": "Phát hiện trả lời AI sau tin nhắn này, xóa các trả lời tiếp theo và tạo lại?", "检测必须等待绘图成功才能进行放大等操作": "Việc phát hiện phải đợi vẽ thành công trước khi thực hiện phóng to và các thao tác khác", + "概览": "Overview", "模型": "Mô hình", + "模型 {{name}} 缺少输入价格,无法计算补全/缓存/图片/音频价格对应的倍率": "Mô hình {{name}} thiếu giá đầu vào, nên không thể tính tỷ lệ tương ứng cho giá hoàn thành, bộ nhớ đệm, hình ảnh và âm thanh.", + "模型 {{name}} 缺少音频输入价格,无法计算音频补全倍率": "Mô hình {{name}} thiếu giá đầu vào âm thanh, nên không thể tính tỷ lệ hoàn thành âm thanh.", "模型: {{ratio}}": "Mô hình: {{ratio}}", "模型专用区域": "Khu vực dành riêng cho mô hình", "模型价格": "Giá mô hình", + "模型价格 {{price}}": "Giá mô hình {{price}}", + "模型价格 {{symbol}}{{price}} / 次": "Giá mô hình {{symbol}}{{price}} / lượt gọi", + "模型价格 {{symbol}}{{price}} / 次 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "Giá mô hình {{symbol}}{{price}} / lượt gọi * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}": "Giá mô hình {{symbol}}{{price}}, {{ratioType}} {{ratio}}", + "模型价格:{{symbol}}{{price}}": "Giá mô hình: {{symbol}}{{price}}", "模型价格:{{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}}", + "模型价格:{{symbol}}{{price}} / 次": "Giá mô hình: {{symbol}}{{price}} / lượt gọi", "模型倍率": "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}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}},Web 搜索调用 {{webSearchCallCount}} 次": "Tỷ lệ mô hình {{modelRatio}}, tỷ lệ bộ nhớ đệm {{cacheRatio}}, tỷ lệ hoàn thành {{completionRatio}}, {{ratioType}} {{ratio}}, Tìm kiếm Web được gọi {{webSearchCallCount}} lần", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},图片输入倍率 {{imageRatio}},{{ratioType}} {{ratio}}": "Tỷ lệ mô hình {{modelRatio}}, tỷ lệ bộ nhớ đệm {{cacheRatio}}, tỷ lệ hoàn thành {{completionRatio}}, tỷ lệ đầu vào hình ảnh {{imageRatio}}, {{ratioType}} {{ratio}}", + "模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},音频倍率 {{audioRatio}},音频补全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}": "Hệ số mô hình {{modelRatio}}, hệ số hoàn thành {{completionRatio}}, hệ số âm thanh {{audioRatio}}, hệ số hoàn thành âm thanh {{audioCompletionRatio}}, {{cachePart}}{{ratioType}} {{ratio}}", + "模型倍率 {{modelRatio}},输出倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},{{ratioType}} {{ratio}}": "Hệ số mô hình {{modelRatio}}, hệ số đầu ra {{completionRatio}}, hệ số bộ nhớ đệm {{cacheRatio}}, {{ratioType}} {{ratio}}", "模型倍率 {{modelRatio}},输出倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},缓存创建倍率 {{cacheCreationRatio}},{{ratioType}} {{ratio}}": "Tỷ lệ mô hình {{modelRatio}}, tỷ lệ hoàn thành {{completionRatio}}, tỷ lệ bộ nhớ đệm {{cacheRatio}}, tỷ lệ tạo bộ nhớ đệm {{cacheCreationRatio}}, {{ratioType}} {{ratio}}", "模型倍率值": "Giá trị tỷ lệ mô hình", "模型倍率和补全倍率": "Tỷ lệ mô hình và tỷ lệ hoàn thành", @@ -1795,10 +1937,10 @@ "模型倍率设置": "Cài đặt tỷ lệ mô hình", "模型关键字": "Từ khóa mô hình", "模型列表": "Danh sách mô hình", - "模型列表,使用逗号分隔,例如:gpt-3.5-turbo,gpt-4": "Danh sách mô hình, phân tách bằng dấu phẩy, ví dụ: gpt-3.5-turbo,gpt-4", "模型列表已复制到剪贴板": "Danh sách mô hình đã được sao chép vào khay nhớ tạm", "模型列表已更新": "Danh sách mô hình đã được cập nhật", "模型列表已追加更新": "Model list has been updated", + "模型列表,使用逗号分隔,例如:gpt-3.5-turbo,gpt-4": "Danh sách mô hình, phân tách bằng dấu phẩy, ví dụ: gpt-3.5-turbo,gpt-4", "模型创建成功!": "Tạo mô hình thành công!", "模型删除失败": "Failed to delete model", "模型删除失败: {{error}}": "Failed to delete model: {{error}}", @@ -1812,6 +1954,7 @@ "模型名称正则": "Regex tên mô hình", "模型固定价格": "Giá cố định mô hình", "模型图标": "Biểu tượng mô hình", + "模型定价设置": "Model Pricing", "模型定价,需要登录访问": "Định giá mô hình, yêu cầu đăng nhập để truy cập", "模型广场": "Thị trường mô hình", "模型库": "Thư viện mô hình", @@ -1826,8 +1969,8 @@ "模型未加入列表,可能无法调用": "Model not in the list; requests may fail", "模型权限": "Quyền mô hình", "模型正则": "Regex model", - "模型正则(每行一个)": "Regex model (mỗi dòng một mục)", "模型正则不能为空": "Regex model không được để trống", + "模型正则(每行一个)": "Regex model (mỗi dòng một mục)", "模型消耗分布": "Phân phối tiêu thụ mô hình", "模型消耗趋势": "Xu hướng tiêu thụ mô hình", "模型版本": "Phiên bản mô hình", @@ -1839,6 +1982,7 @@ "模型类型": "Loại mô hình", "模型组": "Nhóm mô hình", "模型补全倍率(仅对自定义模型有效)": "Tỷ lệ hoàn thành mô hình (chỉ có hiệu lực đối với các mô hình tùy chỉnh)", + "模型计费编辑器": "Trình chỉnh sửa giá mô hình", "模型设置": "Cài đặt mô hình", "模型详情": "Chi tiết mô hình", "模型请求速率限制": "Giới hạn tốc độ yêu cầu mô hình", @@ -1852,8 +1996,8 @@ "模型部署设置": "Model Deployment Settings", "模型配置": "Cấu hình mô hình", "模型重定向": "Chuyển hướng mô hình", - "模型重定向,JSON格式,例如:{\"gpt-3.5-turbo\": \"gpt-3.5-turbo-0613\"}": "Chuyển hướng mô hình, định dạng JSON, ví dụ: {\"gpt-3.5-turbo\": \"gpt-3.5-turbo-0613\"}", "模型重定向里的下列模型尚未添加到“模型”列表,调用时会因为缺少可用模型而失败:": "The following models from the redirect have not been added to the “Models” list and requests will fail due to no available model:", + "模型重定向,JSON格式,例如:{\"gpt-3.5-turbo\": \"gpt-3.5-turbo-0613\"}": "Chuyển hướng mô hình, định dạng JSON, ví dụ: {\"gpt-3.5-turbo\": \"gpt-3.5-turbo-0613\"}", "模型限制": "Giới hạn mô hình", "模型限制列表": "Danh sách giới hạn mô hình", "模式": "Chế độ", @@ -1888,6 +2032,7 @@ "正在跳转...": "Đang chuyển hướng...", "正在验证...": "Đang xác minh...", "正常": "Bình thường", + "正常情况下,令牌的计费倍率由令牌所选的分组决定。特殊倍率可以根据「用户所在分组」进一步覆盖这个倍率。": "Normally, a token's billing ratio is determined by its selected group. Special ratios can override this based on the user's group.", "此代理仅用于图片请求转发,Webhook通知发送等,AI API请求仍然由服务器直接发出,可在渠道设置中单独配置代理": "Proxy này chỉ được sử dụng để chuyển tiếp yêu cầu hình ảnh, gửi thông báo webhook, v.v. Các yêu cầu AI API vẫn được gửi trực tiếp bởi máy chủ và proxy có thể được cấu hình riêng trong cài đặt kênh", "此修改将不可逆": "Sửa đổi này sẽ không thể đảo ngược", "此操作不可恢复,请仔细确认时间后再操作!": "Thao tác này không thể khôi phục, vui lòng xác nhận thời gian cẩn thận trước khi thực hiện!", @@ -1902,9 +2047,11 @@ "此操作将解绑用户当前的 Passkey,下次登录需要重新注册。": "Thao tác này sẽ hủy liên kết Passkey hiện tại của người dùng. Họ sẽ cần đăng ký lại vào lần đăng nhập tiếp theo.", "此操作将降低用户的权限级别": "Thao tác này sẽ giảm cấp quyền hạn của người dùng", "此支付方式最低充值金额为": "Số tiền nạp tối thiểu cho phương thức thanh toán này là", + "此时用户创建令牌时只能看到 standard 和 premium:": "Users can now only see standard and premium when creating tokens:", "此渠道由 IO.NET 自动同步,类型、密钥和 API 地址已锁定。": "This channel is automatically synchronized by IO.NET, type, key and API address are locked.", "此设置用于系统内部计算,默认值500000是为了精确到6位小数点设计,不推荐修改。": "Cài đặt này được sử dụng cho các tính toán nội bộ của hệ thống. Giá trị mặc định 500000 được thiết kế cho độ chính xác 6 chữ số thập phân, không nên sửa đổi.", "此页面仅显示未设置价格或倍率的模型,设置后将自动从列表中移除": "Trang này chỉ hiển thị các mô hình chưa đặt giá hoặc tỷ lệ. Sau khi đặt, chúng sẽ tự động bị xóa khỏi danh sách", + "此页面仅显示未设置价格或基础倍率的模型,设置后会自动从列表中移出": "Trang này chỉ hiển thị các mô hình chưa thiết lập giá hoặc tỷ lệ cơ bản. Sau khi lưu, chúng sẽ tự động biến mất khỏi danh sách.", "此项只读,需要用户通过个人设置页面的相关绑定按钮进行绑定,不可直接修改": "Chỉ đọc, người dùng cần liên kết thông qua nút liên kết tương ứng trên trang cài đặt cá nhân, không thể sửa đổi trực tiếp", "此项可选,用于修改请求体中的模型名称,为一个 JSON 字符串,键为请求中模型名称,值为要替换的模型名称,例如:": "Tùy chọn, được sử dụng để sửa đổi tên mô hình trong thân yêu cầu, là một chuỗi JSON, khóa là tên mô hình trong yêu cầu và giá trị là tên mô hình cần thay thế, ví dụ:", "此项可选,用于修改请求体中的模型名称,为一个 JSON 字符串,键为请求中模型名称,值为要替换的模型名称,留空则不更改": "Tùy chọn, được sử dụng để sửa đổi tên mô hình trong thân yêu cầu, dưới dạng chuỗi JSON, khóa là tên mô hình trong yêu cầu, giá trị là tên mô hình cần thay thế, để trống sẽ không thay đổi", @@ -1912,6 +2059,7 @@ "此项可选,用于覆盖请求参数。不支持覆盖 stream 参数": "Tùy chọn, được sử dụng để ghi đè tham số yêu cầu. Không hỗ trợ ghi đè tham số stream.", "此项可选,用于覆盖请求头参数": "Tùy chọn, được sử dụng để ghi đè tham số tiêu đề yêu cầu.", "此项可选,用于通过自定义API地址来进行 API 调用,末尾不要带/v1和/": "Tùy chọn cho các cuộc gọi API thông qua địa chỉ API tùy chỉnh, không thêm /v1 và / ở cuối", + "每个分组代表一个价格档位。管理员创建分组后,可以选择哪些档位对用户开放自选。": "Each group represents a pricing tier. After creating groups, admins can choose which tiers are open for user self-selection.", "每个用户最多可创建的令牌数量,默认 1000,设置过大可能会影响性能": "Số lượng token tối đa mỗi người dùng có thể tạo, mặc định 1000. Đặt quá lớn có thể ảnh hưởng hiệu suất", "每周": "Hàng tuần", "每天": "Hàng ngày", @@ -1921,6 +2069,7 @@ "每日签到可获得随机额度奖励": "Đăng nhập hàng ngày để nhận phần thưởng hạn mức ngẫu nhiên", "每日签到获得": "Nhận được từ đăng nhập hàng ngày", "每月": "Hàng tháng", + "每美元对应 Token 数": "Số token trên mỗi USD", "每隔多少分钟测试一次所有通道": "Bao nhiêu phút kiểm tra tất cả các kênh một lần", "比率": "Tỷ lệ", "永不过期": "Không bao giờ hết hạn", @@ -1929,6 +2078,8 @@ "永久删除所有备用码(包括未使用的)": "Xóa vĩnh viễn tất cả các mã dự phòng (bao gồm cả mã chưa sử dụng)", "永久有效": "Có hiệu lực vĩnh viễn", "汇率": "Tỷ giá hối đoái", + "沙盒环境 RSA 私钥 Base64 (PKCS#8 DER)": "Khóa riêng RSA Base64 (PKCS#8 DER) môi trường sandbox", + "沙盒环境 Waffo 公钥 Base64 (X.509 DER)": "Khóa công khai Waffo Base64 (X.509 DER) môi trường sandbox", "没有匹配的字段": "Không có trường khớp", "没有匹配的日志条目": "No matching log entries", "没有匹配的规则": "Không có quy tắc khớp", @@ -1938,6 +2089,7 @@ "没有可用的通道": "Không có kênh khả dụng", "没有找到匹配的模型": "Không tìm thấy mô hình phù hợp", "没有找到相关结果": "Không tìm thấy kết quả liên quan", + "没有未设置定价的模型": "Không có mô hình chưa thiết lập giá", "没有未设置的模型": "Không có mô hình chưa cấu hình", "没有权限": "Không có quyền", "没有权限执行此操作": "Không có quyền thực hiện thao tác này", @@ -1953,12 +2105,12 @@ "注册用户": "Người dùng đã đăng ký", "注册设置": "Cài đặt đăng ký", "注意": "Lưu ý", + "注意非Chat API,请务必填写正确的API地址,否则可能导致无法使用": "Lưu ý: Đối với API không phải Chat, vui lòng đảm bảo nhập đúng địa chỉ API, nếu không có thể dẫn đến không sử dụng được", "注意:": "Lưu ý: ", "注意:JSON中重复的键只会保留最后一个同名键的值": "Lưu ý: Trong JSON, các khóa trùng lặp sẽ chỉ giữ lại giá trị của khóa cuối cùng có cùng tên", "注意:修改密码后,所有已登录的设备将被强制登出。": "Lưu ý: Sau khi thay đổi mật khẩu, tất cả các thiết bị đã đăng nhập sẽ bị buộc đăng xuất.", "注意:所有配置更改在保存后立即生效。": "Lưu ý: Tất cả các thay đổi cấu hình có hiệu lực ngay sau khi lưu.", "注意:请确保您的邮箱地址正确,否则您将无法找回密码。": "Lưu ý: Vui lòng đảm bảo địa chỉ email của bạn là chính xác, nếu không bạn sẽ không thể khôi phục mật khẩu của mình.", - "注意非Chat API,请务必填写正确的API地址,否则可能导致无法使用": "Lưu ý: Đối với API không phải Chat, vui lòng đảm bảo nhập đúng địa chỉ API, nếu không có thể dẫn đến không sử dụng được", "注销": "Đăng xuất", "注销成功!": "Đăng xuất thành công!", "活跃文件": "Tệp đang hoạt động", @@ -2015,6 +2167,7 @@ "深色": "Tối", "深色模式": "Chế độ tối", "添加": "Thêm", + "添加 (+:)": "Add (+:)", "添加 IP": "Thêm IP", "添加 IP 到白名单": "Thêm IP vào danh sách trắng", "添加 IP 到黑名单": "Thêm IP vào danh sách đen", @@ -2056,6 +2209,7 @@ "添加环境变量": "Add Environment Variable", "添加用户": "Thêm người dùng", "添加聊天配置": "Thêm cấu hình trò chuyện", + "添加规则": "Add Rule", "添加通道": "Thêm kênh", "添加键值对": "Thêm cặp khóa-giá trị", "添加问答": "Thêm hỏi đáp", @@ -2064,11 +2218,11 @@ "清理不活跃缓存": "Xóa cache không hoạt động", "清理历史日志": "Dọn dẹp nhật ký lịch sử", "清理失败": "Dọn dẹp thất bại", - "清理方式": "Chế độ dọn dẹp", - "清理日志文件": "Dọn dẹp tệp nhật ký", "清理成功": "Dọn dẹp thành công", "清理数据": "Dọn dẹp dữ liệu", + "清理方式": "Chế độ dọn dẹp", "清理日志": "Dọn dẹp nhật ký", + "清理日志文件": "Dọn dẹp tệp nhật ký", "清理未使用的模型": "Dọn dẹp các mô hình không sử dụng", "清空": "Xóa", "清空全部缓存": "Xóa tất cả bộ nhớ đệm", @@ -2088,8 +2242,8 @@ "渠道ID": "ID kênh", "渠道ID,名称,密钥,API地址": "ID kênh, tên, khóa, Base URL", "渠道亲和性": "Độ ưu tiên kênh", - "渠道亲和性:上游缓存命中": "Ưu ái kênh: Trúng bộ nhớ đệm upstream", "渠道亲和性会基于从请求上下文或 JSON Body 提取的 Key,优先复用上一次成功的渠道。": "Ưu ái kênh tái sử dụng kênh thành công lần cuối dựa trên key được trích xuất từ context yêu cầu hoặc JSON body.", + "渠道亲和性:上游缓存命中": "Ưu ái kênh: Trúng bộ nhớ đệm upstream", "渠道优先级": "Ưu tiên kênh", "渠道信息": "Thông tin kênh", "渠道列表": "Danh sách kênh", @@ -2117,6 +2271,7 @@ "渠道的高级配置选项": "Tùy chọn cấu hình nâng cao của kênh", "渠道管理": "Quản lý kênh", "渠道类型": "Loại kênh", + "渠道行为": "Hành vi kênh", "渠道设置": "Cài đặt kênh", "渠道详情": "Chi tiết kênh", "渠道配置": "Cấu hình kênh", @@ -2160,6 +2315,8 @@ "版本号": "Số phiên bản", "版权所有": "Đã đăng ký bản quyền", "特惠": "Ưu đãi đặc biệt", + "特殊倍率": "Special Ratios", + "特殊可用分组规则": "Special Usable Group Rules", "状态": "Trạng thái", "状态更新时间": "Thời gian cập nhật trạng thái", "状态码": "Mã trạng thái", @@ -2168,6 +2325,8 @@ "状态筛选": "Lọc trạng thái", "状态页面Slug": "Slug trang trạng thái", "环境变量": "Environment Variables", + "生产环境 RSA 私钥 Base64 (PKCS#8 DER)": "Khóa riêng RSA Base64 (PKCS#8 DER) môi trường sản xuất", + "生产环境 Waffo 公钥 Base64 (X.509 DER)": "Khóa công khai Waffo Base64 (X.509 DER) môi trường sản xuất", "生成": "Tạo", "生成中...": "Đang tạo...", "生成令牌": "Tạo mã thông báo", @@ -2217,17 +2376,21 @@ "用户信息": "Thông tin người dùng", "用户信息更新成功!": "Cập nhật thông tin người dùng thành công!", "用户信息缺失": "Thiếu thông tin người dùng", - "用户最大令牌数量": "Số token tối đa mỗi người dùng", "用户分组": "Nhóm người dùng", "用户分组和额度管理": "Quản lý nhóm người dùng và hạn ngạch", + "用户分组的联动作用": "How user group affects other features", "用户分组设置": "Cài đặt nhóm người dùng", "用户分组配置": "Cấu hình nhóm người dùng", "用户列表": "Danh sách người dùng", + "用户创建令牌 → 选择分组下拉框:": "User creates token → group dropdown:", + "用户创建令牌时选择的分组,决定该令牌的实际计费倍率。一个用户可以创建多个令牌,使用不同分组。": "The group selected when creating a token determines its billing ratio. A user can create multiple tokens using different groups.", "用户创建成功,密码为": "Người dùng được tạo thành công, mật khẩu là", "用户协议": "Thỏa thuận người dùng", "用户协议已更新": "Thỏa thuận người dùng đã được cập nhật", "用户协议更新失败": "Cập nhật thỏa thuận người dùng thất bại", + "用户可选": "User Selectable", "用户可选分组": "Nhóm người dùng có thể chọn", + "用户可选分组的名称和描述(只包含勾选了用户可选的分组)": "Names and descriptions of user-selectable groups (only includes checked groups)", "用户名": "Tên người dùng", "用户名字段(可选)": "Trường tên người dùng (tùy chọn)", "用户名或邮箱": "Tên người dùng hoặc email", @@ -2241,6 +2404,7 @@ "用户指南": "Hướng dẫn người dùng", "用户控制面板,管理账户": "Bảng điều khiển người dùng để quản lý tài khoản", "用户新建令牌时可选的分组,格式为 JSON 字符串,例如:{\"vip\": \"VIP 用户\", \"test\": \"测试\"},表示用户可以选择 vip 分组和 test 分组": "Nhóm người dùng có thể chọn khi tạo mã thông báo, ở định dạng chuỗi JSON, ví dụ: {\"vip\": \"Người dùng VIP\", \"test\": \"Kiểm tra\"}, cho biết người dùng có thể chọn nhóm vip và nhóm test", + "用户最大令牌数量": "Số token tối đa mỗi người dùng", "用户权限": "Quyền người dùng", "用户每周期最多请求完成次数": "Số lần yêu cầu thành công tối đa của người dùng mỗi chu kỳ", "用户每周期最多请求次数": "Số lần yêu cầu tối đa của người dùng mỗi chu kỳ", @@ -2262,6 +2426,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", + "由管理员分配,决定用户身份等级(如 default、vip)。": "Assigned by admin, determines user tier (e.g., default, vip).", "由订阅抵扣": "Khấu trừ bởi gói đăng ký", "申请": "Đăng ký", "申请时间": "Thời gian đăng ký", @@ -2308,12 +2473,14 @@ "目录文件数": "Số tệp trong thư mục", "目标": "Mục tiêu", "目标 URL": "URL mục tiêu", + "目标分组": "Target Group", "目标地址": "Địa chỉ mục tiêu", "目标用户:{{username}}": "Người dùng mục tiêu: {{username}}", "目标端点": "Endpoint đích", "目标路径(可选)": "Đường dẫn đích (tùy chọn)", "直接提交": "Submit directly", "直接编辑 JSON 文本,保存时会校验格式。": "Chỉnh sửa trực tiếp văn bản JSON; định dạng sẽ được xác thực khi lưu.", + "直接追加(和添加类似,但无前缀)": "Directly append (similar to Add, but without prefix)", "直连": "Kết nối trực tiếp", "相关设置": "Cài đặt liên quan", "相关项目": "Dự án liên quan", @@ -2326,7 +2493,6 @@ "硬件类型": "Hardware Type", "硬件配置": "Hardware Configuration", "确定": "Xác nhận", - "确定?": "Chắc chắn?", "确定删除": "Xác nhận xóa", "确定删除此令牌?": "Bạn có chắc chắn muốn xóa mã thông báo này không?", "确定删除此兑换码?": "Bạn có chắc chắn muốn xóa mã đổi thưởng này không?", @@ -2379,6 +2545,7 @@ "确定要降级此用户吗?": "Bạn có chắc chắn muốn hạ cấp người dùng này không?", "确定重置": "Xác nhận đặt lại", "确定重置模型倍率吗?": "Xác nhận đặt lại tỷ lệ mô hình?", + "确定?": "Chắc chắn?", "确认": "Xác nhận", "确认作废": "Xác nhận vô hiệu", "确认修改": "Xác nhận sửa đổi", @@ -2386,6 +2553,8 @@ "确认冲突项修改": "Xác nhận sửa đổi mục xung đột", "确认删除": "Xác nhận xóa", "确认删除模型": "Confirm Delete Model", + "确认删除该分组?": "Confirm delete this group?", + "确认删除该规则?": "Confirm delete this rule?", "确认取消密码登录": "Xác nhận hủy đăng nhập mật khẩu", "确认启用": "Xác nhận bật", "确认密码": "Xác nhận mật khẩu", @@ -2397,12 +2566,13 @@ "确认支付": "Xác nhận thanh toán", "确认新密码": "Xác nhận mật khẩu mới", "确认清理不活跃的磁盘缓存?": "Xác nhận xóa cache đĩa không hoạt động?", + "确认清理日志文件?": "Xác nhận dọn dẹp tệp nhật ký?", "确认清空全部渠道亲和性缓存": "Xác nhận xóa tất cả bộ nhớ đệm ưu ái kênh", "确认清空该规则缓存": "Xác nhận xóa bộ nhớ đệm của quy tắc này", "确认清除": "Xác nhận xóa", "确认清除历史日志": "Xác nhận xóa nhật ký lịch sử", - "确认清理日志文件?": "Xác nhận dọn dẹp tệp nhật ký?", "确认禁用": "Xác nhận vô hiệu hóa", + "确认移除?": "Confirm remove?", "确认补单": "Xác nhận hoàn thành đơn hàng", "确认解绑": "Xác nhận hủy liên kết", "确认解绑 Passkey": "Xác nhận hủy liên kết Passkey", @@ -2416,18 +2586,15 @@ "磁盘使用率超过此值时拒绝请求": "Từ chối yêu cầu khi sử dụng đĩa vượt quá giá trị này", "磁盘可用空间小于缓存最大总量设置": "Dung lượng đĩa trống nhỏ hơn cài đặt tổng dung lượng đệm tối đa", "磁盘命中": "Lượt trúng đĩa", - "磁盘缓存最大总量 (MB)": "Tổng dung lượng tối đa bộ nhớ đệm đĩa (MB)", "磁盘缓存占用的最大空间": "Dung lượng tối đa chiếm bởi bộ nhớ đệm đĩa", "磁盘缓存已清理": "Bộ nhớ đệm đĩa đã được dọn", + "磁盘缓存最大总量 (MB)": "Tổng dung lượng tối đa bộ nhớ đệm đĩa (MB)", "磁盘缓存设置(磁盘换内存)": "Cài đặt bộ nhớ đệm đĩa (đổi đĩa/bộ nhớ)", "磁盘缓存阈值 (MB)": "Ngưỡng bộ nhớ đệm đĩa (MB)", "示例": "Ví dụ", "示例:": "Ví dụ: ", "示例:{\"default\": [200, 100], \"vip\": [0, 1000]}。": "Ví dụ: {\"default\": [200, 100], \"vip\": [0, 1000]}.", "社群": "Cộng đồng", - "视频": "Video", - "视频Remix": "Remix video", - "视频无法在当前浏览器中播放,这可能是由于:": "The video cannot be played in this browser, possibly because:", "禁用": "Vô hiệu hóa", "禁用 Passkey": "Vô hiệu hóa Passkey", "禁用 store 透传": "Vô hiệu hóa truyền qua store", @@ -2457,8 +2624,11 @@ "积分": "Điểm", "积分兑换": "Đổi điểm", "积分记录": "Hồ sơ điểm", - "移除 functionResponse.id 字段": "Xóa trường functionResponse.id", + "移除": "Remove", + "移除 (-:)": "Remove (-:)", "移除 One API 的版权标识必须首先获得授权,项目维护需要花费大量精力,如果本项目对你有意义,请主动支持本项目": "Việc xóa dấu bản quyền One API trước tiên phải được ủy quyền. Việc bảo trì dự án đòi hỏi rất nhiều nỗ lực. Nếu dự án này có ý nghĩa với bạn, vui lòng chủ động ủng hộ dự án này.", + "移除 functionResponse.id 字段": "Xóa trường functionResponse.id", + "空": "Trống", "窗口处理": "xử lý cửa sổ", "窗口等待": "chờ cửa sổ", "立即充值": "Nạp tiền ngay", @@ -2470,6 +2640,10 @@ "站点名称": "Tên trang web", "站点图标": "Biểu tượng trang web", "站点地址": "Địa chỉ trang web", + "站点所有额度将以原始 Token 数显示,不做货币换算": "Tất cả hạn mức trang web sẽ được hiển thị dưới dạng số token thô, không chuyển đổi tiền tệ", + "站点所有额度将以美元 ($) 显示": "Tất cả hạn mức trang web sẽ được hiển thị bằng USD ($)", + "站点所有额度将按汇率换算为人民币 (¥) 显示": "Tất cả hạn mức trang web sẽ được chuyển đổi sang CNY (¥) theo tỷ giá hối đoái", + "站点所有额度将按汇率换算为自定义货币显示": "Tất cả hạn mức trang web sẽ được chuyển đổi sang tiền tệ tùy chỉnh theo tỷ giá hối đoái", "站点设置": "Cài đặt trang web", "站点额度展示类型及汇率": "Loại hiển thị hạn ngạch trang web và tỷ giá hối đoái", "端口号必须在1-65535之间": "Port number must be between 1-65535", @@ -2496,34 +2670,38 @@ "等待获取邮箱信息...": "Đang chờ lấy thông tin email...", "策略": "Chiến lược", "筛选": "Lọc", - "签到最大额度": "Hạn mức đăng nhập tối đa", - "签到最小额度": "Hạn mức đăng nhập tối thiểu", "签到功能允许用户每日签到获取随机额度奖励": "Tính năng đăng nhập cho phép người dùng đăng nhập hàng ngày để nhận phần thưởng hạn mức ngẫu nhiên", "签到失败": "Đăng nhập thất bại", "签到奖励将直接添加到您的账户余额": "Phần thưởng đăng nhập sẽ được thêm trực tiếp vào số dư tài khoản của bạn", "签到奖励的最大额度": "Hạn mức tối đa cho phần thưởng đăng nhập", "签到奖励的最小额度": "Hạn mức tối thiểu cho phần thưởng đăng nhập", "签到成功!获得": "Đăng nhập thành công! Đã nhận", + "签到最大额度": "Hạn mức đăng nhập tối đa", + "签到最小额度": "Hạn mức đăng nhập tối thiểu", "签到设置": "Cài đặt đăng nhập", "简介": "Giới thiệu", + "简单来说:同一个令牌分组,不同等级的用户可以享受不同的价格。": "In short: same token group, different user tiers can enjoy different prices.", "简单模式": "Chế độ đơn giản", "简洁": "Đơn giản", - "简洁模式:按 type 全量清理对象,例如 redacted_thinking。": "Chế độ đơn giản: Dọn tất cả đối tượng theo type, VD: redacted_thinking.", "简洁模式仅返回 message;状态码和错误类型将使用系统默认值。": "Chế độ đơn giản chỉ trả về message; mã trạng thái và loại lỗi sẽ sử dụng giá trị mặc định hệ thống.", + "简洁模式:按 type 全量清理对象,例如 redacted_thinking。": "Chế độ đơn giản: Dọn tất cả đối tượng theo type, VD: redacted_thinking.", "管理": "Quản lý", "管理 Ollama 模型的拉取和删除": "Manage Ollama model pulling and deletion", "管理你的 LinuxDO OAuth App": "Quản lý LinuxDO OAuth App của bạn", "管理分组": "Quản lý nhóm", "管理后台": "Bảng quản trị", "管理员": "Quản trị viên", + "管理员分配的优惠分组": "Admin-assigned discount group", + "管理员分配的基础分组": "Admin-assigned base group", "管理员区域": "Khu vực quản trị viên", "管理员暂时未设置任何关于内容": "Quản trị viên chưa đặt bất kỳ nội dung Giới thiệu tùy chỉnh nào", "管理员未开启 Creem 充值!": "The administrator has not enabled Creem recharge!", "管理员未开启Stripe充值!": "Quản trị viên chưa bật nạp tiền Stripe!", - "管理员未开启在线充值!": "Quản trị viên chưa bật nạp tiền trực tuyến!", "管理员未开启在线充值功能,请联系管理员开启或使用兑换码充值。": "Quản trị viên chưa bật chức năng nạp tiền trực tuyến, vui lòng liên hệ quản trị viên để bật hoặc nạp tiền bằng mã đổi thưởng.", + "管理员未开启在线充值!": "Quản trị viên chưa bật nạp tiền trực tuyến!", "管理员未开启在线支付功能,请联系管理员配置。": "Quản trị viên chưa bật thanh toán trực tuyến, vui lòng liên hệ quản trị viên.", "管理员未设置用户可选分组": "Quản trị viên chưa đặt nhóm người dùng có thể chọn", + "管理员给用户分配的分组(如 vip)不仅决定用户身份,还会影响后续两个功能:": "The group assigned to a user (e.g., vip) not only determines their identity, but also affects the following two features:", "管理员设置": "Cài đặt quản trị viên", "管理员设置了外部链接,点击下方按钮访问": "Quản trị viên đã thiết lập các liên kết bên ngoài, nhấp vào nút bên dưới để truy cập", "管理员账号": "Tài khoản quản trị viên", @@ -2534,11 +2712,11 @@ "管理您的密钥": "Quản lý khóa của bạn", "管理您的账户": "Quản lý tài khoản của bạn", "管理控制台": "Bảng điều khiển quản lý", + "管理服务器运行日志文件。日志文件会随运行时间不断累积,建议定期清理以释放磁盘空间。": "Quản lý tệp nhật ký máy chủ. Tệp nhật ký tích lũy theo thời gian; nên dọn dẹp định kỳ để giải phóng dung lượng đĩa.", "管理模型、标签、端点等预填组": "Quản lý các nhóm điền sẵn như mô hình, thẻ, điểm cuối, v.v.", "管理用户": "Quản lý người dùng", "管理用户已绑定的第三方账户,支持筛选与解绑": "Quản lý tài khoản bên thứ ba đã liên kết của người dùng, hỗ trợ lọc và hủy liên kết", "管理绑定": "Quản lý liên kết", - "管理服务器运行日志文件。日志文件会随运行时间不断累积,建议定期清理以释放磁盘空间。": "Quản lý tệp nhật ký máy chủ. Tệp nhật ký tích lũy theo thời gian; nên dọn dẹp định kỳ để giải phóng dung lượng đĩa.", "管理面板": "Bảng quản lý", "类": "Lớp", "类型": "Loại", @@ -2552,6 +2730,9 @@ "系统公告": "Thông báo hệ thống", "系统公告管理,可以发布系统通知和重要消息(最多100个,前端显示最新20条)": "Quản lý thông báo hệ thống, bạn có thể xuất bản thông báo hệ thống và tin nhắn quan trọng (tối đa 100, hiển thị 20 tin mới nhất ở giao diện người dùng)", "系统内存": "Bộ nhớ hệ thống", + "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为人民币,不影响内部计费": "Hệ thống sử dụng USD làm đơn vị định giá cơ sở. Số dư người dùng, số tiền nạp, giá mô hình, nhật ký sử dụng — tất cả số tiền hiển thị được chuyển đổi sang CNY theo tỷ giá này. Thanh toán nội bộ không bị ảnh hưởng.", + "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为自定义货币,不影响内部计费": "Hệ thống sử dụng USD làm đơn vị định giá cơ sở. Số dư người dùng, số tiền nạp, giá mô hình, nhật ký sử dụng — tất cả số tiền hiển thị được chuyển đổi sang tiền tệ tùy chỉnh theo tỷ giá này. Thanh toán nội bộ không bị ảnh hưởng.", + "系统内部计费精度,默认 500000,修改可能导致计费异常,请谨慎操作": "Độ chính xác thanh toán nội bộ, mặc định 500000. Thay đổi có thể gây ra lỗi thanh toán — hãy thận trọng.", "系统初始化": "Khởi tạo hệ thống", "系统初始化失败,请重试": "Khởi tạo hệ thống thất bại, vui lòng thử lại", "系统初始化成功,正在跳转...": "Khởi tạo hệ thống thành công, đang chuyển hướng...", @@ -2579,14 +2760,14 @@ "系统通知": "Thông báo hệ thống", "系统错误": "Lỗi hệ thống", "系统错误,请联系管理员": "Lỗi hệ thống, vui lòng liên hệ quản trị viên", - "约": "Khoảng", - "级别": "Cấp độ", "索引": "Chỉ mục", "紧凑列表": "Danh sách thu gọn", - "纯文本": "Văn bản thuần túy", "累计消耗": "Tiêu thụ tích lũy", "累计签到": "Tổng số lần đăng nhập", "累计获得": "Tổng đã nhận", + "约": "Khoảng", + "级别": "Cấp độ", + "纯文本": "Văn bản thuần túy", "线路": "Tuyến", "线路描述": "Mô tả tuyến", "组": "Nhóm", @@ -2635,31 +2816,45 @@ "统计次数": "Thống kê số lần", "统计额度": "Thống kê hạn ngạch", "继续": "Tiếp tục", - "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Cache {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", "缓存 Tokens": "Tokens bộ nhớ đệm", + "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Bộ nhớ đệm {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Cache {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", "缓存: {{cacheRatio}}": "Bộ nhớ đệm: {{cacheRatio}}", "缓存价格:{{symbol}}{{price}} * {{cacheRatio}} = {{symbol}}{{total}} / 1M tokens (缓存倍率: {{cacheRatio}})": "Giá bộ nhớ đệm: {{symbol}}{{price}} * {{cacheRatio}} = {{symbol}}{{total}} / 1M tokens (Tỷ lệ bộ nhớ đệm: {{cacheRatio}})", "缓存价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存倍率: {{cacheRatio}})": "Giá bộ nhớ đệm: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (Tỷ lệ bộ nhớ đệm: {{cacheRatio}})", "缓存倍率": "Tỷ lệ bộ nhớ đệm", "缓存倍率 {{cacheRatio}}": "Cache ratio {{cacheRatio}}", "缓存写": "Ghi bộ nhớ đệm", - "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", "缓存创建 Tokens": "Tokens tạo bộ nhớ đệm", - "缓存创建: {{cacheCreationRatio}}": "Tạo bộ nhớ đệm: {{cacheCreationRatio}}", + "缓存创建 {{price}} / 1M tokens": "Tạo bộ nhớ đệm {{price}} / 1M tokens", + "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "Tạo bộ nhớ đệm {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "Cache creation {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (ratio: {{ratio}})", "缓存创建: 1h {{cacheCreationRatio1h}}": "Tạo bộ nhớ đệm: 1h {{cacheCreationRatio1h}}", "缓存创建: 5m {{cacheCreationRatio5m}}": "Tạo bộ nhớ đệm: 5m {{cacheCreationRatio5m}}", "缓存创建: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "Cache creation: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", - "缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存创建倍率: {{cacheCreationRatio}})": "Giá tạo bộ nhớ đệm: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (Tỷ lệ tạo bộ nhớ đệm: {{cacheCreationRatio}})", + "缓存创建: {{cacheCreationRatio}}": "Tạo bộ nhớ đệm: {{cacheCreationRatio}}", + "缓存创建价格": "Giá tạo bộ nhớ đệm đầu vào", + "缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Giá tạo bộ nhớ đệm {{symbol}}{{price}} / 1M tokens", "缓存创建价格合计:5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens": "Cache creation price total: 5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens", + "缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存创建倍率: {{cacheCreationRatio}})": "Giá tạo bộ nhớ đệm: {{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (Tỷ lệ tạo bộ nhớ đệm: {{cacheCreationRatio}})", + "缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Giá tạo bộ nhớ đệm: {{symbol}}{{price}} / 1M tokens", "缓存创建倍率": "Tỷ lệ tạo bộ nhớ đệm", - "缓存创建倍率 {{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}}": "Hệ số tạo bộ nhớ đệm 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", + "缓存创建倍率 {{cacheCreationRatio}}": "Cache creation ratio {{cacheCreationRatio}}", + "缓存创建:{{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}}", "缓存条目数": "Số mục bộ nhớ đệm", "缓存目录": "Thư mục bộ nhớ đệm", "缓存目录磁盘空间": "Dung lượng đĩa thư mục bộ nhớ đệm", "缓存读": "Đọc bộ nhớ đệm", + "缓存读 {{price}} / 1M tokens": "Đọc bộ nhớ đệm {{price}} / 1M tokens", + "缓存读取价格": "Giá đọc bộ nhớ đệm đầu vào", + "缓存读取价格 {{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", + "缓存读取价格:{{symbol}}{{total}} / 1M tokens": "Giá đọc bộ nhớ đệm: {{symbol}}{{total}} / 1M tokens", + "缓存读取:{{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}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Đầu vào bộ nhớ đệm: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * hệ số bộ nhớ đệm {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "编辑": "Chỉnh sửa", "编辑 OAuth 提供商": "Chỉnh sửa nhà cung cấp OAuth", "编辑API": "Chỉnh sửa API", @@ -2712,12 +2907,15 @@ "联系管理员": "Liên hệ quản trị viên", "腾讯混元": "Tencent Hunyuan", "自动": "Tự động", + "自动分组": "Auto Group", "自动分组auto,从第一个开始选择": "Tự động nhóm auto, chọn từ cái đầu tiên", + "自动分组选择": "Auto Group Selection", "自动刷新": "Tự động làm mới", "自动刷新中": "Auto refreshing", "自动去重": "Tự động loại bỏ trùng lặp", "自动去重模式": "Chế độ tự động loại bỏ trùng lặp", "自动填充字段": "Tự động điền trường", + "自动填入": "Tự động điền", "自动检测": "Tự động phát hiện", "自动模式": "Chế độ tự động", "自动测试所有通道间隔时间": "Khoảng thời gian tự động kiểm tra tất cả các kênh", @@ -2752,17 +2950,6 @@ "自定义货币": "Tiền tệ tùy chỉnh", "自定义货币符号": "Ký hiệu tiền tệ tùy chỉnh", "自定义货币符号将显示在所有额度数值前,例如 €1.50": "Ký hiệu tiền tệ tùy chỉnh sẽ hiển thị trước tất cả số tiền hạn mức, ví dụ €1.50", - "额度展示类型": "Loại hiển thị hạn mức", - "站点所有额度将以美元 ($) 显示": "Tất cả hạn mức trang web sẽ được hiển thị bằng USD ($)", - "站点所有额度将按汇率换算为人民币 (¥) 显示": "Tất cả hạn mức trang web sẽ được chuyển đổi sang CNY (¥) theo tỷ giá hối đoái", - "站点所有额度将以原始 Token 数显示,不做货币换算": "Tất cả hạn mức trang web sẽ được hiển thị dưới dạng số token thô, không chuyển đổi tiền tệ", - "站点所有额度将按汇率换算为自定义货币显示": "Tất cả hạn mức trang web sẽ được chuyển đổi sang tiền tệ tùy chỉnh theo tỷ giá hối đoái", - "每美元对应 Token 数": "Số token trên mỗi USD", - "预览效果": "Xem trước", - "请输入汇率": "Vui lòng nhập tỷ giá hối đoái", - "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为人民币,不影响内部计费": "Hệ thống sử dụng USD làm đơn vị định giá cơ sở. Số dư người dùng, số tiền nạp, giá mô hình, nhật ký sử dụng — tất cả số tiền hiển thị được chuyển đổi sang CNY theo tỷ giá này. Thanh toán nội bộ không bị ảnh hưởng.", - "系统内部计费精度,默认 500000,修改可能导致计费异常,请谨慎操作": "Độ chính xác thanh toán nội bộ, mặc định 500000. Thay đổi có thể gây ra lỗi thanh toán — hãy thận trọng.", - "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为自定义货币,不影响内部计费": "Hệ thống sử dụng USD làm đơn vị định giá cơ sở. Số dư người dùng, số tiền nạp, giá mô hình, nhật ký sử dụng — tất cả số tiền hiển thị được chuyển đổi sang tiền tệ tùy chỉnh theo tỷ giá này. Thanh toán nội bộ không bị ảnh hưởng.", "自定义错误响应": "Phản hồi lỗi tùy chỉnh", "自定义镜像": "Custom Image", "自用模式": "Chế độ tự dùng", @@ -2781,13 +2968,15 @@ "获取": "Lấy", "获取 Discovery 配置": "Lấy cấu hình Discovery", "获取 Discovery 配置失败:": "Lấy cấu hình Discovery thất bại: ", - "获取 io.net API Key": "Get io.net API Key", "获取 OIDC 配置失败,请检查网络状况和 Well-Known URL 是否正确": "Lấy cấu hình OIDC thất bại, vui lòng kiểm tra trạng thái mạng và Well-Known URL có chính xác không", "获取 OIDC 配置成功!": "Lấy cấu hình OIDC thành công!", "获取 Ollama 版本失败": "Failed to get Ollama version", + "获取 io.net API Key": "Get io.net API Key", "获取2FA状态失败": "Lấy trạng thái 2FA thất bại", "获取中...": "Đang lấy...", "获取代码": "Lấy mã", + "获取充值配置失败": "Không thể lấy cấu hình nạp tiền", + "获取充值配置异常": "Lỗi cấu hình nạp tiền", "获取初始化状态失败": "Lấy trạng thái khởi tạo thất bại", "获取可用资源失败: ": "Failed to get available resources: ", "获取启用模型失败": "Lấy mô hình đã bật thất bại", @@ -2820,10 +3009,14 @@ "蓝": "Xanh dương", "蓝色": "Màu xanh dương", "补全": "Hoàn thành", + "补全 {{completion}} tokens * 输出倍率 {{completionRatio}}": "Hoàn thành {{completion}} tokens * Tỷ lệ đầu ra {{completionRatio}}", "补全 {{completion}} tokens / 1M tokens * {{symbol}}{{price}}": "Completion {{completion}} tokens / 1M tokens * {{symbol}}{{price}}", + "补全价格": "Giá hoàn thành", + "补全价格已锁定": "Giá hoàn thành đã bị khóa", "补全价格:{{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", "补全倍率": "Tỷ lệ hoàn thành", + "补全倍率 {{completionRatio}}": "Tỷ lệ hoàn thành {{completionRatio}}", "补全倍率值": "Giá trị tỷ lệ hoàn thành", "补单": "Bổ sung đơn hàng", "补单失败": "Bổ sung đơn hàng thất bại", @@ -2846,6 +3039,9 @@ "规则名称(可读性更好,也会出现在管理侧日志中)。": "Tên quy tắc (dễ đọc hơn, cũng hiển thị trong log quản trị).", "规则导航": "Điều hướng quy tắc", "规则未找到,请刷新后重试": "Không tìm thấy quy tắc, vui lòng làm mới và thử lại", + "视频": "Video", + "视频Remix": "Remix video", + "视频无法在当前浏览器中播放,这可能是由于:": "The video cannot be played in this browser, possibly because:", "角色": "Vai trò", "解析响应数据时发生错误": "Đã xảy ra lỗi khi phân tích dữ liệu phản hồi", "解析密钥文件失败: {{msg}}": "Phân tích tệp khóa thất bại: {{msg}}", @@ -2857,12 +3053,18 @@ "触发": "Kích hoạt", "触发关键词": "Từ khóa kích hoạt", "触发词": "Từ kích hoạt", + "警告": "Cảnh báo", + "警告:启用保活后,如果已经写入保活数据后渠道出错,系统无法重试,如果必须开启,推荐设置尽可能大的Ping间隔": "Cảnh báo: Sau khi bật giữ kết nối, nếu kênh bị lỗi sau khi dữ liệu giữ kết nối đã được ghi, hệ thống không thể thử lại. Nếu bắt buộc phải bật, nên đặt khoảng thời gian Ping càng lớn càng tốt", + "警告:禁用两步验证将永久删除您的验证设置和所有备用码,此操作不可撤销!": "Cảnh báo: Vô hiệu hóa xác thực hai yếu tố sẽ xóa vĩnh viễn cài đặt xác minh và tất cả mã dự phòng của bạn, thao tác này không thể hoàn tác!", "计价币种": "Pricing Currency", "计算中": "Calculating", "计算成本": "Calculate Cost", "计算费用中...": "Calculating fees...", "计费": "Thanh toán", + "计费乘数,倍率越低费用越低。例如倍率 0.5 表示半价。": "Billing multiplier — the lower the ratio, the lower the cost. E.g., ratio 0.5 means half price.", "计费开始": "Billing Start", + "计费方式": "Chế độ tính phí", + "计费显示模式": "Chế độ hiển thị tính phí", "计费模式": "Billing mode", "计费类型": "Loại thanh toán", "计费规则": "Quy tắc thanh toán", @@ -2930,6 +3132,7 @@ "该数据可能不可信,请谨慎使用": "Dữ liệu này có thể không đáng tin cậy, vui lòng sử dụng thận trọng", "该服务器地址将影响支付回调地址以及默认首页展示的地址,请确保正确配置": "Địa chỉ máy chủ này sẽ ảnh hưởng đến địa chỉ gọi lại thanh toán và địa chỉ hiển thị trang chủ mặc định, vui lòng đảm bảo cấu hình chính xác", "该模型存在固定价格与倍率计费方式冲突,请确认选择": "Mô hình này có xung đột giữa giá cố định và phương thức tính phí theo tỷ lệ, vui lòng xác nhận lựa chọn", + "该模型补全倍率由后端固定为 {{ratio}}。补全价格不能在这里修改。": "Tỷ lệ hoàn thành của mô hình này được backend cố định ở {{ratio}}. Không thể chỉnh giá hoàn thành tại đây.", "该渠道已开启请求透传,参数覆写、模型重定向等 NewAPI 内置功能将失效,非最佳实践。": "Kênh này đã bật truyền qua yêu cầu; các tính năng tích hợp của NewAPI như ghi đè tham số và chuyển hướng mô hình sẽ bị vô hiệu hóa. Đây không phải là thực hành tốt nhất.", "该渠道已开启请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "Kênh này đã bật truyền qua yêu cầu. Các tính năng tích hợp của NewAPI như ghi đè tham số, chuyển hướng mô hình và thích ứng kênh sẽ bị vô hiệu hóa. Đây không phải là thực hành tốt nhất. Nếu phát sinh vấn đề, vui lòng không gửi issue.", "该规则未启用“作用域:包含规则名称”,无法按规则清空缓存。": "Quy tắc này chưa bật \"Phạm vi: Bao gồm tên quy tắc\", không thể xóa bộ nhớ đệm theo quy tắc.", @@ -2938,6 +3141,7 @@ "该记录不包含可用的 token 统计口径。": "Bản ghi này không chứa thống kê token khả dụng.", "详情": "Chi tiết", "详细信息": "Thông tin chi tiết", + "详见「特殊倍率」和「可用分组」标签页。": "See \"Special Ratios\" and \"Usable Groups\" tabs for details.", "语言": "Ngôn ngữ", "语言偏好": "Tùy chọn ngôn ngữ", "语言偏好已保存": "Tùy chọn ngôn ngữ đã được lưu", @@ -2946,10 +3150,10 @@ "语音输入": "Đầu vào giọng nói", "语音输出": "Đầu ra giọng nói", "说明": "Mô tả", + "说明信息": "Thông tin mô tả", "说明:": "Mô tả: ", "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。": "Lưu ý: Bài kiểm tra trên trang này sử dụng yêu cầu không streaming. Nếu kênh chỉ hỗ trợ phản hồi streaming, bài kiểm tra có thể thất bại. Vui lòng dựa vào sử dụng thực tế.", "说明:生成结果是可直接粘贴到渠道密钥里的 JSON(包含 access_token / refresh_token / account_id)。": "Lưu ý: Kết quả tạo ra là JSON có thể dán trực tiếp vào khóa kênh (bao gồm access_token / refresh_token / account_id).", - "说明信息": "Thông tin mô tả", "请上传": "Vui lòng tải lên", "请上传图片": "Vui lòng tải lên hình ảnh", "请上传密钥文件": "Vui lòng tải lên tệp khóa", @@ -2957,16 +3161,19 @@ "请上传文件": "Vui lòng tải lên tệp", "请为渠道命名": "Vui lòng đặt tên cho kênh", "请使用 Project 为 io.cloud 的密钥": "Please use a key with Project set to io.cloud", + "请先勾选需要批量设置的模型": "Vui lòng chọn các mô hình cần thiết lập hàng loạt trước", "请先在设置中启用图片功能": "Vui lòng bật chức năng hình ảnh trong cài đặt trước", "请先填写 API Key": "Please fill in API Key first", "请先填写 Discovery URL 或 Issuer URL": "Vui lòng điền Discovery URL hoặc Issuer URL trước", "请先填写 Issuer URL,以自动生成完整的端点 URL": "Vui lòng điền Issuer URL trước để tự động tạo URL endpoint đầy đủ", "请先填写 Ollama API 地址": "Please fill in Ollama API address first", "请先填写服务器地址": "Vui lòng điền địa chỉ máy chủ trước", + "请先开启并填写音频输入价格。": "Hãy bật và điền giá đầu vào âm thanh trước.", "请先登录": "Vui lòng đăng nhập trước", "请先登录!": "Vui lòng đăng nhập trước!", "请先粘贴回调 URL": "Vui lòng dán URL callback trước", "请先输入密钥": "Vui lòng nhập khóa trước", + "请先选择一个作为模板的模型": "Vui lòng chọn trước một mô hình làm mẫu", "请先选择一条规则": "Vui lòng chọn một quy tắc trước", "请先选择同步渠道": "Vui lòng chọn kênh đồng bộ trước", "请先选择模型!": "Vui lòng chọn mô hình trước!", @@ -3035,6 +3242,7 @@ "请求超时,请刷新页面后重新发起 GitHub 登录": "Hết thời gian chờ, vui lòng làm mới trang và đăng nhập GitHub lại", "请求路径": "Đường dẫn yêu cầu", "请求转换": "Chuyển đổi yêu cầu", + "请求配置": "Cấu hình yêu cầu", "请求量": "Khối lượng yêu cầu", "请求预扣费额度": "Hạn ngạch khấu trừ trước yêu cầu", "请求频率": "Tần suất yêu cầu", @@ -3062,13 +3270,11 @@ "请输入": "Vui lòng nhập", "请输入 API Key,一行一个,格式:APIKey|Region": "Enter API Key, one per line, format: APIKey|Region", "请输入 API Key,格式:APIKey|Region": "Enter API Key, format: APIKey|Region", - "请输入 Authorization Endpoint": "Vui lòng nhập Authorization Endpoint", "请输入 AZURE_OPENAI_ENDPOINT,例如:https://docs-test-001.openai.azure.com": "Vui lòng nhập AZURE_OPENAI_ENDPOINT, ví dụ: https://docs-test-001.openai.azure.com", + "请输入 Authorization Endpoint": "Vui lòng nhập Authorization Endpoint", "请输入 Client ID": "Vui lòng nhập Client ID", "请输入 Client Secret": "Vui lòng nhập Client Secret", "请输入 ID": "Vui lòng nhập ID", - "请输入 io.net API Key": "Please enter io.net API Key", - "请输入 io.net API Key(敏感信息不显示)": "Please enter io.net API Key (sensitive information not displayed)", "请输入 JSON 格式的 OAuth 凭据,例如:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}": "Vui lòng nhập thông tin OAuth dạng JSON, VD:\n{\n \"access_token\": \"...\",\n \"account_id\": \"...\" \n}", "请输入 JSON 格式的密钥内容,例如:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}": "Vui lòng nhập nội dung khóa ở định dạng JSON, ví dụ:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}", "请输入 OIDC 的 Well-Known URL": "Vui lòng nhập Well-Known URL của OIDC", @@ -3076,6 +3282,8 @@ "请输入 Token Endpoint": "Vui lòng nhập Token Endpoint", "请输入 URL": "Vui lòng nhập URL", "请输入 User Info Endpoint": "Vui lòng nhập User Info Endpoint", + "请输入 io.net API Key": "Please enter io.net API Key", + "请输入 io.net API Key(敏感信息不显示)": "Please enter io.net API Key (sensitive information not displayed)", "请输入6位验证码或8位备用码": "Vui lòng nhập mã xác minh 6 chữ số hoặc mã dự phòng 8 chữ số", "请输入API地址": "Vui lòng nhập địa chỉ API", "请输入API地址!": "Vui lòng nhập địa chỉ API!", @@ -3085,9 +3293,9 @@ "请输入Gotify服务器地址": "Vui lòng nhập địa chỉ máy chủ Gotify", "请输入Gotify服务器地址,例如: https://gotify.example.com": "Vui lòng nhập địa chỉ máy chủ Gotify, ví dụ: https://gotify.example.com", "请输入JSON数组,如 [\"model-a\",\"model-b\"]": "Vui lòng nhập mảng JSON, ví dụ [\"model-a\",\"model-b\"]", + "请输入URL链接": "Vui lòng nhập liên kết URL", "请输入Uptime Kuma地址": "Vui lòng nhập địa chỉ Uptime Kuma", "请输入Uptime Kuma服务地址,如:https://status.example.com": "Vui lòng nhập địa chỉ dịch vụ Uptime Kuma, như: https://status.example.com", - "请输入URL链接": "Vui lòng nhập liên kết URL", "请输入Webhook地址": "Vui lòng nhập địa chỉ Webhook", "请输入Webhook地址,例如: https://example.com/webhook": "Vui lòng nhập địa chỉ Webhook, ví dụ: https://example.com/webhook", "请输入个人简介": "Vui lòng nhập tiểu sử", @@ -3120,14 +3328,14 @@ "请输入备注(仅管理员可见)": "Vui lòng nhập ghi chú (chỉ quản trị viên mới thấy)", "请输入套餐标题": "Vui lòng nhập tiêu đề gói", "请输入完整的 JSON 格式密钥内容": "Vui lòng nhập nội dung khóa định dạng JSON đầy đủ", - "请输入完整的URL,例如:https://api.openai.com/v1/chat/completions": "Vui lòng nhập URL đầy đủ, ví dụ: https://api.openai.com/v1/chat/completions", "请输入完整的URL链接": "Vui lòng nhập liên kết URL đầy đủ", + "请输入完整的URL,例如:https://api.openai.com/v1/chat/completions": "Vui lòng nhập URL đầy đủ, ví dụ: https://api.openai.com/v1/chat/completions", "请输入容器名称": "Please enter container name", "请输入密码": "Vui lòng nhập mật khẩu", "请输入密钥": "Vui lòng nhập khóa", + "请输入密钥!": "Vui lòng nhập khóa!", "请输入密钥,一行一个": "Vui lòng nhập khóa, mỗi dòng một cái", "请输入密钥,一行一个,格式:AccessKey|SecretAccessKey|Region": "Enter keys one per line, format: AccessKey|SecretAccessKey|Region", - "请输入密钥!": "Vui lòng nhập khóa!", "请输入延长时长": "Please enter extension duration", "请输入总额度": "Vui lòng nhập tổng hạn mức", "请输入您的密码": "Vui lòng nhập mật khẩu của bạn", @@ -3164,6 +3372,7 @@ "请输入模型名称,例如: llama3.2, qwen2.5:7b": "Please enter model name, e.g.: llama3.2, qwen2.5:7b", "请输入模型名称,如:gpt-4": "Vui lòng nhập tên mô hình, như: gpt-4", "请输入模型描述": "Vui lòng nhập mô tả mô hình", + "请输入汇率": "Vui lòng nhập tỷ giá hối đoái", "请输入消息内容...": "Vui lòng nhập nội dung tin nhắn...", "请输入渠道名称": "Vui lòng nhập tên kênh", "请输入状态页面Slug": "Vui lòng nhập Slug trang trạng thái", @@ -3195,9 +3404,9 @@ "请输入转账金额": "Vui lòng nhập số tiền chuyển", "请输入运行时长": "Please enter runtime duration", "请输入邮箱": "Vui lòng nhập email", - "请输入邮箱!": "Vui lòng nhập email của bạn!", "请输入邮箱地址": "Vui lòng nhập địa chỉ email", "请输入邮箱验证码!": "Vui lòng nhập mã xác minh email!", + "请输入邮箱!": "Vui lòng nhập email của bạn!", "请输入部署名称": "Please enter deployment name", "请输入部署名称以完成二次确认": "Enter deployment name to complete secondary confirmation", "请输入部署地区,例如:us-central1\n支持使用模型映射格式\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}": "Vui lòng nhập khu vực triển khai, ví dụ: us-central1\nHỗ trợ sử dụng định dạng ánh xạ mô hình\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}", @@ -3263,9 +3472,6 @@ "调用次数排行": "Xếp hạng số lần gọi", "调试信息": "Thông tin gỡ lỗi", "谨慎": "Thận trọng", - "警告": "Cảnh báo", - "警告:启用保活后,如果已经写入保活数据后渠道出错,系统无法重试,如果必须开启,推荐设置尽可能大的Ping间隔": "Cảnh báo: Sau khi bật giữ kết nối, nếu kênh bị lỗi sau khi dữ liệu giữ kết nối đã được ghi, hệ thống không thể thử lại. Nếu bắt buộc phải bật, nên đặt khoảng thời gian Ping càng lớn càng tốt", - "警告:禁用两步验证将永久删除您的验证设置和所有备用码,此操作不可撤销!": "Cảnh báo: Vô hiệu hóa xác thực hai yếu tố sẽ xóa vĩnh viễn cài đặt xác minh và tất cả mã dự phòng của bạn, thao tác này không thể hoàn tác!", "豆包": "Doubao", "财务": "Tài chính", "账单": "Hóa đơn", @@ -3298,6 +3504,7 @@ "购买套餐后即可享受模型权益": "Mua gói để nhận quyền lợi mô hình", "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。": "Mua hoặc thêm thủ công đăng ký sẽ nâng cấp lên nhóm này. Khi gói hết hạn/vô hiệu/xóa, sẽ quay lại nhóm trước. Việc quay lại không áp dụng ngay và thường mất vài phút.", "购买订阅套餐": "Mua gói đăng ký", + "购买订阅获得模型额度/次数": "Mua đăng ký để nhận hạn mức/lượt dùng mô hình", "费率": "Tỷ lệ", "费用信息": "Cost Information", "费用预估": "Cost Estimate", @@ -3312,6 +3519,7 @@ "跟随日志": "Follow Logs", "跟随系统主题设置": "Theo cài đặt chủ đề hệ thống", "跨分组": "Giữa các nhóm", + "跨分组特殊倍率": "Cross-Group Special Ratios", "跨分组重试": "Thử lại giữa các nhóm", "路径正则": "Regex đường dẫn", "路径正则(每行一个)": "Regex đường dẫn (mỗi dòng một mục)", @@ -3329,9 +3537,11 @@ "输入 OIDC 的 Client ID": "Nhập Client ID của OIDC", "输入 OIDC 的 Token Endpoint": "Nhập Token Endpoint của OIDC", "输入 OIDC 的 Userinfo Endpoint": "Nhập Userinfo Endpoint của OIDC", + "输入 {{price}} / 1M tokens": "Đầu vào {{price}} / 1M tokens", "输入IP地址后回车,如:8.8.8.8": "Nhập địa chỉ IP và nhấn Enter, ví dụ: 8.8.8.8", "输入JSON对象": "Nhập đối tượng JSON", "输入价格": "Giá đầu vào", + "输入价格 {{symbol}}{{price}} / 1M tokens": "Giá đầu vào {{symbol}}{{price}} / 1M tokens", "输入价格:{{symbol}}{{price}} / 1M tokens": "Giá đầu vào: {{symbol}}{{price}} / 1M tokens", "输入价格:{{symbol}}{{price}} / 1M tokens{{audioPrice}}": "Giá đầu vào: {{symbol}}{{price}} / 1M tokens{{audioPrice}}", "输入你注册的 LinuxDO OAuth APP 的 ID": "Nhập ID của LinuxDO OAuth APP bạn đã đăng ký", @@ -3345,6 +3555,7 @@ "输入旧密码": "Nhập mật khẩu cũ", "输入标签或使用\",\"分隔多个标签": "Nhập thẻ hoặc sử dụng \",\" để phân tách nhiều thẻ", "输入模型倍率": "Nhập tỷ lệ mô hình", + "输入模型名称,例如 gpt-4.1": "Nhập tên mô hình, ví dụ gpt-4.1", "输入每次价格": "Nhập giá mỗi lần", "输入端口后回车,如:80 或 8000-8999": "Nhập cổng và nhấn Enter, ví dụ: 80 hoặc 8000-8999", "输入系统提示词,用户的系统提示词将优先于此设置": "Nhập từ nhắc hệ thống, từ nhắc hệ thống của người dùng sẽ được ưu tiên hơn cài đặt này", @@ -3362,8 +3573,13 @@ "输出": "Đầu ra", "输出 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}}) * {{ratioType}} {{ratio}}": "Đầu ra {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}}) * {{ratioType}} {{ratio}}", "输出价格": "Giá đầu ra", + "输出价格 {{symbol}}{{price}} / 1M tokens": "Giá đầu ra {{symbol}}{{price}} / 1M tokens", "输出价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "Giá đầu ra: {{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (Tỷ lệ hoàn thành: {{completionRatio}})", + "输出价格:{{symbol}}{{price}} / 1M tokens": "Giá đầu ra: {{symbol}}{{price}} / 1M tokens", + "输出价格:{{symbol}}{{total}} / 1M tokens": "Giá đầu ra: {{symbol}}{{total}} / 1M tokens", "输出倍率 {{completionRatio}}": "Output ratio {{completionRatio}}", + "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Đầu ra: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * hệ số hoàn thành {{completionRatio}} * {{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}}", "边栏设置": "Cài đặt thanh bên", "过期于": "Hết hạn vào", "过期时间": "Thời gian hết hạn", @@ -3383,6 +3599,8 @@ "返回列表": "Quay lại danh sách", "返回登录": "Quay lại đăng nhập", "返回首页": "Quay lại trang chủ", + "这个界面默认按价格填写,保存时会自动换算回后端需要的倍率 JSON。": "Giao diện này mặc định nhập theo giá, khi lưu sẽ tự động quy đổi lại thành JSON tỷ lệ mà backend yêu cầu.", + "这些价格都是可选项,不填也可以。": "Tất cả các mức giá này đều là tùy chọn và có thể để trống.", "这将删除超过 10 分钟未使用的临时缓存文件": "Điều này sẽ xóa các tệp cache tạm thời không được sử dụng trong hơn 10 phút", "这是基础金额,实际扣费 = 基础金额 x 系统分组倍率。": "Đây là số tiền cơ bản. Số tiền trừ thực tế = số tiền cơ bản × tỷ lệ nhóm hệ thống.", "这是重复键中的最后一个,其值将被使用": "Đây là khóa cuối cùng trong số các khóa trùng lặp và giá trị của nó sẽ được sử dụng", @@ -3394,8 +3612,10 @@ "违规扣费": "Khấu phí vi phạm", "违规扣费金额": "Số tiền trừ phí vi phạm", "连接保活设置": "Cài đặt giữ kết nối", + "连接信息已填入": "Đã áp dụng thông tin kết nối", "连接已断开": "Kết nối đã ngắt", "连接测试中...": "Testing connection...", + "追加": "Append", "追加到现有密钥": "Thêm vào khóa hiện có", "追加模式:将新密钥添加到现有密钥列表末尾": "Chế độ thêm: thêm khóa mới vào cuối danh sách khóa hiện có", "追加模式:新密钥将添加到现有密钥列表的末尾": "Chế độ thêm: khóa mới sẽ được thêm vào cuối danh sách khóa hiện có", @@ -3404,13 +3624,17 @@ "退出全屏": "Thoát toàn màn hình", "退出登录": "Đăng xuất", "退款": "Hoàn tiền", + "适合 MJ / 任务类等按次收费模型。": "Phù hợp cho MJ và các mô hình tính phí theo lượt gọi tương tự.", + "适合同系列模型一起定价,例如把 gpt-5.1 的价格批量同步到 gpt-5.1-high、gpt-5.1-low 等模型。": "Phù hợp để định giá cùng lúc các biến thể cùng dòng, ví dụ đồng bộ giá của gpt-5.1 sang gpt-5.1-high, gpt-5.1-low và các mô hình tương tự.", "适用于个人使用的场景,不需要设置模型价格": "Phù hợp cho mục đích sử dụng cá nhân, không cần đặt giá mô hình.", "适用于为多个用户提供服务的场景": "Phù hợp cho các kịch bản cung cấp dịch vụ cho nhiều người dùng.", "适用于展示系统功能的场景,提供基础功能演示": "Phù hợp cho các kịch bản hiển thị chức năng hệ thống, cung cấp bản demo chức năng cơ bản.", "适配 -thinking、-thinking-预算数字 和 -nothinking 后缀": "Thích ứng với các hậu tố -thinking, -thinking-budget number, -nothinking và -low/-medium/-high", "选填": "Tùy chọn", "选择": "Chọn", + "选择 premium 创建的令牌,调用 API 时费用为 standard 的 50%。": "Tokens created with premium cost 50% of standard when calling APIs.", "选择主题": "Chọn chủ đề", + "选择使用分组": "Select using group", "选择充值套餐": "Chọn gói nạp tiền", "选择充值额度": "Chọn hạn ngạch nạp tiền", "选择全部": "Chọn tất cả", @@ -3436,6 +3660,7 @@ "选择渠道": "Chọn kênh", "选择状态": "Select Status", "选择用户": "Chọn người dùng", + "选择用户分组": "Select user group", "选择硬件类型": "Select Hardware Type", "选择端点类型": "Chọn loại điểm cuối", "选择类型": "Chọn loại", @@ -3469,8 +3694,10 @@ "通过 Google 登录": "Đăng nhập qua Google", "通过 Telegram 登录": "Đăng nhập qua Telegram", "通过 WeChat 登录": "Đăng nhập qua WeChat", + "通过分组可以实现不同用户等级的差异化定价,例如 VIP 用户享受更低的 API 调用费用。": "Groups enable differentiated pricing for different user tiers. For example, VIP users can enjoy lower API costs.", "通过划转功能将奖励额度转入到您的账户余额中": "Chuyển số tiền thưởng vào số dư tài khoản của bạn thông qua chức năng chuyển tiền", "通过密码注册时需要进行邮箱验证": "Xác minh email là bắt buộc khi đăng ký bằng mật khẩu", + "通过此功能,可以根据用户所在分组,为不同等级的用户展示不同的可选列表。": "This feature allows showing different selectable group lists to users of different tiers.", "通过邮箱重置密码": "Đặt lại mật khẩu qua email", "通过验证码重置密码": "Đặt lại mật khẩu qua mã xác minh", "通道": "Kênh", @@ -3548,6 +3775,7 @@ "配置信息": "Thông tin cấu hình", "配置列表": "Danh sách cấu hình", "配置名称": "Tên cấu hình", + "配置后的效果:": "After configuration:", "配置和消息已全部重置": "Cấu hình và tin nhắn đã được đặt lại hoàn toàn", "配置套餐的有效时长": "Cấu hình thời lượng hiệu lực của gói", "配置如何从用户信息 API 响应中提取用户数据,支持 JSONPath 语法": "Cấu hình cách trích xuất dữ liệu người dùng từ phản hồi API thông tin người dùng, hỗ trợ cú pháp JSONPath", @@ -3563,6 +3791,7 @@ "配置有效的 io.net API Key": "Configure a valid io.net API Key", "配置服务器端请求伪造(SSRF)防护,用于保护内网资源安全": "Cấu hình bảo vệ giả mạo yêu cầu phía máy chủ (SSRF) để bảo vệ an toàn tài nguyên mạng nội bộ", "配置模型部署服务提供商的API密钥和启用状态": "Configure the API key and enabled status of the model deployment service provider", + "配置特殊倍率后:": "After configuring special ratios:", "配置登录注册": "Cấu hình Đăng nhập/Đăng ký", "配置管理": "Quản lý cấu hình", "配置自定义 OAuth 提供商,支持 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 协议的身份提供商": "Cấu hình nhà cung cấp OAuth tùy chỉnh, hỗ trợ GitHub Enterprise, GitLab, Gitea, Nextcloud, Keycloak, ORY và các nhà cung cấp danh tính tương thích OAuth 2.0 khác", @@ -3570,6 +3799,7 @@ "配置详情": "Chi tiết cấu hình", "配置说明": "Hướng dẫn cấu hình", "配置邮箱域名白名单": "Cấu hình danh sách trắng tên miền email", + "配置:": "Cấu hình:", "重发": "Gửi lại", "重发验证码": "Gửi lại mã xác minh", "重启部署失败": "Failed to restart deployment", @@ -3636,6 +3866,7 @@ "键为端点类型,值为路径和方法对象": "Khóa là loại điểm cuối, giá trị là đối tượng đường dẫn và phương thức", "键为请求中的模型名称,值为要替换的模型名称": "Khóa là tên mô hình trong yêu cầu, giá trị là tên mô hình cần thay thế", "键名": "Tên khóa", + "键的前缀 +: 表示添加,-: 表示移除,无前缀表示追加。值为分组描述(移除时填 \"remove\")。": "Key prefix +: means add, -: means remove, no prefix means append. Value is the group description (use \"remove\" for removal).", "镜像": "Gương", "镜像仓库密码": "Image Registry Password", "镜像仓库用户名": "Image Registry Username", @@ -3659,15 +3890,15 @@ "限制周期统一使用上方配置的“限制周期”值。": "Chu kỳ giới hạn sử dụng thống nhất giá trị \"Chu kỳ giới hạn\" được cấu hình ở trên.", "限流": "Giới hạn tốc độ", "限购": "Giới hạn mua", + "随机": "Ngẫu nhiên", + "随机模式": "Chế độ ngẫu nhiên", + "随机种子 (留空为随机)": "Hạt giống ngẫu nhiên (để trống cho ngẫu nhiên)", "隐私政策": "Chính sách bảo mật", "隐私政策已更新": "Chính sách bảo mật đã được cập nhật", "隐私政策更新失败": "Cập nhật chính sách bảo mật thất bại", "隐私设置": "Cài đặt quyền riêng tư", "隐藏操作项": "Ẩn hành động", "隐藏调试": "Ẩn gỡ lỗi", - "随机": "Ngẫu nhiên", - "随机模式": "Chế độ ngẫu nhiên", - "随机种子 (留空为随机)": "Hạt giống ngẫu nhiên (để trống cho ngẫu nhiên)", "零一万物": "01.AI", "需要安全验证": "Yêu cầu xác minh bảo mật", "需要添加的额度(支持负数)": "Hạn ngạch cần thêm (hỗ trợ số âm)", @@ -3677,14 +3908,21 @@ "非必要,不建议启用模型限制": "Không cần thiết, không nên bật giới hạn mô hình", "非流": "không luồng", "音乐预览": "Xem trước nhạc", + "音频倍率 {{audioRatio}}": "Hệ số âm thanh {{audioRatio}}", "音频倍率(仅部分模型支持该计费)": "Tỷ lệ âm thanh (chỉ được hỗ trợ bởi một số mô hình để tính phí)", "音频提示 {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}": "Gợi ý âm thanh {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + Hoàn thành âm thanh {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}", "音频提示价格:{{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens (音频倍率: {{audioRatio}})": "Giá gợi ý âm thanh: {{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens (Tỷ lệ âm thanh: {{audioRatio}})", "音频无法播放": "Không thể phát âm thanh", + "音频补全价格": "Giá hoàn thành âm thanh", "音频补全价格:{{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens (音频补全倍率: {{audioCompRatio}})": "Giá hoàn thành âm thanh: {{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens (Tỷ lệ hoàn thành âm thanh: {{audioCompRatio}})", + "音频补全价格:{{symbol}}{{price}} / 1M tokens": "Giá hoàn thành âm thanh: {{symbol}}{{price}} / 1M tokens", "音频补全倍率(仅部分模型支持该计费)": "Tỷ lệ hoàn thành âm thanh (chỉ được hỗ trợ bởi một số mô hình để tính phí)", + "音频输入价格": "Giá đầu vào âm thanh", + "音频输入价格:{{symbol}}{{price}} / 1M tokens": "Giá đầu vào âm thanh: {{symbol}}{{price}} / 1M tokens", "音频输入相关的倍率设置,键为模型名称,值为倍率": "Cài đặt tỷ lệ liên quan đến đầu vào âm thanh, khóa là tên mô hình, giá trị là tỷ lệ", + "音频输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Đầu vào âm thanh: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * hệ số âm thanh {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "音频输出补全相关的倍率设置,键为模型名称,值为倍率": "Cài đặt tỷ lệ liên quan đến hoàn thành đầu ra âm thanh, khóa là tên mô hình, giá trị là tỷ lệ", + "音频输出:{{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}}", "页脚": "Chân trang", "页面未找到,请检查您的浏览器地址是否正确": "Không tìm thấy trang, vui lòng kiểm tra xem địa chỉ trình duyệt của bạn có chính xác không", "顶栏管理": "Quản lý thanh tiêu đề", @@ -3697,17 +3935,21 @@ "预填组管理": "Quản lý nhóm điền sẵn", "预扣": "Khấu trừ trước", "预览失败": "Xem trước thất bại", + "预览效果": "Xem trước", "预览更新": "Xem trước cập nhật", "预览模板": "Xem trước mẫu", "预览请求体": "Xem trước thân yêu cầu", + "预警阈值必须为正数": "Ngưỡng cảnh báo phải là số dương", "预计结束": "Estimated End", "预设模板": "Mẫu đặt trước", - "预警阈值必须为正数": "Ngưỡng cảnh báo phải là số dương", "频率惩罚,减少重复词汇的出现": "Phạt tần suất, giảm sự lặp lại của từ", "频率限制的周期(分钟)": "Chu kỳ giới hạn tần suất (phút)", "颜色": "Màu sắc", + "额外价格项": "Mục giá bổ sung", + "额外设置": "Cài đặt bổ sung", "额度": "Hạn ngạch", "额度充值": "Nạp hạn mức", + "额度展示类型": "Loại hiển thị hạn mức", "额度必须大于0": "Hạn ngạch phải lớn hơn 0", "额度提醒阈值": "Ngưỡng nhắc nhở hạn ngạch", "额度查询接口返回令牌额度而非用户额度": "Giao diện truy vấn hạn ngạch trả về hạn ngạch mã thông báo thay vì hạn ngạch người dùng", @@ -3728,160 +3970,30 @@ "验证身份": "Xác minh danh tính", "验证配置错误": "Lỗi cấu hình xác minh", "高级": "Nâng cao", + "高级套餐,半价优惠": "Premium plan, 50% off", "高级文本编辑": "Chỉnh sửa văn bản nâng cao", "高级设置": "Cài đặt nâng cao", "高级选项": "Tùy chọn nâng cao", "高级配置": "Advanced Configuration", - "核心配置": "Cấu hình cốt lõi", - "创建渠道所需的基本信息": "Thông tin cơ bản cần thiết để tạo kênh", - "请求配置": "Cấu hình yêu cầu", - "渠道行为": "Hành vi kênh", - "额外设置": "Cài đặt bổ sung", - "上游模型管理": "Quản lý mô hình thượng nguồn", "黑名单": "Danh sách đen", "默认": "Mặc định", "默认 API 版本": "Phiên bản API mặc định", "默认 Responses API 版本,为空则使用上方版本": "Phiên bản Responses API mặc định, nếu để trống sẽ sử dụng phiên bản ở trên", "默认 TTL(秒)": "TTL mặc định (giây)", "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)": "Mặc định dùng tỷ lệ tạo bộ nhớ đệm 5m; tỷ lệ tạo bộ nhớ đệm 1h được tự động tính bằng phép nhân cố định (hiện là 1.6x)", + "默认使用auto分组": "Default to auto group", "默认使用系统名称": "Mặc định sử dụng tên hệ thống", "默认助手消息": "Xin chào! Tôi có thể giúp gì cho bạn?", "默认区域": "Khu vực mặc định", "默认区域,如: us-central1": "Khu vực mặc định, ví dụ: us-central1", + "默认情况下,所有用户创建令牌时看到的可选分组列表是一样的(即「用户可选」列勾选的分组)。": "By default, all users see the same selectable group list when creating tokens (i.e., groups with \"User Selectable\" checked).", "默认折叠侧边栏": "Mặc định thu gọn thanh bên", "默认测试模型": "Mô hình kiểm tra mặc định", "默认用户消息": "Xin chào", "默认补全倍率": "Tỷ lệ hoàn thành mặc định", - "提示:端点映射仅用于模型广场展示,不会影响模型真实调用。如需配置真实调用,请前往「渠道管理」。": "Lưu ý: Ánh xạ endpoint chỉ dùng để hiển thị trong \"Chợ mô hình\" và không ảnh hưởng đến việc gọi thực tế. Để cấu hình gọi thực tế, vui lòng vào \"Quản lý kênh\".", - "购买订阅获得模型额度/次数": "Mua đăng ký để nhận hạn mức/lượt dùng mô hình", - "生产环境 RSA 私钥 Base64 (PKCS#8 DER)": "Khóa riêng RSA Base64 (PKCS#8 DER) môi trường sản xuất", - "沙盒环境 RSA 私钥 Base64 (PKCS#8 DER)": "Khóa riêng RSA Base64 (PKCS#8 DER) môi trường sandbox", - "生产环境 Waffo 公钥 Base64 (X.509 DER)": "Khóa công khai Waffo Base64 (X.509 DER) môi trường sản xuất", - "沙盒环境 Waffo 公钥 Base64 (X.509 DER)": "Khóa công khai Waffo Base64 (X.509 DER) môi trường sandbox", - "支付方式类型": "Loại phương thức thanh toán", - "支付方式名称": "Tên phương thức thanh toán", - "获取充值配置失败": "Không thể lấy cấu hình nạp tiền", - "获取充值配置异常": "Lỗi cấu hình nạp tiền", - "分组相关设置": "Cài đặt liên quan đến nhóm", - "保存分组相关设置": "Lưu cài đặt liên quan đến nhóm", - "此页面仅显示未设置价格或基础倍率的模型,设置后会自动从列表中移出": "Trang này chỉ hiển thị các mô hình chưa thiết lập giá hoặc tỷ lệ cơ bản. Sau khi lưu, chúng sẽ tự động biến mất khỏi danh sách.", - "没有未设置定价的模型": "Không có mô hình chưa thiết lập giá", - "当前没有未设置定价的模型": "Hiện không có mô hình nào chưa thiết lập giá", - "模型计费编辑器": "Trình chỉnh sửa giá mô hình", - "价格摘要": "Tóm tắt giá", - "当前提示": "Gợi ý hiện tại", - "这个界面默认按价格填写,保存时会自动换算回后端需要的倍率 JSON。": "Giao diện này mặc định nhập theo giá, khi lưu sẽ tự động quy đổi lại thành JSON tỷ lệ mà backend yêu cầu.", - "当前未启用,需要时再打开即可。": "Trường này hiện đang tắt. Hãy bật khi cần.", - "下面展示这个模型保存后会写入哪些后端字段,便于和原始 JSON 编辑框保持一致。": "Bên dưới hiển thị các trường backend sẽ được ghi sau khi lưu, giúp bạn dễ đối chiếu với ô chỉnh sửa JSON gốc.", - "补全价格已锁定": "Giá hoàn thành đã bị khóa", - "后端固定倍率:{{ratio}}。该字段仅展示换算后的价格。": "Tỷ lệ cố định từ backend: {{ratio}}. Trường này chỉ hiển thị giá sau khi quy đổi.", - "这些价格都是可选项,不填也可以。": "Tất cả các mức giá này đều là tùy chọn và có thể để trống.", - "请先开启并填写音频输入价格。": "Hãy bật và điền giá đầu vào âm thanh trước.", - "输入模型名称,例如 gpt-4.1": "Nhập tên mô hình, ví dụ gpt-4.1", - "当前模型同时存在按次价格和倍率配置,保存时会按当前计费方式覆盖。": "Mô hình này hiện đồng thời có giá theo lượt gọi và cấu hình tỷ lệ. Khi lưu, dữ liệu sẽ bị ghi đè theo chế độ tính phí hiện tại.", - "当前模型存在未显式设置输入倍率的扩展倍率;填写输入价格后会自动换算为价格字段。": "Mô hình này có các tỷ lệ mở rộng mà chưa đặt rõ tỷ lệ đầu vào; sau khi điền giá đầu vào, chúng sẽ tự động được quy đổi thành trường giá.", - "按量计费下需要先填写输入价格,才能保存其它价格项。": "Ở chế độ tính phí theo lượng, cần điền giá đầu vào trước thì mới lưu được các mục giá khác.", - "填写音频补全价格前,需要先填写音频输入价格。": "Trước khi nhập giá hoàn thành âm thanh, hãy nhập giá đầu vào âm thanh trước.", - "模型 {{name}} 缺少输入价格,无法计算补全/缓存/图片/音频价格对应的倍率": "Mô hình {{name}} thiếu giá đầu vào, nên không thể tính tỷ lệ tương ứng cho giá hoàn thành, bộ nhớ đệm, hình ảnh và âm thanh.", - "模型 {{name}} 缺少音频输入价格,无法计算音频补全倍率": "Mô hình {{name}} thiếu giá đầu vào âm thanh, nên không thể tính tỷ lệ hoàn thành âm thanh.", - "批量应用当前模型价格": "Áp dụng hàng loạt giá của mô hình hiện tại", - "请先选择一个作为模板的模型": "Vui lòng chọn trước một mô hình làm mẫu", - "请先勾选需要批量设置的模型": "Vui lòng chọn các mô hình cần thiết lập hàng loạt trước", - "已将模型 {{name}} 的价格配置批量应用到 {{count}} 个模型": "Đã áp dụng hàng loạt cấu hình giá của mô hình {{name}} cho {{count}} mô hình", - "将把当前编辑中的模型 {{name}} 的价格配置,批量应用到已勾选的 {{count}} 个模型。": "Cấu hình giá của mô hình đang chỉnh sửa {{name}} sẽ được áp dụng hàng loạt cho {{count}} mô hình đã chọn.", - "适合同系列模型一起定价,例如把 gpt-5.1 的价格批量同步到 gpt-5.1-high、gpt-5.1-low 等模型。": "Phù hợp để định giá cùng lúc các biến thể cùng dòng, ví dụ đồng bộ giá của gpt-5.1 sang gpt-5.1-high, gpt-5.1-low và các mô hình tương tự.", - "已勾选": "Đã chọn", - "当前编辑": "Đang chỉnh sửa", - "已勾选 {{count}} 个模型": "Đã chọn {{count}} mô hình", - "计费方式": "Chế độ tính phí", - "未设置价格": "Chưa thiết lập giá", - "保存预览": "Xem trước khi lưu", - "基础价格": "Giá cơ bản", - "扩展价格": "Giá mở rộng", - "额外价格项": "Mục giá bổ sung", - "补全价格": "Giá hoàn thành", - "缓存读取价格": "Giá đọc bộ nhớ đệm đầu vào", - "缓存创建价格": "Giá tạo bộ nhớ đệm đầu vào", - "图片输入价格": "Giá đầu vào hình ảnh", - "音频输入价格": "Giá đầu vào âm thanh", - "音频补全价格": "Giá hoàn thành âm thanh", - "适合 MJ / 任务类等按次收费模型。": "Phù hợp cho MJ và các mô hình tính phí theo lượt gọi tương tự.", - "该模型补全倍率由后端固定为 {{ratio}}。补全价格不能在这里修改。": "Tỷ lệ hoàn thành của mô hình này được backend cố định ở {{ratio}}. Không thể chỉnh giá hoàn thành tại đây.", - "计费显示模式": "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", - "缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Giá tạo bộ nhớ đệm: {{symbol}}{{price}} / 1M tokens", - "缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Giá tạo bộ nhớ đệm {{symbol}}{{price}} / 1M tokens", - "5m缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Giá tạo bộ nhớ đệm 5m: {{symbol}}{{price}} / 1M tokens", - "5m缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Giá tạo bộ nhớ đệm 5m {{symbol}}{{price}} / 1M tokens", - "1h缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Giá tạo bộ nhớ đệm 1h: {{symbol}}{{price}} / 1M tokens", - "1h缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Giá tạo bộ nhớ đệm 1h {{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 hình ảnh {{symbol}}{{price}} / 1M tokens", - "输入价格 {{symbol}}{{price}} / 1M tokens": "Giá đầu vào {{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", - "文件搜索调用 {{fileSearchCallCount}} 次": "Đã gọi tìm kiếm tệp {{fileSearchCallCount}} lần", - "图片倍率 {{imageRatio}}": "Hệ số hình ảnh {{imageRatio}}", - "音频倍率 {{audioRatio}}": "Hệ số âm thanh {{audioRatio}}", - "普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Đầu vào thường: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "缓存输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Đầu vào bộ nhớ đệm: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * hệ số bộ nhớ đệm {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 图片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Đầu vào hình ảnh: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * hệ số hình ảnh {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Đầu vào âm thanh: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * hệ số âm thanh {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Đầu ra: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * hệ số hoàn thành {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "Web 搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Tìm kiếm Web: {{count}} / 1K * đơn giá {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "文件搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Tìm kiếm tệp: {{count}} / 1K * đơn giá {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片生成:1 次 * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Tạo ảnh: 1 lần gọi * đơn giá {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "合计:{{total}}": "Tổng cộng: {{total}}", - "模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},音频倍率 {{audioRatio}},音频补全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}": "Hệ số mô hình {{modelRatio}}, hệ số hoàn thành {{completionRatio}}, hệ số âm thanh {{audioRatio}}, hệ số hoàn thành âm thanh {{audioCompletionRatio}}, {{cachePart}}{{ratioType}} {{ratio}}", - "文字输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Đầu ra văn bản: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * hệ số hoàn thành {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输出:{{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}}", - "缓存读取:{{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", - "{{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", - "复制密钥": "Sao chép khóa", - "复制连接信息": "Sao chép thông tin kết nối", - "检测到剪贴板中的连接信息": "Phát hiện thông tin kết nối trong bộ nhớ tạm", - "自动填入": "Tự động điền", - "忽略": "Bỏ qua", - "从剪贴板粘贴配置": "Dán cấu hình", - "剪贴板中未检测到连接信息": "Không tìm thấy thông tin kết nối trong bộ nhớ tạm", - "连接信息已填入": "Đã áp dụng thông tin kết nối", - "无法读取剪贴板": "Không thể đọc bộ nhớ tạm" + "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(Hiện tại chỉ hỗ trợ giao diện Epay, địa chỉ máy chủ phía trên được sử dụng làm địa chỉ gọi lại theo mặc định!)", + ",当前无生效订阅,将自动使用钱包": ", hiện không có gói đăng ký hiệu lực, sẽ tự động dùng ví.", + ",时间:": ", thời gian:", + ",点击更新": ", nhấn để cập nhật" } } diff --git a/web/src/i18n/locales/zh-TW.json b/web/src/i18n/locales/zh-TW.json index 7fa77701..4eb73fb0 100644 --- a/web/src/i18n/locales/zh-TW.json +++ b/web/src/i18n/locales/zh-TW.json @@ -6,37 +6,40 @@ " 个模型设置相同的值": " 個模型設定相同的值", " 吗?": " 嗎?", " 秒": " 秒", - ",时间:": ",時間:", - ",点击更新": ",點擊更新", - "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(當前僅支援易支付接口,預設使用上方伺服器位址作為回調位址!)", + "$/1M tokens": "$/1M tokens", "(筛选后显示 {{count}} 条)_other": "(篩選後顯示 {{count}} 條)", "(输入 {{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}}", - "[最多请求次数]和[最多请求完成次数]的最大值为2147483647。": "[最多請求次數]和[最多請求完成次數]的最大值為2147483647。", - "[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。": "[最多請求次數]必須大於等於0,[最多請求完成次數]必須大於等於1。", - "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", - "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", - "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", - "{{ratioType}} {{ratio}}": "{{ratioType}} {{ratio}}", - "• 视频服务商的跨域限制": "• 影片服務商的跨域限制", - "• 防盗链保护机制": "• 防盜鏈保護機制", - "• 需要特定的请求头或认证": "• 需要特定的請求頭或認證", - "© {{currentYear}}": "© {{currentYear}}", - "| 基于": "| 基於", - "$/1M tokens": "$/1M tokens", + "(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}": "(輸入 {{nonImageInput}} tokens + 圖片輸入 {{imageInput}} tokens / 1M tokens * {{symbol}}{{price}}", + "/api/option/": "/api/option/", "0 - 最低": "0 - 最低", + "0 表示不限": "0 表示不限", "0.002-1之间的小数": "0.002-1之間的小數", "0.1以上的小数": "0.1以上的小數", + "1. 管理员在此创建分组并设置倍率": "1. 管理員在此建立分組並設定倍率", "10 - 最高": "10 - 最高", + "1h缓存创建 {{price}} / 1M tokens": "1h快取建立 {{price}} / 1M tokens", + "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "1h快取建立 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", "1h缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "1h快取建立 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})", + "1h缓存创建价格 {{symbol}}{{price}} / 1M tokens": "1h快取建立價格 {{symbol}}{{price}} / 1M tokens", "1h缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (1h缓存创建倍率: {{cacheCreationRatio1h}})": "1h快取建立價格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (1h快取建立倍率: {{cacheCreationRatio1h}})", + "1h缓存创建价格:{{symbol}}{{price}} / 1M tokens": "1h快取建立價格:{{symbol}}{{price}} / 1M tokens", + "1h缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 1h缓存创建倍率 {{cacheCreationRatio1h}} * {{ratioType}} {{ratio}} = {{amount}}": "1h快取建立:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 1h快取建立倍率 {{cacheCreationRatio1h}} * {{ratioType}} {{ratio}} = {{amount}}", "2 - 低": "2 - 低", + "2. 管理员在用户管理中将用户分配到对应分组(如 vip)": "2. 管理員在使用者管理中將使用者分配到對應分組(如 vip)", "2025年5月10日后添加的渠道,不需要再在部署的时候移除模型名称中的\".\"": "2025年5月10日後添加的管道,不需要再在部署的時候移除模型名稱中的\".\"", + "3. 用户创建令牌时,下拉菜单中出现勾选了「用户可选」的分组": "3. 使用者建立令牌時,下拉選單中出現勾選了「使用者可選」的分組", "360智脑": "360智腦", + "4. 令牌使用所选分组的倍率进行计费": "4. 令牌使用所選分組的倍率進行計費", "5 - 正常(默认)": "5 - 正常(預設)", + "5m缓存创建 {{price}} / 1M tokens": "5m快取建立 {{price}} / 1M tokens", + "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "5m快取建立 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", "5m缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "5m快取建立 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})", + "5m缓存创建价格 {{symbol}}{{price}} / 1M tokens": "5m快取建立價格 {{symbol}}{{price}} / 1M tokens", "5m缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (5m缓存创建倍率: {{cacheCreationRatio5m}})": "5m快取建立價格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (5m快取建立倍率: {{cacheCreationRatio5m}})", + "5m缓存创建价格:{{symbol}}{{price}} / 1M tokens": "5m快取建立價格:{{symbol}}{{price}} / 1M tokens", + "5m缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 5m缓存创建倍率 {{cacheCreationRatio5m}} * {{ratioType}} {{ratio}} = {{amount}}": "5m快取建立:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 5m快取建立倍率 {{cacheCreationRatio5m}} * {{ratioType}} {{ratio}} = {{amount}}", "8 - 高": "8 - 高", "AGPL v3.0协议": "AGPL v3.0協議", "AI 对话": "AI 對話", @@ -58,35 +61,39 @@ "API地址": "API位址", "API渠道配置": "API管道設定", "API端点": "API端點", - "Authorization callback URL 填": "Authorization callback URL 填", "Authorization Endpoint": "Authorization Endpoint", - "auto分组调用链路": "auto分組調用鏈路", + "Authorization callback URL 填": "Authorization callback URL 填", "Bark推送URL": "Bark推送URL", "Bark推送URL必须以http://或https://开头": "Bark推送URL必須以http://或https://開頭", "Bark通知": "Bark通知", + "Basic Auth 头": "Basic Auth 頭", + "CPU 使用率超过此值时拒绝请求": "CPU 使用率超過此值時拒絕請求", + "CPU 阈值 (%)": "CPU 閾值 (%)", "Changing batch type to:": "Changing batch type to:", + "ChatCompletions→Responses 兼容配置(Beta)": "ChatCompletions→Responses 兼容設定(Beta)", + "Claude会在原有请求头基础上追加这些值,不会覆盖已有同名请求头;重复值会自动忽略。": "Claude會在原有請求頭基礎上追加這些值,不會覆蓋已有同名請求頭;重複值會自動忽略。", "Claude思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Claude思考相容 BudgetTokens = MaxTokens * BudgetTokens 百分比", "Claude设置": "Claude設定", "Claude请求头覆盖": "Claude請求頭覆蓋", "Claude请求头追加": "Claude請求頭追加", - "Claude会在原有请求头基础上追加这些值,不会覆盖已有同名请求头;重复值会自动忽略。": "Claude會在原有請求頭基礎上追加這些值,不會覆蓋已有同名請求頭;重複值會自動忽略。", "Client ID": "Client ID", "Client Secret": "Client Secret", - "common.changeLanguage": "common.changeLanguage", "Creem API 密钥,敏感信息不显示": "Creem API 密鑰,敏感資訊不顯示", "Creem Setting Tips": "Creem 只支援預設的固定金額產品,這產品以及價格需要提前在Creem網站內建立設定,所以不支援自訂動態金額儲值。在Creem端設定產品的名字以及價格,獲取Product Id 後填到下面的產品,在new-api為該產品設定儲值額度,以及展示價格。", "Creem 介绍": "Creem 是一個簡單的支付處理平臺,支援固定金額產品銷售,以及訂閱銷售。", "Creem 充值": "Creem 儲值", "Creem 设置": "Creem 設定", - "default为默认设置,可单独设置每个分类的安全等级": "default為預設設定,可單獨設定每個分類的安全等級", - "default为默认设置,可单独设置每个模型的版本": "default為預設設定,可單獨設定每個模型的版本", "Dify渠道只适配chatflow和agent,并且agent不支持图片!": "Dify管道只相容chatflow和agent,並且agent不支援圖片!", "Discord": "Discord", "Discord Client ID": "Discord Client ID", "Discord Client Secret": "Discord Client Secret", "Discord ID": "Discord ID", "EUR (欧元)": "EUR (歐元)", - "false": "false", + "GC 已执行": "GC 已執行", + "GC 执行失败": "GC 執行失敗", + "GC 次数": "GC 次數", + "GPU/容器": "GPU/容器", + "GPU数量": "GPU數量", "Gemini安全设置": "Gemini安全設定", "Gemini思考适配 BudgetTokens = MaxTokens * BudgetTokens 百分比": "Gemini思考相容 BudgetTokens = MaxTokens * BudgetTokens 百分比", "Gemini思考适配设置": "Gemini思考相容設定", @@ -96,13 +103,12 @@ "GitHub Client ID": "GitHub Client ID", "GitHub Client Secret": "GitHub Client Secret", "GitHub ID": "GitHub ID", + "Goroutine 数": "Goroutine 數", "Gotify应用令牌": "Gotify應用令牌", "Gotify服务器地址": "Gotify伺服器位址", "Gotify服务器地址必须以http://或https://开头": "Gotify伺服器位址必須以http://或https://開頭", "Gotify通知": "Gotify通知", "Grok设置": "Grok設定", - "GPU/容器": "GPU/容器", - "GPU数量": "GPU數量", "Homepage URL 填": "Homepage URL 填", "ID": "ID", "IP": "IP", @@ -111,19 +117,24 @@ "IP限制": "IP限制", "IP黑名单": "IP黑名單", "JSON": "JSON", + "JSON 格式参考": "JSON 格式參考", "JSON 模式支持手动输入或上传服务账号 JSON": "JSON 模式支援手動輸入或上傳服務帳號 JSON", "JSON格式密钥,请确保格式正确": "JSON格式密鑰,請確保格式正確", "JSON格式错误": "JSON格式錯誤", "JSON编辑": "JSON編輯", "JSON解析错误:": "JSON解析錯誤:", + "Key": "Key", + "Key 摘要": "Key 摘要", "Linux DO Client ID": "Linux DO Client ID", "Linux DO Client Secret": "Linux DO Client Secret", "LinuxDO": "LinuxDO", "LinuxDO ID": "LinuxDO ID", "Logo 图片地址": "Logo 圖片位址", - "Midjourney 任务记录": "Midjourney 任務記錄", "MIT许可证": "MIT許可證", + "Midjourney 任务记录": "Midjourney 任務記錄", "New API项目仓库地址:": "New API項目倉庫位址:", + "OAuth 登录失败:": "OAuth 登錄失敗:", + "OAuth 配置错误:授权端点必须是完整的 URL(以 http:// 或 https:// 开头)": "OAuth 設定錯誤:授權端點必須是完整的 URL(以 http:// 或 https:// 開頭)", "OIDC": "OIDC", "OIDC ID": "OIDC ID", "Ollama 模型管理": "Ollama 模型管理", @@ -136,11 +147,7 @@ "Passkey 注册成功": "Passkey 註冊成功", "Passkey 登录": "Passkey 登錄", "Ping间隔(秒)": "Ping間隔(秒)", - "price_xxx 的商品价格 ID,新建产品后可获得": "price_xxx 的商品價格 ID,新建產品後可獲得", "Reasoning Effort": "Reasoning Effort", - "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "safety_identifier 字段用於幫助 OpenAI 識別可能違反使用政策的應用程式使用者。預設關閉以保護使用者隱私", - "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "service_tier 字段用於指定服務層級,允許透傳可能導致實際計費高於預期。預設關閉以避免額外費用", - "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "sk_xxx 或 rk_xxx 的 Stripe 密鑰,敏感資訊不顯示", "SMTP 发送者邮箱": "SMTP 發送者信箱", "SMTP 服务器地址": "SMTP 伺服器位址", "SMTP 端口": "SMTP 端口", @@ -151,24 +158,27 @@ "SSRF防护开关详细说明": "總開關控制是否啟用SSRF防護功能。關閉後將跳過所有SSRF檢查,允許訪問任意URL。⚠️ 僅在完全信任環境中關閉此功能。", "SSRF防护设置": "SSRF防護設定", "SSRF防护详细说明": "SSRF防護可防止惡意使用者利用您的伺服器訪問內網資源。您可以設定受信任域名/IP的白名單,並限制允許的端口。適用於檔案下載、Webhook回調和通知功能。", - "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "store 字段用於授權 OpenAI 存儲請求數據以評估和優化產品。預設關閉,開啟後可能導致 Codex 無法正常使用", - "免责声明:仅限个人使用,请勿分发或共享任何凭证。该渠道存在前置条件与使用门槛,请在充分了解流程与风险后使用,并遵守 OpenAI 的相关条款与政策。相关凭证与配置仅限接入 Codex CLI 使用,不适用于其他客户端、平台或渠道。": "免責聲明:僅限個人使用,請勿分發或共享任何憑證。該管道存在前置條件與使用門檻,請在充分了解流程與風險後使用,並遵守 OpenAI 的相關條款與政策。相關憑證與設定僅限接入 Codex CLI 使用,不適用於其他客戶端、平臺或管道。", "Stripe 设置": "Stripe 設定", + "Stripe/Creem 商品ID(可选)": "Stripe/Creem 商品ID(可選)", + "Stripe/Creem 需在第三方平台创建商品并填入 ID": "Stripe/Creem 需在第三方平臺建立商品並填入 ID", "Telegram": "Telegram", "Telegram Bot Token": "Telegram Bot Token", "Telegram Bot 名称": "Telegram Bot 名稱", "Telegram ID": "Telegram ID", "Token Endpoint": "Token Endpoint", - "true": "true", "Turnstile Secret Key": "Turnstile Secret Key", "Turnstile Site Key": "Turnstile Site Key", + "URL链接": "URL連結", + "USD (美元)": "USD (美元)", "Unix时间戳": "Unix時間戳", "Uptime Kuma地址": "Uptime Kuma位址", "Uptime Kuma监控分类管理,可以配置多个监控分类用于服务状态展示(最多20个)": "Uptime Kuma監控分類管理,可以設定多個監控分類用於服務狀態展示(最多20個)", - "URL链接": "URL連結", - "USD (美元)": "USD (美元)", "User Info Endpoint": "User Info Endpoint", "Vertex AI 不支持 functionResponse.id 字段,开启后将自动移除该字段": "Vertex AI 不支援 functionResponse.id 字段,開啟後將自動移除該字段", + "WeChat Server 服务器地址": "WeChat Server 伺服器位址", + "WeChat Server 访问凭证": "WeChat Server 訪問憑證", + "Web 搜索调用 {{webSearchCallCount}} 次": "Web 搜尋呼叫 {{webSearchCallCount}} 次", + "Web 搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Web 搜尋:{{count}} / 1K * 單價 {{price}} * {{ratioType}} {{ratio}} = {{amount}}", "Webhook 密钥": "Webhook 密鑰", "Webhook 签名密钥": "Webhook 簽名密鑰", "Webhook地址": "Webhook位址", @@ -176,46 +186,83 @@ "Webhook请求结构说明": "Webhook請求結構說明", "Webhook通知": "Webhook通知", "Web搜索价格:{{symbol}}{{price}} / 1K 次": "Web搜尋價格:{{symbol}}{{price}} / 1K 次", - "WeChat Server 服务器地址": "WeChat Server 伺服器位址", - "WeChat Server 访问凭证": "WeChat Server 訪問憑證", "Well-Known URL": "Well-Known URL", "Well-Known URL 必须以 http:// 或 https:// 开头": "Well-Known URL 必須以 http:// 或 https:// 開頭", - "whsec_xxx 的 Webhook 签名密钥,敏感信息不显示": "whsec_xxx 的 Webhook 簽名密鑰,敏感資訊不顯示", "Worker地址": "Worker位址", "Worker密钥": "Worker密鑰", + "[最多请求次数]和[最多请求完成次数]的最大值为2147483647。": "[最多請求次數]和[最多請求完成次數]的最大值為2147483647。", + "[最多请求次数]必须大于等于0,[最多请求完成次数]必须大于等于1。": "[最多請求次數]必須大於等於0,[最多請求完成次數]必須大於等於1。", + "auto分组调用链路": "auto分組調用鏈路", + "common.changeLanguage": "common.changeLanguage", + "default 和 vip 只能由管理员在「用户管理」中分配给用户。适用于按用户等级定价、内部测试等不希望用户自主选择的场景。": "default 和 vip 只能由管理員在「使用者管理」中分配給使用者。適用於按使用者等級定價、內部測試等不希望使用者自主選擇的場景。", + "default为默认设置,可单独设置每个分类的安全等级": "default為預設設定,可單獨設定每個分類的安全等級", + "default为默认设置,可单独设置每个模型的版本": "default為預設設定,可單獨設定每個模型的版本", + "false": "false", + "price_xxx 的商品价格 ID,新建产品后可获得": "price_xxx 的商品價格 ID,新建產品後可獲得", + "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "safety_identifier 字段用於幫助 OpenAI 識別可能違反使用政策的應用程式使用者。預設關閉以保護使用者隱私", + "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "service_tier 字段用於指定服務層級,允許透傳可能導致實際計費高於預期。預設關閉以避免額外費用", + "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "sk_xxx 或 rk_xxx 的 Stripe 密鑰,敏感資訊不顯示", + "standard 已被移除,vip 用户看不到": "standard 已被移除,vip 使用者看不到", + "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "store 字段用於授權 OpenAI 存儲請求數據以評估和優化產品。預設關閉,開啟後可能導致 Codex 無法正常使用", + "true": "true", + "whsec_xxx 的 Webhook 签名密钥,敏感信息不显示": "whsec_xxx 的 Webhook 簽名密鑰,敏感資訊不顯示", + "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}": "{\n \"default\": [200, 100],\n \"vip\": [0, 1000]\n}", + "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "{{breakdown}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", + "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}": "{{inputDesc}} + {{outputDesc}}{{extraServices}} = {{symbol}}{{total}}", + "{{name}} ID": "{{name}} ID", + "{{ratioType}} {{ratio}}": "{{ratioType}} {{ratio}}", + "{{ratioType}} {{ratio}}x": "{{ratioType}} {{ratio}}x", + "| 基于": "| 基於", + "© {{currentYear}}": "© {{currentYear}}", + "• 视频服务商的跨域限制": "• 影片服務商的跨域限制", + "• 防盗链保护机制": "• 防盜鏈保護機制", + "• 需要特定的请求头或认证": "• 需要特定的請求頭或認證", + "「用户可选」决定用户创建令牌时能否自主选择该分组。未勾选的分组只能由管理员在后台分配给用户,不会出现在用户的令牌创建页面中。": "「使用者可選」決定使用者建立令牌時能否自主選擇該分組。未勾選的分組只能由管理員在後台分配給使用者,不會出現在使用者的令牌建立頁面中。", "一个月": "一個月", "一天": "一天", "一小时": "一小時", "一次调用消耗多少刀,优先级大于模型倍率": "一次調用消耗多少刀,優先級大於模型倍率", - "一行一个,不区分大小写": "一行一個,不區分大小寫", "一行一个屏蔽词,不需要符号分割": "一行一個屏蔽詞,不需要符號分割", + "一行一个,不区分大小写": "一行一個,不區分大小寫", "一键填充到 FluentRead": "一鍵填充到 FluentRead", + "三种操作的区别:": "三種操作的區別:", "上一个表单块": "上一個表單塊", "上一步": "上一步", "上次保存: ": "上次儲存: ", "上游倍率同步": "上游倍率同步", + "上游模型管理": "上游模型管理", "上游返回": "上游返回", "下一个表单块": "下一個表單塊", "下一步": "下一步", "下午好": "午安", "下载日志": "下載日誌", + "下面展示这个模型保存后会写入哪些后端字段,便于和原始 JSON 编辑框保持一致。": "下方會顯示此模型儲存後將寫入哪些後端欄位,方便與原始 JSON 編輯框保持一致。", + "不会出现": "不會出現", "不再提醒": "不再提醒", + "不勾选用户可选": "不勾選使用者可選", + "不升级": "不升級", + "不变": "不變", "不同用户分组的价格信息": "不同使用者分組的價格資訊", "不填则为模型列表第一个": "不填則為模型列表第一個", "不建议使用": "不建議使用", "不支持": "不支援", - "不是合法的 JSON 字符串": "不是合法的 JSON 字符串", + "不是合法的 JSON 字符串": "不是合法的 JSON 字串", "不更改": "不更改", + "不配置特殊倍率时:": "不配置特殊倍率時:", + "不配置规则时,所有用户看到的下拉框一样:": "不配置規則時,所有使用者看到的下拉框一樣:", + "不重试": "不重試", "不限制": "不限制", "与本地相同": "與本地相同", "专属倍率": "專屬倍率", + "专属分组": "專屬分組", + "两个分组都勾选了「用户可选」,所以用户创建令牌时可以看到这两个选项:": "兩個分組都勾選了「使用者可選」,所以使用者建立令牌時可以看到這兩個選項:", "两次输入的密码不一致": "兩次輸入的密碼不一致", "两次输入的密码不一致!": "兩次輸入的密碼不一致!", "两步验证": "兩步驗證", - "两步验证(2FA)为您的账户提供额外的安全保护。启用后,登录时需要输入密码和验证器应用生成的验证码。": "兩步驗證(2FA)為您的帳號提供額外的安全保護。啟用後,登錄時需要輸入密碼和驗證器應用生成的驗證碼。", "两步验证启用成功!": "兩步驗證啟用成功!", "两步验证已禁用": "兩步驗證已禁用", "两步验证设置": "兩步驗證設定", + "两步验证(2FA)为您的账户提供额外的安全保护。启用后,登录时需要输入密码和验证器应用生成的验证码。": "兩步驗證(2FA)為您的帳號提供額外的安全保護。啟用後,登錄時需要輸入密碼和驗證器應用生成的驗證碼。", "个": "個", "个GPU": "個GPU", "个人中心": "個人中心", @@ -223,12 +270,15 @@ "个人信息设置": "個人資訊設定", "个人设置": "個人設定", "个实例": "個實例", + "个已过期": "個已過期", "个性化设置": "個性化設定", "个性化设置左侧边栏的显示内容": "個性化設定左側邊欄的顯示內容", "个未配置模型": "個未設定模型", "个模型": "個模型", + "个生效中": "個生效中", "个部署吗?此操作不可逆。": "個部署嗎?此操作不可逆。", "中午好": "午安", + "为 vip 用户配置规则:": "為 vip 使用者配置規則:", "为一个 JSON 对象,例如:{\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}": "為一個 JSON 對象,例如:{\"100\": 0.95, \"200\": 0.9, \"500\": 0.85}", "为一个 JSON 数组,例如:[10, 20, 50, 100, 200, 500]": "為一個 JSON 陣列,例如:[10, 20, 50, 100, 200, 500]", "为一个 JSON 文本": "為一個 JSON 文本", @@ -243,6 +293,8 @@ "为一个 JSON 文本,键为组名称,值为倍率": "為一個 JSON 文本,鍵為組名稱,值為倍率", "为了保护账户安全,请验证您的两步验证码。": "為了保護帳號安全,請驗證您的兩步驗證碼。", "为了保护账户安全,请验证您的身份。": "為了保護帳號安全,請驗證您的身份。", + "为什么 default 不勾选「用户可选」?": "為什麼 default 不勾選「使用者可選」?", + "为特定用户分组配置可用分组的增减规则。「添加」为该分组新增可用分组,「移除」移除默认可用分组,「追加」直接追加分组": "為特定使用者分組配置可用分組的增減規則。「新增」為該分組新增可用分組,「移除」移除預設可用分組,「追加」直接追加分組", "为空则默认使用服务器地址,多个 Origin 用逗号分隔,例如 https://newapi.pro,https://newapi.com ,注意不能携带[],需使用https": "為空則預設使用伺服器位址,多個 Origin 用逗號分隔,例如 https://newapi.pro,https://newapi.com ,注意不能攜帶[],需使用https", "主页链接填": "首頁連結填", "之前的所有日志": "之前的所有日誌", @@ -252,6 +304,8 @@ "产品名称": "產品名稱", "产品配置": "產品設定", "产品配置错误,请联系管理员": "產品設定錯誤,請聯繫管理員", + "享受 8 折": "享受 8 折", + "什么是分组?": "什麼是分組?", "仅为使用OpenAI格式的Gemini/Vertex渠道填充thoughtSignature": "僅為使用OpenAI格式的Gemini/Vertex管道填充thoughtSignature", "仅会覆盖你勾选的字段,未勾选的字段保持本地不变。": "僅會覆蓋你勾選的字段,未勾選的字段保持本地不變。", "仅供参考,以实际扣费为准": "僅供參考,以實際扣費為準", @@ -266,31 +320,41 @@ "仅支持 OpenAI 接口格式": "僅支援 OpenAI 接口格式", "仅显示矛盾倍率": "僅顯示矛盾倍率", "仅用于开发环境,生产环境应使用 HTTPS": "僅用於開發環境,生產環境應使用 HTTPS", + "仅用订阅": "僅用訂閱", + "仅用钱包": "僅用錢包", "仅重置配置": "僅重置設定", "今日关闭": "今日關閉", + "今日已签到": "今日已簽到", + "今日已签到,累计签到": "今日已簽到,累計簽到", + "从 0.5 降到 0.3": "從 0.5 降到 0.3", + "从剪贴板粘贴配置": "從剪貼簿貼上設定", "从官方模型库同步": "從官方模型庫同步", "从认证器应用中获取验证码,或使用备用码": "從認證器應用中獲取驗證碼,或使用備用碼", "从配置文件同步": "從組態檔同步", + "从默认列表中去掉一个分组": "從預設列表中去掉一個分組", "代理地址": "代理位址", "代理设置": "代理設定", "代码已复制到剪贴板": "程式碼已複製到剪貼板", "令牌": "令牌", "令牌分组": "令牌分組", + "令牌分组设为 auto 时,按以下顺序依次尝试选择可用分组,排在前面的优先级更高": "令牌分組設為 auto 時,按以下順序依次嘗試選擇可用分組,排在前面的優先級更高", + "令牌分组设为 auto 时,系统按优先级顺序自动选择一个可用分组。": "令牌分組設為 auto 時,系統按優先級順序自動選擇一個可用分組。", "令牌分组,默认为用户的分组": "令牌分組,預設為使用者的分組", "令牌创建成功,请在列表页面点击复制获取令牌!": "令牌建立成功,請在列表頁面點擊複製獲取令牌!", "令牌名称": "令牌名稱", "令牌已重置并已复制到剪贴板": "令牌已重置並已複製到剪貼板", "令牌更新成功!": "令牌更新成功!", "令牌的额度仅用于限制令牌本身的最大额度使用量,实际的使用受到账户的剩余额度限制": "令牌的額度僅用於限制令牌本身的最大額度使用量,實際的使用受到帳號的剩餘額度限制", + "令牌端点": "令牌端點", "令牌管理": "令牌管理", "以下上游数据可能不可信:": "以下上游數據可能不可信:", "以下文件解析失败,已忽略:{{list}}": "以下檔案解析失敗,已忽略:{{list}}", "以及": "以及", "仪表盘设置": "儀表盤設定", "价格": "價格", - "价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}}": "價格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}}", - "价格:${{price}} * {{ratioType}}:{{ratio}}": "價格:${{price}} * {{ratioType}}:{{ratio}}", + "价格摘要": "價格摘要", "价格暂时不可用,请稍后重试": "價格暫時不可用,請稍後重試", + "价格模式(默认)": "價格模式(預設)", "价格计算中...": "價格計算中...", "价格计算失败": "價格計算失敗", "价格计算失败: ": "價格計算失敗: ", @@ -298,6 +362,8 @@ "价格设置方式": "價格設定方式", "价格重新计算中...": "價格重新計算中...", "价格预估": "價格預估", + "价格:${{price}} * {{ratioType}}:{{ratio}}": "價格:${{price}} * {{ratioType}}:{{ratio}}", + "价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}}": "價格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}}", "任务 ID": "任務 ID", "任务ID": "任務ID", "任务日志": "任務日誌", @@ -305,10 +371,15 @@ "任务记录": "任務記錄", "企业账户为特殊返回格式,需要特殊处理,如果非企业账户,请勿勾选": "企業帳號為特殊返回格式,需要特殊處理,如果非企業帳號,請勿勾選", "优先级": "優先級", + "优先订阅": "優先訂閱", + "优先钱包": "優先錢包", "优惠": "優惠", "低于此额度时将发送邮件提醒用户": "低於此額度時將發送郵件提醒使用者", "余额": "餘額", "余额充值管理": "餘額儲值管理", + "作废": "作廢", + "作废于": "作廢於", + "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "作廢後該訂閱將立即失效,歷史記錄不受影響。是否繼續?", "你似乎并没有修改什么": "你似乎並沒有修改什麼", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "你可以在「自訂模型名稱」處手動添加它們,然後點擊填入後再提交,或者直接使用下方操作自動處理。", "使用 Discord 继续": "使用 Discord 繼續", @@ -319,29 +390,36 @@ "使用 Passkey 实现免密且更安全的登录体验": "使用 Passkey 實現免密且更安全的登錄體驗", "使用 Passkey 登录": "使用 Passkey 登錄", "使用 Passkey 验证": "使用 Passkey 驗證", + "使用 {{name}} 继续": "使用 {{name}} 繼續", "使用 微信 继续": "使用 微信 繼續", "使用 用户名 注册": "使用 使用者名 註冊", "使用 邮箱或用户名 登录": "使用 信箱或使用者名 登錄", "使用ID排序": "使用ID排序", + "使用分组": "使用分組", "使用日志": "使用日誌", "使用模式": "使用模式", "使用统计": "使用統計", - "使用认证器应用(如 Google Authenticator、Microsoft Authenticator)扫描下方二维码:": "使用認證器應用(如 Google Authenticator、Microsoft Authenticator)掃描下方QR Code:", "使用认证器应用扫描二维码": "使用認證器應用掃描QR Code", - "例如 €, £, Rp, ₩, ₹...": "例如 €, £, Rp, ₩, ₹...", + "使用认证器应用(如 Google Authenticator、Microsoft Authenticator)扫描下方二维码:": "使用認證器應用(如 Google Authenticator、Microsoft Authenticator)掃描下方QR Code:", + "使用说明": "使用說明", + "例如": "例如", + "例如 /var/cache/new-api": "例如 /var/cache/new-api", "例如 https://docs.newapi.pro": "例如 https://docs.newapi.pro", - "例如:": "例如:", + "例如 €, £, Rp, ₩, ₹...": "例如 €, £, Rp, ₩, ₹...", "例如: /bin/bash -c \"python app.py\"": "例如: /bin/bash -c \"python app.py\"", "例如: nginx:latest": "例如: nginx:latest", "例如: socks5://user:pass@host:port": "例如: socks5://user:pass@host:port", + "例如发卡网站的购买链接": "例如髮卡網站的購買連結", + "例如:": "例如:", "例如:-c": "例如:-c", "例如:/bin/bash": "例如:/bin/bash", "例如:0001": "例如:0001", "例如:1000": "例如:1000", "例如:100000": "例如:100000", - "例如:2,就是最低充值2$": "例如:2,就是最低儲值2$", "例如:2000": "例如:2000", + "例如:2,就是最低充值2$": "例如:2,就是最低儲值2$", "例如:4.99": "例如:4.99", + "例如:401, 403, 429, 500-599": "例如:401,403,429,500-599", "例如:7,就是7元/美金": "例如:7,就是7元/美金", "例如:example.com": "例如:example.com", "例如:https://yourdomain.com": "例如:https://yourdomain.com", @@ -349,7 +427,7 @@ "例如:preview": "例如:preview", "例如:prod_6I8rBerHpPxyoiU9WK4kot": "例如:prod_6I8rBerHpPxyoiU9WK4kot", "例如:基础套餐": "例如:基礎訂閱", - "例如发卡网站的购买链接": "例如髮卡網站的購買連結", + "例如:适合轻度使用": "例如:適合輕度使用", "供应商": "供應商", "供应商介绍": "供應商介紹", "供应商信息:": "供應商資訊:", @@ -371,24 +449,28 @@ "保存 Turnstile 设置": "儲存 Turnstile 設定", "保存 WeChat Server 设置": "儲存 WeChat Server 設定", "保存分组倍率设置": "儲存分組倍率設定", + "保存分组相关设置": "儲存分組相關設定", "保存备用码": "儲存備用碼", "保存备用码以备不时之需": "儲存備用碼以備不時之需", "保存失败": "儲存失敗", - "保存失败,请重试": "儲存失敗,請重試", "保存失败:": "儲存失敗:", + "保存失败,请重试": "儲存失敗,請重試", "保存屏蔽词过滤设置": "儲存屏蔽詞過濾設定", + "保存性能设置": "儲存性能設定", "保存成功": "儲存成功", "保存数据看板设置": "儲存數據看板設定", "保存日志设置": "儲存日誌設定", "保存模型倍率设置": "儲存模型倍率設定", "保存模型速率限制": "儲存模型速率限制", "保存监控设置": "儲存監控設定", + "保存签到设置": "儲存簽到設定", "保存绘图设置": "儲存繪圖設定", "保存聊天设置": "儲存聊天設定", "保存设置": "儲存設定", "保存通用设置": "儲存通用設定", "保存邮箱域名白名单设置": "儲存信箱域名白名單設定", "保存额度设置": "儲存額度設定", + "保留": "保留", "保留天数": "保留天數", "保留文件数": "保留檔案數", "保留最近N个文件": "保留最近N個檔案", @@ -404,14 +486,17 @@ "倍率信息": "倍率資訊", "倍率是为了方便换算不同价格的模型": "倍率是為了方便換算不同價格的模型", "倍率模式": "倍率模式", + "倍率用于计费乘数,勾选「用户可选」后用户可在创建令牌时选择该分组": "倍率用於計費乘數,勾選「使用者可選」後使用者可在建立令牌時選擇該分組", "倍率类型": "倍率類型", + "假设再加两个分组 default 和 vip,但不勾选用户可选:": "假設再加兩個分組 default 和 vip,但不勾選使用者可選:", + "偏好设置": "偏好設定", "停止测试": "停止測試", "停用": "停用", "允许 AccountFilter 参数": "允許 AccountFilter 參數", "允许 HTTP 协议图片请求(适用于自部署代理)": "允許 HTTP 協議圖片請求(適用於自部署代理)", + "允许 Turnstile 用户校验": "允許 Turnstile 使用者校驗", "允许 safety_identifier 透传": "允許 safety_identifier 透傳", "允许 service_tier 透传": "允許 service_tier 透傳", - "允许 Turnstile 用户校验": "允許 Turnstile 使用者校驗", "允许不安全的 Origin(HTTP)": "允許不安全的 Origin(HTTP)", "允许回调(会泄露服务器 IP 地址)": "允許回調(會洩露伺服器 IP 位址)", "允许在 Stripe 支付中输入促销码": "允許在 Stripe 支付中輸入促銷碼", @@ -431,13 +516,13 @@ "允许通过微信登录 & 注册": "允許透過微信登錄 & 註冊", "元": "元", "充值": "儲值", - "充值价格(x元/美金)": "儲值價格(x元/美金)", "充值价格显示": "儲值價格顯示", + "充值价格(x元/美金)": "儲值價格(x元/美金)", "充值分组倍率": "儲值分組倍率", "充值分组倍率不是合法的 JSON 字符串": "儲值分組倍率不是合法的 JSON 字符串", "充值数量": "儲值數量", - "充值数量,最低 ": "儲值數量,最低 ", "充值数量不能小于": "儲值數量不能小於", + "充值数量,最低 ": "儲值數量,最低 ", "充值方式设置": "儲值方式設定", "充值方式设置不是合法的 JSON 字符串": "儲值方式設定不是合法的 JSON 字符串", "充值确认": "儲值確認", @@ -446,15 +531,13 @@ "充值金额折扣配置不是合法的 JSON 对象": "儲值金額折扣設定不是合法的 JSON 對象", "充值链接": "儲值連結", "充值额度": "儲值額度", + "免责声明:仅限个人使用,请勿分发或共享任何凭证。该渠道存在前置条件与使用门槛,请在充分了解流程与风险后使用,并遵守 OpenAI 的相关条款与政策。相关凭证与配置仅限接入 Codex CLI 使用,不适用于其他客户端、平台或渠道。": "免責聲明:僅限個人使用,請勿分發或共享任何憑證。該管道存在前置條件與使用門檻,請在充分了解流程與風險後使用,並遵守 OpenAI 的相關條款與政策。相關憑證與設定僅限接入 Codex CLI 使用,不適用於其他客戶端、平臺或管道。", "兑换人ID": "兌換人ID", "兑换成功!": "兌換成功!", "兑换码充值": "兌換碼儲值", - "确认清理不活跃的磁盘缓存?": "確認清理不活躍的磁碟快取?", - "这将删除超过 10 分钟未使用的临时缓存文件": "這將刪除超過 10 分鐘未使用的臨時快取檔案", - "清理不活跃缓存": "清理不活躍快取", "兑换码创建成功": "兌換碼建立成功", - "兑换码创建成功,是否下载兑换码?": "兌換碼建立成功,是否下載兌換碼?", "兑换码创建成功!": "兌換碼建立成功!", + "兑换码创建成功,是否下载兑换码?": "兌換碼建立成功,是否下載兌換碼?", "兑换码将以文本文件的形式下载,文件名为兑换码的名称。": "兌換碼將以文本檔案的形式下載,檔案名為兌換碼的名稱。", "兑换码更新成功!": "兌換碼更新成功!", "兑换码生成管理": "兌換碼生成管理", @@ -496,38 +579,45 @@ "关闭": "關閉", "关闭侧边栏": "關閉側邊欄", "关闭公告": "關閉公告", + "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?": "關閉後將不再顯示此提示(僅對當前瀏覽器生效)。確定要關閉嗎?", "关闭后,此模型将不会被“同步官方”自动覆盖或创建": "關閉後,此模型將不會被「同步官方」自動覆蓋或建立", "关闭弹窗,已停止批量测试": "關閉彈窗,已停止批量測試", + "关闭提示": "關閉提示", "其他": "其他", "其他注册选项": "其他註冊選項", "其他登录选项": "其他登錄選項", "其他设置": "其他設定", "其他详情": "其他詳情", + "内存 阈值 (%)": "記憶體 閾值 (%)", + "内存使用率超过此值时拒绝请求": "記憶體使用率超過此值時拒絕請求", + "内存命中": "記憶體命中", "内容": "內容", "内容较大,已启用性能优化模式": "內容較大,已啟用性能優化模式", "内容较大,部分功能可能受限": "內容較大,部分功能可能受限", "内置 Ollama 镜像": "內置 Ollama 鏡像", "再次输入部署名称": "再次輸入部署名稱", - "最低": "最低", - "最低充值美元数量": "最低儲值美元數量", - "最后使用时间": "最後使用時間", - "最后更新": "最後更新", - "最后请求": "最後請求", - "最大GPU数量": "最大GPU數量", - "最大可用": "最大可用", - "最近事件": "最近事件", + "写": "寫", "准备中...": "準備中...", "准备完成初始化": "準備完成初始化", "分类名称": "分類名稱", "分组": "分組", + "分组JSON设置": "分組 JSON 設定", "分组与模型定价设置": "分組與模型定價設定", "分组价格": "分組價格", "分组倍率": "分組倍率", "分组倍率设置": "分組倍率設定", "分组倍率设置,可以在此处新增分组或修改现有分组的倍率,格式为 JSON 字符串,例如:{\"vip\": 0.5, \"test\": 1},表示 vip 分组的倍率为 0.5,test 分组的倍率为 1": "分組倍率設定,可以在此處新增分組或修改現有分組的倍率,格式為 JSON 字符串,例如:{\"vip\": 0.5, \"test\": 1},表示 vip 分組的倍率為 0.5,test 分組的倍率為 1", + "分组名": "分組名", + "分组名称": "分組名稱", + "分组名称到倍率的映射": "分組名稱到倍率的對映", + "分组描述": "分組描述", + "分组是用于控制计费倍率和模型访问权限的核心概念。每个用户属于一个分组,每个令牌也可以指定使用某个分组。": "分組是用於控制計費倍率和模型存取權限的核心概念。每個使用者屬於一個分組,每個令牌也可以指定使用某個分組。", "分组特殊倍率": "分組特殊倍率", "分组特殊可用分组": "分組特殊可用分組", + "分组相关设置": "分組相關設定", + "分组管理": "分組管理", "分组设置": "分組設定", + "分组设置使用说明": "分組設定使用說明", "分组速率配置优先级高于全局速率限制。": "分組速率設定優先級高於全域速率限制。", "分组速率限制": "分組速率限制", "分钟": "分鐘", @@ -542,7 +632,9 @@ "列出的模型将不会自动添加或移除-thinking/-nothinking 后缀": "列出的模型將不會自動添加或移除-thinking/-nothinking 後綴", "列设置": "列設定", "创建": "建立", + "创建令牌可选": "建立令牌時可選", "创建令牌默认选择auto分组,初始令牌也将设为auto(否则留空,为用户默认分组)": "建立令牌預設選擇auto分組,初始令牌也將設為auto(否則留空,為使用者預設分組)", + "创建和管理分组": "建立和管理分組", "创建失败": "建立失敗", "创建成功": "建立成功", "创建或选择密钥时,将 Project 设置为 io.cloud": "建立或選擇密鑰時,將 Project 設定為 io.cloud", @@ -551,12 +643,15 @@ "创建新的兑换码": "建立新的兌換碼", "创建新的模型": "建立新的模型", "创建新的渠道": "建立新的管道", + "创建新的订阅套餐": "建立新的訂閱", "创建新的预填组": "建立新的預填組", "创建时间": "建立時間", + "创建渠道所需的基本信息": "建立頻道所需的基本資訊", "创建用户": "建立使用者", "初始化失败,请重试": "初始化失敗,請重試", "初始化系统": "初始化系統", "删除": "刪除", + "删除会彻底移除该订阅记录(含权益明细)。是否继续?": "刪除會徹底移除該訂閱記錄(含權益明細)。是否繼續?", "删除后无法恢复,确定要删除模型 \"{{name}}\" 吗?": "刪除後無法恢復,確定要刪除模型 \"{{name}}\" 嗎?", "删除失败": "刪除失敗", "删除密钥失败": "刪除密鑰失敗", @@ -574,17 +669,20 @@ "刷新失败": "刷新失敗", "刷新容器信息": "刷新容器資訊", "刷新日志": "刷新日誌", + "刷新统计": "刷新統計", "前往 io.net API Keys": "前往 io.net API Keys", "前往设置": "前往設定", "前往设置页面": "前往設定頁面", "前缀": "前綴", - "副本数量": "副本數量", + "前:": "前:", "剩余": "剩餘", "剩余备用码:": "剩餘備用碼:", "剩余时间": "剩餘時間", "剩余额度": "剩餘額度", - "剩余额度/总额度": "剩餘額度/總額度", "剩余额度$": "剩餘額度$", + "剩余额度/总额度": "剩餘額度/總額度", + "剪贴板中未检测到连接信息": "剪貼簿中未偵測到連線資訊", + "副本数量": "副本數量", "功能特性": "功能特性", "加入渠道": "加入管道", "加入预填组": "加入預填組", @@ -605,19 +703,25 @@ "加载详情中...": "載入詳情中...", "加载账单失败": "載入帳單失敗", "加载隐私政策内容失败...": "載入隱私政策內容失敗...", + "勾选后,该分组会出现在用户创建令牌时的下拉菜单中。未勾选的分组只能由管理员分配,用户自己无法选择。": "勾選後,該分組會出現在使用者建立令牌時的下拉選單中。未勾選的分組只能由管理員分配,使用者自己無法選擇。", "包含": "包含", "包含来自未知或未标明供应商的AI模型,这些模型可能来自小型供应商或开源项目。": "包含來自未知或未標明供應商的AI模型,這些模型可能來自小型供應商或開源項目。", "包括失败请求的次数,0代表不限制": "包括失敗請求的次數,0代表不限制", "匹配类型": "匹配類型", "区域": "區域", + "升级分组": "升級分組", "单GPU小时费率": "單GPU小時費率", "历史消耗": "歷史消耗", "原价": "原價", + "原价,和普通用户一样": "原價,和普通使用者一樣", "原因:": "原因:", "原密码": "原密碼", + "原生格式": "原生格式", + "原生额度": "原生額度", "去重完成:去重前 {{before}} 个密钥,去重后 {{after}} 个密钥": "去重完成:去重前 {{before}} 個密鑰,去重後 {{after}} 個密鑰", "参与官方同步": "參與官方同步", "参数": "參數", + "参数传递": "參數傳遞", "参数值": "參數值", "参数覆盖": "參數覆蓋", "参照生视频": "參照生影片", @@ -634,20 +738,27 @@ "只包括请求成功的次数": "只包括請求成功的次數", "只支持HTTPS,系统将以POST方式发送通知,请确保地址可以接收POST请求": "只支援HTTPS,系統將以POST方式發送通知,請確保位址可以接收POST請求", "只有当用户设置开启IP记录时,才会进行请求和错误类型日志的IP记录": "只有當使用者設定開啟IP記錄時,才會進行請求和錯誤類型日誌的IP記錄", + "只有配置了规则的组合才会覆盖,未配置的组合仍使用令牌分组的基础倍率。": "只有配置了規則的組合才會覆蓋,未配置的組合仍使用令牌分組的基礎倍率。", + "可以根据用户分组增减令牌可选的分组范围。例如 vip 用户额外开放 premium 分组,或移除某个分组的选择权。": "可以根據使用者分組增減令牌可選的分組範圍。例如 vip 使用者額外開放 premium 分組,或移除某個分組的選擇權。", + "可以根据用户分组设置不同的计费倍率。例如 vip 用户使用 standard 令牌时倍率从 1.0 降为 0.8。": "可以根據使用者分組設定不同的計費倍率。例如 vip 使用者使用 standard 令牌時倍率從 1.0 降為 0.8。", "可信": "可信", "可在设置页面设置关于内容,支持 HTML & Markdown": "可在設定頁面設定關於內容,支援 HTML & Markdown", + "可用": "可用", "可用令牌分组": "可用令牌分組", "可用分组": "可用分組", "可用数量": "可用數量", "可用模型": "可用模型", + "可用空间: {{free}} / 总空间: {{total}}": "可用空間: {{free}} / 總空間: {{total}}", "可用端点类型": "可用端點類型", "可用邀请额度": "可用邀請額度", "可视化": "視覺化", "可视化倍率设置": "視覺化倍率設定", "可视化编辑": "視覺化編輯", + "可选值": "可選值", "可选,公告的补充说明": "可選,公告的補充說明", "可选,用于复现结果": "可選,用於復現結果", - "可选值": "可選值", + "合计:{{total}}": "合計:{{total}}", + "合计:文字部分 {{textTotal}} + 音频部分 {{audioTotal}} = {{total}}": "合計:文字部分 {{textTotal}} + 音訊部分 {{audioTotal}} = {{total}}", "同时重置消息": "同時重置消息", "同步": "同步", "同步到渠道": "同步到管道", @@ -661,8 +772,12 @@ "名称+密钥": "名稱+密鑰", "名称不能为空": "名稱不能為空", "名称匹配类型": "名稱匹配類型", + "后端固定倍率:{{ratio}}。该字段仅展示换算后的价格。": "後端固定倍率:{{ratio}}。此欄位僅展示換算後的價格。", "后端请求失败": "後端請求失敗", "后缀": "後綴", + "后:": "後:", + "向右展开": "向右展開", + "向左展开": "向左展開", "否": "否", "启动": "啟動", "启动参数 (Args)": "啟動參數 (Args)", @@ -672,10 +787,10 @@ "启动部署失败": "啟動部署失敗", "启动配置": "啟動設定", "启用": "啟用", + "启用 Prompt 检查": "啟用 Prompt 檢查", "启用 io.net 部署": "啟用 io.net 部署", "启用 io.net 部署开关": "啟用 io.net 部署開關", "启用 io.net 部署时必须填写 API Key": "啟用 io.net 部署時必須填寫 API Key", - "启用 Prompt 检查": "啟用 Prompt 檢查", "启用2FA失败": "啟用2FA失敗", "启用Claude思考适配(-thinking后缀)": "啟用Claude思考相容(-thinking後綴)", "启用FunctionCall思维签名填充": "啟用FunctionCall思維簽名填充", @@ -686,19 +801,26 @@ "启用全部": "啟用全部", "启用后可接入 io.net GPU 资源": "啟用後可接入 io.net GPU 資源", "启用后可添加图片URL进行多模态对话": "啟用後可添加圖片URL進行多模態對話", + "启用后套餐将在用户端展示。是否继续?": "啟用後訂閱將在使用者端展示。是否繼續?", "启用后将使用 Creem Test Mode": "啟用後將使用 Creem Test Mode", "启用密钥失败": "啟用密鑰失敗", "启用屏蔽词过滤功能": "啟用屏蔽詞過濾功能", + "启用性能监控": "啟用性能監控", + "启用性能监控后,当系统资源使用率超过设定阈值时,将拒绝新的 Relay 请求 (/v1, /v1beta 等),以保护系统稳定性。": "啟用性能監控後,當系統資源使用率超過設定閾值時,將拒絕新的 Relay 請求 (/v1, /v1beta 等),以保護系統穩定性。", "启用所有密钥失败": "啟用所有密鑰失敗", "启用数据看板(实验性)": "啟用數據看板(實驗性)", "启用此模式后,将使用您自定义的请求体发送API请求,模型配置面板的参数设置将被忽略。": "啟用此模式後,將使用您自訂的請求體發送API請求,模型設定面板的參數設定將被忽略。", + "启用状态": "啟用狀態", "启用用户模型请求速率限制(可能会影响高并发性能)": "啟用使用者模型請求速率限制(可能會影響高併發性能)", + "启用磁盘缓存": "啟用磁碟快取", + "启用磁盘缓存后,大请求体将临时存储到磁盘而非内存,可显著降低内存占用,适用于处理包含大量图片/文件的请求。建议在 SSD 环境下使用。": "啟用磁碟快取後,大請求體將臨時存儲到磁碟而非記憶體,可顯著降低記憶體佔用,適用於處理包含大量圖片/檔案的請求。建議在 SSD 環境下使用。", + "启用签到功能": "啟用簽到功能", "启用绘图功能": "啟用繪圖功能", "启用请求体透传功能": "啟用請求體透傳功能", "启用请求透传": "啟用請求透傳", + "启用违规扣费": "啟用違規扣費", "启用额度消费日志记录": "啟用額度消費日誌記錄", "启用验证": "啟用驗證", - "启用违规扣费": "啟用違規扣費", "周": "周", "和": "和", "和Claude不同,默认情况下Gemini的思考模型会自动决定要不要思考,就算不开启适配模型也可以正常使用,如果您需要计费,推荐设置无后缀模型价格按思考价格设置。支持使用 gemini-2.5-pro-preview-06-05-thinking-128 格式来精确传递思考预算。": "和Claude不同,預設情況下Gemini的思考模型會自動決定要不要思考,就算不開啟相容模型也可以正常使用,如果您需要計費,推薦設定無後綴模型價格按思考價格設定。支援使用 gemini-2.5-pro-preview-06-05-thinking-128 格式來精確傳遞思考預算。", @@ -707,6 +829,7 @@ "商品价格 ID": "商品價格 ID", "回答内容": "回答內容", "回调 URL 填": "回調 URL 填", + "回调 URL 格式": "回調 URL 格式", "回调地址": "回調位址", "固定价格": "固定價格", "固定价格(每次)": "固定價格(每次)", @@ -715,20 +838,29 @@ "图标": "圖示", "图标使用@lobehub/icons库,如:OpenAI、Claude.Color,支持链式参数:OpenAI.Avatar.type={'platform'}、OpenRouter.Avatar.shape={'square'},查询所有可用图标请 ": "圖示使用@lobehub/icons庫,如:OpenAI、Claude.Color,支援鏈式參數:OpenAI.Avatar.type={'platform'}、OpenRouter.Avatar.shape={'square'},查詢所有可用圖示請 ", "图混合": "圖混合", + "图片倍率 {{imageRatio}}": "圖片倍率 {{imageRatio}}", "图片功能在自定义请求体模式下不可用": "圖片功能在自訂請求體模式下不可用", "图片地址": "圖片位址", "图片已添加": "圖片已添加", "图片生成调用:{{symbol}}{{price}} / 1次": "圖片生成調用:{{symbol}}{{price}} / 1次", + "图片生成:1 次 * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "圖片生成:1 次 * 單價 {{price}} * {{ratioType}} {{ratio}} = {{amount}}", + "图片输入 {{price}} / 1M tokens": "圖片輸入 {{price}} / 1M tokens", "图片输入: {{imageRatio}}": "圖片輸入: {{imageRatio}}", + "图片输入价格": "圖片輸入價格", + "图片输入价格 {{symbol}}{{price}} / 1M tokens": "圖片輸入價格 {{symbol}}{{price}} / 1M tokens", "图片输入价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (图片倍率: {{imageRatio}})": "圖片輸入價格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (圖片倍率: {{imageRatio}})", + "图片输入价格:{{symbol}}{{price}} / 1M tokens": "圖片輸入價格:{{symbol}}{{price}} / 1M tokens", + "图片输入价格:{{symbol}}{{total}} / 1M tokens": "圖片輸入價格:{{symbol}}{{total}} / 1M tokens", "图片输入倍率(仅部分模型支持该计费)": "圖片輸入倍率(僅部分模型支援該計費)", "图片输入相关的倍率设置,键为模型名称,值为倍率,仅部分模型支持该计费": "圖片輸入相關的倍率設定,鍵為模型名稱,值為倍率,僅部分模型支援該計費", + "图片输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 图片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "圖片輸入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 圖片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "图生文": "圖生文", "图生视频": "圖生影片", "在Gotify服务器创建应用后获得的令牌,用于发送通知": "在Gotify伺服器建立應用後獲得的令牌,用於發送通知", "在Gotify服务器的应用管理中创建新应用": "在Gotify伺服器的應用管理中建立新應用", "在找兑换码?": "在找兌換碼?", "在新标签页中打开": "在新標籤頁中打開", + "在模型广场向用户展示的端点": "在模型廣場向使用者展示的端點", "在此输入 Logo 图片地址": "在此輸入 Logo 圖片位址", "在此输入新的公告内容,支持 Markdown & HTML 代码": "在此輸入新的公告內容,支援 Markdown & HTML 程式碼", "在此输入新的关于内容,支持 Markdown & HTML 代码。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为关于页面": "在此輸入新的關於內容,支援 Markdown & HTML 程式碼。如果輸入的是一個連結,則會使用該連結作為 iframe 的 src 屬性,這允許你設定任意網頁作為關於頁面", @@ -737,20 +869,31 @@ "在此输入系统名称": "在此輸入系統名稱", "在此输入隐私政策内容,支持 Markdown & HTML 代码": "在此輸入隱私政策內容,支援 Markdown & HTML 程式碼", "在此输入首页内容,支持 Markdown & HTML 代码,设置后首页的状态信息将不再显示。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为首页": "在此輸入首頁內容,支援 Markdown & HTML 程式碼,設定後首頁的狀態訊息將不再顯示。如果輸入的是一個連結,則會使用該連結作為 iframe 的 src 屬性,這允許你設定任意網頁作為首頁", + "在默认列表基础上新增一个分组": "在預設列表基礎上新增一個分組", + "场景:站点提供两个价格档位,用户可以按需选择": "場景:站點提供兩個價格檔位,使用者可以按需選擇", + "场景:站点有 standard 和 premium 两个用户可选分组。希望 vip 用户额外看到 exclusive 分组,同时不再看到 standard 分组": "場景:站點有 standard 和 premium 兩個使用者可選分組。希望 vip 使用者額外看到 exclusive 分組,同時不再看到 standard 分組", + "场景:站点有 standard(倍率 1.0)和 premium(倍率 0.5)两个分组,希望 vip 用户使用 standard 令牌时也能享受折扣": "場景:站點有 standard(倍率 1.0)和 premium(倍率 0.5)兩個分組,希望 vip 使用者使用 standard 令牌時也能享受折扣", + "场景:设置自动选择优先级": "場景:設定自動選擇優先級", "域名IP过滤详细说明": "建議開啟:開啟後會對域名進行 DNS 解析並檢查解析後的 IP 是否為私有位址,可有效防止 DNS 重綁定攻擊繞過 SSRF 防護。注意:域名可能解析到多個 IPv4/IPv6 位址,若配置了 IP 過濾列表,請確保覆蓋這些位址,否則可能導致訪問失敗。", "域名白名单": "域名白名單", "域名黑名单": "域名黑名單", "基本信息": "基本資訊", + "基础价格": "基礎價格", + "基础用户": "基礎使用者", + "填充模板(全渠道)": "填充模板(全管道)", + "填充模板(指定渠道)": "填充模板(指定管道)", "填入": "填入", "填入所有模型": "填入所有模型", "填入模板": "填入模板", - "填入透传模版": "填入透傳模版", - "填入透传完整模版": "填入透傳完整模版", "填入相关模型": "填入相關模型", + "填入透传完整模版": "填入透傳完整模版", + "填入透传模版": "填入透傳模版", "填写Gotify服务器的完整URL地址": "填寫Gotify伺服器的完整URL位址", "填写带https的域名,逗号分隔": "填寫帶https的域名,逗號分隔", + "填写服务器地址后自动生成:": "填寫伺服器位址後自動生成:", "填写用户协议内容后,用户注册时将被要求勾选已阅读用户协议": "填寫使用者協議內容後,使用者註冊時將被要求勾選已閱讀使用者協議", "填写隐私政策内容后,用户注册时将被要求勾选已阅读隐私政策": "填寫隱私政策內容後,使用者註冊時將被要求勾選已閱讀隱私政策", + "填写音频补全价格前,需要先填写音频输入价格。": "填寫音訊補全價格前,需要先填寫音訊輸入價格。", "处理中": "處理中", "备份支持": "備份支援", "备份状态": "備份狀態", @@ -766,6 +909,7 @@ "复制失败": "複製失敗", "复制失败,请手动复制": "複製失敗,請手動複製", "复制失败,请手动选择文本复制": "複製失敗,請手動選擇文本複製", + "复制密钥": "複製金鑰", "复制已选": "複製已選", "复制应用的令牌(Token)并填写到上方的应用令牌字段": "複製應用的令牌(Token)並填寫到上方的應用令牌字段", "复制成功": "複製成功", @@ -777,6 +921,7 @@ "复制渠道的所有信息": "複製管道的所有資訊", "复制版本号": "複製版本號", "复制生成的密钥并粘贴到此处": "複製生成的密鑰並貼上到此處", + "复制连接信息": "複製連線資訊", "复制链接": "複製連結", "外接设备": "外接設備", "多个命令用空格分隔": "多個命令用空格分隔", @@ -788,19 +933,26 @@ "天前": "天前", "失败": "失敗", "失败原因": "失敗原因", + "失败后是否重试": "失敗後是否重試", "失败时自动禁用通道": "失敗時自動禁用通道", "失败重试次数": "失敗重試次數", "奖励说明": "獎勵說明", - "如:大带宽批量分析图片推荐": "如:大頻寬批量分析圖片推薦", - "如:香港线路": "如:香港線路", + "套餐": "訂閱", + "套餐副标题": "訂閱副標題", + "套餐名称": "訂閱名稱", + "套餐标题": "訂閱標題", + "套餐的基本信息和定价": "訂閱的基本資訊和定價", "如果你对接的是上游One API或者New API等转发项目,请使用OpenAI类型,不要使用此类型,除非你知道你在做什么。": "如果你對接的是上游One API或者New API等轉發項目,請使用OpenAI類型,不要使用此類型,除非你知道你在做什麼。", "如果用户请求中包含系统提示词,则使用此设置拼接到用户的系统提示词前面": "如果使用者請求中包含系統提示詞,則使用此設定拼接到使用者的系統提示詞前面", "如果镜像为私有,请填写密码或Token": "如果鏡像為私有,請填寫密碼或Token", "如果镜像为私有,请填写用户名": "如果鏡像為私有,請填寫使用者名", + "如:大带宽批量分析图片推荐": "如:大頻寬批量分析圖片推薦", + "如:香港线路": "如:香港線路", "始终使用浅色主题": "始終使用淺色主題", "始终使用深色主题": "始終使用深色主題", "字段透传控制": "字段透傳控制", "存在惩罚,鼓励讨论新话题": "存在懲罰,鼓勵討論新話題", + "存在重复的分组名称:": "存在重複的分組名稱:", "存在重复的键名:": "存在重複的鍵名:", "安全提醒": "安全提醒", "安全设置": "安全設定", @@ -812,11 +964,12 @@ "完成硬件类型、部署位置、副本数量等配置后,将自动计算价格": "完成硬體類型、部署位置、副本數量等設定後,將自動計算價格", "完成设置并启用两步验证": "完成設定並啟用兩步驗證", "完成进度": "完成進度", + "完整流程:": "完整流程:", "完整的 Base URL,支持变量{model}": "完整的 Base URL,支援變數{model}", "官方": "官方", "官方文档": "官方文件", - "官方说明": "官方說明", "官方模型同步": "官方模型同步", + "官方说明": "官方說明", "定价模式": "定價模式", "定时测试所有通道": "定時測試所有通道", "定期更改密码可以提高账户安全性": "定期更改密碼可以提高帳號安全性", @@ -824,6 +977,7 @@ "实付金额": "實付金額", "实付金额:": "實付金額:", "实际模型": "實際模型", + "实际结算金额:{{symbol}}{{total}}(已包含分组价格调整)": "實際結算金額:{{symbol}}{{total}}(已包含分組價格調整)", "实际请求体": "實際請求體", "容器": "容器", "容器ID": "容器ID", @@ -855,7 +1009,6 @@ "密码重置确认": "密碼重置確認", "密码长度至少为8个字符": "密碼長度至少為8個字符", "密钥": "密鑰", - "密钥(编辑模式下,保存的密钥不会显示)": "密鑰(編輯模式下,儲存的密鑰不會顯示)", "密钥去重": "密鑰去重", "密钥将以Bearer方式添加到请求头中,用于验证webhook请求的合法性": "密鑰將以Bearer方式添加到請求頭中,用於驗證webhook請求的合法性", "密钥已删除": "密鑰已刪除", @@ -871,10 +1024,12 @@ "密钥获取成功": "密鑰獲取成功", "密钥输入方式": "密鑰輸入方式", "密钥预览": "密鑰預覽", + "密钥(编辑模式下,保存的密钥不会显示)": "密鑰(編輯模式下,儲存的密鑰不會顯示)", "对于官方渠道,new-api已经内置地址,除非是第三方代理站点或者Azure的特殊接入地址,否则不需要填写": "對於官方管道,new-api已經內置位址,除非是第三方代理站點或者Azure的特殊接入位址,否則不需要填寫", "对免费模型启用预消耗": "對免費模型啟用預消耗", "对域名启用 IP 过滤(推荐开启)": "對域名啟用 IP 過濾(建議開啟)", "对外运营模式": "對外運營模式", + "对比:不勾选「用户可选」的场景": "對比:不勾選「使用者可選」的場景", "导入": "導入", "导入的配置将覆盖当前设置,是否继续?": "導入的設定將覆蓋當前設定,是否繼續?", "导入配置": "導入設定", @@ -886,10 +1041,12 @@ "将 reasoning_content 转换为 标签拼接到内容中": "將 reasoning_content 轉換為 標籤拼接到內容中", "将为选中的 ": "將為選中的 ", "将仅保留第一个密钥文件,其余文件将被移除,是否继续?": "將僅保留第一個密鑰檔案,其餘檔案將被移除,是否繼續?", - "将只保留最近 {{value}} 个日志文件,其余将被删除。": "將只保留最近 {{value}} 個日誌檔案,其餘將被刪除。", "将删除": "將刪除", "将删除 {{value}} 天前的日志文件。": "將刪除 {{value}} 天前的日誌檔案。", "将删除已使用、已禁用及过期的兑换码,此操作不可撤销。": "將刪除已使用、已禁用及過期的兌換碼,此操作不可撤銷。", + "将只保留最近 {{value}} 个日志文件,其余将被删除。": "將只保留最近 {{value}} 個日誌檔案,其餘將被刪除。", + "将大请求体临时存储到磁盘": "將大請求體臨時存儲到磁碟", + "将把当前编辑中的模型 {{name}} 的价格配置,批量应用到已勾选的 {{count}} 个模型。": "會把目前編輯中的模型 {{name}} 的價格配置,批量套用到已勾選的 {{count}} 個模型。", "将清除所有保存的配置并恢复默认设置,此操作不可撤销。是否继续?": "將清除所有儲存的設定並恢復預設設定,此操作不可撤銷。是否繼續?", "将清除选定时间之前的所有日志": "將清除選定時間之前的所有日誌", "小时": "小時", @@ -901,23 +1058,30 @@ "展开": "展開", "展开更多": "展開更多", "展示价格": "展示價格", + "嵌套映射:用户分组 → 使用分组 → 倍率": "巢狀對映:使用者分組 → 使用分組 → 倍率", "左侧边栏个人设置": "左側邊欄個人設定", - "已为 {{count}} 个模型设置{{type}}_other": "已為 {{count}} 個模型設定{{type}}", "已为 ${count} 个渠道设置标签!": "已為 ${count} 個管道設定標籤!", + "已为 {{count}} 个模型设置{{type}}_other": "已為 {{count}} 個模型設定{{type}}", + "已作废": "已作廢", + "已保存偏好为": "已儲存偏好為", "已修复 ${success} 个通道,失败 ${fails} 个通道。": "已修復 ${success} 個通道,失敗 ${fails} 個通道。", "已停止": "已停止", "已停止批量测试": "已停止批量測試", "已关闭后续提醒": "已關閉後續提醒", + "已分配内存": "已分配記憶體", "已切换为Assistant角色": "已切換為Assistant角色", "已切换为System角色": "已切換為System角色", "已切换至最优倍率视图,每个模型使用其最低倍率分组": "已切換至最優倍率視圖,每個模型使用其最低倍率分組", "已初始化": "已初始化", + "已删除 ${data} 个通道!": "已刪除 ${data} 個通道!", "已删除 {{count}} 个令牌!": "已刪除 {{count}} 個令牌!", "已删除 {{count}} 个令牌!_other": "已刪除 {{count}} 個令牌!", "已删除 {{count}} 条失效兑换码_other": "已刪除 {{count}} 條失效兌換碼", - "已删除 ${data} 个通道!": "已刪除 ${data} 個通道!", "已删除所有禁用渠道,共计 ${data} 个": "已刪除所有禁用管道,共計 ${data} 個", "已删除消息及其回复": "已刪除消息及其回覆", + "已勾选": "已勾選", + "已勾选 {{count}} 个模型": "已勾選 {{count}} 個模型", + "已发起支付": "已發起支付", "已发送到 Fluent": "已發送到 Fluent", "已取消 Passkey 注册": "已取消 Passkey 註冊", "已同步到渠道": "已同步到管道", @@ -929,8 +1093,6 @@ "已复制": "已複製", "已复制 ${count} 个模型": "已複製 ${count} 個模型", "已复制 ID 到剪贴板": "已複製 ID 到剪貼板", - "已复制:": "已複製:", - "已复制:{{name}}": "已複製:{{name}}", "已复制全部数据": "已複製全部數據", "已复制到剪切板": "已複製到剪切板", "已复制到剪贴板": "已複製到剪貼板", @@ -938,9 +1100,13 @@ "已复制模型名称": "已複製模型名稱", "已复制版本号": "已複製版本號", "已复制自动生成的 API Key": "已複製自動生成的 API Key", + "已复制:": "已複製:", + "已复制:{{name}}": "已複製:{{name}}", "已完成": "已完成", + "已将模型 {{name}} 的价格配置批量应用到 {{count}} 个模型": "已將模型 {{name}} 的價格配置批量套用到 {{count}} 個模型", "已开启全局请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "已開啟全域請求透傳:參數覆寫、模型重定向、管道相容等 NewAPI 內置功能將失效,非最佳實踐;如因此產生問題,請勿提交 issue 回饋。", "已成功开始测试所有已启用通道,请刷新页面查看结果。": "已成功開始測試所有已啟用通道,請刷新頁面查看結果。", + "已打开支付页面": "已打開支付頁面", "已提交": "已提交", "已支付金额": "已支付金額", "已新增 {{count}} 个模型:{{list}}_other": "已新增 {{count}} 個模型:{{list}}", @@ -965,19 +1131,23 @@ "已结束": "已結束", "已耗尽": "已耗盡", "已解锁豆包自定义 API 地址编辑": "已解鎖豆包自訂 API 位址編輯", + "已达上限": "已達上限", + "已达到购买上限": "已達到購買上限", "已过期": "已過期", "已运行时间": "已運行時間", + "已选择 ${count} 个渠道": "已選擇 ${count} 個管道", "已选择 {{count}} 个模型_other": "已選擇 {{count}} 個模型", "已选择 {{selected}} / {{total}}": "已選擇 {{selected}} / {{total}}", - "已选择 ${count} 个渠道": "已選擇 ${count} 個管道", "已重置为默认配置": "已重置為預設設定", "已销毁": "已銷燬", + "币种": "幣種", "常见问答": "常見問答", "常见问答管理,为用户提供常见问题的答案(最多50个,前端显示最新20条)": "常見問答管理,為使用者提供常見問題的答案(最多50個,前端顯示最新20條)", "平台": "平臺", "平均RPM": "平均RPM", "平均TPM": "平均TPM", "平移": "平移", + "应付金额": "應付金額", "应用同步": "應用同步", "应用更改": "應用更改", "应用覆盖": "應用覆蓋", @@ -986,27 +1156,31 @@ "延长容器时长将会产生额外费用,请确认您有足够的账户余额。": "延長容器時長將會產生額外費用,請確認您有足夠的帳號餘額。", "延长操作一旦确认无法撤销,费用将立即扣除。": "延長操作一旦確認無法撤銷,費用將立即扣除。", "延长时长": "延長時長", - "延长时长(小时)": "延長時長(小時)", "延长时长不能超过720小时(30天)": "延長時長不能超過720小時(30天)", "延长时长失败": "延長時長失敗", "延长时长至少为1小时": "延長時長至少為1小時", + "延长时长(小时)": "延長時長(小時)", "建立连接时发生错误": "建立連接時發生錯誤", "建议在生产环境中使用 MySQL 或 PostgreSQL 数据库,或确保 SQLite 数据库文件已映射到宿主机的持久化存储。": "建議在生產環境中使用 MySQL 或 PostgreSQL 資料庫,或確保 SQLite 資料庫檔案已映射到宿主機的持久化存儲。", "开": "開", + "开启「默认使用 auto 分组」后,新建令牌和初始令牌都会自动设为 auto。": "開啟「預設使用 auto 分組」後,新建令牌和初始令牌都會自動設為 auto。", "开启之后会清除用户提示词中的": "開啟之後會清除使用者提示詞中的", "开启之后将上游地址替换为服务器地址": "開啟之後將上游位址替換為伺服器位址", + "开启后不限制:必须设置模型倍率": "開啟後不限制:必須設定模型倍率", + "开启后创建令牌默认选择auto分组,初始令牌也将设为auto": "開啟後建立令牌預設選擇 auto 分組,初始令牌也將設為 auto", + "开启后未登录用户无法访问模型广场": "開啟後未登錄使用者無法訪問模型廣場", "开启后,仅\"消费\"和\"错误\"日志将记录您的客户端IP地址": "開啟後,僅\"消費\"和\"錯誤\"日誌將記錄您的客戶端IP位址", "开启后,对免费模型(倍率为0,或者价格为0)的模型也会预消耗额度": "開啟後,對免費模型(倍率為0,或者價格為0)的模型也會預消耗額度", "开启后,将定期发送ping数据保持连接活跃": "開啟後,將定期發送ping數據保持連接活躍", "开启后,当前分组渠道失败时会按顺序尝试下一个分组的渠道": "開啟後,當前分組管道失敗時會按順序嘗試下一個分組的管道", "开启后,所有请求将直接透传给上游,不会进行任何处理(重定向和渠道适配也将失效),请谨慎开启": "開啟後,所有請求將直接透傳給上游,不會進行任何處理(重定向和管道相容也將失效),請謹慎開啟", "开启后,违规请求将额外扣费。": "開啟後,違規請求將額外扣費。", - "开启后不限制:必须设置模型倍率": "開啟後不限制:必須設定模型倍率", - "开启后未登录用户无法访问模型广场": "開啟後未登錄使用者無法訪問模型廣場", "开启批量操作": "開啟批量操作", + "开始": "開始", "开始同步": "開始同步", "开始批量测试 ${count} 个模型,已清空上次结果...": "開始批量測試 ${count} 個模型,已清空上次結果...", "开始时间": "開始時間", + "异步任务退款": "非同步任務退款", "张图片": "張圖片", "弱变换": "弱變換", "强制将响应格式化为 OpenAI 标准格式(只适用于OpenAI渠道类型)": "強制將響應格式化為 OpenAI 標準格式(只適用於OpenAI管道類型)", @@ -1014,26 +1188,35 @@ "强制要求": "強制要求", "强变换": "強變換", "当上游通道返回错误中包含这些关键词时(不区分大小写),自动禁用通道": "當上遊通道返回錯誤中包含這些關鍵詞時(不區分大小寫),自動禁用通道", + "当令牌分组设为 auto 时,系统按列表顺序依次选择可用分组。排在前面的优先级更高。": "當令牌分組設為 auto 時,系統按列表順序依次選擇可用分組。排在前面的優先級更高。", "当前 API 密钥已过期,请在设置中更新。": "當前 API 密鑰已過期,請在設定中更新。", "当前 Ollama 版本为 ${version}": "當前 Ollama 版本為 ${version}", "当前余额": "當前餘額", "当前值": "當前值", "当前分组为 auto,会自动选择最优分组,当一个组不可用时自动降级到下一个组(熔断机制)": "當前分組為 auto,會自動選擇最優分組,當一個組不可用時自動降級到下一個組(熔斷機制)", "当前剩余": "當前剩餘", + "当前提示": "目前提示", "当前时间": "當前時間", + "当前未启用,需要时再打开即可。": "目前未啟用,需要時再開啟即可。", "当前未开启Midjourney回调,部分项目可能无法获得绘图结果,可在运营设置中开启。": "當前未開啟Midjourney回調,部分項目可能無法獲得繪圖結果,可在運營設定中開啟。", "当前查看的分组为:{{group}},倍率为:{{ratio}}": "當前查看的分組為:{{group}},倍率為:{{ratio}}", "当前模型列表为该标签下所有渠道模型列表最长的一个,并非所有渠道的并集,请注意可能导致某些渠道模型丢失。": "當前模型列表為該標籤下所有管道模型列表最長的一個,並非所有管道的並集,請注意可能導致某些管道模型丟失。", + "当前模型同时存在按次价格和倍率配置,保存时会按当前计费方式覆盖。": "目前模型同時存在按次價格與倍率配置,儲存時會依目前計費方式覆蓋。", + "当前模型存在未显式设置输入倍率的扩展倍率;填写输入价格后会自动换算为价格字段。": "目前模型存在未明確設定輸入倍率的擴展倍率;填寫輸入價格後會自動換算為價格欄位。", + "当前没有未设置定价的模型": "目前沒有未設定定價的模型", "当前版本": "當前版本", "当前状态": "當前狀態", + "当前缓存大小": "當前快取大小", + "当前编辑": "目前編輯", "当前计费": "當前計費", "当前设备不支持 Passkey": "當前設備不支援 Passkey", "当前设置类型: ": "當前設定類型: ", "当前跟随系统": "當前跟隨系統", "当前配置无法连接到 io.net。": "當前設定無法連接到 io.net。", - "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知": "當錢包或訂閱剩餘額度低於此數值時,系統將透過選擇的方式發送通知", + "当某个分组的用户使用另一个分组的令牌时,可设置特殊倍率覆盖基础倍率。例如:vip 分组的用户使用 default 分组时倍率为 0.5": "當某個分組的使用者使用另一個分組的令牌時,可設定特殊倍率覆蓋基礎倍率。例如:vip 分組的使用者使用 default 分組時倍率為 0.5", "当模型没有设置价格时仍接受调用,仅当您信任该网站时使用,可能会产生高额费用": "當模型沒有設定價格時仍接受調用,僅當您信任該網站時使用,可能會產生高額費用", "当运行通道全部测试时,超过此时间将自动禁用通道": "當運行通道全部測試時,超過此時間將自動禁用通道", + "当钱包或订阅剩余额度低于此数值时,系统将通过选择的方式发送通知": "當錢包或訂閱剩餘額度低於此數值時,系統將透過選擇的方式發送通知", "待使用收益": "待使用收益", "待部署": "待部署", "微信": "微信", @@ -1041,18 +1224,22 @@ "微信扫码关注公众号,输入「验证码」获取验证码(三分钟内有效)": "微信掃碼關注公眾號,輸入「驗證碼」獲取驗證碼(三分鐘內有效)", "微信扫码登录": "微信掃碼登錄", "微信账户绑定成功!": "微信帳號綁定成功!", + "必填:请输入服务器地址以自动生成完整端点 URL": "必填:請輸入伺服器位址以自動生成完整端點 URL", "必须是有效的 JSON 字符串数组,例如:[\"g1\",\"g2\"]": "必須是有效的 JSON 字符串陣列,例如:[\"g1\",\"g2\"]", "忘记密码?": "忘記密碼?", "快速开始": "快速開始", "快速选择": "快速選擇", + "忽略": "忽略", "思考中...": "思考中...", "思考内容转换": "思考內容轉換", "思考过程": "思考過程", "思考适配 BudgetTokens 百分比": "思考相容 BudgetTokens 百分比", "思考预算占比": "思考預算佔比", "性能指标": "性能指標", + "性能监控": "性能監控", "总 GPU 小时": "總 GPU 小時", "总价:文字价格 {{textPrice}} + 音频价格 {{audioPrice}} = {{symbol}}{{total}}": "總價:文字價格 {{textPrice}} + 音訊價格 {{audioPrice}} = {{symbol}}{{total}}", + "总分配内存": "總分配記憶體", "总密钥数": "總密鑰數", "总收益": "總收益", "总计": "總計", @@ -1074,17 +1261,23 @@ "成功时自动启用通道": "成功時自動啟用通道", "我已了解禁用两步验证将永久删除所有相关设置和备用码,此操作不可撤销": "我已瞭解禁用兩步驗證將永久刪除所有相關設定和備用碼,此操作不可撤銷", "我已阅读并同意": "我已閱讀並同意", + "我的订阅": "我的訂閱", + "我确认开启高危重试": "我確認開啟高風險重試", "或": "或", "或其兼容new-api-worker格式的其他版本": "或其兼容new-api-worker格式的其他版本", "或手动输入密钥:": "或手動輸入密鑰:", "所有上游数据均可信": "所有上游數據均可信", "所有密钥已复制到剪贴板": "所有密鑰已複製到剪貼板", + "所有用户": "所有使用者", "所有编辑均为覆盖操作,留空则不更改": "所有編輯均為覆蓋操作,留空則不更改", "手动禁用": "手動禁用", "手动编辑": "手動編輯", "手动输入": "手動輸入", "打开侧边栏": "打開側邊欄", + "扣费": "扣費", + "执行 GC": "執行 GC", "执行中": "執行中", + "扩展价格": "擴展價格", "扫描二维码": "掃描QR Code", "批量创建": "批量建立", "批量创建时会在名称后自动添加随机后缀": "批量建立時會在名稱後自動添加隨機後綴", @@ -1094,6 +1287,7 @@ "批量删除失败": "批量刪除失敗", "批量删除成功": "批量刪除成功", "批量删除模型": "批量刪除模型", + "批量应用当前模型价格": "批量套用目前模型價格", "批量操作": "批量操作", "批量操作失败": "批量操作失敗", "批量操作完成: {{success}}个成功, {{failed}}个失败": "批量操作完成: {{success}}個成功, {{failed}}個失敗", @@ -1115,13 +1309,20 @@ "按倍率类型筛选": "按倍率類型篩選", "按倍率设置": "按倍率設定", "按次": "按次", + "按次 {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "按次 {{symbol}}{{price}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "按次计费": "按次計費", + "按次:{{symbol}}{{price}}": "按次:{{symbol}}{{price}}", + "按次:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "按次:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}", "按照如下格式输入:AccessKey|SecretAccessKey|Region": "按照如下格式輸入:AccessKey|SecretAccessKey|Region", "按量计费": "按量計費", + "按量计费下需要先填写输入价格,才能保存其它价格项。": "按量計費下需要先填寫輸入價格,才能儲存其它價格項。", "按顺序替换content中的变量占位符": "按順序替換content中的變數佔位符", "换脸": "換臉", - "授权,需在遵守": "授權,需在遵守", "授权失败": "授權失敗", + "授权端点": "授權端點", + "授权范围 (Scopes)": "授權範圍 (Scopes)", + "授权,需在遵守": "授權,需在遵守", + "排序": "排序", "排队中": "排隊中", "接受未设置价格模型": "接受未設定價格模型", "接口凭证": "接口憑證", @@ -1130,23 +1331,27 @@ "控制台区域": "控制檯區域", "控制输出的随机性和创造性": "控制輸出的隨機性和創造性", "控制顶栏模块显示状态,全局生效": "控制頂欄模組顯示狀態,全域生效", - "推荐:用户可以选择是否使用指纹等验证": "推薦:使用者可以選擇是否使用指紋等驗證", + "推荐": "推薦", "推荐使用(用户可选)": "推薦使用(使用者可選)", + "推荐:用户可以选择是否使用指纹等验证": "推薦:使用者可以選擇是否使用指紋等驗證", "描述": "描述", "提交": "提交", "提交时间": "提交時間", "提交结果": "提交結果", + "提供商名称": "提供商名稱", "提升": "提升", "提示": "提示", "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}}": "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}}", "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 補全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 缓存创建 {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + 补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 快取 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 快取建立 {{cacheCreationInput}} tokens / 1M tokens * {{symbol}}{{cacheCreationPrice}} + 補全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", - "提示:如需备份数据,只需复制上述目录即可": "提示:如需備份數據,只需複製上述目錄即可", - "提示:链接中的{key}将被替换为API密钥,{address}将被替换为服务器地址": "提示:連結中的{key}將被替換為API密鑰,{address}將被替換為伺服器位址", "提示价格:{{symbol}}{{price}} / 1M tokens": "提示價格:{{symbol}}{{price}} / 1M tokens", "提示缓存倍率": "提示快取倍率", - "缓存创建倍率": "快取建立倍率", - "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)": "預設為 5m 快取建立倍率;1h 快取建立倍率按固定乘法自動計算(當前為 1.6x)", + "提示:如需备份数据,只需复制上述目录即可": "提示:如需備份數據,只需複製上述目錄即可", + "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。": "提示:此處設定僅用於控制「模型廣場」對使用者的展示效果,不會影響模型的實際調用與路由。若需設定真實調用行為,請前往「管道管理」進行設定。", + "提示:端点映射仅用于模型广场展示,不会影响模型真实调用。如需配置真实调用,请前往「渠道管理」。": "提示:端點映射僅用於模型廣場展示,不會影響模型真實呼叫。如需配置真實呼叫,請前往「管道管理」。", + "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。": "提示:該功能為測試版,未來設定結構與功能行為可能發生變更,請勿在生產環境使用。", + "提示:语言偏好会同步到您登录的所有设备,并影响API返回的错误消息语言。": "提示:語言偏好會同步到您登錄的所有設備,並影響API返回的錯誤消息語言。", + "提示:链接中的{key}将被替换为API密钥,{address}将被替换为服务器地址": "提示:連結中的{key}將被替換為API密鑰,{address}將被替換為伺服器位址", "搜索供应商": "搜尋供應商", "搜索关键字": "搜尋關鍵字", "搜索失败": "搜尋失敗", @@ -1165,15 +1370,25 @@ "操作失败,请重试": "操作失敗,請重試", "操作成功完成!": "操作成功完成!", "操作暂时被禁用": "操作暫時被禁用", + "操作确认": "操作確認", "操练场": "操練場", "操练场和聊天功能": "操練場和聊天功能", + "支付": "支付", "支付地址": "支付位址", + "支付失败": "支付失敗", "支付宝": "支付寶", "支付方式": "支付方式", + "支付方式名称": "付款方式名稱", + "支付方式类型": "付款方式類型", + "支付渠道": "支付管道", "支付设置": "支付設定", "支付请求失败": "支付請求失敗", "支付金额": "支付金額", "支持 Ctrl+V 粘贴图片": "支援 Ctrl+V 貼上圖片", + "支持 JSONPath,如 email, data.user.email": "支援 JSONPath,如 email, data.user.email", + "支持 JSONPath,如 name, display_name, data.user.name": "支援 JSONPath,如 name, display_name, data.user.name", + "支持 JSONPath,如 preferred_username, login, data.user.username": "支援 JSONPath,如 preferred_username, login, data.user.username", + "支持 JSONPath,如 sub, id, data.user.id": "支援 JSONPath,如 sub, id, data.user.id", "支持6位TOTP验证码或8位备用码,可到`个人设置-安全设置-两步验证设置`配置或查看。": "支援6位TOTP驗證碼或8位備用碼,可到`個人設定-安全設定-兩步驗證設定`設定或查看。", "支持CIDR格式,如:8.8.8.8, 192.168.1.0/24": "支援CIDR格式,如:8.8.8.8, 192.168.1.0/24", "支持HTTP和HTTPS,填写Gotify服务器的完整URL地址": "支援HTTP和HTTPS,填寫Gotify伺服器的完整URL位址", @@ -1181,6 +1396,9 @@ "支持众多的大模型供应商": "支援眾多的大模型供應商", "支持单个端口和端口范围,如:80, 443, 8000-8999": "支援單個端口和端口範圍,如:80, 443, 8000-8999", "支持变量:": "支援變數:", + "支持周期性重置套餐权益额度": "支援週期性重置訂閱權益額度", + "支持填写单个状态码或范围(含首尾),使用逗号分隔": "支援填寫單個狀態碼或範圍(含首尾),使用逗號分隔", + "支持填写单个状态码或范围(含首尾),使用逗号分隔;504 和 524 始终不重试,不受此处配置影响": "支援填寫單個狀態碼或範圍(含首尾),使用逗號分隔;504 和 524 一律不重試,不受此處設定影響", "支持备份": "支援備份", "支持拉取 Ollama 官方模型库中的所有模型,拉取过程可能需要几分钟时间": "支援拉取 Ollama 官方模型庫中的所有模型,拉取過程可能需要幾分鐘時間", "支持搜索用户的 ID、用户名、显示名称和邮箱地址": "支援搜尋使用者的 ID、使用者名、顯示名稱和信箱位址", @@ -1190,8 +1408,6 @@ "收益统计": "收益統計", "收起": "收起", "收起侧边栏": "收起側邊欄", - "向左展开": "向左展開", - "向右展开": "向右展開", "收起内容": "收起內容", "放大": "放大", "放大编辑": "放大編輯", @@ -1210,24 +1426,31 @@ "数据管理和日志查看": "數據管理和日誌查看", "文件上传": "檔案上傳", "文件搜索价格:{{symbol}}{{price}} / 1K 次": "檔案搜尋價格:{{symbol}}{{price}} / 1K 次", + "文件搜索调用 {{fileSearchCallCount}} 次": "檔案搜尋呼叫 {{fileSearchCallCount}} 次", + "文件搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "檔案搜尋:{{count}} / 1K * 單價 {{price}} * {{ratioType}} {{ratio}} = {{amount}}", "文字提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 文字补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} = {{symbol}}{{total}}": "文字提示 {{input}} tokens / 1M tokens * {{symbol}}{{price}} + 文字補全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} = {{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}}": "文字提示 {{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}}", "文字提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 缓存 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 文字补全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} = {{symbol}}{{total}}": "文字提示 {{nonCacheInput}} tokens / 1M tokens * {{symbol}}{{price}} + 快取 {{cacheInput}} tokens / 1M tokens * {{symbol}}{{cachePrice}} + 文字補全 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}} = {{symbol}}{{total}}", "文字输入": "文字輸入", "文字输出": "文字輸出", + "文字输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "文字輸出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 補全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "文心一言": "文心一言", "文档": "文件", "文档地址": "文件位址", "文生视频": "文生影片", + "新增": "新增", "新增供应商": "新增供應商", + "新增订阅": "新增訂閱", "新密码": "新密碼", "新密码需要和原密码不一致!": "新密碼需要和原密碼不一致!", "新建": "新建", + "新建套餐": "新建訂閱", "新建容器": "新建容器", "新建容器部署": "新建容器部署", "新建数量": "新建數量", "新建组": "新建組", - "新格式(支持条件判断与json自定义):": "新格式(支援條件判斷與json自訂):", "新格式模板": "新格式模板", + "新格式(支持条件判断与json自定义):": "新格式(支援條件判斷與json自訂):", "新版本": "新版本", "新用户使用邀请码奖励额度": "新使用者使用邀請碼獎勵額度", "新用户初始额度": "新使用者初始額度", @@ -1244,7 +1467,9 @@ "无法复制到剪贴板,请手动复制": "無法複製到剪貼板,請手動複製", "无法添加图片": "無法添加圖片", "无法获取容器详情": "無法獲取容器詳情", + "无法读取剪贴板": "無法讀取剪貼簿", "无法连接 io.net": "無法連接 io.net", + "无生效": "無生效", "无邀请人": "無邀請人", "无限制": "無限制", "无限额度": "無限額度", @@ -1252,17 +1477,17 @@ "日志已下载": "日誌已下載", "日志已加载": "日誌已載入", "日志已复制到剪贴板": "日誌已複製到剪貼板", - "日志时间范围": "日誌時間範圍", "日志总大小": "日誌總大小", "日志文件数": "日誌檔案數", + "日志时间范围": "日誌時間範圍", "日志流": "日誌流", "日志清理失败:": "日誌清理失敗:", "日志目录": "日誌目錄", "日志类型": "日誌類型", "日志设置": "日誌設定", "日志详情": "日誌詳情", - "旧格式(直接覆盖):": "舊格式(直接覆蓋):", "旧格式模板": "舊格式模板", + "旧格式(直接覆盖):": "舊格式(直接覆蓋):", "旧的备用码已失效,请保存新的备用码": "舊的備用碼已失效,請儲存新的備用碼", "早上好": "早安", "时间": "時間", @@ -1278,17 +1503,19 @@ "是否自动禁用": "是否自動禁用", "是否要求指纹/面容等生物识别": "是否要求指紋/面容等生物識別", "显示倍率": "顯示倍率", - "显示最新20条": "顯示最新20條", "显示名称": "顯示名稱", + "显示名称字段": "顯示名稱字段", "显示完整内容": "顯示完整內容", "显示操作项": "顯示操作項", "显示更多": "顯示更多", + "显示最新20条": "顯示最新20條", "显示第": "顯示第", "显示设置": "顯示設定", "显示调试": "顯示除錯", "晚上好": "晚安", "普通环境变量": "普通環境變數", "普通用户": "普通使用者", + "普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "普通輸入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "智能体ID": "智慧體ID", "智能熔断": "智慧熔斷", "智谱": "智譜", @@ -1299,9 +1526,11 @@ "暂无保存的配置": "暫無儲存的設定", "暂无充值记录": "暫無儲值記錄", "暂无公告": "暫無公告", + "暂无分组,点击下方按钮添加": "暫無分組,點擊下方按鈕新增", "暂无匹配模型": "暫無匹配模型", "暂无可复制的版本信息": "暫無可複製的版本資訊", "暂无可用的支付方式,请联系管理员配置": "暫無可用的支付方式,請聯繫管理員設定", + "暂无可购买套餐": "暫無可購買訂閱", "暂无响应数据": "暫無響應數據", "暂无容器信息": "暫無容器資訊", "暂无容器详情": "暫無容器詳情", @@ -1321,6 +1550,11 @@ "暂无监控数据": "暫無監控數據", "暂无系统公告": "暫無系統公告", "暂无缺失模型": "暫無缺失模型", + "暂无自动分组,点击下方按钮添加": "暫無自動分組,點擊下方按鈕新增", + "暂无自定义 OAuth 提供商": "暫無自訂 OAuth 提供商", + "暂无规则,点击下方按钮添加": "暫無規則,點擊下方按鈕新增", + "暂无订阅套餐": "暫無訂閱", + "暂无订阅记录": "暫無訂閱記錄", "暂无请求数据": "暫無請求數據", "暂无项目": "暫無項目", "暂无预填组": "暫無預填組", @@ -1339,6 +1573,7 @@ "更新名称失败": "更新名稱失敗", "更新失败": "更新失敗", "更新失败,请检查输入信息": "更新失敗,請檢查輸入資訊", + "更新套餐信息": "更新訂閱資訊", "更新容器配置": "更新容器設定", "更新容器配置可能会导致容器重启,请确保在合适的时间进行此操作。": "更新容器設定可能會導致容器重啟,請確保在合適的時間進行此操作。", "更新成功": "更新成功", @@ -1353,13 +1588,28 @@ "更新配置后,容器可能需要重启以应用新的设置。请确保您了解这些更改的影响。": "更新設定後,容器可能需要重啟以應用新的設定。請確保您瞭解這些更改的影響。", "更新配置失败": "更新設定失敗", "更新预填组": "更新預填組", + "最低": "最低", + "最低充值美元数量": "最低儲值美元數量", + "最后使用时间": "最後使用時間", + "最后更新": "最後更新", + "最后请求": "最後請求", + "最大GPU数量": "最大GPU數量", + "最大可用": "最大可用", + "最近事件": "最近事件", + "最高优先级": "最高優先級", "有 Reasoning": "有 Reasoning", + "有序字符串数组": "有序字串陣列", + "有效期": "有效期", + "有效期单位": "有效期單位", + "有效期数值": "有效期數值", + "有效期设置": "有效期設定", "服务可用性": "服務可用性", "服务商": "服務商", "服务器地址": "伺服器位址", "服务器日志功能未启用(未配置日志目录)": "伺服器日誌功能未啟用(未配置日誌目錄)", "服务器日志管理": "伺服器日誌管理", "服务显示名称": "服務顯示名稱", + "未匹配到模型,按回车键可将「{{name}}」作为自定义模型名添加": "未匹配到模型,按下 Enter 鍵可將「{{name}}」作為自訂模型名稱新增", "未发现新增模型": "未發現新增模型", "未发现重复密钥": "未發現重複密鑰", "未启动": "未啟動", @@ -1388,15 +1638,16 @@ "未绑定": "未綁定", "未获取到授权码": "未獲取到授權碼", "未设置": "未設定", - "未设置倍率模型": "未設定倍率模型", "未设置价格模型": "未設定價格模型", + "未设置倍率模型": "未設定倍率模型", "未配置模型": "未設定模型", "未配置的模型列表": "未設定的模型列表", "本地": "本地", "本地数据存储": "本地數據存儲", "本地计费": "本地計費", - "本设备:手机指纹/面容,外接:USB安全密钥": "本設備:手機指紋/面容,外接:USB安全密鑰", + "本月获得": "本月獲得", "本设备内置": "本設備內置", + "本设备:手机指纹/面容,外接:USB安全密钥": "本設備:手機指紋/面容,外接:USB安全密鑰", "本项目根据": "本項目根據", "机密环境变量": "機密環境變數", "机密环境变量将被加密存储,适用于存储密码、API密钥等敏感信息。": "機密環境變數將被加密存儲,適用於存儲密碼、API密鑰等敏感資訊。", @@ -1405,8 +1656,9 @@ "权限设置": "權限設定", "条": "條", "条 - 第": "條 - 第", - "条,共": "條,共", "条日志已清理!": "條日誌已清理!", + "条,共": "條,共", + "来源": "來源", "来源于 IO.NET 部署": "來源於 IO.NET 部署", "来自模型重定向,尚未加入模型列表": "來自模型重定向,尚未加入模型列表", "某些配置更改可能需要几分钟才能生效。": "某些設定更改可能需要幾分鐘才能生效。", @@ -1418,8 +1670,10 @@ "查看所有可用的AI模型供应商,包括众多知名供应商的模型。": "查看所有可用的AI模型供應商,包括眾多知名供應商的模型。", "查看日志": "查看日誌", "查看渠道密钥": "查看管道密鑰", + "查看示例": "檢視範例", "查看详情": "查看詳情", "查询": "查詢", + "标准价格": "標準價格", "标签": "標籤", "标签不能为空!": "標籤不能為空!", "标签信息": "標籤資訊", @@ -1428,33 +1682,46 @@ "标签组": "標籤組", "标签聚合": "標籤聚合", "标签聚合模式": "標籤聚合模式", + "标识符 (Slug)": "標識符 (Slug)", "标识颜色": "標識顏色", + "核心概念": "核心概念", + "核心配置": "核心設定", "核采样,控制词汇选择的多样性": "核採樣,控制詞彙選擇的多樣性", + "根据 Anthropic 协定,/v1/messages 的输入 tokens 仅统计非缓存输入,不包含缓存读取与缓存写入 tokens。": "根據 Anthropic 協定,/v1/messages 的輸入 tokens 僅統計非快取輸入,不包含快取讀取與快取寫入 tokens。", "根据模型名称和匹配规则查找模型元数据,优先级:精确 > 前缀 > 后缀 > 包含": "根據模型名稱和匹配規則查找模型元數據,優先級:精確 > 前綴 > 後綴 > 包含", "格式化": "格式化", + "格式化 JSON": "格式化 JSON", "格式正确": "格式正確", "格式示例:": "格式示例:", - "前:": "前:", - "配置:": "配置:", - "后:": "後:", "格式错误": "格式錯誤", "检查更新": "檢查更新", "检测到 FluentRead(流畅阅读)": "檢測到 FluentRead(流暢閱讀)", + "检测到以下高危状态码重定向规则": "檢測到以下高風險狀態碼重定向規則", + "检测到剪贴板中的连接信息": "偵測到剪貼簿中的連線資訊", "检测到多个密钥,您可以单独复制每个密钥,或点击复制全部获取完整内容。": "檢測到多個密鑰,您可以單獨複製每個密鑰,或點擊複製全部獲取完整內容。", "检测到该消息后有AI回复,是否删除后续回复并重新生成?": "檢測到該消息後有AI回覆,是否刪除後續回覆並重新生成?", "检测必须等待绘图成功才能进行放大等操作": "檢測必須等待繪圖成功才能進行放大等操作", + "概览": "概覽", "模型": "模型", + "模型 {{name}} 缺少输入价格,无法计算补全/缓存/图片/音频价格对应的倍率": "模型 {{name}} 缺少輸入價格,無法計算補全、快取、圖片與音訊價格對應的倍率", + "模型 {{name}} 缺少音频输入价格,无法计算音频补全倍率": "模型 {{name}} 缺少音訊輸入價格,無法計算音訊補全倍率", "模型: {{ratio}}": "模型: {{ratio}}", "模型专用区域": "模型專用區域", "模型价格": "模型價格", + "模型价格 {{price}}": "模型價格 {{price}}", + "模型价格 {{symbol}}{{price}} / 次": "模型價格 {{symbol}}{{price}} / 次", + "模型价格 {{symbol}}{{price}} / 次 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}": "模型價格 {{symbol}}{{price}} / 次 * {{ratioType}} {{ratio}} = {{symbol}}{{total}}", "模型价格 {{symbol}}{{price}},{{ratioType}} {{ratio}}": "模型價格 {{symbol}}{{price}},{{ratioType}} {{ratio}}", + "模型价格:{{symbol}}{{price}}": "模型價格:{{symbol}}{{price}}", "模型价格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "模型價格:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}", - "按次:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}": "按次:{{symbol}}{{price}} * {{ratioType}}:{{ratio}} = {{symbol}}{{total}}", + "模型价格:{{symbol}}{{price}} / 次": "模型價格:{{symbol}}{{price}} / 次", "模型倍率": "模型倍率", "模型倍率 {{modelRatio}}": "模型倍率 {{modelRatio}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}}": "模型倍率 {{modelRatio}},快取倍率 {{cacheRatio}},輸出倍率 {{completionRatio}},{{ratioType}} {{ratio}}", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},{{ratioType}} {{ratio}},Web 搜索调用 {{webSearchCallCount}} 次": "模型倍率 {{modelRatio}},快取倍率 {{cacheRatio}},輸出倍率 {{completionRatio}},{{ratioType}} {{ratio}},Web 搜尋調用 {{webSearchCallCount}} 次", "模型倍率 {{modelRatio}},缓存倍率 {{cacheRatio}},输出倍率 {{completionRatio}},图片输入倍率 {{imageRatio}},{{ratioType}} {{ratio}}": "模型倍率 {{modelRatio}},快取倍率 {{cacheRatio}},輸出倍率 {{completionRatio}},圖片輸入倍率 {{imageRatio}},{{ratioType}} {{ratio}}", + "模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},音频倍率 {{audioRatio}},音频补全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}": "模型倍率 {{modelRatio}},補全倍率 {{completionRatio}},音訊倍率 {{audioRatio}},音訊補全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}", + "模型倍率 {{modelRatio}},输出倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},{{ratioType}} {{ratio}}": "模型倍率 {{modelRatio}},輸出倍率 {{completionRatio}},快取倍率 {{cacheRatio}},{{ratioType}} {{ratio}}", "模型倍率 {{modelRatio}},输出倍率 {{completionRatio}},缓存倍率 {{cacheRatio}},缓存创建倍率 {{cacheCreationRatio}},{{ratioType}} {{ratio}}": "模型倍率 {{modelRatio}},輸出倍率 {{completionRatio}},快取倍率 {{cacheRatio}},快取建立倍率 {{cacheCreationRatio}},{{ratioType}} {{ratio}}", "模型倍率值": "模型倍率值", "模型倍率和补全倍率": "模型倍率和補全倍率", @@ -1472,6 +1739,7 @@ "模型名称已存在": "模型名稱已存在", "模型固定价格": "模型固定價格", "模型图标": "模型圖示", + "模型定价设置": "模型定價設定", "模型定价,需要登录访问": "模型定價,需要登錄訪問", "模型广场": "模型廣場", "模型拉取失败: {{error}}": "模型拉取失敗: {{error}}", @@ -1489,6 +1757,7 @@ "模型管理": "模型管理", "模型组": "模型組", "模型补全倍率(仅对自定义模型有效)": "模型補全倍率(僅對自訂模型有效)", + "模型计费编辑器": "模型計費編輯器", "模型请求速率限制": "模型請求速率限制", "模型调用次数占比": "模型調用次數佔比", "模型调用次数排行": "模型調用次數排行", @@ -1507,6 +1776,7 @@ "欢迎使用,请完成以下设置以开始使用系统": "歡迎使用,請完成以下設定以開始使用系統", "欧元": "歐元", "正在加载可用部署位置...": "正在載入可用部署位置...", + "正在加载签到状态...": "正在載入簽到狀態...", "正在处理大内容...": "正在處理大內容...", "正在提交": "正在提交", "正在构造请求体预览...": "正在構造請求體預覽...", @@ -1515,6 +1785,7 @@ "正在跟随最新日志": "正在跟隨最新日誌", "正在跳转 GitHub...": "正在跳轉 GitHub...", "正在跳转...": "正在跳轉...", + "正常情况下,令牌的计费倍率由令牌所选的分组决定。特殊倍率可以根据「用户所在分组」进一步覆盖这个倍率。": "正常情況下,令牌的計費倍率由令牌所選的分組決定。特殊倍率可以根據「使用者所在分組」進一步覆蓋這個倍率。", "此代理仅用于图片请求转发,Webhook通知发送等,AI API请求仍然由服务器直接发出,可在渠道设置中单独配置代理": "此代理僅用於圖片請求轉發,Webhook通知發送等,AI API請求仍然由伺服器直接發出,可在管道設定中單獨設定代理", "此修改将不可逆": "此修改將不可逆", "此操作不可恢复,请仔细确认时间后再操作!": "此操作不可恢復,請仔細確認時間後再操作!", @@ -1529,9 +1800,11 @@ "此操作将解绑用户当前的 Passkey,下次登录需要重新注册。": "此操作將解綁使用者當前的 Passkey,下次登錄需要重新註冊。", "此操作将降低用户的权限级别": "此操作將降低使用者的權限級別", "此支付方式最低充值金额为": "此支付方式最低儲值金額為", + "此时用户创建令牌时只能看到 standard 和 premium:": "此時使用者建立令牌時只能看到 standard 和 premium:", "此渠道由 IO.NET 自动同步,类型、密钥和 API 地址已锁定。": "此管道由 IO.NET 自動同步,類型、密鑰和 API 位址已鎖定。", "此设置用于系统内部计算,默认值500000是为了精确到6位小数点设计,不推荐修改。": "此設定用於系統內部計算,預設值500000是為了精確到6位小數點設計,不推薦修改。", "此页面仅显示未设置价格或倍率的模型,设置后将自动从列表中移除": "此頁面僅顯示未設定價格或倍率的模型,設定後將自動從列表中移除", + "此页面仅显示未设置价格或基础倍率的模型,设置后会自动从列表中移出": "此頁面僅顯示未設定價格或基礎倍率的模型,設定後會自動從列表中移出", "此项只读,需要用户通过个人设置页面的相关绑定按钮进行绑定,不可直接修改": "此項唯讀,需要使用者透過個人設定頁面的相關綁定按鈕進行綁定,不可直接修改", "此项可选,用于修改请求体中的模型名称,为一个 JSON 字符串,键为请求中模型名称,值为要替换的模型名称,例如:": "此項可選,用於修改請求體中的模型名稱,為一個 JSON 字符串,鍵為請求中模型名稱,值為要替換的模型名稱,例如:", "此项可选,用于修改请求体中的模型名称,为一个 JSON 字符串,键为请求中模型名称,值为要替换的模型名称,留空则不更改": "此項可選,用於修改請求體中的模型名稱,為一個 JSON 字符串,鍵為請求中模型名稱,值為要替換的模型名稱,留空則不更改", @@ -1539,15 +1812,24 @@ "此项可选,用于覆盖请求参数。不支持覆盖 stream 参数": "此項可選,用於覆蓋請求參數。不支援覆蓋 stream 參數", "此项可选,用于覆盖请求头参数": "此項可選,用於覆蓋請求頭參數", "此项可选,用于通过自定义API地址来进行 API 调用,末尾不要带/v1和/": "此項可選,用於透過自訂API位址來進行 API 調用,末尾不要帶/v1和/", + "每个分组代表一个价格档位。管理员创建分组后,可以选择哪些档位对用户开放自选。": "每個分組代表一個價格檔位。管理員建立分組後,可以選擇哪些檔位對使用者開放自選。", "每容器GPU数": "每容器GPU數", + "每日仅可签到一次,请勿重复签到": "每日僅可簽到一次,請勿重複簽到", + "每日签到": "每日簽到", + "每日签到可获得随机额度奖励": "每日簽到可獲得隨機額度獎勵", + "每美元对应 Token 数": "每美元對應 Token 數", "每隔多少分钟测试一次所有通道": "每隔多少分鐘測試一次所有通道", "永不过期": "永不過期", "永久删除您的两步验证设置": "永久刪除您的兩步驗證設定", "永久删除所有备用码(包括未使用的)": "永久刪除所有備用碼(包括未使用的)", + "汇率": "匯率", + "沙盒环境 RSA 私钥 Base64 (PKCS#8 DER)": "沙盒環境 RSA 私鑰 Base64 (PKCS#8 DER)", + "沙盒环境 Waffo 公钥 Base64 (X.509 DER)": "沙盒環境 Waffo 公鑰 Base64 (X.509 DER)", "没有匹配的日志条目": "沒有匹配的日誌條目", "没有可用令牌用于填充": "沒有可用令牌用於填充", "没有可用模型": "沒有可用模型", "没有找到匹配的模型": "沒有找到匹配的模型", + "没有未设置定价的模型": "沒有未設定定價的模型", "没有未设置的模型": "沒有未設定的模型", "没有模型可以复制": "沒有模型可以複製", "没有账户?": "沒有帳號?", @@ -1555,14 +1837,16 @@ "注册": "註冊", "注册 Passkey": "註冊 Passkey", "注意": "注意", - "注意:JSON中重复的键只会保留最后一个同名键的值": "注意:JSON中重複的鍵只會保留最後一個同名鍵的值", "注意非Chat API,请务必填写正确的API地址,否则可能导致无法使用": "注意非Chat API,請務必填寫正確的API位址,否則可能導致無法使用", + "注意:JSON中重复的键只会保留最后一个同名键的值": "注意:JSON中重複的鍵只會保留最後一個同名鍵的值", "注销": "註銷", "注销成功!": "註銷成功!", + "活跃文件": "活躍檔案", + "活跃缓存数": "活躍快取數", "流": "流", + "流式": "流式", "流式响应完成": "流式響應完成", "流式输出": "流式輸出", - "流式": "流式", "流量端口": "流量端口", "浅色": "淺色", "浅色模式": "淺色模式", @@ -1573,9 +1857,9 @@ "测试单个渠道操作项目组": "測試單個管道操作項目組", "测试失败": "測試失敗", "测试失败:": "測試失敗:", + "测试所有未手动禁用渠道": "測試所有未手動停用通道", "测试所有渠道的最长响应时间": "測試所有管道的最長響應時間", "测试所有通道": "測試所有通道", - "测试所有未手动禁用渠道": "測試所有未手動停用通道", "测试模式": "測試模式", "测试连接": "測試連接", "测速": "測速", @@ -1591,27 +1875,33 @@ "消费": "消費", "深色": "深色", "深色模式": "深色模式", - "添加": "添加", + "添加": "新增", + "添加 (+:)": "新增 (+:)", "添加API": "添加API", "添加产品": "添加產品", "添加令牌": "添加令牌", "添加兑换码": "添加兌換碼", "添加公告": "添加公告", "添加分类": "添加分類", + "添加分组": "新增分組", "添加后提交": "添加後提交", "添加启动参数": "添加啟動參數", "添加启动命令": "添加啟動命令", "添加密钥环境变量": "添加密鑰環境變數", "添加成功": "添加成功", + "添加提供商": "添加提供商", "添加模型": "添加模型", "添加模型区域": "添加模型區域", "添加渠道": "添加管道", "添加环境变量": "添加環境變數", "添加用户": "添加使用者", "添加聊天配置": "添加聊天設定", + "添加规则": "新增規則", "添加键值对": "添加鍵值對", "添加问答": "添加問答", "添加额度": "添加額度", + "清理不活跃缓存": "清理不活躍快取", + "清理失败": "清理失敗", "清理方式": "清理方式", "清理日志文件": "清理日誌檔案", "清空": "清空", @@ -1622,6 +1912,7 @@ "渠道": "管道", "渠道 ID": "管道 ID", "渠道ID,名称,密钥,API地址": "管道ID,名稱,密鑰,API位址", + "渠道亲和性": "渠道親和性", "渠道优先级": "管道優先級", "渠道信息": "管道資訊", "渠道创建成功!": "管道建立成功!", @@ -1639,6 +1930,7 @@ "渠道的模型测试": "管道的模型測試", "渠道的高级配置选项": "管道的進階設定選項", "渠道管理": "管道管理", + "渠道行为": "頻道行為", "渠道额外设置": "管道額外設定", "源地址": "源位址", "演示站点": "演示站點", @@ -1653,22 +1945,25 @@ "点击此处": "點擊此處", "点击预览视频": "點擊預覽影片", "点击预览音乐": "點擊預覽音樂", - "音乐预览": "音樂預覽", - "音频无法播放": "音訊無法播放", "点击验证按钮,使用您的生物特征或安全密钥": "點擊驗證按鈕,使用您的生物特徵或安全密鑰", "版权所有": "版權所有", + "特殊倍率": "特殊倍率", + "特殊可用分组规则": "特殊可用分組規則", "状态": "狀態", "状态码复写": "狀態碼複寫", "状态码复写包含无效的状态码": "狀態碼複寫包含無效的狀態碼", "状态筛选": "狀態篩選", "状态页面Slug": "狀態頁面Slug", "环境变量": "環境變數", + "生产环境 RSA 私钥 Base64 (PKCS#8 DER)": "正式環境 RSA 私鑰 Base64 (PKCS#8 DER)", + "生产环境 Waffo 公钥 Base64 (X.509 DER)": "正式環境 Waffo 公鑰 Base64 (X.509 DER)", "生成令牌": "生成令牌", "生成数量": "生成數量", "生成数量必须大于0": "生成數量必須大於0", "生成新的备用码": "生成新的備用碼", "生成歌词": "生成歌詞", "生成音乐": "生成音樂", + "生效": "生效", "用于API调用的身份验证令牌,请妥善保管": "用於API調用的身份驗證令牌,請妥善保管", "用于配置网络代理,支持 socks5 协议": "用於設定網路代理,支援 socks5 協議", "用于验证回调 new-api 的 webhook 请求的密钥,敏感信息不显示": "用於驗證回調 new-api 的 webhook 請求的密鑰,敏感資訊不顯示", @@ -1683,19 +1978,27 @@ "用以支持通过微信进行登录注册": "用以支援透過微信進行登錄註冊", "用以防止恶意用户利用临时邮箱批量注册": "用以防止惡意使用者利用臨時信箱批量註冊", "用户": "使用者", + "用户 ID 字段": "使用者 ID 字段", "用户个人功能": "使用者個人功能", "用户主页,展示系统信息": "使用者首頁,展示系統訊息", "用户优先:如果用户在请求中指定了系统提示词,将优先使用用户的设置": "使用者優先:如果使用者在請求中指定了系統提示詞,將優先使用使用者的設定", "用户信息": "使用者資訊", "用户信息更新成功!": "使用者資訊更新成功!", + "用户信息端点": "使用者資訊端點", "用户分组": "使用者分組", "用户分组和额度管理": "使用者分組和額度管理", + "用户分组的联动作用": "使用者分組的連動作用", "用户分组配置": "使用者分組設定", + "用户创建令牌 → 选择分组下拉框:": "使用者建立令牌 → 選擇分組下拉框:", + "用户创建令牌时选择的分组,决定该令牌的实际计费倍率。一个用户可以创建多个令牌,使用不同分组。": "使用者建立令牌時選擇的分組,決定該令牌的實際計費倍率。一個使用者可以建立多個令牌,使用不同分組。", "用户协议": "使用者協議", "用户协议已更新": "使用者協議已更新", "用户协议更新失败": "使用者協議更新失敗", + "用户可选": "使用者可選", "用户可选分组": "使用者可選分組", + "用户可选分组的名称和描述(只包含勾选了用户可选的分组)": "使用者可選分組的名稱和描述(只包含勾選了使用者可選的分組)", "用户名": "使用者名", + "用户名字段": "使用者名字段", "用户名或邮箱": "使用者名或信箱", "用户名称": "使用者名稱", "用户控制面板,管理账户": "使用者控制面板,管理帳號", @@ -1706,9 +2009,15 @@ "用户的基本账户信息": "使用者的基本帳號資訊", "用户管理": "使用者管理", "用户组": "使用者組", + "用户订阅管理": "使用者訂閱管理", "用户账户创建成功!": "使用者帳號建立成功!", "用户账户管理": "使用者帳號管理", "用时/首字": "用時/首字", + "由全站货币展示设置统一控制": "由全站貨幣展示設定統一控制", + "由管理员分配,决定用户身份等级(如 default、vip)。": "由管理員分配,決定使用者身份等級(如 default、vip)。", + "由订阅抵扣": "由訂閱抵扣", + "界面语言和其他个人偏好": "界面語言和其他個人偏好", + "留空使用系统临时目录": "留空使用系統臨時目錄", "留空则使用账号绑定的邮箱": "留空則使用帳號綁定的信箱", "留空则使用默认端点;支持 {path, method}": "留空則使用預設端點;支援 {path, method}", "留空则默认使用服务器地址,注意不能携带http://或者https://": "留空則預設使用伺服器位址,注意不能攜帶http://或者https://", @@ -1719,8 +2028,12 @@ "白名单": "白名單", "的前提下使用。": "的前提下使用。", "监控设置": "監控設定", + "目录总大小": "目錄總大小", + "目录文件数": "目錄檔案數", + "目标分组": "目標分組", "目标用户:{{username}}": "目標使用者:{{username}}", "直接提交": "直接提交", + "直接追加(和添加类似,但无前缀)": "直接追加(和新增類似,但無前綴)", "相关项目": "相關項目", "相当于删除用户,此修改将不可逆": "相當於刪除使用者,此修改將不可逆", "矛盾": "矛盾", @@ -1730,7 +2043,6 @@ "硬件类型": "硬體類型", "硬件配置": "硬體設定", "确定": "確定", - "确定?": "確定?", "确定删除此组?": "確定刪除此組?", "确定导入": "確定導入", "确定是否要修复数据库一致性?": "確定是否要修復資料庫一致性?", @@ -1755,23 +2067,30 @@ "确定要删除此分类吗?": "確定要刪除此分類嗎?", "确定要删除此密钥吗?": "確定要刪除此密鑰嗎?", "确定要删除此问答吗?": "確定要刪除此問答嗎?", + "确定要删除该提供商吗?": "確定要刪除該提供商嗎?", "确定要删除这条消息吗?": "確定要刪除這條消息嗎?", "确定要删除选中的": "確定要刪除選中的", "确定要启用所有密钥吗?": "確定要啟用所有密鑰嗎?", "确定要启用此用户吗?": "確定要啟用此使用者嗎?", "确定要提升此用户吗?": "確定要提升此使用者嗎?", "确定要更新所有已启用通道余额吗?": "確定要更新所有已啟用通道餘額嗎?", - "确定要测试所有通道吗?": "確定要測試所有通道嗎?", "确定要测试所有未手动禁用渠道吗?": "確定要測試所有未手動停用通道嗎?", + "确定要测试所有通道吗?": "確定要測試所有通道嗎?", "确定要禁用所有的密钥吗?": "確定要禁用所有的密鑰嗎?", "确定要禁用此用户吗?": "確定要禁用此使用者嗎?", + "确定要解绑 {{name}} 吗?": "確定要解綁 {{name}} 嗎?", "确定要降级此用户吗?": "確定要降級此使用者嗎?", "确定重置": "確定重置", "确定重置模型倍率吗?": "確定重置模型倍率嗎?", + "确定?": "確定?", "确认": "確認", + "确认作废": "確認作廢", + "确认关闭提示": "確認關閉提示", "确认冲突项修改": "確認衝突項修改", "确认删除": "確認刪除", "确认删除模型": "確認刪除模型", + "确认删除该分组?": "確認刪除該分組?", + "确认删除该规则?": "確認刪除該規則?", "确认取消密码登录": "確認取消密碼登錄", "确认密码": "確認密碼", "确认导入配置": "確認導入設定", @@ -1779,9 +2098,11 @@ "确认延长容器时长": "確認延長容器時長", "确认操作": "確認操作", "确认新密码": "確認新密碼", + "确认清理不活跃的磁盘缓存?": "確認清理不活躍的磁碟快取?", "确认清理日志文件?": "確認清理日誌檔案?", "确认清除历史日志": "確認清除歷史日誌", "确认禁用": "確認禁用", + "确认移除?": "確認移除?", "确认补单": "確認補單", "确认解绑": "確認解綁", "确认解绑 Passkey": "確認解綁 Passkey", @@ -1789,17 +2110,24 @@ "确认重置 Passkey": "確認重置 Passkey", "确认重置两步验证": "確認重置兩步驗證", "确认重置密码": "確認重置密碼", + "磁盘 阈值 (%)": "磁碟 閾值 (%)", + "磁盘使用率超过此值时拒绝请求": "磁碟使用率超過此值時拒絕請求", + "磁盘可用空间小于缓存最大总量设置": "磁碟可用空間小於快取最大總量設定", + "磁盘命中": "磁碟命中", + "磁盘缓存占用的最大空间": "磁碟快取佔用的最大空間", + "磁盘缓存已清理": "磁碟快取已清理", + "磁盘缓存最大总量 (MB)": "磁碟快取最大總量 (MB)", + "磁盘缓存设置(磁盘换内存)": "磁碟快取設定(磁碟換記憶體)", + "磁盘缓存阈值 (MB)": "磁碟快取閾值 (MB)", "示例": "示例", "示例:{\"default\": [200, 100], \"vip\": [0, 1000]}。": "示例:{\"default\": [200, 100], \"vip\": [0, 1000]}。", - "视频": "影片", - "视频Remix": "影片 Remix", - "视频无法在当前浏览器中播放,这可能是由于:": "影片無法在當前瀏覽器中播放,這可能是由於:", "禁用": "禁用", "禁用 store 透传": "禁用 store 透傳", "禁用2FA失败": "禁用2FA失敗", "禁用两步验证": "禁用兩步驗證", "禁用全部": "禁用全部", "禁用原因": "禁用原因", + "禁用后用户端不再展示,但历史订单不受影响。是否继续?": "禁用後使用者端不再展示,但歷史訂單不受影響。是否繼續?", "禁用后的影响:": "禁用後的影響:", "禁用密钥失败": "禁用密鑰失敗", "禁用思考处理的模型列表": "禁用思考處理的模型列表", @@ -1810,34 +2138,59 @@ "私有镜像仓库的密码": "私有鏡像倉庫的密碼", "私有镜像仓库的用户名": "私有鏡像倉庫的使用者名", "秒": "秒", - "移除 functionResponse.id 字段": "移除 functionResponse.id 字段", + "移除": "移除", + "移除 (-:)": "移除 (-:)", "移除 One API 的版权标识必须首先获得授权,项目维护需要花费大量精力,如果本项目对你有意义,请主动支持本项目": "移除 One API 的版權標識必須首先獲得授權,項目維護需要花費大量精力,如果本項目對你有意義,請主動支援本項目", + "移除 functionResponse.id 字段": "移除 functionResponse.id 字段", + "空": "空", "窗口处理": "窗口處理", "窗口等待": "窗口等待", + "立即签到": "立即簽到", + "立即订阅": "立即訂閱", + "站点所有额度将以原始 Token 数显示,不做货币换算": "站點所有額度將以原始 Token 數顯示,不做貨幣換算", + "站点所有额度将以美元 ($) 显示": "站點所有額度將以美元 ($) 顯示", + "站点所有额度将按汇率换算为人民币 (¥) 显示": "站點所有額度將按匯率換算為人民幣 (¥) 顯示", + "站点所有额度将按汇率换算为自定义货币显示": "站點所有額度將按匯率換算為自訂貨幣顯示", "站点额度展示类型及汇率": "站點額度展示類型及匯率", "端口号必须在1-65535之间": "端口號必須在1-65535之間", "端口配置详细说明": "限制外部請求只能訪問指定端口。支援單個端口(80, 443)或端口範圍(8000-8999)。空列表允許所有端口。預設包含常用Web端口。", "端点": "端點", + "端点 URL 必须以 http:// 或 https:// 开头:": "端點 URL 必須以 http:// 或 https:// 開頭:", + "端点 URL 必须是完整地址(以 http:// 或 https:// 开头)": "端點 URL 必須是完整位址(以 http:// 或 https:// 開頭)", "端点映射": "端點映射", - "在模型广场向用户展示的端点": "在模型廣場向使用者展示的端點", "端点类型": "端點類型", "端点组": "端點組", + "第三方支付配置": "第三方支付設定", "第三方账户绑定状态(只读)": "第三方帳號綁定狀態(唯讀)", "等价金额:": "等價金額:", "等待中": "等待中", "等待获取邮箱信息...": "等待獲取信箱資訊...", "筛选": "篩選", + "签到功能允许用户每日签到获取随机额度奖励": "簽到功能允許使用者每日簽到獲取隨機額度獎勵", + "签到失败": "簽到失敗", + "签到奖励将直接添加到您的账户余额": "簽到獎勵將直接添加到您的帳號餘額", + "签到奖励的最大额度": "簽到獎勵的最大額度", + "签到奖励的最小额度": "簽到獎勵的最小額度", + "签到成功!获得": "簽到成功!獲得", + "签到最大额度": "簽到最大額度", + "签到最小额度": "簽到最小額度", + "签到设置": "簽到設定", + "简单来说:同一个令牌分组,不同等级的用户可以享受不同的价格。": "簡單來說:同一個令牌分組,不同等級的使用者可以享受不同的價格。", "管理": "管理", "管理 Ollama 模型的拉取和删除": "管理 Ollama 模型的拉取和刪除", "管理你的 LinuxDO OAuth App": "管理你的 LinuxDO OAuth App", "管理员": "管理員", + "管理员分配的优惠分组": "管理員分配的優惠分組", + "管理员分配的基础分组": "管理員分配的基礎分組", "管理员区域": "管理員區域", "管理员暂时未设置任何关于内容": "管理員暫時未設定任何關於內容", "管理员未开启 Creem 充值!": "管理員未開啟 Creem 儲值!", "管理员未开启Stripe充值!": "管理員未開啟Stripe儲值!", - "管理员未开启在线充值!": "管理員未開啟在線儲值!", "管理员未开启在线充值功能,请联系管理员开启或使用兑换码充值。": "管理員未開啟在線儲值功能,請聯繫管理員開啟或使用兌換碼儲值。", + "管理员未开启在线充值!": "管理員未開啟在線儲值!", + "管理员未开启在线支付功能,请联系管理员配置。": "管理員未開啟在線支付功能,請聯繫管理員設定。", "管理员未设置用户可选分组": "管理員未設定使用者可選分組", + "管理员给用户分配的分组(如 vip)不仅决定用户身份,还会影响后续两个功能:": "管理員給使用者分配的分組(如 vip)不僅決定使用者身份,還會影響後續兩個功能:", "管理员设置了外部链接,点击下方按钮访问": "管理員設定了外部連結,點擊下方按鈕訪問", "管理员账号": "管理員帳號", "管理员账号已经初始化过,请继续设置其他参数": "管理員帳號已經初始化過,請繼續設定其他參數", @@ -1852,6 +2205,10 @@ "系统信息": "系統訊息", "系统公告": "系統公告", "系统公告管理,可以发布系统通知和重要消息(最多100个,前端显示最新20条)": "系統公告管理,可以發佈系統通知和重要消息(最多100個,前端顯示最新20條)", + "系统内存": "系統記憶體", + "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为人民币,不影响内部计费": "系統內部以美元 (USD) 為基準計價。用戶餘額、充值金額、模型定價、用量日誌等所有金額顯示均按此匯率換算為人民幣,不影響內部計費", + "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为自定义货币,不影响内部计费": "系統內部以美元 (USD) 為基準計價。用戶餘額、充值金額、模型定價、用量日誌等所有金額顯示均按此匯率換算為自訂貨幣,不影響內部計費", + "系统内部计费精度,默认 500000,修改可能导致计费异常,请谨慎操作": "系統內部計費精度,預設 500000,修改可能導致計費異常,請謹慎操作", "系统初始化": "系統初始化", "系统初始化失败,请重试": "系統初始化失敗,請重試", "系统初始化成功,正在跳转...": "系統初始化成功,正在跳轉...", @@ -1860,6 +2217,7 @@ "系统名称已更新": "系統名稱已更新", "系统名称更新失败": "系統名稱更新失敗", "系统已为该部署准备 Ollama 镜像与随机 API Key": "系統已為該部署準備 Ollama 鏡像與隨機 API Key", + "系统性能监控": "系統性能監控", "系统提示覆盖": "系統提示覆蓋", "系统提示词": "系統提示詞", "系统提示词拼接": "系統提示詞拼接", @@ -1867,22 +2225,13 @@ "系统文档和帮助信息": "系統文件和幫助資訊", "系统消息": "系統消息", "系统管理功能": "系統管理功能", - "系统性能监控": "系統性能監控", - "启用性能监控后,当系统资源使用率超过设定阈值时,将拒绝新的 Relay 请求 (/v1, /v1beta 等),以保护系统稳定性。": "啟用性能監控後,當系統資源使用率超過設定閾值時,將拒絕新的 Relay 請求 (/v1, /v1beta 等),以保護系統穩定性。", - "启用性能监控": "啟用性能監控", - "超过阈值时拒绝新请求": "超過閾值時拒絕新請求", - "CPU 阈值 (%)": "CPU 閾值 (%)", - "CPU 使用率超过此值时拒绝请求": "CPU 使用率超過此值時拒絕請求", - "内存 阈值 (%)": "記憶體 閾值 (%)", - "内存使用率超过此值时拒绝请求": "記憶體使用率超過此值時拒絕請求", - "磁盘 阈值 (%)": "磁碟 閾值 (%)", - "磁盘使用率超过此值时拒绝请求": "磁碟使用率超過此值時拒絕請求", - "保存性能设置": "儲存性能設定", "系统设置": "系統設定", "系统访问令牌": "系統訪問令牌", - "约": "約", "索引": "索引", "紧凑列表": "緊湊列表", + "累计签到": "累計簽到", + "累计获得": "累計獲得", + "约": "約", "线路描述": "線路描述", "组列表": "組列表", "组名": "組名", @@ -1893,9 +2242,12 @@ "绑定": "綁定", "绑定 Telegram": "綁定 Telegram", "绑定信息": "綁定資訊", + "绑定后会立即生成用户订阅(无需支付),有效期按套餐配置计算。": "綁定後會立即生成使用者訂閱(無需支付),有效期按訂閱設定計算。", "绑定微信账户": "綁定微信帳號", "绑定成功!": "綁定成功!", + "绑定订阅套餐": "綁定訂閱", "绑定邮箱地址": "綁定信箱位址", + "结束": "結束", "结束时间": "結束時間", "结果图片": "結果圖片", "绘图": "繪圖", @@ -1904,28 +2256,48 @@ "绘图设置": "繪圖設定", "统一的": "統一的", "统计Tokens": "統計Tokens", + "统计已重置": "統計已重置", "统计次数": "統計次數", "统计额度": "統計額度", "继续": "繼續", - "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "快取 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})", "缓存 Tokens": "快取 Tokens", + "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "快取 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "缓存 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "快取 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})", "缓存: {{cacheRatio}}": "快取: {{cacheRatio}}", "缓存价格:{{symbol}}{{price}} * {{cacheRatio}} = {{symbol}}{{total}} / 1M tokens (缓存倍率: {{cacheRatio}})": "快取價格:{{symbol}}{{price}} * {{cacheRatio}} = {{symbol}}{{total}} / 1M tokens (快取倍率: {{cacheRatio}})", "缓存价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存倍率: {{cacheRatio}})": "快取價格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (快取倍率: {{cacheRatio}})", "缓存倍率": "快取倍率", "缓存倍率 {{cacheRatio}}": "快取倍率 {{cacheRatio}}", - "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "快取建立 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})", + "缓存写": "快取寫", "缓存创建 Tokens": "快取建立 Tokens", - "缓存创建: {{cacheCreationRatio}}": "快取建立: {{cacheCreationRatio}}", + "缓存创建 {{price}} / 1M tokens": "快取建立 {{price}} / 1M tokens", + "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}": "快取建立 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}}", + "缓存创建 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})": "快取建立 {{tokens}} tokens / 1M tokens * {{symbol}}{{price}} (倍率: {{ratio}})", "缓存创建: 1h {{cacheCreationRatio1h}}": "快取建立: 1h {{cacheCreationRatio1h}}", "缓存创建: 5m {{cacheCreationRatio5m}}": "快取建立: 5m {{cacheCreationRatio5m}}", "缓存创建: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "快取建立: 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", - "缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存创建倍率: {{cacheCreationRatio}})": "快取建立價格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (快取建立倍率: {{cacheCreationRatio}})", + "缓存创建: {{cacheCreationRatio}}": "快取建立: {{cacheCreationRatio}}", + "缓存创建价格": "快取建立價格", + "缓存创建价格 {{symbol}}{{price}} / 1M tokens": "快取建立價格 {{symbol}}{{price}} / 1M tokens", "缓存创建价格合计:5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens": "快取建立價格合計:5m {{symbol}}{{five}} + 1h {{symbol}}{{one}} = {{symbol}}{{total}} / 1M tokens", - "缓存创建倍率 {{cacheCreationRatio}}": "快取建立倍率 {{cacheCreationRatio}}", + "缓存创建价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (缓存创建倍率: {{cacheCreationRatio}})": "快取建立價格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens (快取建立倍率: {{cacheCreationRatio}})", + "缓存创建价格:{{symbol}}{{price}} / 1M tokens": "快取建立價格:{{symbol}}{{price}} / 1M tokens", + "缓存创建倍率": "快取建立倍率", "缓存创建倍率 1h {{cacheCreationRatio1h}}": "快取建立倍率 1h {{cacheCreationRatio1h}}", "缓存创建倍率 5m {{cacheCreationRatio5m}}": "快取建立倍率 5m {{cacheCreationRatio5m}}", "缓存创建倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}": "快取建立倍率 5m {{cacheCreationRatio5m}} / 1h {{cacheCreationRatio1h}}", + "缓存创建倍率 {{cacheCreationRatio}}": "快取建立倍率 {{cacheCreationRatio}}", + "缓存创建:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存创建倍率 {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "快取建立:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 快取建立倍率 {{cacheCreationRatio}} * {{ratioType}} {{ratio}} = {{amount}}", + "缓存目录": "快取目錄", + "缓存目录磁盘空间": "快取目錄磁碟空間", + "缓存读": "快取讀", + "缓存读 {{price}} / 1M tokens": "快取讀 {{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", + "缓存读取:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "快取讀取:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 快取倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", + "缓存输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "快取輸入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 快取倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "编辑": "編輯", "编辑API": "編輯API", "编辑产品": "編輯產品", @@ -1934,6 +2306,7 @@ "编辑公告内容": "編輯公告內容", "编辑分类": "編輯分類", "编辑成功": "編輯成功", + "编辑提供商": "編輯提供商", "编辑标签": "編輯標籤", "编辑模型": "編輯模型", "编辑模式": "編輯模式", @@ -1959,67 +2332,49 @@ "聊天链接配置错误,请联系管理员": "聊天連結設定錯誤,請聯繫管理員", "联系我们": "聯繫我們", "腾讯混元": "騰訊混元", - "自动分组auto,从第一个开始选择": "自動分組auto,從第一個開始選擇", + "自动分组": "自動分組", + "自动分组auto,从第一个开始选择": "自動分組 auto,從第一個開始選擇", + "自动分组选择": "自動分組選擇", "自动刷新": "自動刷新", "自动刷新中": "自動刷新中", + "自动填入": "自動填入", "自动检测": "自動檢測", "自动模式": "自動模式", "自动测试所有通道间隔时间": "自動測試所有通道間隔時間", + "自动生成:": "自動生成:", "自动禁用": "自動禁用", "自动禁用关键词": "自動禁用關鍵詞", "自动禁用状态码": "自動禁用狀態碼", "自动禁用状态码格式不正确": "自動禁用狀態碼格式不正確", + "自动选择": "自動選擇", "自动重试状态码": "自動重試狀態碼", "自动重试状态码格式不正确": "自動重試狀態碼格式不正確", - "支持填写单个状态码或范围(含首尾),使用逗号分隔": "支援填寫單個狀態碼或範圍(含首尾),使用逗號分隔", - "支持填写单个状态码或范围(含首尾),使用逗号分隔;504 和 524 始终不重试,不受此处配置影响": "支援填寫單個狀態碼或範圍(含首尾),使用逗號分隔;504 和 524 一律不重試,不受此處設定影響", - "高危操作确认": "高風險操作確認", - "检测到以下高危状态码重定向规则": "檢測到以下高風險狀態碼重定向規則", - "操作确认": "操作確認", - "我确认开启高危重试": "我確認開啟高風險重試", - "高危状态码重试风险告知与免责声明Markdown": "### ⚠️ 高風險操作:504/524 狀態碼重試風險告知與免責聲明\n\n【背景提示】\n本專案預設對 `400`(請求錯誤)、`504`(閘道逾時)與 `524`(發生逾時)狀態碼不進行重試。504 與 524 錯誤通常代表**請求已成功送達上游 AI 服務,且上游正在處理,但因處理時間過長導致連線中斷**。\n\n開啟此類逾時狀態碼的重定向/重試屬於**極高風險操作**。作為本開源專案使用者,在開啟該功能前,您必須仔細閱讀並知悉以下嚴重後果:\n\n#### 一、 核心風險告知(請仔細閱讀)\n1. 💸 雙重/多重計費風險:多數 AI 上游廠商對於已開始處理但因網路原因中斷(504/524)的請求**仍然會扣費**。此時若觸發重試,將會向上游發起全新請求,導致您被**雙重甚至多重計費**。\n2. ⏳ 用戶端嚴重逾時:單次請求已觸發逾時,疊加重試機制會使總請求耗時成倍增加,導致最終用戶端(或呼叫方)出現嚴重甚至無法接受的逾時現象。\n3. 💥 請求積壓與系統崩潰風險:強制重試逾時請求會長時間占用系統執行緒與連線數。在高併發場景下,這將導致嚴重**請求積壓**,進而耗盡系統資源,引發雪崩效應,造成整個代理服務崩潰。\n\n#### 二、 風險確認聲明\n若您堅持開啟該功能,即代表您作出以下確認:", - "高危状态码重试风险确认输入文本": "我已了解多重計費與崩潰風險,確認開啟", - "高危状态码重试风险确认项1": "我已充分閱讀並理解:本人已完整閱讀上述全部風險提示,完全理解強制重試 504 與 524 狀態碼可能帶來的破壞性後果。", - "高危状态码重试风险确认项2": "我已與上游溝通並確認:本人確認,當前逾時問題屬於上游服務瓶頸。本人已與上游供應商溝通,確認上游無法解決該逾時問題,因此才採取強制重試方案作為妥協手段。", - "高危状态码重试风险确认项3": "我自願承擔計費損失:本人知悉並接受由此產生的全部雙重/多重計費風險,承諾不會因重試導致的帳單異常在本專案倉庫提交 Issue 或抱怨。", - "高危状态码重试风险确认项4": "我自願承擔系統穩定性風險:本人知悉該操作可能導致用戶端嚴重逾時及服務崩潰。若因本人開啟此功能導致請求積壓或服務不可用,後果由本人自行承擔。", - "高危状态码重试风险输入框占位文案": "請完整輸入上方文字", - "高危状态码重试风险输入不匹配提示": "輸入內容與要求不一致", - "例如:401, 403, 429, 500-599": "例如:401,403,429,500-599", - "自动选择": "自動選擇", + "自定义 OAuth 提供商": "自訂 OAuth 提供商", "自定义充值数量选项": "自訂儲值數量選項", "自定义充值数量选项不是合法的 JSON 数组": "自訂儲值數量選項不是合法的 JSON 陣列", "自定义变焦-提交": "自訂變焦-提交", "自定义模型名称": "自訂模型名稱", "自定义模式下不可用": "自訂模式下不可用", + "自定义秒数": "自訂秒數", "自定义请求体模式": "自訂請求體模式", "自定义货币": "自訂貨幣", "自定义货币符号": "自訂貨幣符號", "自定义货币符号将显示在所有额度数值前,例如 €1.50": "自訂貨幣符號將顯示在所有額度數值前,例如 €1.50", - "额度展示类型": "額度展示類型", - "站点所有额度将以美元 ($) 显示": "站點所有額度將以美元 ($) 顯示", - "站点所有额度将按汇率换算为人民币 (¥) 显示": "站點所有額度將按匯率換算為人民幣 (¥) 顯示", - "站点所有额度将以原始 Token 数显示,不做货币换算": "站點所有額度將以原始 Token 數顯示,不做貨幣換算", - "站点所有额度将按汇率换算为自定义货币显示": "站點所有額度將按匯率換算為自訂貨幣顯示", - "汇率": "匯率", - "每美元对应 Token 数": "每美元對應 Token 數", - "预览效果": "預覽效果", - "请输入汇率": "請輸入匯率", - "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为人民币,不影响内部计费": "系統內部以美元 (USD) 為基準計價。用戶餘額、充值金額、模型定價、用量日誌等所有金額顯示均按此匯率換算為人民幣,不影響內部計費", - "系统内部计费精度,默认 500000,修改可能导致计费异常,请谨慎操作": "系統內部計費精度,預設 500000,修改可能導致計費異常,請謹慎操作", - "系统内部以美元 (USD) 为基准计价。用户余额、充值金额、模型定价、用量日志等所有金额显示均按此汇率换算为自定义货币,不影响内部计费": "系統內部以美元 (USD) 為基準計價。用戶餘額、充值金額、模型定價、用量日誌等所有金額顯示均按此匯率換算為自訂貨幣,不影響內部計費", "自定义镜像": "自訂鏡像", "自用模式": "自用模式", "自适应列表": "動態列表", + "至": "至", "节省": "節省", "花费": "花費", "花费时间": "花費時間", "若你的 OIDC Provider 支持 Discovery Endpoint,你可以仅填写 OIDC Well-Known URL,系统会自动获取 OIDC 配置": "若你的 OIDC Provider 支援 Discovery Endpoint,你可以僅填寫 OIDC Well-Known URL,系統會自動獲取 OIDC 設定", - "获取 io.net API Key": "獲取 io.net API Key", "获取 OIDC 配置失败,请检查网络状况和 Well-Known URL 是否正确": "獲取 OIDC 設定失敗,請檢查網路狀況和 Well-Known URL 是否正確", "获取 OIDC 配置成功!": "獲取 OIDC 設定成功!", "获取 Ollama 版本失败": "獲取 Ollama 版本失敗", + "获取 io.net API Key": "獲取 io.net API Key", "获取2FA状态失败": "獲取2FA狀態失敗", + "获取充值配置失败": "取得儲值設定失敗", + "获取充值配置异常": "儲值設定異常", "获取初始化状态失败": "獲取初始化狀態失敗", "获取可用资源失败: ": "獲取可用資源失敗: ", "获取启用模型失败": "獲取啟用模型失敗", @@ -2036,16 +2391,22 @@ "获取模型列表失败": "獲取模型列表失敗", "获取渠道失败:": "獲取管道失敗:", "获取硬件类型失败: ": "獲取硬體類型失敗: ", + "获取签到状态失败": "獲取簽到狀態失敗", "获取组列表失败": "獲取組列表失敗", "获取详情失败": "獲取詳情失敗", "获取部署列表失败": "獲取部署列表失敗", "获取金额失败": "獲取金額失敗", "获取验证码": "獲取驗證碼", + "获得": "獲得", "补全": "補全", + "补全 {{completion}} tokens * 输出倍率 {{completionRatio}}": "補全 {{completion}} tokens * 輸出倍率 {{completionRatio}}", "补全 {{completion}} tokens / 1M tokens * {{symbol}}{{price}}": "補全 {{completion}} tokens / 1M tokens * {{symbol}}{{price}}", + "补全价格": "補全價格", + "补全价格已锁定": "補全價格已鎖定", "补全价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "補全價格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (補全倍率: {{completionRatio}})", "补全价格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens": "補全價格:{{symbol}}{{price}} * {{ratio}} = {{symbol}}{{total}} / 1M tokens", "补全倍率": "補全倍率", + "补全倍率 {{completionRatio}}": "補全倍率 {{completionRatio}}", "补全倍率值": "補全倍率值", "补单": "補單", "补单失败": "補單失敗", @@ -2054,21 +2415,37 @@ "表格视图": "表格視圖", "覆盖模式:将完全替换现有的所有密钥": "覆蓋模式:將完全替換現有的所有密鑰", "覆盖现有密钥": "覆蓋現有密鑰", + "规则": "規則", + "视频": "影片", + "视频Remix": "影片 Remix", + "视频无法在当前浏览器中播放,这可能是由于:": "影片無法在當前瀏覽器中播放,這可能是由於:", "角色": "角色", "解析响应数据时发生错误": "解析響應數據時發生錯誤", "解析密钥文件失败: {{msg}}": "解析密鑰檔案失敗: {{msg}}", "解析错误": "解析錯誤", "解绑 Passkey": "解綁 Passkey", "解绑后将无法使用 Passkey 登录,确定要继续吗?": "解綁後將無法使用 Passkey 登錄,確定要繼續嗎?", + "解绑成功": "解綁成功", + "警告": "警告", + "警告:启用保活后,如果已经写入保活数据后渠道出错,系统无法重试,如果必须开启,推荐设置尽可能大的Ping间隔": "警告:啟用保活後,如果已經寫入保活數據後管道出錯,系統無法重試,如果必須開啟,推薦設定儘可能大的Ping間隔", + "警告:禁用两步验证将永久删除您的验证设置和所有备用码,此操作不可撤销!": "警告:禁用兩步驗證將永久刪除您的驗證設定和所有備用碼,此操作不可撤銷!", "计价币种": "計價幣種", "计算中": "計算中", "计算成本": "計算成本", "计算费用中...": "計算費用中...", + "计费乘数,倍率越低费用越低。例如倍率 0.5 表示半价。": "計費乘數,倍率越低費用越低。例如倍率 0.5 表示半價。", "计费开始": "計費開始", + "计费显示模式": "計費顯示模式", "计费模式": "計費模式", "计费类型": "計費類型", "计费过程": "計費過程", "订单号": "訂單號", + "订阅": "訂閱", + "订阅套餐": "訂閱", + "订阅套餐管理": "訂閱管理", + "订阅抵扣": "訂閱抵扣", + "订阅管理": "訂閱管理", + "认证方式": "認證方式", "讯飞星火": "訊飛星火", "记录请求与错误日志IP": "記錄請求與錯誤日誌IP", "设备": "設備", @@ -2108,26 +2485,37 @@ "该供应商提供多种AI模型,适用于不同的应用场景。": "該供應商提供多種AI模型,適用於不同的應用場景。", "该分类下没有可用模型": "該分類下沒有可用模型", "该域名已存在于白名单中": "該域名已存在於白名單中", + "该套餐未配置 Creem": "該訂閱未設定 Creem", + "该套餐未配置 Stripe": "該訂閱未設定 Stripe", "该数据可能不可信,请谨慎使用": "該數據可能不可信,請謹慎使用", "该服务器地址将影响支付回调地址以及默认首页展示的地址,请确保正确配置": "該伺服器位址將影響支付回調位址以及預設首頁展示的位址,請確保正確設定", "该模型存在固定价格与倍率计费方式冲突,请确认选择": "該模型存在固定價格與倍率計費方式衝突,請確認選擇", + "该模型补全倍率由后端固定为 {{ratio}}。补全价格不能在这里修改。": "該模型補全倍率由後端固定為 {{ratio}}。補全價格不能在這裡修改。", "该渠道已开启请求透传,参数覆写、模型重定向等 NewAPI 内置功能将失效,非最佳实践。": "該管道已開啟請求透傳,參數覆寫、模型重定向等 NewAPI 內置功能將失效,非最佳實踐。", "该渠道已开启请求透传:参数覆写、模型重定向、渠道适配等 NewAPI 内置功能将失效,非最佳实践;如因此产生问题,请勿提交 issue 反馈。": "該管道已開啟請求透傳:參數覆寫、模型重定向、管道相容等 NewAPI 內置功能將失效,非最佳實踐;如因此產生問題,請勿提交 issue 回饋。", "详情": "詳情", + "详见「特殊倍率」和「可用分组」标签页。": "詳見「特殊倍率」和「可用分組」標籤頁。", + "语言偏好": "語言偏好", + "语言偏好已保存": "語言偏好已儲存", "语音输入": "語音輸入", "语音输出": "語音輸出", "说明": "說明", - "说明:": "說明:", "说明信息": "說明資訊", + "说明:": "說明:", + "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。": "說明:本頁測試為非流式請求;若管道僅支援流式返回,可能出現測試失敗,請以實際使用為準。", "请上传密钥文件": "請上傳密鑰檔案", "请上传密钥文件!": "請上傳密鑰檔案!", "请为渠道命名": "請為管道命名", "请使用 Project 为 io.cloud 的密钥": "請使用 Project 為 io.cloud 的密鑰", + "请先勾选需要批量设置的模型": "請先勾選需要批量設定的模型", "请先在设置中启用图片功能": "請先在設定中啟用圖片功能", "请先填写 API Key": "請先填寫 API Key", "请先填写 Ollama API 地址": "請先填寫 Ollama API 位址", "请先填写服务器地址": "請先填寫伺服器位址", + "请先填写服务器地址,以自动生成完整的端点 URL": "請先填寫伺服器位址,以自動生成完整的端點 URL", + "请先开启并填写音频输入价格。": "請先開啟並填寫音訊輸入價格。", "请先输入密钥": "請先輸入密鑰", + "请先选择一个作为模板的模型": "請先選擇一個作為範本的模型", "请先选择同步渠道": "請先選擇同步管道", "请先选择模型!": "請先選擇模型!", "请先选择硬件类型": "請先選擇硬體類型", @@ -2151,6 +2539,9 @@ "请检查表单填写是否正确": "請檢查表單填寫是否正確", "请检查输入": "請檢查輸入", "请求体 JSON": "請求體 JSON", + "请求体内存缓存": "請求體記憶體快取", + "请求体磁盘缓存": "請求體磁碟快取", + "请求体超过此大小时使用磁盘缓存": "請求體超過此大小時使用磁碟快取", "请求参数无效": "請求參數無效", "请求发生错误": "請求發生錯誤", "请求发生错误: ": "請求發生錯誤: ", @@ -2164,8 +2555,7 @@ "请求超时,请刷新页面后重新发起 GitHub 登录": "請求超時,請刷新頁面後重新發起 GitHub 登錄", "请求路径": "請求路徑", "请求转换": "請求轉換", - "原生格式": "原生格式", - "转换": "轉換", + "请求配置": "請求設定", "请求预扣费额度": "請求預扣費額度", "请点击我": "請點擊我", "请确认以下设置信息,点击\"初始化系统\"开始配置": "請確認以下設定資訊,點擊\"初始化系統\"開始設定", @@ -2185,10 +2575,10 @@ "请输入 API Key,一行一个,格式:APIKey|Region": "請輸入 API Key,一行一個,格式:APIKey|Region", "请输入 API Key,格式:APIKey|Region": "請輸入 API Key,格式:APIKey|Region", "请输入 AZURE_OPENAI_ENDPOINT,例如:https://docs-test-001.openai.azure.com": "請輸入 AZURE_OPENAI_ENDPOINT,例如:https://docs-test-001.openai.azure.com", - "请输入 io.net API Key": "請輸入 io.net API Key", - "请输入 io.net API Key(敏感信息不显示)": "請輸入 io.net API Key(敏感資訊不顯示)", "请输入 JSON 格式的密钥内容,例如:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}": "請輸入 JSON 格式的密鑰內容,例如:\n{\n \"type\": \"service_account\",\n \"project_id\": \"your-project-id\",\n \"private_key_id\": \"...\",\n \"private_key\": \"...\",\n \"client_email\": \"...\",\n \"client_id\": \"...\",\n \"auth_uri\": \"...\",\n \"token_uri\": \"...\",\n \"auth_provider_x509_cert_url\": \"...\",\n \"client_x509_cert_url\": \"...\"\n}", "请输入 OIDC 的 Well-Known URL": "請輸入 OIDC 的 Well-Known URL", + "请输入 io.net API Key": "請輸入 io.net API Key", + "请输入 io.net API Key(敏感信息不显示)": "請輸入 io.net API Key(敏感資訊不顯示)", "请输入6位验证码或8位备用码": "請輸入6位驗證碼或8位備用碼", "请输入API地址": "請輸入API位址", "请输入API地址!": "請輸入API位址!", @@ -2198,9 +2588,9 @@ "请输入Gotify服务器地址": "請輸入Gotify伺服器位址", "请输入Gotify服务器地址,例如: https://gotify.example.com": "請輸入Gotify伺服器位址,例如: https://gotify.example.com", "请输入JSON数组,如 [\"model-a\",\"model-b\"]": "請輸入JSON陣列,如 [\"model-a\",\"model-b\"]", + "请输入URL链接": "請輸入URL連結", "请输入Uptime Kuma地址": "請輸入Uptime Kuma位址", "请输入Uptime Kuma服务地址,如:https://status.example.com": "請輸入Uptime Kuma服務位址,如:https://status.example.com", - "请输入URL链接": "請輸入URL連結", "请输入Webhook地址": "請輸入Webhook位址", "请输入Webhook地址,例如: https://example.com/webhook": "請輸入Webhook位址,例如: https://example.com/webhook", "请输入你的账户名以确认删除!": "請輸入你的帳號名以確認刪除!", @@ -2223,16 +2613,18 @@ "请输入图标名称": "請輸入圖示名稱", "请输入填充值": "請輸入填儲值", "请输入备注(仅管理员可见)": "請輸入備註(僅管理員可見)", + "请输入套餐标题": "請輸入訂閱標題", "请输入完整的 JSON 格式密钥内容": "請輸入完整的 JSON 格式密鑰內容", - "请输入完整的URL,例如:https://api.openai.com/v1/chat/completions": "請輸入完整的URL,例如:https://api.openai.com/v1/chat/completions", "请输入完整的URL链接": "請輸入完整的URL連結", + "请输入完整的URL,例如:https://api.openai.com/v1/chat/completions": "請輸入完整的URL,例如:https://api.openai.com/v1/chat/completions", "请输入容器名称": "請輸入容器名稱", "请输入密码": "請輸入密碼", "请输入密钥": "請輸入密鑰", + "请输入密钥!": "請輸入密鑰!", "请输入密钥,一行一个": "請輸入密鑰,一行一個", "请输入密钥,一行一个,格式:AccessKey|SecretAccessKey|Region": "請輸入密鑰,一行一個,格式:AccessKey|SecretAccessKey|Region", - "请输入密钥!": "請輸入密鑰!", "请输入延长时长": "請輸入延長時長", + "请输入总额度": "請輸入總額度", "请输入您的密码": "請輸入您的密碼", "请输入您的用户名以确认删除": "請輸入您的使用者名以確認刪除", "请输入您的用户名或邮箱地址": "請輸入您的使用者名或信箱位址", @@ -2261,12 +2653,14 @@ "请输入模型名称,例如: llama3.2, qwen2.5:7b": "請輸入模型名稱,例如: llama3.2, qwen2.5:7b", "请输入模型名称,如:gpt-4": "請輸入模型名稱,如:gpt-4", "请输入模型描述": "請輸入模型描述", + "请输入汇率": "請輸入匯率", "请输入消息内容...": "請輸入消息內容...", "请输入状态页面Slug": "請輸入狀態頁面Slug", "请输入状态页面的Slug,如:my-status": "請輸入狀態頁面的Slug,如:my-status", "请输入生成数量": "請輸入生成數量", "请输入用户名": "請輸入使用者名", "请输入私有部署地址,格式为:https://fastgpt.run/api/openapi": "請輸入私有部署位址,格式為:https://fastgpt.run/api/openapi", + "请输入秒数": "請輸入秒數", "请输入管理员密码": "請輸入管理員密碼", "请输入管理员用户名": "請輸入管理員使用者名", "请输入线路描述": "請輸入線路描述", @@ -2281,12 +2675,13 @@ "请输入认证器验证码或备用码": "請輸入認證器驗證碼或備用碼", "请输入说明": "請輸入說明", "请输入运行时长": "請輸入運行時長", - "请输入邮箱!": "請輸入信箱!", "请输入邮箱地址": "請輸入信箱位址", "请输入邮箱验证码!": "請輸入信箱驗證碼!", + "请输入邮箱!": "請輸入信箱!", "请输入部署名称": "請輸入部署名稱", "请输入部署名称以完成二次确认": "請輸入部署名稱以完成二次確認", "请输入部署地区,例如:us-central1\n支持使用模型映射格式\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}": "請輸入部署地區,例如:us-central1\n支援使用模型映射格式\n{\n \"default\": \"us-central1\",\n \"claude-3-5-sonnet-20240620\": \"europe-west1\"\n}", + "请输入金额": "請輸入金額", "请输入镜像地址": "請輸入鏡像位址", "请输入问题标题": "請輸入問題標題", "请输入预警阈值": "請輸入預警閾值", @@ -2326,9 +2721,6 @@ "调用次数排行": "調用次數排行", "调试信息": "除錯訊息", "谨慎": "謹慎", - "警告": "警告", - "警告:启用保活后,如果已经写入保活数据后渠道出错,系统无法重试,如果必须开启,推荐设置尽可能大的Ping间隔": "警告:啟用保活後,如果已經寫入保活數據後管道出錯,系統無法重試,如果必須開啟,推薦設定儘可能大的Ping間隔", - "警告:禁用两步验证将永久删除您的验证设置和所有备用码,此操作不可撤销!": "警告:禁用兩步驗證將永久刪除您的驗證設定和所有備用碼,此操作不可撤銷!", "豆包": "豆包", "账单": "帳單", "账户充值": "帳號儲值", @@ -2341,18 +2733,26 @@ "账户统计": "帳號統計", "货币": "貨幣", "货币单位": "貨幣單位", + "购买上限": "購買上限", "购买兑换码": "購買兌換碼", + "购买套餐后即可享受模型权益": "購買訂閱後即可享受模型權益", + "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。": "購買或手動新增訂閱會升級到該分組;當訂閱失效/過期或手動作廢/刪除後,將回退到升級前分組。回退不會立即生效,通常會有幾分鐘延遲。", + "购买订阅套餐": "購買訂閱", + "购买订阅获得模型额度/次数": "購買訂閱取得模型額度/次數", "费用信息": "費用資訊", "费用预估": "費用預估", "资源消耗": "資源消耗", "起始时间": "起始時間", "超级管理员": "超級管理員", "超级管理员未设置充值链接!": "超級管理員未設定儲值連結!", + "超过阈值时拒绝新请求": "超過閾值時拒絕新請求", "跟随日志": "跟隨日誌", "跟随系统主题设置": "跟隨系統主題設定", "跨分组": "跨分組", + "跨分组特殊倍率": "跨分組特殊倍率", "跨分组重试": "跨分組重試", "跳转": "跳轉", + "转换": "轉換", "轮询": "輪詢", "轮询模式": "輪詢模式", "轮询模式必须搭配Redis和内存缓存功能使用,否则性能将大幅降低,并且无法实现轮询功能": "輪詢模式必須搭配Redis和記憶體快取功能使用,否則性能將大幅降低,並且無法實現輪詢功能", @@ -2361,18 +2761,23 @@ "输入 OIDC 的 Client ID": "輸入 OIDC 的 Client ID", "输入 OIDC 的 Token Endpoint": "輸入 OIDC 的 Token Endpoint", "输入 OIDC 的 Userinfo Endpoint": "輸入 OIDC 的 Userinfo Endpoint", + "输入 {{price}} / 1M tokens": "輸入 {{price}} / 1M tokens", "输入IP地址后回车,如:8.8.8.8": "輸入IP位址後回車,如:8.8.8.8", "输入JSON对象": "輸入JSON對象", "输入价格": "輸入價格", + "输入价格 {{symbol}}{{price}} / 1M tokens": "輸入價格 {{symbol}}{{price}} / 1M tokens", + "输入价格:{{symbol}}{{price}} / 1M tokens": "輸入價格:{{symbol}}{{price}} / 1M tokens", "输入价格:{{symbol}}{{price}} / 1M tokens{{audioPrice}}": "輸入價格:{{symbol}}{{price}} / 1M tokens{{audioPrice}}", "输入你注册的 LinuxDO OAuth APP 的 ID": "輸入你註冊的 LinuxDO OAuth APP 的 ID", "输入你的账户名{{username}}以确认删除": "輸入你的帳號名{{username}}以確認刪除", "输入域名后回车": "輸入域名後回車", "输入域名后回车,如:example.com": "輸入域名後回車,如:example.com", + "输入基础 URL": "輸入基礎 URL", "输入密码,最短 8 位,最长 20 位": "輸入密碼,最短 8 位,最長 20 位", "输入数字": "輸入數位", "输入标签或使用\",\"分隔多个标签": "輸入標籤或使用\",\"分隔多個標籤", "输入模型倍率": "輸入模型倍率", + "输入模型名称,例如 gpt-4.1": "輸入模型名稱,例如 gpt-4.1", "输入每次价格": "輸入每次價格", "输入端口后回车,如:80 或 8000-8999": "輸入端口後回車,如:80 或 8000-8999", "输入系统提示词,用户的系统提示词将优先于此设置": "輸入系統提示詞,使用者的系統提示詞將優先於此設定", @@ -2387,49 +2792,16 @@ "输入验证码完成设置": "輸入驗證碼完成設定", "输出": "輸出", "输出 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}}) * {{ratioType}} {{ratio}}": "輸出 {{completion}} tokens / 1M tokens * {{symbol}}{{compPrice}}) * {{ratioType}} {{ratio}}", - "磁盘缓存设置(磁盘换内存)": "磁碟快取設定(磁碟換記憶體)", - "启用磁盘缓存后,大请求体将临时存储到磁盘而非内存,可显著降低内存占用,适用于处理包含大量图片/文件的请求。建议在 SSD 环境下使用。": "啟用磁碟快取後,大請求體將臨時存儲到磁碟而非記憶體,可顯著降低記憶體佔用,適用於處理包含大量圖片/檔案的請求。建議在 SSD 環境下使用。", - "启用磁盘缓存": "啟用磁碟快取", - "将大请求体临时存储到磁盘": "將大請求體臨時存儲到磁碟", - "磁盘缓存阈值 (MB)": "磁碟快取閾值 (MB)", - "请求体超过此大小时使用磁盘缓存": "請求體超過此大小時使用磁碟快取", - "磁盘缓存最大总量 (MB)": "磁碟快取最大總量 (MB)", - "可用空间: {{free}} / 总空间: {{total}}": "可用空間: {{free}} / 總空間: {{total}}", - "磁盘缓存占用的最大空间": "磁碟快取佔用的最大空間", - "留空使用系统临时目录": "留空使用系統臨時目錄", - "例如 /var/cache/new-api": "例如 /var/cache/new-api", - "性能监控": "性能監控", - "刷新统计": "刷新統計", - "重置统计": "重置統計", - "执行 GC": "執行 GC", - "请求体磁盘缓存": "請求體磁碟快取", - "活跃文件": "活躍檔案", - "磁盘命中": "磁碟命中", - "请求体内存缓存": "請求體記憶體快取", - "当前缓存大小": "當前快取大小", - "活跃缓存数": "活躍快取數", - "内存命中": "記憶體命中", - "缓存目录磁盘空间": "快取目錄磁碟空間", - "磁盘可用空间小于缓存最大总量设置": "磁碟可用空間小於快取最大總量設定", - "已分配内存": "已分配記憶體", - "总分配内存": "總分配記憶體", - "系统内存": "系統記憶體", - "GC 次数": "GC 次數", - "Goroutine 数": "Goroutine 數", - "目录文件数": "目錄檔案數", - "目录总大小": "目錄總大小", - "磁盘缓存已清理": "磁碟快取已清理", - "清理失败": "清理失敗", - "统计已重置": "統計已重置", - "重置失败": "重置失敗", - "GC 已执行": "GC 已執行", - "GC 执行失败": "GC 執行失敗", - "缓存目录": "快取目錄", - "可用": "可用", "输出价格": "輸出價格", + "输出价格 {{symbol}}{{price}} / 1M tokens": "輸出價格 {{symbol}}{{price}} / 1M tokens", "输出价格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (补全倍率: {{completionRatio}})": "輸出價格:{{symbol}}{{price}} * {{completionRatio}} = {{symbol}}{{total}} / 1M tokens (補全倍率: {{completionRatio}})", + "输出价格:{{symbol}}{{price}} / 1M tokens": "輸出價格:{{symbol}}{{price}} / 1M tokens", + "输出价格:{{symbol}}{{total}} / 1M tokens": "輸出價格:{{symbol}}{{total}} / 1M tokens", "输出倍率 {{completionRatio}}": "輸出倍率 {{completionRatio}}", + "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "輸出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 補全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", + "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 输出倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "輸出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 輸出倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "边栏设置": "邊欄設定", + "过期于": "過期於", "过期时间": "過期時間", "过期时间不能早于当前时间!": "過期時間不能早於當前時間!", "过期时间快捷设置": "過期時間快捷設定", @@ -2441,29 +2813,41 @@ "运行时长(小时)": "運行時長(小時)", "返回修改": "返回修改", "返回登录": "返回登錄", - "违规扣费金额": "違規扣費金額", - "这是重复键中的最后一个,其值将被使用": "這是重複鍵中的最後一個,其值將被使用", + "这个界面默认按价格填写,保存时会自动换算回后端需要的倍率 JSON。": "這個介面預設按價格填寫,儲存時會自動換算回後端需要的倍率 JSON。", + "这些价格都是可选项,不填也可以。": "這些價格都是可選項,不填也可以。", + "这将删除超过 10 分钟未使用的临时缓存文件": "這將刪除超過 10 分鐘未使用的臨時快取檔案", "这是基础金额,实际扣费 = 基础金额 x 系统分组倍率。": "這是基礎金額,實際扣費 = 基礎金額 x 系統分組倍率。", + "这是重复键中的最后一个,其值将被使用": "這是重複鍵中的最後一個,其值將被使用", "进度": "進度", "进行中": "進行中", "进行该操作时,可能导致渠道访问错误,请仅在数据库出现问题时使用": "進行該操作時,可能導致管道訪問錯誤,請僅在資料庫出現問題時使用", + "违规扣费": "違規扣費", + "违规扣费金额": "違規扣費金額", "连接保活设置": "連接保活設定", + "连接信息已填入": "連線資訊已填入", "连接已断开": "連接已斷開", "连接测试中...": "連接測試中...", + "追加": "追加", "追加到现有密钥": "追加到現有密鑰", "追加模式:将新密钥添加到现有密钥列表末尾": "追加模式:將新密鑰添加到現有密鑰列表末尾", "追加模式:新密钥将添加到现有密钥列表的末尾": "追加模式:新密鑰將添加到現有密鑰列表的末尾", "退出": "退出", + "退款": "退款", + "适合 MJ / 任务类等按次收费模型。": "適合 MJ / 任務類等按次收費模型。", + "适合同系列模型一起定价,例如把 gpt-5.1 的价格批量同步到 gpt-5.1-high、gpt-5.1-low 等模型。": "適合同系列模型一起定價,例如把 gpt-5.1 的價格批量同步到 gpt-5.1-high、gpt-5.1-low 等模型。", "适用于个人使用的场景,不需要设置模型价格": "適用於個人使用的場景,不需要設定模型價格", "适用于为多个用户提供服务的场景": "適用於為多個使用者提供服務的場景", "适用于展示系统功能的场景,提供基础功能演示": "適用於展示系統功能的場景,提供基礎功能演示", "适配 -thinking、-thinking-预算数字 和 -nothinking 后缀": "相容 -thinking、-thinking-預算數位、-nothinking 以及 -low/-medium/-high 後綴", + "选择 premium 创建的令牌,调用 API 时费用为 standard 的 50%。": "選擇 premium 建立的令牌,呼叫 API 時費用為 standard 的 50%。", + "选择使用分组": "選擇使用分組", "选择充值额度": "選擇儲值額度", "选择分组": "選擇分組", "选择同步来源": "選擇同步來源", "选择同步渠道": "選擇同步管道", "选择同步语言": "選擇同步語言", "选择容器": "選擇容器", + "选择您的首选界面语言,设置将自动保存并同步到所有设备": "選擇您的首選界面語言,設定將自動儲存並同步到所有設備", "选择成功": "選擇成功", "选择支付方式": "選擇支付方式", "选择支持的认证设备类型": "選擇支援的認證設備類型", @@ -2474,14 +2858,17 @@ "选择模型后可一键填充当前选中令牌(或本页第一个令牌)。": "選擇模型後可一鍵填充當前選中令牌(或本頁第一個令牌)。", "选择模型开始对话": "選擇模型開始對話", "选择状态": "選擇狀態", + "选择用户分组": "選擇使用者分組", "选择硬件类型": "選擇硬體類型", "选择端点类型": "選擇端點類型", "选择系统运行模式": "選擇系統運行模式", "选择组类型": "請選擇組類型", "选择要覆盖的冲突项": "選擇要覆蓋的衝突項", + "选择订阅套餐": "選擇訂閱", "选择语言": "選擇語言", "选择过期时间(可选,留空为永久)": "選擇過期時間(可選,留空為永久)", "选择部署位置(可多选)": "選擇部署位置(可多選)", + "选择预设...": "選擇設定檔...", "透传请求体": "透傳請求體", "通义千问": "通義千問", "通用设置": "通用設定", @@ -2494,8 +2881,10 @@ "通知类型 (quota_exceed: 额度预警)": "通知類型 (quota_exceed: 額度預警)", "通知邮箱": "通知信箱", "通知配置": "通知設定", + "通过分组可以实现不同用户等级的差异化定价,例如 VIP 用户享受更低的 API 调用费用。": "透過分組可以實現不同使用者等級的差異化定價,例如 VIP 使用者享受更低的 API 呼叫費用。", "通过划转功能将奖励额度转入到您的账户余额中": "透過劃轉功能將獎勵額度轉入到您的帳號餘額中", "通过密码注册时需要进行邮箱验证": "透過密碼註冊時需要進行信箱驗證", + "通过此功能,可以根据用户所在分组,为不同等级的用户展示不同的可选列表。": "透過此功能,可以根據使用者所在分組,為不同等級的使用者展示不同的可選列表。", "通道 ${name} 余额更新成功!": "通道 ${name} 餘額更新成功!", "通道 ${name} 测试成功,模型 ${model} 耗时 ${time.toFixed(2)} 秒。": "通道 ${name} 測試成功,模型 ${model} 耗時 ${time.toFixed(2)} 秒。", "通道 ${name} 测试成功,耗时 ${time.toFixed(2)} 秒。": "通道 ${name} 測試成功,耗時 ${time.toFixed(2)} 秒。", @@ -2518,6 +2907,7 @@ "邮箱地址": "信箱位址", "邮箱域名格式不正确,请输入有效的域名,如 gmail.com": "信箱域名格式不正確,請輸入有效的域名,如 gmail.com", "邮箱域名白名单格式不正确": "信箱域名白名單格式不正確", + "邮箱字段": "信箱字段", "邮箱账户绑定成功!": "信箱帳號綁定成功!", "部分保存失败": "部分儲存失敗", "部分保存失败,请重试": "部分儲存失敗,請重試", @@ -2547,7 +2937,9 @@ "配置 Telegram 登录": "設定 Telegram 登錄", "配置 Turnstile": "設定 Turnstile", "配置 WeChat Server": "設定 WeChat Server", + "配置后的效果:": "配置後的效果:", "配置和消息已全部重置": "設定和消息已全部重置", + "配置套餐的有效时长": "設定訂閱的有效時長", "配置完成后刷新页面即可使用模型部署功能": "設定完成後刷新頁面即可使用模型部署功能", "配置导入成功": "設定導入成功", "配置已导出到下载文件夹": "設定已導出到下載資料夾", @@ -2557,9 +2949,12 @@ "配置有效的 io.net API Key": "設定有效的 io.net API Key", "配置服务器端请求伪造(SSRF)防护,用于保护内网资源安全": "設定伺服器端請求偽造(SSRF)防護,用於保護內網資源安全", "配置模型部署服务提供商的API密钥和启用状态": "設定模型部署服務提供商的API密鑰和啟用狀態", + "配置特殊倍率后:": "配置特殊倍率後:", "配置登录注册": "設定登錄註冊", + "配置自定义 OAuth 提供商,支持 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 协议的身份提供商": "設定自訂 OAuth 提供商,支援 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 協議的身份提供商", "配置说明": "設定說明", "配置邮箱域名白名单": "設定信箱域名白名單", + "配置:": "配置:", "重启部署失败": "重啟部署失敗", "重命名部署": "重命名部署", "重复提交": "重複提交", @@ -2576,14 +2971,15 @@ "重置 2FA": "重置 2FA", "重置 Passkey": "重置 Passkey", "重置为默认": "重置為預設", + "重置周期": "重置週期", + "重置失败": "重置失敗", "重置模型倍率": "重置模型倍率", + "重置统计": "重置統計", "重置选项": "重置選項", "重置邮件发送成功,请检查邮箱!": "重置郵件發送成功,請檢查信箱!", "重置配置": "重置設定", "重要提醒": "重要提醒", "重试": "重試", - "不重试": "不重試", - "失败后是否重试": "失敗後是否重試", "重试连接": "重試連接", "钱包管理": "錢包管理", "链接中的{key}将自动替换为sk-xxxx,{address}将自动替换为系统设置的服务器地址,末尾不带/和/v1": "連結中的{key}將自動替換為sk-xxxx,{address}將自動替換為系統設定的伺服器位址,末尾不帶/和/v1", @@ -2596,6 +2992,7 @@ "键为端点类型,值为路径和方法对象": "鍵為端點類型,值為路徑和方法對象", "键为请求中的模型名称,值为要替换的模型名称": "鍵為請求中的模型名稱,值為要替換的模型名稱", "键名": "鍵名", + "键的前缀 +: 表示添加,-: 表示移除,无前缀表示追加。值为分组描述(移除时填 \"remove\")。": "鍵的前綴 +: 表示新增,-: 表示移除,無前綴表示追加。值為分組描述(移除時填 \"remove\")。", "镜像仓库密码": "鏡像倉庫密碼", "镜像仓库用户名": "鏡像倉庫使用者名", "镜像仓库配置": "鏡像倉庫設定", @@ -2608,15 +3005,16 @@ "降级": "降級", "限制周期": "限制週期", "限制周期统一使用上方配置的“限制周期”值。": "限制週期統一使用上方設定的「限制週期」值。", + "限购": "限購", + "随机": "隨機", + "随机模式": "隨機模式", + "随机种子 (留空为随机)": "隨機種子 (留空為隨機)", "隐私政策": "隱私政策", "隐私政策已更新": "隱私政策已更新", "隐私政策更新失败": "隱私政策更新失敗", "隐私设置": "隱私設定", "隐藏操作项": "隱藏操作項", "隐藏调试": "隱藏除錯", - "随机": "隨機", - "随机模式": "隨機模式", - "随机种子 (留空为随机)": "隨機種子 (留空為隨機)", "零一万物": "零一萬物", "需要安全验证": "需要安全驗證", "需要添加的额度(支持负数)": "需要添加的額度(支援負數)", @@ -2625,13 +3023,22 @@ "需要重新完整设置才能再次启用": "需要重新完整設定才能再次啟用", "非必要,不建议启用模型限制": "非必要,不建議啟用模型限制", "非流": "非流", + "音乐预览": "音樂預覽", + "音频倍率 {{audioRatio}}": "音訊倍率 {{audioRatio}}", "音频倍率(仅部分模型支持该计费)": "音訊倍率(僅部分模型支援該計費)", "音频提示 {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音频补全 {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}": "音訊提示 {{input}} tokens / 1M tokens * {{symbol}}{{audioInputPrice}} + 音訊補全 {{completion}} tokens / 1M tokens * {{symbol}}{{audioCompPrice}} = {{symbol}}{{total}}", "音频提示价格:{{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens (音频倍率: {{audioRatio}})": "音訊提示價格:{{symbol}}{{price}} * {{audioRatio}} = {{symbol}}{{total}} / 1M tokens (音訊倍率: {{audioRatio}})", + "音频无法播放": "音訊無法播放", + "音频补全价格": "音訊補全價格", "音频补全价格:{{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens (音频补全倍率: {{audioCompRatio}})": "音訊補全價格:{{symbol}}{{price}} * {{audioRatio}} * {{audioCompRatio}} = {{symbol}}{{total}} / 1M tokens (音訊補全倍率: {{audioCompRatio}})", + "音频补全价格:{{symbol}}{{price}} / 1M tokens": "音訊補全價格:{{symbol}}{{price}} / 1M tokens", "音频补全倍率(仅部分模型支持该计费)": "音訊補全倍率(僅部分模型支援該計費)", + "音频输入价格": "音訊輸入價格", + "音频输入价格:{{symbol}}{{price}} / 1M tokens": "音訊輸入價格:{{symbol}}{{price}} / 1M tokens", "音频输入相关的倍率设置,键为模型名称,值为倍率": "音訊輸入相關的倍率設定,鍵為模型名稱,值為倍率", + "音频输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "音訊輸入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音訊倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "音频输出补全相关的倍率设置,键为模型名称,值为倍率": "音訊輸出補全相關的倍率設定,鍵為模型名稱,值為倍率", + "音频输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * 音频补全倍率 {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "音訊輸出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音訊倍率 {{audioRatio}} * 音訊補全倍率 {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "页脚": "頁腳", "页面未找到,请检查您的浏览器地址是否正确": "頁面未找到,請檢查您的瀏覽器位址是否正確", "顶栏管理": "頂欄管理", @@ -2642,18 +3049,24 @@ "预估费用仅供参考,实际费用可能略有差异": "預估費用僅供參考,實際費用可能略有差異", "预填组管理": "預填組管理", "预览失败": "預覽失敗", + "预览效果": "預覽效果", "预览更新": "預覽更新", "预览请求体": "預覽請求體", - "预计结束": "預計結束", "预警阈值必须为正数": "預警閾值必須為正數", + "预计结束": "預計結束", "频率惩罚,减少重复词汇的出现": "頻率懲罰,減少重複詞彙的出現", "频率限制的周期(分钟)": "頻率限制的週期(分鐘)", "颜色": "顏色", + "额外价格项": "額外價格項", + "额外设置": "額外設定", "额度": "額度", + "额度充值": "額度儲值", + "额度展示类型": "額度展示類型", "额度必须大于0": "額度必須大於0", "额度提醒阈值": "額度提醒閾值", "额度查询接口返回令牌额度而非用户额度": "額度查詢接口返回令牌額度而非使用者額度", "额度设置": "額度設定", + "额度重置": "額度重置", "额度预警阈值": "額度預警閾值", "首尾生视频": "首尾生影片", "首页": "首頁", @@ -2668,335 +3081,36 @@ "验证设置": "驗證設定", "验证身份": "驗證身份", "验证配置错误": "驗證設定錯誤", + "高危操作确认": "高風險操作確認", + "高危状态码重试风险告知与免责声明Markdown": "### ⚠️ 高風險操作:504/524 狀態碼重試風險告知與免責聲明\n\n【背景提示】\n本專案預設對 `400`(請求錯誤)、`504`(閘道逾時)與 `524`(發生逾時)狀態碼不進行重試。504 與 524 錯誤通常代表**請求已成功送達上游 AI 服務,且上游正在處理,但因處理時間過長導致連線中斷**。\n\n開啟此類逾時狀態碼的重定向/重試屬於**極高風險操作**。作為本開源專案使用者,在開啟該功能前,您必須仔細閱讀並知悉以下嚴重後果:\n\n#### 一、 核心風險告知(請仔細閱讀)\n1. 💸 雙重/多重計費風險:多數 AI 上游廠商對於已開始處理但因網路原因中斷(504/524)的請求**仍然會扣費**。此時若觸發重試,將會向上游發起全新請求,導致您被**雙重甚至多重計費**。\n2. ⏳ 用戶端嚴重逾時:單次請求已觸發逾時,疊加重試機制會使總請求耗時成倍增加,導致最終用戶端(或呼叫方)出現嚴重甚至無法接受的逾時現象。\n3. 💥 請求積壓與系統崩潰風險:強制重試逾時請求會長時間占用系統執行緒與連線數。在高併發場景下,這將導致嚴重**請求積壓**,進而耗盡系統資源,引發雪崩效應,造成整個代理服務崩潰。\n\n#### 二、 風險確認聲明\n若您堅持開啟該功能,即代表您作出以下確認:", + "高危状态码重试风险确认输入文本": "我已了解多重計費與崩潰風險,確認開啟", + "高危状态码重试风险确认项1": "我已充分閱讀並理解:本人已完整閱讀上述全部風險提示,完全理解強制重試 504 與 524 狀態碼可能帶來的破壞性後果。", + "高危状态码重试风险确认项2": "我已與上游溝通並確認:本人確認,當前逾時問題屬於上游服務瓶頸。本人已與上游供應商溝通,確認上游無法解決該逾時問題,因此才採取強制重試方案作為妥協手段。", + "高危状态码重试风险确认项3": "我自願承擔計費損失:本人知悉並接受由此產生的全部雙重/多重計費風險,承諾不會因重試導致的帳單異常在本專案倉庫提交 Issue 或抱怨。", + "高危状态码重试风险确认项4": "我自願承擔系統穩定性風險:本人知悉該操作可能導致用戶端嚴重逾時及服務崩潰。若因本人開啟此功能導致請求積壓或服務不可用,後果由本人自行承擔。", + "高危状态码重试风险输入不匹配提示": "輸入內容與要求不一致", + "高危状态码重试风险输入框占位文案": "請完整輸入上方文字", + "高级套餐,半价优惠": "高級套餐,半價優惠", "高级设置": "進階設定", "高级配置": "進階設定", - "核心配置": "核心設定", - "创建渠道所需的基本信息": "建立頻道所需的基本資訊", - "请求配置": "請求設定", - "渠道行为": "頻道行為", - "额外设置": "額外設定", - "上游模型管理": "上游模型管理", "黑名单": "黑名單", "默认": "預設", "默认 API 版本": "預設 API 版本", "默认 Responses API 版本,为空则使用上方版本": "預設 Responses API 版本,為空則使用上方版本", + "默认为 5m 缓存创建倍率;1h 缓存创建倍率按固定乘法自动计算(当前为 1.6x)": "預設為 5m 快取建立倍率;1h 快取建立倍率按固定乘法自動計算(當前為 1.6x)", + "默认使用auto分组": "預設使用 auto 分組", "默认使用系统名称": "預設使用系統名稱", "默认助手消息": "你好!有什麼我可以幫助你的嗎?", "默认区域": "預設區域", "默认区域,如: us-central1": "預設區域,如: us-central1", + "默认情况下,所有用户创建令牌时看到的可选分组列表是一样的(即「用户可选」列勾选的分组)。": "預設情況下,所有使用者建立令牌時看到的可選分組列表是一樣的(即「使用者可選」列勾選的分組)。", "默认折叠侧边栏": "預設摺疊側邊欄", "默认测试模型": "預設測試模型", "默认用户消息": "你好", "默认补全倍率": "預設補全倍率", - "每日签到": "每日簽到", - "今日已签到,累计签到": "今日已簽到,累計簽到", - "每日签到可获得随机额度奖励": "每日簽到可獲得隨機額度獎勵", - "今日已签到": "今日已簽到", - "立即签到": "立即簽到", - "正在加载签到状态...": "正在載入簽到狀態...", - "获取签到状态失败": "獲取簽到狀態失敗", - "签到成功!获得": "簽到成功!獲得", - "签到失败": "簽到失敗", - "获得": "獲得", - "累计签到": "累計簽到", - "本月获得": "本月獲得", - "累计获得": "累計獲得", - "签到奖励将直接添加到您的账户余额": "簽到獎勵將直接添加到您的帳號餘額", - "每日仅可签到一次,请勿重复签到": "每日僅可簽到一次,請勿重複簽到", - "签到设置": "簽到設定", - "签到功能允许用户每日签到获取随机额度奖励": "簽到功能允許使用者每日簽到獲取隨機額度獎勵", - "启用签到功能": "啟用簽到功能", - "签到最小额度": "簽到最小額度", - "签到奖励的最小额度": "簽到獎勵的最小額度", - "签到最大额度": "簽到最大額度", - "签到奖励的最大额度": "簽到獎勵的最大額度", - "保存签到设置": "儲存簽到設定", - "ChatCompletions→Responses 兼容配置(Beta)": "ChatCompletions→Responses 兼容設定(Beta)", - "提示:该功能为测试版,未来配置结构与功能行为可能发生变更,请勿在生产环境使用。": "提示:該功能為測試版,未來設定結構與功能行為可能發生變更,請勿在生產環境使用。", - "填充模板(指定渠道)": "填充模板(指定管道)", - "填充模板(全渠道)": "填充模板(全管道)", - "格式化 JSON": "格式化 JSON", - "提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。": "提示:此處設定僅用於控制「模型廣場」對使用者的展示效果,不會影響模型的實際調用與路由。若需設定真實調用行為,請前往「管道管理」進行設定。", - "确认关闭提示": "確認關閉提示", - "关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?": "關閉後將不再顯示此提示(僅對當前瀏覽器生效)。確定要關閉嗎?", - "关闭提示": "關閉提示", - "说明:本页测试为非流式请求;若渠道仅支持流式返回,可能出现测试失败,请以实际使用为准。": "說明:本頁測試為非流式請求;若管道僅支援流式返回,可能出現測試失敗,請以實際使用為準。", - "Stripe/Creem 需在第三方平台创建商品并填入 ID": "Stripe/Creem 需在第三方平臺建立商品並填入 ID", - "暂无订阅套餐": "暫無訂閱", - "订阅管理": "訂閱管理", - "订阅套餐管理": "訂閱管理", - "新建套餐": "新建訂閱", - "套餐": "訂閱", - "支付渠道": "支付管道", - "购买上限": "購買上限", - "有效期": "有效期", - "禁用后用户端不再展示,但历史订单不受影响。是否继续?": "禁用後使用者端不再展示,但歷史訂單不受影響。是否繼續?", - "启用后套餐将在用户端展示。是否继续?": "啟用後訂閱將在使用者端展示。是否繼續?", - "更新套餐信息": "更新訂閱資訊", - "创建新的订阅套餐": "建立新的訂閱", - "套餐的基本信息和定价": "訂閱的基本資訊和定價", - "套餐标题": "訂閱標題", - "请输入套餐标题": "請輸入訂閱標題", - "套餐副标题": "訂閱副標題", - "例如:适合轻度使用": "例如:適合輕度使用", - "请输入金额": "請輸入金額", - "请输入总额度": "請輸入總額度", - "0 表示不限": "0 表示不限", - "原生额度": "原生額度", - "升级分组": "升級分組", - "不升级": "不升級", - "购买或手动新增订阅会升级到该分组;当套餐失效/过期或手动作废/删除后,将回退到升级前分组。回退不会立即生效,通常会有几分钟延迟。": "購買或手動新增訂閱會升級到該分組;當訂閱失效/過期或手動作廢/刪除後,將回退到升級前分組。回退不會立即生效,通常會有幾分鐘延遲。", - "币种": "幣種", - "由全站货币展示设置统一控制": "由全站貨幣展示設定統一控制", - "排序": "排序", - "启用状态": "啟用狀態", - "有效期设置": "有效期設定", - "配置套餐的有效时长": "設定訂閱的有效時長", - "有效期单位": "有效期單位", - "自定义秒数": "自訂秒數", - "请输入秒数": "請輸入秒數", - "有效期数值": "有效期數值", - "额度重置": "額度重置", - "支持周期性重置套餐权益额度": "支援週期性重置訂閱權益額度", - "重置周期": "重置週期", - "第三方支付配置": "第三方支付設定", - "Stripe/Creem 商品ID(可选)": "Stripe/Creem 商品ID(可選)", - "生效": "生效", - "已作废": "已作廢", - "用户订阅管理": "使用者訂閱管理", - "选择订阅套餐": "選擇訂閱", - "新增订阅": "新增訂閱", - "暂无订阅记录": "暫無訂閱記錄", - "来源": "來源", - "开始": "開始", - "结束": "結束", - "作废": "作廢", - "确认作废": "確認作廢", - "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "作廢後該訂閱將立即失效,歷史記錄不受影響。是否繼續?", - "删除会彻底移除该订阅记录(含权益明细)。是否继续?": "刪除會徹底移除該訂閱記錄(含權益明細)。是否繼續?", - "绑定订阅套餐": "綁定訂閱", - "绑定后会立即生成用户订阅(无需支付),有效期按套餐配置计算。": "綁定後會立即生成使用者訂閱(無需支付),有效期按訂閱設定計算。", - "订阅套餐": "訂閱", - "额度充值": "額度儲值", - "优先订阅": "優先訂閱", - "优先钱包": "優先錢包", - "仅用订阅": "僅用訂閱", - "仅用钱包": "僅用錢包", - "我的订阅": "我的訂閱", - "个生效中": "個生效中", - "无生效": "無生效", - "已保存偏好为": "已儲存偏好為", + "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(當前僅支援易支付接口,預設使用上方伺服器位址作為回調位址!)", ",当前无生效订阅,将自动使用钱包": ",當前無生效訂閱,將自動使用錢包", - "个已过期": "個已過期", - "订阅": "訂閱", - "至": "至", - "过期于": "過期於", - "作废于": "作廢於", - "购买套餐后即可享受模型权益": "購買訂閱後即可享受模型權益", - "限购": "限購", - "推荐": "推薦", - "已达到购买上限": "已達到購買上限", - "已达上限": "已達上限", - "立即订阅": "立即訂閱", - "暂无可购买套餐": "暫無可購買訂閱", - "该套餐未配置 Stripe": "該訂閱未設定 Stripe", - "已打开支付页面": "已打開支付頁面", - "支付失败": "支付失敗", - "该套餐未配置 Creem": "該訂閱未設定 Creem", - "已发起支付": "已發起支付", - "购买订阅套餐": "購買訂閱", - "套餐名称": "訂閱名稱", - "应付金额": "應付金額", - "支付": "支付", - "管理员未开启在线支付功能,请联系管理员配置。": "管理員未開啟在線支付功能,請聯繫管理員設定。", - "偏好设置": "偏好設定", - "界面语言和其他个人偏好": "界面語言和其他個人偏好", - "语言偏好": "語言偏好", - "选择您的首选界面语言,设置将自动保存并同步到所有设备": "選擇您的首選界面語言,設定將自動儲存並同步到所有設備", - "语言偏好已保存": "語言偏好已儲存", - "提示:语言偏好会同步到您登录的所有设备,并影响API返回的错误消息语言。": "提示:語言偏好會同步到您登錄的所有設備,並影響API返回的錯誤消息語言。", - "自定义 OAuth 提供商": "自訂 OAuth 提供商", - "配置自定义 OAuth 提供商,支持 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 协议的身份提供商": "設定自訂 OAuth 提供商,支援 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 協議的身份提供商", - "回调 URL 格式": "回調 URL 格式", - "添加提供商": "添加提供商", - "编辑提供商": "編輯提供商", - "选择预设...": "選擇設定檔...", - "输入基础 URL": "輸入基礎 URL", - "例如": "例如", - "提供商名称": "提供商名稱", - "标识符 (Slug)": "標識符 (Slug)", - "授权端点": "授權端點", - "令牌端点": "令牌端點", - "用户信息端点": "使用者資訊端點", - "用户 ID 字段": "使用者 ID 字段", - "支持 JSONPath,如 sub, id, data.user.id": "支援 JSONPath,如 sub, id, data.user.id", - "用户名字段": "使用者名字段", - "支持 JSONPath,如 preferred_username, login, data.user.username": "支援 JSONPath,如 preferred_username, login, data.user.username", - "显示名称字段": "顯示名稱字段", - "支持 JSONPath,如 name, display_name, data.user.name": "支援 JSONPath,如 name, display_name, data.user.name", - "邮箱字段": "信箱字段", - "支持 JSONPath,如 email, data.user.email": "支援 JSONPath,如 email, data.user.email", - "授权范围 (Scopes)": "授權範圍 (Scopes)", - "认证方式": "認證方式", - "参数传递": "參數傳遞", - "Basic Auth 头": "Basic Auth 頭", - "暂无自定义 OAuth 提供商": "暫無自訂 OAuth 提供商", - "确定要删除该提供商吗?": "確定要刪除該提供商嗎?", - "确定要解绑 {{name}} 吗?": "確定要解綁 {{name}} 嗎?", - "解绑成功": "解綁成功", - "{{name}} ID": "{{name}} ID", - "使用 {{name}} 继续": "使用 {{name}} 繼續", - "端点 URL 必须以 http:// 或 https:// 开头:": "端點 URL 必須以 http:// 或 https:// 開頭:", - "OAuth 配置错误:授权端点必须是完整的 URL(以 http:// 或 https:// 开头)": "OAuth 設定錯誤:授權端點必須是完整的 URL(以 http:// 或 https:// 開頭)", - "OAuth 登录失败:": "OAuth 登錄失敗:", - "必填:请输入服务器地址以自动生成完整端点 URL": "必填:請輸入伺服器位址以自動生成完整端點 URL", - "填写服务器地址后自动生成:": "填寫伺服器位址後自動生成:", - "自动生成:": "自動生成:", - "请先填写服务器地址,以自动生成完整的端点 URL": "請先填寫伺服器位址,以自動生成完整的端點 URL", - "端点 URL 必须是完整地址(以 http:// 或 https:// 开头)": "端點 URL 必須是完整位址(以 http:// 或 https:// 開頭)", - "未匹配到模型,按回车键可将「{{name}}」作为自定义模型名添加": "未匹配到模型,按下 Enter 鍵可將「{{name}}」作為自訂模型名稱新增", - "分组相关设置": "分組相關設定", - "保存分组相关设置": "保存分組相關設定", - "此页面仅显示未设置价格或基础倍率的模型,设置后会自动从列表中移出": "此頁面僅顯示未設定價格或基礎倍率的模型,設定後會自動從列表中移出", - "没有未设置定价的模型": "沒有未設定定價的模型", - "当前没有未设置定价的模型": "目前沒有未設定定價的模型", - "模型计费编辑器": "模型計費編輯器", - "价格摘要": "價格摘要", - "当前提示": "目前提示", - "这个界面默认按价格填写,保存时会自动换算回后端需要的倍率 JSON。": "這個介面預設按價格填寫,儲存時會自動換算回後端需要的倍率 JSON。", - "当前未启用,需要时再打开即可。": "目前未啟用,需要時再開啟即可。", - "下面展示这个模型保存后会写入哪些后端字段,便于和原始 JSON 编辑框保持一致。": "下方會顯示此模型儲存後將寫入哪些後端欄位,方便與原始 JSON 編輯框保持一致。", - "补全价格已锁定": "補全價格已鎖定", - "后端固定倍率:{{ratio}}。该字段仅展示换算后的价格。": "後端固定倍率:{{ratio}}。此欄位僅展示換算後的價格。", - "这些价格都是可选项,不填也可以。": "這些價格都是可選項,不填也可以。", - "请先开启并填写音频输入价格。": "請先開啟並填寫音訊輸入價格。", - "输入模型名称,例如 gpt-4.1": "輸入模型名稱,例如 gpt-4.1", - "当前模型同时存在按次价格和倍率配置,保存时会按当前计费方式覆盖。": "目前模型同時存在按次價格與倍率配置,儲存時會依目前計費方式覆蓋。", - "当前模型存在未显式设置输入倍率的扩展倍率;填写输入价格后会自动换算为价格字段。": "目前模型存在未明確設定輸入倍率的擴展倍率;填寫輸入價格後會自動換算為價格欄位。", - "按量计费下需要先填写输入价格,才能保存其它价格项。": "按量計費下需要先填寫輸入價格,才能儲存其它價格項。", - "填写音频补全价格前,需要先填写音频输入价格。": "填寫音訊補全價格前,需要先填寫音訊輸入價格。", - "模型 {{name}} 缺少输入价格,无法计算补全/缓存/图片/音频价格对应的倍率": "模型 {{name}} 缺少輸入價格,無法計算補全、快取、圖片與音訊價格對應的倍率", - "模型 {{name}} 缺少音频输入价格,无法计算音频补全倍率": "模型 {{name}} 缺少音訊輸入價格,無法計算音訊補全倍率", - "批量应用当前模型价格": "批量套用目前模型價格", - "请先选择一个作为模板的模型": "請先選擇一個作為範本的模型", - "请先勾选需要批量设置的模型": "請先勾選需要批量設定的模型", - "已将模型 {{name}} 的价格配置批量应用到 {{count}} 个模型": "已將模型 {{name}} 的價格配置批量套用到 {{count}} 個模型", - "将把当前编辑中的模型 {{name}} 的价格配置,批量应用到已勾选的 {{count}} 个模型。": "會把目前編輯中的模型 {{name}} 的價格配置,批量套用到已勾選的 {{count}} 個模型。", - "适合同系列模型一起定价,例如把 gpt-5.1 的价格批量同步到 gpt-5.1-high、gpt-5.1-low 等模型。": "適合同系列模型一起定價,例如把 gpt-5.1 的價格批量同步到 gpt-5.1-high、gpt-5.1-low 等模型。", - "已勾选": "已勾選", - "当前编辑": "目前編輯", - "已勾选 {{count}} 个模型": "已勾選 {{count}} 個模型", - "基础价格": "基礎價格", - "扩展价格": "擴展價格", - "额外价格项": "額外價格項", - "补全价格": "補全價格", - "缓存读取价格": "快取讀取價格", - "缓存创建价格": "快取建立價格", - "图片输入价格": "圖片輸入價格", - "音频输入价格": "音訊輸入價格", - "音频补全价格": "音訊補全價格", - "适合 MJ / 任务类等按次收费模型。": "適合 MJ / 任務類等按次收費模型。", - "该模型补全倍率由后端固定为 {{ratio}}。补全价格不能在这里修改。": "該模型補全倍率由後端固定為 {{ratio}}。補全價格不能在這裡修改。", - "计费显示模式": "計費顯示模式", - "价格模式(默认)": "價格模式(預設)", - "模型价格 {{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", - "缓存创建价格:{{symbol}}{{price}} / 1M tokens": "快取建立價格:{{symbol}}{{price}} / 1M tokens", - "缓存创建价格 {{symbol}}{{price}} / 1M tokens": "快取建立價格 {{symbol}}{{price}} / 1M tokens", - "5m缓存创建价格:{{symbol}}{{price}} / 1M tokens": "5m快取建立價格:{{symbol}}{{price}} / 1M tokens", - "5m缓存创建价格 {{symbol}}{{price}} / 1M tokens": "5m快取建立價格 {{symbol}}{{price}} / 1M tokens", - "1h缓存创建价格:{{symbol}}{{price}} / 1M tokens": "1h快取建立價格:{{symbol}}{{price}} / 1M tokens", - "1h缓存创建价格 {{symbol}}{{price}} / 1M tokens": "1h快取建立價格 {{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}} 次", - "文件搜索调用 {{fileSearchCallCount}} 次": "檔案搜尋呼叫 {{fileSearchCallCount}} 次", - "图片倍率 {{imageRatio}}": "圖片倍率 {{imageRatio}}", - "音频倍率 {{audioRatio}}": "音訊倍率 {{audioRatio}}", - "普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "普通輸入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "缓存输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "快取輸入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 快取倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 图片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "圖片輸入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 圖片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "音訊輸入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音訊倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "輸出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 補全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "Web 搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Web 搜尋:{{count}} / 1K * 單價 {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "文件搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "檔案搜尋:{{count}} / 1K * 單價 {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片生成:1 次 * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "圖片生成:1 次 * 單價 {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "合计:{{total}}": "合計:{{total}}", - "模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},音频倍率 {{audioRatio}},音频补全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}": "模型倍率 {{modelRatio}},補全倍率 {{completionRatio}},音訊倍率 {{audioRatio}},音訊補全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}", - "文字输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "文字輸出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 補全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输出:{{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}}", - "缓存读取:{{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}}", - "空": "空", - "提示:端点映射仅用于模型广场展示,不会影响模型真实调用。如需配置真实调用,请前往「渠道管理」。": "提示:端點映射僅用於模型廣場展示,不會影響模型真實呼叫。如需配置真實呼叫,請前往「管道管理」。", - "购买订阅获得模型额度/次数": "購買訂閱取得模型額度/次數", - "生产环境 RSA 私钥 Base64 (PKCS#8 DER)": "正式環境 RSA 私鑰 Base64 (PKCS#8 DER)", - "沙盒环境 RSA 私钥 Base64 (PKCS#8 DER)": "沙盒環境 RSA 私鑰 Base64 (PKCS#8 DER)", - "生产环境 Waffo 公钥 Base64 (X.509 DER)": "正式環境 Waffo 公鑰 Base64 (X.509 DER)", - "沙盒环境 Waffo 公钥 Base64 (X.509 DER)": "沙盒環境 Waffo 公鑰 Base64 (X.509 DER)", - "支付方式类型": "付款方式類型", - "支付方式名称": "付款方式名稱", - "获取充值配置失败": "取得儲值設定失敗", - "获取充值配置异常": "儲值設定異常", - "{{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", - "复制密钥": "複製金鑰", - "复制连接信息": "複製連線資訊", - "检测到剪贴板中的连接信息": "偵測到剪貼簿中的連線資訊", - "自动填入": "自動填入", - "忽略": "忽略", - "从剪贴板粘贴配置": "從剪貼簿貼上設定", - "剪贴板中未检测到连接信息": "剪貼簿中未偵測到連線資訊", - "连接信息已填入": "連線資訊已填入", - "无法读取剪贴板": "無法讀取剪貼簿" + ",时间:": ",時間:", + ",点击更新": ",點擊更新" } } diff --git a/web/src/pages/Setting/Ratio/GroupRatioSettings.jsx b/web/src/pages/Setting/Ratio/GroupRatioSettings.jsx index bcfb1021..957cbec5 100644 --- a/web/src/pages/Setting/Ratio/GroupRatioSettings.jsx +++ b/web/src/pages/Setting/Ratio/GroupRatioSettings.jsx @@ -17,8 +17,23 @@ along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ -import React, { useEffect, useState, useRef } from 'react'; -import { Button, Col, Form, Row, Spin } from '@douyinfe/semi-ui'; +import React, { useEffect, useState, useRef, useCallback, useMemo } from 'react'; +import { + Button, + Col, + Collapsible, + Form, + Radio, + RadioGroup, + Row, + SideSheet, + Spin, + Switch, + Tabs, + Typography, +} from '@douyinfe/semi-ui'; +import { IconChevronDown, IconChevronUp } from '@douyinfe/semi-icons'; +import { IconHelpCircle } from '@douyinfe/semi-icons'; import { compareObjects, API, @@ -28,10 +43,37 @@ import { verifyJSON, } from '../../../helpers'; import { useTranslation } from 'react-i18next'; +import GroupTable from './components/GroupTable'; +import AutoGroupList from './components/AutoGroupList'; +import GroupGroupRatioRules from './components/GroupGroupRatioRules'; +import GroupSpecialUsableRules from './components/GroupSpecialUsableRules'; + +const { Text, Title, Paragraph } = Typography; + +const OPTION_KEYS = [ + 'GroupRatio', + 'UserUsableGroups', + 'GroupGroupRatio', + 'group_ratio_setting.group_special_usable_group', + 'AutoGroups', + 'DefaultUseAutoGroup', +]; + +function parseJSONSafe(str, fallback) { + if (!str || !str.trim()) return fallback; + try { + return JSON.parse(str); + } catch { + return fallback; + } +} export default function GroupRatioSettings(props) { const { t } = useTranslation(); const [loading, setLoading] = useState(false); + const [editMode, setEditMode] = useState('visual'); + const [showGuide, setShowGuide] = useState(false); + const [inputs, setInputs] = useState({ GroupRatio: '', UserUsableGroups: '', @@ -42,80 +84,189 @@ export default function GroupRatioSettings(props) { }); const refForm = useRef(); const [inputsRow, setInputsRow] = useState(inputs); + const dataVersionRef = useRef(0); + + const groupNames = useMemo(() => { + const ratioMap = parseJSONSafe(inputs.GroupRatio, {}); + return Object.keys(ratioMap); + }, [inputs.GroupRatio]); async function onSubmit() { + if (editMode === 'manual') { + try { + await refForm.current.validate(); + } catch { + showError(t('请检查输入')); + return; + } + } + + const updateArray = compareObjects(inputs, inputsRow); + if (!updateArray.length) { + return showWarning(t('你似乎并没有修改什么')); + } + + const requestQueue = updateArray.map((item) => { + const value = + typeof inputs[item.key] === 'boolean' + ? String(inputs[item.key]) + : inputs[item.key]; + return API.put('/api/option/', { key: item.key, value }); + }); + + setLoading(true); try { - await refForm.current - .validate() - .then(() => { - const updateArray = compareObjects(inputs, inputsRow); - if (!updateArray.length) - return showWarning(t('你似乎并没有修改什么')); - - const requestQueue = updateArray.map((item) => { - const value = - typeof inputs[item.key] === 'boolean' - ? String(inputs[item.key]) - : inputs[item.key]; - return API.put('/api/option/', { key: item.key, value }); - }); - - setLoading(true); - Promise.all(requestQueue) - .then((res) => { - if (res.includes(undefined)) { - return showError( - requestQueue.length > 1 - ? t('部分保存失败,请重试') - : t('保存失败'), - ); - } - - for (let i = 0; i < res.length; i++) { - if (!res[i].data.success) { - return showError(res[i].data.message); - } - } - - showSuccess(t('保存成功')); - props.refresh(); - }) - .catch((error) => { - console.error('Unexpected error:', error); - showError(t('保存失败,请重试')); - }) - .finally(() => { - setLoading(false); - }); - }) - .catch(() => { - showError(t('请检查输入')); - }); + const res = await Promise.all(requestQueue); + if (res.includes(undefined)) { + return showError( + requestQueue.length > 1 + ? t('部分保存失败,请重试') + : t('保存失败'), + ); + } + for (let i = 0; i < res.length; i++) { + if (!res[i].data.success) { + return showError(res[i].data.message); + } + } + showSuccess(t('保存成功')); + props.refresh(); } catch (error) { - showError(t('请检查输入')); - console.error(error); + console.error('Unexpected error:', error); + showError(t('保存失败,请重试')); + } finally { + setLoading(false); } } useEffect(() => { const currentInputs = {}; for (let key in props.options) { - if (Object.keys(inputs).includes(key)) { + if (OPTION_KEYS.includes(key)) { currentInputs[key] = props.options[key]; } } setInputs(currentInputs); setInputsRow(structuredClone(currentInputs)); - refForm.current.setValues(currentInputs); + dataVersionRef.current += 1; + if (refForm.current) { + refForm.current.setValues(currentInputs); + } }, [props.options]); - return ( - -
(refForm.current = formAPI)} - style={{ marginBottom: 15 }} - > + const handleGroupTableChange = useCallback( + ({ GroupRatio, UserUsableGroups }) => { + setInputs((prev) => ({ ...prev, GroupRatio, UserUsableGroups })); + }, + [], + ); + + const handleAutoGroupsChange = useCallback((value) => { + setInputs((prev) => ({ ...prev, AutoGroups: value })); + }, []); + + const handleGroupGroupRatioChange = useCallback((value) => { + setInputs((prev) => ({ ...prev, GroupGroupRatio: value })); + }, []); + + const handleSpecialUsableChange = useCallback((value) => { + setInputs((prev) => ({ + ...prev, + 'group_ratio_setting.group_special_usable_group': value, + })); + }, []); + + const dv = dataVersionRef.current; + + const renderVisualMode = () => ( + + + + {t('倍率用于计费乘数,勾选「用户可选」后用户可在创建令牌时选择该分组')} + + + + + + + {t('令牌分组设为 auto 时,按以下顺序依次尝试选择可用分组,排在前面的优先级更高')} + + + + +
+ + setInputs((prev) => ({ + ...prev, + DefaultUseAutoGroup: value, + })) + } + /> +
+ + {t('开启后创建令牌默认选择auto分组,初始令牌也将设为auto')} + +
+ +
+ +
+ + + + {t('当某个分组的用户使用另一个分组的令牌时,可设置特殊倍率覆盖基础倍率。例如:vip 分组的用户使用 default 分组时倍率为 0.5')} + + + + + + + {t('为特定用户分组配置可用分组的增减规则。「添加」为该分组新增可用分组,「移除」移除默认可用分组,「追加」直接追加分组')} + + + +
+ ); + + useEffect(() => { + if (editMode === 'manual' && refForm.current) { + refForm.current.setValues(inputs); + } + }, [editMode]); + + const renderManualMode = () => ( +
(refForm.current = formAPI)} + style={{ marginBottom: 15 }} + > + setInputs({ ...inputs, GroupRatio: value })} + onChange={(value) => + setInputs((prev) => ({ ...prev, GroupRatio: value })) + } /> @@ -142,7 +295,9 @@ export default function GroupRatioSettings(props) { - setInputs({ ...inputs, UserUsableGroups: value }) + setInputs((prev) => ({ ...prev, UserUsableGroups: value })) } /> @@ -181,7 +336,7 @@ export default function GroupRatioSettings(props) { }, ]} onChange={(value) => - setInputs({ ...inputs, GroupGroupRatio: value }) + setInputs((prev) => ({ ...prev, GroupGroupRatio: value })) } /> @@ -205,10 +360,10 @@ export default function GroupRatioSettings(props) { }, ]} onChange={(value) => - setInputs({ - ...inputs, + setInputs((prev) => ({ + ...prev, 'group_ratio_setting.group_special_usable_group': value, - }) + })) } /> @@ -225,29 +380,23 @@ export default function GroupRatioSettings(props) { rules={[ { validator: (rule, value) => { - if (!value || value.trim() === '') { - return true; // Allow empty values - } - - // First check if it's valid JSON + if (!value || value.trim() === '') return true; try { const parsed = JSON.parse(value); - - // Check if it's an array - if (!Array.isArray(parsed)) { - return false; - } - - // Check if every element is a string + if (!Array.isArray(parsed)) return false; return parsed.every((item) => typeof item === 'string'); - } catch (error) { + } catch { return false; } }, - message: t('必须是有效的 JSON 字符串数组,例如:["g1","g2"]'), + message: t( + '必须是有效的 JSON 字符串数组,例如:["g1","g2"]', + ), }, ]} - onChange={(value) => setInputs({ ...inputs, AutoGroups: value })} + onChange={(value) => + setInputs((prev) => ({ ...prev, AutoGroups: value })) + } /> @@ -259,13 +408,351 @@ export default function GroupRatioSettings(props) { )} field={'DefaultUseAutoGroup'} onChange={(value) => - setInputs({ ...inputs, DefaultUseAutoGroup: value }) + setInputs((prev) => ({ + ...prev, + DefaultUseAutoGroup: value, + })) } /> - - +
+ + ); + + const GuideSection = ({ title, children }) => { + const [open, setOpen] = useState(false); + return ( +
+ + +
+ {children} +
+
+
+ ); + }; + + const CodeBlock = ({ children }) => ( +
+      {children}
+    
+ ); + + const renderGuide = () => ( + setShowGuide(false)} + width={560} + bodyStyle={{ overflow: 'auto', padding: '0 24px 24px' }} + > + + +
+ {t('什么是分组?')} + + {t( + '分组是用于控制计费倍率和模型访问权限的核心概念。每个用户属于一个分组,每个令牌也可以指定使用某个分组。', + )} + + + {t( + '通过分组可以实现不同用户等级的差异化定价,例如 VIP 用户享受更低的 API 调用费用。', + )} + + + + + {t('用户分组')}{' — '} + {t('由管理员分配,决定用户身份等级(如 default、vip)。')} + + + {t('令牌分组')}{' — '} + {t('用户创建令牌时选择的分组,决定该令牌的实际计费倍率。一个用户可以创建多个令牌,使用不同分组。')} + + + {t('倍率')}{' — '} + {t('计费乘数,倍率越低费用越低。例如倍率 0.5 表示半价。')} + + + {t('用户可选')}{' — '} + {t('勾选后,该分组会出现在用户创建令牌时的下拉菜单中。未勾选的分组只能由管理员分配,用户自己无法选择。')} + + + {t('自动分组')}{' — '} + {t('令牌分组设为 auto 时,系统按优先级顺序自动选择一个可用分组。')} + + +
+
+ + +
+ {t('创建和管理分组')} + + {t('每个分组代表一个价格档位。管理员创建分组后,可以选择哪些档位对用户开放自选。')} + + + + + {t('场景:站点提供两个价格档位,用户可以按需选择')} + + + {`${t('分组名')} ${t('倍率')} ${t('用户可选')} ${t('说明')}\n──────────────────────────────────────\nstandard 1.0 ${t('是')} ${t('标准价格')}\npremium 0.5 ${t('是')} ${t('高级套餐,半价优惠')}`} + + + {t('两个分组都勾选了「用户可选」,所以用户创建令牌时可以看到这两个选项:')} + + + {t('用户创建令牌 → 选择分组下拉框:')}{'\n'} + {` ├─ standard (${t('标准价格')})`}{'\n'} + {` └─ premium (${t('高级套餐,半价优惠')})`} + + + {t('选择 premium 创建的令牌,调用 API 时费用为 standard 的 50%。')} + + + {t('对比:不勾选「用户可选」的场景')} + + + {t('假设再加两个分组 default 和 vip,但不勾选用户可选:')} + + + {`${t('分组名')} ${t('倍率')} ${t('用户可选')} ${t('说明')}\n──────────────────────────────────────\ndefault 1.0 ${t('否')} ${t('管理员分配的基础分组')}\nvip 0.5 ${t('否')} ${t('管理员分配的优惠分组')}\nstandard 1.0 ${t('是')} ${t('标准价格')}\npremium 0.5 ${t('是')} ${t('高级套餐,半价优惠')}`} + + + {t('此时用户创建令牌时只能看到 standard 和 premium:')} + + + {t('用户创建令牌 → 选择分组下拉框:')}{'\n'} + {` ├─ standard (${t('标准价格')})`}{'\n'} + {` └─ premium (${t('高级套餐,半价优惠')})`}{'\n\n'} + {` ${t('不会出现')} default ${t('和')} vip`} + + + {t('default 和 vip 只能由管理员在「用户管理」中分配给用户。适用于按用户等级定价、内部测试等不希望用户自主选择的场景。')} + + + {t('用户分组的联动作用')} + + + {t('管理员给用户分配的分组(如 vip)不仅决定用户身份,还会影响后续两个功能:')} + + + {'1. '}{t('特殊倍率')}{' — '} + {t('可以根据用户分组设置不同的计费倍率。例如 vip 用户使用 standard 令牌时倍率从 1.0 降为 0.8。')} + + + {'2. '}{t('可用分组')}{' — '} + {t('可以根据用户分组增减令牌可选的分组范围。例如 vip 用户额外开放 premium 分组,或移除某个分组的选择权。')} + + + {t('详见「特殊倍率」和「可用分组」标签页。')} + + + + + + GroupRatio{' — '}{t('分组名称到倍率的映射')} + + {`{"default": 1, "vip": 0.5, "standard": 1, "premium": 0.5}`} + + UserUsableGroups{' — '}{t('用户可选分组的名称和描述(只包含勾选了用户可选的分组)')} + + {`{"standard": "${t('标准价格')}", "premium": "${t('高级套餐,半价优惠')}"}`} + +
+
+ + +
+ {t('自动分组选择')} + + {t('当令牌分组设为 auto 时,系统按列表顺序依次选择可用分组。排在前面的优先级更高。')} + + + + + {t('场景:设置自动选择优先级')} + + + {`1. default ${t('最高优先级')}\n2. vip`} + + + {t('开启「默认使用 auto 分组」后,新建令牌和初始令牌都会自动设为 auto。')} + + + + + + AutoGroups{' — '}{t('有序字符串数组')} + + {`["default", "vip"]`} + +
+
+ + +
+ {t('跨分组特殊倍率')} + + {t('正常情况下,令牌的计费倍率由令牌所选的分组决定。特殊倍率可以根据「用户所在分组」进一步覆盖这个倍率。')} + + + {t('简单来说:同一个令牌分组,不同等级的用户可以享受不同的价格。')} + + + + + {t('场景:站点有 standard(倍率 1.0)和 premium(倍率 0.5)两个分组,希望 vip 用户使用 standard 令牌时也能享受折扣')} + + + {t('不配置特殊倍率时:')} + + + {`${t('普通用户')} + standard ${t('令牌')} → ${t('倍率')} 1.0 (${t('原价')})\nvip ${t('用户')} + standard ${t('令牌')} → ${t('倍率')} 1.0 (${t('原价,和普通用户一样')})`} + + + {t('配置特殊倍率后:')} + + + {`${t('用户分组')} ${t('使用分组')} ${t('倍率')}\n────────────────────────────\nvip standard 0.8\nvip premium 0.3`} + + + {t('配置后的效果:')} + + + {`${t('普通用户')} + standard ${t('令牌')} → ${t('倍率')} 1.0 (${t('不变')})\nvip ${t('用户')} + standard ${t('令牌')} → ${t('倍率')} 0.8 (${t('享受 8 折')})\nvip ${t('用户')} + premium ${t('令牌')} → ${t('倍率')} 0.3 (${t('从 0.5 降到 0.3')})`} + + + {t('只有配置了规则的组合才会覆盖,未配置的组合仍使用令牌分组的基础倍率。')} + + + + + + GroupGroupRatio{' — '}{t('嵌套映射:用户分组 → 使用分组 → 倍率')} + + {`{\n "vip": {\n "standard": 0.8,\n "premium": 0.3\n }\n}`} + +
+
+ + +
+ {t('特殊可用分组规则')} + + {t('默认情况下,所有用户创建令牌时看到的可选分组列表是一样的(即「用户可选」列勾选的分组)。')} + + + {t('通过此功能,可以根据用户所在分组,为不同等级的用户展示不同的可选列表。')} + + + + + {t('场景:站点有 standard 和 premium 两个用户可选分组。希望 vip 用户额外看到 exclusive 分组,同时不再看到 standard 分组')} + + + {t('不配置规则时,所有用户看到的下拉框一样:')} + + + {`${t('所有用户')} → ${t('创建令牌可选')}:\n ├─ standard\n └─ premium`} + + + {t('为 vip 用户配置规则:')} + + + {`${t('用户分组')} ${t('操作')} ${t('目标分组')} ${t('描述')}\n──────────────────────────────────────────\nvip ${t('添加')} (+:) exclusive ${t('专属分组')}\nvip ${t('移除')} (-:) standard -`} + + + {t('配置后的效果:')} + + + {`${t('普通用户')} → ${t('创建令牌可选')}:\n ├─ standard\n └─ premium\n\nvip ${t('用户')} → ${t('创建令牌可选')}:\n ├─ premium (${t('保留')})\n └─ exclusive (${t('新增')})\n\n ${t('standard 已被移除,vip 用户看不到')}`} + + + + {t('三种操作的区别:')} + + + {`${t('添加')} (+:) → ${t('在默认列表基础上新增一个分组')}\n${t('移除')} (-:) → ${t('从默认列表中去掉一个分组')}\n${t('追加')} → ${t('直接追加(和添加类似,但无前缀)')}`} + + + + + + group_special_usable_group + + {`{\n "vip": {\n "+:exclusive": "${t('专属分组')}",\n "-:standard": "remove"\n }\n}`} + + {t('键的前缀 +: 表示添加,-: 表示移除,无前缀表示追加。值为分组描述(移除时填 "remove")。')} + + +
+
+
+
+ ); + + return ( + +
+
+ setEditMode(e.target.value)} + > + {t('可视化编辑')} + {t('手动编辑')} + + +
+ {editMode === 'visual' ? renderVisualMode() : renderManualMode()} +
+ + {renderGuide()}
); } diff --git a/web/src/pages/Setting/Ratio/ModelPricingCombined.jsx b/web/src/pages/Setting/Ratio/ModelPricingCombined.jsx new file mode 100644 index 00000000..51dfe27d --- /dev/null +++ b/web/src/pages/Setting/Ratio/ModelPricingCombined.jsx @@ -0,0 +1,50 @@ +/* +Copyright (C) 2025 QuantumNous + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . + +For commercial licensing, please contact support@quantumnous.com +*/ + +import React, { useState } from 'react'; +import { Radio, RadioGroup } from '@douyinfe/semi-ui'; +import { useTranslation } from 'react-i18next'; +import ModelPricingEditor from './components/ModelPricingEditor'; +import ModelRatioSettings from './ModelRatioSettings'; + +export default function ModelPricingCombined({ options, refresh }) { + const { t } = useTranslation(); + const [editMode, setEditMode] = useState('visual'); + + return ( +
+
+ setEditMode(e.target.value)} + > + {t('可视化编辑')} + {t('手动编辑')} + +
+ {editMode === 'visual' ? ( + + ) : ( + + )} +
+ ); +} diff --git a/web/src/pages/Setting/Ratio/components/AutoGroupList.jsx b/web/src/pages/Setting/Ratio/components/AutoGroupList.jsx new file mode 100644 index 00000000..64d4c829 --- /dev/null +++ b/web/src/pages/Setting/Ratio/components/AutoGroupList.jsx @@ -0,0 +1,169 @@ +import React, { useState, useCallback, useMemo } from 'react'; +import { + Button, + Select, + Typography, + Popconfirm, + Tag, +} from '@douyinfe/semi-ui'; +import { + IconPlus, + IconDelete, + IconChevronUp, + IconChevronDown, +} from '@douyinfe/semi-icons'; +import { useTranslation } from 'react-i18next'; + +const { Text } = Typography; + +let _idCounter = 0; +const uid = () => `ag_${++_idCounter}`; + +function parseAutoGroups(str) { + if (!str || !str.trim()) return []; + try { + const parsed = JSON.parse(str); + if (!Array.isArray(parsed)) return []; + return parsed + .filter((item) => typeof item === 'string') + .map((name) => ({ _id: uid(), name })); + } catch { + return []; + } +} + +function serializeAutoGroups(items) { + const names = items.map((i) => i.name).filter(Boolean); + return names.length === 0 ? '' : JSON.stringify(names); +} + +export default function AutoGroupList({ value, groupNames = [], onChange }) { + const { t } = useTranslation(); + + const [items, setItems] = useState(() => parseAutoGroups(value)); + + const emitChange = useCallback( + (newItems) => { + setItems(newItems); + onChange?.(serializeAutoGroups(newItems)); + }, + [onChange], + ); + + const groupOptions = useMemo( + () => groupNames.map((n) => ({ value: n, label: n })), + [groupNames], + ); + + const addItem = useCallback(() => { + emitChange([...items, { _id: uid(), name: '' }]); + }, [items, emitChange]); + + const removeItem = useCallback( + (id) => { + emitChange(items.filter((i) => i._id !== id)); + }, + [items, emitChange], + ); + + const updateItem = useCallback( + (id, name) => { + emitChange(items.map((i) => (i._id === id ? { ...i, name } : i))); + }, + [items, emitChange], + ); + + const moveUp = useCallback( + (index) => { + if (index <= 0) return; + const next = [...items]; + [next[index - 1], next[index]] = [next[index], next[index - 1]]; + emitChange(next); + }, + [items, emitChange], + ); + + const moveDown = useCallback( + (index) => { + if (index >= items.length - 1) return; + const next = [...items]; + [next[index], next[index + 1]] = [next[index + 1], next[index]]; + emitChange(next); + }, + [items, emitChange], + ); + + if (items.length === 0) { + return ( +
+ + {t('暂无自动分组,点击下方按钮添加')} + +
+ +
+
+ ); + } + + return ( +
+
+ {items.map((item, index) => ( +
+ + {index + 1} + + updateRule(record._id, 'userGroup', v)} + style={{ width: '100%' }} + allowCreate + position='bottomLeft' + /> + ), + }, + { + title: t('使用分组'), + dataIndex: 'usingGroup', + key: 'usingGroup', + width: 200, + render: (_, record) => ( + updateRule(record._id, 'userGroup', v)} + style={{ width: '100%' }} + allowCreate + position='bottomLeft' + /> + ), + }, + { + title: t('操作'), + dataIndex: 'op', + key: 'op', + width: 140, + render: (_, record) => ( + updateRule(record._id, 'targetGroup', v)} + /> + ), + }, + { + title: t('描述'), + dataIndex: 'description', + key: 'description', + render: (_, record) => + record.op === OP_REMOVE ? ( + - + ) : ( + updateRule(record._id, 'description', v)} + /> + ), + }, + { + title: '', + key: 'actions', + width: 50, + render: (_, record) => ( + removeRule(record._id)} + position='left' + > + +
+
+ ); +} diff --git a/web/src/pages/Setting/Ratio/components/GroupTable.jsx b/web/src/pages/Setting/Ratio/components/GroupTable.jsx new file mode 100644 index 00000000..9cf08b25 --- /dev/null +++ b/web/src/pages/Setting/Ratio/components/GroupTable.jsx @@ -0,0 +1,242 @@ +import React, { useState, useCallback, useMemo } from 'react'; +import { + Button, + Input, + InputNumber, + Checkbox, + Typography, + Popconfirm, +} from '@douyinfe/semi-ui'; +import { IconPlus, IconDelete } from '@douyinfe/semi-icons'; +import { useTranslation } from 'react-i18next'; +import CardTable from '../../../../components/common/ui/CardTable'; + +const { Text } = Typography; + +let _idCounter = 0; +const uid = () => `gr_${++_idCounter}`; + +function parseJSON(str, fallback) { + if (!str || !str.trim()) return fallback; + try { + return JSON.parse(str); + } catch { + return fallback; + } +} + +function buildRows(groupRatioStr, userUsableGroupsStr) { + const ratioMap = parseJSON(groupRatioStr, {}); + const usableMap = parseJSON(userUsableGroupsStr, {}); + + const allNames = new Set([ + ...Object.keys(ratioMap), + ...Object.keys(usableMap), + ]); + + return Array.from(allNames).map((name) => ({ + _id: uid(), + name, + ratio: ratioMap[name] ?? 1, + selectable: name in usableMap, + description: usableMap[name] ?? '', + })); +} + +export function serializeGroupTable(rows) { + const groupRatio = {}; + const userUsableGroups = {}; + + rows.forEach((row) => { + if (!row.name) return; + groupRatio[row.name] = row.ratio; + if (row.selectable) { + userUsableGroups[row.name] = row.description; + } + }); + + return { + GroupRatio: JSON.stringify(groupRatio, null, 2), + UserUsableGroups: JSON.stringify(userUsableGroups, null, 2), + }; +} + +export default function GroupTable({ + groupRatio, + userUsableGroups, + onChange, +}) { + const { t } = useTranslation(); + + const [rows, setRows] = useState(() => + buildRows(groupRatio, userUsableGroups), + ); + + const emitChange = useCallback( + (newRows) => { + setRows(newRows); + onChange?.(serializeGroupTable(newRows)); + }, + [onChange], + ); + + const updateRow = useCallback( + (id, field, value) => { + const next = rows.map((r) => + r._id === id ? { ...r, [field]: value } : r, + ); + emitChange(next); + }, + [rows, emitChange], + ); + + const addRow = useCallback(() => { + const existingNames = new Set(rows.map((r) => r.name)); + let counter = 1; + let newName = `group_${counter}`; + while (existingNames.has(newName)) { + counter++; + newName = `group_${counter}`; + } + emitChange([ + ...rows, + { + _id: uid(), + name: newName, + ratio: 1, + selectable: true, + description: '', + }, + ]); + }, [rows, emitChange]); + + const removeRow = useCallback( + (id) => { + emitChange(rows.filter((r) => r._id !== id)); + }, + [rows, emitChange], + ); + + const groupNames = useMemo(() => rows.map((r) => r.name), [rows]); + + const duplicateNames = useMemo(() => { + const counts = {}; + groupNames.forEach((n) => { + counts[n] = (counts[n] || 0) + 1; + }); + return new Set(Object.keys(counts).filter((k) => counts[k] > 1)); + }, [groupNames]); + + const columns = useMemo( + () => [ + { + title: t('分组名称'), + dataIndex: 'name', + key: 'name', + width: 180, + render: (_, record) => ( + updateRow(record._id, 'name', v)} + /> + ), + }, + { + title: t('倍率'), + dataIndex: 'ratio', + key: 'ratio', + width: 120, + render: (_, record) => ( + updateRow(record._id, 'ratio', v ?? 0)} + /> + ), + }, + { + title: t('用户可选'), + dataIndex: 'selectable', + key: 'selectable', + width: 90, + align: 'center', + render: (_, record) => ( + + updateRow(record._id, 'selectable', e.target.checked) + } + /> + ), + }, + { + title: t('描述'), + dataIndex: 'description', + key: 'description', + render: (_, record) => + record.selectable ? ( + updateRow(record._id, 'description', v)} + /> + ) : ( + + - + + ), + }, + { + title: '', + key: 'actions', + width: 50, + render: (_, record) => ( + removeRow(record._id)} + position='left' + > + +
+ {duplicateNames.size > 0 && ( + + {t('存在重复的分组名称:')}{Array.from(duplicateNames).join(', ')} + + )} + + ); +} From ded3bb9cb1d7ee0b64af55bb52ec5f19875f144d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 01:23:22 +0000 Subject: [PATCH 17/54] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/bedrockruntime Bumps [github.com/aws/aws-sdk-go-v2/service/bedrockruntime](https://github.com/aws/aws-sdk-go-v2) from 1.50.0 to 1.50.4. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.50.0...service/ssm/v1.50.4) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/bedrockruntime dependency-version: 1.50.4 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 29f797e0..a078b209 100644 --- a/go.mod +++ b/go.mod @@ -8,9 +8,9 @@ require ( github.com/abema/go-mp4 v1.4.1 github.com/andybalholm/brotli v1.1.1 github.com/anknown/ahocorasick v0.0.0-20190904063843-d75dbd5169c0 - github.com/aws/aws-sdk-go-v2 v1.41.2 + github.com/aws/aws-sdk-go-v2 v1.41.5 github.com/aws/aws-sdk-go-v2/credentials v1.19.10 - github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.50.0 + github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.50.4 github.com/aws/smithy-go v1.24.2 github.com/bytedance/gopkg v0.1.3 github.com/gin-contrib/cors v1.7.2 @@ -63,9 +63,9 @@ require ( require ( github.com/DmitriyVTitov/size v1.5.0 // indirect github.com/anknown/darts v0.0.0-20151216065714-83ff685239e6 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.5 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.18 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.18 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/boombuler/barcode v1.1.0 // indirect github.com/bytedance/sonic v1.14.1 // indirect diff --git a/go.sum b/go.sum index 221e1467..8b687906 100644 --- a/go.sum +++ b/go.sum @@ -12,18 +12,18 @@ github.com/anknown/ahocorasick v0.0.0-20190904063843-d75dbd5169c0 h1:onfun1RA+Kc github.com/anknown/ahocorasick v0.0.0-20190904063843-d75dbd5169c0/go.mod h1:4yg+jNTYlDEzBjhGS96v+zjyA3lfXlFd5CiTLIkPBLI= github.com/anknown/darts v0.0.0-20151216065714-83ff685239e6 h1:HblK3eJHq54yET63qPCTJnks3loDse5xRmmqHgHzwoI= github.com/anknown/darts v0.0.0-20151216065714-83ff685239e6/go.mod h1:pbiaLIeYLUbgMY1kwEAdwO6UKD5ZNwdPGQlwokS9fe8= -github.com/aws/aws-sdk-go-v2 v1.41.2 h1:LuT2rzqNQsauaGkPK/7813XxcZ3o3yePY0Iy891T2ls= -github.com/aws/aws-sdk-go-v2 v1.41.2/go.mod h1:IvvlAZQXvTXznUPfRVfryiG1fbzE2NGK6m9u39YQ+S4= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.5 h1:zWFmPmgw4sveAYi1mRqG+E/g0461cJ5M4bJ8/nc6d3Q= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.5/go.mod h1:nVUlMLVV8ycXSb7mSkcNu9e3v/1TJq2RTlrPwhYWr5c= +github.com/aws/aws-sdk-go-v2 v1.41.5 h1:dj5kopbwUsVUVFgO4Fi5BIT3t4WyqIDjGKCangnV/yY= +github.com/aws/aws-sdk-go-v2 v1.41.5/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 h1:eBMB84YGghSocM7PsjmmPffTa+1FBUeNvGvFou6V/4o= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI= github.com/aws/aws-sdk-go-v2/credentials v1.19.10 h1:EEhmEUFCE1Yhl7vDhNOI5OCL/iKMdkkYFTRpZXNw7m8= github.com/aws/aws-sdk-go-v2/credentials v1.19.10/go.mod h1:RnnlFCAlxQCkN2Q379B67USkBMu1PipEEiibzYN5UTE= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.18 h1:F43zk1vemYIqPAwhjTjYIz0irU2EY7sOb/F5eJ3HuyM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.18/go.mod h1:w1jdlZXrGKaJcNoL+Nnrj+k5wlpGXqnNrKoP22HvAug= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.18 h1:xCeWVjj0ki0l3nruoyP2slHsGArMxeiiaoPN5QZH6YQ= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.18/go.mod h1:r/eLGuGCBw6l36ZRWiw6PaZwPXb6YOj+i/7MizNl5/k= -github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.50.0 h1:TDKR8ACRw7G+GFaQlhoy6biu+8q6ZtSddQCy9avMdMI= -github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.50.0/go.mod h1:XlhOh5Ax/lesqN4aZCUgj9vVJed5VoXYHHFYGAlJEwU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21 h1:Rgg6wvjjtX8bNHcvi9OnXWwcE0a2vGpbwmtICOsvcf4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21/go.mod h1:A/kJFst/nm//cyqonihbdpQZwiUhhzpqTsdbhDdRF9c= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21 h1:PEgGVtPoB6NTpPrBgqSE5hE/o47Ij9qk/SEZFbUOe9A= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21/go.mod h1:p+hz+PRAYlY3zcpJhPwXlLC4C+kqn70WIHwnzAfs6ps= +github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.50.4 h1:W6tKfa/s37faUnwJ71pGqsBO7/wfUX1L7tVprupQGo4= +github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.50.4/go.mod h1:BZ+9thH0QOTDUwE8KAv/ZwUzsNC7CSMJXj/wtnZMs5k= github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= From 59d5aef393d95fc3e1b66a58a546e957c4856c56 Mon Sep 17 00:00:00 2001 From: Seefs Date: Wed, 8 Apr 2026 13:41:31 +0800 Subject: [PATCH 18/54] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E5=90=8E=E4=B8=8D=E9=87=8D=E8=AF=95=20=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E9=A1=B9=E5=86=99=E5=88=B0=E5=86=85=E5=AD=98=E8=A2=AB?= =?UTF-8?q?=E8=A6=86=E7=9B=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- setting/operation_setting/channel_affinity_setting.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setting/operation_setting/channel_affinity_setting.go b/setting/operation_setting/channel_affinity_setting.go index ebe00f44..8cd605c0 100644 --- a/setting/operation_setting/channel_affinity_setting.go +++ b/setting/operation_setting/channel_affinity_setting.go @@ -20,7 +20,7 @@ type ChannelAffinityRule struct { ParamOverrideTemplate map[string]interface{} `json:"param_override_template,omitempty"` - SkipRetryOnFailure bool `json:"skip_retry_on_failure,omitempty"` + SkipRetryOnFailure bool `json:"skip_retry_on_failure"` IncludeUsingGroup bool `json:"include_using_group"` IncludeModelName bool `json:"include_model_name"` From c3b8fa29b2af21d4b9326f795e9bc65226ac87cb Mon Sep 17 00:00:00 2001 From: Seefs Date: Wed, 8 Apr 2026 14:01:27 +0800 Subject: [PATCH 19/54] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E5=90=8E=E4=B8=8D=E9=87=8D=E8=AF=95=20=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E9=A1=B9=E5=86=99=E5=88=B0=E5=86=85=E5=AD=98=E8=A2=AB?= =?UTF-8?q?=E8=A6=86=E7=9B=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Operation/SettingsChannelAffinity.jsx | 80 +++++++++++-------- 1 file changed, 48 insertions(+), 32 deletions(-) diff --git a/web/src/pages/Setting/Operation/SettingsChannelAffinity.jsx b/web/src/pages/Setting/Operation/SettingsChannelAffinity.jsx index 559d18bc..76ad7aec 100644 --- a/web/src/pages/Setting/Operation/SettingsChannelAffinity.jsx +++ b/web/src/pages/Setting/Operation/SettingsChannelAffinity.jsx @@ -192,6 +192,36 @@ const parseOptionalObjectJson = (jsonString, label) => { } }; +const buildChannelAffinityRulePayload = ({ + values, + isEdit, + editingRuleId, + rulesLength, + modelRegex, + pathRegex, + keySources, + userAgentInclude, + paramOverrideTemplate, +}) => ({ + id: isEdit ? editingRuleId : rulesLength, + name: (values?.name || '').trim(), + model_regex: modelRegex, + path_regex: pathRegex, + key_sources: keySources, + value_regex: (values?.value_regex || '').trim(), + ttl_seconds: Number(values?.ttl_seconds || 0), + include_using_group: !!values?.include_using_group, + include_model_name: !!values?.include_model_name, + include_rule_name: !!values?.include_rule_name, + skip_retry_on_failure: !!values?.skip_retry_on_failure, + ...(userAgentInclude.length > 0 + ? { user_agent_include: userAgentInclude } + : {}), + ...(paramOverrideTemplate + ? { param_override_template: paramOverrideTemplate } + : {}), +}); + export default function SettingsChannelAffinity(props) { const { t } = useTranslation(); const { Text } = Typography; @@ -456,14 +486,12 @@ export default function SettingsChannelAffinity(props) { const templates = [ CHANNEL_AFFINITY_RULE_TEMPLATES.codexCli, CHANNEL_AFFINITY_RULE_TEMPLATES.claudeCli, - ].map( - (tpl) => { - const baseTemplate = cloneChannelAffinityTemplate(tpl); - const name = makeUniqueName(existingNames, tpl.name); - existingNames.add(name); - return { ...baseTemplate, name }; - }, - ); + ].map((tpl) => { + const baseTemplate = cloneChannelAffinityTemplate(tpl); + const name = makeUniqueName(existingNames, tpl.name); + existingNames.add(name); + return { ...baseTemplate, name }; + }); const next = [...(rules || []), ...templates].map((r, idx) => ({ ...(r || {}), @@ -716,27 +744,17 @@ export default function SettingsChannelAffinity(props) { return showError(t(paramTemplateValidation.message)); } - const rulePayload = { - id: isEdit ? editingRule.id : rules.length, - name: (values.name || '').trim(), - model_regex: modelRegex, - path_regex: normalizeStringList(values.path_regex_text), - key_sources: keySourcesValidation.value, - value_regex: (values.value_regex || '').trim(), - ttl_seconds: Number(values.ttl_seconds || 0), - include_using_group: !!values.include_using_group, - include_model_name: !!values.include_model_name, - include_rule_name: !!values.include_rule_name, - ...(values.skip_retry_on_failure - ? { skip_retry_on_failure: true } - : {}), - ...(userAgentInclude.length > 0 - ? { user_agent_include: userAgentInclude } - : {}), - ...(paramTemplateValidation.value - ? { param_override_template: paramTemplateValidation.value } - : {}), - }; + const rulePayload = buildChannelAffinityRulePayload({ + values, + isEdit, + editingRuleId: editingRule?.id, + rulesLength: rules.length, + modelRegex, + pathRegex: normalizeStringList(values.path_regex_text), + keySources: keySourcesValidation.value, + userAgentInclude, + paramOverrideTemplate: paramTemplateValidation.value, + }); if (!rulePayload.name) return showError(t('名称不能为空')); @@ -1273,9 +1291,7 @@ export default function SettingsChannelAffinity(props) { label={t('作用域:包含模型名称')} /> - {t( - '开启后,模型名称会参与 cache key(不同模型隔离)。', - )} + {t('开启后,模型名称会参与 cache key(不同模型隔离)。')} From 606a4eee96ef08e0843d20ba4c776a5258fe0c61 Mon Sep 17 00:00:00 2001 From: CaIon Date: Wed, 8 Apr 2026 15:43:29 +0800 Subject: [PATCH 20/54] feat(dashboard): add admin user analytics and fix chart labels MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add GET /api/data/users endpoint for user-grouped quota data (admin only) - Add user consumption ranking (horizontal bar, top 10) and user consumption trend (area chart) tabs visible only to admin users - Fix mislabeled "消耗趋势" tab to "调用趋势" (shows call counts, not quota) - Add processUserData helper for user ranking and trend data extraction - Add i18n keys for new tabs across all 7 locales --- controller/usedata.go | 15 ++ model/usedata.go | 10 ++ router/api-router.go | 1 + web/src/components/dashboard/ChartsPanel.jsx | 17 ++- web/src/components/dashboard/index.jsx | 15 ++ web/src/helpers/dashboard.jsx | 55 ++++++++ .../hooks/dashboard/useDashboardCharts.jsx | 131 +++++++++++++++++- web/src/hooks/dashboard/useDashboardData.js | 22 +++ web/src/i18n/locales/en.json | 4 + web/src/i18n/locales/fr.json | 4 + web/src/i18n/locales/ja.json | 4 + web/src/i18n/locales/ru.json | 4 + web/src/i18n/locales/vi.json | 4 + web/src/i18n/locales/zh-CN.json | 4 + web/src/i18n/locales/zh-TW.json | 4 + 15 files changed, 287 insertions(+), 7 deletions(-) diff --git a/controller/usedata.go b/controller/usedata.go index 816988a2..5e194c51 100644 --- a/controller/usedata.go +++ b/controller/usedata.go @@ -27,6 +27,21 @@ func GetAllQuotaDates(c *gin.Context) { return } +func GetQuotaDatesByUser(c *gin.Context) { + startTimestamp, _ := strconv.ParseInt(c.Query("start_timestamp"), 10, 64) + endTimestamp, _ := strconv.ParseInt(c.Query("end_timestamp"), 10, 64) + dates, err := model.GetQuotaDataGroupByUser(startTimestamp, endTimestamp) + if err != nil { + common.ApiError(c, err) + return + } + c.JSON(http.StatusOK, gin.H{ + "success": true, + "message": "", + "data": dates, + }) +} + func GetUserQuotaDates(c *gin.Context) { userId := c.GetInt("id") startTimestamp, _ := strconv.ParseInt(c.Query("start_timestamp"), 10, 64) diff --git a/model/usedata.go b/model/usedata.go index f84beb8d..f0ea055a 100644 --- a/model/usedata.go +++ b/model/usedata.go @@ -115,6 +115,16 @@ func GetQuotaDataByUserId(userId int, startTime int64, endTime int64) (quotaData return quotaDatas, err } +func GetQuotaDataGroupByUser(startTime int64, endTime int64) (quotaData []*QuotaData, err error) { + var quotaDatas []*QuotaData + err = DB.Table("quota_data"). + Select("username, created_at, sum(count) as count, sum(quota) as quota, sum(token_used) as token_used"). + Where("created_at >= ? and created_at <= ?", startTime, endTime). + Group("username, created_at"). + Find("aDatas).Error + return quotaDatas, err +} + func GetAllQuotaDates(startTime int64, endTime int64, username string) (quotaData []*QuotaData, err error) { if username != "" { return GetQuotaDataByUsername(username, startTime, endTime) diff --git a/router/api-router.go b/router/api-router.go index bff158a8..acc2241b 100644 --- a/router/api-router.go +++ b/router/api-router.go @@ -293,6 +293,7 @@ func SetApiRouter(router *gin.Engine) { dataRoute := apiRouter.Group("/data") dataRoute.GET("/", middleware.AdminAuth(), controller.GetAllQuotaDates) + dataRoute.GET("/users", middleware.AdminAuth(), controller.GetQuotaDatesByUser) dataRoute.GET("/self", middleware.UserAuth(), controller.GetUserQuotaDates) logRoute.Use(middleware.CORS(), middleware.CriticalRateLimit()) diff --git a/web/src/components/dashboard/ChartsPanel.jsx b/web/src/components/dashboard/ChartsPanel.jsx index 0992adac..0034ffd9 100644 --- a/web/src/components/dashboard/ChartsPanel.jsx +++ b/web/src/components/dashboard/ChartsPanel.jsx @@ -29,6 +29,9 @@ const ChartsPanel = ({ spec_model_line, spec_pie, spec_rank_bar, + spec_user_rank, + spec_user_trend, + isAdminUser, CARD_PROPS, CHART_CONFIG, FLEX_CENTER_GAP2, @@ -51,9 +54,15 @@ const ChartsPanel = ({ onChange={setActiveChartTab} > {t('消耗分布')}} itemKey='1' /> - {t('消耗趋势')}} itemKey='2' /> + {t('调用趋势')}} itemKey='2' /> {t('调用次数分布')}} itemKey='3' /> {t('调用次数排行')}} itemKey='4' /> + {isAdminUser && ( + {t('用户消耗排行')}} itemKey='5' /> + )} + {isAdminUser && ( + {t('用户消耗趋势')}} itemKey='6' /> + )}
} @@ -72,6 +81,12 @@ const ChartsPanel = ({ {activeChartTab === '4' && ( )} + {activeChartTab === '5' && isAdminUser && ( + + )} + {activeChartTab === '6' && isAdminUser && ( + + )}
); diff --git a/web/src/components/dashboard/index.jsx b/web/src/components/dashboard/index.jsx index b032d07d..811e23ca 100644 --- a/web/src/components/dashboard/index.jsx +++ b/web/src/components/dashboard/index.jsx @@ -86,12 +86,22 @@ const Dashboard = () => { ); // ========== 数据处理 ========== + const loadUserData = async () => { + if (dashboardData.isAdminUser) { + const userData = await dashboardData.loadUserQuotaData(); + if (userData && userData.length > 0) { + dashboardCharts.updateUserChartData(userData); + } + } + }; + const initChart = async () => { await dashboardData.loadQuotaData().then((data) => { if (data && data.length > 0) { dashboardCharts.updateChartData(data); } }); + await loadUserData(); await dashboardData.loadUptimeData(); }; @@ -100,10 +110,12 @@ const Dashboard = () => { if (data && data.length > 0) { dashboardCharts.updateChartData(data); } + await loadUserData(); }; const handleSearchConfirm = async () => { await dashboardData.handleSearchConfirm(dashboardCharts.updateChartData); + await loadUserData(); }; // ========== 数据准备 ========== @@ -182,6 +194,9 @@ const Dashboard = () => { spec_model_line={dashboardCharts.spec_model_line} spec_pie={dashboardCharts.spec_pie} spec_rank_bar={dashboardCharts.spec_rank_bar} + spec_user_rank={dashboardCharts.spec_user_rank} + spec_user_trend={dashboardCharts.spec_user_trend} + isAdminUser={dashboardData.isAdminUser} CARD_PROPS={CARD_PROPS} CHART_CONFIG={CHART_CONFIG} FLEX_CENTER_GAP2={FLEX_CENTER_GAP2} diff --git a/web/src/helpers/dashboard.jsx b/web/src/helpers/dashboard.jsx index d93d0461..a7a30bf6 100644 --- a/web/src/helpers/dashboard.jsx +++ b/web/src/helpers/dashboard.jsx @@ -387,3 +387,58 @@ export const generateChartTimePoints = ( return chartTimePoints; }; + +// ========== 用户维度数据处理 ========== +export const processUserData = (data, dataExportDefaultTime, limit = 10) => { + const userQuotaTotal = new Map(); + data.forEach((item) => { + const prev = userQuotaTotal.get(item.username) || 0; + userQuotaTotal.set(item.username, prev + item.quota); + }); + + const sorted = Array.from(userQuotaTotal.entries()).sort( + (a, b) => b[1] - a[1], + ); + const topUsers = sorted.slice(0, limit).map(([u]) => u); + const topUserSet = new Set(topUsers); + + const rankingData = sorted.slice(0, limit).map(([username, quota]) => ({ + User: username, + Quota: quota, + })); + + const showYear = isDataCrossYear(data.map((item) => item.created_at)); + + const timeUserMap = new Map(); + const allTimePoints = new Set(); + + data.forEach((item) => { + const timeKey = timestamp2string1( + item.created_at, + dataExportDefaultTime, + showYear, + ); + allTimePoints.add(timeKey); + const user = topUserSet.has(item.username) ? item.username : null; + if (!user) return; + const key = `${timeKey}-${user}`; + const prev = timeUserMap.get(key) || { quota: 0 }; + timeUserMap.set(key, { quota: prev.quota + item.quota }); + }); + + const sortedTimePoints = Array.from(allTimePoints).sort(); + const trendData = []; + sortedTimePoints.forEach((time) => { + topUsers.forEach((user) => { + const key = `${time}-${user}`; + const val = timeUserMap.get(key); + trendData.push({ + Time: time, + User: user, + Quota: val?.quota || 0, + }); + }); + }); + + return { rankingData, trendData, topUsers }; +}; diff --git a/web/src/hooks/dashboard/useDashboardCharts.jsx b/web/src/hooks/dashboard/useDashboardCharts.jsx index 6144b7f9..d101a6c5 100644 --- a/web/src/hooks/dashboard/useDashboardCharts.jsx +++ b/web/src/hooks/dashboard/useDashboardCharts.jsx @@ -34,8 +34,14 @@ import { updateChartSpec, updateMapValue, initializeMaps, + processUserData, } from '../../helpers/dashboard'; +const USER_COLORS = [ + '#3b82f6', '#ef4444', '#10b981', '#f59e0b', '#8b5cf6', + '#ec4899', '#06b6d4', '#f97316', '#6366f1', '#14b8a6', +]; + export const useDashboardCharts = ( dataExportDefaultTime, setTrendData, @@ -179,7 +185,6 @@ export const useDashboardCharts = ( }, }); - // 模型消耗趋势折线图 const [spec_model_line, setSpecModelLine] = useState({ type: 'line', data: [ @@ -197,7 +202,7 @@ export const useDashboardCharts = ( }, title: { visible: true, - text: t('模型消耗趋势'), + text: t('调用趋势'), subtext: '', }, tooltip: { @@ -215,7 +220,6 @@ export const useDashboardCharts = ( }, }); - // 模型调用次数排行柱状图 const [spec_rank_bar, setSpecRankBar] = useState({ type: 'bar', data: [ @@ -259,6 +263,76 @@ export const useDashboardCharts = ( }, }); + // ========== Admin: 用户消耗排行 ========== + const [spec_user_rank, setSpecUserRank] = useState({ + type: 'bar', + data: [{ id: 'userRankData', values: [] }], + xField: 'rawQuota', + yField: 'User', + seriesField: 'User', + direction: 'horizontal', + legends: { visible: false }, + title: { + visible: true, + text: t('用户消耗排行'), + subtext: '', + }, + bar: { + state: { hover: { stroke: '#000', lineWidth: 1 } }, + }, + label: { + visible: true, + position: 'outside', + formatMethod: (value, datum) => renderQuota(datum['rawQuota'] || 0, 2), + }, + axes: [{ + orient: 'left', + type: 'band', + label: { visible: true }, + }, { + orient: 'bottom', + type: 'linear', + visible: false, + }], + tooltip: { + mark: { + content: [{ + key: (datum) => datum['User'], + value: (datum) => renderQuota(datum['rawQuota'] || 0, 4), + }], + }, + }, + color: { type: 'ordinal', range: USER_COLORS }, + }); + + // ========== Admin: 用户消耗趋势 ========== + const [spec_user_trend, setSpecUserTrend] = useState({ + type: 'area', + data: [{ id: 'userTrendData', values: [] }], + xField: 'Time', + yField: 'rawQuota', + seriesField: 'User', + stack: false, + legends: { visible: true, selectMode: 'single' }, + title: { + visible: true, + text: t('用户消耗趋势'), + subtext: '', + }, + area: { style: { fillOpacity: 0.15 } }, + line: { style: { lineWidth: 2 } }, + point: { visible: false }, + tooltip: { + mark: { + content: [{ + key: (datum) => datum['User'], + value: (datum) => renderQuota(datum['rawQuota'] || 0, 4), + }], + }, + }, + color: { type: 'ordinal', range: USER_COLORS }, + }); + // ========== 数据处理函数 ========== const generateModelColors = useCallback((uniqueModels, modelColors) => { const newModelColors = {}; @@ -426,6 +500,51 @@ export const useDashboardCharts = ( ], ); + // ========== 用户维度图表数据处理 ========== + const updateUserChartData = useCallback( + (data) => { + const { rankingData, trendData: userTrend } = processUserData( + data, + dataExportDefaultTime, + 10, + ); + + const userRankValues = rankingData.map((item) => ({ + User: item.User, + rawQuota: item.Quota, + Quota: getQuotaWithUnit(item.Quota, 4), + })).sort((a, b) => a.rawQuota - b.rawQuota); + + const totalUserQuota = rankingData.reduce((s, i) => s + i.Quota, 0); + + setSpecUserRank((prev) => ({ + ...prev, + data: [{ id: 'userRankData', values: userRankValues }], + title: { + ...prev.title, + subtext: `${t('总计')}:${renderQuota(totalUserQuota, 2)}`, + }, + })); + + const userTrendValues = userTrend.map((item) => ({ + Time: item.Time, + User: item.User, + rawQuota: item.Quota, + Usage: item.Quota ? getQuotaWithUnit(item.Quota, 4) : 0, + })); + + setSpecUserTrend((prev) => ({ + ...prev, + data: [{ id: 'userTrendData', values: userTrendValues }], + title: { + ...prev.title, + subtext: `${t('总计')}:${renderQuota(totalUserQuota, 2)}`, + }, + })); + }, + [dataExportDefaultTime, t], + ); + // ========== 初始化图表主题 ========== useEffect(() => { initVChartSemiTheme({ @@ -434,14 +553,14 @@ export const useDashboardCharts = ( }, []); return { - // 图表规格 spec_pie, spec_line, spec_model_line, spec_rank_bar, - - // 函数 + spec_user_rank, + spec_user_trend, updateChartData, + updateUserChartData, generateModelColors, }; }; diff --git a/web/src/hooks/dashboard/useDashboardData.js b/web/src/hooks/dashboard/useDashboardData.js index b51bcc40..e9b2cad8 100644 --- a/web/src/hooks/dashboard/useDashboardData.js +++ b/web/src/hooks/dashboard/useDashboardData.js @@ -213,6 +213,27 @@ export const useDashboardData = (userState, userDispatch, statusState) => { } }, [activeUptimeTab]); + const loadUserQuotaData = useCallback(async () => { + if (!isAdminUser) return []; + try { + const { start_timestamp, end_timestamp } = inputs; + const localStartTimestamp = Date.parse(start_timestamp) / 1000; + const localEndTimestamp = Date.parse(end_timestamp) / 1000; + const url = `/api/data/users?start_timestamp=${localStartTimestamp}&end_timestamp=${localEndTimestamp}`; + const res = await API.get(url); + const { success, message, data } = res.data; + if (success) { + return data || []; + } else { + showError(message); + return []; + } + } catch (err) { + console.error(err); + return []; + } + }, [inputs, isAdminUser]); + const getUserData = useCallback(async () => { let res = await API.get(`/api/user/self`); const { success, message, data } = res.data; @@ -311,6 +332,7 @@ export const useDashboardData = (userState, userDispatch, statusState) => { showSearchModal, handleCloseModal, loadQuotaData, + loadUserQuotaData, loadUptimeData, getUserData, refresh, diff --git a/web/src/i18n/locales/en.json b/web/src/i18n/locales/en.json index 7436fdd9..26b9d32d 100644 --- a/web/src/i18n/locales/en.json +++ b/web/src/i18n/locales/en.json @@ -3066,6 +3066,10 @@ "调用次数": "Call Count", "调用次数分布": "Models call distribution", "调用次数排行": "Models call ranking", + "调用趋势": "Call trend", + "模型排行": "Model ranking", + "用户消耗排行": "User consumption ranking", + "用户消耗趋势": "User consumption trend", "调试信息": "Debug information", "谨慎": "Cautious", "豆包": "Doubao", diff --git a/web/src/i18n/locales/fr.json b/web/src/i18n/locales/fr.json index 125b4b0f..5154cedb 100644 --- a/web/src/i18n/locales/fr.json +++ b/web/src/i18n/locales/fr.json @@ -3039,6 +3039,10 @@ "调用次数": "Nombre d'appels", "调用次数分布": "Distribution des appels de modèles", "调用次数排行": "Classement des appels de modèles", + "调用趋势": "Tendance des appels", + "模型排行": "Classement des modèles", + "用户消耗排行": "Classement de consommation des utilisateurs", + "用户消耗趋势": "Tendance de consommation des utilisateurs", "调试信息": "Informations de débogage", "谨慎": "Prudent", "豆包": "Doubao", diff --git a/web/src/i18n/locales/ja.json b/web/src/i18n/locales/ja.json index 66212683..72b20439 100644 --- a/web/src/i18n/locales/ja.json +++ b/web/src/i18n/locales/ja.json @@ -3020,6 +3020,10 @@ "调用次数": "呼び出し回数", "调用次数分布": "呼び出し回数分布", "调用次数排行": "呼び出し回数ランキング", + "调用趋势": "呼び出し推移", + "模型排行": "モデルランキング", + "用户消耗排行": "ユーザー消費ランキング", + "用户消耗趋势": "ユーザー消費推移", "调试信息": "デバッグ情報", "谨慎": "注意", "豆包": "豆包", diff --git a/web/src/i18n/locales/ru.json b/web/src/i18n/locales/ru.json index 024d2724..c6c26957 100644 --- a/web/src/i18n/locales/ru.json +++ b/web/src/i18n/locales/ru.json @@ -3053,6 +3053,10 @@ "调用次数": "Количество вызовов", "调用次数分布": "Распределение количества вызовов", "调用次数排行": "Рейтинг количества вызовов", + "调用趋势": "Тенденция вызовов", + "模型排行": "Рейтинг моделей", + "用户消耗排行": "Рейтинг потребления пользователей", + "用户消耗趋势": "Тенденция потребления пользователей", "调试信息": "Отладочная информация", "谨慎": "Осторожно", "豆包": "Doubao", diff --git a/web/src/i18n/locales/vi.json b/web/src/i18n/locales/vi.json index 9552d37d..ddc6910d 100644 --- a/web/src/i18n/locales/vi.json +++ b/web/src/i18n/locales/vi.json @@ -3472,6 +3472,10 @@ "调用次数": "Số lần gọi", "调用次数分布": "Phân phối số lần gọi", "调用次数排行": "Xếp hạng số lần gọi", + "调用趋势": "Xu hướng cuộc gọi", + "模型排行": "Xếp hạng mô hình", + "用户消耗排行": "Xếp hạng tiêu thụ người dùng", + "用户消耗趋势": "Xu hướng tiêu thụ người dùng", "调试信息": "Thông tin gỡ lỗi", "谨慎": "Thận trọng", "豆包": "Doubao", diff --git a/web/src/i18n/locales/zh-CN.json b/web/src/i18n/locales/zh-CN.json index aeeefb5c..cc6bed8a 100644 --- a/web/src/i18n/locales/zh-CN.json +++ b/web/src/i18n/locales/zh-CN.json @@ -2314,6 +2314,10 @@ "调用次数": "调用次数", "调用次数分布": "调用次数分布", "调用次数排行": "调用次数排行", + "调用趋势": "调用趋势", + "模型排行": "模型排行", + "用户消耗排行": "用户消耗排行", + "用户消耗趋势": "用户消耗趋势", "调试信息": "调试信息", "谨慎": "谨慎", "警告": "警告", diff --git a/web/src/i18n/locales/zh-TW.json b/web/src/i18n/locales/zh-TW.json index a040c00b..7b0d2d1a 100644 --- a/web/src/i18n/locales/zh-TW.json +++ b/web/src/i18n/locales/zh-TW.json @@ -2719,6 +2719,10 @@ "调用次数": "調用次數", "调用次数分布": "調用次數分佈", "调用次数排行": "調用次數排行", + "调用趋势": "調用趨勢", + "模型排行": "模型排行", + "用户消耗排行": "用戶消耗排行", + "用户消耗趋势": "用戶消耗趨勢", "调试信息": "除錯訊息", "谨慎": "謹慎", "豆包": "豆包", From 77897a8101cb42022034e4bdb4d094aab1c4e592 Mon Sep 17 00:00:00 2001 From: CaIon Date: Wed, 8 Apr 2026 15:57:26 +0800 Subject: [PATCH 21/54] feat(dashboard): enhance chart axes and update sorting logic --- web/src/hooks/dashboard/useDashboardCharts.jsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/web/src/hooks/dashboard/useDashboardCharts.jsx b/web/src/hooks/dashboard/useDashboardCharts.jsx index d101a6c5..0d138350 100644 --- a/web/src/hooks/dashboard/useDashboardCharts.jsx +++ b/web/src/hooks/dashboard/useDashboardCharts.jsx @@ -319,6 +319,12 @@ export const useDashboardCharts = ( text: t('用户消耗趋势'), subtext: '', }, + axes: [{ + orient: 'left', + label: { + formatMethod: (value) => renderQuota(value, 2), + }, + }], area: { style: { fillOpacity: 0.15 } }, line: { style: { lineWidth: 2 } }, point: { visible: false }, @@ -513,7 +519,7 @@ export const useDashboardCharts = ( User: item.User, rawQuota: item.Quota, Quota: getQuotaWithUnit(item.Quota, 4), - })).sort((a, b) => a.rawQuota - b.rawQuota); + })).sort((a, b) => b.rawQuota - a.rawQuota); const totalUserQuota = rankingData.reduce((s, i) => s + i.Quota, 0); From aafbd788879de750ebe0570712783c60c3f0dc8f Mon Sep 17 00:00:00 2001 From: CaIon Date: Wed, 8 Apr 2026 16:39:50 +0800 Subject: [PATCH 22/54] feat(dashboard): add copy button next to API link in API info panel Closes #4058 --- web/src/components/dashboard/ApiInfoPanel.jsx | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/web/src/components/dashboard/ApiInfoPanel.jsx b/web/src/components/dashboard/ApiInfoPanel.jsx index 1c3c3dd3..c93ada44 100644 --- a/web/src/components/dashboard/ApiInfoPanel.jsx +++ b/web/src/components/dashboard/ApiInfoPanel.jsx @@ -19,7 +19,7 @@ For commercial licensing, please contact support@quantumnous.com import React from 'react'; import { Card, Avatar, Tag, Divider, Empty } from '@douyinfe/semi-ui'; -import { Server, Gauge, ExternalLink } from 'lucide-react'; +import { Server, Gauge, ExternalLink, Copy } from 'lucide-react'; import { IllustrationConstruction, IllustrationConstructionDark, @@ -87,11 +87,18 @@ const ApiInfoPanel = ({
-
handleCopyUrl(api.url)} - > - {api.url} +
+ handleCopyUrl(api.url)} + > + {api.url} + + handleCopyUrl(api.url)} + />
{api.description}
From a18ea3cc167ec69be05052fc8f35b74d974a4856 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E9=87=8E=E6=A2=A6=E6=9C=88?= <147403913+Hoshino-Yumetsuki@users.noreply.github.com> Date: Wed, 8 Apr 2026 16:53:10 +0800 Subject: [PATCH 23/54] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E5=BC=BA?= =?UTF-8?q?=E5=88=B6=E4=BD=BF=E7=94=A8=20AUTH=20LOGIN=20=E4=BB=A5=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=20outlook=20=E7=AD=89=E9=82=AE=E7=AE=B1=E7=9A=84?= =?UTF-8?q?=E5=8F=91=E4=BB=B6=E9=97=AE=E9=A2=98=20(#4112)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 支持强制使用 AUTH LOGIN 以解决 outlook 等邮箱的发件问题 * fix: 修复通过 SSL 发送邮件时绕过 AUTH LOGIN 的问题 * fix: remove redundant branch, delete test file, add i18n translations - Remove redundant else-if branch in SendEmail since auth is already computed via getSMTPAuth() - Delete option_smtp_auth_test.go as requested - Add i18n translations for '强制使用 AUTH LOGIN' checkbox --- common/constants.go | 1 + common/email.go | 19 +++++++++++++++---- model/option.go | 5 ++++- web/bun.lock | 9 +++++---- web/src/components/settings/SystemSetting.jsx | 11 +++++++++++ web/src/i18n/locales/en.json | 1 + web/src/i18n/locales/fr.json | 1 + web/src/i18n/locales/ja.json | 1 + web/src/i18n/locales/ru.json | 1 + web/src/i18n/locales/vi.json | 1 + web/src/i18n/locales/zh-CN.json | 1 + web/src/i18n/locales/zh-TW.json | 1 + 12 files changed, 43 insertions(+), 9 deletions(-) diff --git a/common/constants.go b/common/constants.go index 5118da70..6caa7f5c 100644 --- a/common/constants.go +++ b/common/constants.go @@ -80,6 +80,7 @@ var InsecureTLSConfig = &tls.Config{InsecureSkipVerify: true} var SMTPServer = "" var SMTPPort = 587 var SMTPSSLEnabled = false +var SMTPForceAuthLogin = false var SMTPAccount = "" var SMTPFrom = "" var SMTPToken = "" diff --git a/common/email.go b/common/email.go index 9f574f06..c43ddec9 100644 --- a/common/email.go +++ b/common/email.go @@ -19,6 +19,20 @@ func generateMessageID() (string, error) { return fmt.Sprintf("<%d.%s@%s>", time.Now().UnixNano(), GetRandomString(12), domain), nil } +func shouldUseSMTPLoginAuth() bool { + if SMTPForceAuthLogin { + return true + } + return isOutlookServer(SMTPAccount) || slices.Contains(EmailLoginAuthServerList, SMTPServer) +} + +func getSMTPAuth() smtp.Auth { + if shouldUseSMTPLoginAuth() { + return LoginAuth(SMTPAccount, SMTPToken) + } + return smtp.PlainAuth("", SMTPAccount, SMTPToken, SMTPServer) +} + func SendEmail(subject string, receiver string, content string) error { if SMTPFrom == "" { // for compatibility SMTPFrom = SMTPAccount @@ -38,7 +52,7 @@ func SendEmail(subject string, receiver string, content string) error { "Message-ID: %s\r\n"+ // 添加 Message-ID 头 "Content-Type: text/html; charset=UTF-8\r\n\r\n%s\r\n", receiver, SystemName, SMTPFrom, encodedSubject, time.Now().Format(time.RFC1123Z), id, content)) - auth := smtp.PlainAuth("", SMTPAccount, SMTPToken, SMTPServer) + auth := getSMTPAuth() addr := fmt.Sprintf("%s:%d", SMTPServer, SMTPPort) to := strings.Split(receiver, ";") var err error @@ -80,9 +94,6 @@ func SendEmail(subject string, receiver string, content string) error { if err != nil { return err } - } else if isOutlookServer(SMTPAccount) || slices.Contains(EmailLoginAuthServerList, SMTPServer) { - auth = LoginAuth(SMTPAccount, SMTPToken) - err = smtp.SendMail(addr, auth, SMTPFrom, to, mail) } else { err = smtp.SendMail(addr, auth, SMTPFrom, to, mail) } diff --git a/model/option.go b/model/option.go index 967fa0aa..efa8c01d 100644 --- a/model/option.go +++ b/model/option.go @@ -62,6 +62,7 @@ func InitOptionMap() { common.OptionMap["SMTPAccount"] = "" common.OptionMap["SMTPToken"] = "" common.OptionMap["SMTPSSLEnabled"] = strconv.FormatBool(common.SMTPSSLEnabled) + common.OptionMap["SMTPForceAuthLogin"] = strconv.FormatBool(common.SMTPForceAuthLogin) common.OptionMap["Notice"] = "" common.OptionMap["About"] = "" common.OptionMap["HomePageContent"] = "" @@ -233,7 +234,7 @@ func updateOptionMap(key string, value string) (err error) { common.ImageDownloadPermission = intValue } } - if strings.HasSuffix(key, "Enabled") || key == "DefaultCollapseSidebar" || key == "DefaultUseAutoGroup" { + if strings.HasSuffix(key, "Enabled") || key == "DefaultCollapseSidebar" || key == "DefaultUseAutoGroup" || key == "SMTPForceAuthLogin" { boolValue := value == "true" switch key { case "PasswordRegisterEnabled": @@ -308,6 +309,8 @@ func updateOptionMap(key string, value string) (err error) { setting.StopOnSensitiveEnabled = boolValue case "SMTPSSLEnabled": common.SMTPSSLEnabled = boolValue + case "SMTPForceAuthLogin": + common.SMTPForceAuthLogin = boolValue case "WorkerAllowHttpImageRequestEnabled": system_setting.WorkerAllowHttpImageRequestEnabled = boolValue case "DefaultUseAutoGroup": diff --git a/web/bun.lock b/web/bun.lock index e3b293cb..9a841922 100644 --- a/web/bun.lock +++ b/web/bun.lock @@ -1,5 +1,6 @@ { "lockfileVersion": 1, + "configVersion": 0, "workspaces": { "": { "name": "react-template", @@ -10,7 +11,7 @@ "@visactor/react-vchart": "~1.8.8", "@visactor/vchart": "~1.8.8", "@visactor/vchart-semi-theme": "~1.8.8", - "axios": "1.12.0", + "axios": "1.13.5", "clsx": "^2.1.1", "dayjs": "^1.11.11", "history": "^5.3.0", @@ -776,7 +777,7 @@ "autoprefixer": ["autoprefixer@10.4.21", "", { "dependencies": { "browserslist": "^4.24.4", "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ=="], - "axios": ["axios@1.12.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-oXTDccv8PcfjZmPGlWsPSwtOJCZ/b6W5jAMCNcfwJbCzDckwG0jrYJFaWH1yvivfCXjVzV/SPDEhMB3Q+DSurg=="], + "axios": ["axios@1.13.5", "", { "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q=="], "babel-plugin-macros": ["babel-plugin-macros@3.1.0", "", { "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", "resolve": "^1.19.0" } }, "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg=="], @@ -1104,13 +1105,13 @@ "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], - "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], + "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], "for-in": ["for-in@1.0.2", "", {}, "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ=="], "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], - "form-data": ["form-data@4.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow=="], + "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], "fraction.js": ["fraction.js@4.3.7", "", {}, "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="], diff --git a/web/src/components/settings/SystemSetting.jsx b/web/src/components/settings/SystemSetting.jsx index 91ef3645..63b20c70 100644 --- a/web/src/components/settings/SystemSetting.jsx +++ b/web/src/components/settings/SystemSetting.jsx @@ -91,6 +91,7 @@ const SystemSetting = () => { EmailDomainRestrictionEnabled: '', EmailAliasRestrictionEnabled: '', SMTPSSLEnabled: '', + SMTPForceAuthLogin: '', EmailDomainWhitelist: [], TelegramOAuthEnabled: '', TelegramBotToken: '', @@ -182,6 +183,7 @@ const SystemSetting = () => { case 'EmailDomainRestrictionEnabled': case 'EmailAliasRestrictionEnabled': case 'SMTPSSLEnabled': + case 'SMTPForceAuthLogin': case 'LinuxDOOAuthEnabled': case 'discord.enabled': case 'oidc.enabled': @@ -1335,6 +1337,15 @@ const SystemSetting = () => { > {t('启用SMTP SSL')} + + handleCheckboxChange('SMTPForceAuthLogin', e) + } + > + {t('强制使用 AUTH LOGIN')} +
diff --git a/web/src/i18n/locales/en.json b/web/src/i18n/locales/en.json index 26b9d32d..5835d47b 100644 --- a/web/src/i18n/locales/en.json +++ b/web/src/i18n/locales/en.json @@ -925,6 +925,7 @@ "启用Gemini思考后缀适配": "Enable Gemini thinking suffix adaptation", "启用Ping间隔": "Enable Ping interval", "启用SMTP SSL": "Enable SMTP SSL", + "强制使用 AUTH LOGIN": "Force AUTH LOGIN", "启用SSRF防护(推荐开启以保护服务器安全)": "Enable SSRF Protection (Recommended for server security)", "启用供应商": "Enable Provider", "启用全部": "Enable all", diff --git a/web/src/i18n/locales/fr.json b/web/src/i18n/locales/fr.json index 5154cedb..0059feee 100644 --- a/web/src/i18n/locales/fr.json +++ b/web/src/i18n/locales/fr.json @@ -920,6 +920,7 @@ "启用Gemini思考后缀适配": "Activer l'adaptation du suffixe de la pensée Gemini", "启用Ping间隔": "Activer l'intervalle de ping", "启用SMTP SSL": "Activer SMTP SSL", + "强制使用 AUTH LOGIN": "Forcer AUTH LOGIN", "启用SSRF防护(推荐开启以保护服务器安全)": "Activer la protection SSRF (recommandé pour la sécurité du serveur)", "启用供应商": "Activer le fournisseur", "启用全部": "Activer tout", diff --git a/web/src/i18n/locales/ja.json b/web/src/i18n/locales/ja.json index 72b20439..782755ed 100644 --- a/web/src/i18n/locales/ja.json +++ b/web/src/i18n/locales/ja.json @@ -911,6 +911,7 @@ "启用Gemini思考后缀适配": "Gemini思考サフィックスモードを有効にする", "启用Ping间隔": "Ping間隔を有効にする", "启用SMTP SSL": "SMTP SSLを有効にする", + "强制使用 AUTH LOGIN": "AUTH LOGINを強制する", "启用SSRF防护(推荐开启以保护服务器安全)": "SSRF保護を有効にする(サーバーを保護するため、有効化を推奨します)", "启用供应商": "プロバイダーを有効化", "启用全部": "すべてを有効にする", diff --git a/web/src/i18n/locales/ru.json b/web/src/i18n/locales/ru.json index c6c26957..016eab2a 100644 --- a/web/src/i18n/locales/ru.json +++ b/web/src/i18n/locales/ru.json @@ -926,6 +926,7 @@ "启用Gemini思考后缀适配": "Включить адаптацию суффикса мышления Gemini", "启用Ping间隔": "Включить интервал Ping", "启用SMTP SSL": "Включить SMTP SSL", + "强制使用 AUTH LOGIN": "Принудительно AUTH LOGIN", "启用SSRF防护(推荐开启以保护服务器安全)": "Включить защиту SSRF (рекомендуется включить для защиты безопасности сервера)", "启用供应商": "Включить поставщика", "启用全部": "Включить все", diff --git a/web/src/i18n/locales/vi.json b/web/src/i18n/locales/vi.json index ddc6910d..c908cb54 100644 --- a/web/src/i18n/locales/vi.json +++ b/web/src/i18n/locales/vi.json @@ -912,6 +912,7 @@ "启用Gemini思考后缀适配": "Bật thích ứng hậu tố tư duy Gemini", "启用Ping间隔": "Bật khoảng thời gian Ping", "启用SMTP SSL": "Bật SMTP SSL", + "强制使用 AUTH LOGIN": "Buộc AUTH LOGIN", "启用SSRF防护(推荐开启以保护服务器安全)": "Bật bảo vệ SSRF (Khuyên dùng để bảo mật máy chủ)", "启用供应商": "Bật nhà cung cấp", "启用全部": "Bật tất cả", diff --git a/web/src/i18n/locales/zh-CN.json b/web/src/i18n/locales/zh-CN.json index cc6bed8a..69e824e6 100644 --- a/web/src/i18n/locales/zh-CN.json +++ b/web/src/i18n/locales/zh-CN.json @@ -680,6 +680,7 @@ "启用Gemini思考后缀适配": "启用Gemini思考后缀适配", "启用Ping间隔": "启用Ping间隔", "启用SMTP SSL": "启用SMTP SSL", + "强制使用 AUTH LOGIN": "强制使用 AUTH LOGIN", "启用SSRF防护(推荐开启以保护服务器安全)": "启用SSRF防护(推荐开启以保护服务器安全)", "启用全部": "启用全部", "启用后可接入 io.net GPU 资源": "启用后可接入 io.net GPU 资源", diff --git a/web/src/i18n/locales/zh-TW.json b/web/src/i18n/locales/zh-TW.json index 7b0d2d1a..c599bb06 100644 --- a/web/src/i18n/locales/zh-TW.json +++ b/web/src/i18n/locales/zh-TW.json @@ -797,6 +797,7 @@ "启用Gemini思考后缀适配": "啟用Gemini思考後綴相容", "启用Ping间隔": "啟用Ping間隔", "启用SMTP SSL": "啟用SMTP SSL", + "强制使用 AUTH LOGIN": "強制使用 AUTH LOGIN", "启用SSRF防护(推荐开启以保护服务器安全)": "啟用SSRF防護(推薦開啟以保護伺服器安全)", "启用全部": "啟用全部", "启用后可接入 io.net GPU 资源": "啟用後可接入 io.net GPU 資源", From c734db34e839172680a1acb56fec888bbd1531df Mon Sep 17 00:00:00 2001 From: forsakenyang Date: Wed, 8 Apr 2026 16:57:44 +0800 Subject: [PATCH 24/54] feat: add minimax image generation relay support (#4103) --- relay/channel/minimax/adaptor.go | 8 +- relay/channel/minimax/adaptor_test.go | 137 ++++++++++++++++ relay/channel/minimax/constants.go | 4 + relay/channel/minimax/image.go | 213 +++++++++++++++++++++++++ relay/channel/minimax/relay-minimax.go | 2 + 5 files changed, 363 insertions(+), 1 deletion(-) create mode 100644 relay/channel/minimax/adaptor_test.go create mode 100644 relay/channel/minimax/image.go diff --git a/relay/channel/minimax/adaptor.go b/relay/channel/minimax/adaptor.go index 54ce5926..56d3a1ec 100644 --- a/relay/channel/minimax/adaptor.go +++ b/relay/channel/minimax/adaptor.go @@ -78,7 +78,10 @@ func (a *Adaptor) ConvertAudioRequest(c *gin.Context, info *relaycommon.RelayInf } func (a *Adaptor) ConvertImageRequest(c *gin.Context, info *relaycommon.RelayInfo, request dto.ImageRequest) (any, error) { - return request, nil + if info.RelayMode != constant.RelayModeImagesGenerations { + return nil, fmt.Errorf("unsupported image relay mode: %d", info.RelayMode) + } + return oaiImage2MiniMaxImageRequest(request), nil } func (a *Adaptor) Init(info *relaycommon.RelayInfo) { @@ -121,6 +124,9 @@ func (a *Adaptor) DoResponse(c *gin.Context, resp *http.Response, info *relaycom if info.RelayMode == constant.RelayModeAudioSpeech { return handleTTSResponse(c, resp, info) } + if info.RelayMode == constant.RelayModeImagesGenerations { + return miniMaxImageHandler(c, resp, info) + } switch info.RelayFormat { case types.RelayFormatClaude: diff --git a/relay/channel/minimax/adaptor_test.go b/relay/channel/minimax/adaptor_test.go new file mode 100644 index 00000000..46d57c11 --- /dev/null +++ b/relay/channel/minimax/adaptor_test.go @@ -0,0 +1,137 @@ +package minimax + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "strings" + "testing" + "time" + + "github.com/QuantumNous/new-api/dto" + relaycommon "github.com/QuantumNous/new-api/relay/common" + relayconstant "github.com/QuantumNous/new-api/relay/constant" + + "github.com/gin-gonic/gin" +) + +func TestGetRequestURLForImageGeneration(t *testing.T) { + t.Parallel() + + info := &relaycommon.RelayInfo{ + RelayMode: relayconstant.RelayModeImagesGenerations, + ChannelMeta: &relaycommon.ChannelMeta{ + ChannelBaseUrl: "https://api.minimax.chat", + }, + } + + got, err := GetRequestURL(info) + if err != nil { + t.Fatalf("GetRequestURL returned error: %v", err) + } + + want := "https://api.minimax.chat/v1/image_generation" + if got != want { + t.Fatalf("GetRequestURL() = %q, want %q", got, want) + } +} + +func TestConvertImageRequest(t *testing.T) { + t.Parallel() + + adaptor := &Adaptor{} + info := &relaycommon.RelayInfo{ + RelayMode: relayconstant.RelayModeImagesGenerations, + OriginModelName: "image-01", + } + request := dto.ImageRequest{ + Model: "image-01", + Prompt: "a red fox in snowfall", + Size: "1536x1024", + ResponseFormat: "url", + N: uintPtr(2), + } + + got, err := adaptor.ConvertImageRequest(gin.CreateTestContextOnly(httptest.NewRecorder(), gin.New()), info, request) + if err != nil { + t.Fatalf("ConvertImageRequest returned error: %v", err) + } + + body, err := json.Marshal(got) + if err != nil { + t.Fatalf("json.Marshal returned error: %v", err) + } + + var payload map[string]any + if err := json.Unmarshal(body, &payload); err != nil { + t.Fatalf("json.Unmarshal returned error: %v", err) + } + + if payload["model"] != "image-01" { + t.Fatalf("model = %#v, want %q", payload["model"], "image-01") + } + if payload["prompt"] != request.Prompt { + t.Fatalf("prompt = %#v, want %q", payload["prompt"], request.Prompt) + } + if payload["n"] != float64(2) { + t.Fatalf("n = %#v, want 2", payload["n"]) + } + if payload["aspect_ratio"] != "3:2" { + t.Fatalf("aspect_ratio = %#v, want %q", payload["aspect_ratio"], "3:2") + } + if payload["response_format"] != "url" { + t.Fatalf("response_format = %#v, want %q", payload["response_format"], "url") + } +} + +func TestDoResponseForImageGeneration(t *testing.T) { + t.Parallel() + + gin.SetMode(gin.TestMode) + recorder := httptest.NewRecorder() + c, _ := gin.CreateTestContext(recorder) + + info := &relaycommon.RelayInfo{ + RelayMode: relayconstant.RelayModeImagesGenerations, + StartTime: time.Unix(1700000000, 0), + } + resp := &http.Response{ + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: httptest.NewRecorder().Result().Body, + } + resp.Body = ioNopCloser(`{"data":{"image_urls":["https://example.com/minimax.png"]}}`) + + adaptor := &Adaptor{} + usage, err := adaptor.DoResponse(c, resp, info) + if err != nil { + t.Fatalf("DoResponse returned error: %v", err) + } + if usage == nil { + t.Fatalf("DoResponse returned nil usage") + } + + body := recorder.Body.String() + if !strings.Contains(body, `"url":"https://example.com/minimax.png"`) { + t.Fatalf("response body = %s, want OpenAI image response with image URL", body) + } + if strings.Contains(body, `"image_urls"`) { + t.Fatalf("response body = %s, should not expose raw MiniMax image_urls payload", body) + } +} + +type nopReadCloser struct { + *strings.Reader +} + +func (n nopReadCloser) Close() error { + return nil +} + +func ioNopCloser(body string) nopReadCloser { + return nopReadCloser{Reader: strings.NewReader(body)} +} + +func uintPtr(v uint) *uint { + return &v +} diff --git a/relay/channel/minimax/constants.go b/relay/channel/minimax/constants.go index e48862d6..efdab04c 100644 --- a/relay/channel/minimax/constants.go +++ b/relay/channel/minimax/constants.go @@ -8,6 +8,8 @@ var ModelList = []string{ "abab6-chat", "abab5.5-chat", "abab5.5s-chat", + "MiniMax-M2.7", + "MiniMax-M2.7-highspeed", "speech-2.5-hd-preview", "speech-2.5-turbo-preview", "speech-02-hd", @@ -19,6 +21,8 @@ var ModelList = []string{ "MiniMax-M2", "MiniMax-M2.5", "MiniMax-M2.5-highspeed", + "image-01", + "image-01-live", } var ChannelName = "minimax" diff --git a/relay/channel/minimax/image.go b/relay/channel/minimax/image.go new file mode 100644 index 00000000..9b316bdc --- /dev/null +++ b/relay/channel/minimax/image.go @@ -0,0 +1,213 @@ +package minimax + +import ( + "fmt" + "io" + "net/http" + "strconv" + "strings" + + "github.com/QuantumNous/new-api/common" + "github.com/QuantumNous/new-api/dto" + relaycommon "github.com/QuantumNous/new-api/relay/common" + "github.com/QuantumNous/new-api/service" + "github.com/QuantumNous/new-api/types" + + "github.com/gin-gonic/gin" +) + +type MiniMaxImageRequest struct { + Model string `json:"model"` + Prompt string `json:"prompt"` + AspectRatio string `json:"aspect_ratio,omitempty"` + ResponseFormat string `json:"response_format,omitempty"` + N int `json:"n,omitempty"` + PromptOptimizer *bool `json:"prompt_optimizer,omitempty"` + AigcWatermark *bool `json:"aigc_watermark,omitempty"` +} + +type MiniMaxImageResponse struct { + ID string `json:"id"` + Data struct { + ImageURLs []string `json:"image_urls"` + ImageBase64 []string `json:"image_base64"` + } `json:"data"` + Metadata map[string]any `json:"metadata"` + BaseResp struct { + StatusCode int `json:"status_code"` + StatusMsg string `json:"status_msg"` + } `json:"base_resp"` +} + +func oaiImage2MiniMaxImageRequest(request dto.ImageRequest) MiniMaxImageRequest { + responseFormat := normalizeMiniMaxResponseFormat(request.ResponseFormat) + minimaxRequest := MiniMaxImageRequest{ + Model: request.Model, + Prompt: request.Prompt, + ResponseFormat: responseFormat, + N: 1, + AigcWatermark: request.Watermark, + } + + if request.Model == "" { + minimaxRequest.Model = "image-01" + } + if request.N != nil && *request.N > 0 { + minimaxRequest.N = int(*request.N) + } + if aspectRatio := aspectRatioFromImageRequest(request); aspectRatio != "" { + minimaxRequest.AspectRatio = aspectRatio + } + if raw, ok := request.Extra["prompt_optimizer"]; ok { + var promptOptimizer bool + if err := common.Unmarshal(raw, &promptOptimizer); err == nil { + minimaxRequest.PromptOptimizer = &promptOptimizer + } + } + + return minimaxRequest +} + +func aspectRatioFromImageRequest(request dto.ImageRequest) string { + if raw, ok := request.Extra["aspect_ratio"]; ok { + var aspectRatio string + if err := common.Unmarshal(raw, &aspectRatio); err == nil && aspectRatio != "" { + return aspectRatio + } + } + + switch request.Size { + case "1024x1024": + return "1:1" + case "1792x1024": + return "16:9" + case "1024x1792": + return "9:16" + case "1536x1024", "1248x832": + return "3:2" + case "1024x1536", "832x1248": + return "2:3" + case "1152x864": + return "4:3" + case "864x1152": + return "3:4" + case "1344x576": + return "21:9" + } + + width, height, ok := parseImageSize(request.Size) + if !ok { + return "" + } + ratio := reduceAspectRatio(width, height) + switch ratio { + case "1:1", "16:9", "4:3", "3:2", "2:3", "3:4", "9:16", "21:9": + return ratio + default: + return "" + } +} + +func parseImageSize(size string) (int, int, bool) { + parts := strings.Split(size, "x") + if len(parts) != 2 { + return 0, 0, false + } + width, err := strconv.Atoi(parts[0]) + if err != nil { + return 0, 0, false + } + height, err := strconv.Atoi(parts[1]) + if err != nil { + return 0, 0, false + } + if width <= 0 || height <= 0 { + return 0, 0, false + } + return width, height, true +} + +func reduceAspectRatio(width, height int) string { + divisor := gcd(width, height) + return fmt.Sprintf("%d:%d", width/divisor, height/divisor) +} + +func gcd(a, b int) int { + for b != 0 { + a, b = b, a%b + } + if a == 0 { + return 1 + } + return a +} + +func normalizeMiniMaxResponseFormat(responseFormat string) string { + switch strings.ToLower(responseFormat) { + case "", "url": + return "url" + case "b64_json", "base64": + return "base64" + default: + return responseFormat + } +} + +func responseMiniMax2OpenAIImage(response *MiniMaxImageResponse, info *relaycommon.RelayInfo) (*dto.ImageResponse, error) { + imageResponse := &dto.ImageResponse{ + Created: info.StartTime.Unix(), + } + + for _, imageURL := range response.Data.ImageURLs { + imageResponse.Data = append(imageResponse.Data, dto.ImageData{Url: imageURL}) + } + for _, imageBase64 := range response.Data.ImageBase64 { + imageResponse.Data = append(imageResponse.Data, dto.ImageData{B64Json: imageBase64}) + } + if len(response.Metadata) > 0 { + metadata, err := common.Marshal(response.Metadata) + if err != nil { + return nil, err + } + imageResponse.Metadata = metadata + } + + return imageResponse, nil +} + +func miniMaxImageHandler(c *gin.Context, resp *http.Response, info *relaycommon.RelayInfo) (*dto.Usage, *types.NewAPIError) { + responseBody, err := io.ReadAll(resp.Body) + if err != nil { + return nil, types.NewOpenAIError(err, types.ErrorCodeReadResponseBodyFailed, http.StatusInternalServerError) + } + service.CloseResponseBodyGracefully(resp) + + var minimaxResponse MiniMaxImageResponse + if err := common.Unmarshal(responseBody, &minimaxResponse); err != nil { + return nil, types.NewOpenAIError(err, types.ErrorCodeBadResponseBody, http.StatusInternalServerError) + } + if minimaxResponse.BaseResp.StatusCode != 0 { + return nil, types.WithOpenAIError(types.OpenAIError{ + Message: minimaxResponse.BaseResp.StatusMsg, + Type: "minimax_image_error", + Code: fmt.Sprintf("%d", minimaxResponse.BaseResp.StatusCode), + }, resp.StatusCode) + } + + openAIResponse, err := responseMiniMax2OpenAIImage(&minimaxResponse, info) + if err != nil { + return nil, types.NewError(err, types.ErrorCodeBadResponseBody) + } + jsonResponse, err := common.Marshal(openAIResponse) + if err != nil { + return nil, types.NewError(err, types.ErrorCodeBadResponseBody) + } + + c.Writer.Header().Set("Content-Type", "application/json") + c.Writer.WriteHeader(resp.StatusCode) + if _, err := c.Writer.Write(jsonResponse); err != nil { + return nil, types.NewError(err, types.ErrorCodeBadResponseBody) + } + + return &dto.Usage{}, nil +} diff --git a/relay/channel/minimax/relay-minimax.go b/relay/channel/minimax/relay-minimax.go index c249de6a..a1a05150 100644 --- a/relay/channel/minimax/relay-minimax.go +++ b/relay/channel/minimax/relay-minimax.go @@ -21,6 +21,8 @@ func GetRequestURL(info *relaycommon.RelayInfo) (string, error) { switch info.RelayMode { case constant.RelayModeChatCompletions: return fmt.Sprintf("%s/v1/text/chatcompletion_v2", baseUrl), nil + case constant.RelayModeImagesGenerations: + return fmt.Sprintf("%s/v1/image_generation", baseUrl), nil case constant.RelayModeAudioSpeech: return fmt.Sprintf("%s/v1/t2a_v2", baseUrl), nil default: From 78e4cb3cad1b6afc0b9b8e28ee76b378973a5da7 Mon Sep 17 00:00:00 2001 From: CaIon Date: Wed, 8 Apr 2026 17:09:19 +0800 Subject: [PATCH 25/54] feat(web): redesign group ratio rules with collapsible grouped layout Rewrite GroupGroupRatioRules and GroupSpecialUsableRules to group rules by user group in collapsible sections instead of a flat table. Default collapsed to reduce visual clutter when many rules exist. Fix i18n translations for ja, zh-TW with proper native text; add missing keys. --- web/src/i18n/locales/en.json | 130 +----- web/src/i18n/locales/fr.json | 147 +------ web/src/i18n/locales/ja.json | 149 +------ web/src/i18n/locales/ru.json | 147 +------ web/src/i18n/locales/vi.json | 146 +------ web/src/i18n/locales/zh-TW.json | 226 +---------- .../Ratio/components/GroupGroupRatioRules.jsx | 283 ++++++++----- .../components/GroupSpecialUsableRules.jsx | 375 +++++++++++------- 8 files changed, 462 insertions(+), 1141 deletions(-) diff --git a/web/src/i18n/locales/en.json b/web/src/i18n/locales/en.json index 5835d47b..52ef677f 100644 --- a/web/src/i18n/locales/en.json +++ b/web/src/i18n/locales/en.json @@ -444,7 +444,6 @@ "作用域": "Scope", "作用域:包含分组": "Scope: Include Group", "作用域:包含模型名称": "Scope: Include Model Name", - "开启后,模型名称会参与 cache key(不同模型隔离)。": "When enabled, the model name is included in the cache key (isolates different models).", "作用域:包含规则名称": "Scope: Include Rule Name", "你似乎并没有修改什么": "You seem to have not modified anything", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "You can manually add them under “Custom model names”, click Fill and submit, or use the actions below to handle them automatically.", @@ -774,6 +773,7 @@ "刷新统计": "Refresh Stats", "刷新缓存统计": "Refresh Cache Statistics", "刷新缓存统计失败": "Failed to refresh cache statistics", + "刷新页面": "Reload Page", "前往 io.net API Keys": "Go to io.net API Keys", "前往设置": "Go to Settings", "前往设置页面": "Go to Settings Page", @@ -1363,6 +1363,7 @@ "开启后,将定期发送ping数据保持连接活跃": "After enabling, ping data will be sent periodically to keep the connection active", "开启后,当前分组渠道失败时会按顺序尝试下一个分组的渠道": "After enabling, when the current group channel fails, it will try the next group's channel in order", "开启后,所有请求将直接透传给上游,不会进行任何处理(重定向和渠道适配也将失效),请谨慎开启": "When enabled, all requests will be directly forwarded to the upstream without any processing (redirects and channel adaptation will also be disabled). Please enable with caution.", + "开启后,模型名称会参与 cache key(不同模型隔离)。": "When enabled, the model name is included in the cache key (isolates different models).", "开启后,若该规则命中且请求失败,将不会切换渠道重试。": "When enabled, if this rule matches and the request fails, no channel switch retry will occur.", "开启后,规则名称会参与 cache key(不同规则隔离)。": "When enabled, the rule name will be part of the cache key (isolated by rule).", "开启后,该渠道请求 Claude 时将强制追加 ?beta=true(无需客户端手动传参)": "When enabled, requests to Claude through this channel will force append ?beta=true (no need for clients to pass this parameter manually)", @@ -1901,6 +1902,7 @@ "条件规则": "Condition Rules", "条件项设置": "Condition Item Settings", "条日志已清理!": "logs have been cleared!", + "条规则": "rules", "条,共": "of", "来源": "Source", "来源于 IO.NET 部署": "From IO.NET Deployment", @@ -1988,6 +1990,7 @@ "模型定价,需要登录访问": "Model pricing, requires login to access", "模型广场": "Model Marketplace", "模型拉取失败: {{error}}": "Failed to pull model: {{error}}", + "模型排行": "Model ranking", "模型支持的接口端点信息": "Model supported API endpoint information", "模型数据分析": "Model Data Analysis", "模型映射必须是合法的 JSON 格式!": "Model mapping must be in valid JSON format!", @@ -2146,6 +2149,7 @@ "添加公告": "Add Notice", "添加分类": "Add Category", "添加分组": "Add Group", + "添加分组规则": "Add Group Rules", "添加后提交": "Submit after adding", "添加启动参数": "Add Startup Args", "添加启动命令": "Add Startup Command", @@ -2280,6 +2284,8 @@ "用户每周期最多请求完成次数": "User max successful request times per period", "用户每周期最多请求次数": "User max request times per period", "用户注册时看到的网站名称,比如'我的网站'": "Website name users see during registration, e.g. 'My Website'", + "用户消耗排行": "User consumption ranking", + "用户消耗趋势": "User consumption trend", "用户的基本账户信息": "User basic account information", "用户管理": "User Management", "用户组": "User group", @@ -2370,6 +2376,7 @@ "确认冲突项修改": "Confirm conflict item modification", "确认删除": "Confirm deletion", "确认删除模型": "Confirm Delete Model", + "确认删除该分组的所有规则?": "Delete all rules for this group?", "确认删除该分组?": "Confirm delete this group?", "确认删除该规则?": "Confirm delete this rule?", "确认取消密码登录": "Confirm cancel password login", @@ -3068,9 +3075,6 @@ "调用次数分布": "Models call distribution", "调用次数排行": "Models call ranking", "调用趋势": "Call trend", - "模型排行": "Model ranking", - "用户消耗排行": "User consumption ranking", - "用户消耗趋势": "User consumption trend", "调试信息": "Debug information", "谨慎": "Cautious", "豆包": "Doubao", @@ -3418,6 +3422,7 @@ "音频输出:{{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}}", "页脚": "Footer", "页面未找到,请检查您的浏览器地址是否正确": "Page not found, please check if your browser address is correct", + "页面渲染出错,请刷新页面重试": "An error occurred while rendering the page. Please refresh and try again.", "顶栏管理": "Header Management", "项": "items", "项目": "Project", @@ -3493,123 +3498,6 @@ "默认测试模型": "Default Test Model", "默认用户消息": "Default User Message", "默认补全倍率": "Default completion ratio", - "提示:端点映射仅用于模型广场展示,不会影响模型真实调用。如需配置真实调用,请前往「渠道管理」。": "Notice: Endpoint mapping is for Model Marketplace display only and does not affect real model invocation. To configure real invocation, please go to Channel Management.", - "购买订阅获得模型额度/次数": "Purchase a subscription to get model quota/usage", - "生产环境 RSA 私钥 Base64 (PKCS#8 DER)": "Production RSA private key Base64 (PKCS#8 DER)", - "沙盒环境 RSA 私钥 Base64 (PKCS#8 DER)": "Sandbox RSA private key Base64 (PKCS#8 DER)", - "生产环境 Waffo 公钥 Base64 (X.509 DER)": "Production Waffo public key Base64 (X.509 DER)", - "沙盒环境 Waffo 公钥 Base64 (X.509 DER)": "Sandbox Waffo public key Base64 (X.509 DER)", - "支付方式类型": "Pay Method Type", - "支付方式名称": "Pay Method Name", - "获取充值配置失败": "Failed to get topup configuration", - "获取充值配置异常": "Topup configuration error", - "分组相关设置": "Group Related Settings", - "保存分组相关设置": "Save Group Related Settings", - "此页面仅显示未设置价格或基础倍率的模型,设置后会自动从列表中移出": "This page only shows models without base pricing. After saving, configured models will be removed from this list automatically.", - "没有未设置定价的模型": "No unpriced models", - "当前没有未设置定价的模型": "There are currently no models without pricing", - "模型计费编辑器": "Model Pricing Editor", - "价格摘要": "Price Summary", - "当前提示": "Current Notes", - "这个界面默认按价格填写,保存时会自动换算回后端需要的倍率 JSON。": "This editor uses prices by default and converts them back into the ratio JSON required by the backend when saved.", - "当前未启用,需要时再打开即可。": "This field is currently disabled. Enable it when needed.", - "下面展示这个模型保存后会写入哪些后端字段,便于和原始 JSON 编辑框保持一致。": "The fields below show which backend values will be written after saving, so you can keep them aligned with the raw JSON editors.", - "补全价格已锁定": "Completion price is locked", - "后端固定倍率:{{ratio}}。该字段仅展示换算后的价格。": "Backend fixed ratio: {{ratio}}. This field only displays the converted price.", - "这些价格都是可选项,不填也可以。": "All of these prices are optional and can be left empty.", - "请先开启并填写音频输入价格。": "Enable and fill in the audio input price first.", - "输入模型名称,例如 gpt-4.1": "Enter a model name, for example gpt-4.1", - "当前模型同时存在按次价格和倍率配置,保存时会按当前计费方式覆盖。": "This model currently has both per-request pricing and ratio-based pricing. Saving will overwrite them according to the current billing mode.", - "当前模型存在未显式设置输入倍率的扩展倍率;填写输入价格后会自动换算为价格字段。": "This model has derived ratios without an explicit input ratio. Once you fill in the input price, they will be converted into price fields automatically.", - "按量计费下需要先填写输入价格,才能保存其它价格项。": "For per-token billing, fill in the input price before saving other price fields.", - "填写音频补全价格前,需要先填写音频输入价格。": "Fill in the audio input price before setting the audio completion price.", - "模型 {{name}} 缺少输入价格,无法计算补全/缓存/图片/音频价格对应的倍率": "Model {{name}} is missing an input price, so the ratios for completion, cache, image, and audio pricing cannot be calculated.", - "模型 {{name}} 缺少音频输入价格,无法计算音频补全倍率": "Model {{name}} is missing an audio input price, so the audio completion ratio cannot be calculated.", - "批量应用当前模型价格": "Batch Apply Current Model Pricing", - "请先选择一个作为模板的模型": "Please select a model to use as the template first", - "请先勾选需要批量设置的模型": "Please select the models you want to update in batch first", - "已将模型 {{name}} 的价格配置批量应用到 {{count}} 个模型": "Applied the pricing configuration of model {{name}} to {{count}} models in batch", - "将把当前编辑中的模型 {{name}} 的价格配置,批量应用到已勾选的 {{count}} 个模型。": "The pricing configuration of the currently edited model {{name}} will be applied to the {{count}} selected models.", - "适合同系列模型一起定价,例如把 gpt-5.1 的价格批量同步到 gpt-5.1-high、gpt-5.1-low 等模型。": "Useful for pricing model variants together, for example syncing the pricing of gpt-5.1 to gpt-5.1-high, gpt-5.1-low, and similar models.", - "已勾选": "Selected", - "当前编辑": "Editing", - "已勾选 {{count}} 个模型": "{{count}} models selected", - "计费方式": "Billing Mode", - "未设置价格": "Price not set", - "保存预览": "Save Preview", - "基础价格": "Base Pricing", - "扩展价格": "Additional Pricing", - "额外价格项": "Additional price items", - "补全价格": "Completion Price", - "缓存读取价格": "Input Cache Read Price", - "缓存创建价格": "Input Cache Creation Price", - "图片输入价格": "Image Input Price", - "音频输入价格": "Audio Input Price", - "音频输入价格:{{symbol}}{{price}} / 1M tokens": "Audio input price: {{symbol}}{{price}} / 1M tokens", - "音频补全价格": "Audio Completion Price", - "音频补全价格:{{symbol}}{{price}} / 1M tokens": "Audio completion price: {{symbol}}{{price}} / 1M tokens", - "适合 MJ / 任务类等按次收费模型。": "Suitable for MJ and other task-based models billed per request.", - "该模型补全倍率由后端固定为 {{ratio}}。补全价格不能在这里修改。": "This model's completion ratio is fixed to {{ratio}} by the backend. The completion price cannot be changed here.", - "Web 搜索调用 {{webSearchCallCount}} 次": "Web search called {{webSearchCallCount}} times", - "文件搜索调用 {{fileSearchCallCount}} 次": "File search called {{fileSearchCallCount}} times", - "实际结算金额:{{symbol}}{{total}}(已包含分组价格调整)": "Actual charge: {{symbol}}{{total}} (group pricing adjustment included)", - "图片倍率 {{imageRatio}}": "Image ratio {{imageRatio}}", - "音频倍率 {{audioRatio}}": "Audio ratio {{audioRatio}}", - "普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Standard input: {{tokens}} / 1M * model ratio {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "缓存输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Cached input: {{tokens}} / 1M * model ratio {{modelRatio}} * cache ratio {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 图片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Image input: {{tokens}} / 1M * model ratio {{modelRatio}} * image ratio {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Audio input: {{tokens}} / 1M * model ratio {{modelRatio}} * audio ratio {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Output: {{tokens}} / 1M * model ratio {{modelRatio}} * completion ratio {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "Web 搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Web search: {{count}} / 1K * unit price {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "文件搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "File search: {{count}} / 1K * unit price {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片生成:1 次 * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Image generation: 1 call * unit price {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "合计:{{total}}": "Total: {{total}}", - "模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},音频倍率 {{audioRatio}},音频补全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}": "Model ratio {{modelRatio}}, completion ratio {{completionRatio}}, audio ratio {{audioRatio}}, audio completion ratio {{audioCompletionRatio}}, {{cachePart}}{{ratioType}} {{ratio}}", - "文字输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Text output: {{tokens}} / 1M * model ratio {{modelRatio}} * completion ratio {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输出:{{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}}", - "缓存读取:{{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", - "{{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", - "例如:gpt-4.1-nano,regex:^claude-.*$,regex:^sora-.*$": "Example: gpt-4.1-nano,regex:^claude-.*$,regex:^sora-.*$", - "支持精确匹配;使用 regex: 开头可按正则匹配。": "Supports exact matching. Use a regex: prefix for regex matching.", - "复制密钥": "Copy Key", - "复制连接信息": "Copy Connection String", - "检测到剪贴板中的连接信息": "Connection info detected in clipboard", - "自动填入": "Auto-fill", - "忽略": "Ignore", - "从剪贴板粘贴配置": "Paste Config", - "剪贴板中未检测到连接信息": "No connection info found in clipboard", - "连接信息已填入": "Connection info applied", - "无法读取剪贴板": "Cannot read clipboard", - "页面渲染出错,请刷新页面重试": "An error occurred while rendering the page. Please refresh and try again.", - "刷新页面": "Reload Page", "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(Currently only supports Epay interface, the default callback address is the server address above!)", ",当前无生效订阅,将自动使用钱包": ", no active subscription. Wallet will be used automatically.", ",时间:": ",time:", diff --git a/web/src/i18n/locales/fr.json b/web/src/i18n/locales/fr.json index 0059feee..bbec562f 100644 --- a/web/src/i18n/locales/fr.json +++ b/web/src/i18n/locales/fr.json @@ -439,7 +439,6 @@ "作用域": "Portée", "作用域:包含分组": "Portée : inclure le groupe", "作用域:包含模型名称": "Portée : inclure le nom du modèle", - "开启后,模型名称会参与 cache key(不同模型隔离)。": "Lorsque activé, le nom du modèle est inclus dans la clé de cache (isole les différents modèles).", "作用域:包含规则名称": "Portée : inclure le nom de la règle", "你似乎并没有修改什么": "Vous ne semblez rien avoir modifié", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "Vous pouvez les ajouter manuellement dans « Noms de modèles personnalisés », cliquer sur Remplir puis soumettre, ou utiliser directement les actions ci-dessous pour les traiter automatiquement.", @@ -770,6 +769,7 @@ "刷新统计": "Actualiser les statistiques", "刷新缓存统计": "Actualiser les statistiques du cache", "刷新缓存统计失败": "Échec de l'actualisation des statistiques du cache", + "刷新页面": "Recharger la page", "前往 io.net API Keys": "Go to io.net API Keys", "前往设置": "Go to Settings", "前往设置页面": "Go to Settings Page", @@ -1362,6 +1362,7 @@ "开启后,将定期发送ping数据保持连接活跃": "Après activation, des données ping seront envoyées périodiquement pour maintenir la connexion active", "开启后,当前分组渠道失败时会按顺序尝试下一个分组的渠道": "Après activation, lorsque le canal du groupe actuel échoue, il essaiera le canal du groupe suivant dans l'ordre", "开启后,所有请求将直接透传给上游,不会进行任何处理(重定向和渠道适配也将失效),请谨慎开启": "Après activation, toutes les requêtes seront directement transmises en amont sans aucun traitement (la redirection et l'adaptation de canal seront également désactivées), veuillez activer avec prudence", + "开启后,模型名称会参与 cache key(不同模型隔离)。": "Lorsque activé, le nom du modèle est inclus dans la clé de cache (isole les différents modèles).", "开启后,若该规则命中且请求失败,将不会切换渠道重试。": "Une fois activé, si cette règle est déclenchée et que la requête échoue, aucune nouvelle tentative sur un autre canal ne sera effectuée.", "开启后,规则名称会参与 cache key(不同规则隔离)。": "Une fois activé, le nom de la règle fera partie de la clé de cache (isolation par règle).", "开启后,该渠道请求 Claude 时将强制追加 ?beta=true(无需客户端手动传参)": "Une fois activé, les requêtes à Claude via ce canal ajouteront automatiquement ?beta=true (pas besoin de le passer manuellement côté client)", @@ -1885,6 +1886,7 @@ "条件规则": "Règles de condition", "条件项设置": "Paramètres des éléments de condition", "条日志已清理!": "les journaux ont été effacés !", + "条规则": "rules", "条,共": "sur", "来源": "Source", "来源于 IO.NET 部署": "From IO.NET Deployment", @@ -1970,6 +1972,7 @@ "模型定价,需要登录访问": "Tarification du modèle, nécessite une connexion pour y accéder", "模型广场": "Marché des modèles", "模型拉取失败: {{error}}": "Failed to pull model: {{error}}", + "模型排行": "Classement des modèles", "模型支持的接口端点信息": "Informations sur les points de terminaison de l'API pris en charge par le modèle", "模型数据分析": "Analyse des données du modèle", "模型映射必须是合法的 JSON 格式!": "Le mappage de modèles doit être au format JSON valide !", @@ -2125,6 +2128,7 @@ "添加公告": "Ajouter un avis", "添加分类": "Ajouter une catégorie", "添加分组": "Add Group", + "添加分组规则": "Add Group Rules", "添加后提交": "Soumettre après ajout", "添加启动参数": "Add Startup Args", "添加启动命令": "Add Startup Command", @@ -2255,6 +2259,8 @@ "用户每周期最多请求完成次数": "Nombre maximal de requêtes utilisateur réussies par période", "用户每周期最多请求次数": "Nombre maximal de requêtes utilisateur par période", "用户注册时看到的网站名称,比如'我的网站'": "Nom du site Web que les utilisateurs voient lors de l'inscription, par exemple 'Mon site Web'", + "用户消耗排行": "Classement de consommation des utilisateurs", + "用户消耗趋势": "Tendance de consommation des utilisateurs", "用户的基本账户信息": "Informations de base du compte utilisateur", "用户管理": "Utilisateurs", "用户组": "Groupe d'utilisateurs", @@ -2346,6 +2352,7 @@ "确认冲突项修改": "Confirmer la modification de l'élément de conflit", "确认删除": "Confirmer la suppression", "确认删除模型": "Confirm Delete Model", + "确认删除该分组的所有规则?": "Delete all rules for this group?", "确认删除该分组?": "Confirm delete this group?", "确认删除该规则?": "Confirm delete this rule?", "确认取消密码登录": "Confirmer l'annulation de la connexion par mot de passe", @@ -3041,9 +3048,6 @@ "调用次数分布": "Distribution des appels de modèles", "调用次数排行": "Classement des appels de modèles", "调用趋势": "Tendance des appels", - "模型排行": "Classement des modèles", - "用户消耗排行": "Classement de consommation des utilisateurs", - "用户消耗趋势": "Tendance de consommation des utilisateurs", "调试信息": "Informations de débogage", "谨慎": "Prudent", "豆包": "Doubao", @@ -3383,6 +3387,7 @@ "音频输出:{{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}}", "页脚": "Pied de page", "页面未找到,请检查您的浏览器地址是否正确": "Page non trouvée, veuillez vérifier si l'adresse de votre navigateur est correcte", + "页面渲染出错,请刷新页面重试": "Une erreur est survenue lors du rendu de la page. Veuillez rafraîchir et réessayer.", "顶栏管理": "En-tête", "项": "éléments", "项目": "Élément", @@ -3449,140 +3454,6 @@ "默认测试模型": "Modèle de test par défaut", "默认用户消息": "Bonjour", "默认补全倍率": "Taux de complétion par défaut", - "提示:端点映射仅用于模型广场展示,不会影响模型真实调用。如需配置真实调用,请前往「渠道管理」。": "Remarque : la correspondance des endpoints sert uniquement à l'affichage dans la place de marché des modèles et n'affecte pas l'invocation réelle. Pour configurer l'invocation réelle, veuillez aller dans « Gestion des canaux ».", - "购买订阅获得模型额度/次数": "Acheter un abonnement pour obtenir des quotas/usages de modèles", - "生产环境 RSA 私钥 Base64 (PKCS#8 DER)": "Clé privée RSA Base64 (PKCS#8 DER) de production", - "沙盒环境 RSA 私钥 Base64 (PKCS#8 DER)": "Clé privée RSA Base64 (PKCS#8 DER) de sandbox", - "生产环境 Waffo 公钥 Base64 (X.509 DER)": "Clé publique Waffo Base64 (X.509 DER) de production", - "沙盒环境 Waffo 公钥 Base64 (X.509 DER)": "Clé publique Waffo Base64 (X.509 DER) de sandbox", - "支付方式类型": "Type de méthode de paiement", - "支付方式名称": "Nom de méthode de paiement", - "获取充值配置失败": "Échec de la récupération de la configuration de recharge", - "获取充值配置异常": "Erreur de configuration de recharge", - "分组相关设置": "Paramètres liés aux groupes", - "保存分组相关设置": "Enregistrer les paramètres liés aux groupes", - "此页面仅显示未设置价格或基础倍率的模型,设置后会自动从列表中移出": "Cette page n'affiche que les modèles sans prix ou ratio de base. Après enregistrement, ils seront retirés automatiquement de cette liste.", - "没有未设置定价的模型": "Aucun modèle sans prix", - "当前没有未设置定价的模型": "Il n'y a actuellement aucun modèle sans prix", - "模型计费编辑器": "Éditeur de tarification des modèles", - "价格摘要": "Résumé des prix", - "当前提示": "Informations actuelles", - "这个界面默认按价格填写,保存时会自动换算回后端需要的倍率 JSON。": "Cette interface utilise les prix par défaut et les reconvertit automatiquement en JSON de ratios requis par le backend lors de l'enregistrement.", - "当前未启用,需要时再打开即可。": "Ce champ est actuellement désactivé. Activez-le si nécessaire.", - "下面展示这个模型保存后会写入哪些后端字段,便于和原始 JSON 编辑框保持一致。": "Les champs backend écrits après l'enregistrement sont affichés ci-dessous afin de rester cohérents avec les éditeurs JSON bruts.", - "补全价格已锁定": "Le prix de complétion est verrouillé", - "后端固定倍率:{{ratio}}。该字段仅展示换算后的价格。": "Ratio fixé par le backend : {{ratio}}. Ce champ affiche uniquement le prix converti.", - "这些价格都是可选项,不填也可以。": "Tous ces prix sont optionnels et peuvent être laissés vides.", - "请先开启并填写音频输入价格。": "Activez et renseignez d'abord le prix d'entrée audio.", - "输入模型名称,例如 gpt-4.1": "Saisissez un nom de modèle, par exemple gpt-4.1", - "当前模型同时存在按次价格和倍率配置,保存时会按当前计费方式覆盖。": "Ce modèle possède actuellement à la fois une tarification par requête et une configuration par ratio. L'enregistrement écrasera selon le mode de facturation actuel.", - "当前模型存在未显式设置输入倍率的扩展倍率;填写输入价格后会自动换算为价格字段。": "Ce modèle contient des ratios étendus sans ratio d'entrée explicite. Après saisie du prix d'entrée, ils seront convertis automatiquement en champs de prix.", - "按量计费下需要先填写输入价格,才能保存其它价格项。": "En facturation au volume, il faut d'abord renseigner le prix d'entrée avant d'enregistrer les autres prix.", - "填写音频补全价格前,需要先填写音频输入价格。": "Renseignez d'abord le prix d'entrée audio avant de définir le prix de complétion audio.", - "模型 {{name}} 缺少输入价格,无法计算补全/缓存/图片/音频价格对应的倍率": "Le modèle {{name}} n'a pas de prix d'entrée, impossible de calculer les ratios correspondants pour la complétion, le cache, les images et l'audio.", - "模型 {{name}} 缺少音频输入价格,无法计算音频补全倍率": "Le modèle {{name}} n'a pas de prix d'entrée audio, impossible de calculer le ratio de complétion audio.", - "批量应用当前模型价格": "Appliquer en lot le prix du modèle actuel", - "请先选择一个作为模板的模型": "Veuillez d'abord choisir un modèle comme modèle de référence", - "请先勾选需要批量设置的模型": "Veuillez d'abord sélectionner les modèles à configurer en lot", - "已将模型 {{name}} 的价格配置批量应用到 {{count}} 个模型": "La configuration tarifaire du modèle {{name}} a été appliquée à {{count}} modèles en lot", - "将把当前编辑中的模型 {{name}} 的价格配置,批量应用到已勾选的 {{count}} 个模型。": "La configuration tarifaire du modèle actuellement édité {{name}} sera appliquée aux {{count}} modèles sélectionnés.", - "适合同系列模型一起定价,例如把 gpt-5.1 的价格批量同步到 gpt-5.1-high、gpt-5.1-low 等模型。": "Pratique pour tarifer ensemble des variantes d'un même modèle, par exemple synchroniser le prix de gpt-5.1 vers gpt-5.1-high, gpt-5.1-low et autres variantes similaires.", - "已勾选": "Sélectionné", - "当前编辑": "En cours d'édition", - "已勾选 {{count}} 个模型": "{{count}} modèles sélectionnés", - "计费方式": "Mode de facturation", - "未设置价格": "Prix non défini", - "保存预览": "Aperçu avant enregistrement", - "基础价格": "Prix de base", - "扩展价格": "Prix supplémentaires", - "额外价格项": "Éléments de prix supplémentaires", - "补全价格": "Prix de complétion", - "缓存读取价格": "Prix de lecture du cache d'entrée", - "缓存创建价格": "Prix de création du cache d'entrée", - "图片输入价格": "Prix d'entrée image", - "音频输入价格": "Prix d'entrée audio", - "音频补全价格": "Prix de complétion audio", - "适合 MJ / 任务类等按次收费模型。": "Convient aux modèles MJ et autres modèles facturés à la requête.", - "该模型补全倍率由后端固定为 {{ratio}}。补全价格不能在这里修改。": "Le ratio de complétion de ce modèle est fixé à {{ratio}} par le backend. Le prix de complétion ne peut pas être modifié ici.", - "计费显示模式": "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", - "缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Prix de création du cache : {{symbol}}{{price}} / 1M tokens", - "缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Prix de création du cache {{symbol}}{{price}} / 1M tokens", - "5m缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Prix de création du cache 5m : {{symbol}}{{price}} / 1M tokens", - "5m缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Prix de création du cache 5m {{symbol}}{{price}} / 1M tokens", - "1h缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Prix de création du cache 1h : {{symbol}}{{price}} / 1M tokens", - "1h缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Prix de création du cache 1h {{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 image {{symbol}}{{price}} / 1M tokens", - "输入价格 {{symbol}}{{price}} / 1M tokens": "Prix d'entrée {{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", - "文件搜索调用 {{fileSearchCallCount}} 次": "Recherche de fichier appelée {{fileSearchCallCount}} fois", - "图片倍率 {{imageRatio}}": "Ratio d'image {{imageRatio}}", - "音频倍率 {{audioRatio}}": "Ratio audio {{audioRatio}}", - "普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Entrée standard : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "缓存输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Entrée en cache : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * ratio du cache {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 图片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Entrée d'image : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * ratio d'image {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Entrée audio : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * ratio audio {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Sortie : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * ratio de complétion {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "Web 搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Recherche Web : {{count}} / 1K * prix unitaire {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "文件搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Recherche de fichier : {{count}} / 1K * prix unitaire {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片生成:1 次 * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Génération d'image : 1 appel * prix unitaire {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "合计:{{total}}": "Total : {{total}}", - "模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},音频倍率 {{audioRatio}},音频补全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}": "Ratio du modèle {{modelRatio}}, ratio de complétion {{completionRatio}}, ratio audio {{audioRatio}}, ratio de complétion audio {{audioCompletionRatio}}, {{cachePart}}{{ratioType}} {{ratio}}", - "文字输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Sortie texte : {{tokens}} / 1M * ratio du modèle {{modelRatio}} * ratio de complétion {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输出:{{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}}", - "缓存读取:{{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", - "{{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", - "复制密钥": "Copier la clé", - "复制连接信息": "Copier les infos de connexion", - "检测到剪贴板中的连接信息": "Informations de connexion détectées dans le presse-papiers", - "自动填入": "Remplir auto", - "忽略": "Ignorer", - "从剪贴板粘贴配置": "Coller la config", - "剪贴板中未检测到连接信息": "Aucune info de connexion trouvée dans le presse-papiers", - "连接信息已填入": "Informations de connexion appliquées", - "无法读取剪贴板": "Impossible de lire le presse-papiers", - "页面渲染出错,请刷新页面重试": "Une erreur est survenue lors du rendu de la page. Veuillez rafraîchir et réessayer.", - "刷新页面": "Recharger la page", "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(Actuellement, seule l'interface Epay est prise en charge, l'adresse du serveur ci-dessus est utilisée par défaut comme adresse de rappel !)", ",当前无生效订阅,将自动使用钱包": ", aucun abonnement actif, le portefeuille sera utilisé automatiquement.", ",时间:": ", time:", diff --git a/web/src/i18n/locales/ja.json b/web/src/i18n/locales/ja.json index 782755ed..11ac9365 100644 --- a/web/src/i18n/locales/ja.json +++ b/web/src/i18n/locales/ja.json @@ -435,7 +435,6 @@ "作用域": "スコープ", "作用域:包含分组": "スコープ:グループを含む", "作用域:包含模型名称": "スコープ:モデル名を含む", - "开启后,模型名称会参与 cache key(不同模型隔离)。": "有効にすると、モデル名がキャッシュキーに含まれます(異なるモデルを分離)。", "作用域:包含规则名称": "スコープ:ルール名を含む", "你似乎并没有修改什么": "何も変更されていないようです", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "You can manually add them under “Custom model names”, click Fill and submit, or use the actions below to handle them automatically.", @@ -518,7 +517,7 @@ "保存 Turnstile 设置": "Turnstile 設定を保存", "保存 WeChat Server 设置": "WeChatサーバー設定を保存", "保存分组倍率设置": "グループ倍率設定を保存", - "保存分组相关设置": "グループ設定を保存", + "保存分组相关设置": "グループ関連設定を保存", "保存备用码": "バックアップコード", "保存备用码以备不时之需": "万一に備え保存", "保存失败": "保存に失敗しました", @@ -761,6 +760,7 @@ "刷新统计": "統計を更新", "刷新缓存统计": "キャッシュ統計を更新", "刷新缓存统计失败": "キャッシュ統計の更新に失敗しました", + "刷新页面": "ページを更新", "前往 io.net API Keys": "Go to io.net API Keys", "前往设置": "Go to Settings", "前往设置页面": "Go to Settings Page", @@ -1345,6 +1345,7 @@ "开启后,将定期发送ping数据保持连接活跃": "有効にすると、接続をアクティブに保つためにpingデータが定期的に送信されます", "开启后,当前分组渠道失败时会按顺序尝试下一个分组的渠道": "有効にすると、現在のグループチャネルが失敗した場合、次のグループのチャネルを順番に試行します", "开启后,所有请求将直接透传给上游,不会进行任何处理(重定向和渠道适配也将失效),请谨慎开启": "有効にすると、すべてのリクエストは直接アップストリームにパススルーされ、いかなる処理も行われません(リダイレクトとチャネルの自動調整も無効になります)。有効にする際はご注意ください", + "开启后,模型名称会参与 cache key(不同模型隔离)。": "有効にすると、モデル名がキャッシュキーに含まれます(異なるモデルを分離)。", "开启后,若该规则命中且请求失败,将不会切换渠道重试。": "有効にすると、このルールがヒットしてリクエストが失敗した場合、チャネル切り替えリトライは行われません。", "开启后,规则名称会参与 cache key(不同规则隔离)。": "有効にすると、ルール名がキャッシュキーに含まれます(ルールごとに隔離)。", "开启后,该渠道请求 Claude 时将强制追加 ?beta=true(无需客户端手动传参)": "有効にすると、このチャネルでClaudeにリクエストする際に?beta=trueが強制追加されます(クライアント側で手動パラメータ渡し不要)", @@ -1868,6 +1869,7 @@ "条件规则": "条件ルール", "条件项设置": "条件項目設定", "条日志已清理!": "件のログがクリアされました", + "条规则": "件のルール", "条,共": "件、合計", "来源": "ソース", "来源于 IO.NET 部署": "From IO.NET Deployment", @@ -1953,6 +1955,7 @@ "模型定价,需要登录访问": "モデル料金(アクセスにはログインが必要です)", "模型广场": "モデルマーケットプレイス", "模型拉取失败: {{error}}": "Failed to pull model: {{error}}", + "模型排行": "モデルランキング", "模型支持的接口端点信息": "モデルが対応するAPIエンドポイント情報", "模型数据分析": "モデルデータ分析", "模型映射必须是合法的 JSON 格式!": "モデルマッピングは、有効なJSON形式である必要があります", @@ -2108,6 +2111,7 @@ "添加公告": "お知らせ追加", "添加分类": "分類追加", "添加分组": "グループを追加", + "添加分组规则": "グループルールを追加", "添加后提交": "Submit after adding", "添加启动参数": "Add Startup Args", "添加启动命令": "Add Startup Command", @@ -2238,6 +2242,8 @@ "用户每周期最多请求完成次数": "期間ごとのユーザー最大成功リクエスト数", "用户每周期最多请求次数": "期間ごとのユーザー最大リクエスト数", "用户注册时看到的网站名称,比如'我的网站'": "ユーザーがサインアップ時に表示されるウェブサイト名です。例:「マイサイト」", + "用户消耗排行": "ユーザー消費ランキング", + "用户消耗趋势": "ユーザー消費推移", "用户的基本账户信息": "ユーザーの基本アカウント情報", "用户管理": "ユーザー管理", "用户组": "ユーザーグループ", @@ -2327,6 +2333,7 @@ "确认冲突项修改": "競合項目の変更の確認", "确认删除": "削除の確認", "确认删除模型": "Confirm Delete Model", + "确认删除该分组的所有规则?": "このグループの全ルールを削除しますか?", "确认删除该分组?": "このグループを削除しますか?", "确认删除该规则?": "このルールを削除しますか?", "确认取消密码登录": "パスワードログイン無効化の確認", @@ -3022,9 +3029,6 @@ "调用次数分布": "呼び出し回数分布", "调用次数排行": "呼び出し回数ランキング", "调用趋势": "呼び出し推移", - "模型排行": "モデルランキング", - "用户消耗排行": "ユーザー消費ランキング", - "用户消耗趋势": "ユーザー消費推移", "调试信息": "デバッグ情報", "谨慎": "注意", "豆包": "豆包", @@ -3364,6 +3368,7 @@ "音频输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * 音频补全倍率 {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "音声出力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * 音声倍率 {{audioRatio}} * 音声補完倍率 {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "页脚": "フッター", "页面未找到,请检查您的浏览器地址是否正确": "ページが見つかりませんでした。ブラウザのアドレスが正しいかご確認ください", + "页面渲染出错,请刷新页面重试": "ページのレンダリング中にエラーが発生しました。ページを更新して再試行してください。", "顶栏管理": "トップバー管理", "项": "件", "项目": "プロジェクト", @@ -3430,140 +3435,6 @@ "默认测试模型": "デフォルトテストモデル", "默认用户消息": "こんにちは", "默认补全倍率": "デフォルト補完倍率", - "提示:端点映射仅用于模型广场展示,不会影响模型真实调用。如需配置真实调用,请前往「渠道管理」。": "注意: エンドポイントマッピングは「モデル広場」での表示専用で、実際の呼び出しには影響しません。実際の呼び出し設定は「チャネル管理」で行ってください。", - "购买订阅获得模型额度/次数": "サブスクリプション購入でモデルのクォータ/回数を取得", - "生产环境 RSA 私钥 Base64 (PKCS#8 DER)": "本番環境 RSA 秘密鍵 Base64 (PKCS#8 DER)", - "沙盒环境 RSA 私钥 Base64 (PKCS#8 DER)": "サンドボックス RSA 秘密鍵 Base64 (PKCS#8 DER)", - "生产环境 Waffo 公钥 Base64 (X.509 DER)": "本番環境 Waffo 公開鍵 Base64 (X.509 DER)", - "沙盒环境 Waffo 公钥 Base64 (X.509 DER)": "サンドボックス Waffo 公開鍵 Base64 (X.509 DER)", - "支付方式类型": "決済方法タイプ", - "支付方式名称": "決済方法名", - "获取充值配置失败": "チャージ設定の取得に失敗しました", - "获取充值配置异常": "チャージ設定エラー", - "分组相关设置": "グループ関連設定", - "保存分组相关设置": "グループ関連設定を保存", - "此页面仅显示未设置价格或基础倍率的模型,设置后会自动从列表中移出": "このページには価格または基本倍率が未設定のモデルのみ表示され、設定後は一覧から自動的に消えます。", - "没有未设置定价的模型": "価格未設定のモデルはありません", - "当前没有未设置定价的模型": "現在、価格未設定のモデルはありません", - "模型计费编辑器": "モデル料金エディタ", - "价格摘要": "価格概要", - "当前提示": "現在のヒント", - "这个界面默认按价格填写,保存时会自动换算回后端需要的倍率 JSON。": "この画面では価格を基準に入力し、保存時にバックエンドが必要とする倍率 JSON に自動変換されます。", - "当前未启用,需要时再打开即可。": "この項目は現在無効です。必要なときに有効にしてください。", - "下面展示这个模型保存后会写入哪些后端字段,便于和原始 JSON 编辑框保持一致。": "保存後にこのモデルでどのバックエンド項目に書き込まれるかを以下に表示します。元の JSON エディタとの整合確認に便利です。", - "补全价格已锁定": "補完価格はロックされています", - "后端固定倍率:{{ratio}}。该字段仅展示换算后的价格。": "バックエンド固定倍率: {{ratio}}。この項目は変換後の価格表示のみです。", - "这些价格都是可选项,不填也可以。": "これらの価格はすべて任意項目で、未入力でも構いません。", - "请先开启并填写音频输入价格。": "先に音声入力価格を有効にして入力してください。", - "输入模型名称,例如 gpt-4.1": "モデル名を入力してください。例: gpt-4.1", - "当前模型同时存在按次价格和倍率配置,保存时会按当前计费方式覆盖。": "このモデルには従量価格と倍率設定が同時に存在しています。保存すると現在の課金方式に従って上書きされます。", - "当前模型存在未显式设置输入倍率的扩展倍率;填写输入价格后会自动换算为价格字段。": "このモデルには入力倍率が明示されていない拡張倍率があります。入力価格を設定すると価格項目へ自動換算されます。", - "按量计费下需要先填写输入价格,才能保存其它价格项。": "従量課金では、他の価格項目を保存する前に入力価格を設定する必要があります。", - "填写音频补全价格前,需要先填写音频输入价格。": "音声補完価格を入力する前に、先に音声入力価格を入力してください。", - "模型 {{name}} 缺少输入价格,无法计算补全/缓存/图片/音频价格对应的倍率": "モデル {{name}} に入力価格がないため、補完・キャッシュ・画像・音声価格に対応する倍率を計算できません。", - "模型 {{name}} 缺少音频输入价格,无法计算音频补全倍率": "モデル {{name}} に音声入力価格がないため、音声補完倍率を計算できません。", - "批量应用当前模型价格": "現在のモデル価格を一括適用", - "请先选择一个作为模板的模型": "まずテンプレートとして使うモデルを選択してください", - "请先勾选需要批量设置的模型": "一括設定したいモデルを先に選択してください", - "已将模型 {{name}} 的价格配置批量应用到 {{count}} 个模型": "モデル {{name}} の価格設定を {{count}} 個のモデルに一括適用しました", - "将把当前编辑中的模型 {{name}} 的价格配置,批量应用到已勾选的 {{count}} 个模型。": "現在編集中のモデル {{name}} の価格設定を、選択済みの {{count}} 個のモデルに一括適用します。", - "适合同系列模型一起定价,例如把 gpt-5.1 的价格批量同步到 gpt-5.1-high、gpt-5.1-low 等模型。": "同系列モデルをまとめて価格設定するのに適しています。例えば gpt-5.1 の価格を gpt-5.1-high、gpt-5.1-low などへ一括同期できます。", - "已勾选": "選択済み", - "当前编辑": "編集中", - "已勾选 {{count}} 个模型": "{{count}} 個のモデルを選択済み", - "计费方式": "課金方式", - "未设置价格": "価格未設定", - "保存预览": "保存プレビュー", - "基础价格": "基本価格", - "扩展价格": "追加価格", - "额外价格项": "追加価格項目", - "补全价格": "補完価格", - "缓存读取价格": "入力キャッシュ読み取り価格", - "缓存创建价格": "入力キャッシュ作成価格", - "图片输入价格": "画像入力価格", - "音频输入价格": "音声入力価格", - "音频补全价格": "音声補完価格", - "适合 MJ / 任务类等按次收费模型。": "MJ やその他のリクエスト単位課金モデルに適しています。", - "该模型补全倍率由后端固定为 {{ratio}}。补全价格不能在这里修改。": "このモデルの補完倍率はバックエンドで {{ratio}} に固定されています。ここでは補完価格を変更できません。", - "计费显示模式": "課金表示モード", - "价格模式(默认)": "価格モード(デフォルト)", - "模型价格 {{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", - "缓存创建价格:{{symbol}}{{price}} / 1M tokens": "キャッシュ作成価格:{{symbol}}{{price}} / 1M tokens", - "缓存创建价格 {{symbol}}{{price}} / 1M tokens": "キャッシュ作成価格 {{symbol}}{{price}} / 1M tokens", - "5m缓存创建价格:{{symbol}}{{price}} / 1M tokens": "5m キャッシュ作成価格:{{symbol}}{{price}} / 1M tokens", - "5m缓存创建价格 {{symbol}}{{price}} / 1M tokens": "5m キャッシュ作成価格 {{symbol}}{{price}} / 1M tokens", - "1h缓存创建价格:{{symbol}}{{price}} / 1M tokens": "1h キャッシュ作成価格:{{symbol}}{{price}} / 1M tokens", - "1h缓存创建价格 {{symbol}}{{price}} / 1M tokens": "1h キャッシュ作成価格 {{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}} 回", - "文件搜索调用 {{fileSearchCallCount}} 次": "ファイル検索呼び出し {{fileSearchCallCount}} 回", - "图片倍率 {{imageRatio}}": "画像倍率 {{imageRatio}}", - "音频倍率 {{audioRatio}}": "音声倍率 {{audioRatio}}", - "普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "通常入力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "缓存输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "キャッシュ入力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * キャッシュ倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 图片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "画像入力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * 画像倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "音声入力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * 音声倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "出力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * 補完倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "Web 搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Web 検索: {{count}} / 1K * 単価 {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "文件搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "ファイル検索: {{count}} / 1K * 単価 {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片生成:1 次 * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "画像生成: 1 回 * 単価 {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "合计:{{total}}": "合計: {{total}}", - "模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},音频倍率 {{audioRatio}},音频补全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}": "モデル倍率 {{modelRatio}}、補完倍率 {{completionRatio}}、音声倍率 {{audioRatio}}、音声補完倍率 {{audioCompletionRatio}}、{{cachePart}}{{ratioType}} {{ratio}}", - "文字输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "テキスト出力: {{tokens}} / 1M * モデル倍率 {{modelRatio}} * 補完倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输出:{{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}}", - "缓存读取:{{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", - "复制密钥": "キーをコピー", - "复制连接信息": "接続情報をコピー", - "检测到剪贴板中的连接信息": "クリップボードに接続情報が検出されました", - "自动填入": "自動入力", - "忽略": "無視", - "从剪贴板粘贴配置": "クリップボードから貼り付け", - "剪贴板中未检测到连接信息": "クリップボードに接続情報が見つかりません", - "连接信息已填入": "接続情報を入力しました", - "无法读取剪贴板": "クリップボードを読み取れません", - "页面渲染出错,请刷新页面重试": "ページのレンダリング中にエラーが発生しました。ページを更新して再試行してください。", - "刷新页面": "ページを更新", "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(現在、Epay APIのみに対応しています。デフォルトで、上記のサーバーURLがコールバックアドレスとして使用されます。)", ",当前无生效订阅,将自动使用钱包": "、有効なサブスクリプションがないため、自動的にウォレットを使用します", ",时间:": "、時間:", diff --git a/web/src/i18n/locales/ru.json b/web/src/i18n/locales/ru.json index 016eab2a..aa7127b7 100644 --- a/web/src/i18n/locales/ru.json +++ b/web/src/i18n/locales/ru.json @@ -442,7 +442,6 @@ "作用域": "Область действия", "作用域:包含分组": "Область действия: включить группу", "作用域:包含模型名称": "Область действия: включить имя модели", - "开启后,模型名称会参与 cache key(不同模型隔离)。": "При включении имя модели включается в ключ кэша (изолирует разные модели).", "作用域:包含规则名称": "Область действия: включить имя правила", "你似乎并没有修改什么": "Похоже, вы ничего не изменили", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "Вы можете добавить их вручную в разделе «Пользовательские названия моделей», нажать «Заполнить», затем отправить или воспользоваться действиями ниже для автоматической обработки.", @@ -776,6 +775,7 @@ "刷新统计": "Обновить статистику", "刷新缓存统计": "Обновить статистику кэша", "刷新缓存统计失败": "Не удалось обновить статистику кэша", + "刷新页面": "Обновить страницу", "前往 io.net API Keys": "Go to io.net API Keys", "前往设置": "Go to Settings", "前往设置页面": "Go to Settings Page", @@ -1374,6 +1374,7 @@ "开启后,将定期发送ping数据保持连接活跃": "После включения будет периодически отправляться ping-данные для поддержания активности соединения", "开启后,当前分组渠道失败时会按顺序尝试下一个分组的渠道": "После включения, когда канал текущей группы не работает, он будет пытаться использовать канал следующей группы по порядку", "开启后,所有请求将直接透传给上游,不会进行任何处理(重定向和渠道适配也将失效),请谨慎开启": "После включения все запросы будут напрямую передаваться upstream без какой-либо обработки (перенаправление и адаптация каналов также будут отключены), включайте с осторожностью", + "开启后,模型名称会参与 cache key(不同模型隔离)。": "При включении имя модели включается в ключ кэша (изолирует разные модели).", "开启后,若该规则命中且请求失败,将不会切换渠道重试。": "При включении, если правило сработало и запрос не удался, переключение канала для повтора не выполняется.", "开启后,规则名称会参与 cache key(不同规则隔离)。": "При включении имя правила будет частью ключа кэша (изоляция по правилам).", "开启后,该渠道请求 Claude 时将强制追加 ?beta=true(无需客户端手动传参)": "При включении запросы к Claude через этот канал будут принудительно дополнены ?beta=true (клиенту не нужно передавать этот параметр вручную)", @@ -1897,6 +1898,7 @@ "条件规则": "Правила условий", "条件项设置": "Настройки элементов условий", "条日志已清理!": "записей журнала очищено!", + "条规则": "rules", "条,共": "записей, всего", "来源": "Источник", "来源于 IO.NET 部署": "From IO.NET Deployment", @@ -1982,6 +1984,7 @@ "模型定价,需要登录访问": "Ценообразование моделей, требуется вход для доступа", "模型广场": "Площадка моделей", "模型拉取失败: {{error}}": "Failed to pull model: {{error}}", + "模型排行": "Рейтинг моделей", "模型支持的接口端点信息": "Информация о конечных точках интерфейса, поддерживаемых моделью", "模型数据分析": "Анализ данных моделей", "模型映射必须是合法的 JSON 格式!": "Сопоставление моделей должно быть в допустимом формате JSON!", @@ -2137,6 +2140,7 @@ "添加公告": "Добавить объявление", "添加分类": "Добавить категорию", "添加分组": "Add Group", + "添加分组规则": "Add Group Rules", "添加后提交": "Отправить после добавления", "添加启动参数": "Add Startup Args", "添加启动命令": "Add Startup Command", @@ -2267,6 +2271,8 @@ "用户每周期最多请求完成次数": "Максимальное количество выполненных запросов пользователя за период", "用户每周期最多请求次数": "Максимальное количество запросов пользователя за период", "用户注册时看到的网站名称,比如'我的网站'": "Название сайта, которое видят пользователи при регистрации, например 'Мой сайт'", + "用户消耗排行": "Рейтинг потребления пользователей", + "用户消耗趋势": "Тенденция потребления пользователей", "用户的基本账户信息": "Основная информация об аккаунте пользователя", "用户管理": "Управление пользователями", "用户组": "Группа пользователей", @@ -2360,6 +2366,7 @@ "确认冲突项修改": "Подтвердить изменение конфликтующих элементов", "确认删除": "Подтвердить удаление", "确认删除模型": "Confirm Delete Model", + "确认删除该分组的所有规则?": "Delete all rules for this group?", "确认删除该分组?": "Confirm delete this group?", "确认删除该规则?": "Confirm delete this rule?", "确认取消密码登录": "Подтвердить отмену входа по паролю", @@ -3055,9 +3062,6 @@ "调用次数分布": "Распределение количества вызовов", "调用次数排行": "Рейтинг количества вызовов", "调用趋势": "Тенденция вызовов", - "模型排行": "Рейтинг моделей", - "用户消耗排行": "Рейтинг потребления пользователей", - "用户消耗趋势": "Тенденция потребления пользователей", "调试信息": "Отладочная информация", "谨慎": "Осторожно", "豆包": "Doubao", @@ -3397,6 +3401,7 @@ "音频输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * 音频补全倍率 {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Аудиовывод: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * аудио-коэффициент {{audioRatio}} * коэффициент аудиозавершения {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "页脚": "Подвал", "页面未找到,请检查您的浏览器地址是否正确": "Страница не найдена, пожалуйста, проверьте правильность адреса в браузере", + "页面渲染出错,请刷新页面重试": "Произошла ошибка при отрисовке страницы. Пожалуйста, обновите страницу и попробуйте снова.", "顶栏管理": "Управление верхней панелью", "项": "элементов", "项目": "Проект", @@ -3463,140 +3468,6 @@ "默认测试模型": "Модель для тестирования по умолчанию", "默认用户消息": "Здравствуйте", "默认补全倍率": "Коэффициент завершения по умолчанию", - "提示:端点映射仅用于模型广场展示,不会影响模型真实调用。如需配置真实调用,请前往「渠道管理」。": "Примечание: сопоставление эндпоинтов используется только для отображения в «Маркетплейсе моделей» и не влияет на реальный вызов. Чтобы настроить реальное поведение вызовов, перейдите в «Управление каналами».", - "购买订阅获得模型额度/次数": "Купите подписку, чтобы получить лимит/количество использования моделей", - "生产环境 RSA 私钥 Base64 (PKCS#8 DER)": "RSA закрытый ключ Base64 (PKCS#8 DER) производственной среды", - "沙盒环境 RSA 私钥 Base64 (PKCS#8 DER)": "RSA закрытый ключ Base64 (PKCS#8 DER) песочницы", - "生产环境 Waffo 公钥 Base64 (X.509 DER)": "Открытый ключ Waffo Base64 (X.509 DER) производственной среды", - "沙盒环境 Waffo 公钥 Base64 (X.509 DER)": "Открытый ключ Waffo Base64 (X.509 DER) песочницы", - "支付方式类型": "Тип метода оплаты", - "支付方式名称": "Название метода оплаты", - "获取充值配置失败": "Не удалось получить конфигурацию пополнения", - "获取充值配置异常": "Ошибка конфигурации пополнения", - "分组相关设置": "Настройки, связанные с группами", - "保存分组相关设置": "Сохранить настройки, связанные с группами", - "此页面仅显示未设置价格或基础倍率的模型,设置后会自动从列表中移出": "На этой странице показаны только модели без цены или базового коэффициента. После сохранения они будут автоматически удалены из списка.", - "没有未设置定价的模型": "Нет моделей без цены", - "当前没有未设置定价的模型": "Сейчас нет моделей без цены", - "模型计费编辑器": "Редактор тарификации моделей", - "价格摘要": "Сводка цен", - "当前提示": "Текущие подсказки", - "这个界面默认按价格填写,保存时会自动换算回后端需要的倍率 JSON。": "В этом интерфейсе значения по умолчанию задаются через цены, а при сохранении они автоматически преобразуются в JSON коэффициентов, требуемый backend.", - "当前未启用,需要时再打开即可。": "Это поле сейчас отключено. Включите его при необходимости.", - "下面展示这个模型保存后会写入哪些后端字段,便于和原始 JSON 编辑框保持一致。": "Ниже показано, какие backend-поля будут записаны после сохранения, чтобы их было удобно сверять с редакторами исходного JSON.", - "补全价格已锁定": "Цена завершения заблокирована", - "后端固定倍率:{{ratio}}。该字段仅展示换算后的价格。": "Фиксированный backend-коэффициент: {{ratio}}. Это поле только показывает вычисленную цену.", - "这些价格都是可选项,不填也可以。": "Все эти цены необязательны и могут быть оставлены пустыми.", - "请先开启并填写音频输入价格。": "Сначала включите и заполните цену аудио-ввода.", - "输入模型名称,例如 gpt-4.1": "Введите имя модели, например gpt-4.1", - "当前模型同时存在按次价格和倍率配置,保存时会按当前计费方式覆盖。": "У этой модели одновременно задана цена за запрос и конфигурация коэффициентов. При сохранении данные будут перезаписаны согласно текущему режиму тарификации.", - "当前模型存在未显式设置输入倍率的扩展倍率;填写输入价格后会自动换算为价格字段。": "У этой модели есть дополнительные коэффициенты без явно заданного входного коэффициента; после ввода входной цены они будут автоматически преобразованы в ценовые поля.", - "按量计费下需要先填写输入价格,才能保存其它价格项。": "При тарификации по объему сначала нужно указать входную цену, чтобы сохранить остальные ценовые поля.", - "填写音频补全价格前,需要先填写音频输入价格。": "Перед указанием цены аудио-завершения сначала задайте цену аудио-ввода.", - "模型 {{name}} 缺少输入价格,无法计算补全/缓存/图片/音频价格对应的倍率": "У модели {{name}} отсутствует входная цена, поэтому невозможно вычислить коэффициенты для завершения, кэша, изображений и аудио.", - "模型 {{name}} 缺少音频输入价格,无法计算音频补全倍率": "У модели {{name}} отсутствует цена аудио-ввода, поэтому невозможно вычислить коэффициент аудио-завершения.", - "批量应用当前模型价格": "Массово применить цену текущей модели", - "请先选择一个作为模板的模型": "Сначала выберите модель-шаблон", - "请先勾选需要批量设置的模型": "Сначала отметьте модели для массовой настройки", - "已将模型 {{name}} 的价格配置批量应用到 {{count}} 个模型": "Ценовая конфигурация модели {{name}} массово применена к {{count}} моделям", - "将把当前编辑中的模型 {{name}} 的价格配置,批量应用到已勾选的 {{count}} 个模型。": "Ценовая конфигурация редактируемой модели {{name}} будет применена к {{count}} выбранным моделям.", - "适合同系列模型一起定价,例如把 gpt-5.1 的价格批量同步到 gpt-5.1-high、gpt-5.1-low 等模型。": "Подходит для совместной настройки цен вариантов одной модели, например синхронизации цены gpt-5.1 с gpt-5.1-high, gpt-5.1-low и похожими моделями.", - "已勾选": "Выбрано", - "当前编辑": "Текущее редактирование", - "已勾选 {{count}} 个模型": "Выбрано моделей: {{count}}", - "计费方式": "Режим тарификации", - "未设置价格": "Цена не задана", - "保存预览": "Предпросмотр сохранения", - "基础价格": "Базовые цены", - "扩展价格": "Дополнительные цены", - "额外价格项": "Дополнительные ценовые позиции", - "补全价格": "Цена завершения", - "缓存读取价格": "Цена чтения входного кеша", - "缓存创建价格": "Цена создания входного кеша", - "图片输入价格": "Цена входного изображения", - "音频输入价格": "Цена входного аудио", - "音频补全价格": "Цена завершения аудио", - "适合 MJ / 任务类等按次收费模型。": "Подходит для MJ и других моделей с тарификацией за запрос.", - "该模型补全倍率由后端固定为 {{ratio}}。补全价格不能在这里修改。": "Коэффициент завершения для этой модели зафиксирован на уровне {{ratio}} на бэкенде. Цену завершения нельзя изменить здесь.", - "计费显示模式": "Режим отображения тарификации", - "价格模式(默认)": "Режим цен (по умолчанию)", - "模型价格 {{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", - "缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Цена создания кеша: {{symbol}}{{price}} / 1M tokens", - "缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Цена создания кеша {{symbol}}{{price}} / 1M tokens", - "5m缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Цена создания кеша 5m: {{symbol}}{{price}} / 1M tokens", - "5m缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Цена создания кеша 5m {{symbol}}{{price}} / 1M tokens", - "1h缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Цена создания кеша 1h: {{symbol}}{{price}} / 1M tokens", - "1h缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Цена создания кеша 1h {{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}} раз", - "文件搜索调用 {{fileSearchCallCount}} 次": "Поиск файлов вызван {{fileSearchCallCount}} раз", - "图片倍率 {{imageRatio}}": "Коэффициент изображения {{imageRatio}}", - "音频倍率 {{audioRatio}}": "Аудио-коэффициент {{audioRatio}}", - "普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Обычный ввод: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "缓存输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Кэшированный ввод: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * коэффициент кэша {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 图片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Ввод изображения: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * коэффициент изображения {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Аудиоввод: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * аудио-коэффициент {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Вывод: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * коэффициент завершения {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "Web 搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Web-поиск: {{count}} / 1K * цена за единицу {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "文件搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Поиск файлов: {{count}} / 1K * цена за единицу {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片生成:1 次 * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Генерация изображения: 1 вызов * цена за единицу {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "合计:{{total}}": "Итого: {{total}}", - "模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},音频倍率 {{audioRatio}},音频补全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}": "Коэффициент модели {{modelRatio}}, коэффициент завершения {{completionRatio}}, аудио-коэффициент {{audioRatio}}, коэффициент аудиозавершения {{audioCompletionRatio}}, {{cachePart}}{{ratioType}} {{ratio}}", - "文字输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Текстовый вывод: {{tokens}} / 1M * коэффициент модели {{modelRatio}} * коэффициент завершения {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输出:{{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}}", - "缓存读取:{{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", - "复制密钥": "Копировать ключ", - "复制连接信息": "Копировать данные подключения", - "检测到剪贴板中的连接信息": "В буфере обмена обнаружены данные подключения", - "自动填入": "Заполнить", - "忽略": "Игнорировать", - "从剪贴板粘贴配置": "Вставить конфигурацию", - "剪贴板中未检测到连接信息": "Данные подключения не найдены в буфере обмена", - "连接信息已填入": "Данные подключения применены", - "无法读取剪贴板": "Не удалось прочитать буфер обмена", - "页面渲染出错,请刷新页面重试": "Произошла ошибка при отрисовке страницы. Пожалуйста, обновите страницу и попробуйте снова.", - "刷新页面": "Обновить страницу", "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(В настоящее время поддерживается только интерфейс YiPay, по умолчанию используется адрес сервера выше в качестве адреса обратного вызова!)", ",当前无生效订阅,将自动使用钱包": ", нет активной подписки, автоматически будет использоваться кошелек.", ",时间:": ", время: ", diff --git a/web/src/i18n/locales/vi.json b/web/src/i18n/locales/vi.json index c908cb54..7497cf7f 100644 --- a/web/src/i18n/locales/vi.json +++ b/web/src/i18n/locales/vi.json @@ -436,7 +436,6 @@ "作用域": "Phạm vi", "作用域:包含分组": "Phạm vi: Bao gồm nhóm", "作用域:包含模型名称": "Phạm vi: Bao gồm tên mô hình", - "开启后,模型名称会参与 cache key(不同模型隔离)。": "Khi bật, tên mô hình sẽ được bao gồm trong cache key (cách ly các mô hình khác nhau).", "作用域:包含规则名称": "Phạm vi: Bao gồm tên quy tắc", "你似乎并没有修改什么": "Bạn dường như không sửa đổi gì cả", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "You can manually add them under “Custom model names”, click Fill and submit, or use the actions below to handle them automatically.", @@ -762,6 +761,7 @@ "刷新统计": "Làm mới thống kê", "刷新缓存统计": "Làm mới thống kê bộ nhớ đệm", "刷新缓存统计失败": "Làm mới thống kê bộ nhớ đệm thất bại", + "刷新页面": "Tải lại trang", "前往 io.net API Keys": "Go to io.net API Keys", "前往设置": "Go to Settings", "前往设置页面": "Go to Settings Page", @@ -1346,6 +1346,7 @@ "开启后,将定期发送ping数据保持连接活跃": "Sau khi bật, dữ liệu ping sẽ được gửi định kỳ để giữ kết nối hoạt động", "开启后,当前分组渠道失败时会按顺序尝试下一个分组的渠道": "Sau khi bật, khi kênh nhóm hiện tại thất bại, nó sẽ thử kênh của nhóm tiếp theo theo thứ tự", "开启后,所有请求将直接透传给上游,不会进行任何处理(重定向和渠道适配也将失效),请谨慎开启": "Khi bật, tất cả các yêu cầu sẽ được chuyển tiếp trực tiếp đến thượng nguồn mà không cần xử lý (chuyển hướng và thích ứng kênh cũng sẽ bị vô hiệu hóa). Vui lòng bật một cách thận trọng.", + "开启后,模型名称会参与 cache key(不同模型隔离)。": "Khi bật, tên mô hình sẽ được bao gồm trong cache key (cách ly các mô hình khác nhau).", "开启后,若该规则命中且请求失败,将不会切换渠道重试。": "Khi bật, nếu quy tắc này trúng và yêu cầu thất bại, sẽ không chuyển kênh để thử lại.", "开启后,规则名称会参与 cache key(不同规则隔离)。": "Khi bật, tên quy tắc sẽ tham gia vào cache key (cách ly theo quy tắc).", "开启后,该渠道请求 Claude 时将强制追加 ?beta=true(无需客户端手动传参)": "Khi bật, yêu cầu đến Claude qua kênh này sẽ tự động thêm ?beta=true (client không cần truyền thủ công)", @@ -1869,6 +1870,7 @@ "条件规则": "Quy tắc điều kiện", "条件项设置": "Cài đặt mục điều kiện", "条日志已清理!": "nhật ký đã được xóa!", + "条规则": "rules", "条,共": "của", "来源": "Nguồn", "来源于 IO.NET 部署": "From IO.NET Deployment", @@ -1963,6 +1965,7 @@ "模型库": "Thư viện mô hình", "模型拉取失败: {{error}}": "Failed to pull model: {{error}}", "模型排序": "Sắp xếp mô hình", + "模型排行": "Xếp hạng mô hình", "模型支持的接口端点信息": "Thông tin điểm cuối API được mô hình hỗ trợ", "模型数据分析": "Phân tích dữ liệu mô hình", "模型映射": "Ánh xạ mô hình", @@ -2185,6 +2188,7 @@ "添加分类": "Thêm danh mục", "添加分组": "Thêm nhóm", "添加分组倍率": "Thêm tỷ lệ nhóm", + "添加分组规则": "Add Group Rules", "添加后提交": "Submit after adding", "添加启动参数": "Add Startup Args", "添加启动命令": "Add Startup Command", @@ -2414,6 +2418,8 @@ "用户注册": "Đăng ký người dùng", "用户注册时看到的网站名称,比如'我的网站'": "Tên trang web người dùng nhìn thấy khi đăng ký, ví dụ: 'Trang web của tôi'", "用户注册设置": "Cài đặt đăng ký người dùng", + "用户消耗排行": "Xếp hạng tiêu thụ người dùng", + "用户消耗趋势": "Xu hướng tiêu thụ người dùng", "用户登录": "Đăng nhập người dùng", "用户的基本账户信息": "Thông tin tài khoản cơ bản của người dùng", "用户管理": "Quản lý người dùng", @@ -2556,6 +2562,7 @@ "确认冲突项修改": "Xác nhận sửa đổi mục xung đột", "确认删除": "Xác nhận xóa", "确认删除模型": "Confirm Delete Model", + "确认删除该分组的所有规则?": "Delete all rules for this group?", "确认删除该分组?": "Confirm delete this group?", "确认删除该规则?": "Confirm delete this rule?", "确认取消密码登录": "Xác nhận hủy đăng nhập mật khẩu", @@ -3474,9 +3481,6 @@ "调用次数分布": "Phân phối số lần gọi", "调用次数排行": "Xếp hạng số lần gọi", "调用趋势": "Xu hướng cuộc gọi", - "模型排行": "Xếp hạng mô hình", - "用户消耗排行": "Xếp hạng tiêu thụ người dùng", - "用户消耗趋势": "Xu hướng tiêu thụ người dùng", "调试信息": "Thông tin gỡ lỗi", "谨慎": "Thận trọng", "豆包": "Doubao", @@ -3932,6 +3936,7 @@ "音频输出:{{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}}", "页脚": "Chân trang", "页面未找到,请检查您的浏览器地址是否正确": "Không tìm thấy trang, vui lòng kiểm tra xem địa chỉ trình duyệt của bạn có chính xác không", + "页面渲染出错,请刷新页面重试": "Đã xảy ra lỗi khi hiển thị trang. Vui lòng tải lại trang và thử lại.", "顶栏管理": "Quản lý thanh tiêu đề", "项": "mục", "项目": "Dự án", @@ -3998,139 +4003,6 @@ "默认测试模型": "Mô hình kiểm tra mặc định", "默认用户消息": "Xin chào", "默认补全倍率": "Tỷ lệ hoàn thành mặc định", - "提示:端点映射仅用于模型广场展示,不会影响模型真实调用。如需配置真实调用,请前往「渠道管理」。": "Lưu ý: Ánh xạ endpoint chỉ dùng để hiển thị trong \"Chợ mô hình\" và không ảnh hưởng đến việc gọi thực tế. Để cấu hình gọi thực tế, vui lòng vào \"Quản lý kênh\".", - "购买订阅获得模型额度/次数": "Mua đăng ký để nhận hạn mức/lượt dùng mô hình", - "生产环境 RSA 私钥 Base64 (PKCS#8 DER)": "Khóa riêng RSA Base64 (PKCS#8 DER) môi trường sản xuất", - "沙盒环境 RSA 私钥 Base64 (PKCS#8 DER)": "Khóa riêng RSA Base64 (PKCS#8 DER) môi trường sandbox", - "生产环境 Waffo 公钥 Base64 (X.509 DER)": "Khóa công khai Waffo Base64 (X.509 DER) môi trường sản xuất", - "沙盒环境 Waffo 公钥 Base64 (X.509 DER)": "Khóa công khai Waffo Base64 (X.509 DER) môi trường sandbox", - "支付方式类型": "Loại phương thức thanh toán", - "支付方式名称": "Tên phương thức thanh toán", - "获取充值配置失败": "Không thể lấy cấu hình nạp tiền", - "获取充值配置异常": "Lỗi cấu hình nạp tiền", - "分组相关设置": "Cài đặt liên quan đến nhóm", - "保存分组相关设置": "Lưu cài đặt liên quan đến nhóm", - "此页面仅显示未设置价格或基础倍率的模型,设置后会自动从列表中移出": "Trang này chỉ hiển thị các mô hình chưa thiết lập giá hoặc tỷ lệ cơ bản. Sau khi lưu, chúng sẽ tự động biến mất khỏi danh sách.", - "没有未设置定价的模型": "Không có mô hình chưa thiết lập giá", - "当前没有未设置定价的模型": "Hiện không có mô hình nào chưa thiết lập giá", - "模型计费编辑器": "Trình chỉnh sửa giá mô hình", - "价格摘要": "Tóm tắt giá", - "当前提示": "Gợi ý hiện tại", - "这个界面默认按价格填写,保存时会自动换算回后端需要的倍率 JSON。": "Giao diện này mặc định nhập theo giá, khi lưu sẽ tự động quy đổi lại thành JSON tỷ lệ mà backend yêu cầu.", - "当前未启用,需要时再打开即可。": "Trường này hiện đang tắt. Hãy bật khi cần.", - "下面展示这个模型保存后会写入哪些后端字段,便于和原始 JSON 编辑框保持一致。": "Bên dưới hiển thị các trường backend sẽ được ghi sau khi lưu, giúp bạn dễ đối chiếu với ô chỉnh sửa JSON gốc.", - "补全价格已锁定": "Giá hoàn thành đã bị khóa", - "后端固定倍率:{{ratio}}。该字段仅展示换算后的价格。": "Tỷ lệ cố định từ backend: {{ratio}}. Trường này chỉ hiển thị giá sau khi quy đổi.", - "这些价格都是可选项,不填也可以。": "Tất cả các mức giá này đều là tùy chọn và có thể để trống.", - "请先开启并填写音频输入价格。": "Hãy bật và điền giá đầu vào âm thanh trước.", - "输入模型名称,例如 gpt-4.1": "Nhập tên mô hình, ví dụ gpt-4.1", - "当前模型同时存在按次价格和倍率配置,保存时会按当前计费方式覆盖。": "Mô hình này hiện đồng thời có giá theo lượt gọi và cấu hình tỷ lệ. Khi lưu, dữ liệu sẽ bị ghi đè theo chế độ tính phí hiện tại.", - "当前模型存在未显式设置输入倍率的扩展倍率;填写输入价格后会自动换算为价格字段。": "Mô hình này có các tỷ lệ mở rộng mà chưa đặt rõ tỷ lệ đầu vào; sau khi điền giá đầu vào, chúng sẽ tự động được quy đổi thành trường giá.", - "按量计费下需要先填写输入价格,才能保存其它价格项。": "Ở chế độ tính phí theo lượng, cần điền giá đầu vào trước thì mới lưu được các mục giá khác.", - "填写音频补全价格前,需要先填写音频输入价格。": "Trước khi nhập giá hoàn thành âm thanh, hãy nhập giá đầu vào âm thanh trước.", - "模型 {{name}} 缺少输入价格,无法计算补全/缓存/图片/音频价格对应的倍率": "Mô hình {{name}} thiếu giá đầu vào, nên không thể tính tỷ lệ tương ứng cho giá hoàn thành, bộ nhớ đệm, hình ảnh và âm thanh.", - "模型 {{name}} 缺少音频输入价格,无法计算音频补全倍率": "Mô hình {{name}} thiếu giá đầu vào âm thanh, nên không thể tính tỷ lệ hoàn thành âm thanh.", - "批量应用当前模型价格": "Áp dụng hàng loạt giá của mô hình hiện tại", - "请先选择一个作为模板的模型": "Vui lòng chọn trước một mô hình làm mẫu", - "请先勾选需要批量设置的模型": "Vui lòng chọn các mô hình cần thiết lập hàng loạt trước", - "已将模型 {{name}} 的价格配置批量应用到 {{count}} 个模型": "Đã áp dụng hàng loạt cấu hình giá của mô hình {{name}} cho {{count}} mô hình", - "将把当前编辑中的模型 {{name}} 的价格配置,批量应用到已勾选的 {{count}} 个模型。": "Cấu hình giá của mô hình đang chỉnh sửa {{name}} sẽ được áp dụng hàng loạt cho {{count}} mô hình đã chọn.", - "适合同系列模型一起定价,例如把 gpt-5.1 的价格批量同步到 gpt-5.1-high、gpt-5.1-low 等模型。": "Phù hợp để định giá cùng lúc các biến thể cùng dòng, ví dụ đồng bộ giá của gpt-5.1 sang gpt-5.1-high, gpt-5.1-low và các mô hình tương tự.", - "已勾选": "Đã chọn", - "当前编辑": "Đang chỉnh sửa", - "已勾选 {{count}} 个模型": "Đã chọn {{count}} mô hình", - "计费方式": "Chế độ tính phí", - "未设置价格": "Chưa thiết lập giá", - "保存预览": "Xem trước khi lưu", - "基础价格": "Giá cơ bản", - "扩展价格": "Giá mở rộng", - "额外价格项": "Mục giá bổ sung", - "补全价格": "Giá hoàn thành", - "缓存读取价格": "Giá đọc bộ nhớ đệm đầu vào", - "缓存创建价格": "Giá tạo bộ nhớ đệm đầu vào", - "图片输入价格": "Giá đầu vào hình ảnh", - "音频输入价格": "Giá đầu vào âm thanh", - "音频补全价格": "Giá hoàn thành âm thanh", - "适合 MJ / 任务类等按次收费模型。": "Phù hợp cho MJ và các mô hình tính phí theo lượt gọi tương tự.", - "该模型补全倍率由后端固定为 {{ratio}}。补全价格不能在这里修改。": "Tỷ lệ hoàn thành của mô hình này được backend cố định ở {{ratio}}. Không thể chỉnh giá hoàn thành tại đây.", - "计费显示模式": "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", - "缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Giá tạo bộ nhớ đệm: {{symbol}}{{price}} / 1M tokens", - "缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Giá tạo bộ nhớ đệm {{symbol}}{{price}} / 1M tokens", - "5m缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Giá tạo bộ nhớ đệm 5m: {{symbol}}{{price}} / 1M tokens", - "5m缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Giá tạo bộ nhớ đệm 5m {{symbol}}{{price}} / 1M tokens", - "1h缓存创建价格:{{symbol}}{{price}} / 1M tokens": "Giá tạo bộ nhớ đệm 1h: {{symbol}}{{price}} / 1M tokens", - "1h缓存创建价格 {{symbol}}{{price}} / 1M tokens": "Giá tạo bộ nhớ đệm 1h {{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 hình ảnh {{symbol}}{{price}} / 1M tokens", - "输入价格 {{symbol}}{{price}} / 1M tokens": "Giá đầu vào {{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", - "文件搜索调用 {{fileSearchCallCount}} 次": "Đã gọi tìm kiếm tệp {{fileSearchCallCount}} lần", - "图片倍率 {{imageRatio}}": "Hệ số hình ảnh {{imageRatio}}", - "音频倍率 {{audioRatio}}": "Hệ số âm thanh {{audioRatio}}", - "普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Đầu vào thường: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "缓存输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Đầu vào bộ nhớ đệm: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * hệ số bộ nhớ đệm {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 图片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Đầu vào hình ảnh: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * hệ số hình ảnh {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Đầu vào âm thanh: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * hệ số âm thanh {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Đầu ra: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * hệ số hoàn thành {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "Web 搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Tìm kiếm Web: {{count}} / 1K * đơn giá {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "文件搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Tìm kiếm tệp: {{count}} / 1K * đơn giá {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片生成:1 次 * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Tạo ảnh: 1 lần gọi * đơn giá {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "合计:{{total}}": "Tổng cộng: {{total}}", - "模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},音频倍率 {{audioRatio}},音频补全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}": "Hệ số mô hình {{modelRatio}}, hệ số hoàn thành {{completionRatio}}, hệ số âm thanh {{audioRatio}}, hệ số hoàn thành âm thanh {{audioCompletionRatio}}, {{cachePart}}{{ratioType}} {{ratio}}", - "文字输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "Đầu ra văn bản: {{tokens}} / 1M * hệ số mô hình {{modelRatio}} * hệ số hoàn thành {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输出:{{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}}", - "缓存读取:{{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", - "{{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", - "复制密钥": "Sao chép khóa", - "复制连接信息": "Sao chép thông tin kết nối", - "检测到剪贴板中的连接信息": "Phát hiện thông tin kết nối trong bộ nhớ tạm", - "自动填入": "Tự động điền", - "忽略": "Bỏ qua", - "从剪贴板粘贴配置": "Dán cấu hình", - "剪贴板中未检测到连接信息": "Không tìm thấy thông tin kết nối trong bộ nhớ tạm", - "连接信息已填入": "Đã áp dụng thông tin kết nối", - "无法读取剪贴板": "Không thể đọc bộ nhớ tạm", - "页面渲染出错,请刷新页面重试": "Đã xảy ra lỗi khi hiển thị trang. Vui lòng tải lại trang và thử lại.", - "刷新页面": "Tải lại trang", "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(Hiện tại chỉ hỗ trợ giao diện Epay, địa chỉ máy chủ phía trên được sử dụng làm địa chỉ gọi lại theo mặc định!)", ",当前无生效订阅,将自动使用钱包": ", hiện không có gói đăng ký hiệu lực, sẽ tự động dùng ví.", ",时间:": ", thời gian:", diff --git a/web/src/i18n/locales/zh-TW.json b/web/src/i18n/locales/zh-TW.json index c599bb06..ac853e4b 100644 --- a/web/src/i18n/locales/zh-TW.json +++ b/web/src/i18n/locales/zh-TW.json @@ -449,7 +449,7 @@ "保存 Turnstile 设置": "儲存 Turnstile 設定", "保存 WeChat Server 设置": "儲存 WeChat Server 設定", "保存分组倍率设置": "儲存分組倍率設定", - "保存分组相关设置": "儲存分組相關設定", + "保存分组相关设置": "保存分組相關設定", "保存备用码": "儲存備用碼", "保存备用码以备不时之需": "儲存備用碼以備不時之需", "保存失败": "儲存失敗", @@ -670,6 +670,7 @@ "刷新容器信息": "刷新容器資訊", "刷新日志": "刷新日誌", "刷新统计": "刷新統計", + "刷新页面": "重新整理頁面", "前往 io.net API Keys": "前往 io.net API Keys", "前往设置": "前往設定", "前往设置页面": "前往設定頁面", @@ -1658,6 +1659,7 @@ "条": "條", "条 - 第": "條 - 第", "条日志已清理!": "條日誌已清理!", + "条规则": "條規則", "条,共": "條,共", "来源": "來源", "来源于 IO.NET 部署": "來源於 IO.NET 部署", @@ -1744,6 +1746,7 @@ "模型定价,需要登录访问": "模型定價,需要登錄訪問", "模型广场": "模型廣場", "模型拉取失败: {{error}}": "模型拉取失敗: {{error}}", + "模型排行": "模型排行", "模型支持的接口端点信息": "模型支援的接口端點資訊", "模型数据分析": "模型數據分析", "模型映射必须是合法的 JSON 格式!": "模型映射必須是合法的 JSON 格式!", @@ -1885,6 +1888,7 @@ "添加公告": "添加公告", "添加分类": "添加分類", "添加分组": "新增分組", + "添加分组规则": "新增分組規則", "添加后提交": "添加後提交", "添加启动参数": "添加啟動參數", "添加启动命令": "添加啟動命令", @@ -2007,6 +2011,8 @@ "用户每周期最多请求完成次数": "使用者每週期最多請求完成次數", "用户每周期最多请求次数": "使用者每週期最多請求次數", "用户注册时看到的网站名称,比如'我的网站'": "使用者註冊時看到的網站名稱,比如'我的網站'", + "用户消耗排行": "用戶消耗排行", + "用户消耗趋势": "用戶消耗趨勢", "用户的基本账户信息": "使用者的基本帳號資訊", "用户管理": "使用者管理", "用户组": "使用者組", @@ -2090,6 +2096,7 @@ "确认冲突项修改": "確認衝突項修改", "确认删除": "確認刪除", "确认删除模型": "確認刪除模型", + "确认删除该分组的所有规则?": "確認刪除該分組的所有規則?", "确认删除该分组?": "確認刪除該分組?", "确认删除该规则?": "確認刪除該規則?", "确认取消密码登录": "確認取消密碼登錄", @@ -2721,9 +2728,6 @@ "调用次数分布": "調用次數分佈", "调用次数排行": "調用次數排行", "调用趋势": "調用趨勢", - "模型排行": "模型排行", - "用户消耗排行": "用戶消耗排行", - "用户消耗趋势": "用戶消耗趨勢", "调试信息": "除錯訊息", "谨慎": "謹慎", "豆包": "豆包", @@ -3046,6 +3050,7 @@ "音频输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * 音频补全倍率 {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "音訊輸出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音訊倍率 {{audioRatio}} * 音訊補全倍率 {{audioCompletionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", "页脚": "頁腳", "页面未找到,请检查您的浏览器地址是否正确": "頁面未找到,請檢查您的瀏覽器位址是否正確", + "页面渲染出错,请刷新页面重试": "頁面渲染出錯,請重新整理頁面重試", "顶栏管理": "頂欄管理", "项目": "項目", "项目内容": "項目內容", @@ -3115,219 +3120,6 @@ "默认补全倍率": "預設補全倍率", "(当前仅支持易支付接口,默认使用上方服务器地址作为回调地址!)": "(當前僅支援易支付接口,預設使用上方伺服器位址作為回調位址!)", ",当前无生效订阅,将自动使用钱包": ",當前無生效訂閱,將自動使用錢包", - "个已过期": "個已過期", - "订阅": "訂閱", - "至": "至", - "过期于": "過期於", - "作废于": "作廢於", - "购买套餐后即可享受模型权益": "購買訂閱後即可享受模型權益", - "限购": "限購", - "推荐": "推薦", - "已达到购买上限": "已達到購買上限", - "已达上限": "已達上限", - "立即订阅": "立即訂閱", - "暂无可购买套餐": "暫無可購買訂閱", - "该套餐未配置 Stripe": "該訂閱未設定 Stripe", - "已打开支付页面": "已打開支付頁面", - "支付失败": "支付失敗", - "该套餐未配置 Creem": "該訂閱未設定 Creem", - "已发起支付": "已發起支付", - "购买订阅套餐": "購買訂閱", - "套餐名称": "訂閱名稱", - "应付金额": "應付金額", - "支付": "支付", - "管理员未开启在线支付功能,请联系管理员配置。": "管理員未開啟在線支付功能,請聯繫管理員設定。", - "偏好设置": "偏好設定", - "界面语言和其他个人偏好": "界面語言和其他個人偏好", - "语言偏好": "語言偏好", - "选择您的首选界面语言,设置将自动保存并同步到所有设备": "選擇您的首選界面語言,設定將自動儲存並同步到所有設備", - "语言偏好已保存": "語言偏好已儲存", - "提示:语言偏好会同步到您登录的所有设备,并影响API返回的错误消息语言。": "提示:語言偏好會同步到您登錄的所有設備,並影響API返回的錯誤消息語言。", - "自定义 OAuth 提供商": "自訂 OAuth 提供商", - "配置自定义 OAuth 提供商,支持 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 协议的身份提供商": "設定自訂 OAuth 提供商,支援 GitHub Enterprise、GitLab、Gitea、Nextcloud、Keycloak、ORY 等兼容 OAuth 2.0 協議的身份提供商", - "回调 URL 格式": "回調 URL 格式", - "添加提供商": "添加提供商", - "编辑提供商": "編輯提供商", - "选择预设...": "選擇設定檔...", - "输入基础 URL": "輸入基礎 URL", - "例如": "例如", - "提供商名称": "提供商名稱", - "标识符 (Slug)": "標識符 (Slug)", - "授权端点": "授權端點", - "令牌端点": "令牌端點", - "用户信息端点": "使用者資訊端點", - "用户 ID 字段": "使用者 ID 字段", - "支持 JSONPath,如 sub, id, data.user.id": "支援 JSONPath,如 sub, id, data.user.id", - "用户名字段": "使用者名字段", - "支持 JSONPath,如 preferred_username, login, data.user.username": "支援 JSONPath,如 preferred_username, login, data.user.username", - "显示名称字段": "顯示名稱字段", - "支持 JSONPath,如 name, display_name, data.user.name": "支援 JSONPath,如 name, display_name, data.user.name", - "邮箱字段": "信箱字段", - "支持 JSONPath,如 email, data.user.email": "支援 JSONPath,如 email, data.user.email", - "授权范围 (Scopes)": "授權範圍 (Scopes)", - "认证方式": "認證方式", - "参数传递": "參數傳遞", - "Basic Auth 头": "Basic Auth 頭", - "暂无自定义 OAuth 提供商": "暫無自訂 OAuth 提供商", - "确定要删除该提供商吗?": "確定要刪除該提供商嗎?", - "确定要解绑 {{name}} 吗?": "確定要解綁 {{name}} 嗎?", - "解绑成功": "解綁成功", - "{{name}} ID": "{{name}} ID", - "使用 {{name}} 继续": "使用 {{name}} 繼續", - "端点 URL 必须以 http:// 或 https:// 开头:": "端點 URL 必須以 http:// 或 https:// 開頭:", - "OAuth 配置错误:授权端点必须是完整的 URL(以 http:// 或 https:// 开头)": "OAuth 設定錯誤:授權端點必須是完整的 URL(以 http:// 或 https:// 開頭)", - "OAuth 登录失败:": "OAuth 登錄失敗:", - "必填:请输入服务器地址以自动生成完整端点 URL": "必填:請輸入伺服器位址以自動生成完整端點 URL", - "填写服务器地址后自动生成:": "填寫伺服器位址後自動生成:", - "自动生成:": "自動生成:", - "请先填写服务器地址,以自动生成完整的端点 URL": "請先填寫伺服器位址,以自動生成完整的端點 URL", - "端点 URL 必须是完整地址(以 http:// 或 https:// 开头)": "端點 URL 必須是完整位址(以 http:// 或 https:// 開頭)", - "未匹配到模型,按回车键可将「{{name}}」作为自定义模型名添加": "未匹配到模型,按下 Enter 鍵可將「{{name}}」作為自訂模型名稱新增", - "分组相关设置": "分組相關設定", - "保存分组相关设置": "保存分組相關設定", - "此页面仅显示未设置价格或基础倍率的模型,设置后会自动从列表中移出": "此頁面僅顯示未設定價格或基礎倍率的模型,設定後會自動從列表中移出", - "没有未设置定价的模型": "沒有未設定定價的模型", - "当前没有未设置定价的模型": "目前沒有未設定定價的模型", - "模型计费编辑器": "模型計費編輯器", - "价格摘要": "價格摘要", - "当前提示": "目前提示", - "这个界面默认按价格填写,保存时会自动换算回后端需要的倍率 JSON。": "這個介面預設按價格填寫,儲存時會自動換算回後端需要的倍率 JSON。", - "当前未启用,需要时再打开即可。": "目前未啟用,需要時再開啟即可。", - "下面展示这个模型保存后会写入哪些后端字段,便于和原始 JSON 编辑框保持一致。": "下方會顯示此模型儲存後將寫入哪些後端欄位,方便與原始 JSON 編輯框保持一致。", - "补全价格已锁定": "補全價格已鎖定", - "后端固定倍率:{{ratio}}。该字段仅展示换算后的价格。": "後端固定倍率:{{ratio}}。此欄位僅展示換算後的價格。", - "这些价格都是可选项,不填也可以。": "這些價格都是可選項,不填也可以。", - "请先开启并填写音频输入价格。": "請先開啟並填寫音訊輸入價格。", - "输入模型名称,例如 gpt-4.1": "輸入模型名稱,例如 gpt-4.1", - "当前模型同时存在按次价格和倍率配置,保存时会按当前计费方式覆盖。": "目前模型同時存在按次價格與倍率配置,儲存時會依目前計費方式覆蓋。", - "当前模型存在未显式设置输入倍率的扩展倍率;填写输入价格后会自动换算为价格字段。": "目前模型存在未明確設定輸入倍率的擴展倍率;填寫輸入價格後會自動換算為價格欄位。", - "按量计费下需要先填写输入价格,才能保存其它价格项。": "按量計費下需要先填寫輸入價格,才能儲存其它價格項。", - "填写音频补全价格前,需要先填写音频输入价格。": "填寫音訊補全價格前,需要先填寫音訊輸入價格。", - "模型 {{name}} 缺少输入价格,无法计算补全/缓存/图片/音频价格对应的倍率": "模型 {{name}} 缺少輸入價格,無法計算補全、快取、圖片與音訊價格對應的倍率", - "模型 {{name}} 缺少音频输入价格,无法计算音频补全倍率": "模型 {{name}} 缺少音訊輸入價格,無法計算音訊補全倍率", - "批量应用当前模型价格": "批量套用目前模型價格", - "请先选择一个作为模板的模型": "請先選擇一個作為範本的模型", - "请先勾选需要批量设置的模型": "請先勾選需要批量設定的模型", - "已将模型 {{name}} 的价格配置批量应用到 {{count}} 个模型": "已將模型 {{name}} 的價格配置批量套用到 {{count}} 個模型", - "将把当前编辑中的模型 {{name}} 的价格配置,批量应用到已勾选的 {{count}} 个模型。": "會把目前編輯中的模型 {{name}} 的價格配置,批量套用到已勾選的 {{count}} 個模型。", - "适合同系列模型一起定价,例如把 gpt-5.1 的价格批量同步到 gpt-5.1-high、gpt-5.1-low 等模型。": "適合同系列模型一起定價,例如把 gpt-5.1 的價格批量同步到 gpt-5.1-high、gpt-5.1-low 等模型。", - "已勾选": "已勾選", - "当前编辑": "目前編輯", - "已勾选 {{count}} 个模型": "已勾選 {{count}} 個模型", - "基础价格": "基礎價格", - "扩展价格": "擴展價格", - "额外价格项": "額外價格項", - "补全价格": "補全價格", - "缓存读取价格": "快取讀取價格", - "缓存创建价格": "快取建立價格", - "图片输入价格": "圖片輸入價格", - "音频输入价格": "音訊輸入價格", - "音频补全价格": "音訊補全價格", - "适合 MJ / 任务类等按次收费模型。": "適合 MJ / 任務類等按次收費模型。", - "该模型补全倍率由后端固定为 {{ratio}}。补全价格不能在这里修改。": "該模型補全倍率由後端固定為 {{ratio}}。補全價格不能在這裡修改。", - "计费显示模式": "計費顯示模式", - "价格模式(默认)": "價格模式(預設)", - "模型价格 {{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", - "缓存创建价格:{{symbol}}{{price}} / 1M tokens": "快取建立價格:{{symbol}}{{price}} / 1M tokens", - "缓存创建价格 {{symbol}}{{price}} / 1M tokens": "快取建立價格 {{symbol}}{{price}} / 1M tokens", - "5m缓存创建价格:{{symbol}}{{price}} / 1M tokens": "5m快取建立價格:{{symbol}}{{price}} / 1M tokens", - "5m缓存创建价格 {{symbol}}{{price}} / 1M tokens": "5m快取建立價格 {{symbol}}{{price}} / 1M tokens", - "1h缓存创建价格:{{symbol}}{{price}} / 1M tokens": "1h快取建立價格:{{symbol}}{{price}} / 1M tokens", - "1h缓存创建价格 {{symbol}}{{price}} / 1M tokens": "1h快取建立價格 {{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}} 次", - "文件搜索调用 {{fileSearchCallCount}} 次": "檔案搜尋呼叫 {{fileSearchCallCount}} 次", - "图片倍率 {{imageRatio}}": "圖片倍率 {{imageRatio}}", - "音频倍率 {{audioRatio}}": "音訊倍率 {{audioRatio}}", - "普通输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "普通輸入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "缓存输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 缓存倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "快取輸入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 快取倍率 {{cacheRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 图片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "圖片輸入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 圖片倍率 {{imageRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音频倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "音訊輸入:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 音訊倍率 {{audioRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "輸出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 補全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "Web 搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "Web 搜尋:{{count}} / 1K * 單價 {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "文件搜索:{{count}} / 1K * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "檔案搜尋:{{count}} / 1K * 單價 {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "图片生成:1 次 * 单价 {{price}} * {{ratioType}} {{ratio}} = {{amount}}": "圖片生成:1 次 * 單價 {{price}} * {{ratioType}} {{ratio}} = {{amount}}", - "合计:{{total}}": "合計:{{total}}", - "模型倍率 {{modelRatio}},补全倍率 {{completionRatio}},音频倍率 {{audioRatio}},音频补全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}": "模型倍率 {{modelRatio}},補全倍率 {{completionRatio}},音訊倍率 {{audioRatio}},音訊補全倍率 {{audioCompletionRatio}},{{cachePart}}{{ratioType}} {{ratio}}", - "文字输出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 补全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}": "文字輸出:{{tokens}} / 1M * 模型倍率 {{modelRatio}} * 補全倍率 {{completionRatio}} * {{ratioType}} {{ratio}} = {{amount}}", - "音频输出:{{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}}", - "缓存读取:{{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}}", - "空": "空", - "提示:端点映射仅用于模型广场展示,不会影响模型真实调用。如需配置真实调用,请前往「渠道管理」。": "提示:端點映射僅用於模型廣場展示,不會影響模型真實呼叫。如需配置真實呼叫,請前往「管道管理」。", - "购买订阅获得模型额度/次数": "購買訂閱取得模型額度/次數", - "生产环境 RSA 私钥 Base64 (PKCS#8 DER)": "正式環境 RSA 私鑰 Base64 (PKCS#8 DER)", - "沙盒环境 RSA 私钥 Base64 (PKCS#8 DER)": "沙盒環境 RSA 私鑰 Base64 (PKCS#8 DER)", - "生产环境 Waffo 公钥 Base64 (X.509 DER)": "正式環境 Waffo 公鑰 Base64 (X.509 DER)", - "沙盒环境 Waffo 公钥 Base64 (X.509 DER)": "沙盒環境 Waffo 公鑰 Base64 (X.509 DER)", - "支付方式类型": "付款方式類型", - "支付方式名称": "付款方式名稱", - "获取充值配置失败": "取得儲值設定失敗", - "获取充值配置异常": "儲值設定異常", - "{{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", - "复制密钥": "複製金鑰", - "复制连接信息": "複製連線資訊", - "检测到剪贴板中的连接信息": "偵測到剪貼簿中的連線資訊", - "自动填入": "自動填入", - "忽略": "忽略", - "从剪贴板粘贴配置": "從剪貼簿貼上設定", - "剪贴板中未检测到连接信息": "剪貼簿中未偵測到連線資訊", - "连接信息已填入": "連線資訊已填入", - "无法读取剪贴板": "無法讀取剪貼簿", - "页面渲染出错,请刷新页面重试": "頁面渲染出錯,請重新整理頁面重試", - "刷新页面": "重新整理頁面", ",时间:": ",時間:", ",点击更新": ",點擊更新" } diff --git a/web/src/pages/Setting/Ratio/components/GroupGroupRatioRules.jsx b/web/src/pages/Setting/Ratio/components/GroupGroupRatioRules.jsx index 8c801c4e..6bfa148e 100644 --- a/web/src/pages/Setting/Ratio/components/GroupGroupRatioRules.jsx +++ b/web/src/pages/Setting/Ratio/components/GroupGroupRatioRules.jsx @@ -1,14 +1,21 @@ import React, { useState, useCallback, useMemo } from 'react'; import { Button, + Collapsible, + Input, InputNumber, Select, + Tag, Typography, Popconfirm, } from '@douyinfe/semi-ui'; -import { IconPlus, IconDelete } from '@douyinfe/semi-icons'; +import { + IconPlus, + IconDelete, + IconChevronDown, + IconChevronUp, +} from '@douyinfe/semi-icons'; import { useTranslation } from 'react-i18next'; -import CardTable from '../../../../components/common/ui/CardTable'; const { Text } = Typography; @@ -57,14 +64,106 @@ export function serializeGroupGroupRatio(rules) { : JSON.stringify(nested, null, 2); } +function GroupSection({ groupName, items, groupOptions, onUpdate, onRemove, onAdd, t }) { + const [open, setOpen] = useState(false); + + return ( +
+
setOpen(!open)} + > +
+ {open ? : } + {groupName} + {items.length} {t('条规则')} +
+
e.stopPropagation()}> +
+
+ +
+ {items.map((rule) => ( +
+ updateRule(record._id, 'userGroup', v)} - style={{ width: '100%' }} - allowCreate + value={newGroupName || undefined} + onChange={setNewGroupName} + style={{ width: 200 }} position='bottomLeft' /> - ), - }, - { - title: t('使用分组'), - dataIndex: 'usingGroup', - key: 'usingGroup', - width: 200, - render: (_, record) => ( - +
diff --git a/web/src/pages/Setting/Ratio/components/GroupSpecialUsableRules.jsx b/web/src/pages/Setting/Ratio/components/GroupSpecialUsableRules.jsx index 0983224f..20ec872a 100644 --- a/web/src/pages/Setting/Ratio/components/GroupSpecialUsableRules.jsx +++ b/web/src/pages/Setting/Ratio/components/GroupSpecialUsableRules.jsx @@ -1,15 +1,38 @@ +/* +Copyright (C) 2025 QuantumNous + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . + +For commercial licensing, please contact support@quantumnous.com +*/ import React, { useState, useCallback, useMemo } from 'react'; import { Button, + Collapsible, Input, Select, Tag, Typography, Popconfirm, } from '@douyinfe/semi-ui'; -import { IconPlus, IconDelete } from '@douyinfe/semi-icons'; +import { + IconPlus, + IconDelete, + IconChevronDown, + IconChevronUp, +} from '@douyinfe/semi-icons'; import { useTranslation } from 'react-i18next'; -import CardTable from '../../../../components/common/ui/CardTable'; const { Text } = Typography; @@ -21,12 +44,8 @@ const OP_REMOVE = 'remove'; const OP_APPEND = 'append'; function parsePrefix(rawKey) { - if (rawKey.startsWith('+:')) { - return { op: OP_ADD, groupName: rawKey.slice(2) }; - } - if (rawKey.startsWith('-:')) { - return { op: OP_REMOVE, groupName: rawKey.slice(2) }; - } + if (rawKey.startsWith('+:')) return { op: OP_ADD, groupName: rawKey.slice(2) }; + if (rawKey.startsWith('-:')) return { op: OP_REMOVE, groupName: rawKey.slice(2) }; return { op: OP_APPEND, groupName: rawKey }; } @@ -38,11 +57,7 @@ function toRawKey(op, groupName) { function parseJSON(str) { if (!str || !str.trim()) return {}; - try { - return JSON.parse(str); - } catch { - return {}; - } + try { return JSON.parse(str); } catch { return {}; } } function flattenRules(nested) { @@ -68,17 +83,14 @@ function nestRules(rules) { rules.forEach(({ userGroup, op, targetGroup, description }) => { if (!userGroup || !targetGroup) return; if (!result[userGroup]) result[userGroup] = {}; - const key = toRawKey(op, targetGroup); - result[userGroup][key] = description; + result[userGroup][toRawKey(op, targetGroup)] = description; }); return result; } export function serializeGroupSpecialUsable(rules) { const nested = nestRules(rules); - return Object.keys(nested).length === 0 - ? '' - : JSON.stringify(nested, null, 2); + return Object.keys(nested).length === 0 ? '' : JSON.stringify(nested, null, 2); } const OP_TAG_MAP = { @@ -87,14 +99,118 @@ const OP_TAG_MAP = { [OP_APPEND]: { color: 'blue', label: '追加' }, }; +function UsableGroupSection({ groupName, items, opOptions, onUpdate, onRemove, onAdd, t }) { + const [open, setOpen] = useState(false); + + return ( +
+
setOpen(!open)} + > +
+ {open ? : } + {groupName} + {items.length} {t('条规则')} +
+
e.stopPropagation()}> +
+
+ +
+ {items.map((rule) => ( +
+ onUpdate(rule._id, 'targetGroup', v)} + style={{ flex: 1 }} + /> + {rule.op !== OP_REMOVE ? ( + onUpdate(rule._id, 'description', v)} + style={{ flex: 1 }} + /> + ) : ( +
+ - +
+ )} + onRemove(rule._id)} + position='left' + > +
+ ))} +
+
+
+ ); +} + export default function GroupSpecialUsableRules({ value, groupNames = [], onChange, }) { const { t } = useTranslation(); - const [rules, setRules] = useState(() => flattenRules(parseJSON(value))); + const [newGroupName, setNewGroupName] = useState(''); const emitChange = useCallback( (newRules) => { @@ -106,41 +222,46 @@ export default function GroupSpecialUsableRules({ const updateRule = useCallback( (id, field, val) => { - const next = rules.map((r) => { - if (r._id !== id) return r; - const updated = { ...r, [field]: val }; - if (field === 'op' && val === OP_REMOVE) { - updated.description = 'remove'; - } else if (field === 'op' && r.op === OP_REMOVE && val !== OP_REMOVE) { - if (updated.description === 'remove') updated.description = ''; - } - return updated; - }); - emitChange(next); + emitChange( + rules.map((r) => { + if (r._id !== id) return r; + const updated = { ...r, [field]: val }; + if (field === 'op' && val === OP_REMOVE) updated.description = 'remove'; + else if (field === 'op' && r.op === OP_REMOVE && val !== OP_REMOVE) { + if (updated.description === 'remove') updated.description = ''; + } + return updated; + }), + ); }, [rules, emitChange], ); - const addRule = useCallback(() => { - emitChange([ - ...rules, - { - _id: uid(), - userGroup: '', - op: OP_APPEND, - targetGroup: '', - description: '', - }, - ]); - }, [rules, emitChange]); - const removeRule = useCallback( - (id) => { - emitChange(rules.filter((r) => r._id !== id)); + (id) => emitChange(rules.filter((r) => r._id !== id)), + [rules, emitChange], + ); + + const addRuleToGroup = useCallback( + (groupName) => { + emitChange([ + ...rules, + { _id: uid(), userGroup: groupName, op: OP_APPEND, targetGroup: '', description: '' }, + ]); }, [rules, emitChange], ); + const addNewGroup = useCallback(() => { + const name = newGroupName.trim(); + if (!name) return; + emitChange([ + ...rules, + { _id: uid(), userGroup: name, op: OP_APPEND, targetGroup: '', description: '' }, + ]); + setNewGroupName(''); + }, [rules, emitChange, newGroupName]); + const groupOptions = useMemo( () => groupNames.map((n) => ({ value: n, label: n })), [groupNames], @@ -155,120 +276,74 @@ export default function GroupSpecialUsableRules({ [t], ); - const columns = useMemo( - () => [ - { - title: t('用户分组'), - dataIndex: 'userGroup', - key: 'userGroup', - width: 180, - render: (_, record) => ( + const grouped = useMemo(() => { + const map = {}; + const order = []; + rules.forEach((r) => { + if (!r.userGroup) return; + if (!map[r.userGroup]) { + map[r.userGroup] = []; + order.push(r.userGroup); + } + map[r.userGroup].push(r); + }); + return order.map((name) => ({ name, items: map[name] })); + }, [rules]); + + if (grouped.length === 0 && rules.length === 0) { + return ( +
+ + {t('暂无规则,点击下方按钮添加')} + +
updateRule(record._id, 'op', v)} - style={{ width: '100%' }} - renderSelectedItem={(optionNode) => { - const tagInfo = OP_TAG_MAP[optionNode.value] || {}; - return ( - - {optionNode.label} - - ); - }} - /> - ), - }, - { - title: t('目标分组'), - dataIndex: 'targetGroup', - key: 'targetGroup', - width: 180, - render: (_, record) => ( - updateRule(record._id, 'targetGroup', v)} - /> - ), - }, - { - title: t('描述'), - dataIndex: 'description', - key: 'description', - render: (_, record) => - record.op === OP_REMOVE ? ( - - - ) : ( - updateRule(record._id, 'description', v)} - /> - ), - }, - { - title: '', - key: 'actions', - width: 50, - render: (_, record) => ( - removeRule(record._id)} - position='left' - > - +
+
+ ); + } return ( -
- - {t('暂无规则,点击下方按钮添加')} - - } - /> -
-
{duplicateNames.size > 0 && ( - {t('存在重复的分组名称:')}{Array.from(duplicateNames).join(', ')} + {t('存在重复的分组名称:')} + {Array.from(duplicateNames).join(', ')} )}
From 2bedd31b427a6ebd243808e29aead17038265124 Mon Sep 17 00:00:00 2001 From: MS Date: Mon, 13 Apr 2026 14:48:32 +0800 Subject: [PATCH 41/54] feat: display next quota reset time in subscription card (#4181) Show the next quota reset time for active subscriptions in the "My Subscriptions" section when a reset period is configured (next_reset_time > 0). Hidden when the subscription plan has no quota reset configured. --- web/src/components/topup/SubscriptionPlansCard.jsx | 8 ++++++++ web/src/i18n/locales/en.json | 1 + web/src/i18n/locales/fr.json | 1 + web/src/i18n/locales/ja.json | 1 + web/src/i18n/locales/ru.json | 1 + web/src/i18n/locales/vi.json | 1 + web/src/i18n/locales/zh-CN.json | 1 + web/src/i18n/locales/zh-TW.json | 1 + 8 files changed, 15 insertions(+) diff --git a/web/src/components/topup/SubscriptionPlansCard.jsx b/web/src/components/topup/SubscriptionPlansCard.jsx index a619c745..9c508283 100644 --- a/web/src/components/topup/SubscriptionPlansCard.jsx +++ b/web/src/components/topup/SubscriptionPlansCard.jsx @@ -442,6 +442,14 @@ const SubscriptionPlansCard = ({ (subscription?.end_time || 0) * 1000, ).toLocaleString()}
+ {isActive && subscription?.next_reset_time > 0 && ( +
+ {t('下一次重置')}:{' '} + {new Date( + subscription.next_reset_time * 1000, + ).toLocaleString()} +
+ )}
{t('总额度')}:{' '} {totalAmount > 0 ? ( diff --git a/web/src/i18n/locales/en.json b/web/src/i18n/locales/en.json index a72e2c62..eade595e 100644 --- a/web/src/i18n/locales/en.json +++ b/web/src/i18n/locales/en.json @@ -440,6 +440,7 @@ "余额充值管理": "Balance recharge management", "作废": "Invalidate", "作废于": "Invalidated at", + "下一次重置": "Next reset", "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "After invalidation, the subscription becomes invalid immediately. History is not affected. Continue?", "作用域": "Scope", "作用域:包含分组": "Scope: Include Group", diff --git a/web/src/i18n/locales/fr.json b/web/src/i18n/locales/fr.json index b870cb37..fed6b191 100644 --- a/web/src/i18n/locales/fr.json +++ b/web/src/i18n/locales/fr.json @@ -435,6 +435,7 @@ "余额充值管理": "Recharge du solde", "作废": "Invalider", "作废于": "Invalidé le", + "下一次重置": "Prochaine réinitialisation", "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "Après invalidation, l'abonnement devient immédiatement invalide. L'historique n'est pas affecté. Continuer ?", "作用域": "Portée", "作用域:包含分组": "Portée : inclure le groupe", diff --git a/web/src/i18n/locales/ja.json b/web/src/i18n/locales/ja.json index 18262d09..61641dfb 100644 --- a/web/src/i18n/locales/ja.json +++ b/web/src/i18n/locales/ja.json @@ -431,6 +431,7 @@ "余额充值管理": "残高チャージ管理", "作废": "無効化", "作废于": "無効化日", + "下一次重置": "次回リセット", "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "無効化するとこのサブスクリプションは直ちに失効します。履歴には影響しません。続行しますか?", "作用域": "スコープ", "作用域:包含分组": "スコープ:グループを含む", diff --git a/web/src/i18n/locales/ru.json b/web/src/i18n/locales/ru.json index ed261834..0986d336 100644 --- a/web/src/i18n/locales/ru.json +++ b/web/src/i18n/locales/ru.json @@ -438,6 +438,7 @@ "余额充值管理": "Управление пополнением баланса", "作废": "Аннулировать", "作废于": "Аннулировано", + "下一次重置": "Следующий сброс", "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "После аннулирования подписка сразу станет недействительной. История не изменится. Продолжить?", "作用域": "Область действия", "作用域:包含分组": "Область действия: включить группу", diff --git a/web/src/i18n/locales/vi.json b/web/src/i18n/locales/vi.json index f9e211d2..266fab5f 100644 --- a/web/src/i18n/locales/vi.json +++ b/web/src/i18n/locales/vi.json @@ -432,6 +432,7 @@ "余额充值管理": "Quản lý nạp tiền số dư", "作废": "Vô hiệu", "作废于": "Vô hiệu vào", + "下一次重置": "Đặt lại tiếp theo", "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "Sau khi vô hiệu, đăng ký sẽ mất hiệu lực ngay. Lịch sử không bị ảnh hưởng. Tiếp tục?", "作用域": "Phạm vi", "作用域:包含分组": "Phạm vi: Bao gồm nhóm", diff --git a/web/src/i18n/locales/zh-CN.json b/web/src/i18n/locales/zh-CN.json index d8b62bed..80f1a962 100644 --- a/web/src/i18n/locales/zh-CN.json +++ b/web/src/i18n/locales/zh-CN.json @@ -2797,6 +2797,7 @@ "至": "至", "过期于": "过期于", "作废于": "作废于", + "下一次重置": "下一次重置", "购买套餐后即可享受模型权益": "购买套餐后即可享受模型权益", "限购": "限购", "推荐": "推荐", diff --git a/web/src/i18n/locales/zh-TW.json b/web/src/i18n/locales/zh-TW.json index bddb9713..aaf6d33c 100644 --- a/web/src/i18n/locales/zh-TW.json +++ b/web/src/i18n/locales/zh-TW.json @@ -379,6 +379,7 @@ "余额充值管理": "餘額儲值管理", "作废": "作廢", "作废于": "作廢於", + "下一次重置": "下一次重置", "作废后该订阅将立即失效,历史记录不受影响。是否继续?": "作廢後該訂閱將立即失效,歷史記錄不受影響。是否繼續?", "你似乎并没有修改什么": "你似乎並沒有修改什麼", "你可以在“自定义模型名称”处手动添加它们,然后点击填入后再提交,或者直接使用下方操作自动处理。": "你可以在「自訂模型名稱」處手動添加它們,然後點擊填入後再提交,或者直接使用下方操作自動處理。", From 7cfaf6c3355013c0e4ad1d3ad171a0b756891dfb Mon Sep 17 00:00:00 2001 From: CaIon Date: Mon, 13 Apr 2026 15:12:12 +0800 Subject: [PATCH 42/54] feat: enhance dashboard charts with improved dimension handling and ranking logic --- .../hooks/dashboard/useDashboardCharts.jsx | 58 ++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/web/src/hooks/dashboard/useDashboardCharts.jsx b/web/src/hooks/dashboard/useDashboardCharts.jsx index 0d138350..ef0d47b0 100644 --- a/web/src/hooks/dashboard/useDashboardCharts.jsx +++ b/web/src/hooks/dashboard/useDashboardCharts.jsx @@ -214,6 +214,29 @@ export const useDashboardCharts = ( }, ], }, + dimension: { + content: [ + { + key: (datum) => datum['Model'], + value: (datum) => datum['Count'] || 0, + }, + ], + updateContent: (array) => { + array.sort((a, b) => b.value - a.value); + let sum = 0; + for (let i = 0; i < array.length; i++) { + let value = parseFloat(array[i].value); + if (isNaN(value)) value = 0; + sum += value; + array[i].value = renderNumber(value); + } + array.unshift({ + key: t('总计'), + value: renderNumber(sum), + }); + return array; + }, + }, }, color: { specified: modelColorMap, @@ -335,6 +358,27 @@ export const useDashboardCharts = ( value: (datum) => renderQuota(datum['rawQuota'] || 0, 4), }], }, + dimension: { + content: [{ + key: (datum) => datum['User'], + value: (datum) => datum['rawQuota'] || 0, + }], + updateContent: (array) => { + array.sort((a, b) => b.value - a.value); + let sum = 0; + for (let i = 0; i < array.length; i++) { + let value = parseFloat(array[i].value); + if (isNaN(value)) value = 0; + sum += value; + array[i].value = renderQuota(value, 4); + } + array.unshift({ + key: t('总计'), + value: renderQuota(sum, 4), + }); + return array; + }, + }, }, color: { type: 'ordinal', range: USER_COLORS }, }); @@ -463,13 +507,25 @@ export const useDashboardCharts = ( modelLineData.sort((a, b) => a.Time.localeCompare(b.Time)); // ===== 模型调用次数排行柱状图 ===== - const rankData = Array.from(modelTotals) + const MAX_RANK_MODELS = 20; + const allRankData = Array.from(modelTotals) .map(([model, count]) => ({ Model: model, Count: count, })) .sort((a, b) => b.Count - a.Count); + let rankData; + if (allRankData.length > MAX_RANK_MODELS) { + const topModels = allRankData.slice(0, MAX_RANK_MODELS); + const otherCount = allRankData + .slice(MAX_RANK_MODELS) + .reduce((sum, item) => sum + item.Count, 0); + rankData = [...topModels, { Model: t('其他'), Count: otherCount }]; + } else { + rankData = allRankData; + } + updateChartSpec( setSpecModelLine, modelLineData, From 3ab65a822174d1c984c61fa1a6f45feaee80ae56 Mon Sep 17 00:00:00 2001 From: woan1136 Date: Mon, 13 Apr 2026 15:23:38 +0800 Subject: [PATCH 43/54] fix: add Azure channel support for /v1/responses/compact URL routing (#4149) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Azure channel's GetRequestURL method only handled RelayModeResponses but missed RelayModeResponsesCompact. This caused compact requests to fall through to the generic deployments URL pattern, producing an incorrect path that Azure returns 404 for. This fix extends the existing responses API special handling to also cover the compact mode, appending /compact to the subUrl when the relay mode is ResponsesCompact. Affected URLs (before → after): - Normal Azure: /openai/deployments/{model}/responses/compact → /openai/v1/responses/compact - cognitiveservices: same pattern → /openai/responses/compact - Custom AzureResponsesVersion: properly respected for compact too Co-authored-by: 彭俊杰 --- relay/channel/openai/adaptor.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/relay/channel/openai/adaptor.go b/relay/channel/openai/adaptor.go index 2b7f71d6..56a58f28 100644 --- a/relay/channel/openai/adaptor.go +++ b/relay/channel/openai/adaptor.go @@ -136,8 +136,8 @@ func (a *Adaptor) GetRequestURL(info *relaycommon.RelayInfo) (string, error) { task = "chat/completions" + task } - // 特殊处理 responses API - if info.RelayMode == relayconstant.RelayModeResponses { + // 特殊处理 responses API(包含 compact) + if info.RelayMode == relayconstant.RelayModeResponses || info.RelayMode == relayconstant.RelayModeResponsesCompact { responsesApiVersion := "preview" subUrl := "/openai/v1/responses" @@ -150,6 +150,11 @@ func (a *Adaptor) GetRequestURL(info *relaycommon.RelayInfo) (string, error) { responsesApiVersion = info.ChannelOtherSettings.AzureResponsesVersion } + // compact 模式追加 /compact + if info.RelayMode == relayconstant.RelayModeResponsesCompact { + subUrl = subUrl + "/compact" + } + requestURL = fmt.Sprintf("%s?api-version=%s", subUrl, responsesApiVersion) return relaycommon.GetFullRequestURL(info.ChannelBaseUrl, requestURL, info.ChannelType), nil } From d15e14b117584294f94f0a9ee19f0c3d24c35db1 Mon Sep 17 00:00:00 2001 From: feitianbubu Date: Mon, 13 Apr 2026 15:47:15 +0800 Subject: [PATCH 44/54] feat: include admin username in quota adjustment logs --- controller/user.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/controller/user.go b/controller/user.go index 7921e337..a12d5c66 100644 --- a/controller/user.go +++ b/controller/user.go @@ -912,6 +912,7 @@ func ManageUser(c *gin.Context) { } user.Role = common.RoleCommonUser case "add_quota": + adminName := c.GetString("username") switch req.Mode { case "add": if req.Value <= 0 { @@ -923,7 +924,7 @@ func ManageUser(c *gin.Context) { return } model.RecordLog(user.Id, model.LogTypeManage, - fmt.Sprintf("管理员增加用户额度 %s", logger.LogQuota(req.Value))) + fmt.Sprintf("管理员(%s)增加用户额度 %s", adminName, logger.LogQuota(req.Value))) case "subtract": if req.Value <= 0 { common.ApiErrorI18n(c, i18n.MsgUserQuotaChangeZero) @@ -934,7 +935,7 @@ func ManageUser(c *gin.Context) { return } model.RecordLog(user.Id, model.LogTypeManage, - fmt.Sprintf("管理员减少用户额度 %s", logger.LogQuota(req.Value))) + fmt.Sprintf("管理员(%s)减少用户额度 %s", adminName, logger.LogQuota(req.Value))) case "override": oldQuota := user.Quota if err := model.DB.Model(&model.User{}).Where("id = ?", user.Id).Update("quota", req.Value).Error; err != nil { @@ -942,7 +943,7 @@ func ManageUser(c *gin.Context) { return } model.RecordLog(user.Id, model.LogTypeManage, - fmt.Sprintf("管理员覆盖用户额度从 %s 为 %s", logger.LogQuota(oldQuota), logger.LogQuota(req.Value))) + fmt.Sprintf("管理员(%s)覆盖用户额度从 %s 为 %s", adminName, logger.LogQuota(oldQuota), logger.LogQuota(req.Value))) default: common.ApiErrorI18n(c, i18n.MsgInvalidParams) return From 8c8661d0d77c859e2853b886fd6c5d7649eeb401 Mon Sep 17 00:00:00 2001 From: CaIon Date: Mon, 13 Apr 2026 16:39:12 +0800 Subject: [PATCH 45/54] refactor: clean up unused imports and commented-out code in channel.go --- service/channel.go | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/service/channel.go b/service/channel.go index 96bc1efe..f93b29a2 100644 --- a/service/channel.go +++ b/service/channel.go @@ -2,11 +2,9 @@ package service import ( "fmt" - "net/http" "strings" "github.com/QuantumNous/new-api/common" - "github.com/QuantumNous/new-api/constant" "github.com/QuantumNous/new-api/dto" "github.com/QuantumNous/new-api/model" "github.com/QuantumNous/new-api/setting/operation_setting" @@ -63,12 +61,12 @@ func ShouldDisableChannel(channelType int, err *types.NewAPIError) bool { //if err.StatusCode == http.StatusUnauthorized { // return true //} - if err.StatusCode == http.StatusForbidden { - switch channelType { - case constant.ChannelTypeGemini: - return true - } - } + //if err.StatusCode == http.StatusForbidden { + // switch channelType { + // case constant.ChannelTypeGemini: + // return true + // } + //} oaiErr := err.ToOpenAIError() switch oaiErr.Code { case "invalid_api_key": From ee7cedd5776cafbd9dd39fdee88cee51614b293d Mon Sep 17 00:00:00 2001 From: power <244875489@qq.com> Date: Wed, 15 Apr 2026 20:51:10 +0800 Subject: [PATCH 46/54] fix: use json.RawMessage for Instructions field in OpenAIResponsesResponse (#4260) The Instructions field in OpenAIResponsesResponse was defined as string, but upstream providers may return null or non-string JSON values for this field. This causes json.Unmarshal to fail, resulting in HTTP 500 on /v1/responses endpoint. Other fields in the same struct (Status, ToolChoice, Truncation, etc.) already use json.RawMessage. The request-side DTO (openai_request.go) also defines Instructions as json.RawMessage. This fix aligns the response-side with both patterns. Co-authored-by: 40005415C\Administrator Co-authored-by: Claude Opus 4.6 --- dto/openai_response.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dto/openai_response.go b/dto/openai_response.go index b5bc7b0d..c3673bb4 100644 --- a/dto/openai_response.go +++ b/dto/openai_response.go @@ -272,7 +272,7 @@ type OpenAIResponsesResponse struct { Status json.RawMessage `json:"status"` Error any `json:"error,omitempty"` IncompleteDetails *IncompleteDetails `json:"incomplete_details,omitempty"` - Instructions string `json:"instructions"` + Instructions json.RawMessage `json:"instructions"` MaxOutputTokens int `json:"max_output_tokens"` Model string `json:"model"` Output []ResponsesOutput `json:"output"` From d0c2d2c6fbb6beb33ac8f5d88b5cbb165663c036 Mon Sep 17 00:00:00 2001 From: wans10 <51012039+wans10@users.noreply.github.com> Date: Wed, 15 Apr 2026 20:53:58 +0800 Subject: [PATCH 47/54] =?UTF-8?q?fix(channel):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=A4=9A=E5=AF=86=E9=92=A5=E7=AE=A1=E7=90=86=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E7=B4=A2=E5=BC=95=E6=98=BE=E7=A4=BA=EF=BC=8C=E5=B0=86=E7=B4=A2?= =?UTF-8?q?=E5=BC=95=E5=80=BC=E8=B0=83=E6=95=B4=E4=B8=BA=E4=BB=8E1?= =?UTF-8?q?=E5=BC=80=E5=A7=8B=20(#4231)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/table/channels/modals/MultiKeyManageModal.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/components/table/channels/modals/MultiKeyManageModal.jsx b/web/src/components/table/channels/modals/MultiKeyManageModal.jsx index 5e496131..fa7870da 100644 --- a/web/src/components/table/channels/modals/MultiKeyManageModal.jsx +++ b/web/src/components/table/channels/modals/MultiKeyManageModal.jsx @@ -360,7 +360,7 @@ const MultiKeyManageModal = ({ visible, onCancel, channel, onRefresh }) => { { title: t('索引'), dataIndex: 'index', - render: (text) => `#${text}`, + render: (text) => `#${Number(text) + 1}`, }, // { // title: t('密钥预览'), From f7adf02eb4b4afcae3af7d581e4b88fa9e32420c Mon Sep 17 00:00:00 2001 From: Seefs <40468931+seefs001@users.noreply.github.com> Date: Wed, 15 Apr 2026 20:55:01 +0800 Subject: [PATCH 48/54] feat(claude): add cache_control and speed passthrough controls (#4247) --- docs/openapi/relay.json | 54 ++++++++++++++++++- dto/channel_settings.go | 1 + dto/claude.go | 12 +++-- relay/common/override.go | 1 + relay/common/override_test.go | 20 ++++++- relay/common/relay_info.go | 8 +++ .../channels/modals/EditChannelModal.jsx | 7 +++ web/src/i18n/locales/en.json | 2 + web/src/i18n/locales/fr.json | 2 + web/src/i18n/locales/ja.json | 2 + web/src/i18n/locales/ru.json | 2 + web/src/i18n/locales/vi.json | 2 + web/src/i18n/locales/zh-CN.json | 2 + web/src/i18n/locales/zh-TW.json | 4 ++ 14 files changed, 113 insertions(+), 6 deletions(-) diff --git a/docs/openapi/relay.json b/docs/openapi/relay.json index b6dfbd31..62a0b65b 100644 --- a/docs/openapi/relay.json +++ b/docs/openapi/relay.json @@ -3281,6 +3281,13 @@ } ] }, + "cache_control": { + "type": "object", + "properties": {} + }, + "inference_geo": { + "type": "string" + }, "max_tokens": { "type": "integer", "minimum": 1 @@ -3333,7 +3340,8 @@ "enum": [ "auto", "any", - "tool" + "tool", + "none" ] }, "name": { @@ -3358,6 +3366,36 @@ } } }, + "context_management": { + "type": "object", + "properties": {} + }, + "output_config": { + "type": "object", + "properties": {} + }, + "output_format": { + "type": "object", + "properties": {} + }, + "container": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": {} + } + ] + }, + "mcp_servers": { + "type": "array", + "items": { + "type": "object", + "properties": {} + } + }, "metadata": { "type": "object", "properties": { @@ -3365,6 +3403,20 @@ "type": "string" } } + }, + "speed": { + "type": "string", + "enum": [ + "standard", + "fast" + ] + }, + "service_tier": { + "type": "string", + "enum": [ + "auto", + "standard_only" + ] } } }, diff --git a/dto/channel_settings.go b/dto/channel_settings.go index 8d7466d2..b6a1ab9f 100644 --- a/dto/channel_settings.go +++ b/dto/channel_settings.go @@ -30,6 +30,7 @@ type ChannelOtherSettings struct { ClaudeBetaQuery bool `json:"claude_beta_query,omitempty"` // Claude 渠道是否强制追加 ?beta=true AllowServiceTier bool `json:"allow_service_tier,omitempty"` // 是否允许 service_tier 透传(默认过滤以避免额外计费) AllowInferenceGeo bool `json:"allow_inference_geo,omitempty"` // 是否允许 inference_geo 透传(仅 Claude,默认过滤以满足数据驻留合规 + AllowSpeed bool `json:"allow_speed,omitempty"` // 是否允许 speed 透传(仅 Claude,默认过滤以避免意外切换推理速度模式) AllowSafetyIdentifier bool `json:"allow_safety_identifier,omitempty"` // 是否允许 safety_identifier 透传(默认过滤以保护用户隐私) DisableStore bool `json:"disable_store,omitempty"` // 是否禁用 store 透传(默认允许透传,禁用后可能导致 Codex 无法使用) AllowIncludeObfuscation bool `json:"allow_include_obfuscation,omitempty"` // 是否允许 stream_options.include_obfuscation 透传(默认过滤以避免关闭流混淆保护) diff --git a/dto/claude.go b/dto/claude.go index d292f97e..b35d6565 100644 --- a/dto/claude.go +++ b/dto/claude.go @@ -204,10 +204,11 @@ type ClaudeToolChoice struct { } type ClaudeRequest struct { - Model string `json:"model"` - Prompt string `json:"prompt,omitempty"` - System any `json:"system,omitempty"` - Messages []ClaudeMessage `json:"messages,omitempty"` + Model string `json:"model"` + Prompt string `json:"prompt,omitempty"` + System any `json:"system,omitempty"` + Messages []ClaudeMessage `json:"messages,omitempty"` + CacheControl json.RawMessage `json:"cache_control,omitempty"` // InferenceGeo controls Claude data residency region. // This field is filtered by default and can be enabled via channel setting allow_inference_geo. InferenceGeo string `json:"inference_geo,omitempty"` @@ -227,6 +228,9 @@ type ClaudeRequest struct { Thinking *Thinking `json:"thinking,omitempty"` McpServers json.RawMessage `json:"mcp_servers,omitempty"` Metadata json.RawMessage `json:"metadata,omitempty"` + // Speed specifies the Claude inference speed mode. + // This field is filtered by default and can be enabled via channel setting allow_speed. + Speed json.RawMessage `json:"speed,omitempty"` // ServiceTier specifies upstream service level and may affect billing. // This field is filtered by default and can be enabled via channel setting allow_service_tier. ServiceTier string `json:"service_tier,omitempty"` diff --git a/relay/common/override.go b/relay/common/override.go index af0b4361..1a28303f 100644 --- a/relay/common/override.go +++ b/relay/common/override.go @@ -32,6 +32,7 @@ var paramOverrideKeyAuditPaths = map[string]struct{}{ "upstream_model": {}, "service_tier": {}, "inference_geo": {}, + "speed": {}, } type paramOverrideAuditRecorder struct { diff --git a/relay/common/override_test.go b/relay/common/override_test.go index 1a7793ba..6e35cf73 100644 --- a/relay/common/override_test.go +++ b/relay/common/override_test.go @@ -2038,6 +2038,8 @@ func TestRemoveDisabledFieldsDefaultFiltering(t *testing.T) { input := `{ "service_tier":"flex", "inference_geo":"eu", + "speed":"fast", + "cache_control":{"type":"ephemeral"}, "safety_identifier":"user-123", "store":true, "stream_options":{"include_obfuscation":false} @@ -2048,7 +2050,7 @@ func TestRemoveDisabledFieldsDefaultFiltering(t *testing.T) { if err != nil { t.Fatalf("RemoveDisabledFields returned error: %v", err) } - assertJSONEqual(t, `{"store":true}`, string(out)) + assertJSONEqual(t, `{"cache_control":{"type":"ephemeral"},"store":true}`, string(out)) } func TestRemoveDisabledFieldsAllowInferenceGeo(t *testing.T) { @@ -2067,6 +2069,22 @@ func TestRemoveDisabledFieldsAllowInferenceGeo(t *testing.T) { assertJSONEqual(t, `{"inference_geo":"eu","store":true}`, string(out)) } +func TestRemoveDisabledFieldsAllowSpeed(t *testing.T) { + input := `{ + "speed":"fast", + "store":true + }` + settings := dto.ChannelOtherSettings{ + AllowSpeed: true, + } + + out, err := RemoveDisabledFields([]byte(input), settings, false) + if err != nil { + t.Fatalf("RemoveDisabledFields returned error: %v", err) + } + assertJSONEqual(t, `{"speed":"fast","store":true}`, string(out)) +} + func TestApplyParamOverrideWithRelayInfoRecordsOperationAuditInDebugMode(t *testing.T) { originalDebugEnabled := common2.DebugEnabled common2.DebugEnabled = true diff --git a/relay/common/relay_info.go b/relay/common/relay_info.go index 0bb75ee6..2e157fc8 100644 --- a/relay/common/relay_info.go +++ b/relay/common/relay_info.go @@ -771,6 +771,7 @@ func FailTaskInfo(reason string) *TaskInfo { // RemoveDisabledFields 从请求 JSON 数据中移除渠道设置中禁用的字段 // service_tier: 服务层级字段,可能导致额外计费(OpenAI、Claude、Responses API 支持) // inference_geo: Claude 数据驻留推理区域字段(仅 Claude 支持,默认过滤) +// speed: Claude 推理速度模式字段(仅 Claude 支持,默认过滤) // store: 数据存储授权字段,涉及用户隐私(仅 OpenAI、Responses API 支持,默认允许透传,禁用后可能导致 Codex 无法使用) // safety_identifier: 安全标识符,用于向 OpenAI 报告违规用户(仅 OpenAI 支持,涉及用户隐私) // stream_options.include_obfuscation: 响应流混淆控制字段(仅 OpenAI Responses API 支持) @@ -799,6 +800,13 @@ func RemoveDisabledFields(jsonData []byte, channelOtherSettings dto.ChannelOther } } + // 默认移除 speed,除非明确允许(避免意外切换 Claude 推理速度模式) + if !channelOtherSettings.AllowSpeed { + if _, exists := data["speed"]; exists { + delete(data, "speed") + } + } + // 默认允许 store 透传,除非明确禁用(禁用可能影响 Codex 使用) if channelOtherSettings.DisableStore { if _, exists := data["store"]; exists { diff --git a/web/src/components/table/channels/modals/EditChannelModal.jsx b/web/src/components/table/channels/modals/EditChannelModal.jsx index 899e2905..f0395d2f 100644 --- a/web/src/components/table/channels/modals/EditChannelModal.jsx +++ b/web/src/components/table/channels/modals/EditChannelModal.jsx @@ -208,6 +208,7 @@ const EditChannelModal = (props) => { allow_safety_identifier: false, allow_include_obfuscation: false, allow_inference_geo: false, + allow_speed: false, claude_beta_query: false, upstream_model_update_check_enabled: false, upstream_model_update_auto_sync_enabled: false, @@ -890,6 +891,7 @@ const EditChannelModal = (props) => { parsedSettings.allow_include_obfuscation || false; data.allow_inference_geo = parsedSettings.allow_inference_geo || false; + data.allow_speed = parsedSettings.allow_speed || false; data.claude_beta_query = parsedSettings.claude_beta_query || false; data.upstream_model_update_check_enabled = parsedSettings.upstream_model_update_check_enabled === true; @@ -919,6 +921,7 @@ const EditChannelModal = (props) => { data.allow_safety_identifier = false; data.allow_include_obfuscation = false; data.allow_inference_geo = false; + data.allow_speed = false; data.claude_beta_query = false; data.upstream_model_update_check_enabled = false; data.upstream_model_update_auto_sync_enabled = false; @@ -936,6 +939,7 @@ const EditChannelModal = (props) => { data.allow_safety_identifier = false; data.allow_include_obfuscation = false; data.allow_inference_geo = false; + data.allow_speed = false; data.claude_beta_query = false; data.upstream_model_update_check_enabled = false; data.upstream_model_update_auto_sync_enabled = false; @@ -1776,6 +1780,7 @@ const EditChannelModal = (props) => { } if (localInputs.type === 14) { settings.allow_inference_geo = localInputs.allow_inference_geo === true; + settings.allow_speed = localInputs.allow_speed === true; settings.claude_beta_query = localInputs.claude_beta_query === true; } } @@ -1823,6 +1828,7 @@ const EditChannelModal = (props) => { delete localInputs.allow_safety_identifier; delete localInputs.allow_include_obfuscation; delete localInputs.allow_inference_geo; + delete localInputs.allow_speed; delete localInputs.claude_beta_query; delete localInputs.upstream_model_update_check_enabled; delete localInputs.upstream_model_update_auto_sync_enabled; @@ -2480,6 +2486,7 @@ const EditChannelModal = (props) => {
handleChannelOtherSettingsChange('allow_service_tier', value)} extraText={t('service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用')} /> handleChannelOtherSettingsChange('allow_inference_geo', value)} extraText={t('inference_geo 字段用于控制 Claude 数据驻留推理区域。默认关闭以避免未经授权透传地域信息')} /> + handleChannelOtherSettingsChange('allow_speed', value)} extraText={t('speed 字段用于控制 Claude 推理速度模式。默认关闭以避免意外切换到 fast 模式')} /> )} diff --git a/web/src/i18n/locales/en.json b/web/src/i18n/locales/en.json index eade595e..e273c38b 100644 --- a/web/src/i18n/locales/en.json +++ b/web/src/i18n/locales/en.json @@ -250,6 +250,7 @@ "price_xxx 的商品价格 ID,新建产品后可获得": "Product price ID for price_xxx, available after creating new product", "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "The safety_identifier field helps OpenAI identify application users who may violate usage policies. Disabled by default to protect user privacy", "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "The service_tier field is used to specify service level. Allowing pass-through may result in higher billing than expected. Disabled by default to avoid extra charges", + "speed 字段用于控制 Claude 推理速度模式。默认关闭以避免意外切换到 fast 模式": "The speed field controls Claude inference speed mode. Disabled by default to avoid unintentionally switching to fast mode", "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "Stripe key for sk_xxx or rk_xxx, sensitive information not displayed", "standard 已被移除,vip 用户看不到": "standard has been removed, vip users cannot see it", "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "The store field authorizes OpenAI to store request data for product evaluation and optimization. Disabled by default. Enabling may cause Codex to malfunction", @@ -581,6 +582,7 @@ "允许 inference_geo 透传": "Allow inference_geo Pass-through", "允许 safety_identifier 透传": "Allow safety_identifier Pass-through", "允许 service_tier 透传": "Allow service_tier Pass-through", + "允许 speed 透传": "Allow speed Pass-through", "允许 stream_options.include_obfuscation 透传": "Allow stream_options.include_obfuscation Pass-through", "允许不安全的 Origin(HTTP)": "Allow insecure Origin (HTTP)", "允许回调(会泄露服务器 IP 地址)": "Allow callback (will leak server IP address)", diff --git a/web/src/i18n/locales/fr.json b/web/src/i18n/locales/fr.json index fed6b191..61c6c370 100644 --- a/web/src/i18n/locales/fr.json +++ b/web/src/i18n/locales/fr.json @@ -246,6 +246,7 @@ "price_xxx 的商品价格 ID,新建产品后可获得": "ID de prix du produit price_xxx, peut être obtenu après la création d'un nouveau produit", "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "Le champ safety_identifier aide OpenAI à identifier les utilisateurs d'applications susceptibles de violer les politiques d'utilisation. Désactivé par défaut pour protéger la confidentialité des utilisateurs", "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "Le champ service_tier est utilisé pour spécifier le niveau de service. Permettre le passage peut entraîner une facturation plus élevée que prévu. Désactivé par défaut pour éviter des frais supplémentaires", + "speed 字段用于控制 Claude 推理速度模式。默认关闭以避免意外切换到 fast 模式": "Le champ speed contrôle le mode de vitesse d'inférence de Claude. Désactivé par défaut pour éviter un passage involontaire au mode fast", "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "Clé secrète Stripe sk_xxx ou rk_xxx, les informations sensibles ne sont pas affichées", "standard 已被移除,vip 用户看不到": "standard has been removed, vip users cannot see it", "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "Le champ store autorise OpenAI à stocker les données de requête pour l'évaluation et l'optimisation du produit. Désactivé par défaut. L'activation peut causer un dysfonctionnement de Codex", @@ -574,6 +575,7 @@ "允许 inference_geo 透传": "Autoriser la transmission de inference_geo", "允许 safety_identifier 透传": "Autoriser le passage de safety_identifier", "允许 service_tier 透传": "Autoriser le passage de service_tier", + "允许 speed 透传": "Autoriser la transmission de speed", "允许 stream_options.include_obfuscation 透传": "Autoriser la transmission de stream_options.include_obfuscation", "允许不安全的 Origin(HTTP)": "Autoriser une origine non sécurisée (HTTP)", "允许回调(会泄露服务器 IP 地址)": "Autoriser le rappel (divulguera l'adresse IP du serveur)", diff --git a/web/src/i18n/locales/ja.json b/web/src/i18n/locales/ja.json index 61641dfb..e0dc5a72 100644 --- a/web/src/i18n/locales/ja.json +++ b/web/src/i18n/locales/ja.json @@ -242,6 +242,7 @@ "price_xxx 的商品价格 ID,新建产品后可获得": "price_xxx の料金ID。新規製品の作成後に取得できます", "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "safety_identifierフィールドは、OpenAIが利用ポリシーに違反する可能性のあるアプリユーザーを特定するために使用されます。ユーザーのプライバシーを保護するため、デフォルトでは無効です", "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "service_tierフィールドはサービス階層の指定に使用されます。パススルーを許可すると実際の課金額が想定を上回る場合があるため、追加料金を避けるためにデフォルトでは無効になっています", + "speed 字段用于控制 Claude 推理速度模式。默认关闭以避免意外切换到 fast 模式": "speed フィールドは Claude の推論速度モードを制御します。意図せず fast モードへ切り替わるのを避けるため、デフォルトで無効です", "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "sk_xxx または rk_xxx のStripe APIキー。機密情報は表示されません", "standard 已被移除,vip 用户看不到": "standard は削除され、vipユーザーには表示されません", "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "storeフィールドは、製品の評価と最適化のためにOpenAIがリクエストデータを保存することを許可します。デフォルトでは無効です。有効にすると、Codexが正常に利用できなくなる場合があります", @@ -570,6 +571,7 @@ "允许 inference_geo 透传": "inference_geoパススルーを許可", "允许 safety_identifier 透传": "safety_identifierのパススルーを許可する", "允许 service_tier 透传": "service_tierのパススルーを許可する", + "允许 speed 透传": "speed パススルーを許可", "允许 stream_options.include_obfuscation 透传": "stream_options.include_obfuscationパススルーを許可", "允许不安全的 Origin(HTTP)": "安全でないオリジン(HTTP)を許可する", "允许回调(会泄露服务器 IP 地址)": "コールバックを許可する(サーバーIPアドレスが漏洩します)", diff --git a/web/src/i18n/locales/ru.json b/web/src/i18n/locales/ru.json index 0986d336..a3503904 100644 --- a/web/src/i18n/locales/ru.json +++ b/web/src/i18n/locales/ru.json @@ -249,6 +249,7 @@ "price_xxx 的商品价格 ID,新建产品后可获得": "ID цены товара price_xxx, можно получить после создания нового продукта", "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "Поле safety_identifier помогает OpenAI идентифицировать пользователей приложений, которые могут нарушать политику использования. По умолчанию отключено для защиты конфиденциальности пользователей", "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "Поле service_tier используется для указания уровня сервиса, позволяет передавать параметры, которые могут привести к фактической оплате выше ожидаемой. По умолчанию отключено для избежания дополнительных расходов", + "speed 字段用于控制 Claude 推理速度模式。默认关闭以避免意外切换到 fast 模式": "Поле speed управляет режимом скорости инференса Claude. По умолчанию отключено, чтобы избежать непреднамеренного переключения в режим fast", "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "Ключ Stripe sk_xxx или rk_xxx, конфиденциальная информация не отображается", "standard 已被移除,vip 用户看不到": "standard has been removed, vip users cannot see it", "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "Поле store используется для авторизации OpenAI хранить данные запросов для оценки и оптимизации продукта. По умолчанию отключено, после включения может привести к неработоспособности Codex", @@ -577,6 +578,7 @@ "允许 inference_geo 透传": "Разрешить передачу inference_geo", "允许 safety_identifier 透传": "Разрешить сквозную передачу safety_identifier", "允许 service_tier 透传": "Разрешить сквозную передачу service_tier", + "允许 speed 透传": "Разрешить передачу speed", "允许 stream_options.include_obfuscation 透传": "Разрешить передачу stream_options.include_obfuscation", "允许不安全的 Origin(HTTP)": "Разрешить небезопасные Origin (HTTP)", "允许回调(会泄露服务器 IP 地址)": "Разрешить обратные вызовы (может раскрыть IP-адрес сервера)", diff --git a/web/src/i18n/locales/vi.json b/web/src/i18n/locales/vi.json index 266fab5f..dc3de89f 100644 --- a/web/src/i18n/locales/vi.json +++ b/web/src/i18n/locales/vi.json @@ -243,6 +243,7 @@ "price_xxx 的商品价格 ID,新建产品后可获得": "ID giá sản phẩm cho price_xxx, có sẵn sau khi tạo sản phẩm mới", "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "Trường safety_identifier giúp OpenAI xác định người dùng ứng dụng có thể vi phạm chính sách sử dụng. Tắt theo mặc định để bảo vệ quyền riêng tư của người dùng", "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "Trường service_tier được sử dụng để chỉ định cấp độ dịch vụ. Cho phép truyền qua có thể dẫn đến việc tính phí thực tế cao hơn dự kiến. Tắt theo mặc định để tránh phí bổ sung", + "speed 字段用于控制 Claude 推理速度模式。默认关闭以避免意外切换到 fast 模式": "Trường speed kiểm soát chế độ tốc độ suy luận Claude. Mặc định tắt để tránh vô tình chuyển sang chế độ fast", "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "Khóa Stripe cho sk_xxx hoặc rk_xxx, thông tin nhạy cảm không được hiển thị", "standard 已被移除,vip 用户看不到": "standard has been removed, vip users cannot see it", "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "Trường store ủy quyền cho OpenAI lưu trữ dữ liệu yêu cầu để đánh giá và tối ưu hóa sản phẩm. Tắt theo mặc định. Bật có thể khiến Codex hoạt động không chính xác", @@ -571,6 +572,7 @@ "允许 inference_geo 透传": "Cho phép truyền inference_geo", "允许 safety_identifier 透传": "Cho phép safety_identifier truyền qua", "允许 service_tier 透传": "Cho phép service_tier truyền qua", + "允许 speed 透传": "Cho phép truyền speed", "允许 stream_options.include_obfuscation 透传": "Cho phép truyền stream_options.include_obfuscation", "允许不安全的 Origin(HTTP)": "Cho phép Origin không an toàn (HTTP)", "允许回调(会泄露服务器 IP 地址)": "Cho phép gọi lại (sẽ làm lộ địa chỉ IP máy chủ)", diff --git a/web/src/i18n/locales/zh-CN.json b/web/src/i18n/locales/zh-CN.json index 80f1a962..a64e50d0 100644 --- a/web/src/i18n/locales/zh-CN.json +++ b/web/src/i18n/locales/zh-CN.json @@ -140,6 +140,7 @@ "Reasoning Effort": "Reasoning Effort", "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私", "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用", + "speed 字段用于控制 Claude 推理速度模式。默认关闭以避免意外切换到 fast 模式": "speed 字段用于控制 Claude 推理速度模式。默认关闭以避免意外切换到 fast 模式", "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示", "SMTP 发送者邮箱": "SMTP 发送者邮箱", "SMTP 服务器地址": "SMTP 服务器地址", @@ -410,6 +411,7 @@ "允许 HTTP 协议图片请求(适用于自部署代理)": "允许 HTTP 协议图片请求(适用于自部署代理)", "允许 safety_identifier 透传": "允许 safety_identifier 透传", "允许 service_tier 透传": "允许 service_tier 透传", + "允许 speed 透传": "允许 speed 透传", "允许 Turnstile 用户校验": "允许 Turnstile 用户校验", "允许不安全的 Origin(HTTP)": "允许不安全的 Origin(HTTP)", "允许回调(会泄露服务器 IP 地址)": "允许回调(会泄露服务器 IP 地址)", diff --git a/web/src/i18n/locales/zh-TW.json b/web/src/i18n/locales/zh-TW.json index aaf6d33c..1f9351c6 100644 --- a/web/src/i18n/locales/zh-TW.json +++ b/web/src/i18n/locales/zh-TW.json @@ -198,9 +198,11 @@ "default为默认设置,可单独设置每个分类的安全等级": "default為預設設定,可單獨設定每個分類的安全等級", "default为默认设置,可单独设置每个模型的版本": "default為預設設定,可單獨設定每個模型的版本", "false": "false", + "inference_geo 字段用于控制 Claude 数据驻留推理区域。默认关闭以避免未经授权透传地域信息": "inference_geo 字段用於控制 Claude 資料駐留推理區域。預設關閉以避免未經授權透傳地域資訊", "price_xxx 的商品价格 ID,新建产品后可获得": "price_xxx 的商品價格 ID,新建產品後可獲得", "safety_identifier 字段用于帮助 OpenAI 识别可能违反使用政策的应用程序用户。默认关闭以保护用户隐私": "safety_identifier 字段用於幫助 OpenAI 識別可能違反使用政策的應用程式使用者。預設關閉以保護使用者隱私", "service_tier 字段用于指定服务层级,允许透传可能导致实际计费高于预期。默认关闭以避免额外费用": "service_tier 字段用於指定服務層級,允許透傳可能導致實際計費高於預期。預設關閉以避免額外費用", + "speed 字段用于控制 Claude 推理速度模式。默认关闭以避免意外切换到 fast 模式": "speed 字段用於控制 Claude 推理速度模式。預設關閉以避免意外切換到 fast 模式", "sk_xxx 或 rk_xxx 的 Stripe 密钥,敏感信息不显示": "sk_xxx 或 rk_xxx 的 Stripe 密鑰,敏感資訊不顯示", "standard 已被移除,vip 用户看不到": "standard 已被移除,vip 使用者看不到", "store 字段用于授权 OpenAI 存储请求数据以评估和优化产品。默认关闭,开启后可能导致 Codex 无法正常使用": "store 字段用於授權 OpenAI 存儲請求數據以評估和優化產品。預設關閉,開啟後可能導致 Codex 無法正常使用", @@ -498,6 +500,8 @@ "允许 Turnstile 用户校验": "允許 Turnstile 使用者校驗", "允许 safety_identifier 透传": "允許 safety_identifier 透傳", "允许 service_tier 透传": "允許 service_tier 透傳", + "允许 inference_geo 透传": "允許 inference_geo 透傳", + "允许 speed 透传": "允許 speed 透傳", "允许不安全的 Origin(HTTP)": "允許不安全的 Origin(HTTP)", "允许回调(会泄露服务器 IP 地址)": "允許回調(會洩露伺服器 IP 位址)", "允许在 Stripe 支付中输入促销码": "允許在 Stripe 支付中輸入促銷碼", From b2a40d338170ca50c49bbe7b2e9b7562427867b9 Mon Sep 17 00:00:00 2001 From: CaIon Date: Wed, 15 Apr 2026 20:55:31 +0800 Subject: [PATCH 49/54] feat: enhance Stripe webhook handling for async payment events --- controller/topup_stripe.go | 73 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 3 deletions(-) diff --git a/controller/topup_stripe.go b/controller/topup_stripe.go index e1718cc5..5c92d272 100644 --- a/controller/topup_stripe.go +++ b/controller/topup_stripe.go @@ -146,6 +146,12 @@ func RequestStripePay(c *gin.Context) { } func StripeWebhook(c *gin.Context) { + if setting.StripeWebhookSecret == "" { + log.Println("Stripe Webhook Secret 未配置,拒绝处理") + c.AbortWithStatus(http.StatusForbidden) + return + } + payload, err := io.ReadAll(c.Request.Body) if err != nil { log.Printf("解析Stripe Webhook参数失败: %v\n", err) @@ -154,8 +160,7 @@ func StripeWebhook(c *gin.Context) { } signature := c.GetHeader("Stripe-Signature") - endpointSecret := setting.StripeWebhookSecret - event, err := webhook.ConstructEventWithOptions(payload, signature, endpointSecret, webhook.ConstructEventOptions{ + event, err := webhook.ConstructEventWithOptions(payload, signature, setting.StripeWebhookSecret, webhook.ConstructEventOptions{ IgnoreAPIVersionMismatch: true, }) @@ -170,6 +175,10 @@ func StripeWebhook(c *gin.Context) { sessionCompleted(event) case stripe.EventTypeCheckoutSessionExpired: sessionExpired(event) + case stripe.EventTypeCheckoutSessionAsyncPaymentSucceeded: + sessionAsyncPaymentSucceeded(event) + case stripe.EventTypeCheckoutSessionAsyncPaymentFailed: + sessionAsyncPaymentFailed(event) default: log.Printf("不支持的Stripe Webhook事件类型: %s\n", event.Type) } @@ -186,7 +195,65 @@ func sessionCompleted(event stripe.Event) { return } - // Try complete subscription order first + paymentStatus := event.GetObjectValue("payment_status") + if paymentStatus != "paid" { + log.Printf("Stripe Checkout 支付尚未完成,payment_status: %s, ref: %s(等待异步支付结果)", paymentStatus, referenceId) + return + } + + fulfillOrder(event, referenceId, customerId) +} + +// sessionAsyncPaymentSucceeded handles delayed payment methods (bank transfer, SEPA, etc.) +// that confirm payment after the checkout session completes. +func sessionAsyncPaymentSucceeded(event stripe.Event) { + customerId := event.GetObjectValue("customer") + referenceId := event.GetObjectValue("client_reference_id") + log.Printf("Stripe 异步支付成功: %s", referenceId) + + fulfillOrder(event, referenceId, customerId) +} + +// sessionAsyncPaymentFailed marks orders as failed when delayed payment methods +// ultimately fail (e.g. bank transfer not received, SEPA rejected). +func sessionAsyncPaymentFailed(event stripe.Event) { + referenceId := event.GetObjectValue("client_reference_id") + log.Printf("Stripe 异步支付失败: %s", referenceId) + + if len(referenceId) == 0 { + log.Println("异步支付失败事件未提供支付单号") + return + } + + LockOrder(referenceId) + defer UnlockOrder(referenceId) + + topUp := model.GetTopUpByTradeNo(referenceId) + if topUp == nil { + log.Println("异步支付失败,充值订单不存在:", referenceId) + return + } + + if topUp.Status != common.TopUpStatusPending { + log.Printf("异步支付失败,订单状态非pending: %s, ref: %s", topUp.Status, referenceId) + return + } + + topUp.Status = common.TopUpStatusFailed + if err := topUp.Update(); err != nil { + log.Printf("标记充值订单失败出错: %v, ref: %s", err, referenceId) + return + } + log.Printf("充值订单已标记为失败: %s", referenceId) +} + +// fulfillOrder is the shared logic for crediting quota after payment is confirmed. +func fulfillOrder(event stripe.Event, referenceId string, customerId string) { + if len(referenceId) == 0 { + log.Println("未提供支付单号") + return + } + LockOrder(referenceId) defer UnlockOrder(referenceId) payload := map[string]any{ From 8aaec8b1cc927c1fbe5a70e0c05712a1f072c00e Mon Sep 17 00:00:00 2001 From: CaIon Date: Wed, 15 Apr 2026 21:17:49 +0800 Subject: [PATCH 50/54] feat: add PaymentMethod field to TopUp model and enhance payment method validation in topup controllers --- controller/topup.go | 4 ++++ controller/topup_creem.go | 13 +++++++------ controller/topup_stripe.go | 5 +++++ model/topup.go | 32 +++++++++++++++++++++++--------- 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/controller/topup.go b/controller/topup.go index e7a392a4..dee6d889 100644 --- a/controller/topup.go +++ b/controller/topup.go @@ -340,6 +340,10 @@ func EpayNotify(c *gin.Context) { log.Printf("易支付回调未找到订单: %v", verifyInfo) return } + if topUp.PaymentMethod == "stripe" || topUp.PaymentMethod == "creem" || topUp.PaymentMethod == "waffo" { + log.Printf("易支付回调订单支付方式不匹配: %s, 订单号: %s", topUp.PaymentMethod, verifyInfo.ServiceTradeNo) + return + } if topUp.Status == "pending" { topUp.Status = "success" err := topUp.Update() diff --git a/controller/topup_creem.go b/controller/topup_creem.go index 54b67b85..ffff716b 100644 --- a/controller/topup_creem.go +++ b/controller/topup_creem.go @@ -108,12 +108,13 @@ func (*CreemAdaptor) RequestPay(c *gin.Context, req *CreemPayRequest) { // 先创建订单记录,使用产品配置的金额和充值额度 topUp := &model.TopUp{ - UserId: id, - Amount: selectedProduct.Quota, // 充值额度 - Money: selectedProduct.Price, // 支付金额 - TradeNo: referenceId, - CreateTime: time.Now().Unix(), - Status: common.TopUpStatusPending, + UserId: id, + Amount: selectedProduct.Quota, // 充值额度 + Money: selectedProduct.Price, // 支付金额 + TradeNo: referenceId, + PaymentMethod: PaymentMethodCreem, + CreateTime: time.Now().Unix(), + Status: common.TopUpStatusPending, } err = topUp.Insert() if err != nil { diff --git a/controller/topup_stripe.go b/controller/topup_stripe.go index 5c92d272..c2f65472 100644 --- a/controller/topup_stripe.go +++ b/controller/topup_stripe.go @@ -234,6 +234,11 @@ func sessionAsyncPaymentFailed(event stripe.Event) { return } + if topUp.PaymentMethod != PaymentMethodStripe { + log.Printf("异步支付失败,订单支付方式不匹配: %s, ref: %s", topUp.PaymentMethod, referenceId) + return + } + if topUp.Status != common.TopUpStatusPending { log.Printf("异步支付失败,订单状态非pending: %s, ref: %s", topUp.Status, referenceId) return diff --git a/model/topup.go b/model/topup.go index d8c92bfe..b6329e08 100644 --- a/model/topup.go +++ b/model/topup.go @@ -12,17 +12,19 @@ import ( ) type TopUp struct { - Id int `json:"id"` - UserId int `json:"user_id" gorm:"index"` - Amount int64 `json:"amount"` - Money float64 `json:"money"` - TradeNo string `json:"trade_no" gorm:"unique;type:varchar(255);index"` - PaymentMethod string `json:"payment_method" gorm:"type:varchar(50)"` - CreateTime int64 `json:"create_time"` - CompleteTime int64 `json:"complete_time"` - Status string `json:"status"` + Id int `json:"id"` + UserId int `json:"user_id" gorm:"index"` + Amount int64 `json:"amount"` + Money float64 `json:"money"` + TradeNo string `json:"trade_no" gorm:"unique;type:varchar(255);index"` + PaymentMethod string `json:"payment_method" gorm:"type:varchar(50)"` + CreateTime int64 `json:"create_time"` + CompleteTime int64 `json:"complete_time"` + Status string `json:"status"` } +var ErrPaymentMethodMismatch = errors.New("payment method mismatch") + func (topUp *TopUp) Insert() error { var err error err = DB.Create(topUp).Error @@ -74,6 +76,10 @@ func Recharge(referenceId string, customerId string) (err error) { return errors.New("充值订单不存在") } + if topUp.PaymentMethod != "stripe" { + return ErrPaymentMethodMismatch + } + if topUp.Status != common.TopUpStatusPending { return errors.New("充值订单状态错误") } @@ -325,6 +331,10 @@ func RechargeCreem(referenceId string, customerEmail string, customerName string return errors.New("充值订单不存在") } + if topUp.PaymentMethod != "creem" { + return ErrPaymentMethodMismatch + } + if topUp.Status != common.TopUpStatusPending { return errors.New("充值订单状态错误") } @@ -396,6 +406,10 @@ func RechargeWaffo(tradeNo string) (err error) { return errors.New("充值订单不存在") } + if topUp.PaymentMethod != "waffo" { + return ErrPaymentMethodMismatch + } + if topUp.Status == common.TopUpStatusSuccess { return nil // 幂等:已成功直接返回 } From 3cad6b9d7fc5668b1c7cc9995ddfba5291512d0f Mon Sep 17 00:00:00 2001 From: CaIon Date: Thu, 16 Apr 2026 17:44:38 +0800 Subject: [PATCH 51/54] fix(claude): improve handling of empty string content in OpenAI to Claude message conversion --- relay/channel/claude/relay-claude.go | 30 ++++++++++++++++++---------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/relay/channel/claude/relay-claude.go b/relay/channel/claude/relay-claude.go index 3968a268..e7f351b7 100644 --- a/relay/channel/claude/relay-claude.go +++ b/relay/channel/claude/relay-claude.go @@ -258,7 +258,7 @@ func RequestOpenAI2ClaudeMessage(c *gin.Context, textRequest dto.GeneralOpenAIRe formatMessages = formatMessages[:len(formatMessages)-1] } } - if fmtMessage.Content == nil { + if fmtMessage.Content == nil || (fmtMessage.IsStringContent() && fmtMessage.StringContent() == "") { fmtMessage.SetStringContent("...") } formatMessages = append(formatMessages, fmtMessage) @@ -274,14 +274,16 @@ func RequestOpenAI2ClaudeMessage(c *gin.Context, textRequest dto.GeneralOpenAIRe if message.Role == "system" { // 根据Claude API规范,system字段使用数组格式更有通用性 if message.IsStringContent() { - systemMessages = append(systemMessages, dto.ClaudeMediaMessage{ - Type: "text", - Text: common.GetPointer[string](message.StringContent()), - }) + if text := message.StringContent(); text != "" { + systemMessages = append(systemMessages, dto.ClaudeMediaMessage{ + Type: "text", + Text: common.GetPointer[string](text), + }) + } } else { // 支持复合内容的system消息(虽然不常见,但需要考虑完整性) for _, ctx := range message.ParseContent() { - if ctx.Type == "text" { + if ctx.Type == "text" && ctx.Text != "" { systemMessages = append(systemMessages, dto.ClaudeMediaMessage{ Type: "text", Text: common.GetPointer[string](ctx.Text), @@ -339,16 +341,22 @@ func RequestOpenAI2ClaudeMessage(c *gin.Context, textRequest dto.GeneralOpenAIRe } } } else if message.IsStringContent() && message.ToolCalls == nil { - claudeMessage.Content = message.StringContent() + text := message.StringContent() + if text == "" { + text = "..." + } + claudeMessage.Content = text } else { claudeMediaMessages := make([]dto.ClaudeMediaMessage, 0) for _, mediaMessage := range message.ParseContent() { switch mediaMessage.Type { case "text": - claudeMediaMessages = append(claudeMediaMessages, dto.ClaudeMediaMessage{ - Type: "text", - Text: common.GetPointer[string](mediaMessage.Text), - }) + if mediaMessage.Text != "" { + claudeMediaMessages = append(claudeMediaMessages, dto.ClaudeMediaMessage{ + Type: "text", + Text: common.GetPointer[string](mediaMessage.Text), + }) + } default: source := mediaMessage.ToFileSource() if source == nil { From 22e509c1efb2260e1537c78684f1a5e9f053b75a Mon Sep 17 00:00:00 2001 From: CaIon Date: Thu, 16 Apr 2026 20:56:44 +0800 Subject: [PATCH 52/54] refactor: simplify ShouldDisableChannel function by removing unused parameters and commented-out code --- controller/channel-test.go | 2 +- controller/relay.go | 2 +- service/channel.go | 37 +------------------------------------ 3 files changed, 3 insertions(+), 38 deletions(-) diff --git a/controller/channel-test.go b/controller/channel-test.go index db0326d3..8d62a4ac 100644 --- a/controller/channel-test.go +++ b/controller/channel-test.go @@ -830,7 +830,7 @@ func testAllChannels(notify bool) error { newAPIError := result.newAPIError // request error disables the channel if newAPIError != nil { - shouldBanChannel = service.ShouldDisableChannel(channel.Type, result.newAPIError) + shouldBanChannel = service.ShouldDisableChannel(result.newAPIError) } // 当错误检查通过,才检查响应时间 diff --git a/controller/relay.go b/controller/relay.go index a6f3f035..c97ab45b 100644 --- a/controller/relay.go +++ b/controller/relay.go @@ -351,7 +351,7 @@ func processChannelError(c *gin.Context, channelError types.ChannelError, err *t logger.LogError(c, fmt.Sprintf("channel error (channel #%d, status code: %d): %s", channelError.ChannelId, err.StatusCode, err.Error())) // 不要使用context获取渠道信息,异步处理时可能会出现渠道信息不一致的情况 // do not use context to get channel info, there may be inconsistent channel info when processing asynchronously - if service.ShouldDisableChannel(channelError.ChannelType, err) && channelError.AutoBan { + if service.ShouldDisableChannel(err) && channelError.AutoBan { gopool.Go(func() { service.DisableChannel(channelError, err.ErrorWithStatusCode()) }) diff --git a/service/channel.go b/service/channel.go index f93b29a2..3fde6e20 100644 --- a/service/channel.go +++ b/service/channel.go @@ -42,7 +42,7 @@ func EnableChannel(channelId int, usingKey string, channelName string) { } } -func ShouldDisableChannel(channelType int, err *types.NewAPIError) bool { +func ShouldDisableChannel(err *types.NewAPIError) bool { if !common.AutomaticDisableChannelEnabled { return false } @@ -58,41 +58,6 @@ func ShouldDisableChannel(channelType int, err *types.NewAPIError) bool { if operation_setting.ShouldDisableByStatusCode(err.StatusCode) { return true } - //if err.StatusCode == http.StatusUnauthorized { - // return true - //} - //if err.StatusCode == http.StatusForbidden { - // switch channelType { - // case constant.ChannelTypeGemini: - // return true - // } - //} - oaiErr := err.ToOpenAIError() - switch oaiErr.Code { - case "invalid_api_key": - return true - case "account_deactivated": - return true - case "billing_not_active": - return true - case "pre_consume_token_quota_failed": - return true - case "Arrearage": - return true - } - switch oaiErr.Type { - case "insufficient_quota": - return true - case "insufficient_user_quota": - return true - // https://docs.anthropic.com/claude/reference/errors - case "authentication_error": - return true - case "permission_error": - return true - case "forbidden": - return true - } lowerMessage := strings.ToLower(err.Error()) search, _ := AcSearch(lowerMessage, operation_setting.AutomaticDisableKeywords, true) From dd57eeb5142212da15e68f22a8bf389a90706793 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Apr 2026 22:45:12 +0000 Subject: [PATCH 53/54] chore(deps): bump github.com/jackc/pgx/v5 from 5.7.1 to 5.9.0 Bumps [github.com/jackc/pgx/v5](https://github.com/jackc/pgx) from 5.7.1 to 5.9.0. - [Changelog](https://github.com/jackc/pgx/blob/master/CHANGELOG.md) - [Commits](https://github.com/jackc/pgx/compare/v5.7.1...v5.9.0) --- updated-dependencies: - dependency-name: github.com/jackc/pgx/v5 dependency-version: 5.9.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a078b209..ac2acdab 100644 --- a/go.mod +++ b/go.mod @@ -96,7 +96,7 @@ require ( github.com/icza/bitio v1.1.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect - github.com/jackc/pgx/v5 v5.7.1 // indirect + github.com/jackc/pgx/v5 v5.9.0 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/jfreymuth/vorbis v1.0.2 // indirect github.com/jinzhu/inflection v1.0.0 // indirect diff --git a/go.sum b/go.sum index 8b687906..2aafa91f 100644 --- a/go.sum +++ b/go.sum @@ -152,8 +152,8 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.7.1 h1:x7SYsPBYDkHDksogeSmZZ5xzThcTgRz++I5E+ePFUcs= -github.com/jackc/pgx/v5 v5.7.1/go.mod h1:e7O26IywZZ+naJtWWos6i6fvWK+29etgITqrqHLfoZA= +github.com/jackc/pgx/v5 v5.9.0 h1:T/dI+2TvmI2H8s/KH1/lXIbz1CUFk3gn5oTjr0/mBsE= +github.com/jackc/pgx/v5 v5.9.0/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jfreymuth/oggvorbis v1.0.5 h1:u+Ck+R0eLSRhgq8WTmffYnrVtSztJcYrl588DM4e3kQ= From 47d7bca268494d66cd80f7200e8e29c1ae335feb Mon Sep 17 00:00:00 2001 From: papersnake Date: Fri, 17 Apr 2026 13:52:34 +0800 Subject: [PATCH 54/54] feat: support claude-opus-4-7 (#4293) * feat: support claude-opus-4-7 * feat: summarized display for opus 4.7 --- dto/claude.go | 5 +++ relay/channel/aws/constants.go | 6 ++++ relay/channel/claude/constants.go | 7 ++++ relay/channel/claude/relay-claude.go | 51 +++++++++++++++++++--------- relay/channel/vertex/adaptor.go | 1 + relay/claude_handler.go | 45 +++++++++++++++++------- setting/ratio_setting/cache_ratio.go | 14 ++++++++ setting/ratio_setting/model_ratio.go | 6 ++++ setting/reasoning/suffix.go | 2 +- 9 files changed, 107 insertions(+), 30 deletions(-) diff --git a/dto/claude.go b/dto/claude.go index b35d6565..d7fed412 100644 --- a/dto/claude.go +++ b/dto/claude.go @@ -448,6 +448,11 @@ func ProcessTools(tools []any) ([]*Tool, []*ClaudeWebSearchTool) { type Thinking struct { Type string `json:"type,omitempty"` BudgetTokens *int `json:"budget_tokens,omitempty"` + // Display controls whether thinking content is returned in the response. + // Used with adaptive thinking on Claude Opus 4.7+: "summarized" restores + // the visible summary that was default on Opus 4.6; "omitted" (default on + // 4.7) suppresses it. Pass-through field from upstream Anthropic API. + Display string `json:"display,omitempty"` } func (c *Thinking) GetBudgetTokens() int { diff --git a/relay/channel/aws/constants.go b/relay/channel/aws/constants.go index 55f87ecf..ff1f377e 100644 --- a/relay/channel/aws/constants.go +++ b/relay/channel/aws/constants.go @@ -18,6 +18,7 @@ var awsModelIDMap = map[string]string{ "claude-haiku-4-5-20251001": "anthropic.claude-haiku-4-5-20251001-v1:0", "claude-opus-4-5-20251101": "anthropic.claude-opus-4-5-20251101-v1:0", "claude-opus-4-6": "anthropic.claude-opus-4-6-v1", + "claude-opus-4-7": "anthropic.claude-opus-4-7", // Nova models "nova-micro-v1:0": "amazon.nova-micro-v1:0", "nova-lite-v1:0": "amazon.nova-lite-v1:0", @@ -91,6 +92,11 @@ var awsModelCanCrossRegionMap = map[string]map[string]bool{ "ap": true, "eu": true, }, + "anthropic.claude-opus-4-7": { + "us": true, + "ap": true, + "eu": true, + }, "anthropic.claude-haiku-4-5-20251001-v1:0": { "us": true, "ap": true, diff --git a/relay/channel/claude/constants.go b/relay/channel/claude/constants.go index 1a3fac56..3c516aef 100644 --- a/relay/channel/claude/constants.go +++ b/relay/channel/claude/constants.go @@ -26,6 +26,13 @@ var ModelList = []string{ "claude-opus-4-6-medium", "claude-opus-4-6-low", "claude-sonnet-4-6", + "claude-opus-4-7", + "claude-opus-4-7-max", + "claude-opus-4-7-xhigh", + "claude-opus-4-7-high", + "claude-opus-4-7-medium", + "claude-opus-4-7-low", + "claude-opus-4-7-thinking", } var ChannelName = "claude" diff --git a/relay/channel/claude/relay-claude.go b/relay/channel/claude/relay-claude.go index e7f351b7..fa823452 100644 --- a/relay/channel/claude/relay-claude.go +++ b/relay/channel/claude/relay-claude.go @@ -154,33 +154,52 @@ func RequestOpenAI2ClaudeMessage(c *gin.Context, textRequest dto.GeneralOpenAIRe } if baseModel, effortLevel, ok := reasoning.TrimEffortSuffix(textRequest.Model); ok && effortLevel != "" && - strings.HasPrefix(textRequest.Model, "claude-opus-4-6") { + (strings.HasPrefix(textRequest.Model, "claude-opus-4-6") || strings.HasPrefix(textRequest.Model, "claude-opus-4-7")) { claudeRequest.Model = baseModel claudeRequest.Thinking = &dto.Thinking{ Type: "adaptive", } claudeRequest.OutputConfig = json.RawMessage(fmt.Sprintf(`{"effort":"%s"}`, effortLevel)) - claudeRequest.TopP = nil - claudeRequest.Temperature = common.GetPointer[float64](1.0) + if strings.HasPrefix(baseModel, "claude-opus-4-7") { + // Opus 4.7 rejects non-default temperature/top_p/top_k with 400 + // and defaults display to "omitted"; restore the 4.6 visible summary. + claudeRequest.Thinking.Display = "summarized" + claudeRequest.Temperature = nil + claudeRequest.TopP = nil + claudeRequest.TopK = nil + } else { + claudeRequest.TopP = nil + claudeRequest.Temperature = common.GetPointer[float64](1.0) + } } else if model_setting.GetClaudeSettings().ThinkingAdapterEnabled && strings.HasSuffix(textRequest.Model, "-thinking") { - // 因为BudgetTokens 必须大于1024 - if claudeRequest.MaxTokens == nil || *claudeRequest.MaxTokens < 1280 { - claudeRequest.MaxTokens = common.GetPointer[uint](1280) - } + trimmedModel := strings.TrimSuffix(textRequest.Model, "-thinking") + if strings.HasPrefix(trimmedModel, "claude-opus-4-7") { + // Opus 4.7 rejects thinking.type="enabled"; use adaptive at high effort. + claudeRequest.Thinking = &dto.Thinking{Type: "adaptive", Display: "summarized"} + claudeRequest.OutputConfig = json.RawMessage(`{"effort":"high"}`) + claudeRequest.Temperature = nil + claudeRequest.TopP = nil + claudeRequest.TopK = nil + } else { + // 因为BudgetTokens 必须大于1024 + if claudeRequest.MaxTokens == nil || *claudeRequest.MaxTokens < 1280 { + claudeRequest.MaxTokens = common.GetPointer[uint](1280) + } - // BudgetTokens 为 max_tokens 的 80% - claudeRequest.Thinking = &dto.Thinking{ - Type: "enabled", - BudgetTokens: common.GetPointer[int](int(float64(*claudeRequest.MaxTokens) * model_setting.GetClaudeSettings().ThinkingAdapterBudgetTokensPercentage)), + // BudgetTokens 为 max_tokens 的 80% + claudeRequest.Thinking = &dto.Thinking{ + Type: "enabled", + BudgetTokens: common.GetPointer[int](int(float64(*claudeRequest.MaxTokens) * model_setting.GetClaudeSettings().ThinkingAdapterBudgetTokensPercentage)), + } + // TODO: 临时处理 + // https://docs.anthropic.com/en/docs/build-with-claude/extended-thinking#important-considerations-when-using-extended-thinking + claudeRequest.TopP = nil + claudeRequest.Temperature = common.GetPointer[float64](1.0) } - // TODO: 临时处理 - // https://docs.anthropic.com/en/docs/build-with-claude/extended-thinking#important-considerations-when-using-extended-thinking - claudeRequest.TopP = nil - claudeRequest.Temperature = common.GetPointer[float64](1.0) if !model_setting.ShouldPreserveThinkingSuffix(textRequest.Model) { - claudeRequest.Model = strings.TrimSuffix(textRequest.Model, "-thinking") + claudeRequest.Model = trimmedModel } } diff --git a/relay/channel/vertex/adaptor.go b/relay/channel/vertex/adaptor.go index 7e56c52b..5cf1fcc0 100644 --- a/relay/channel/vertex/adaptor.go +++ b/relay/channel/vertex/adaptor.go @@ -44,6 +44,7 @@ var claudeModelMap = map[string]string{ "claude-haiku-4-5-20251001": "claude-haiku-4-5@20251001", "claude-opus-4-5-20251101": "claude-opus-4-5@20251101", "claude-opus-4-6": "claude-opus-4-6", + "claude-opus-4-7": "claude-opus-4-7", } const anthropicVersion = "vertex-2023-10-16" diff --git a/relay/claude_handler.go b/relay/claude_handler.go index dc4c93f8..54f8ced2 100644 --- a/relay/claude_handler.go +++ b/relay/claude_handler.go @@ -53,30 +53,49 @@ func ClaudeHelper(c *gin.Context, info *relaycommon.RelayInfo) (newAPIError *typ } if baseModel, effortLevel, ok := reasoning.TrimEffortSuffix(request.Model); ok && effortLevel != "" && - strings.HasPrefix(request.Model, "claude-opus-4-6") { + (strings.HasPrefix(request.Model, "claude-opus-4-6") || strings.HasPrefix(request.Model, "claude-opus-4-7")) { request.Model = baseModel request.Thinking = &dto.Thinking{ Type: "adaptive", } request.OutputConfig = json.RawMessage(fmt.Sprintf(`{"effort":"%s"}`, effortLevel)) - request.Temperature = common.GetPointer[float64](1.0) + if strings.HasPrefix(request.Model, "claude-opus-4-7") { + // Opus 4.7 rejects non-default temperature/top_p/top_k with 400 + // and defaults display to "omitted"; restore the 4.6 visible summary. + request.Thinking.Display = "summarized" + request.Temperature = nil + request.TopP = nil + request.TopK = nil + } else { + request.Temperature = common.GetPointer[float64](1.0) + } info.UpstreamModelName = request.Model } else if model_setting.GetClaudeSettings().ThinkingAdapterEnabled && strings.HasSuffix(request.Model, "-thinking") { if request.Thinking == nil { - // 因为BudgetTokens 必须大于1024 - if request.MaxTokens == nil || *request.MaxTokens < 1280 { - request.MaxTokens = common.GetPointer[uint](1280) - } + baseModel := strings.TrimSuffix(request.Model, "-thinking") + if strings.HasPrefix(baseModel, "claude-opus-4-7") { + // Opus 4.7 rejects thinking.type="enabled"; use adaptive at high effort. + request.Thinking = &dto.Thinking{Type: "adaptive", Display: "summarized"} + request.OutputConfig = json.RawMessage(`{"effort":"high"}`) + request.Temperature = nil + request.TopP = nil + request.TopK = nil + } else { + // 因为BudgetTokens 必须大于1024 + if request.MaxTokens == nil || *request.MaxTokens < 1280 { + request.MaxTokens = common.GetPointer[uint](1280) + } - // BudgetTokens 为 max_tokens 的 80% - request.Thinking = &dto.Thinking{ - Type: "enabled", - BudgetTokens: common.GetPointer[int](int(float64(*request.MaxTokens) * model_setting.GetClaudeSettings().ThinkingAdapterBudgetTokensPercentage)), + // BudgetTokens 为 max_tokens 的 80% + request.Thinking = &dto.Thinking{ + Type: "enabled", + BudgetTokens: common.GetPointer[int](int(float64(*request.MaxTokens) * model_setting.GetClaudeSettings().ThinkingAdapterBudgetTokensPercentage)), + } + // TODO: 临时处理 + // https://docs.anthropic.com/en/docs/build-with-claude/extended-thinking#important-considerations-when-using-extended-thinking + request.Temperature = common.GetPointer[float64](1.0) } - // TODO: 临时处理 - // https://docs.anthropic.com/en/docs/build-with-claude/extended-thinking#important-considerations-when-using-extended-thinking - request.Temperature = common.GetPointer[float64](1.0) } if !model_setting.ShouldPreserveThinkingSuffix(info.OriginModelName) { request.Model = strings.TrimSuffix(request.Model, "-thinking") diff --git a/setting/ratio_setting/cache_ratio.go b/setting/ratio_setting/cache_ratio.go index 2c75ab48..fe6e3b32 100644 --- a/setting/ratio_setting/cache_ratio.go +++ b/setting/ratio_setting/cache_ratio.go @@ -64,6 +64,13 @@ var defaultCacheRatio = map[string]float64{ "claude-opus-4-6-high": 0.1, "claude-opus-4-6-medium": 0.1, "claude-opus-4-6-low": 0.1, + "claude-opus-4-7": 0.1, + "claude-opus-4-7-thinking": 0.1, + "claude-opus-4-7-max": 0.1, + "claude-opus-4-7-xhigh": 0.1, + "claude-opus-4-7-high": 0.1, + "claude-opus-4-7-medium": 0.1, + "claude-opus-4-7-low": 0.1, } var defaultCreateCacheRatio = map[string]float64{ @@ -92,6 +99,13 @@ var defaultCreateCacheRatio = map[string]float64{ "claude-opus-4-6-high": 1.25, "claude-opus-4-6-medium": 1.25, "claude-opus-4-6-low": 1.25, + "claude-opus-4-7": 1.25, + "claude-opus-4-7-thinking": 1.25, + "claude-opus-4-7-max": 1.25, + "claude-opus-4-7-xhigh": 1.25, + "claude-opus-4-7-high": 1.25, + "claude-opus-4-7-medium": 1.25, + "claude-opus-4-7-low": 1.25, } //var defaultCreateCacheRatio = map[string]float64{} diff --git a/setting/ratio_setting/model_ratio.go b/setting/ratio_setting/model_ratio.go index 6899d92c..7556fd94 100644 --- a/setting/ratio_setting/model_ratio.go +++ b/setting/ratio_setting/model_ratio.go @@ -146,6 +146,12 @@ var defaultModelRatio = map[string]float64{ "claude-opus-4-6-high": 2.5, "claude-opus-4-6-medium": 2.5, "claude-opus-4-6-low": 2.5, + "claude-opus-4-7": 2.5, + "claude-opus-4-7-max": 2.5, + "claude-opus-4-7-xhigh": 2.5, + "claude-opus-4-7-high": 2.5, + "claude-opus-4-7-medium": 2.5, + "claude-opus-4-7-low": 2.5, "claude-3-opus-20240229": 7.5, // $15 / 1M tokens "claude-opus-4-20250514": 7.5, "claude-opus-4-1-20250805": 7.5, diff --git a/setting/reasoning/suffix.go b/setting/reasoning/suffix.go index fb66c601..2b95de6d 100644 --- a/setting/reasoning/suffix.go +++ b/setting/reasoning/suffix.go @@ -6,7 +6,7 @@ import ( "github.com/samber/lo" ) -var EffortSuffixes = []string{"-max", "-high", "-medium", "-low", "-minimal"} +var EffortSuffixes = []string{"-max", "-xhigh", "-high", "-medium", "-low", "-minimal"} // TrimEffortSuffix -> modelName level(low) exists func TrimEffortSuffix(modelName string) (string, string, bool) {