From 97ca7e5f0bb34ff9a3540b8a2dee02fd2b5931c9 Mon Sep 17 00:00:00 2001 From: tbphp Date: Sun, 16 Aug 2026 13:38:31 +0800 Subject: [PATCH] =?UTF-8?q?refactor(web):=20=E7=BB=9F=E4=B8=80=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E8=AF=A6=E6=83=85=E4=B8=8E=E7=95=8C=E9=9D=A2=E6=9C=AF?= =?UTF-8?q?=E8=AF=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/features/monitor/LogDetailDrawer.vue | 36 +---- web/src/features/monitor/LogRouteIdentity.vue | 33 +++- web/src/i18n/locales/en-US/access-keys.ts | 96 ++++++------ web/src/i18n/locales/en-US/core.ts | 24 +-- web/src/i18n/locales/en-US/group.ts | 4 +- web/src/i18n/locales/en-US/import.ts | 2 +- web/src/i18n/locales/en-US/models.ts | 2 +- web/src/i18n/locales/en-US/monitor.ts | 53 ++++--- web/src/i18n/locales/ja-JP/access-keys.ts | 133 ++++++++-------- web/src/i18n/locales/ja-JP/core.ts | 32 ++-- web/src/i18n/locales/ja-JP/group.ts | 92 +++++------ web/src/i18n/locales/ja-JP/import.ts | 55 +++---- web/src/i18n/locales/ja-JP/model-prices.ts | 2 +- web/src/i18n/locales/ja-JP/models.ts | 24 +-- web/src/i18n/locales/ja-JP/monitor.ts | 147 +++++++++--------- web/src/i18n/locales/ja-JP/settings.ts | 6 +- web/src/i18n/locales/zh-CN/access-keys.ts | 97 ++++++------ web/src/i18n/locales/zh-CN/core.ts | 23 ++- web/src/i18n/locales/zh-CN/group.ts | 52 +++---- web/src/i18n/locales/zh-CN/import.ts | 2 +- web/src/i18n/locales/zh-CN/models.ts | 2 +- web/src/i18n/locales/zh-CN/monitor.ts | 109 +++++++------ web/src/i18n/locales/zh-CN/settings.ts | 2 +- 23 files changed, 512 insertions(+), 516 deletions(-) diff --git a/web/src/features/monitor/LogDetailDrawer.vue b/web/src/features/monitor/LogDetailDrawer.vue index ac0b6fbd..25364a8b 100644 --- a/web/src/features/monitor/LogDetailDrawer.vue +++ b/web/src/features/monitor/LogDetailDrawer.vue @@ -435,6 +435,7 @@ function toggleAttemptErrorMessage(sequence: number): void { :channel-id="log.channel_id" :channel="finalChannel()" :credential-id="log.credential_id" + appearance="plain" /> @@ -537,6 +538,12 @@ function toggleAttemptErrorMessage(sequence: number): void { +
+
{{ t('monitor.logs.receipt.identity') }}
+
+ {{ pricingIdentity }} +
+
-
{{ t('monitor.logs.receipt.schema') }}
-
v{{ receipt.schema_version }}
-
-
-
{{ t('monitor.logs.receipt.identity') }}
-
- {{ pricingIdentity }} -
-
@@ -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" /> @@ -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; } diff --git a/web/src/features/monitor/LogRouteIdentity.vue b/web/src/features/monitor/LogRouteIdentity.vue index 650f3c98..783aeeb3 100644 --- a/web/src/features/monitor/LogRouteIdentity.vue +++ b/web/src/features/monitor/LogRouteIdentity.vue @@ -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 | null - credentialId: number | null -}>() +const props = withDefaults( + defineProps<{ + groupId: number | null + groupName?: string | null + channelId: string | null + channel?: Pick | null + credentialId: number | null + appearance?: 'compact' | 'plain' + }>(), + { + groupName: undefined, + channel: undefined, + appearance: 'compact', + }, +) const { t } = useI18n() @@ -58,6 +66,7 @@ const tooltip = computed(() => { @@ -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; +} diff --git a/web/src/i18n/locales/en-US/access-keys.ts b/web/src/i18n/locales/en-US/access-keys.ts index b688d617..b831d48a 100644 --- a/web/src/i18n/locales/en-US/access-keys.ts +++ b/web/src/i18n/locales/en-US/access-keys.ts @@ -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 diff --git a/web/src/i18n/locales/en-US/core.ts b/web/src/i18n/locales/en-US/core.ts index a5252479..d85d29f9 100644 --- a/web/src/i18n/locales/en-US/core.ts +++ b/web/src/i18n/locales/en-US/core.ts @@ -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', diff --git a/web/src/i18n/locales/en-US/group.ts b/web/src/i18n/locales/en-US/group.ts index 4d58f6a9..a1fd03fa 100644 --- a/web/src/i18n/locales/en-US/group.ts +++ b/web/src/i18n/locales/en-US/group.ts @@ -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: { diff --git a/web/src/i18n/locales/en-US/import.ts b/web/src/i18n/locales/en-US/import.ts index f16639c0..ce9fdee7 100644 --- a/web/src/i18n/locales/en-US/import.ts +++ b/web/src/i18n/locales/en-US/import.ts @@ -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: diff --git a/web/src/i18n/locales/en-US/models.ts b/web/src/i18n/locales/en-US/models.ts index e752ae60..cd2eaf45 100644 --- a/web/src/i18n/locales/en-US/models.ts +++ b/web/src/i18n/locales/en-US/models.ts @@ -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', diff --git a/web/src/i18n/locales/en-US/monitor.ts b/web/src/i18n/locales/en-US/monitor.ts index 87fc199b..2aedb846 100644 --- a/web/src/i18n/locales/en-US/monitor.ts +++ b/web/src/i18n/locales/en-US/monitor.ts @@ -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', diff --git a/web/src/i18n/locales/ja-JP/access-keys.ts b/web/src/i18n/locales/ja-JP/access-keys.ts index 8f344779..4e34ecf3 100644 --- a/web/src/i18n/locales/ja-JP/access-keys.ts +++ b/web/src/i18n/locales/ja-JP/access-keys.ts @@ -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 diff --git a/web/src/i18n/locales/ja-JP/core.ts b/web/src/i18n/locales/ja-JP/core.ts index 03a62a12..bed50118 100644 --- a/web/src/i18n/locales/ja-JP/core.ts +++ b/web/src/i18n/locales/ja-JP/core.ts @@ -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: '直近のリクエスト', diff --git a/web/src/i18n/locales/ja-JP/group.ts b/web/src/i18n/locales/ja-JP/group.ts index b2e69adb..892ab7ac 100644 --- a/web/src/i18n/locales/ja-JP/group.ts +++ b/web/src/i18n/locales/ja-JP/group.ts @@ -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: 'ステータス', diff --git a/web/src/i18n/locales/ja-JP/import.ts b/web/src/i18n/locales/ja-JP/import.ts index c8bdf6c5..175097c1 100644 --- a/web/src/i18n/locales/ja-JP/import.ts +++ b/web/src/i18n/locales/ja-JP/import.ts @@ -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: '編集に戻る', }, }, diff --git a/web/src/i18n/locales/ja-JP/model-prices.ts b/web/src/i18n/locales/ja-JP/model-prices.ts index 3e1d5c4f..207ce3cb 100644 --- a/web/src/i18n/locales/ja-JP/model-prices.ts +++ b/web/src/i18n/locales/ja-JP/model-prices.ts @@ -68,7 +68,7 @@ export default { failed: '価格レコードを削除できません', }, errors: { - referenced: 'この価格は {groups} Group から {entries} 件参照されています', + referenced: 'この価格は {groups} グループから {entries} 件参照されています', automaticDeleteForbidden: '自動価格は削除できません。先に手動価格へ変更してください', }, }, diff --git a/web/src/i18n/locales/ja-JP/models.ts b/web/src/i18n/locales/ja-JP/models.ts index 2726fc04..7fea6385 100644 --- a/web/src/i18n/locales/ja-JP/models.ts +++ b/web/src/i18n/locales/ja-JP/models.ts @@ -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: '更新', diff --git a/web/src/i18n/locales/ja-JP/monitor.ts b/web/src/i18n/locales/ja-JP/monitor.ts index 78d39087..e63fa5ec 100644 --- a/web/src/i18n/locales/ja-JP/monitor.ts +++ b/web/src/i18n/locales/ja-JP/monitor.ts @@ -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: '履歴グローバル価格', diff --git a/web/src/i18n/locales/ja-JP/settings.ts b/web/src/i18n/locales/ja-JP/settings.ts index 9cfe94f5..821eaf43 100644 --- a/web/src/i18n/locales/ja-JP/settings.ts +++ b/web/src/i18n/locales/ja-JP/settings.ts @@ -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: diff --git a/web/src/i18n/locales/zh-CN/access-keys.ts b/web/src/i18n/locales/zh-CN/access-keys.ts index 7e971286..7bed5dbc 100644 --- a/web/src/i18n/locales/zh-CN/access-keys.ts +++ b/web/src/i18n/locales/zh-CN/access-keys.ts @@ -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 diff --git a/web/src/i18n/locales/zh-CN/core.ts b/web/src/i18n/locales/zh-CN/core.ts index aa754ce0..79949089 100644 --- a/web/src/i18n/locales/zh-CN/core.ts +++ b/web/src/i18n/locales/zh-CN/core.ts @@ -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: '不限', diff --git a/web/src/i18n/locales/zh-CN/group.ts b/web/src/i18n/locales/zh-CN/group.ts index 362e1934..29384eed 100644 --- a/web/src/i18n/locales/zh-CN/group.ts +++ b/web/src/i18n/locales/zh-CN/group.ts @@ -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: '状态', diff --git a/web/src/i18n/locales/zh-CN/import.ts b/web/src/i18n/locales/zh-CN/import.ts index d176b948..97bf93bd 100644 --- a/web/src/i18n/locales/zh-CN/import.ts +++ b/web/src/i18n/locales/zh-CN/import.ts @@ -193,7 +193,7 @@ export default { empty: '空行', duplicates: '重复项', }, - accessKeyWarning: '{count} 行看起来像 GPT-Load AccessKey,请确认后继续', + accessKeyWarning: '{count} 行看起来像 GPT-Load 访问密钥,请确认后继续', tooMany: '最多可提交 1,000 个非空密钥', required: '请先填写至少一条凭据', channelCredentialNotice: '这里导入的是渠道 API 密钥;客户端凭证请在“访问密钥”页面创建', diff --git a/web/src/i18n/locales/zh-CN/models.ts b/web/src/i18n/locales/zh-CN/models.ts index fd5c652c..962b9ba9 100644 --- a/web/src/i18n/locales/zh-CN/models.ts +++ b/web/src/i18n/locales/zh-CN/models.ts @@ -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: '—', diff --git a/web/src/i18n/locales/zh-CN/monitor.ts b/web/src/i18n/locales/zh-CN/monitor.ts index 347a0271..be34426d 100644 --- a/web/src/i18n/locales/zh-CN/monitor.ts +++ b/web/src/i18n/locales/zh-CN/monitor.ts @@ -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: '历史全局价格', diff --git a/web/src/i18n/locales/zh-CN/settings.ts b/web/src/i18n/locales/zh-CN/settings.ts index d21efdbb..f623254a 100644 --- a/web/src/i18n/locales/zh-CN/settings.ts +++ b/web/src/i18n/locales/zh-CN/settings.ts @@ -104,7 +104,7 @@ export default { restoreDefault: '恢复默认', inherited: '当前展示的是有效的内置规则;启用覆盖后才可编辑。', resetPending: '当前仍显示已发布的显式规则;保存后才会恢复当前版本默认。', - replacementWarning: 'Group Header Rules 覆盖会替换整个全局对象,不会逐项合并。', + replacementWarning: '分组请求头规则覆盖会替换整个全局对象,不会逐项合并。', securityNotice: '固定 Header 值属于普通配置;不要保存长期凭证。凭证 Header 必须使用字面量模板 {template}。', conflict: '全局 Header Rules 存在并发修改,请选择保留的版本。',