refactor(web): 统一日志详情与界面术语

This commit is contained in:
tbphp committed 2026-08-16 13:38:31 +08:00
1 parent d5e4bbc62a
commit 97ca7e5f0b
23 files changed
+512 -516

No files matched your search

+8 -28
View File
@@ -435,6 +435,7 @@ function toggleAttemptErrorMessage(sequence: number): void {
:channel-id="log.channel_id"
:channel="finalChannel()"
:credential-id="log.credential_id"
appearance="plain"
/>
</dd>
</div>
@@ -537,6 +538,12 @@ function toggleAttemptErrorMessage(sequence: number): void {
<PricingModeIndicator :mode="log.pricing_mode" />
</dd>
</div>
<div v-if="!selfScoped && receipt">
<dt>{{ t('monitor.logs.receipt.identity') }}</dt>
<dd>
<code>{{ pricingIdentity }}</code>
</dd>
</div>
<div
v-if="
!selfScoped &&
@@ -552,16 +559,6 @@ function toggleAttemptErrorMessage(sequence: number): void {
<span>{{ t('monitor.logs.receipt.output') }} = {{ formula.output }}</span>
</dd>
</div>
<div v-if="!selfScoped && receipt">
<dt>{{ t('monitor.logs.receipt.schema') }}</dt>
<dd>v{{ receipt.schema_version }}</dd>
</div>
<div v-if="!selfScoped && receipt">
<dt>{{ t('monitor.logs.receipt.identity') }}</dt>
<dd>
<code>{{ pricingIdentity }}</code>
</dd>
</div>
</dl>
</section>
@@ -590,6 +587,7 @@ function toggleAttemptErrorMessage(sequence: number): void {
:channel-id="attempt.channel_id"
:channel="channelDefinition(attempt.channel_id)"
:credential-id="attempt.credential_id"
appearance="plain"
/>
</dd>
</div>
@@ -791,24 +789,6 @@ function toggleAttemptErrorMessage(sequence: number): void {
font-weight: 400;
}
.log-detail__protocol {
display: flex;
min-width: 0;
align-items: center;
gap: 7px;
}
.log-detail__route-identity {
display: flex;
min-width: 0;
align-items: center;
gap: 6px;
}
.log-detail__route-identity > :first-child {
min-width: 0;
}
.log-detail__wide {
grid-column: 1 / -1;
}
+26 -7
View File
@@ -6,13 +6,21 @@ import type { ChannelDto } from '@/app/resources/channels'
import ChannelIcon from '@/components/brand/ChannelIcon.vue'
import AppTooltip from '@/components/ui/AppTooltip.vue'
const props = defineProps<{
groupId: number | null
groupName?: string | null
channelId: string | null
channel?: Pick<ChannelDto, 'name' | 'icon' | 'mark'> | null
credentialId: number | null
}>()
const props = withDefaults(
defineProps<{
groupId: number | null
groupName?: string | null
channelId: string | null
channel?: Pick<ChannelDto, 'name' | 'icon' | 'mark'> | null
credentialId: number | null
appearance?: 'compact' | 'plain'
}>(),
{
groupName: undefined,
channel: undefined,
appearance: 'compact',
},
)
const { t } = useI18n()
@@ -58,6 +66,7 @@ const tooltip = computed(() => {
<AppTooltip :content="tooltip" :disabled="tooltip.length === 0" side="top" align="start">
<span
class="log-route-identity"
:class="{ 'log-route-identity--plain': props.appearance === 'plain' }"
:tabindex="tooltip ? 0 : undefined"
:aria-label="tooltip || undefined"
>
@@ -99,4 +108,14 @@ const tooltip = computed(() => {
text-overflow: ellipsis;
white-space: nowrap;
}
.log-route-identity--plain .log-route-identity__icon,
.log-route-identity--plain .log-route-identity__label {
font-size: inherit;
}
.log-route-identity--plain .log-route-identity__label {
color: inherit;
font-family: inherit;
}
</style>
+48 -48
View File
@@ -3,27 +3,27 @@ export default {
title: 'Access keys',
description: 'Issue and manage plaintext-sensitive credentials for data-plane clients.',
loginNotice: {
title: 'AccessKeys can also sign in',
title: 'Access keys can also sign in',
description:
"When distributing an AccessKey, tell its holder to enter it on this instance's sign-in page. It can view its Home, available models, usage, and redacted request history, but cannot change configuration.",
"When distributing an access key, tell its holder to enter it on this instance's sign-in page. It can view its Home, available models, usage, and redacted request history, but cannot change configuration.",
},
create: 'Create AccessKey',
copy: 'Copy AccessKey',
create: 'Create access key',
copy: 'Copy access key',
toast: {
created: 'AccessKey “{name}” created',
updated: 'AccessKey “{name}” updated',
deleted: 'AccessKey “{name}” deleted',
enabled: 'AccessKey “{name}” enabled',
disabled: 'AccessKey “{name}” disabled',
created: 'Access key “{name}” created',
updated: 'Access key “{name}” updated',
deleted: 'Access key “{name}” deleted',
enabled: 'Access key “{name}” enabled',
disabled: 'Access key “{name}” disabled',
},
loading: 'Loading AccessKeys…',
loadFailed: 'Unable to load AccessKeys.',
stale: 'AccessKey data may be stale because the background refresh failed.',
loading: 'Loading access keys…',
loadFailed: 'Unable to load access keys.',
stale: 'Access key data may be stale because the background refresh failed.',
groupsStale: 'Group filter names may be stale because Groups could not be refreshed.',
emptyTitle: 'No AccessKeys',
emptyDescription: 'Create an AccessKey before connecting a data-plane client.',
caption: 'AccessKeys and their routing filters',
scrollHint: 'Scroll horizontally to inspect every AccessKey column.',
emptyTitle: 'No access keys',
emptyDescription: 'Create an access key before connecting a data-plane client.',
caption: 'Access keys and their routing filters',
scrollHint: 'Scroll horizontally to inspect every access key column.',
details: 'Scope and metadata',
createdAt: 'Created',
updatedAt: 'Updated',
@@ -35,12 +35,12 @@ export default {
filterProtocols: 'Protocols',
filterModels: 'Models',
collection: {
loading: 'Loading AccessKeys',
errorTitle: 'AccessKeys are unavailable',
loading: 'Loading access keys',
errorTitle: 'Access keys are unavailable',
errorDescription: 'Check the connection or service status, then try again.',
summary: {
region: 'AccessKey status overview',
current: 'Current AccessKeys',
region: 'Access key status overview',
current: 'Current access keys',
},
status: {
all: 'All',
@@ -48,27 +48,27 @@ export default {
disabled: 'Disabled',
},
filters: {
region: 'Filter AccessKeys',
region: 'Filter access keys',
searchLabel: 'Search',
searchPlaceholder: 'Name or final 4 key characters',
clearSearch: 'Clear search',
reset: 'Reset filters',
},
result: 'Showing {shown} / {total} AccessKeys',
result: 'Showing {shown} / {total} access keys',
neverRequested: 'No requests yet',
noResultsTitle: 'No matching AccessKeys',
noResultsTitle: 'No matching access keys',
noResultsDescription: 'Try a different search or status filter.',
tableLabel: 'AccessKey list',
openDetailsFor: 'Open details for AccessKey “{name}”',
tableLabel: 'Access key list',
openDetailsFor: 'Open details for access key “{name}”',
},
operation: {
indeterminate:
'The AccessKey create outcome is unknown. Reconcile it before starting another create.',
reconciling: 'The AccessKey was committed and runtime recovery is still in progress.',
'The access key create outcome is unknown. Reconcile it before starting another create.',
reconciling: 'The access key was committed and runtime recovery is still in progress.',
editIndeterminate:
'The update to AccessKey “{name}” has an unknown outcome. Check current metadata before editing another AccessKey.',
'The update to access key “{name}” has an unknown outcome. Check current metadata before editing another access key.',
editReconciling:
'The update to AccessKey “{name}” was committed and still needs metadata reconciliation.',
'The update to access key “{name}” was committed and still needs metadata reconciliation.',
checkResult: 'Check result',
},
status: {
@@ -77,7 +77,7 @@ export default {
},
columns: {
name: 'Name',
key: 'AccessKey',
key: 'Access key',
status: 'Status',
filters: 'Filters',
scope: 'Scope',
@@ -88,16 +88,16 @@ export default {
actions: {
enable: 'Enable',
disable: 'Disable',
updateFailed: 'Unable to update the AccessKey status.',
updateFailed: 'Unable to update the access key status.',
},
drawer: {
createTitle: 'Create AccessKey',
editTitle: 'Edit AccessKey',
createTitle: 'Create access key',
editTitle: 'Edit access key',
createDescription: 'Permissions can be narrowed later; expanding them requires confirmation.',
editDescription: 'Adjust the name, status, rate limit, and permission scope.',
description:
'Edit routing filters and the RPM limit. Plaintext is masked unless explicitly revealed.',
close: 'Close AccessKey editor',
close: 'Close access key editor',
basicInformation: 'Basic information',
basicInformationDescription:
'The name identifies the client and is not used for authentication.',
@@ -155,41 +155,41 @@ export default {
allModelsAllowed: 'Currently allows every model routable by the target Groups',
scopeExpansionWarning:
'Changing Specified to All expands client permissions. Confirm that the current scope is intended.',
save: 'Save AccessKey',
save: 'Save access key',
createKey: 'Create key',
saveChanges: 'Save changes',
checkResult: 'Check result',
saveFailed: 'Unable to save the AccessKey. Your input is unchanged.',
saveFailed: 'Unable to save the access key. Your input is unchanged.',
editNotApplied:
'The latest AccessKey metadata is unchanged. Review the draft and retry when ready.',
'The latest access key metadata is unchanged. Review the draft and retry when ready.',
editIndeterminate:
'The update request outcome is unknown. Check current metadata; this action does not resend the update.',
editReconciling:
'The update was committed, but current AccessKey metadata must be checked before continuing.',
'The update was committed, but current access key metadata must be checked before continuing.',
saveIndeterminate:
'The request outcome is unknown. Check the result with this same operation before retrying.',
saveReconciling: 'The AccessKey was committed and runtime recovery is still in progress.',
saveReconciling: 'The access key was committed and runtime recovery is still in progress.',
scopeIncomplete: 'Select at least one value for every restricted scope.',
groupScopeUnavailable:
'Group scope cannot be changed until the Group catalog is available again.',
staleGroupScopeInvalid:
'Stale Group data can only retain or remove Groups already authorized by this AccessKey.',
'Stale Group data can only retain or remove Groups already authorized by this access key.',
},
delete: {
open: 'Delete',
title: 'Delete this AccessKey?',
title: 'Delete this access key?',
description: 'Delete “{name}”. This action cannot be undone.',
close: 'Close AccessKey deletion confirmation',
close: 'Close access key deletion confirmation',
lastWarning:
'This is the last AccessKey. Deleting it leaves data-plane clients without an issued credential.',
'This is the last access key. Deleting it leaves data-plane clients without an issued credential.',
name: 'Name',
key: 'AccessKey',
key: 'Access key',
impact:
'After deletion, data-plane requests using this AccessKey will immediately fail authentication.',
'After deletion, data-plane requests using this access key will immediately fail authentication.',
typeName: 'Type {name} to confirm',
confirm: 'Delete AccessKey',
failed: 'Unable to delete the AccessKey.',
deletedAnnouncement: 'Deleted AccessKey “{name}”.',
confirm: 'Delete access key',
failed: 'Unable to delete the access key.',
deletedAnnouncement: 'Deleted access key “{name}”.',
},
},
} as const
+12 -12
View File
@@ -78,7 +78,7 @@ export default {
auth: {
eyebrow: 'GPT-Load 2.0',
headline: 'One sign-in, clearly separated access',
lead: 'Use AUTH_KEY to manage the gateway, or an AccessKey to view its Home, models, requests, and usage. The server identifies the credential automatically',
lead: 'Use AUTH_KEY to manage the gateway, or an access key to view its Home, models, requests, and usage. The server identifies the credential automatically',
capabilities: {
1: {
title: 'Manage channel credentials centrally',
@@ -94,9 +94,9 @@ export default {
},
},
loginTitle: 'Sign in to GPT-Load',
loginDescription: 'Enter an AUTH_KEY or AccessKey; the server will identify its access',
loginDescription: 'Enter an AUTH_KEY or access key; the server will identify its access',
keyLabel: 'Sign-in key',
keyPlaceholder: 'Enter an AUTH_KEY or AccessKey',
keyPlaceholder: 'Enter an AUTH_KEY or access key',
reveal: 'Show sign-in key',
conceal: 'Hide sign-in key',
submit: 'Sign in',
@@ -112,9 +112,9 @@ export default {
sessionNoteSuffix: ' and cleared on sign-out or authentication failure',
help: {
title: 'Which key can I use?',
accessKeyTitle: 'AccessKey',
accessKeyTitle: 'Access key',
accessKeyDescription:
'Use a distributed data-plane AccessKey to view only its Home, profile, available models, request history, and usage. It cannot change any configuration',
'Use a distributed data-plane access key to view only its Home, profile, available models, request history, and usage. It cannot change any configuration',
environmentTitle: 'Environment variable first',
environmentDescription:
'If the instance was started with {key}, use the protected value from your deployment system',
@@ -144,9 +144,9 @@ export default {
groupDetail: 'Group details',
menu: 'Menu and preferences',
preferences: 'Preferences',
accessKeyReadOnly: 'AccessKey · Read-only',
accessKeyReadOnly: 'Access key · Read-only',
accessKeyReadOnlyDescription:
'Signed in with an AccessKey. Pages and data are limited to this key, and system configuration is read-only.',
'Signed in with an access key. Pages and data are limited to this key, and system configuration is read-only.',
language: 'Language',
theme: 'Theme',
localeZh: '简体中文',
@@ -205,7 +205,7 @@ export default {
eyebrow: 'Current sign-in identity',
active: 'Active',
readOnly:
'This is an AccessKey read-only view. All data is scoped to this key, and system configuration cannot be changed.',
'This is an access key read-only view. All data is scoped to this key, and system configuration cannot be changed.',
rpm: 'RPM limit',
rpmValue: '{count} RPM',
unlimited: 'Unlimited',
@@ -251,18 +251,18 @@ export default {
keyCopyFailed: 'Unable to copy the access key.',
configurationCopied: 'Configuration copied',
configurationCopyFailed: 'Unable to copy the configuration.',
noAccessKey: 'Create an AccessKey before connecting a client',
createAccessKey: 'Create AccessKey',
noAccessKey: 'Create an access key before connecting a client',
createAccessKey: 'Create access key',
openNextChat: 'Import in one click',
nextChatOpened: 'Opened NextChat',
nextChatFailed: 'Unable to open NextChat.',
popupBlocked: 'The browser blocked the NextChat window.',
nextChatConfirmTitle: 'Open NextChat',
nextChatConfirmDescription:
'Your gateway address and AccessKey will be sent to NextChat in this browser',
'Your gateway address and access key will be sent to NextChat in this browser',
disableFastLink:
'Known limitation: NextChat silently ignores this setting when disableFastLink is enabled',
protocolUnavailable: '{client} requires {protocol} for this AccessKey',
protocolUnavailable: '{client} requires {protocol} for this access key',
clients: {
label: 'Client',
nextchat: 'NextChat',
+2 -2
View File
@@ -247,9 +247,9 @@ export default {
cancel: 'Cancel',
confirm: 'Delete Group permanently',
failed: 'Unable to delete the Group.',
inUseTitle: 'This Group is referenced by AccessKeys.',
inUseTitle: 'This Group is referenced by access keys.',
inUseDescription: 'Remove these explicit Group references before deleting it:',
manageAccessKeys: 'Manage AccessKeys',
manageAccessKeys: 'Manage access keys',
},
},
tabs: {
+1 -1
View File
@@ -209,7 +209,7 @@ export default {
empty: 'Empty lines',
duplicates: 'Duplicates',
},
accessKeyWarning: '{count} lines look like GPT-Load AccessKeys; verify before continuing',
accessKeyWarning: '{count} lines look like GPT-Load access keys; verify before continuing',
tooMany: 'At most 1,000 non-empty keys can be submitted',
required: 'Enter at least one credential first',
channelCredentialNotice:
+1 -1
View File
@@ -60,7 +60,7 @@ export default {
open: 'View details and pricing for upstream model {model}',
upstreamCount: '{count} upstreams',
protocolRestricted: 'Protocol restricted',
protocolRestrictedHelp: 'This AccessKey can use only these protocols:\n{protocols}',
protocolRestrictedHelp: 'This access key can use only these protocols:\n{protocols}',
pricingIdentityHelp:
'Pricing identity\nChannel: {channel} ({channelId})\nUpstream model: {model}',
tierCount: '{count} tiers',
+26 -27
View File
@@ -53,7 +53,7 @@ export default {
groups: {
title: 'Group health',
description:
'Shows current available credentials only; it does not guarantee routability for a particular AccessKey, protocol, or model.',
'Shows current available credentials only; it does not guarantee routability for a particular access key, protocol, or model.',
empty: 'No Groups are configured.',
disabled: 'Disabled',
emptyCredentials: 'No credentials',
@@ -364,7 +364,7 @@ export default {
inspector: {
title: 'Route inspector',
description:
'Inspect candidate Groups and credentials by protocol, operation, capabilities, model, and AccessKey.',
'Inspect candidate Groups and credentials by protocol, operation, capabilities, model, and access key.',
boundary:
'Select the operation and capabilities required by the real request. Read-only; no upstream request or token usage.',
routeModes: {
@@ -396,9 +396,9 @@ export default {
optional: 'Optional',
modelPlaceholder: 'Enter a client model',
modelOptional: 'Optional for protocol-only resource requests.',
accessKey: 'AccessKey',
accessKey: 'Access key',
accessKeyOption: '{name} · #{id} · {status}',
missingAccessKeyOption: 'Missing AccessKey · #{id}',
missingAccessKeyOption: 'Missing access key · #{id}',
submit: 'Inspect current route',
},
accessKeyStatus: {
@@ -406,16 +406,16 @@ export default {
disabled: 'Disabled',
},
options: {
loading: 'Loading AccessKey options…',
failed: 'Unable to load AccessKey options.',
loading: 'Loading access key options…',
failed: 'Unable to load access key options.',
},
errors: {
protocol: 'Select a valid protocol.',
operation: 'Select an operation supported by the protocol.',
model: 'Enter a valid model when required; resource operations do not accept one.',
accessKey: 'Reselect an existing AccessKey.',
accessKey: 'Reselect an existing access key.',
missingDeepLinkAccessKey:
'The linked AccessKey #{id} no longer exists. Reselect an AccessKey.',
'The linked access key #{id} no longer exists. Reselect an access key.',
summary: 'Route inspector inputs are invalid.',
},
request: {
@@ -439,8 +439,8 @@ export default {
protocol: 'Protocol',
externalModel: 'Client model',
modelNotSpecified: 'Not specified',
accessKey: 'AccessKey',
accessKeyStatus: 'AccessKey status',
accessKey: 'Access key',
accessKeyStatus: 'Access key status',
candidateGroups: 'Candidate Groups',
availableCredentials: 'Available credentials',
reason: 'Reason',
@@ -511,15 +511,15 @@ export default {
},
reasons: {
none: 'No exclusion reason',
access_key_disabled: 'AccessKey is disabled',
protocol_filtered: 'AccessKey filters exclude this protocol',
model_filtered: 'AccessKey filters exclude this model',
model_required_by_filter: 'A model is required by the AccessKey model filter',
access_key_disabled: 'Access key is disabled',
protocol_filtered: 'Access key filters exclude this protocol',
model_filtered: 'Access key filters exclude this model',
model_required_by_filter: 'A model is required by the access key model filter',
operation_unsupported: 'The channel does not support this protocol operation',
native_route_required: 'This request requires a native route',
no_route_target: 'No route target matches this model and protocol',
group_disabled: 'Group is disabled',
group_filtered: 'AccessKey filters exclude this Group',
group_filtered: 'Access key filters exclude this Group',
no_available_group: 'No candidate Group is currently routable',
no_credentials: 'Group has no runtime credentials',
group_weight_zero: 'Group effective weight is zero',
@@ -550,7 +550,7 @@ export default {
},
options: {
groupsFailed: 'Unable to load Group filter options. The log list is unaffected.',
accessKeysFailed: 'Unable to load AccessKey filter options. The log list is unaffected.',
accessKeysFailed: 'Unable to load Access key filter options. The log list is unaffected.',
partialFailed: 'Some filter options are unavailable. Log queries remain available.',
},
filters: {
@@ -574,8 +574,8 @@ export default {
model: 'Client model',
clientModel: 'Client model',
upstreamModel: 'Any-attempt upstream model',
accessKey: 'AccessKey',
anyAccessKey: 'Any AccessKey',
accessKey: 'Access key',
anyAccessKey: 'Any access key',
protocol: 'Protocol',
anyProtocol: 'Any protocol',
stream: 'Streaming request',
@@ -608,7 +608,7 @@ export default {
appliedModel: 'Client model {value}',
appliedClientModel: 'Client model {value}',
appliedUpstreamModel: 'Attempt upstream model {value}',
appliedAccessKey: 'AccessKey {value}',
appliedAccessKey: 'Access key {value}',
appliedChannel: 'Channel {value}',
appliedCredential: 'Credential #{value}',
appliedStatus: 'Status {value}',
@@ -744,17 +744,17 @@ export default {
drawer: {
title: 'Request log details',
description: 'Review the final result and redacted upstream attempt chain.',
descriptionSelfScoped: 'Review requests, results, and usage for the current AccessKey.',
descriptionSelfScoped: 'Review requests, results, and usage for the current access key.',
close: 'Close request log details',
loading: 'Loading request log details…',
loadFailed: 'Unable to load request log details.',
summary: 'Final result',
summary: 'Request outcome',
requestId: 'Request ID',
copyRequestId: 'Copy request ID',
completedAt: 'Completed',
status: 'Status',
protocol: 'Protocol',
accessKey: 'AccessKey',
accessKey: 'Access key',
clientModel: 'Client model',
upstreamModel: 'Upstream model',
modelNotSpecified: 'Not specified',
@@ -773,9 +773,9 @@ export default {
outputRate: 'Output rate',
attemptCount: 'Attempts',
request: 'Client request',
finalExecution: 'Final execution',
finalExecution: 'Upstream execution',
route: 'Request and final route',
routeIdentity: 'Final route identity',
routeIdentity: 'Route identity',
upstreamProtocol: 'Upstream protocol',
affinity: 'Affinity hit',
errorCode: 'Error code',
@@ -805,7 +805,7 @@ export default {
requestedModel: 'Upstream requested model',
reportedModel: 'Upstream reported model',
usage: {
title: 'Usage and estimated cost',
title: 'Usage & cost',
description:
'Final persisted usage fields. Cost is always an estimate and unknown values are not free.',
finalGroup: 'Final Group',
@@ -855,7 +855,7 @@ export default {
completedAt: 'Completed',
requestId: 'Request ID',
route: 'Route',
accessKey: 'AccessKey',
accessKey: 'Access key',
result: 'Final status',
timing: 'First / total',
actions: 'Actions',
@@ -902,7 +902,6 @@ export default {
formula: 'Cost calculation',
input: 'Input',
output: 'Output',
schema: 'Pricing receipt version',
identity: 'Pricing identity',
historicalSchema1: 'Historical scope',
historicalSchema2: 'Historical global price',
+67 -66
View File
@@ -1,46 +1,46 @@
export default {
accessKeys: {
title: 'AccessKey',
title: 'アクセスキー',
description: 'データプレーンクライアント向けの平文機密資格情報を発行・管理します。',
loginNotice: {
title: 'AccessKey でもログインできます',
title: 'アクセスキーでもログインできます',
description:
'AccessKey を配布する際は、このインスタンスのログインページで入力できることも利用者に伝えてください。ログイン後は、自身のホーム、利用可能なモデル、使用量、秘匿情報を除いたリクエスト履歴だけを確認でき、設定は変更できません。',
'アクセスキーを配布する際は、このインスタンスのログインページで入力できることも利用者に伝えてください。ログイン後は、自身のホーム、利用可能なモデル、使用量、秘匿情報を除いたリクエスト履歴だけを確認でき、設定は変更できません。',
},
create: 'AccessKey を作成',
copy: 'AccessKey をコピー',
create: 'アクセスキーを作成',
copy: 'アクセスキーをコピー',
toast: {
created: 'AccessKey「{name}」を作成しました',
updated: 'AccessKey「{name}」を更新しました',
deleted: 'AccessKey「{name}」を削除しました',
enabled: 'AccessKey「{name}」を有効にしました',
disabled: 'AccessKey「{name}」を無効にしました',
created: 'アクセスキー「{name}」を作成しました',
updated: 'アクセスキー「{name}」を更新しました',
deleted: 'アクセスキー「{name}」を削除しました',
enabled: 'アクセスキー「{name}」を有効にしました',
disabled: 'アクセスキー「{name}」を無効にしました',
},
loading: 'AccessKey を読み込み中…',
loadFailed: 'AccessKey を読み込めません。',
stale: 'バックグラウンド更新に失敗したため、AccessKey データが古い可能性があります。',
groupsStale: 'Group の更新に失敗したため、フィルターの Group 名が古い可能性があります。',
emptyTitle: 'AccessKey がありません',
emptyDescription: 'データプレーンクライアントを接続する前に AccessKey を作成してください。',
caption: 'AccessKey とルーティングフィルター',
scrollHint: '横方向にスクロールすると AccessKey のすべての列を確認できます。',
loading: 'アクセスキーを読み込み中…',
loadFailed: 'アクセスキーを読み込めません。',
stale: 'バックグラウンド更新に失敗したため、アクセスキーデータが古い可能性があります。',
groupsStale: 'グループの更新に失敗したため、フィルターのグループ名が古い可能性があります。',
emptyTitle: 'アクセスキーがありません',
emptyDescription: 'データプレーンクライアントを接続する前にアクセスキーを作成してください。',
caption: 'アクセスキーとルーティングフィルター',
scrollHint: '横方向にスクロールするとアクセスキーのすべての列を確認できます。',
details: 'スコープとメタデータ',
createdAt: '作成日時',
updatedAt: '更新日時',
allGroups: 'すべての Group',
allGroups: 'すべてのグループ',
allProtocols: 'すべてのプロトコル',
allModels: 'すべてのモデル',
unlimited: '無制限',
filterGroups: 'Group',
filterGroups: 'グループ',
filterProtocols: 'プロトコル',
filterModels: 'モデル',
collection: {
loading: 'AccessKey を読み込み中',
errorTitle: 'AccessKey を読み込めません',
loading: 'アクセスキーを読み込み中',
errorTitle: 'アクセスキーを読み込めません',
errorDescription: '接続またはサービスの状態を確認してから再試行してください。',
summary: {
region: 'AccessKey の状態概要',
current: '現在の AccessKey',
region: 'アクセスキーの状態概要',
current: '現在のアクセスキー',
},
status: {
all: 'すべて',
@@ -48,27 +48,27 @@ export default {
disabled: '無効',
},
filters: {
region: 'AccessKey を絞り込む',
region: 'アクセスキーを絞り込む',
searchLabel: '検索',
searchPlaceholder: '名前またはキー末尾 4 文字',
clearSearch: '検索をクリア',
reset: '条件をリセット',
},
result: '{shown} / {total} 件の AccessKey を表示',
result: '{shown} / {total} 件のアクセスキーを表示',
neverRequested: 'リクエストなし',
noResultsTitle: '一致する AccessKey がありません',
noResultsTitle: '一致するアクセスキーがありません',
noResultsDescription: '検索または状態フィルターを調整してください。',
tableLabel: 'AccessKey リスト',
openDetailsFor: 'AccessKey「{name}」の詳細を開く',
tableLabel: 'アクセスキーリスト',
openDetailsFor: 'アクセスキー「{name}」の詳細を開く',
},
operation: {
indeterminate:
'AccessKey の作成結果は不明です。新しい作成を始める前に、この操作の結果を確認してください。',
reconciling: 'AccessKey は確定しましたが、ランタイムの復旧処理が続いています。',
'アクセスキーの作成結果は不明です。新しい作成を始める前に、この操作の結果を確認してください。',
reconciling: 'アクセスキーは確定しましたが、ランタイムの復旧処理が続いています。',
editIndeterminate:
'AccessKey「{name}」の更新結果は不明です。別の AccessKey を編集する前に現在のメタデータを確認してください。',
'アクセスキー「{name}」の更新結果は不明です。別のアクセスキーを編集する前に現在のメタデータを確認してください。',
editReconciling:
'AccessKey「{name}」の更新は確定しましたが、現在のメタデータを確認する必要があります。',
'アクセスキー「{name}」の更新は確定しましたが、現在のメタデータを確認する必要があります。',
checkResult: '結果を確認',
},
status: {
@@ -77,7 +77,7 @@ export default {
},
columns: {
name: '名前',
key: 'AccessKey',
key: 'アクセスキー',
status: '状態',
filters: 'フィルター',
scope: '範囲',
@@ -88,22 +88,22 @@ export default {
actions: {
enable: '有効化',
disable: '無効化',
updateFailed: 'AccessKey の状態を更新できません。',
updateFailed: 'アクセスキーの状態を更新できません。',
},
drawer: {
createTitle: 'AccessKey を作成',
editTitle: 'AccessKey を編集',
createTitle: 'アクセスキーを作成',
editTitle: 'アクセスキーを編集',
createDescription: '権限は後から縮小できます。拡大には明示的な確認が必要です。',
editDescription: '名前、状態、レート制限、権限範囲を調整できます。',
description:
'ルーティングフィルターと RPM 上限を編集します。平文は明示的に表示するまでマスクされます。',
close: 'AccessKey エディターを閉じる',
close: 'アクセスキーエディターを閉じる',
basicInformation: '基本情報',
basicInformationDescription: '名前は呼び出し元の識別用で、認証には使用されません。',
permissionScope: '権限範囲',
permissionScopeDescription: '同じ次元内は OR、3 つの次元間は AND で判定します。',
scopeLogic: '権限ロジック',
scopeLogicGroups: 'Group A または B',
scopeLogicGroups: 'グループ A または B',
scopeLogicProtocols: 'プロトコル A または B',
scopeLogicModels: 'モデル A または B',
name: '名前',
@@ -111,8 +111,8 @@ export default {
enabled: 'キーを有効化',
enabledDescription: '無効にすると、新しい認証要求は直ちに拒否されます。',
optional: '任意',
groups: 'Group',
groupsDescription: 'クライアントがルーティングできる Group',
groups: 'グループ',
groupsDescription: 'クライアントがルーティングできるグループ',
protocols: 'プロトコル',
protocolsDescription: '正規プロトコル機能で制限',
models: 'モデル',
@@ -120,26 +120,26 @@ export default {
scopeMode: '範囲',
scopeAll: 'すべて',
scopeRestricted: '指定',
unknownGroup: '不明な Group',
groupSelectorLabel: 'Group を選択',
addGroup: 'Group を追加',
unknownGroup: '不明なグループ',
groupSelectorLabel: 'グループを選択',
addGroup: 'グループを追加',
protocolSelectorLabel: 'プロトコルを選択',
addProtocol: 'プロトコルを追加',
noProtocolOptions: '選択可能なプロトコルがありません。',
modelSelectorLabel: 'モデルを選択',
searchGroups: 'Group を検索',
searchGroups: 'グループを検索',
searchGroupsPlaceholder: '名前で検索',
searchModels: 'モデルを検索',
searchModelsPlaceholder: 'モデル ID またはエイリアスで検索',
noGroupOptions: '一致する Group はありません。',
noGroupOptions: '一致するグループはありません。',
noModelOptions: '一致するモデルはありません。',
groupOptionsLoading: 'Group カタログを読み込み中…',
groupOptionsLoading: 'グループカタログを読み込み中…',
selectedCount: '{count} 件を選択',
clearSelected: '選択を解除',
removeSelection: '{label} を削除',
groupProtocolMismatch: '選択した Group とプロトコルにルーティング可能な重複がありません。',
groupProtocolMismatch: '選択したグループとプロトコルにルーティング可能な重複がありません。',
modelRouteRisk:
'選択したモデルは現在の Group カタログにないため、リクエストのルーティングに失敗する可能性があります。',
'選択したモデルは現在のグループカタログにないため、リクエストのルーティングに失敗する可能性があります。',
modelCustomUnavailable: 'カスタムまたは現在利用不可',
emptyMeansAll: '未選択はすべてを意味します。',
modelsDescription: '既知のモデルを選ぶか、有効なモデル文字列を入力できます。',
@@ -149,43 +149,44 @@ export default {
rpm: '1 分あたりのリクエスト数',
rpmPlaceholder: '空欄は無制限',
rpmDescription: '0 以上の整数を入力してください。0 は無制限です。',
allGroupsAllowed: '現在はすべての Group へのルーティングを許可',
allGroupsAllowed: '現在はすべてのグループへのルーティングを許可',
allProtocolsAllowed: '現在は 4 つの正規プロトコルをすべて許可',
allModelsAllowed: '現在は対象 Group がルーティングできるすべてのモデルを許可',
allModelsAllowed: '現在は対象グループがルーティングできるすべてのモデルを許可',
scopeExpansionWarning:
'「指定」から「すべて」への変更はクライアント権限を拡大します。現在の範囲が意図どおりか確認してください。',
save: 'AccessKey を保存',
save: 'アクセスキーを保存',
createKey: 'キーを作成',
saveChanges: '変更を保存',
checkResult: '結果を確認',
saveFailed: 'AccessKey を保存できません。入力内容は保持されています。',
saveFailed: 'アクセスキーを保存できません。入力内容は保持されています。',
editNotApplied:
'最新の AccessKey メタデータは変更されていません。下書きを確認してから再試行してください。',
'最新のアクセスキーメタデータは変更されていません。下書きを確認してから再試行してください。',
editIndeterminate:
'更新リクエストの結果は不明です。現在のメタデータを確認してください。この操作で更新は再送されません。',
editReconciling:
'更新は確定しましたが、続行する前に現在の AccessKey メタデータを確認する必要があります。',
'更新は確定しましたが、続行する前に現在のアクセスキーメタデータを確認する必要があります。',
saveIndeterminate: 'リクエスト結果は不明です。再試行前に同じ操作で結果を確認してください。',
saveReconciling: 'AccessKey は確定しましたが、ランタイムの復旧処理が続いています。',
saveReconciling: 'アクセスキーは確定しましたが、ランタイムの復旧処理が続いています。',
scopeIncomplete: '制限された各範囲には、1 つ以上の値を選択してください。',
groupScopeUnavailable: 'Group カタログが再び利用可能になるまで Group 範囲は変更できません。',
groupScopeUnavailable:
'グループカタログが再び利用可能になるまでグループ範囲は変更できません。',
staleGroupScopeInvalid:
'古い Group データでは、この AccessKey が既に許可している Group の保持または削除のみ可能です。',
'古いグループデータでは、このアクセスキーが既に許可しているグループの保持または削除のみ可能です。',
},
delete: {
open: '削除',
title: 'この AccessKey を削除しますか?',
title: 'このアクセスキーを削除しますか?',
description: '「{name}」を削除します。この操作は元に戻せません。',
close: 'AccessKey の削除確認を閉じる',
close: 'アクセスキーの削除確認を閉じる',
lastWarning:
'これは最後の AccessKey です。削除すると、データプレーンクライアントに発行済み資格情報がなくなります。',
'これは最後のアクセスキーです。削除すると、データプレーンクライアントに発行済み資格情報がなくなります。',
name: '名前',
key: 'AccessKey',
impact: '削除後、この AccessKey を使用するデータプレーン要求は直ちに認証に失敗します。',
key: 'アクセスキー',
impact: '削除後、このアクセスキーを使用するデータプレーン要求は直ちに認証に失敗します。',
typeName: '確認のため {name} と入力',
confirm: 'AccessKey を削除',
failed: 'AccessKey を削除できません。',
deletedAnnouncement: 'AccessKey「{name}」を削除しました。',
confirm: 'アクセスキーを削除',
failed: 'アクセスキーを削除できません。',
deletedAnnouncement: 'アクセスキー「{name}」を削除しました。',
},
},
} as const
+16 -16
View File
@@ -34,7 +34,7 @@ export default {
stageExpired: '一時アカウントの期限が切れました。再度認証またはインポートしてください',
stageConsumed: 'この一時アカウントは保存済みです。再度認証してください',
stageMismatch: '一時アカウントが現在の対象と一致しません',
duplicateAccount: 'このサブスクリプションアカウントは Group に既に存在します',
duplicateAccount: 'このサブスクリプションアカウントはグループに既に存在します',
reauthorizationRequired: 'このサブスクリプションアカウントは再認証が必要です',
outcomeUnknown: '認証情報の結果を確認できません。先にアカウント状態を再読み込みしてください',
versionConflict: '認証が別の操作で更新されました。再読み込みしてから再試行してください',
@@ -77,11 +77,11 @@ export default {
auth: {
eyebrow: 'GPT-Load 2.0',
headline: '1 つのログイン入口で、権限を明確に分離',
lead: 'AUTH_KEY ではゲートウェイを管理し、AccessKey では自身のホーム、モデル、リクエスト、使用量だけを確認できます。サーバーが認証情報を自動判定します',
lead: 'AUTH_KEY ではゲートウェイを管理し、アクセスキーでは自身のホーム、モデル、リクエスト、使用量だけを確認できます。サーバーが認証情報を自動判定します',
capabilities: {
1: {
title: 'チャネル認証情報を一元管理',
description: 'Group、モデル、利用可能状況をまとめて管理します',
description: 'グループ、モデル、利用可能状況をまとめて管理します',
},
2: {
title: 'ネイティブプロトコルを維持',
@@ -93,9 +93,9 @@ export default {
},
},
loginTitle: 'GPT-Load にログイン',
loginDescription: 'AUTH_KEY または AccessKey を入力すると、サーバーが権限を自動判定します',
loginDescription: 'AUTH_KEY またはアクセスキーを入力すると、サーバーが権限を自動判定します',
keyLabel: 'ログインキー',
keyPlaceholder: 'AUTH_KEY または AccessKey を入力',
keyPlaceholder: 'AUTH_KEY またはアクセスキーを入力',
reveal: 'ログインキーを表示',
conceal: 'ログインキーを隠す',
submit: 'ログイン',
@@ -111,9 +111,9 @@ export default {
sessionNoteSuffix: ' に保存され、ログアウトまたは認証失敗時に削除されます',
help: {
title: 'どのキーを使用できますか?',
accessKeyTitle: 'AccessKey',
accessKeyTitle: 'アクセスキー',
accessKeyDescription:
'配布されたデータプレーン用 AccessKey でログインすると、自身のホーム、情報、利用可能なモデル、リクエスト履歴、使用量だけを確認できます。設定は変更できません',
'配布されたデータプレーン用アクセスキーでログインすると、自身のホーム、情報、利用可能なモデル、リクエスト履歴、使用量だけを確認できます。設定は変更できません',
environmentTitle: '環境変数を優先',
environmentDescription:
'インスタンス起動時に {key} を設定した場合は、デプロイ環境で保護された値を使用してください',
@@ -139,12 +139,12 @@ export default {
models: 'モデル',
settings: '設定',
import: 'チャネル認証情報をインポート',
groupDetail: 'Group 詳細',
groupDetail: 'グループ詳細',
menu: 'メニューと環境設定',
preferences: '環境設定',
accessKeyReadOnly: 'AccessKey · 読み取り専用',
accessKeyReadOnly: 'アクセスキー · 読み取り専用',
accessKeyReadOnlyDescription:
'AccessKey でログイン中です。ページとデータはこのキーに限定され、システム設定は変更できません。',
'アクセスキーでログイン中です。ページとデータはこのキーに限定され、システム設定は変更できません。',
language: '言語',
theme: 'テーマ',
localeZh: '简体中文',
@@ -177,7 +177,7 @@ export default {
title: 'ホーム',
loading: 'ホームを読み込み中…',
baseError: 'ホームの基本情報を読み込めないため、設定状態を判断できません。',
factGroups: '個の Group',
factGroups: '個のグループ',
factAvailableCredentials: '個の認証情報が利用可能',
factModels: '個のモデル',
updated: '更新',
@@ -186,12 +186,12 @@ export default {
tokens: '{count} tokens',
welcomeTitle: 'GPT-Load へようこそ',
importCredentials: 'チャネル認証情報をインポート',
welcomeDescription: 'チャネルを選び、対応する API キーをインポートして Group を作成します',
welcomeDescription: 'チャネルを選び、対応する API キーをインポートしてグループを作成します',
welcomeGuideTitle: '初回接続を 3 ステップで完了',
welcomeEstimatedTime: '所要 1~2 分',
welcomeStep1Title: 'チャネルを選択',
welcomeStep1Description: '組み込みの公式チャネルと互換チャネルを名前で検索できます',
welcomeStep2Title: 'Group 情報を確認',
welcomeStep2Title: 'グループ情報を確認',
welcomeStep2Description: 'モデルは任意で、互換チャネルのみベース URL の入力が必要です',
welcomeStep3Title: '認証情報を 1 つ以上インポート',
welcomeStep3Description:
@@ -202,14 +202,14 @@ export default {
eyebrow: '現在のログイン情報',
active: '有効',
readOnly:
'AccessKey の読み取り専用ビューです。すべてのデータはこのキーに限定され、システム設定は変更できません。',
'アクセスキーの読み取り専用ビューです。すべてのデータはこのキーに限定され、システム設定は変更できません。',
rpm: 'RPM 制限',
rpmValue: '{count} RPM',
unlimited: '無制限',
protocols: '利用可能なプロトコル',
allProtocols: 'すべてのプロトコル',
groups: 'Group 範囲',
allGroups: 'すべての Group',
groups: 'グループ範囲',
allGroups: 'すべてのグループ',
models: 'モデル範囲',
allModels: 'すべてのモデル',
lastRequest: '直近のリクエスト',
+46 -46
View File
@@ -2,14 +2,14 @@ export default {
groups: {
title: 'グループ',
collection: {
loading: 'Group を読み込み中',
errorTitle: 'Group を一時的に読み込めません',
loading: 'グループを読み込み中',
errorTitle: 'グループを一時的に読み込めません',
errorDescription: 'ネットワーク接続またはサービス状態を確認して再試行してください',
retry: '再読み込み',
stale: '最新の更新に失敗したため、前回取得したデータを表示しています',
summary: {
region: 'Group ステータス概要',
current: '現在の Group',
region: 'グループステータス概要',
current: '現在のグループ',
},
status: {
all: 'すべて',
@@ -18,7 +18,7 @@ export default {
disabled: '無効',
},
filters: {
region: 'Group を絞り込む',
region: 'グループを絞り込む',
searchLabel: '検索',
searchPlaceholder: '名前またはチャネル',
clearSearch: '検索をクリア',
@@ -31,15 +31,15 @@ export default {
credentials: '認証情報数',
created: '作成日の新しい順',
},
result: '{shown} / {total} 件の Group を表示',
emptyTitle: '最初のチャネル Group を作成',
result: '{shown} / {total} 件のグループを表示',
emptyTitle: '最初のチャネルグループを作成',
emptyDescription: 'チャネルを選択して API キーをインポートすると利用を開始できます',
importCredentials: 'チャネル認証情報をインポート',
noResultsTitle: '条件に一致する Group がありません',
noResultsTitle: '条件に一致するグループがありません',
noResultsDescription: '検索内容またはステータス条件を変更して再試行してください',
tableLabel: 'Group 一覧',
tableLabel: 'グループ一覧',
columns: {
group: 'Group',
group: 'グループ',
status: 'ステータス',
channel: 'チャネル',
models: 'モデル数',
@@ -57,11 +57,11 @@ export default {
},
},
group: {
invalidTitle: 'Group アドレスが無効です',
invalidDescription: 'Group ID は正の安全な整数である必要があります。',
loading: 'Group 詳細を読み込み中…',
loadFailed: 'Group 詳細を読み込めません。',
stale: 'バックグラウンド更新に失敗したため、Group 詳細が古い可能性があります。',
invalidTitle: 'グループアドレスが無効です',
invalidDescription: 'グループ ID は正の安全な整数である必要があります。',
loading: 'グループ詳細を読み込み中…',
loadFailed: 'グループ詳細を読み込めません。',
stale: 'バックグラウンド更新に失敗したため、グループ詳細が古い可能性があります。',
backToGroups: 'グループ一覧に戻る',
importCredentials: 'チャネル認証情報をインポート',
copyUpstreamUrl: 'アップストリームアドレス {url} をコピー',
@@ -89,7 +89,7 @@ export default {
searchClear: '検索をクリア',
total: '{count} 件のモデル',
summary: '{count} 件のモデル · 価格未設定 {pending} 件',
tableLabel: '現在の Group モデル',
tableLabel: '現在のグループモデル',
id: 'モデル ID',
alias: 'クライアント別名',
pricing: '価格設定',
@@ -135,25 +135,25 @@ export default {
empty: '追加できるモデルが返されませんでした',
confirm: '現在の一覧に追加',
},
saveFailed: 'Group のモデル一覧を置き換えられません。',
saveFailed: 'グループのモデル一覧を置き換えられません。',
noActiveCredential: {
title: '検出に使用できる有効なチャネル認証情報がありません。',
},
emptyConfirm: {
title: 'すべてのモデルを削除しますか?',
description:
'空の一覧を保存すると、この Group のモデルルーティングが無効になり、保存済み一覧全体が置き換えられます。',
'空の一覧を保存すると、このグループのモデルルーティングが無効になり、保存済み一覧全体が置き換えられます。',
close: '空モデルの確認を閉じる',
cancel: 'キャンセル',
confirm: '空の一覧に置き換える',
},
},
settings: {
title: 'Group 設定',
description: 'Group の識別情報、ルーティング項目、疎なランタイム上書きを編集します。',
title: 'グループ設定',
description: 'グループの識別情報、ルーティング項目、疎なランタイム上書きを編集します。',
save: '設定を保存',
loading: 'Group 設定を読み込み中',
loadFailed: 'Group 設定を読み込めません',
loading: 'グループ設定を読み込み中',
loadFailed: 'グループ設定を読み込めません',
saved: '設定を保存しました',
unsaved: '未保存の変更があります',
saving: '保存中',
@@ -179,39 +179,39 @@ export default {
description: 'ルールは既定で折りたたまれ、編集すると HeaderRules 全体を置き換えます',
},
dangerDescription: '元に戻せない操作を通常の設定から明確に分離します。',
saveFailed: 'Group 設定を更新できませんでした。',
saveFailed: 'グループ設定を更新できませんでした。',
base: {
description: '名前、チャネルパラメータ、有効状態は Group 全体に適用されます。',
description: '名前、チャネルパラメータ、有効状態はグループ全体に適用されます。',
channel: 'チャネル',
channelHelp: 'チャネルは Group 作成時に確定し、後から変更できません。',
channelHelp: 'チャネルはグループ作成時に確定し、後から変更できません。',
channelCatalogUnavailable:
'チャネル一覧を読み込めないため、チャネルパラメータをロックしました。他の設定は編集できます。',
name: '名前',
nameError: 'Group 名を入力してください。',
nameError: 'グループ名を入力してください。',
upstreamUrl: 'アップストリーム URL',
upstreamUrlError: '有効な HTTP または HTTPS の Base URL を入力してください。',
urlWarning: 'Base URL を変更すると、今後の Group リクエストの送信先が変わります。',
urlWarning: 'Base URL を変更すると、今後のグループリクエストの送信先が変わります。',
customUrl: 'カスタム上流 URL',
customUrlHelp: '既定ではチャネル設定または SDK 公式アドレスを使用します。',
paramRequired: '{field} を入力してください。',
validationModel: '検証モデル(任意)',
weight: 'Group 手動ウェイト',
weight: 'グループ手動ウェイト',
auto: '自動',
manual: '手動',
weightError: '1~100 の整数を入力してください',
enabled: 'Group を有効化',
enabledHelp: '無効にすると新しいリクエストではこの Group を選択しません',
enabled: 'グループを有効化',
enabledHelp: '無効にすると新しいリクエストではこのグループを選択しません',
},
runtime: {
title: 'ランタイム上書き',
description: '継承値はグローバル設定に従い、Group 上書きは疎なまま保持されます。',
description: '継承値はグローバル設定に従い、グループ上書きは疎なまま保持されます。',
first_byte_timeout: 'ネイティブ応答 / ストリーム初回イベントのタイムアウト',
request_timeout: 'リクエストタイムアウト',
stream_idle_timeout: 'ストリームアイドルタイムアウト',
effective: '{value} 秒',
currentValue: '現在の有効値',
seconds: '秒',
override: 'この Group で上書き',
override: 'このグループで上書き',
inherited: 'グローバル設定を継承',
useOverride: '上書きに変更',
useInherited: '継承に変更',
@@ -226,34 +226,34 @@ export default {
'通常の HeaderRules は Secret ストレージではありません。認証情報には',
headerStorageNoticeEnd: 'を使用してください。',
headerReplacementWarning:
'この Group 上書きはグローバル HeaderRules 全体を置き換えます。今後のグローバル変更はマージされません。',
'このグループ上書きはグローバル HeaderRules 全体を置き換えます。今後のグローバル変更はマージされません。',
inject_usage_options: '使用量オプションを注入',
injectUsageHelp: 'この上書きは openai-completions でのみ利用できます',
affinity_enabled: 'リクエストアフィニティ',
affinityHelp:
'通常の重み、スケジューリング、再試行を変えず、この Group がアフィニティ対象を学習または再利用するかを制御します。',
'通常の重み、スケジューリング、再試行を変えず、このグループがアフィニティ対象を学習または再利用するかを制御します。',
affinityInherit: 'グローバルを継承',
affinityEnable: '有効',
affinityDisable: '無効',
},
delete: {
sectionDescription:
'Group を削除するとすべてのチャネル認証情報も削除され、元に戻せません。',
open: 'Group を削除',
title: 'この Group を削除しますか?',
description: '完全に削除するには Group 名「{name}」を正確に入力してください。',
close: 'Group 削除の確認を閉じる',
'グループを削除するとすべてのチャネル認証情報も削除され、元に戻せません。',
open: 'グループを削除',
title: 'このグループを削除しますか?',
description: '完全に削除するにはグループ名「{name}」を正確に入力してください。',
close: 'グループ削除の確認を閉じる',
typeName: '確認のため {name} と入力',
cancel: 'キャンセル',
confirm: 'Group を完全に削除',
failed: 'Group を削除できませんでした。',
inUseTitle: 'この Group は AccessKey から参照されています。',
inUseDescription: '削除する前に次の明示的な Group 参照を外してください:',
manageAccessKeys: 'AccessKey を管理',
confirm: 'グループを完全に削除',
failed: 'グループを削除できませんでした。',
inUseTitle: 'このグループはアクセスキーから参照されています。',
inUseDescription: '削除する前に次の明示的なグループ参照を外してください:',
manageAccessKeys: 'アクセスキーを管理',
},
},
tabs: {
label: 'Group 詳細セクション',
label: 'グループ詳細セクション',
credentials: '認証情報',
models: 'モデルとエイリアス',
settings: '設定',
@@ -340,7 +340,7 @@ export default {
confirmDelete: '認証情報を削除',
closeDialog: '削除確認を閉じる',
deleteTitle: 'チャネル認証情報を削除しますか?',
deleteDescription: '{mask} をこの Group から削除します。この操作は元に戻せません',
deleteDescription: '{mask} をこのグループから削除します。この操作は元に戻せません',
columns: {
credential: 'キー',
status: 'ステータス',
+28 -27
View File
@@ -16,8 +16,8 @@ export default {
},
mode: {
label: 'インポート先',
new: '新しい Group',
existing: '既存 Group',
new: '新しいグループ',
existing: '既存グループ',
},
steps: {
channel: {
@@ -46,12 +46,12 @@ export default {
},
create: {
incomplete: '必須項目を完了してください',
creating: 'Group を作成中',
creating: 'グループを作成中',
creatingDescription: '認証情報と設定を安全に保存しています',
checking: '前回の操作を確認中',
checkingDescription: '上の状態操作から結果を確認してください',
readyDescription: '「{name}」を作成します。名前は後から変更できます',
unnamedGroup: '名前未設定の Group',
unnamedGroup: '名前未設定のグループ',
},
},
operation: {
@@ -66,30 +66,30 @@ export default {
abandon: 'この操作を放棄',
},
existing: {
title: '対象 Group',
title: '対象グループ',
description:
'この入口は API キー Group への認証情報追加専用です。モデルや設定は変更しません。サブスクリプションは Codex Group の認証情報ページから接続してください。',
groupsLoading: 'Group を読み込み中…',
groupsFailed: 'Group を読み込めません',
groupsStale: 'Group の更新に失敗したため、キャッシュ結果を表示しています',
groupsEmpty: '選択できる Group がありません',
groupLabel: 'Group',
groupPlaceholder: 'Group を選択',
'この入口は API キーグループへの認証情報追加専用です。モデルや設定は変更しません。サブスクリプションは Codex グループの認証情報ページから接続してください。',
groupsLoading: 'グループを読み込み中…',
groupsFailed: 'グループを読み込めません',
groupsStale: 'グループの更新に失敗したため、キャッシュ結果を表示しています',
groupsEmpty: '選択できるグループがありません',
groupLabel: 'グループ',
groupPlaceholder: 'グループを選択',
groupOption: '#{id} · {name}',
groupCount: 'Group {count} 件',
groupCount: 'グループ {count} 件',
groupMeta: '#{id} · 公開モデル {models} 件',
groupUnchanged: 'その他の設定は変更しません',
groupNotFound: 'Group #{id} が見つかりません',
groupNotFound: 'グループ #{id} が見つかりません',
actionSummary: '{name} に認証情報を追加',
actionSelectTarget: '先に追加先 Group を選択してください',
actionSelectTarget: '先に追加先グループを選択してください',
actionHelp: 'モデルや設定を変更せず、チャネル認証情報のみを追加します',
credentialStorageNotice: '送信後、サーバーが実際の追加数と既存の重複数を返します',
batchDuplicates: 'このバッチ内の重複',
submit: '認証情報を追加',
importFailed: '選択した Group に認証情報をインポートできません',
importFailed: '選択したグループに認証情報をインポートできません',
},
connection: {
name: 'Group 名',
name: 'グループ名',
namePlaceholder: '空欄の場合はチャネルの既定名を使用します',
url: 'アップストリームのベース URL',
urlDescription: 'アップストリームサービスが要求する Base URL を入力してください',
@@ -205,7 +205,7 @@ export default {
empty: '空行',
duplicates: '重複',
},
accessKeyWarning: '{count} 行が GPT-Load AccessKey のようです — 続行前に確認してください',
accessKeyWarning: '{count} 行が GPT-Load アクセスキーのようです — 続行前に確認してください',
tooMany: '空でないキーは最大 1,000 件です',
required: '先に認証情報を 1 件以上入力してください',
channelCredentialNotice:
@@ -227,7 +227,7 @@ export default {
title: 'モデルとエイリアス',
description: 'モデルは常に任意です — 有効なエイリアスが公開モデル名になります',
descriptionSubscription:
'空のままでも Group を作成できます。アカウントを接続すると上流のモデル一覧を取得できます。',
'空のままでもグループを作成できます。アカウントを接続すると上流のモデル一覧を取得できます。',
tableLabel: '公開予定モデル',
id: 'モデル ID',
alias: '公開モデル名',
@@ -240,7 +240,7 @@ export default {
aliasPlaceholder: '公開モデル名を入力',
aliasRequired: 'エイリアスを有効にした場合は公開モデル名が必要です',
removeFor: 'モデル {id} を削除',
empty: 'モデルは未追加です — このまま Group を作成できます',
empty: 'モデルは未追加です — このままグループを作成できます',
noMatches: '一致するモデルはありません',
resolveErrors: 'モデル設定の問題を修正してください',
conflictSummary: '公開モデル名に完全一致の重複があります',
@@ -282,24 +282,25 @@ export default {
},
},
discover: '上流モデルを取得',
create: 'Group を作成',
create: 'グループを作成',
summary: '認証情報 {credentials} 件 · モデル {models} 件',
summaryOptional: '認証情報 {credentials} 件 · モデルは任意',
summaryAccounts: 'アカウント {accounts} 件 · モデル {models} 件',
summaryAccountsOptional: 'アカウント {accounts} 件 · モデルは任意',
createFailed: 'Group を作成できません',
appendFailed: '選択した Group に認証情報をインポートできません',
createFailed: 'グループを作成できません',
appendFailed: '選択したグループに認証情報をインポートできません',
conflict: {
title: 'このチャネル接続先は既に存在します',
titleSubscription: 'Codex の Group は既に存在します',
description: '既存 Group に認証情報を追加するか、別の Group を作成してください',
descriptionSubscription: '既存 Group にアカウントを追加するか、別の Group を作成してください',
titleSubscription: 'Codex のグループは既に存在します',
description: '既存グループに認証情報を追加するか、別のグループを作成してください',
descriptionSubscription:
'既存グループにアカウントを追加するか、別のグループを作成してください',
close: 'URL 競合を閉じる',
append: 'ここに認証情報をインポート',
appendSubscription: 'ここにアカウントを追加',
appendHelp: '推奨 · 現在の認証情報だけを追加し、既存の設定は変更しません',
appendHelpSubscription: '推奨 · 現在のアカウントだけを追加し、既存の設定は変更しません',
separate: '別の Group を作成',
separate: '別のグループを作成',
edit: '編集に戻る',
},
},
+1 -1
View File
@@ -68,7 +68,7 @@ export default {
failed: '価格レコードを削除できません',
},
errors: {
referenced: 'この価格は {groups} Group から {entries} 件参照されています',
referenced: 'この価格は {groups} グループから {entries} 件参照されています',
automaticDeleteForbidden: '自動価格は削除できません。先に手動価格へ変更してください',
},
},
+12 -12
View File
@@ -9,7 +9,7 @@ export default {
result: '{total} 件中 {shown} 件のクライアントモデルを表示',
actions: {
sync: 'カタログと自動価格を同期',
configureGroups: 'Group でモデルを追加',
configureGroups: 'グループでモデルを追加',
},
sync: {
succeeded: 'モデルカタログと自動価格を同期しました',
@@ -31,14 +31,14 @@ export default {
filters: {
region: 'モデルを絞り込む',
searchLabel: '検索',
searchPlaceholder: 'クライアントモデル、上流モデル、Group',
searchPlaceholder: 'クライアントモデル、上流モデル、グループ',
clearSearch: '検索をクリア',
groupStatusLabel: 'Group の状態',
groupStatusLabel: 'グループの状態',
pricingStatusLabel: '価格状態',
reset: '条件をリセット',
groupStatus: {
enabled: '有効な Group',
all: 'すべての Group',
enabled: '有効なグループ',
all: 'すべてのグループ',
},
pricingStatus: {
all: 'すべての価格',
@@ -49,9 +49,9 @@ export default {
empty: {
title: '表示できるモデルがありません',
description:
'有効な Group に設定されたモデルはありません。先に Group でモデルを追加してください。',
'有効なグループに設定されたモデルはありません。先にグループでモデルを追加してください。',
noResultsTitle: '条件に一致するモデルがありません',
noResultsDescription: '検索、Group の状態、価格状態を変更して再度お試しください',
noResultsDescription: '検索、グループの状態、価格状態を変更して再度お試しください',
},
tree: {
label: 'クライアントモデルと上流価格の一覧',
@@ -61,7 +61,7 @@ export default {
open: '上流モデル {model} の詳細と価格を表示',
upstreamCount: '上流 {count} 件',
protocolRestricted: 'プロトコル制限あり',
protocolRestrictedHelp: 'この AccessKey で利用できるプロトコル:\n{protocols}',
protocolRestrictedHelp: 'このアクセスキーで利用できるプロトコル:\n{protocols}',
pricingIdentityHelp: '価格識別子\nチャネル:{channel} ({channelId})\n上流モデル:{model}',
tierCount: '{count} 段',
noPrice: '—',
@@ -78,20 +78,20 @@ export default {
drawer: {
title: '上流モデルの詳細',
description: '関連情報を確認し、価格を編集します',
impact: 'クライアントモデル {clients} 件 · Group {groups} 件',
impact: 'クライアントモデル {clients} 件 · グループ {groups} 件',
specs: '仕様',
loading: '読み込み中…',
loadFailed: '上流モデルの詳細を読み込めません',
sharedImpact:
'同じ価格識別子は {references} 件のモデル設定から参照され、クライアントモデル {clients} 件、Group {groups} 件に影響します。保存内容はすべてに反映されます。',
'同じ価格識別子は {references} 件のモデル設定から参照され、クライアントモデル {clients} 件、グループ {groups} 件に影響します。保存内容はすべてに反映されます。',
relationships: '関連',
relationshipsHelp: '{count} 件の参照をクライアントモデルと Group ごとに表示します',
relationshipsHelp: '{count} 件の参照をクライアントモデルとグループごとに表示します',
pricingChannel: '価格チャネル',
upstreamModel: '上流モデル',
standardPrices: '標準料金',
fastPrices: 'Fast モード料金',
fastPricesSource: 'Models.dev · 読み取り専用',
group: 'Group',
group: 'グループ',
aliasMapping: 'クライアントモデル {client} から上流モデル {upstream} へのマッピング',
directMapping: 'クライアントモデル {model} は同名の上流モデルを直接使用',
updatedAt: '更新',
+73 -74
View File
@@ -51,19 +51,19 @@ export default {
disabled: '無効 {disabled}',
},
groups: {
title: 'Group ヘルス',
title: 'グループヘルス',
description:
'現在利用可能な認証情報だけを示し、特定の AccessKey、プロトコル、モデルのルート可否は保証しません。',
empty: 'Group がありません。',
'現在利用可能な認証情報だけを示し、特定のアクセスキー、プロトコル、モデルのルート可否は保証しません。',
empty: 'グループがありません。',
disabled: '無効',
emptyCredentials: '認証情報なし',
unavailable: '利用不可',
attention: '要確認',
limited: '容量制限',
available: '利用可能',
tableLabel: 'Group ヘルス一覧',
tableLabel: 'グループヘルス一覧',
columns: {
group: 'Group',
group: 'グループ',
status: 'スケジュール',
credentialHealth: '認証情報の構成',
exceptions: '現在の例外',
@@ -75,9 +75,9 @@ export default {
blacklistedCount: 'ブラックリスト {count}',
none: 'なし',
viewLogsFor: '{name} のリクエストログを表示',
viewGroup: 'Group {name} を表示',
showAll: '全 {count} Group を表示',
collapse: 'Group を折りたたむ',
viewGroup: 'グループ {name} を表示',
showAll: '全 {count} グループを表示',
collapse: 'グループを折りたたむ',
},
problems: {
title: '確認が必要な認証情報',
@@ -90,7 +90,7 @@ export default {
emptyHint: '問題が発生した認証情報はスケジュールへの影響順にここへ表示されます。',
inactiveTitle: 'ランタイム認証情報の例外はありません',
inactiveDescription:
'クールダウン中またはブラックリストの認証情報はありません。利用可否の設定は概要と Group ヘルスで確認してください。',
'クールダウン中またはブラックリストの認証情報はありません。利用可否の設定は概要とグループヘルスで確認してください。',
noneForStatus: 'この状態の認証情報はありません。',
cooldown: 'クールダウン中',
blacklisted: 'ブラックリスト',
@@ -98,7 +98,7 @@ export default {
credentialMeta: '{group}',
tableLabel: '確認が必要な認証情報一覧',
columns: {
identity: '認証情報 / Group',
identity: '認証情報 / グループ',
status: '状態',
window: '現在の期間',
recovery: '回復',
@@ -115,7 +115,7 @@ export default {
configurationRecovery: '検証設定が必要',
configurationHint: '自動回復には検証モデルの設定が必要です',
viewLogs: '認証情報 {credential} のリクエストログを表示',
viewGroup: 'Group {group} を表示',
viewGroup: 'グループ {group} を表示',
},
details: {
failureCount: '累計失敗',
@@ -183,15 +183,15 @@ export default {
stale: 'バックグラウンド更新に失敗したため、使用量データが古い可能性があります。',
options: {
groupsFailed:
'Group 名を読み込めません。代わりに正の Group ID を入力できます。使用量レポートには影響しません。',
'グループ名を読み込めません。代わりに正のグループ ID を入力できます。使用量レポートには影響しません。',
partialFailed:
'一部の Group またはチャネル候補を読み込めません。使用量クエリは引き続き利用できます。',
'一部のグループまたはチャネル候補を読み込めません。使用量クエリは引き続き利用できます。',
},
filters: {
label: '使用量レポートのフィルター',
title: '使用量とコストを絞り込む',
description:
'Group、チャネル、クレデンシャル、アップストリームモデルで現在の集計範囲を絞り込みます。',
'グループ、チャネル、クレデンシャル、アップストリームモデルで現在の集計範囲を絞り込みます。',
close: '使用量とコストのフィルターを閉じる',
button: 'フィルター',
range: '期間',
@@ -205,10 +205,10 @@ export default {
'15d': '15 日',
'30d': '30 日',
},
group: 'Group',
groupHelp: '任意の完全一致 Group スコープです。',
groupIdHelp: 'Group 名の読み込みに失敗しました。正の Group ID を入力できます。',
anyGroup: 'すべての Group',
group: 'グループ',
groupHelp: '任意の完全一致グループスコープです。',
groupIdHelp: 'グループ名の読み込みに失敗しました。正のグループ ID を入力できます。',
anyGroup: 'すべてのグループ',
channel: 'チャネル',
anyChannel: 'すべてのチャネル',
credential: 'クレデンシャル ID',
@@ -226,7 +226,7 @@ export default {
refreshedAt: '最終更新時刻',
},
errors: {
positiveId: '有効な正の Group ID を入力してください。',
positiveId: '有効な正のグループ ID を入力してください。',
channelId: '有効なチャネル ID を選択または入力してください。',
credentialId: '有効な正のクレデンシャル ID を入力してください。',
model: 'アップストリームモデルの前後に空白や制御文字を含めることはできません。',
@@ -239,7 +239,7 @@ export default {
empty: {
title: '一致する使用量データがありません',
description:
'期間を変更するか、Group、チャネル、クレデンシャル、アップストリームモデルのフィルターをリセットしてください。',
'期間を変更するか、グループ、チャネル、クレデンシャル、アップストリームモデルのフィルターをリセットしてください。',
},
kpi: {
title: '使用量サマリー',
@@ -364,7 +364,7 @@ export default {
inspector: {
title: 'ルート検査',
description:
'プロトコル、操作、必要機能、モデル、AccessKey から候補 Group と認証情報を確認します。',
'プロトコル、操作、必要機能、モデル、アクセスキーから候補グループと認証情報を確認します。',
boundary:
'実際のリクエストに必要な操作と機能を選択してください。読み取り専用で、上流送信や Token 消費はありません。',
routeModes: {
@@ -396,9 +396,9 @@ export default {
optional: '任意',
modelPlaceholder: 'クライアントモデルを入力',
modelOptional: 'プロトコルのみで扱うリソースリクエストでは省略できます。',
accessKey: 'AccessKey',
accessKey: 'アクセスキー',
accessKeyOption: '{name} · #{id} · {status}',
missingAccessKeyOption: '存在しない AccessKey · #{id}',
missingAccessKeyOption: '存在しないアクセスキー · #{id}',
submit: '現在のルートを検査',
},
accessKeyStatus: {
@@ -406,16 +406,16 @@ export default {
disabled: '無効',
},
options: {
loading: 'AccessKey の選択肢を読み込み中…',
failed: 'AccessKey の選択肢を読み込めません。',
loading: 'アクセスキーの選択肢を読み込み中…',
failed: 'アクセスキーの選択肢を読み込めません。',
},
errors: {
protocol: '有効なプロトコルを選択してください。',
operation: 'プロトコルに対応する操作を選択してください。',
model: '必要な操作では有効なモデルを入力し、リソース操作では空にしてください。',
accessKey: '存在する AccessKey を選び直してください。',
accessKey: '存在するアクセスキーを選び直してください。',
missingDeepLinkAccessKey:
'リンクで指定された AccessKey #{id} は存在しません。選び直してください。',
'リンクで指定されたアクセスキー #{id} は存在しません。選び直してください。',
summary: 'ルート検査の入力が無効です。',
},
request: {
@@ -425,7 +425,7 @@ export default {
empty: {
title: '条件を入力して現在のルートを検査',
description:
'現在の設定スナップショットにある候補 Group、認証情報の状態、除外理由を説明します。',
'現在の設定スナップショットにある候補グループ、認証情報の状態、除外理由を説明します。',
},
result: {
title: '現在のランタイム観測',
@@ -439,22 +439,22 @@ export default {
protocol: 'プロトコル',
externalModel: 'クライアントモデル',
modelNotSpecified: '未指定',
accessKey: 'AccessKey',
accessKeyStatus: 'AccessKey の状態',
candidateGroups: '候補 Group',
accessKey: 'アクセスキー',
accessKeyStatus: 'アクセスキーの状態',
candidateGroups: '候補グループ',
availableCredentials: '現在利用可能な認証情報',
reason: '理由',
inputChanged: '入力が変更されました。以下は最後に送信した入力に対する観測結果です。',
stale: '最新の検査に失敗しました。以下は表示された観測時刻の古い結果です。',
},
groups: {
title: '候補 Group',
title: '候補グループ',
description:
'ネイティブルートを優先し、シェアは現在競合しているルート階層内だけで計算します。',
count: '{count} 件',
tableLabel: '候補 Group のルート説明',
tableLabel: '候補グループのルート説明',
completeEmpty:
'候補 Group は返されませんでした。これは空状態ではなく、この入力に対する完全な現在ランタイムの説明です。',
'候補グループは返されませんでした。これは空状態ではなく、この入力に対する完全な現在ランタイムの説明です。',
included: '候補に含まれる',
excluded: '候補から除外',
standby: '待機階層',
@@ -462,9 +462,9 @@ export default {
availableTotal: '利用可能 / 合計',
currentTotal: '現在の合計',
shareLabel: '{name} の有効ウェイト比率は {share}',
viewGroup: 'Group を表示',
viewGroup: 'グループを表示',
columns: {
group: 'Group',
group: 'グループ',
status: '状態',
credentials: '認証情報',
weight: '有効ウェイト',
@@ -479,7 +479,7 @@ export default {
unavailable: '利用不可',
summary: '利用可能 {available} · 利用不可 {unavailable}',
tableLabel: '{name} の認証情報ルート説明',
noneReturned: 'この Group には認証情報候補が返されませんでした。',
noneReturned: 'このグループには認証情報候補が返されませんでした。',
cooldownUntil: 'クールダウン期限',
none: 'なし',
columns: {
@@ -497,30 +497,30 @@ export default {
effective: '生の有効ウェイト',
null: 'null',
none: '—',
groupManual: 'Group 手動ウェイト {value}',
groupManual: 'グループ手動ウェイト {value}',
},
excluded: {
title: '除外 Group',
title: '除外グループ',
description:
'Group 単位の除外結果のみを表示します。候補 Group を展開すると認証情報単位の理由を確認できます。',
empty: '現在の入力で除外された Group はありません。',
tableLabel: '除外 Group のルート説明',
'グループ単位の除外結果のみを表示します。候補グループを展開すると認証情報単位の理由を確認できます。',
empty: '現在の入力で除外されたグループはありません。',
tableLabel: '除外グループのルート説明',
reasonCode: '理由コード',
},
reasons: {
none: '除外理由なし',
access_key_disabled: 'AccessKey は無効です',
protocol_filtered: 'AccessKey フィルターがこのプロトコルを除外しました',
model_filtered: 'AccessKey フィルターがこのモデルを除外しました',
model_required_by_filter: 'AccessKey のモデルフィルターによりモデルの指定が必要です',
access_key_disabled: 'アクセスキーは無効です',
protocol_filtered: 'アクセスキーフィルターがこのプロトコルを除外しました',
model_filtered: 'アクセスキーフィルターがこのモデルを除外しました',
model_required_by_filter: 'アクセスキーのモデルフィルターによりモデルの指定が必要です',
operation_unsupported: 'チャネルはこのプロトコル操作をサポートしていません',
native_route_required: 'このリクエストにはネイティブルートが必要です',
no_route_target: 'このモデルとプロトコルに一致するルート先がありません',
group_disabled: 'Group は無効です',
group_filtered: 'AccessKey フィルターがこの Group を除外しました',
no_available_group: '現在ルート可能な候補 Group がありません',
no_credentials: 'Group にランタイム認証情報がありません',
group_weight_zero: 'Group の有効ウェイトがゼロです',
group_disabled: 'グループは無効です',
group_filtered: 'アクセスキーフィルターがこのグループを除外しました',
no_available_group: '現在ルート可能な候補グループがありません',
no_credentials: 'グループにランタイム認証情報がありません',
group_weight_zero: 'グループの有効ウェイトがゼロです',
credential_disabled: '認証情報は無効です',
credential_blacklisted: '認証情報はブラックリストに登録されています',
credential_cooldown: '認証情報はクールダウン中です',
@@ -528,7 +528,7 @@ export default {
'サブスクリプション枠を使い切ったため、回復まで自動的に除外されます',
credential_weight_zero: '認証情報の有効ウェイトがゼロです',
credential_not_allowed: 'このリクエストから認証情報が除外されました',
no_available_credential: 'Group に現在利用可能な認証情報がありません',
no_available_credential: 'グループに現在利用可能な認証情報がありません',
unknown: '不明なルート理由',
},
},
@@ -548,9 +548,9 @@ export default {
filteredDescription: 'フィルターを調整またはリセットして、再試行してください。',
},
options: {
groupsFailed: 'Group フィルターの選択肢を読み込めません。ログ一覧には影響しません。',
groupsFailed: 'グループフィルターの選択肢を読み込めません。ログ一覧には影響しません。',
accessKeysFailed:
'AccessKey フィルターの選択肢を読み込めません。ログ一覧には影響しません。',
'アクセスキーフィルターの選択肢を読み込めません。ログ一覧には影響しません。',
partialFailed: '一部のフィルター選択肢を読み込めませんが、ログ検索は使用できます。',
},
filters: {
@@ -568,14 +568,14 @@ export default {
'30d': '30d',
},
any: 'すべて',
group: 'いずれかの試行の Group',
groupHelp: 'いずれかの試行で使用された Group に一致します。',
anyGroup: 'すべての試行 Group',
group: 'いずれかの試行のグループ',
groupHelp: 'いずれかの試行で使用されたグループに一致します。',
anyGroup: 'すべての試行グループ',
model: 'クライアントモデル',
clientModel: 'クライアントモデル',
upstreamModel: 'いずれかの試行のアップストリームモデル',
accessKey: 'AccessKey',
anyAccessKey: 'すべての AccessKey',
accessKey: 'アクセスキー',
anyAccessKey: 'すべてのアクセスキー',
protocol: 'プロトコル',
anyProtocol: 'すべてのプロトコル',
stream: 'ストリーミング',
@@ -604,11 +604,11 @@ export default {
noneApplied: 'フィルターなし',
appliedFrom: '開始 {value}',
appliedTo: '終了 {value}',
appliedGroup: '試行 Group {value}',
appliedGroup: '試行グループ {value}',
appliedModel: 'クライアントモデル {value}',
appliedClientModel: 'クライアントモデル {value}',
appliedUpstreamModel: '試行アップストリームモデル {value}',
appliedAccessKey: 'AccessKey {value}',
appliedAccessKey: 'アクセスキー {value}',
appliedChannel: 'チャネル {value}',
appliedCredential: 'クレデンシャル #{value}',
appliedStatus: '状態 {value}',
@@ -690,7 +690,7 @@ export default {
notRecorded: '未記録',
},
routeIdentity: {
group: 'Group:{name}(G{id})',
group: 'グループ:{name}(G{id})',
channel: 'チャネル:{name}({id})',
credential: 'クレデンシャル:K{id}',
},
@@ -712,7 +712,7 @@ export default {
retry: '再試行',
cooldown_credential: 'クレデンシャルをクールダウン',
fail_credential: '認証情報の失敗を記録',
skip_group: 'Group をスキップ',
skip_group: 'グループをスキップ',
unknown: '不明なアクション',
},
operation: {
@@ -744,17 +744,17 @@ export default {
drawer: {
title: 'リクエストログ詳細',
description: '最終結果と秘匿化されたアップストリーム試行チェーンを確認します。',
descriptionSelfScoped: '現在の AccessKey に属するリクエスト、結果、使用量を確認します。',
descriptionSelfScoped: '現在のアクセスキーに属するリクエスト、結果、使用量を確認します。',
close: 'リクエストログ詳細を閉じる',
loading: 'リクエストログ詳細を読み込み中…',
loadFailed: 'リクエストログ詳細を読み込めません。',
summary: '最終結果',
summary: 'リクエスト結果',
requestId: 'リクエスト ID',
copyRequestId: 'リクエスト ID をコピー',
completedAt: '完了時刻',
status: '状態',
protocol: 'プロトコル',
accessKey: 'AccessKey',
accessKey: 'アクセスキー',
clientModel: 'クライアントモデル',
upstreamModel: 'アップストリームモデル',
modelNotSpecified: '未指定',
@@ -773,9 +773,9 @@ export default {
outputRate: '出力速度',
attemptCount: '試行回数',
request: 'クライアントリクエスト',
finalExecution: '最終実行',
finalExecution: 'アップストリーム実行',
route: 'リクエストと最終ルート',
routeIdentity: '最終ルート識別子',
routeIdentity: 'ルート識別子',
upstreamProtocol: 'アップストリームプロトコル',
affinity: 'アフィニティ一致',
errorCode: 'エラーコード',
@@ -789,7 +789,7 @@ export default {
clientStreamState: 'クライアントストリーム状態',
clientStreamStarted: 'クライアントへの出力開始済み',
clientStreamNotStarted: 'クライアントへの出力なし',
group: '履歴 Group',
group: '履歴グループ',
channel: '履歴チャネル',
credential: '履歴クレデンシャル',
operation: '操作',
@@ -805,11 +805,11 @@ export default {
requestedModel: 'アップストリーム要求モデル',
reportedModel: 'アップストリーム応答モデル',
usage: {
title: '使用量と推定コスト',
title: '使用量・コスト',
description:
'最終的に永続化された使用量フィールドです。コストは常に推定値で、不明は無料を意味しません。',
finalGroup: '最終 Group',
groupId: 'Group #{id}',
finalGroup: '最終グループ',
groupId: 'グループ #{id}',
usageStateLabel: '使用量状態',
costStateLabel: 'コスト状態',
estimatedCost: '推定コスト',
@@ -854,7 +854,7 @@ export default {
completedAt: '完了時刻',
requestId: 'リクエスト ID',
route: 'ルート',
accessKey: 'AccessKey',
accessKey: 'アクセスキー',
result: '最終状態',
timing: '初回 / 合計',
actions: '操作',
@@ -901,7 +901,6 @@ export default {
formula: 'コスト計算',
input: '入力',
output: '出力',
schema: '価格レシートバージョン',
identity: '価格識別情報',
historicalSchema1: '履歴スコープ',
historicalSchema2: '履歴グローバル価格',
+3 -3
View File
@@ -89,10 +89,10 @@ export default {
affinity: {
title: 'リクエストアフィニティ',
description:
'自動ソフトアフィニティのグローバル既定値を制御します。Group ごとに継承、有効、無効を選択できます。',
'自動ソフトアフィニティのグローバル既定値を制御します。グループごとに継承、有効、無効を選択できます。',
affinity_enabled: 'リクエストアフィニティを有効化',
enabledHelp:
'無効の場合、明示的に有効化した Group のみアフィニティ対象を学習して再利用できます。',
'無効の場合、明示的に有効化したグループのみアフィニティ対象を学習して再利用できます。',
affinity_ttl: '既定の有効期間',
affinity_ttlEffective: '{value} 秒',
affinity_ttlError: '9,223,372,036 以下の正の安全な整数を入力してください。',
@@ -115,7 +115,7 @@ export default {
resetPending:
'現在公開中の明示ルールを表示しています。保存後に現在のバージョンの既定値へ戻ります。',
replacementWarning:
'Group Header Rules の上書きはグローバルオブジェクト全体を置き換え、個別のルールをマージしません。',
'グループのヘッダールール上書きはグローバルオブジェクト全体を置き換え、個別のルールをマージしません。',
securityNotice:
'固定 Header 値は通常の設定です。長期認証情報を保存しないでください。認証 Header はリテラルの {template} テンプレートを使用する必要があります。',
conflict:
+48 -49
View File
@@ -3,9 +3,9 @@ export default {
title: '访问密钥',
description: '签发并管理用于数据面客户端的明文敏感凭据。',
loginNotice: {
title: 'AccessKey 也可以登录',
title: '访问密钥也可以登录',
description:
'分发 AccessKey 时,可同时告知使用者在当前实例登录页输入该密钥;登录后只能查看自身的首页、可用模型、用量和脱敏请求记录,不能修改配置。',
'分发访问密钥时,可同时告知使用者在当前实例登录页输入该密钥;登录后只能查看自身的首页、可用模型、用量和脱敏请求记录,不能修改配置。',
},
create: '创建访问密钥',
copy: '复制访问密钥',
@@ -16,31 +16,31 @@ export default {
enabled: '访问密钥“{name}”已启用',
disabled: '访问密钥“{name}”已停用',
},
loading: '正在加载 AccessKey…',
loadFailed: '无法加载 AccessKey。',
stale: 'AccessKey 数据可能已过期;后台刷新失败。',
groupsStale: 'Group 刷新失败,过滤条件中的 Group 名称可能已过期。',
emptyTitle: '暂无 AccessKey',
emptyDescription: '连接数据面客户端前,请先创建 AccessKey。',
caption: 'AccessKey 及其路由过滤条件',
scrollHint: '可横向滚动查看 AccessKey 的全部列。',
loading: '正在加载访问密钥…',
loadFailed: '无法加载访问密钥。',
stale: '访问密钥数据可能已过期;后台刷新失败。',
groupsStale: '分组刷新失败,过滤条件中的分组名称可能已过期。',
emptyTitle: '暂无访问密钥',
emptyDescription: '连接数据面客户端前,请先创建访问密钥。',
caption: '访问密钥及其路由过滤条件',
scrollHint: '可横向滚动查看访问密钥的全部列。',
details: '范围与元数据',
createdAt: '创建时间',
updatedAt: '更新时间',
allGroups: '全部 Group',
allGroups: '全部分组',
allProtocols: '全部协议',
allModels: '全部模型',
unlimited: '不限',
filterGroups: 'Group',
filterGroups: '分组',
filterProtocols: '协议',
filterModels: '模型',
collection: {
loading: '正在加载 AccessKey',
errorTitle: '暂时无法加载 AccessKey',
loading: '正在加载访问密钥',
errorTitle: '暂时无法加载访问密钥',
errorDescription: '请检查网络连接或服务状态后重试',
summary: {
region: 'AccessKey 状态概览',
current: '当前 AccessKey',
region: '访问密钥状态概览',
current: '当前访问密钥',
},
status: {
all: '全部',
@@ -48,25 +48,24 @@ export default {
disabled: '已停用',
},
filters: {
region: '筛选 AccessKey',
region: '筛选访问密钥',
searchLabel: '搜索',
searchPlaceholder: '名称或密钥末 4 位',
clearSearch: '清空搜索',
reset: '重置条件',
},
result: '显示 {shown} / {total} 个 AccessKey',
result: '显示 {shown} / {total} 个访问密钥',
neverRequested: '暂无请求',
noResultsTitle: '没有符合条件的 AccessKey',
noResultsTitle: '没有符合条件的访问密钥',
noResultsDescription: '调整搜索内容或状态筛选后再试',
tableLabel: 'AccessKey 列表',
tableLabel: '访问密钥列表',
openDetailsFor: '打开访问密钥“{name}”的详情',
},
operation: {
indeterminate: 'AccessKey 创建结果未知;开始新的创建前,请先核对本次操作。',
reconciling: 'AccessKey 已提交,运行时仍在恢复。',
editIndeterminate:
'AccessKey“{name}”的更新结果未知;编辑其他 AccessKey 前请先核对当前元数据。',
editReconciling: 'AccessKey“{name}”的更新已提交,仍需核对当前元数据。',
indeterminate: '访问密钥创建结果未知;开始新的创建前,请先核对本次操作。',
reconciling: '访问密钥已提交,运行时仍在恢复。',
editIndeterminate: '访问密钥“{name}”的更新结果未知;编辑其他访问密钥前请先核对当前元数据。',
editReconciling: '访问密钥“{name}”的更新已提交,仍需核对当前元数据。',
checkResult: '核对结果',
},
status: {
@@ -75,7 +74,7 @@ export default {
},
columns: {
name: '名称',
key: 'AccessKey',
key: '访问密钥',
status: '状态',
filters: '过滤条件',
scope: '范围',
@@ -94,7 +93,7 @@ export default {
createDescription: '创建后可随时收紧权限;放宽权限需要显式确认。',
editDescription: '可调整名称、状态、限流和权限范围。',
description: '编辑路由过滤条件和 RPM 限制;明文仅在显式操作后显示。',
close: '关闭 AccessKey 编辑器',
close: '关闭访问密钥编辑器',
basicInformation: '基本信息',
basicInformationDescription: '名称用于识别调用方,不会参与认证。',
permissionScope: '权限范围',
@@ -117,25 +116,25 @@ export default {
scopeMode: '范围',
scopeAll: '全部',
scopeRestricted: '指定',
unknownGroup: '未知 Group',
groupSelectorLabel: '选择 Group',
unknownGroup: '未知分组',
groupSelectorLabel: '选择分组',
addGroup: '添加分组',
protocolSelectorLabel: '选择协议',
addProtocol: '添加协议',
noProtocolOptions: '暂无可选协议。',
modelSelectorLabel: '选择模型',
searchGroups: '搜索 Group',
searchGroups: '搜索分组',
searchGroupsPlaceholder: '按名称搜索',
searchModels: '搜索模型',
searchModelsPlaceholder: '按模型 ID 或别名搜索',
noGroupOptions: '没有匹配的 Group。',
noGroupOptions: '没有匹配的分组。',
noModelOptions: '没有匹配的模型。',
groupOptionsLoading: '正在加载 Group 目录…',
groupOptionsLoading: '正在加载分组目录…',
selectedCount: '已选择 {count} 项',
clearSelected: '清除所选',
removeSelection: '移除 {label}',
groupProtocolMismatch: '所选 Group 与协议没有可路由的交集。',
modelRouteRisk: '所选模型不在当前 Group 的模型目录中,路由请求可能失败。',
groupProtocolMismatch: '所选分组与协议没有可路由的交集。',
modelRouteRisk: '所选模型不在当前分组的模型目录中,路由请求可能失败。',
modelCustomUnavailable: '自定义或当前不可用',
emptyMeansAll: '不选择表示全部。',
modelsDescription: '可选择已知模型,也可输入任意有效模型字符串。',
@@ -149,33 +148,33 @@ export default {
allProtocolsAllowed: '当前允许全部 4 种规范协议',
allModelsAllowed: '当前允许目标分组可路由的全部模型',
scopeExpansionWarning: '把“指定”改为“全部”会扩大客户端权限,请确认当前范围符合预期。',
save: '保存 AccessKey',
save: '保存访问密钥',
createKey: '创建密钥',
saveChanges: '保存修改',
checkResult: '核对结果',
saveFailed: '无法保存 AccessKey,输入内容已保留。',
editNotApplied: '最新 AccessKey 元数据仍未改变;请检查草稿后再重试。',
saveFailed: '无法保存访问密钥,输入内容已保留。',
editNotApplied: '最新访问密钥元数据仍未改变;请检查草稿后再重试。',
editIndeterminate: '更新请求结果未知;请核对当前元数据,此操作不会重新发送更新。',
editReconciling: '更新已提交,但继续前仍需核对当前 AccessKey 元数据。',
editReconciling: '更新已提交,但继续前仍需核对当前访问密钥元数据。',
saveIndeterminate: '请求结果未知;重试前请使用同一操作核对结果。',
saveReconciling: 'AccessKey 已提交,运行时仍在恢复。',
saveReconciling: '访问密钥已提交,运行时仍在恢复。',
scopeIncomplete: '每个受限范围都必须至少选择一个值。',
groupScopeUnavailable: 'Group 目录恢复可用前,不能修改 Group 范围。',
staleGroupScopeInvalid: 'Group 数据已过期,只能保留或移除此 AccessKey 已授权的 Group。',
groupScopeUnavailable: '分组目录恢复可用前,不能修改分组范围。',
staleGroupScopeInvalid: '分组数据已过期,只能保留或移除此访问密钥已授权的分组。',
},
delete: {
open: '删除',
title: '删除此 AccessKey?',
title: '删除此访问密钥?',
description: '删除“{name}”。此操作无法撤销。',
close: '关闭 AccessKey 删除确认',
lastWarning: '这是最后一个 AccessKey。删除后,数据面客户端将没有已签发凭据。',
close: '关闭访问密钥删除确认',
lastWarning: '这是最后一个访问密钥。删除后,数据面客户端将没有已签发凭据。',
name: '名称',
key: 'AccessKey',
impact: '删除后,使用此 AccessKey 的数据面请求将立即无法通过认证。',
key: '访问密钥',
impact: '删除后,使用此访问密钥的数据面请求将立即无法通过认证。',
typeName: '输入 {name} 以确认',
confirm: '删除 AccessKey',
failed: '无法删除 AccessKey。',
deletedAnnouncement: '已删除 AccessKey“{name}”。',
confirm: '删除访问密钥',
failed: '无法删除访问密钥。',
deletedAnnouncement: '已删除访问密钥“{name}”。',
},
},
} as const
+11 -12
View File
@@ -75,7 +75,7 @@ export default {
auth: {
eyebrow: 'GPT-Load 2.0',
headline: '一个登录入口,权限清晰分离',
lead: '使用 AUTH_KEY 管理网关;使用 AccessKey 查看该密钥自己的首页、模型、请求与用量。身份由服务端自动识别',
lead: '使用 AUTH_KEY 管理网关;使用访问密钥查看该密钥自己的首页、模型、请求与用量。身份由服务端自动识别',
capabilities: {
1: {
title: '集中管理渠道凭据',
@@ -91,9 +91,9 @@ export default {
},
},
loginTitle: '登录 GPT-Load',
loginDescription: '输入 AUTH_KEY 或 AccessKey,服务端会自动识别权限',
loginDescription: '输入 AUTH_KEY 或访问密钥,服务端会自动识别权限',
keyLabel: '登录密钥',
keyPlaceholder: '请输入 AUTH_KEY 或 AccessKey',
keyPlaceholder: '请输入 AUTH_KEY 或访问密钥',
reveal: '显示登录密钥',
conceal: '隐藏登录密钥',
submit: '登录',
@@ -109,9 +109,9 @@ export default {
sessionNoteSuffix: ' 中,退出登录或认证失效时清除',
help: {
title: '可以使用哪种密钥?',
accessKeyTitle: 'AccessKey',
accessKeyTitle: '访问密钥',
accessKeyDescription:
'使用已分发的数据面 AccessKey 登录,只能查看这个密钥自己的首页、可用模型、请求记录和用量,不能修改任何配置',
'使用已分发的数据面访问密钥登录,只能查看这个密钥自己的首页、可用模型、请求记录和用量,不能修改任何配置',
environmentTitle: '环境变量优先',
environmentDescription: '如果启动实例时设置了 {key},请使用部署系统中受保护的值',
fileTitle: '受管密钥文件',
@@ -135,12 +135,11 @@ export default {
models: '模型',
settings: '设置',
import: '导入渠道凭据',
groupDetail: 'Group 详情',
groupDetail: '分组详情',
menu: '菜单与偏好设置',
preferences: '偏好设置',
accessKeyReadOnly: 'AccessKey · 只读',
accessKeyReadOnlyDescription:
'当前使用 AccessKey 登录;页面和数据仅限此密钥,不能修改系统配置。',
accessKeyReadOnly: '访问密钥 · 只读',
accessKeyReadOnlyDescription: '当前使用访问密钥登录;页面和数据仅限此密钥,不能修改系统配置。',
language: '语言',
theme: '主题',
localeZh: '简体中文',
@@ -182,12 +181,12 @@ export default {
tokens: '{count} tokens',
welcomeTitle: '欢迎使用 GPT-Load',
importCredentials: '导入渠道凭据',
welcomeDescription: '选择渠道并导入对应 API key,即可创建 Group 并开始转发请求',
welcomeDescription: '选择渠道并导入对应 API key,即可创建分组并开始转发请求',
welcomeGuideTitle: '三步完成首次接入',
welcomeEstimatedTime: '预计 1–2 分钟',
welcomeStep1Title: '选择渠道',
welcomeStep1Description: '可按名称搜索内置的官方渠道和兼容渠道',
welcomeStep2Title: '确认 Group 信息',
welcomeStep2Title: '确认分组信息',
welcomeStep2Description: '模型可选;只有兼容渠道需要填写基础 URL',
welcomeStep3Title: '导入一个或多个凭据',
welcomeStep3Description: '粘贴渠道 API key 并确认,系统会立即开始管理可用性',
@@ -195,7 +194,7 @@ export default {
currentAccessKey: {
eyebrow: '当前登录身份',
active: '已启用',
readOnly: '当前为 AccessKey 只读视图;所有数据均限定为此密钥,不能修改系统配置。',
readOnly: '当前为访问密钥只读视图;所有数据均限定为此密钥,不能修改系统配置。',
rpm: 'RPM 限制',
rpmValue: '{count} RPM',
unlimited: '不限',
+26 -26
View File
@@ -57,11 +57,11 @@ export default {
},
},
group: {
invalidTitle: 'Group 地址无效',
invalidDescription: 'Group ID 必须是正的安全整数。',
loading: '正在加载 Group 详情…',
loadFailed: '无法加载 Group 详情。',
stale: 'Group 详情可能已过期;后台刷新失败。',
invalidTitle: '分组地址无效',
invalidDescription: '分组 ID 必须是正的安全整数。',
loading: '正在加载分组详情…',
loadFailed: '无法加载分组详情。',
stale: '分组详情可能已过期;后台刷新失败。',
backToGroups: '返回分组列表',
importCredentials: '导入渠道凭据',
copyUpstreamUrl: '复制上游地址 {url}',
@@ -88,7 +88,7 @@ export default {
searchClear: '清空搜索',
total: '{count} 个模型',
summary: '{count} 个模型 · {pending} 个待配置价格',
tableLabel: '当前 Group 模型',
tableLabel: '当前分组模型',
id: '模型 ID',
alias: '对外别名',
pricing: '定价',
@@ -134,13 +134,13 @@ export default {
empty: '上游未返回可添加模型',
confirm: '添加到当前列表',
},
saveFailed: '无法替换 Group 模型列表。',
saveFailed: '无法替换分组模型列表。',
noActiveCredential: {
title: '没有可用于发现的活跃渠道凭据。',
},
emptyConfirm: {
title: '移除全部模型?',
description: '保存空列表将停用此 Group 的模型路由,并完整替换当前已保存列表。',
description: '保存空列表将停用此分组的模型路由,并完整替换当前已保存列表。',
close: '关闭空模型确认',
cancel: '取消',
confirm: '替换为空列表',
@@ -148,10 +148,10 @@ export default {
},
settings: {
title: '分组设置',
description: '编辑 Group 标识、路由字段与稀疏运行时覆盖。',
description: '编辑分组标识、路由字段与稀疏运行时覆盖。',
save: '保存设置',
loading: '正在加载 Group 设置',
loadFailed: '无法加载 Group 设置',
loading: '正在加载分组设置',
loadFailed: '无法加载分组设置',
saved: '设置已保存',
unsaved: '有未保存的修改',
saving: '正在保存',
@@ -175,14 +175,14 @@ export default {
},
headers: { description: '规则默认折叠;展开后编辑将完整替换全局 HeaderRules。' },
dangerDescription: '不可逆操作与常规设置保持明确距离。',
saveFailed: '无法更新 Group 设置。',
saveFailed: '无法更新分组设置。',
base: {
description: '名称、渠道参数与启用状态影响整个分组。',
channel: '渠道',
channelHelp: '渠道由创建分组时确定,后续不可切换。',
channelCatalogUnavailable: '无法加载渠道目录,渠道参数已锁定;其他设置仍可编辑。',
name: '分组名称',
nameError: '请输入 Group 名称。',
nameError: '请输入分组名称。',
upstreamUrl: '上游地址',
upstreamUrlError: '请输入有效的 HTTP 或 HTTPS Base URL。',
urlWarning: '修改 Base URL 会影响此分组后续请求的发送位置。',
@@ -220,7 +220,7 @@ export default {
headerStorageNoticeStart: '普通 HeaderRules 不是 Secret 存储;凭据值请使用',
headerStorageNoticeEnd: '。',
headerReplacementWarning:
'此 Group 覆盖会完整替换全局 HeaderRules;后续全局更改不会合并到这里。',
'此分组覆盖会完整替换全局 HeaderRules;后续全局更改不会合并到这里。',
inject_usage_options: '注入用量选项',
injectUsageHelp: '仅 openai-completions 支持此覆盖',
affinity_enabled: '请求亲和',
@@ -230,22 +230,22 @@ export default {
affinityDisable: '关闭',
},
delete: {
sectionDescription: '删除 Group 会同时删除其全部渠道凭据,且无法撤销。',
open: '删除 Group',
title: '删除此 Group?',
description: '输入准确的 Group 名称“{name}”以确认永久删除。',
close: '关闭 Group 删除确认',
sectionDescription: '删除分组会同时删除其全部渠道凭据,且无法撤销。',
open: '删除分组',
title: '删除此分组?',
description: '输入准确的分组名称“{name}”以确认永久删除。',
close: '关闭分组删除确认',
typeName: '输入 {name} 以确认',
cancel: '取消',
confirm: '永久删除 Group',
failed: '无法删除 Group。',
inUseTitle: '此 Group 正被 AccessKey 引用。',
inUseDescription: '请先移除以下明确的 Group 引用:',
manageAccessKeys: '管理 AccessKey',
confirm: '永久删除分组',
failed: '无法删除分组。',
inUseTitle: '此分组正被访问密钥引用。',
inUseDescription: '请先移除以下明确的分组引用:',
manageAccessKeys: '管理访问密钥',
},
},
tabs: {
label: 'Group 详情分区',
label: '分组详情分区',
credentials: '凭据',
models: '模型与别名',
settings: '设置',
@@ -331,7 +331,7 @@ export default {
confirmDelete: '删除凭据',
closeDialog: '关闭删除确认',
deleteTitle: '删除渠道凭据?',
deleteDescription: '从此 Group 删除 {mask}。此操作无法撤销',
deleteDescription: '从此分组删除 {mask}。此操作无法撤销',
columns: {
credential: '密钥',
status: '状态',
+1 -1
View File
@@ -193,7 +193,7 @@ export default {
empty: '空行',
duplicates: '重复项',
},
accessKeyWarning: '{count} 行看起来像 GPT-Load AccessKey,请确认后继续',
accessKeyWarning: '{count} 行看起来像 GPT-Load 访问密钥,请确认后继续',
tooMany: '最多可提交 1,000 个非空密钥',
required: '请先填写至少一条凭据',
channelCredentialNotice: '这里导入的是渠道 API 密钥;客户端凭证请在“访问密钥”页面创建',
+1 -1
View File
@@ -59,7 +59,7 @@ export default {
open: '查看上游模型 {model} 的详情与价格',
upstreamCount: '{count} 个上游',
protocolRestricted: '协议受限',
protocolRestrictedHelp: '此 AccessKey 仅可使用以下协议:\n{protocols}',
protocolRestrictedHelp: '此访问密钥仅可使用以下协议:\n{protocols}',
pricingIdentityHelp: '计价身份\n渠道:{channel} ({channelId})\n上游模型:{model}',
tierCount: '{count} 档',
noPrice: '—',
+54 -55
View File
@@ -52,7 +52,7 @@ export default {
},
groups: {
title: '分组健康',
description: '仅反映分组当前可用凭据,不对具体 AccessKey、协议或模型作“可路由”承诺。',
description: '仅反映分组当前可用凭据,不对具体访问密钥、协议或模型作“可路由”承诺。',
empty: '当前没有分组。',
disabled: '已停用',
emptyCredentials: '无凭据',
@@ -348,7 +348,7 @@ export default {
},
inspector: {
title: '路由检查',
description: '按协议、操作、能力、模型与 AccessKey 检查当前候选 Group 与凭据。',
description: '按协议、操作、能力、模型与访问密钥检查当前候选分组与凭据。',
boundary: '请按真实请求选择操作和所需能力;只读,不会发送上游请求或消耗 Token。',
routeModes: {
native: '原生',
@@ -379,9 +379,9 @@ export default {
optional: '可选',
modelPlaceholder: '输入客户端模型',
modelOptional: '资源类协议请求可不填写。',
accessKey: 'AccessKey',
accessKey: '访问密钥',
accessKeyOption: '{name} · #{id} · {status}',
missingAccessKeyOption: '缺失的 AccessKey · #{id}',
missingAccessKeyOption: '缺失的访问密钥 · #{id}',
submit: '检查当前路由',
},
accessKeyStatus: {
@@ -389,15 +389,15 @@ export default {
disabled: '停用',
},
options: {
loading: '正在加载 AccessKey 选项…',
failed: '无法加载 AccessKey 选项。',
loading: '正在加载访问密钥选项…',
failed: '无法加载访问密钥选项。',
},
errors: {
protocol: '请选择有效协议。',
operation: '请选择与协议匹配的操作。',
model: '请按所选操作填写有效模型;资源操作不接受模型。',
accessKey: '请重新选择现有 AccessKey。',
missingDeepLinkAccessKey: '链接中的 AccessKey #{id} 已不存在,请重新选择。',
accessKey: '请重新选择现有访问密钥。',
missingDeepLinkAccessKey: '链接中的访问密钥 #{id} 已不存在,请重新选择。',
summary: '路由检查输入无效。',
},
request: {
@@ -406,7 +406,7 @@ export default {
},
empty: {
title: '填写条件后检查当前路由',
description: '检查结果会解释当前配置快照中的候选 Group、凭据状态与排除原因。',
description: '检查结果会解释当前配置快照中的候选分组、凭据状态与排除原因。',
},
result: {
title: '当前运行时观测',
@@ -420,20 +420,20 @@ export default {
protocol: '协议',
externalModel: '客户端模型',
modelNotSpecified: '未指定',
accessKey: 'AccessKey',
accessKeyStatus: 'AccessKey 状态',
candidateGroups: '候选 Group',
accessKey: '访问密钥',
accessKeyStatus: '访问密钥状态',
candidateGroups: '候选分组',
availableCredentials: '当前可用凭据',
reason: '原因',
inputChanged: '输入已更改;下方仍显示上一次已提交输入的观测结果。',
stale: '最近一次检查失败;下方是观测时间所示的较早结果。',
},
groups: {
title: '候选 Group',
title: '候选分组',
description: '原生优先;份额只在当前实际参与竞争的路由层级内计算。',
count: '{count} 个',
tableLabel: '候选 Group 路由解释',
completeEmpty: '未返回候选 Group;这是该输入的完整当前运行时解释,并非空态。',
tableLabel: '候选分组路由解释',
completeEmpty: '未返回候选分组;这是该输入的完整当前运行时解释,并非空态。',
included: '已纳入候选',
excluded: '未纳入候选',
standby: '后备层级',
@@ -441,9 +441,9 @@ export default {
availableTotal: '可用 / 总数',
currentTotal: '当前合计',
shareLabel: '{name} 的有效权重占比为 {share}',
viewGroup: '查看 Group',
viewGroup: '查看分组',
columns: {
group: 'Group',
group: '分组',
status: '状态',
credentials: '凭据',
weight: '有效权重',
@@ -458,7 +458,7 @@ export default {
unavailable: '不可用',
summary: '{available} 可用 · {unavailable} 不可用',
tableLabel: '{name} 的凭据路由解释',
noneReturned: '此 Group 未返回凭据候选。',
noneReturned: '此分组未返回凭据候选。',
cooldownUntil: '冷却到期时间',
none: '无',
columns: {
@@ -476,36 +476,36 @@ export default {
effective: '原始有效权重',
null: 'null',
none: '—',
groupManual: 'Group 手动权重 {value}',
groupManual: '分组手动权重 {value}',
},
excluded: {
title: '排除 Group',
description: '仅展示 Group 级排除结论;候选 Group 的凭据级原因可按需展开。',
empty: '当前没有被排除的 Group。',
tableLabel: '排除 Group 路由解释',
title: '排除分组',
description: '仅展示分组级排除结论;候选分组的凭据级原因可按需展开。',
empty: '当前没有被排除的分组。',
tableLabel: '排除分组路由解释',
reasonCode: '原因代码',
},
reasons: {
none: '无排除原因',
access_key_disabled: 'AccessKey 已停用',
protocol_filtered: 'AccessKey 筛选排除了该协议',
model_filtered: 'AccessKey 筛选排除了该模型',
model_required_by_filter: 'AccessKey 模型筛选要求请求提供模型',
access_key_disabled: '访问密钥已停用',
protocol_filtered: '访问密钥筛选排除了该协议',
model_filtered: '访问密钥筛选排除了该模型',
model_required_by_filter: '访问密钥模型筛选要求请求提供模型',
operation_unsupported: '渠道不支持该协议操作',
native_route_required: '该请求必须使用原生路由',
no_route_target: '没有匹配该模型与协议的路由目标',
group_disabled: 'Group 已停用',
group_filtered: 'AccessKey 筛选排除了该 Group',
no_available_group: '当前没有可路由的候选 Group',
no_credentials: 'Group 没有运行时凭据',
group_weight_zero: 'Group 有效权重为零',
group_disabled: '分组已停用',
group_filtered: '访问密钥筛选排除了该分组',
no_available_group: '当前没有可路由的候选分组',
no_credentials: '分组没有运行时凭据',
group_weight_zero: '分组有效权重为零',
credential_disabled: '凭据已停用',
credential_blacklisted: '凭据已拉黑',
credential_cooldown: '凭据正在冷却',
credential_quota_exhausted: '订阅账号额度已用尽,恢复前自动跳过',
credential_weight_zero: '凭据有效权重为零',
credential_not_allowed: '该请求排除了此凭据',
no_available_credential: 'Group 当前没有可用凭据',
no_available_credential: '分组当前没有可用凭据',
unknown: '未知路由原因',
},
},
@@ -525,8 +525,8 @@ export default {
filteredDescription: '调整或重置筛选条件后重试。',
},
options: {
groupsFailed: '无法加载 Group 筛选选项;日志列表不受影响。',
accessKeysFailed: '无法加载 AccessKey 筛选选项;日志列表不受影响。',
groupsFailed: '无法加载分组筛选选项;日志列表不受影响。',
accessKeysFailed: '无法加载访问密钥筛选选项;日志列表不受影响。',
partialFailed: '部分筛选选项暂时无法加载,日志查询仍可正常使用。',
},
filters: {
@@ -544,14 +544,14 @@ export default {
'30d': '30d',
},
any: '全部',
group: '任一尝试 Group',
groupHelp: '匹配任一尝试使用过的 Group。',
anyGroup: '全部尝试 Group',
group: '任一尝试分组',
groupHelp: '匹配任一尝试使用过的分组。',
anyGroup: '全部尝试分组',
model: '客户端模型',
clientModel: '客户端模型',
upstreamModel: '任一尝试上游模型',
accessKey: 'AccessKey',
anyAccessKey: '全部 AccessKey',
accessKey: '访问密钥',
anyAccessKey: '全部访问密钥',
protocol: '协议',
anyProtocol: '全部协议',
stream: '流式请求',
@@ -580,11 +580,11 @@ export default {
noneApplied: '无筛选条件',
appliedFrom: '开始 {value}',
appliedTo: '结束 {value}',
appliedGroup: '尝试 Group {value}',
appliedGroup: '尝试分组 {value}',
appliedModel: '客户端模型 {value}',
appliedClientModel: '客户端模型 {value}',
appliedUpstreamModel: '尝试上游模型 {value}',
appliedAccessKey: 'AccessKey {value}',
appliedAccessKey: '访问密钥 {value}',
appliedChannel: '渠道 {value}',
appliedCredential: '凭据 #{value}',
appliedStatus: '状态 {value}',
@@ -669,7 +669,7 @@ export default {
notRecorded: '未记录',
},
routeIdentity: {
group: 'Group:{name}(G{id})',
group: '分组:{name}(G{id})',
channel: '渠道:{name}({id})',
credential: '凭据:K{id}',
},
@@ -691,7 +691,7 @@ export default {
retry: '重试',
cooldown_credential: '冷却凭据',
fail_credential: '记录凭据失败',
skip_group: '跳过 Group',
skip_group: '跳过分组',
unknown: '未知动作',
},
operation: {
@@ -723,17 +723,17 @@ export default {
drawer: {
title: '请求日志详情',
description: '查看最终结果和脱敏的上游尝试链。',
descriptionSelfScoped: '查看当前 AccessKey 的请求、结果与用量。',
descriptionSelfScoped: '查看当前访问密钥的请求、结果与用量。',
close: '关闭请求日志详情',
loading: '正在加载请求日志详情…',
loadFailed: '无法加载请求日志详情。',
summary: '最终结果',
summary: '请求结果',
requestId: '请求 ID',
copyRequestId: '复制请求 ID',
completedAt: '完成时间',
status: '状态',
protocol: '协议',
accessKey: 'AccessKey',
accessKey: '访问密钥',
clientModel: '客户端模型',
upstreamModel: '上游模型',
modelNotSpecified: '未指定',
@@ -752,9 +752,9 @@ export default {
outputRate: '输出速率',
attemptCount: '尝试次数',
request: '客户端请求',
finalExecution: '最终执行',
finalExecution: '上游执行',
route: '请求与最终路由',
routeIdentity: '最终路由标识',
routeIdentity: '路由标识',
upstreamProtocol: '上游协议',
affinity: '亲和命中',
errorCode: '错误码',
@@ -768,7 +768,7 @@ export default {
clientStreamState: '客户端流状态',
clientStreamStarted: '已开始向客户端输出',
clientStreamNotStarted: '尚未向客户端输出',
group: '历史 Group',
group: '历史分组',
channel: '历史渠道',
credential: '历史凭据',
operation: '操作类型',
@@ -784,10 +784,10 @@ export default {
requestedModel: '上游请求模型',
reportedModel: '上游返回模型',
usage: {
title: '用量与预估成本',
title: '用量成本',
description: '最终持久化的用量字段。成本始终为预估值,未知不代表免费。',
finalGroup: '最终 Group',
groupId: 'Group #{id}',
finalGroup: '最终分组',
groupId: '分组 #{id}',
usageStateLabel: '用量状态',
costStateLabel: '成本状态',
estimatedCost: '预估成本',
@@ -831,7 +831,7 @@ export default {
completedAt: '完成时间',
requestId: '请求 ID',
route: '路由',
accessKey: 'AccessKey',
accessKey: '访问密钥',
result: '最终状态',
timing: '首响/耗时',
actions: '操作',
@@ -877,7 +877,6 @@ export default {
formula: '成本计算',
input: '输入',
output: '输出',
schema: '价格凭证版本',
identity: '计价身份',
historicalSchema1: '历史作用域',
historicalSchema2: '历史全局价格',
+1 -1
View File
@@ -104,7 +104,7 @@ export default {
restoreDefault: '恢复默认',
inherited: '当前展示的是有效的内置规则;启用覆盖后才可编辑。',
resetPending: '当前仍显示已发布的显式规则;保存后才会恢复当前版本默认。',
replacementWarning: 'Group Header Rules 覆盖会替换整个全局对象,不会逐项合并。',
replacementWarning: '分组请求头规则覆盖会替换整个全局对象,不会逐项合并。',
securityNotice:
'固定 Header 值属于普通配置;不要保存长期凭证。凭证 Header 必须使用字面量模板 {template}。',
conflict: '全局 Header Rules 存在并发修改,请选择保留的版本。',